Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/MHSanaei/3x-ui.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTara Rostami <132676256+TaraRostami@users.noreply.github.com>2024-03-20 13:43:37 +0300
committerGitHub <noreply@github.com>2024-03-20 13:43:37 +0300
commit0bec29f2ba5d92087704d997b9d116f0b352cf2d (patch)
treed76811ecc8604d9545049d20eda68f303f615e24 /web/html/xui/xray.html
parenta7418d9708e4f03503315530e68133507ba53278 (diff)
UI Improvements (#2067)
Diffstat (limited to 'web/html/xui/xray.html')
-rw-r--r--web/html/xui/xray.html1205
1 files changed, 610 insertions, 595 deletions
diff --git a/web/html/xui/xray.html b/web/html/xui/xray.html
index 98dacd92..f42fb076 100644
--- a/web/html/xui/xray.html
+++ b/web/html/xui/xray.html
@@ -24,7 +24,6 @@
margin: 24px 16px;
}
}
-
@media (max-width: 768px) {
.ant-tabs-nav .ant-tabs-tab {
margin: 0;
@@ -35,15 +34,12 @@
padding: 10px 0px;
}
}
-
.ant-tabs-bar {
margin: 0;
}
-
.ant-list-item {
display: block;
}
-
.collapse-title {
color: inherit;
font-weight: bold;
@@ -51,606 +47,625 @@
padding: 10px 20px;
border-bottom: 2px solid;
}
-
.collapse-title > i {
color: inherit;
font-size: 24px;
}
+ .ant-collapse-content-box > li {
+ padding: 12px 0 0 0 !important;
+ }
+ .ant-list-item > li {
+ padding: 10px 20px !important;
+ }
</style>
<body>
-<a-layout id="app" v-cloak :class="themeSwitcher.currentTheme">
+ <a-layout id="app" v-cloak :class="themeSwitcher.currentTheme">
{{ template "commonSider" . }}
<a-layout id="content-layout">
- <a-layout-content>
- <a-spin :spinning="spinning" :delay="500" tip='{{ i18n "loading"}}'>
- <transition name="list" appear>
- <a-alert type="error" v-if="showAlert" style="margin-bottom: 10px"
- message='{{ i18n "secAlertTitle" }}'
- color="red"
- description='{{ i18n "secAlertSsl" }}'
- show-icon closable
- >
- </a-alert>
- </transition>
- <a-space direction="vertical">
- <a-card hoverable style="margin-bottom: .5rem;">
- <a-row style="display: flex; flex-wrap: wrap; align-items: center;">
- <a-col :xs="24" :sm="10" style="padding: 4px;">
- <a-space direction="horizontal">
- <a-button type="primary" :disabled="saveBtnDisable" @click="updateXraySetting">{{ i18n "pages.xray.save" }}</a-button>
- <a-button type="danger" :disabled="!saveBtnDisable" @click="restartXray">{{ i18n "pages.xray.restart" }}</a-button>
- <a-popover v-if="restartResult"
- :overlay-class-name="themeSwitcher.currentTheme">
- <span slot="title" style="font-size: 12pt">Error in running xray-core</span>
- <template slot="content">
- <p style="max-width: 400px" v-for="line in restartResult.split('\n')">[[ line ]]</p>
- </template>
- <a-icon type="question-circle"></a-icon>
- </a-popover>
- </a-space>
- </a-col>
- <a-col :xs="24" :sm="14">
- <template>
- <div>
- <a-back-top :target="() => document.getElementById('content-layout')" visibility-height="200">
- </a-back-top>
- <a-alert type="warning" style="float: right; width: fit-content"
- message='{{ i18n "pages.settings.infoDesc" }}'
- show-icon
- >
- </div>
- </template>
- </a-col>
- </a-row>
- </a-card>
- <a-tabs class="ant-card-dark-box-nohover" default-active-key="1"
- @change="(activeKey) => { this.changePage(activeKey); }"
- :class="themeSwitcher.currentTheme">
- <a-tab-pane key="tpl-basic" tab='{{ i18n "pages.xray.basicTemplate"}}' style="padding-top: 20px;">
- <a-collapse>
- <a-collapse-panel header='{{ i18n "pages.xray.generalConfigs"}}'>
- <a-row :xs="24" :sm="24" :lg="12">
- <a-alert type="warning" style="text-align: center;">
- <template slot="message">
- <a-icon type="exclamation-circle" theme="filled" style="color: #FFA031"></a-icon>
- {{ i18n "pages.xray.generalConfigsDesc" }}
- </template>
- </a-alert>
- </a-row>
- <a-list-item>
- <a-row style="padding: 20px">
- <a-col :lg="24" :xl="12">
- <a-list-item-meta title='{{ i18n "pages.xray.FreedomStrategy" }}'
- description='{{ i18n "pages.xray.FreedomStrategyDesc" }}' />
- </a-col>
- <a-col :lg="24" :xl="12">
- <template>
- <a-select v-model="freedomStrategy" :dropdown-class-name="themeSwitcher.currentTheme"
- style="width: 100%">
- <a-select-option v-for="s in OutboundDomainStrategies" :value="s">[[ s ]]</a-select-option>
- </a-select>
- </template>
- </a-col>
- </a-row>
- </a-list-item>
- <a-row style="padding: 20px">
- <a-col :lg="24" :xl="12">
- <a-list-item-meta title='{{ i18n "pages.xray.RoutingStrategy" }}'
- description='{{ i18n "pages.xray.RoutingStrategyDesc" }}' />
- </a-col>
- <a-col :lg="24" :xl="12">
- <a-select v-model="routingStrategy" :dropdown-class-name="themeSwitcher.currentTheme"
- style="width: 100%">
- <a-select-option v-for="s in routingDomainStrategies" :value="s">[[ s ]]</a-select-option>
- </a-select>
- </a-col>
- </a-row>
- </a-list-item>
- </a-collapse-panel>
- <a-collapse-panel header='{{ i18n "pages.xray.logConfigs" }}'>
- <a-row :xs="24" :sm="24" :lg="12">
- <a-alert type="warning" style="text-align: center;">
- <template slot="message">
- <a-icon type="exclamation-circle" theme="filled" style="color: #FFA031"></a-icon>
- {{ i18n "pages.xray.logConfigsDesc" }}
- </template>
- </a-alert>
- </a-row>
- <a-row style="padding: 20px">
- <a-col :lg="24" :xl="12">
- <a-list-item-meta title='{{ i18n "pages.xray.logLevel" }}'
- description='{{ i18n "pages.xray.logLevelDesc" }}' />
- </a-col>
- <a-col :lg="24" :xl="12">
- <template>
- <a-select v-model="setLogLevel" :dropdown-class-name="themeSwitcher.currentTheme" style="width: 100%">
- <a-select-option v-for="s in logLevel" :value="s">[[ s ]]</a-select-option>
- </a-select>
- </template>
- </a-col>
- </a-row>
- <a-row style="padding: 20px">
- <a-col :lg="24" :xl="12">
- <a-list-item-meta title='{{ i18n "pages.xray.accessLog" }}'
- description='{{ i18n "pages.xray.accessLogDesc" }}' />
- </a-col>
- <a-col :lg="24" :xl="12">
- <template>
- <a-select v-model="accessLog" :dropdown-class-name="themeSwitcher.currentTheme" style="width: 100%">
- <a-select-option v-for="s in access" :key="s" :value="s">[[ s ]]</a-select-option>
- </a-select>
- </template>
- </a-col>
- </a-row>
- <a-row style="padding: 20px">
- <a-col :lg="24" :xl="12">
- <a-list-item-meta title='{{ i18n "pages.xray.errorLog" }}'
- description='{{ i18n "pages.xray.errorLogDesc" }}' />
- </a-col>
- <a-col :lg="24" :xl="12">
- <template>
- <a-select v-model="errorLog" :dropdown-class-name="themeSwitcher.currentTheme" style="width: 100%">
- <a-select-option v-for="s in error" :key="s" :value="s">[[ s ]]</a-select-option>
- </a-select>
- </template>
- </a-col>
- </a-row>
- </a-list-item>
- </a-collapse-panel>
- <a-collapse-panel header='{{ i18n "pages.xray.blockConfigs"}}'>
- <a-row :xs="24" :sm="24" :lg="12">
- <a-alert type="warning" style="text-align: center;">
- <template slot="message">
- <a-icon type="exclamation-circle" theme="filled" style="color: #FFA031"></a-icon>
- {{ i18n "pages.xray.blockConfigsDesc" }}
- </template>
- </a-alert>
- </a-row>
- <setting-list-item type="switch" title='{{ i18n "pages.xray.Torrent"}}' desc='{{ i18n "pages.xray.TorrentDesc"}}' v-model="torrentSettings"></setting-list-item>
- <setting-list-item type="switch" title='{{ i18n "pages.xray.PrivateIp"}}' desc='{{ i18n "pages.xray.PrivateIpDesc"}}' v-model="privateIpSettings"></setting-list-item>
- <setting-list-item type="switch" title='{{ i18n "pages.xray.Ads"}}' desc='{{ i18n "pages.xray.AdsDesc"}}' v-model="AdsSettings"></setting-list-item>
- <setting-list-item type="switch" title='{{ i18n "pages.xray.Family"}}' desc='{{ i18n "pages.xray.FamilyDesc"}}' v-model="familyProtectSettings"></setting-list-item>
- <setting-list-item type="switch" title='{{ i18n "pages.xray.Security"}}' desc='{{ i18n "pages.xray.SecurityDesc"}}' v-model="SecuritySettings"></setting-list-item>
- <setting-list-item type="switch" title='{{ i18n "pages.xray.Speedtest"}}' desc='{{ i18n "pages.xray.SpeedtestDesc"}}' v-model="SpeedTestSettings"></setting-list-item>
- </a-collapse-panel>
- <a-collapse-panel header='{{ i18n "pages.xray.blockCountryConfigs"}}'>
- <a-row :xs="24" :sm="24" :lg="12">
- <a-alert type="warning" style="text-align: center;">
- <template slot="message">
- <a-icon type="exclamation-circle" theme="filled" style="color: #FFA031"></a-icon>
- {{ i18n "pages.xray.blockCountryConfigsDesc" }}
- </template>
- </a-alert>
- </a-row>
- <setting-list-item type="switch" title='{{ i18n "pages.xray.IRIp"}}' desc='{{ i18n "pages.xray.IRIpDesc"}}' v-model="IRIpSettings"></setting-list-item>
- <setting-list-item type="switch" title='{{ i18n "pages.xray.IRDomain"}}' desc='{{ i18n "pages.xray.IRDomainDesc"}}' v-model="IRDomainSettings"></setting-list-item>
- <setting-list-item type="switch" title='{{ i18n "pages.xray.ChinaIp"}}' desc='{{ i18n "pages.xray.ChinaIpDesc"}}' v-model="ChinaIpSettings"></setting-list-item>
- <setting-list-item type="switch" title='{{ i18n "pages.xray.ChinaDomain"}}' desc='{{ i18n "pages.xray.ChinaDomainDesc"}}' v-model="ChinaDomainSettings"></setting-list-item>
- <setting-list-item type="switch" title='{{ i18n "pages.xray.RussiaIp"}}' desc='{{ i18n "pages.xray.RussiaIpDesc"}}' v-model="RussiaIpSettings"></setting-list-item>
- <setting-list-item type="switch" title='{{ i18n "pages.xray.RussiaDomain"}}' desc='{{ i18n "pages.xray.RussiaDomainDesc"}}' v-model="RussiaDomainSettings"></setting-list-item>
- <setting-list-item type="switch" title='{{ i18n "pages.xray.VNIp"}}' desc='{{ i18n "pages.xray.VNIpDesc"}}' v-model="VNIpSettings"></setting-list-item>
- <setting-list-item type="switch" title='{{ i18n "pages.xray.VNDomain"}}' desc='{{ i18n "pages.xray.VNDomainDesc"}}' v-model="VNDomainSettings"></setting-list-item>
- </a-collapse-panel>
- <a-collapse-panel header='{{ i18n "pages.xray.directCountryConfigs"}}'>
- <a-row :xs="24" :sm="24" :lg="12">
- <a-alert type="warning" style="text-align: center;">
- <template slot="message">
- <a-icon type="exclamation-circle" theme="filled" style="color: #FFA031"></a-icon>
- {{ i18n "pages.xray.directCountryConfigsDesc" }}
- </template>
- </a-alert>
- </a-row>
- <setting-list-item type="switch" title='{{ i18n "pages.xray.DirectIRIp"}}' desc='{{ i18n "pages.xray.DirectIRIpDesc"}}' v-model="IRIpDirectSettings"></setting-list-item>
- <setting-list-item type="switch" title='{{ i18n "pages.xray.DirectIRDomain"}}' desc='{{ i18n "pages.xray.DirectIRDomainDesc"}}' v-model="IRDomainDirectSettings"></setting-list-item>
- <setting-list-item type="switch" title='{{ i18n "pages.xray.DirectChinaIp"}}' desc='{{ i18n "pages.xray.DirectChinaIpDesc"}}' v-model="ChinaIpDirectSettings"></setting-list-item>
- <setting-list-item type="switch" title='{{ i18n "pages.xray.DirectChinaDomain"}}' desc='{{ i18n "pages.xray.DirectChinaDomainDesc"}}' v-model="ChinaDomainDirectSettings"></setting-list-item>
- <setting-list-item type="switch" title='{{ i18n "pages.xray.DirectRussiaIp"}}' desc='{{ i18n "pages.xray.DirectRussiaIpDesc"}}' v-model="RussiaIpDirectSettings"></setting-list-item>
- <setting-list-item type="switch" title='{{ i18n "pages.xray.DirectRussiaDomain"}}' desc='{{ i18n "pages.xray.DirectRussiaDomainDesc"}}' v-model="RussiaDomainDirectSettings"></setting-list-item>
- <setting-list-item type="switch" title='{{ i18n "pages.xray.DirectVNIp"}}' desc='{{ i18n "pages.xray.DirectVNIpDesc"}}' v-model="VNIpDirectSettings"></setting-list-item>
- <setting-list-item type="switch" title='{{ i18n "pages.xray.DirectVNDomain"}}' desc='{{ i18n "pages.xray.DirectVNDomainDesc"}}' v-model="VNDomainDirectSettings"></setting-list-item>
- </a-collapse-panel>
- <a-collapse-panel header='{{ i18n "pages.xray.ipv4Configs"}}'>
- <a-row :xs="24" :sm="24" :lg="12">
- <a-alert type="warning" style="text-align: center;">
- <template slot="message">
- <a-icon type="exclamation-circle" theme="filled" style="color: #FFA031"></a-icon>
- {{ i18n "pages.xray.ipv4ConfigsDesc" }}
- </template>
- </a-alert>
- </a-row>
- <setting-list-item type="switch" title='{{ i18n "pages.xray.GoogleIPv4"}}' desc='{{ i18n "pages.xray.GoogleIPv4Desc"}}' v-model="GoogleIPv4Settings"></setting-list-item>
- <setting-list-item type="switch" title='{{ i18n "pages.xray.NetflixIPv4"}}' desc='{{ i18n "pages.xray.NetflixIPv4Desc"}}' v-model="NetflixIPv4Settings"></setting-list-item>
- </a-collapse-panel>
- <a-collapse-panel header='{{ i18n "pages.xray.warpConfigs"}}'>
- <a-row :xs="24" :sm="24" :lg="12">
- <a-alert type="warning" style="text-align: center;">
- <template slot="message">
- <a-icon type="exclamation-circle" theme="filled" style="color: #FFA031"></a-icon>
- {{ i18n "pages.xray.warpConfigsDesc" }}
- </template>
- </a-alert>
- </a-row>
- <template v-if="WarpExist">
- <setting-list-item type="switch" title='{{ i18n "pages.xray.GoogleWARP"}}' desc='{{ i18n "pages.xray.GoogleWARPDesc"}}' v-model="GoogleWARPSettings"></setting-list-item>
- <setting-list-item type="switch" title='{{ i18n "pages.xray.OpenAIWARP"}}' desc='{{ i18n "pages.xray.OpenAIWARPDesc"}}' v-model="OpenAIWARPSettings"></setting-list-item>
- <setting-list-item type="switch" title='{{ i18n "pages.xray.NetflixWARP"}}' desc='{{ i18n "pages.xray.NetflixWARPDesc"}}' v-model="NetflixWARPSettings"></setting-list-item>
- <setting-list-item type="switch" title='{{ i18n "pages.xray.SpotifyWARP"}}' desc='{{ i18n "pages.xray.SpotifyWARPDesc"}}' v-model="SpotifyWARPSettings"></setting-list-item>
- <setting-list-item type="switch" title='{{ i18n "pages.xray.MetaWARP"}}' desc='{{ i18n "pages.xray.MetaWARPDesc"}}' v-model="MetaWARPSettings"></setting-list-item>
- <setting-list-item type="switch" title='{{ i18n "pages.xray.AppleWARP"}}' desc='{{ i18n "pages.xray.AppleWARPDesc"}}' v-model="AppleWARPSettings"></setting-list-item>
- <setting-list-item type="switch" title='{{ i18n "pages.xray.RedditWARP"}}' desc='{{ i18n "pages.xray.RedditWARPDesc"}}' v-model="RedditWARPSettings"></setting-list-item>
- </template>
- <a-button v-else type="primary" icon="cloud" style="margin: 15px 20px;" @click="showWarp()">WARP</a-button>
- </a-collapse-panel>
- <a-collapse-panel header='{{ i18n "pages.settings.resetDefaultConfig"}}'>
- <a-space direction="horizontal" style="padding: 0 20px">
- <a-button type="danger" @click="resetXrayConfigToDefault">{{ i18n "pages.settings.resetDefaultConfig" }}</a-button>
- </a-space>
- </a-collapse-panel>
- </a-collapse>
- </a-tab-pane>
- <a-tab-pane key="tpl-routing" tab='{{ i18n "pages.xray.Routings"}}' style="padding-top: 20px;">
- <a-button type="primary" icon="plus" @click="addRule">{{ i18n "pages.xray.rules.add" }}</a-button>
- <a-table-sortable :columns="isMobile ? rulesMobileColumns : rulesColumns" bordered
- :row-key="r => r.key"
- :data-source="routingRuleData"
- :scroll="isMobile ? {} : { x: 1000 }"
- :pagination="false"
- :indent-size="0"
- :style="isMobile ? 'padding: 5px 0' : 'margin-top: 10px;'"
- v-on:onSort="replaceRule">
- <template slot="action" slot-scope="text, rule, index">
- <table-sort-trigger :item-index="index"></table-sort-trigger>
- <span class="ant-table-row-index">
- [[ index+1 ]]
- </span>
- <a-dropdown :trigger="['click']">
- <a-icon @click="e => e.preventDefault()" type="more" style="font-size: 16px; text-decoration: bold;"></a-icon>
- <a-menu slot="overlay" :theme="themeSwitcher.currentTheme">
- <a-menu-item v-if="index>0" @click="replaceRule(index,0)">
- <a-icon type="vertical-align-top"></a-icon>
- {{ i18n "pages.xray.rules.first"}}
- </a-menu-item>
- <a-menu-item v-if="index>0" @click="replaceRule(index,index-1)">
- <a-icon type="arrow-up"></a-icon>
- {{ i18n "pages.xray.rules.up"}}
- </a-menu-item>
- <a-menu-item v-if="index<routingRuleData.length-1" @click="replaceRule(index,index+1)">
- <a-icon type="arrow-down"></a-icon>
- {{ i18n "pages.xray.rules.down"}}
- </a-menu-item>
- <a-menu-item v-if="index<routingRuleData.length-1" @click="replaceRule(index,routingRuleData.length-1)">
- <a-icon type="vertical-align-bottom"></a-icon>
- {{ i18n "pages.xray.rules.last"}}
- </a-menu-item>
- <a-menu-item @click="editRule(index)">
- <a-icon type="edit"></a-icon>
- {{ i18n "edit" }}
- </a-menu-item>
- <a-menu-item @click="deleteRule(index)">
- <span style="color: #FF4D4F">
- <a-icon type="delete"></a-icon> {{ i18n "delete"}}
- </span>
- </a-menu-item>
- </a-menu>
- </a-dropdown>
- </template>
- <template slot="inbound" slot-scope="text, rule, index">
- <a-popover :overlay-class-name="themeSwitcher.currentTheme">
- <template slot="content">
- <p v-if="rule.inboundTag">Inbound Tag: [[ rule.inboundTag ]]</p>
- <p v-if="rule.user">User email: [[ rule.user ]]</p>
- </template>
- [[ [rule.inboundTag,rule.user].join('\n') ]]
- </a-popover>
- </template>
- <template slot="outbound" slot-scope="text, rule, index">
- <a-popover :overlay-class-name="themeSwitcher.currentTheme">
- <template slot="content">
- <p v-if="rule.outboundTag">Outbound Tag: [[ rule.outboundTag ]]</p>
- </template>
- [[ rule.outboundTag ]]
- </a-popover>
- </template>
- <template slot="balancer" slot-scope="text, rule, index">
- <a-popover :overlay-class-name="themeSwitcher.currentTheme">
- <template slot="content">
- <p v-if="rule.balancerTag">Balancer Tag: [[ rule.balancerTag ]]</p>
- </template>
- [[ rule.balancerTag ]]
- </a-popover>
- </template>
- <template slot="info" slot-scope="text, rule, index">
- <a-popover placement="bottomRight"
- v-if="(rule.source+rule.sourcePort+rule.network+rule.protocol+rule.attrs+rule.ip+rule.domain+rule.port).length>0"
- :overlay-class-name="themeSwitcher.currentTheme" trigger="click">
- <template slot="content">
- <table cellpadding="2" style="max-width: 300px;">
- <tr v-if="rule.source">
- <td>Source</td>
- <td><a-tag color="blue" v-for="r in rule.source.split(',')">[[ r ]]</a-tag></td>
- </tr>
- <tr v-if="rule.sourcePort">
- <td>Source Port</td>
- <td><a-tag color="green" v-for="r in rule.sourcePort.split(',')">[[ r ]]</a-tag></td>
- </tr>
- <tr v-if="rule.network">
- <td>Network</td>
- <td><a-tag color="blue" v-for="r in rule.network.split(',')">[[ r ]]</a-tag></td>
- </tr>
- <tr v-if="rule.protocol">
- <td>Protocol</td>
- <td><a-tag color="green" v-for="r in rule.protocol.split(',')">[[ r ]]</a-tag></td>
- </tr>
- <tr v-if="rule.attrs">
- <td>Attrs</td>
- <td><a-tag color="blue" v-for="r in rule.attrs.split(',')">[[ r ]]</a-tag></td>
- </tr>
- <tr v-if="rule.ip">
- <td>IP</td>
- <td><a-tag color="green" v-for="r in rule.ip.split(',')">[[ r ]]</a-tag></td>
- </tr>
- <tr v-if="rule.domain">
- <td>Domain</td>
- <td><a-tag color="blue" v-for="r in rule.domain.split(',')">[[ r ]]</a-tag></td>
- </tr>
- <tr v-if="rule.port">
- <td>Port</td>
- <td><a-tag color="green" v-for="r in rule.port.split(',')">[[ r ]]</a-tag></td>
- </tr>
- <tr v-if="rule.balancerTag">
- <td>Balancer Tag</td>
- <td><a-tag color="blue">[[ rule.balancerTag ]]</a-tag></td>
- </tr>
- </table>
- </template>
- <a-button shape="round" size="small" style="font-size: 14px; padding: 0 10px;">
- <a-icon type="info"></a-icon>
- </a-button>
- </a-popover>
- </template>
- </a-table-sortable>
- </a-tab-pane>
- <a-tab-pane key="tpl-outbound" tab='{{ i18n "pages.xray.Outbounds"}}' style="padding-top: 20px;" force-render="true">
- <a-row>
- <a-col :xs="12" :sm="12" :lg="12">
- <a-button type="primary" icon="plus" @click="addOutbound()" style="margin-bottom: 10px;">{{ i18n
- "pages.xray.outbound.addOutbound" }}</a-button>
- <a-button type="primary" icon="cloud" @click="showWarp()" style="margin-bottom: 10px;">WARP</a-button>
- </a-col>
- <a-col :xs="12" :sm="12" :lg="12" style="text-align: right;">
- <a-icon type="sync" :spin="refreshing" @click="refreshOutboundTraffic()" style="margin: 0 5px;"></a-icon>
- <a-popconfirm placement="topRight" @confirm="resetOutboundTraffic(-1)"
- title='{{ i18n "pages.inbounds.resetTrafficContent"}}'
- :overlay-class-name="themeSwitcher.currentTheme"
- ok-text='{{ i18n "reset"}}'
- cancel-text='{{ i18n "cancel"}}'>
- <a-icon slot="icon" type="question-circle-o" :style="themeSwitcher.isDarkTheme ? 'color: #008771' : 'color: #008771'"></a-icon>
- <a-icon type="retweet" style="cursor: pointer;"></a-icon>
- </a-popconfirm>
- </a-col>
- </a-row>
- <a-table :columns="outboundColumns" bordered
- :row-key="r => r.key"
- :data-source="outboundData"
- :scroll="isMobile ? {} : { x: 200 }"
- :pagination="false"
- :indent-size="0"
- :style="isMobile ? 'padding: 5px 5px' : 'margin-right: 1px;'">
- <template slot="action" slot-scope="text, outbound, index">
- [[ index+1 ]]
- <a-dropdown :trigger="['click']">
- <a-icon @click="e => e.preventDefault()" type="more" style="font-size: 16px; text-decoration: bold;"></a-icon>
- <a-menu slot="overlay" :theme="themeSwitcher.currentTheme">
- <a-menu-item v-if="index>0" @click="setFirstOutbound(index)">
- <a-icon type="vertical-align-top"></a-icon>
- {{ i18n "pages.xray.rules.first"}}
- </a-menu-item>
- <a-menu-item @click="editOutbound(index)">
- <a-icon type="edit"></a-icon>
- {{ i18n "edit" }}
- </a-menu-item>
- <a-menu-item @click="resetOutboundTraffic(index)">
- <span>
- <a-icon type="retweet"></a-icon> {{ i18n "pages.inbounds.resetTraffic"}}
- </span>
- </a-menu-item>
- <a-menu-item @click="deleteOutbound(index)">
- <span style="color: #FF4D4F">
- <a-icon type="delete"></a-icon> {{ i18n "delete"}}
- </span>
- </a-menu-item>
- </a-menu>
- </a-dropdown>
- </template>
- <template slot="address" slot-scope="text, outbound, index">
- <p style="margin: 0 5px;" v-for="addr in findOutboundAddress(outbound)">[[ addr ]]</p>
- </template>
- <template slot="protocol" slot-scope="text, outbound, index">
- <a-tag style="margin:0;" color="purple">[[ outbound.protocol ]]</a-tag>
- <template v-if="[Protocols.VMess, Protocols.VLESS, Protocols.Trojan, Protocols.Shadowsocks].includes(outbound.protocol)">
- <a-tag style="margin:0;" color="blue">[[ outbound.streamSettings.network ]]</a-tag>
- <a-tag style="margin:0;" v-if="outbound.streamSettings.security=='tls'" color="green">tls</a-tag>
- <a-tag style="margin:0;" v-if="outbound.streamSettings.security=='reality'" color="green">reality</a-tag>
- </template>
- </template>
- <template slot="traffic" slot-scope="text, outbound, index">
- <a-tag color="green">[[ findOutboundTraffic(outbound) ]]</a-tag>
- </template>
- </a-table>
- </a-tab-pane>
- <a-tab-pane key="tpl-reverse" tab='{{ i18n "pages.xray.outbound.reverse"}}' style="padding-top: 20px;" force-render="true">
- <a-button type="primary" icon="plus" @click="addReverse()" style="margin-bottom: 10px;">{{ i18n "pages.xray.outbound.addReverse" }}</a-button>
- <a-table :columns="reverseColumns" bordered v-if="reverseData.length>0"
- :row-key="r => r.key"
- :data-source="reverseData"
- :scroll="isMobile ? {} : { x: 200 }"
- :pagination="false"
- :indent-size="0"
- :style="isMobile ? 'padding: 5px 0' : 'margin-left: 1px;'">
- <template slot="action" slot-scope="text, reverse, index">
- [[ index+1 ]]
- <a-dropdown :trigger="['click']">
- <a-icon @click="e => e.preventDefault()" type="more" style="font-size: 16px; text-decoration: bold;"></a-icon>
- <a-menu slot="overlay" :theme="themeSwitcher.currentTheme">
- <a-menu-item @click="editReverse(index)">
- <a-icon type="edit"></a-icon>
- {{ i18n "edit" }}
- </a-menu-item>
- <a-menu-item @click="deleteReverse(index)">
- <span style="color: #FF4D4F">
- <a-icon type="delete"></a-icon> {{ i18n "delete"}}
- </span>
- </a-menu-item>
- </a-menu>
- </a-dropdown>
- </template>
- </a-table>
- </a-tab-pane>
- <a-tab-pane key="tpl-balancer" tab='{{ i18n "pages.xray.Balancers"}}' style="padding-top: 20px;" force-render="true">
- <a-button type="primary" icon="plus" @click="addBalancer()" style="margin-bottom: 10px;">{{ i18n "pages.xray.balancer.addBalancer"}}</a-button>
- <a-table :columns="balancerColumns" bordered v-if="balancersData.length>0"
- :row-key="r => r.key"
- :data-source="balancersData"
- :scroll="isMobile ? {} : { x: 200 }"
- :pagination="false"
- :indent-size="0"
- :style="isMobile ? 'padding: 5px 0' : 'margin-left: 1px;'">
- <template slot="action" slot-scope="text, balancer, index">
- [[ index+1 ]]
- <a-dropdown :trigger="['click']">
- <a-icon @click="e => e.preventDefault()" type="more" style="font-size: 16px; text-decoration: bold;"></a-icon>
- <a-menu slot="overlay" :theme="themeSwitcher.currentTheme">
- <a-menu-item @click="editBalancer(index)">
- <a-icon type="edit"></a-icon>
- {{ i18n "edit" }}
- </a-menu-item>
- <a-menu-item @click="deleteBalancer(index)">
- <span style="color: #FF4D4F">
- <a-icon type="delete"></a-icon> {{ i18n "delete"}}
- </span>
- </a-menu-item>
- </a-menu>
- </a-dropdown>
- </template>
- <template slot="strategy" slot-scope="text, balancer, index">
- <a-tag style="margin:0;" v-if="balancer.strategy=='random'" color="purple">Random</a-tag>
- <a-tag style="margin:0;" v-if="balancer.strategy=='roundRobin'" color="green">Round Robin</a-tag>
- <a-tag style="margin:0;" v-if="balancer.strategy=='leastload'" color="green">Least Load</a-tag>
- <a-tag style="margin:0;" v-if="balancer.strategy=='leastping'" color="green">Least Ping</a-tag>
- </template>
- <template slot="selector" slot-scope="text, balancer, index">
- <a-tag class="info-large-tag" style="margin:1;" v-for="sel in balancer.selector">[[ sel ]]</a-tag>
- </template>
- </a-table>
- <a-radio-group
- v-model="obsSettings"
- v-if="observatoryEnable || burstObservatoryEnable"
- @change="changeObsCode"
- button-style="solid"