Parcourir la source

design update

MHSanaei il y a 1 an
Parent
commit
9d47d74a7a

+ 4 - 4
web/assets/[email protected]/antd.min.css

@@ -1362,7 +1362,7 @@ to{transform:scale(1.6);opacity:0}
 .ant-tabs:after,.ant-tabs:before{display:table;content:""}
 .ant-tabs:after{clear:both}
 .ant-tabs-ink-bar{position:absolute;bottom:1px;left:0;z-index:1;box-sizing:border-box;width:0;height:2px;background-color:#1890ff;transform-origin:0 0}
-.ant-tabs-bar{margin:1.5rem 1.5rem 0rem 1.5rem !important;border-bottom:2px solid rgb(153 153 153 / 20%);outline:0}
+.ant-tabs-bar{margin:1.5rem 1.5rem 0rem 1.5rem!important;border-bottom:2px solid rgb(153 153 153 / 20%);outline:0}
 .ant-tabs-bar,.ant-tabs-nav-container{transition:padding .3s cubic-bezier(.645,.045,.355,1)}
 .ant-tabs-nav-container{position:relative;box-sizing:border-box;margin-bottom:-1px;overflow:hidden;font-size:14px;line-height:1.5;white-space:nowrap;zoom:1}
 .ant-tabs-nav-container:after,.ant-tabs-nav-container:before{display:table;content:""}
@@ -3261,7 +3261,7 @@ textarea.ant-input-number{max-width:100%;height:auto;min-height:32px;line-height
 .ant-input-number-handler-down:hover{height:60%!important}
 .ant-input-number-handler-down-disabled,.ant-input-number-handler-up-disabled{cursor:not-allowed}
 .ant-input-number-handler-down-disabled:hover .ant-input-number-handler-down-inner,.ant-input-number-handler-up-disabled:hover .ant-input-number-handler-up-inner{color:rgba(0,0,0,.25)}
-.ant-layout{display:flex;flex:auto;flex-direction:column;min-height:0;background:#f0f2f5}
+.ant-layout{display:flex;flex:auto;flex-direction:column;min-height:0;background:#fff}
 .ant-layout,.ant-layout *{box-sizing:border-box}
 .ant-layout.ant-layout-has-sider{flex-direction:row}
 .ant-layout.ant-layout-has-sider>.ant-layout,.ant-layout.ant-layout-has-sider>.ant-layout-content{overflow-x:hidden}
@@ -3278,9 +3278,9 @@ textarea.ant-input-number{max-width:100%;height:auto;min-height:32px;line-height
 .ant-layout-sider-zero-width-trigger{position:absolute;top:64px;right:-36px;z-index:1;width:36px;height:42px;color:#fff;font-size:18px;line-height:42px;text-align:center;background:#001529;border-radius:0 4px 4px 0;cursor:pointer;transition:background .3s ease}
 .ant-layout-sider-zero-width-trigger:hover{background:#192c3e}
 .ant-layout-sider-zero-width-trigger-right{left:-36px;border-radius:4px 0 0 4px}
-.ant-layout-sider-light{background:#fff}
+.ant-layout-sider-light{background:#f7f7f7}
 .ant-layout-sider-light .ant-layout-sider-trigger,.ant-layout-sider-light .ant-layout-sider-zero-width-trigger{color:rgba(0,0,0,.65);background:#fff}
-.ant-list{box-sizing:border-box;margin: 1.5em;padding:0;color:rgba(0,0,0,.65);font-size:14px;font-variant:tabular-nums;line-height:1.5;list-style:none;font-feature-settings:"tnum";position:relative}
+.ant-list{box-sizing:border-box;margin:1.5em;padding:0;color:rgba(0,0,0,.65);font-size:14px;font-variant:tabular-nums;line-height:1.5;list-style:none;font-feature-settings:"tnum";position:relative}
 .ant-list *{outline:0}
 .ant-list-pagination{margin-top:24px;text-align:right}
 .ant-list-pagination .ant-pagination-options{text-align:left}

+ 1 - 1
web/assets/js/model/xray.js

@@ -939,7 +939,7 @@ class Inbound extends XrayCommonClass {
         this._protocol = protocol;
         this.settings = Inbound.Settings.getSettings(protocol);
         if (protocol === Protocols.TROJAN) {
-            this.tls = true;
+            this.tls = false;
         }
     }
 

+ 9 - 6
web/html/xui/client_bulk_modal.html

@@ -33,6 +33,12 @@
             <span slot="label">{{ i18n "pages.client.clientCount" }}</span>
             <a-input-number v-model="clientsBulkModal.quantity" :min="1" :max="100"></a-input-number>
         </a-form-item>
+        <a-form-item label="Subscription">
+            <a-input v-model.trim="clientsBulkModal.subId"></a-input>
+        </a-form-item>
+        <a-form-item label="Telegram ID">
+            <a-input v-model.trim="clientsBulkModal.tgId"></a-input>
+        </a-form-item>
         <a-form-item>
             <span slot="label">
                 <span>{{ i18n "pages.inbounds.IPLimit" }}</span>
@@ -45,6 +51,7 @@
             </span>
             <a-input-number v-model="clientsBulkModal.limitIp" min="0"></a-input-number>
         </a-form-item>
+        <br>
         <a-form-item v-if="clientsBulkModal.inbound.xtls" label="Flow">
             <a-select v-model="clientsBulkModal.flow" style="width: 200px" :dropdown-class-name="siderDrawer.isDarkTheme ? 'ant-card-dark' : ''">
                 <a-select-option value="">{{ i18n "none" }}</a-select-option>
@@ -57,12 +64,6 @@
                 <a-select-option v-for="key in TLS_FLOW_CONTROL" :value="key">[[ key ]]</a-select-option>
             </a-select>
         </a-form-item>
-        <a-form-item label="Subscription">
-            <a-input v-model.trim="clientsBulkModal.subId"></a-input>
-        </a-form-item>
-        <a-form-item label="Telegram ID">
-            <a-input v-model.trim="clientsBulkModal.tgId"></a-input>
-        </a-form-item>
         <a-form-item>
             <span slot="label">
                 <span >{{ i18n "pages.inbounds.totalFlow" }}</span> (GB)
@@ -75,9 +76,11 @@
             </span>
         <a-input-number v-model="clientsBulkModal.totalGB" :min="0"></a-input-number>
         </a-form-item>
+        <br>
         <a-form-item label='{{ i18n "pages.client.delayedStart" }}'>
             <a-switch v-model="clientsBulkModal.delayedStart" @click="clientsBulkModal.expiryTime=0"></a-switch>
         </a-form-item>
+        <br>
         <a-form-item label='{{ i18n "pages.client.expireDays" }}' v-if="clientsBulkModal.delayedStart">
             <a-input-number v-model="delayedExpireDays" :min="0"></a-input-number>
         </a-form-item>

+ 15 - 11
web/html/xui/form/client.html

@@ -3,6 +3,10 @@
     <template v-if="isEdit">
     <a-tag v-if="isExpiry || isTrafficExhausted" color="red" style="margin-bottom: 10px;display: block;text-align: center;">Account is (Expired|Traffic Ended) And Disabled</a-tag>
     </template>
+    <a-form-item label='{{ i18n "pages.inbounds.enable" }}'>
+        <a-switch v-model="client.enable"></a-switch>
+    </a-form-item>
+    <br>
     <a-form-item>
         <span slot="label">
             <span>{{ i18n "pages.inbounds.Email" }}</span>
@@ -13,17 +17,14 @@
                 <a-icon type="sync" @click="getNewEmail(client)"></a-icon>
             </a-tooltip>
         </span>
-        <a-input v-model.trim="client.email" style="width: 150px;" ></a-input>
-    </a-form-item>
-    <a-form-item label='{{ i18n "pages.inbounds.enable" }}'>
-        <a-switch v-model="client.enable"></a-switch>
+        <a-input v-model.trim="client.email" style="width: 200px;" ></a-input>
     </a-form-item>
     <a-form-item label="Password" v-if="inbound.protocol === Protocols.TROJAN || inbound.protocol === Protocols.SHADOWSOCKS">
         <a-icon v-if="inbound.protocol === Protocols.SHADOWSOCKS" @click="client.password = RandomUtil.randomShadowsocksPassword()" type="sync"> </a-icon>
-        <a-input v-model.trim="client.password" style="width: 150px;" ></a-input>
+        <a-input v-model.trim="client.password" style="width: 300px;" ></a-input>
     </a-form-item>
     <a-form-item label='{{ i18n "additional" }} ID' v-if="inbound.protocol === Protocols.VMESS">
-        <a-input-number v-model="client.alterId" style="width: 70px;"></a-input-number>
+        <a-input-number v-model="client.alterId"></a-input-number>
     </a-form-item>
     <a-form-item label="ID" v-if="inbound.protocol === Protocols.VMESS || inbound.protocol === Protocols.VLESS">
         <a-input v-model.trim="client.id" style="width: 300px;"></a-input>
@@ -44,7 +45,7 @@
 				<a-icon type="question-circle" theme="filled"></a-icon>
 			</a-tooltip>
 		</span>
-		<a-input-number v-model="client.limitIp" min="0" style="width: 70px;"></a-input-number>
+		<a-input-number v-model="client.limitIp" min="0"></a-input-number>
 	</a-form-item>
 	<a-form-item v-if="client.email && client.limitIp > 0 && isEdit">
 		<span slot="label">
@@ -69,13 +70,14 @@
 			</a-textarea>
 		</a-form>
 	</a-form-item>
+    <br>
     <a-form-item v-if="inbound.xtls" label="Flow">
         <a-select v-model="client.flow" style="width: 200px" :dropdown-class-name="siderDrawer.isDarkTheme ? 'ant-card-dark' : ''">
             <a-select-option value="">{{ i18n "none" }}</a-select-option>
             <a-select-option v-for="key in XTLS_FLOW_CONTROL" :value="key">[[ key ]]</a-select-option>
         </a-select>
     </a-form-item>
-    <a-form-item v-else-if="inbound.canEnableTlsFlow()" label="Flow" layout="inline">
+    <a-form-item v-else-if="inbound.canEnableTlsFlow()" label="Flow">
         <a-select v-model="client.flow" style="width: 200px" :dropdown-class-name="siderDrawer.isDarkTheme ? 'ant-card-dark' : ''">
             <a-select-option value="" selected>{{ i18n "none" }}</a-select-option>
             <a-select-option v-for="key in TLS_FLOW_CONTROL" :value="key">[[ key ]]</a-select-option>
@@ -91,9 +93,9 @@
                 <a-icon type="question-circle" theme="filled"></a-icon>
             </a-tooltip>
         </span>
-        <a-input-number v-model="client._totalGB":min="0" style="width: 70px;"></a-input-number>
+        <a-input-number v-model="client._totalGB":min="0"></a-input-number>
         <template v-if="isEdit && clientStats">
-            <span>{{ i18n "usage" }}:</span>
+            <br><span> {{ i18n "usage" }}:</span>
             <a-tag :color="statsColor">
                 [[ sizeFormat(clientStats.up) ]] / 
                 [[ sizeFormat(clientStats.down) ]]
@@ -103,11 +105,13 @@
                 <template slot="title">{{ i18n "pages.inbounds.resetTraffic" }}</template>
                 <a-icon type="retweet" @click="resetClientTraffic(client.email,clientStats.inboundId,$event.target)" v-if="client.email.length > 0"></a-icon>
             </a-tooltip>
-        </template>
+        </template>        
     </a-form-item>
+    <br>
     <a-form-item label='{{ i18n "pages.client.delayedStart" }}'>
         <a-switch v-model="clientModal.delayedStart" @click="client._expiryTime=0"></a-switch>
     </a-form-item>
+    <br>
     <a-form-item label='{{ i18n "pages.client.expireDays" }}' v-if="clientModal.delayedStart">
         <a-input-number v-model="delayedExpireDays" :min="0"></a-input-number>
     </a-form-item>

+ 2 - 0
web/html/xui/form/inbound.html

@@ -24,9 +24,11 @@
         </span>
         <a-input v-model.trim="inbound.listen"></a-input>
     </a-form-item>
+    <br>
     <a-form-item label='{{ i18n "pages.inbounds.port" }}'>
         <a-input-number v-model="inbound.port"></a-input-number>
     </a-form-item>
+    <br>
     <a-form-item>
         <span slot="label">
             <span >{{ i18n "pages.inbounds.totalFlow" }}</span> (GB)

+ 10 - 4
web/html/xui/form/protocol/shadowsocks.html

@@ -1,5 +1,5 @@
 {{define "form/shadowsocks"}}
-<a-form layout="inline">
+<a-form layout="inline" style="padding: 10px 0px;">
     <a-collapse activeKey="0" v-for="(client, index) in inbound.settings.shadowsockses.slice(0,1)" v-if="!isEdit">
         <a-collapse-panel header='{{ i18n "pages.inbounds.client" }}'>
             <a-form-item>
@@ -16,7 +16,7 @@
             </a-form-item>
             <a-form-item label="Password">
                 <a-icon @click="client.password = RandomUtil.randomShadowsocksPassword()" type="sync"> </a-icon>
-                <a-input v-model.trim="client.password" style="width: 150px;"></a-input>
+                <a-input v-model.trim="client.password" style="width: 250px;"></a-input>
             </a-form-item>
             <a-form-item label="Subscription" v-if="client.email">
                 <a-input v-model.trim="client.subId"></a-input>
@@ -34,8 +34,9 @@
                         <a-icon type="question-circle" theme="filled"></a-icon>
                     </a-tooltip>
                 </span>
-                <a-input-number v-model="client.limitIp" min="0"  style="width: 70px;"></a-input-number>
+                <a-input-number v-model="client.limitIp" min="0"></a-input-number>
             </a-form-item>
+            <br>
             <a-form-item>
                 <span slot="label">
                     <span >{{ i18n "pages.inbounds.totalFlow" }}</span> (GB)
@@ -48,13 +49,15 @@
                 </span>
                 <a-input-number v-model="client._totalGB" :min="0"></a-input-number>
             </a-form-item>
+            <br>
             <a-form-item label='{{ i18n "pages.client.delayedStart" }}'>
                 <a-switch v-model="delayedStart" @click="client._expiryTime=0"></a-switch>
             </a-form-item>
+            <br>
             <a-form-item v-if="delayedStart" label='{{ i18n "pages.client.expireDays" }}'>
                 <a-input-number v-model.number="delayedExpireDays" :min="0"></a-input-number>
             </a-form-item>
-            <a-form-item>
+            <a-form-item v-else>
                 <span slot="label">
                     <span >{{ i18n "pages.inbounds.expireDate" }}</span>
                     <a-tooltip>
@@ -82,6 +85,8 @@
             </table>
         </a-collapse-panel>
     </a-collapse>
+</a-form>
+<a-form layout="inline">
     <a-form-item label='{{ i18n "encryption" }}'>
         <a-select v-model="inbound.settings.method" style="width: 250px;" :dropdown-class-name="siderDrawer.isDarkTheme ? 'ant-card-dark' : ''">
             <a-select-option v-for="method in SSMethods" :value="method">[[ method ]]</a-select-option>
@@ -97,4 +102,5 @@
             <a-select-option value="udp">UDP</a-select-option>
         </a-select>
     </a-form-item>
+</a-form>
 {{end}}

+ 92 - 88
web/html/xui/form/protocol/trojan.html

@@ -1,92 +1,96 @@
 {{define "form/trojan"}}
-<a-form layout="inline">
-<a-collapse activeKey="0" v-for="(client, index) in inbound.settings.trojans.slice(0,1)" v-if="!isEdit">
-    <a-collapse-panel header='{{ i18n "pages.inbounds.client" }}'>
-        <a-form-item>
-            <span slot="label">
-                <span>{{ i18n "pages.inbounds.Email" }}</span>
-                <a-tooltip>
-                    <template slot="title">
-                        <span>{{ i18n "pages.inbounds.EmailDesc" }}</span>
-                    </template>
-                    <a-icon type="sync" @click="getNewEmail(client)"></a-icon>
-                </a-tooltip>
-            </span>
-            <a-input v-model.trim="client.email" style="width: 150px;"></a-input>
-        </a-form-item>
-        <a-form-item label="Password">
-            <a-input v-model.trim="client.password" style="width: 150px;"></a-input>
-        </a-form-item>
-        <a-form-item label="Subscription" v-if="client.email">
-            <a-input v-model.trim="client.subId"></a-input>
-        </a-form-item>
-        <a-form-item label="Telegram Username" v-if="client.email">
-            <a-input v-model.trim="client.tgId"></a-input>
-        </a-form-item>
-        <a-form-item>
-            <span slot="label">
-                <span>{{ i18n "pages.inbounds.IPLimit" }}</span>
-                <a-tooltip>
-                    <template slot="title">
-                        <span>{{ i18n "pages.inbounds.IPLimitDesc" }}</span>
-                    </template>
-                    <a-icon type="question-circle" theme="filled"></a-icon>
-                </a-tooltip>
-            </span>
-            <a-input-number v-model="client.limitIp" min="0"  style="width: 70px;"></a-input-number>
-        </a-form-item>
-        <a-form-item v-if="inbound.xtls" label="Flow">
-            <a-select v-model="client.flow" style="width: 150px" :dropdown-class-name="siderDrawer.isDarkTheme ? 'ant-card-dark' : ''">
-                <a-select-option value="">{{ i18n "none" }}</a-select-option>
-                <a-select-option v-for="key in XTLS_FLOW_CONTROL" :value="key">[[ key ]]</a-select-option>
-            </a-select>
-        </a-form-item>
-        <a-form-item>
-            <span slot="label">
-                <span >{{ i18n "pages.inbounds.totalFlow" }}</span> (GB)
-                <a-tooltip>
-                    <template slot="title">
-                        0 <span>{{ i18n "pages.inbounds.meansNoLimit" }}</span>
-                    </template>
-                    <a-icon type="question-circle" theme="filled"></a-icon>
-                </a-tooltip>
-            </span>
-            <a-input-number v-model="client._totalGB" :min="0"></a-input-number>
-        </a-form-item>
-        <a-form-item label='{{ i18n "pages.client.delayedStart" }}'>
-            <a-switch v-model="delayedStart" @click="client._expiryTime=0"></a-switch>
-        </a-form-item>
-        <a-form-item v-if="delayedStart" label='{{ i18n "pages.client.expireDays" }}'>
-            <a-input-number v-model.number="delayedExpireDays" :min="0"></a-input-number>
-        </a-form-item>
-        <a-form-item>
-            <span slot="label">
-                <span >{{ i18n "pages.inbounds.expireDate" }}</span>
-                <a-tooltip>
-                    <template slot="title">
-                        <span>{{ i18n "pages.inbounds.leaveBlankToNeverExpire" }}</span>
-                    </template>
-                    <a-icon type="question-circle" theme="filled"></a-icon>
-                </a-tooltip>
-            </span>
-            <a-date-picker :show-time="{ format: 'HH:mm:ss' }" format="YYYY-MM-DD HH:mm:ss"
-                            :dropdown-class-name="siderDrawer.isDarkTheme ? 'ant-card-dark' : ''"
-                            v-model="client._expiryTime" style="width: 170px;"></a-date-picker>
-        </a-form-item>
-    </a-collapse-panel>
-</a-collapse>
-<a-collapse v-else>
-    <a-collapse-panel :header="'{{ i18n "pages.client.clientCount"}} : ' + inbound.settings.trojans.length">
-        <table width="100%">
-            <tr class="client-table-header">
-                <th v-for="col in Object.keys(inbound.settings.trojans[0]).slice(0, 3)">[[ col ]]</th>
-            </tr>
-            <tr v-for="(client, index) in inbound.settings.trojans" :class="index % 2 == 1 ? 'client-table-odd-row' : ''">
-                <td v-for="col in Object.values(client).slice(0, 3)">[[ col ]]</td>
-            </tr>
-        </table>
-    </a-collapse-panel>
-</a-collapse>
+<a-form layout="inline" style="padding: 10px 0px;">
+    <a-collapse activeKey="0" v-for="(client, index) in inbound.settings.trojans.slice(0,1)" v-if="!isEdit">
+        <a-collapse-panel header='{{ i18n "pages.inbounds.client" }}'>
+            <a-form-item>
+                <span slot="label">
+                    <span>{{ i18n "pages.inbounds.Email" }}</span>
+                    <a-tooltip>
+                        <template slot="title">
+                            <span>{{ i18n "pages.inbounds.EmailDesc" }}</span>
+                        </template>
+                        <a-icon type="sync" @click="getNewEmail(client)"></a-icon>
+                    </a-tooltip>
+                </span>
+                <a-input v-model.trim="client.email" style="width: 150px;"></a-input>
+            </a-form-item>
+            <a-form-item label="Password">
+                <a-input v-model.trim="client.password" style="width: 150px;"></a-input>
+            </a-form-item>
+            <a-form-item label="Subscription" v-if="client.email">
+                <a-input v-model.trim="client.subId"></a-input>
+            </a-form-item>
+            <a-form-item label="Telegram Username" v-if="client.email">
+                <a-input v-model.trim="client.tgId"></a-input>
+            </a-form-item>
+            <a-form-item>
+                <span slot="label">
+                    <span>{{ i18n "pages.inbounds.IPLimit" }}</span>
+                    <a-tooltip>
+                        <template slot="title">
+                            <span>{{ i18n "pages.inbounds.IPLimitDesc" }}</span>
+                        </template>
+                        <a-icon type="question-circle" theme="filled"></a-icon>
+                    </a-tooltip>
+                </span>
+                <a-input-number v-model="client.limitIp" min="0"></a-input-number>
+            </a-form-item>
+            <br>
+            <a-form-item v-if="inbound.xtls" label="Flow">
+                <a-select v-model="client.flow" style="width: 150px" :dropdown-class-name="siderDrawer.isDarkTheme ? 'ant-card-dark' : ''">
+                    <a-select-option value="">{{ i18n "none" }}</a-select-option>
+                    <a-select-option v-for="key in XTLS_FLOW_CONTROL" :value="key">[[ key ]]</a-select-option>
+                </a-select>
+            </a-form-item>
+            <a-form-item>
+                <span slot="label">
+                    <span >{{ i18n "pages.inbounds.totalFlow" }}</span> (GB)
+                    <a-tooltip>
+                        <template slot="title">
+                            0 <span>{{ i18n "pages.inbounds.meansNoLimit" }}</span>
+                        </template>
+                        <a-icon type="question-circle" theme="filled"></a-icon>
+                    </a-tooltip>
+                </span>
+                <a-input-number v-model="client._totalGB" :min="0"></a-input-number>
+            </a-form-item>
+            <br>
+            <a-form-item label='{{ i18n "pages.client.delayedStart" }}'>
+                <a-switch v-model="delayedStart" @click="client._expiryTime=0"></a-switch>
+            </a-form-item>
+            <br>
+            <a-form-item v-if="delayedStart" label='{{ i18n "pages.client.expireDays" }}'>
+                <a-input-number v-model.number="delayedExpireDays" :min="0"></a-input-number>
+            </a-form-item>
+            <a-form-item v-else>
+                <span slot="label">
+                    <span >{{ i18n "pages.inbounds.expireDate" }}</span>
+                    <a-tooltip>
+                        <template slot="title">
+                            <span>{{ i18n "pages.inbounds.leaveBlankToNeverExpire" }}</span>
+                        </template>
+                        <a-icon type="question-circle" theme="filled"></a-icon>
+                    </a-tooltip>
+                </span>
+                <a-date-picker :show-time="{ format: 'HH:mm:ss' }" format="YYYY-MM-DD HH:mm:ss"
+                                :dropdown-class-name="siderDrawer.isDarkTheme ? 'ant-card-dark' : ''"
+                                v-model="client._expiryTime" style="width: 170px;"></a-date-picker>
+            </a-form-item>
+        </a-collapse-panel>
+    </a-collapse>
+    <a-collapse v-else>
+        <a-collapse-panel :header="'{{ i18n "pages.client.clientCount"}} : ' + inbound.settings.trojans.length">
+            <table width="100%">
+                <tr class="client-table-header">
+                    <th v-for="col in Object.keys(inbound.settings.trojans[0]).slice(0, 3)">[[ col ]]</th>
+                </tr>
+                <tr v-for="(client, index) in inbound.settings.trojans" :class="index % 2 == 1 ? 'client-table-odd-row' : ''">
+                    <td v-for="col in Object.values(client).slice(0, 3)">[[ col ]]</td>
+                </tr>
+            </table>
+        </a-collapse-panel>
+    </a-collapse>
+</a-form>
 <template v-if="inbound.isTcp">
     <a-form layout="inline">
         <a-form-item label="Fallbacks">

+ 98 - 94
web/html/xui/form/protocol/vless.html

@@ -1,98 +1,102 @@
 {{define "form/vless"}}
-<a-form layout="inline">
-<a-collapse activeKey="0" v-for="(client, index) in inbound.settings.vlesses.slice(0,1)" v-if="!isEdit">
-    <a-collapse-panel header='{{ i18n "pages.inbounds.client" }}'>
-        <a-form-item>
-            <span slot="label">
-                <span>{{ i18n "pages.inbounds.Email" }}</span>
-                <a-tooltip>
-                    <template slot="title">
-                        <span>{{ i18n "pages.inbounds.EmailDesc" }}</span>
-                    </template>
-                    <a-icon type="sync" @click="getNewEmail(client)"></a-icon>
-                </a-tooltip>
-            </span>
-            <a-input v-model.trim="client.email" style="width: 150px;"></a-input>
-        </a-form-item>
-        <a-form-item label="ID">
-            <a-input v-model.trim="client.id"  style="width: 300px;"></a-input>
-        </a-form-item>
-        <a-form-item label="Subscription" v-if="client.email">
-            <a-input v-model.trim="client.subId"></a-input>
-        </a-form-item>
-        <a-form-item label="Telegram Username" v-if="client.email">
-            <a-input v-model.trim="client.tgId"></a-input>
-        </a-form-item>
-        <a-form-item>
-            <span slot="label">
-                <span>{{ i18n "pages.inbounds.IPLimit" }}</span>
-                <a-tooltip>
-                    <template slot="title">
-                        <span>{{ i18n "pages.inbounds.IPLimitDesc" }}</span>
-                    </template>
-                    <a-icon type="question-circle" theme="filled"></a-icon>
-                </a-tooltip>
-            </span>
-            <a-input-number v-model="client.limitIp" min="0"  style="width: 70px;"></a-input-number>
-        </a-form-item>
-        <a-form-item v-if="inbound.xtls" label="Flow">
-            <a-select v-model="inbound.settings.vlesses[index].flow" style="width: 200px" :dropdown-class-name="siderDrawer.isDarkTheme ? 'ant-card-dark' : ''">
-                <a-select-option value="" selected>{{ i18n "none" }}</a-select-option>
-                <a-select-option v-for="key in XTLS_FLOW_CONTROL" :value="key">[[ key ]]</a-select-option>
-            </a-select>
-        </a-form-item>
-        <a-form-item v-else-if="inbound.canEnableTlsFlow()" label="Flow" layout="inline">
-            <a-select v-model="inbound.settings.vlesses[index].flow" style="width: 200px" :dropdown-class-name="siderDrawer.isDarkTheme ? 'ant-card-dark' : ''">
-                <a-select-option value="" selected>{{ i18n "none" }}</a-select-option>
-                <a-select-option v-for="key in TLS_FLOW_CONTROL" :value="key">[[ key ]]</a-select-option>
-            </a-select>
-        </a-form-item>
-        <a-form-item>
-            <span slot="label">
-                <span >{{ i18n "pages.inbounds.totalFlow" }}</span> (GB)
-                <a-tooltip>
-                    <template slot="title">
-                        0 <span>{{ i18n "pages.inbounds.meansNoLimit" }}</span>
-                    </template>
-                    <a-icon type="question-circle" theme="filled"></a-icon>
-                </a-tooltip>
-            </span>
-            <a-input-number v-model="client._totalGB" :min="0"></a-input-number>
-        </a-form-item>
-        <a-form-item label='{{ i18n "pages.client.delayedStart" }}'>
-            <a-switch v-model="delayedStart" @click="client._expiryTime=0"></a-switch>
-        </a-form-item>
-        <a-form-item v-if="delayedStart" label='{{ i18n "pages.client.expireDays" }}'>
-            <a-input-number v-model.number="delayedExpireDays" :min="0"></a-input-number>
-        </a-form-item>
-        <a-form-item>
-            <span slot="label">
-                <span >{{ i18n "pages.inbounds.expireDate" }}</span>
-                <a-tooltip>
-                    <template slot="title">
-                        <span>{{ i18n "pages.inbounds.leaveBlankToNeverExpire" }}</span>
-                    </template>
-                    <a-icon type="question-circle" theme="filled"></a-icon>
-                </a-tooltip>
-            </span>
-            <a-date-picker :show-time="{ format: 'HH:mm:ss' }" format="YYYY-MM-DD HH:mm:ss"
-                           :dropdown-class-name="siderDrawer.isDarkTheme ? 'ant-card-dark' : ''"
-                           v-model="client._expiryTime" style="width: 170px;"></a-date-picker>
-        </a-form-item>
-    </a-collapse-panel>     
-</a-collapse>
-<a-collapse v-else>
-    <a-collapse-panel :header="'{{ i18n "pages.client.clientCount"}} : ' + inbound.settings.vlesses.length">
-        <table width="100%">
-            <tr class="client-table-header">
-                <th v-for="col in Object.keys(inbound.settings.vlesses[0]).slice(0, 3)">[[ col ]]</th>
-            </tr>
-            <tr v-for="(client, index) in inbound.settings.vlesses" :class="index % 2 == 1 ? 'client-table-odd-row' : ''">
-                <td v-for="col in Object.values(client).slice(0, 3)">[[ col ]]</td>
-            </tr>
-        </table>
-    </a-collapse-panel>
-</a-collapse>
+<a-form layout="inline" style="padding: 10px 0px;">
+    <a-collapse activeKey="0" v-for="(client, index) in inbound.settings.vlesses.slice(0,1)" v-if="!isEdit">
+        <a-collapse-panel header='{{ i18n "pages.inbounds.client" }}'>
+            <a-form-item>
+                <span slot="label">
+                    <span>{{ i18n "pages.inbounds.Email" }}</span>
+                    <a-tooltip>
+                        <template slot="title">
+                            <span>{{ i18n "pages.inbounds.EmailDesc" }}</span>
+                        </template>
+                        <a-icon type="sync" @click="getNewEmail(client)"></a-icon>
+                    </a-tooltip>
+                </span>
+                <a-input v-model.trim="client.email" style="width: 150px;"></a-input>
+            </a-form-item>
+            <a-form-item label="ID">
+                <a-input v-model.trim="client.id"  style="width: 300px;"></a-input>
+            </a-form-item>
+            <a-form-item label="Subscription" v-if="client.email">
+                <a-input v-model.trim="client.subId"></a-input>
+            </a-form-item>
+            <a-form-item label="Telegram Username" v-if="client.email">
+                <a-input v-model.trim="client.tgId"></a-input>
+            </a-form-item>
+            <a-form-item>
+                <span slot="label">
+                    <span>{{ i18n "pages.inbounds.IPLimit" }}</span>
+                    <a-tooltip>
+                        <template slot="title">
+                            <span>{{ i18n "pages.inbounds.IPLimitDesc" }}</span>
+                        </template>
+                        <a-icon type="question-circle" theme="filled"></a-icon>
+                    </a-tooltip>
+                </span>
+                <a-input-number v-model="client.limitIp" min="0"></a-input-number>
+            </a-form-item>
+            <br>
+            <a-form-item v-if="inbound.xtls" label="Flow">
+                <a-select v-model="inbound.settings.vlesses[index].flow" style="width: 200px" :dropdown-class-name="siderDrawer.isDarkTheme ? 'ant-card-dark' : ''">
+                    <a-select-option value="" selected>{{ i18n "none" }}</a-select-option>
+                    <a-select-option v-for="key in XTLS_FLOW_CONTROL" :value="key">[[ key ]]</a-select-option>
+                </a-select>
+            </a-form-item>
+            <a-form-item v-else-if="inbound.canEnableTlsFlow()" label="Flow">
+                <a-select v-model="inbound.settings.vlesses[index].flow" style="width: 200px" :dropdown-class-name="siderDrawer.isDarkTheme ? 'ant-card-dark' : ''">
+                    <a-select-option value="" selected>{{ i18n "none" }}</a-select-option>
+                    <a-select-option v-for="key in TLS_FLOW_CONTROL" :value="key">[[ key ]]</a-select-option>
+                </a-select>
+            </a-form-item>
+            <a-form-item>
+                <span slot="label">
+                    <span >{{ i18n "pages.inbounds.totalFlow" }}</span> (GB)
+                    <a-tooltip>
+                        <template slot="title">
+                            0 <span>{{ i18n "pages.inbounds.meansNoLimit" }}</span>
+                        </template>
+                        <a-icon type="question-circle" theme="filled"></a-icon>
+                    </a-tooltip>
+                </span>
+                <a-input-number v-model="client._totalGB" :min="0"></a-input-number>
+            </a-form-item>
+            <br>
+            <a-form-item label='{{ i18n "pages.client.delayedStart" }}'>
+                <a-switch v-model="delayedStart" @click="client._expiryTime=0"></a-switch>
+            </a-form-item>
+            <br>
+            <a-form-item v-if="delayedStart" label='{{ i18n "pages.client.expireDays" }}'>
+                <a-input-number v-model.number="delayedExpireDays" :min="0"></a-input-number>
+            </a-form-item>
+            <a-form-item v-else>
+                <span slot="label">
+                    <span >{{ i18n "pages.inbounds.expireDate" }}</span>
+                    <a-tooltip>
+                        <template slot="title">
+                            <span>{{ i18n "pages.inbounds.leaveBlankToNeverExpire" }}</span>
+                        </template>
+                        <a-icon type="question-circle" theme="filled"></a-icon>
+                    </a-tooltip>
+                </span>
+                <a-date-picker :show-time="{ format: 'HH:mm:ss' }" format="YYYY-MM-DD HH:mm:ss"
+                               :dropdown-class-name="siderDrawer.isDarkTheme ? 'ant-card-dark' : ''"
+                               v-model="client._expiryTime" style="width: 170px;"></a-date-picker>
+            </a-form-item>
+        </a-collapse-panel>     
+    </a-collapse>
+    <a-collapse v-else>
+        <a-collapse-panel :header="'{{ i18n "pages.client.clientCount"}} : ' + inbound.settings.vlesses.length">
+            <table width="100%">
+                <tr class="client-table-header">
+                    <th v-for="col in Object.keys(inbound.settings.vlesses[0]).slice(0, 3)">[[ col ]]</th>
+                </tr>
+                <tr v-for="(client, index) in inbound.settings.vlesses" :class="index % 2 == 1 ? 'client-table-odd-row' : ''">
+                    <td v-for="col in Object.values(client).slice(0, 3)">[[ col ]]</td>
+                </tr>
+            </table>
+        </a-collapse-panel>
+    </a-collapse>
+</a-form>
 <template v-if="inbound.isTcp">
     <a-form layout="inline">
         <a-form-item label="Fallbacks">

+ 90 - 85
web/html/xui/form/protocol/vmess.html

@@ -1,89 +1,94 @@
 {{define "form/vmess"}}
-<a-form layout="inline">
-<a-collapse activeKey="0" v-for="(client, index) in inbound.settings.vmesses.slice(0,1)" v-if="!isEdit">
-    <a-collapse-panel header='{{ i18n "pages.inbounds.client" }}'>
-        <a-form-item>
-            <span slot="label">
-                <span>{{ i18n "pages.inbounds.Email" }}</span>
-                <a-tooltip>
-                    <template slot="title">
-                        <span>{{ i18n "pages.inbounds.EmailDesc" }}</span>
-                    </template>
-                    <a-icon type="sync" @click="getNewEmail(client)"></a-icon>
-                </a-tooltip>
-            </span>
-            <a-input v-model.trim="client.email" style="width: 150px;"></a-input>
-        </a-form-item>
-        <a-form-item label='{{ i18n "additional" }} ID'>
-            <a-input-number v-model="client.alterId" style="width: 70px;"></a-input-number>
-        </a-form-item>
-        <a-form-item label="ID">
-            <a-input v-model.trim="client.id" style="width: 300px;"></a-input>
-        </a-form-item>
-        <a-form-item label="Subscription" v-if="client.email">
-            <a-input v-model.trim="client.subId"></a-input>
-        </a-form-item>
-        <a-form-item label="Telegram Username" v-if="client.email">
-            <a-input v-model.trim="client.tgId"></a-input>
-        </a-form-item>
-        <a-form-item>
-            <span slot="label">
-                <span>{{ i18n "pages.inbounds.IPLimit" }}</span>
-                <a-tooltip>
-                    <template slot="title">
-                        <span>{{ i18n "pages.inbounds.IPLimitDesc" }}</span>
-                    </template>
-                    <a-icon type="question-circle" theme="filled"></a-icon>
-                </a-tooltip>
-            </span>
-            <a-input-number v-model="client.limitIp" min="0" style="width: 70px;"></a-input-number>
-        </a-form-item>
-        <a-form-item>
-            <span slot="label">
-                <span >{{ i18n "pages.inbounds.totalFlow" }}</span> (GB)
-                <a-tooltip>
-                    <template slot="title">
-                        0 <span>{{ i18n "pages.inbounds.meansNoLimit" }}</span>
-                    </template>
-                    <a-icon type="question-circle" theme="filled"></a-icon>
-                </a-tooltip>
-            </span>
-            <a-input-number v-model="client._totalGB" :min="0"></a-input-number>
-        </a-form-item>
-        <a-form-item label='{{ i18n "pages.client.delayedStart" }}'>
-            <a-switch v-model="delayedStart" @click="client._expiryTime=0"></a-switch>
-        </a-form-item>
-        <a-form-item v-if="delayedStart" label='{{ i18n "pages.client.expireDays" }}'>
-            <a-input-number v-model.number="delayedExpireDays" :min="0"></a-input-number>
-        </a-form-item>
-        <a-form-item>
-            <span slot="label">
-                <span >{{ i18n "pages.inbounds.expireDate" }}</span>
-                <a-tooltip>
-                    <template slot="title">
-                        <span>{{ i18n "pages.inbounds.leaveBlankToNeverExpire" }}</span>
-                    </template>
-                    <a-icon type="question-circle" theme="filled"></a-icon>
-                </a-tooltip>
-            </span>
-            <a-date-picker :show-time="{ format: 'HH:mm:ss' }" format="YYYY-MM-DD HH:mm:ss"
-                            :dropdown-class-name="siderDrawer.isDarkTheme ? 'ant-card-dark' : ''"
-                            v-model="client._expiryTime" style="width: 170px;"></a-date-picker>
-        </a-form-item>
-    </a-collapse-panel>     
-</a-collapse>
-<a-collapse v-else>
-    <a-collapse-panel :header="'{{ i18n "pages.client.clientCount" }}: ' + inbound.settings.vmesses.length">
-        <table width="100%">
-                <tr class="client-table-header">
-                <th v-for="col in Object.keys(inbound.settings.vmesses[0]).slice(0, 3)">[[ col ]]</th>
-            </tr>
-            <tr v-for="(client, index) in inbound.settings.vmesses" :class="index % 2 == 1 ? 'client-table-odd-row' : ''">
-                <td v-for="col in Object.values(client).slice(0, 3)">[[ col ]]</td>
-            </tr>
-        </table>
-    </a-collapse-panel>
-</a-collapse>
+<a-form layout="inline" style="padding: 10px 0px;">
+    <a-collapse activeKey="0" v-for="(client, index) in inbound.settings.vmesses.slice(0,1)" v-if="!isEdit">
+        <a-collapse-panel header='{{ i18n "pages.inbounds.client" }}'>
+            <a-form-item>
+                <span slot="label">
+                    <span>{{ i18n "pages.inbounds.Email" }}</span>
+                    <a-tooltip>
+                        <template slot="title">
+                            <span>{{ i18n "pages.inbounds.EmailDesc" }}</span>
+                        </template>
+                        <a-icon type="sync" @click="getNewEmail(client)"></a-icon>
+                    </a-tooltip>
+                </span>
+                <a-input v-model.trim="client.email" style="width: 150px;"></a-input>
+            </a-form-item>
+            <br>
+            <a-form-item label='{{ i18n "additional" }} ID'>
+                <a-input-number v-model="client.alterId"></a-input-number>
+            </a-form-item>
+            <a-form-item label="ID">
+                <a-input v-model.trim="client.id" style="width: 300px;"></a-input>
+            </a-form-item>
+            <a-form-item label="Subscription" v-if="client.email">
+                <a-input v-model.trim="client.subId"></a-input>
+            </a-form-item>
+            <a-form-item label="Telegram Username" v-if="client.email">
+                <a-input v-model.trim="client.tgId"></a-input>
+            </a-form-item>
+            <a-form-item>
+                <span slot="label">
+                    <span>{{ i18n "pages.inbounds.IPLimit" }}</span>
+                    <a-tooltip>
+                        <template slot="title">
+                            <span>{{ i18n "pages.inbounds.IPLimitDesc" }}</span>
+                        </template>
+                        <a-icon type="question-circle" theme="filled"></a-icon>
+                    </a-tooltip>
+                </span>
+                <a-input-number v-model="client.limitIp" min="0"></a-input-number>
+            </a-form-item>
+            <br>
+            <a-form-item>
+                <span slot="label">
+                    <span >{{ i18n "pages.inbounds.totalFlow" }}</span> (GB)
+                    <a-tooltip>
+                        <template slot="title">
+                            0 <span>{{ i18n "pages.inbounds.meansNoLimit" }}</span>
+                        </template>
+                        <a-icon type="question-circle" theme="filled"></a-icon>
+                    </a-tooltip>
+                </span>
+                <a-input-number v-model="client._totalGB" :min="0"></a-input-number>
+            </a-form-item>
+            <br>
+            <a-form-item label='{{ i18n "pages.client.delayedStart" }}'>
+                <a-switch v-model="delayedStart" @click="client._expiryTime=0"></a-switch>
+            </a-form-item>
+            <br>
+            <a-form-item v-if="delayedStart" label='{{ i18n "pages.client.expireDays" }}'>
+                <a-input-number v-model.number="delayedExpireDays" :min="0"></a-input-number>
+            </a-form-item>
+            <a-form-item v-else>
+                <span slot="label">
+                    <span >{{ i18n "pages.inbounds.expireDate" }}</span>
+                    <a-tooltip>
+                        <template slot="title">
+                            <span>{{ i18n "pages.inbounds.leaveBlankToNeverExpire" }}</span>
+                        </template>
+                        <a-icon type="question-circle" theme="filled"></a-icon>
+                    </a-tooltip>
+                </span>
+                <a-date-picker :show-time="{ format: 'HH:mm:ss' }" format="YYYY-MM-DD HH:mm:ss"
+                                :dropdown-class-name="siderDrawer.isDarkTheme ? 'ant-card-dark' : ''"
+                                v-model="client._expiryTime" style="width: 170px;"></a-date-picker>
+            </a-form-item>
+        </a-collapse-panel>     
+    </a-collapse>
+    <a-collapse v-else>
+        <a-collapse-panel :header="'{{ i18n "pages.client.clientCount" }}: ' + inbound.settings.vmesses.length">
+            <table width="100%">
+                    <tr class="client-table-header">
+                    <th v-for="col in Object.keys(inbound.settings.vmesses[0]).slice(0, 3)">[[ col ]]</th>
+                </tr>
+                <tr v-for="(client, index) in inbound.settings.vmesses" :class="index % 2 == 1 ? 'client-table-odd-row' : ''">
+                    <td v-for="col in Object.values(client).slice(0, 3)">[[ col ]]</td>
+                </tr>
+            </table>
+        </a-collapse-panel>
+    </a-collapse>
+</a-form>
 <a-form layout="inline">
     <a-form-item label='{{ i18n "pages.inbounds.disableInsecureEncryption" }}'>
         <a-switch v-model.number="inbound.settings.disableInsecure"></a-switch>

+ 4 - 4
web/html/xui/inbounds.html

@@ -260,7 +260,7 @@
         title: "ID",
         align: 'center',
         dataIndex: "id",
-        width: 30,
+        width: 40,
     }, {
         title: '{{ i18n "pages.inbounds.remark" }}',
         align: 'center',
@@ -295,7 +295,7 @@
 
     const innerColumns = [
         { title: '{{ i18n "pages.inbounds.operate" }}', width: 70, scopedSlots: { customRender: 'actions' } },
-        { title: '{{ i18n "pages.inbounds.enable" }}', width: 30, scopedSlots: { customRender: 'enable' } },
+        { title: '{{ i18n "pages.inbounds.enable" }}', width: 40, scopedSlots: { customRender: 'enable' } },
         { title: '{{ i18n "pages.inbounds.client" }}', width: 80, scopedSlots: { customRender: 'client' } },
         { title: '{{ i18n "pages.inbounds.traffic" }}↑|↓', width: 120, scopedSlots: { customRender: 'traffic' } },
         { title: '{{ i18n "pages.inbounds.expireDate" }}', width: 70, scopedSlots: { customRender: 'expiryTime' } },
@@ -304,11 +304,11 @@
 
     const innerTrojanColumns = [
         { title: '{{ i18n "pages.inbounds.operate" }}', width: 70, scopedSlots: { customRender: 'actions' } },
-        { title: '{{ i18n "pages.inbounds.enable" }}', width: 30, scopedSlots: { customRender: 'enable' } },
+        { title: '{{ i18n "pages.inbounds.enable" }}', width: 40, scopedSlots: { customRender: 'enable' } },
         { title: '{{ i18n "pages.inbounds.client" }}', width: 80, scopedSlots: { customRender: 'client' } },
         { title: '{{ i18n "pages.inbounds.traffic" }}↑|↓', width: 120, scopedSlots: { customRender: 'traffic' } },
         { title: '{{ i18n "pages.inbounds.expireDate" }}', width: 70, scopedSlots: { customRender: 'expiryTime' } },
-        { title: 'Password', width: 120, dataIndex: "password" },
+        { title: 'Password', width: 170, dataIndex: "password" },
     ];
 
     const app = new Vue({