|  | @@ -52,6 +52,7 @@
 | 
	
		
			
				|  |  |                          <div slot="title">
 | 
	
		
			
				|  |  |                              <a-button type="primary" icon="plus" @click="openAddInbound">{{ i18n "pages.inbounds.addInbound" }}</a-button>
 | 
	
		
			
				|  |  |                              <a-button type="primary" icon="export" @click="exportAllLinks">{{ i18n "pages.inbounds.export" }}</a-button>
 | 
	
		
			
				|  |  | +							<a-button type="primary" icon="reload" @click="resetAllTraffic">{{ i18n "pages.inbounds.resetAllTraffic" }}</a-button>
 | 
	
		
			
				|  |  |                          </div>
 | 
	
		
			
				|  |  |                          <a-input v-model.lazy="searchKey" placeholder="{{ i18n "search" }}" autofocus style="max-width: 300px"></a-input>
 | 
	
		
			
				|  |  |                          <a-table :columns="columns" :row-key="dbInbound => dbInbound.id"
 | 
	
	
		
			
				|  | @@ -95,6 +96,9 @@
 | 
	
		
			
				|  |  |                                          </template>
 | 
	
		
			
				|  |  |                                          <a-menu-item key="resetTraffic">
 | 
	
		
			
				|  |  |                                              <a-icon type="retweet"></a-icon> {{ i18n "pages.inbounds.resetTraffic" }}
 | 
	
		
			
				|  |  | +                                        </a-menu-item>
 | 
	
		
			
				|  |  | +										<a-menu-item key="clone">
 | 
	
		
			
				|  |  | +                                            <a-icon type="block"></a-icon> {{ i18n "pages.inbounds.Clone"}}
 | 
	
		
			
				|  |  |                                          </a-menu-item>
 | 
	
		
			
				|  |  |                                          <a-menu-item key="delete">
 | 
	
		
			
				|  |  |                                              <span style="color: #FF4D4F">
 | 
	
	
		
			
				|  | @@ -310,11 +314,47 @@
 | 
	
		
			
				|  |  |                          break;
 | 
	
		
			
				|  |  |                      case "resetTraffic":
 | 
	
		
			
				|  |  |                          this.resetTraffic(dbInbound.id);
 | 
	
		
			
				|  |  | +                        break;
 | 
	
		
			
				|  |  | +					case "clone":
 | 
	
		
			
				|  |  | +                        this.openCloneInbound(dbInbound);
 | 
	
		
			
				|  |  |                          break;
 | 
	
		
			
				|  |  |                      case "delete":
 | 
	
		
			
				|  |  |                          this.delInbound(dbInbound.id);
 | 
	
		
			
				|  |  |                          break;
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  | +            },
 | 
	
		
			
				|  |  | +			openCloneInbound(dbInbound) {
 | 
	
		
			
				|  |  | +                this.$confirm({
 | 
	
		
			
				|  |  | +                    title: '{{ i18n "pages.inbounds.cloneInbound"}} ' + dbInbound.remark,
 | 
	
		
			
				|  |  | +                    content: '{{ i18n "pages.inbounds.cloneInboundContent"}}',
 | 
	
		
			
				|  |  | +                    okText: '{{ i18n "pages.inbounds.cloneInboundOk"}}',
 | 
	
		
			
				|  |  | +                    cancelText: '{{ i18n "cancel" }}',
 | 
	
		
			
				|  |  | +                    onOk: () => {
 | 
	
		
			
				|  |  | +                        const baseInbound = dbInbound.toInbound();
 | 
	
		
			
				|  |  | +                        dbInbound.up = 0;
 | 
	
		
			
				|  |  | +                        dbInbound.down = 0;
 | 
	
		
			
				|  |  | +                        this.cloneInbound(baseInbound, dbInbound);
 | 
	
		
			
				|  |  | +                    },
 | 
	
		
			
				|  |  | +                });
 | 
	
		
			
				|  |  | +            },
 | 
	
		
			
				|  |  | +            async cloneInbound(baseInbound, dbInbound) {
 | 
	
		
			
				|  |  | +                const inbound = new Inbound();
 | 
	
		
			
				|  |  | +                const data = {
 | 
	
		
			
				|  |  | +                    up: dbInbound.up,
 | 
	
		
			
				|  |  | +                    down: dbInbound.down,
 | 
	
		
			
				|  |  | +                    total: dbInbound.total,
 | 
	
		
			
				|  |  | +                    remark: dbInbound.remark + " - Cloned",
 | 
	
		
			
				|  |  | +                    enable: dbInbound.enable,
 | 
	
		
			
				|  |  | +                    expiryTime: dbInbound.expiryTime,
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                    listen: inbound.listen,
 | 
	
		
			
				|  |  | +                    port: inbound.port,
 | 
	
		
			
				|  |  | +                    protocol: baseInbound.protocol,
 | 
	
		
			
				|  |  | +                    settings: inbound.settings.toString(),
 | 
	
		
			
				|  |  | +                    streamSettings: baseInbound.stream.toString(),
 | 
	
		
			
				|  |  | +                    sniffing: baseInbound.canSniffing() ? baseInbound.sniffing.toString() : '{}',
 | 
	
		
			
				|  |  | +                };
 | 
	
		
			
				|  |  | +                await this.submit('/xui/inbound/add', data, inModal);
 | 
	
		
			
				|  |  |              },
 | 
	
		
			
				|  |  |              openAddInbound() {
 | 
	
		
			
				|  |  |                  inModal.show({
 | 
	
	
		
			
				|  | @@ -461,6 +501,22 @@
 | 
	
		
			
				|  |  |                          this.updateInbound(inbound, dbInbound);
 | 
	
		
			
				|  |  |                      },
 | 
	
		
			
				|  |  |                  });
 | 
	
		
			
				|  |  | +            },
 | 
	
		
			
				|  |  | +			resetAllTraffic() {
 | 
	
		
			
				|  |  | +                    this.$confirm({
 | 
	
		
			
				|  |  | +                        title: '{{ i18n "pages.inbounds.resetAllTrafficTitle"}}',
 | 
	
		
			
				|  |  | +                        content: '{{ i18n "pages.inbounds.resetAllTrafficContent"}}',
 | 
	
		
			
				|  |  | +                        okText: '{{ i18n "pages.inbounds.resetAllTrafficOkText"}}',
 | 
	
		
			
				|  |  | +                        cancelText: '{{ i18n "pages.inbounds.resetAllTrafficCancelText"}}',
 | 
	
		
			
				|  |  | +                        onOk: async () => {
 | 
	
		
			
				|  |  | +                            for (const dbInbound of this.dbInbounds) {
 | 
	
		
			
				|  |  | +                                const inbound = dbInbound.toInbound();
 | 
	
		
			
				|  |  | +                                dbInbound.up = 0;
 | 
	
		
			
				|  |  | +                                dbInbound.down = 0;
 | 
	
		
			
				|  |  | +                                this.updateInbound(inbound, dbInbound);
 | 
	
		
			
				|  |  | +                            }
 | 
	
		
			
				|  |  | +                        },
 | 
	
		
			
				|  |  | +                    });
 | 
	
		
			
				|  |  |              },
 | 
	
		
			
				|  |  |              delInbound(dbInboundId) {
 | 
	
		
			
				|  |  |                  this.$confirm({
 |