{{define "qrcodeModal"}} <a-modal id="qrcode-modal" v-model="qrModal.visible" :title="qrModal.title" :closable="true" :class="themeSwitcher.darkCardClass" :footer="null" width="300px"> <a-tag color="green" style="margin-bottom: 10px;display: block;text-align: center;"> {{ i18n "pages.inbounds.clickOnQRcode" }} </a-tag> <template v-if="app.subSettings.enable && qrModal.subId"> <a-divider>Subscription</a-divider> <canvas @click="copyToClipboard('qrCode-sub',genSubLink(qrModal.client.subId))" id="qrCode-sub" style="width: 100%; height: 100%;"></canvas> </template> <a-divider>{{ i18n "pages.inbounds.client" }}</a-divider> <template v-for="(row, index) in qrModal.qrcodes"> <a-tag color="orange" style="margin-top: 10px;display: block;text-align: center;">[[ row.remark ]]</a-tag> <canvas @click="copyToClipboard('qrCode-'+index, row.link)" :id="'qrCode-'+index" style="width: 100%; height: 100%;"></canvas> </template> </a-modal> <script> const qrModal = { title: '', clientIndex: 0, inbound: new Inbound(), dbInbound: new DBInbound(), client: null, qrcodes: [], clipboard: null, visible: false, subId: '', show: function (title = '', dbInbound = new DBInbound(), clientIndex = 0) { this.title = title; this.clientIndex = clientIndex; this.dbInbound = dbInbound; this.inbound = dbInbound.toInbound(); settings = JSON.parse(this.inbound.settings); this.client = settings.clients[clientIndex]; remark = this.dbInbound.remark + "-" + this.client.email; address = this.dbInbound.address; this.qrcodes = []; if (this.inbound.tls && !ObjectUtil.isArrEmpty(this.inbound.stream.tls.settings.domains)) { this.inbound.stream.tls.settings.domains.forEach((domain) => { this.qrcodes.push({ remark: remark + "-" + domain.remark, link: this.inbound.genLink(domain.domain, remark + "-" + domain.remark, clientIndex) }); }); } else { this.qrcodes.push({ remark: remark, link: this.inbound.genLink(address, remark, clientIndex) }); } this.visible = true; }, close: function () { this.visible = false; }, }; const qrModalApp = new Vue({ delimiters: ['[[', ']]'], el: '#qrcode-modal', data: { qrModal: qrModal, }, methods: { copyToClipboard(elmentId,content) { this.qrModal.clipboard = new ClipboardJS('#'+elmentId, { text: () => content, }); this.qrModal.clipboard.on('success', () => { app.$message.success('{{ i18n "copied" }}') this.qrModal.clipboard.destroy(); }); }, setQrCode(elmentId,content) { new QRious({ element: document.querySelector('#'+elmentId), size: 260, value: content, }); }, genSubLink(subID) { protocol = app.subSettings.tls ? "https://" : "http://"; hostName = app.subSettings.domain === "" ? window.location.hostname : app.subSettings.domain; subPort = app.subSettings.port; port = (subPort === 443 && app.subSettings.tls) || (subPort === 80 && !app.subSettings.tls) ? "" : ":" + String(subPort); subPath = app.subSettings.path; return protocol + hostName + port + subPath + subID; } }, updated() { if (qrModal.client.subId){ qrModal.subId = qrModal.client.subId; this.setQrCode("qrCode-sub",this.genSubLink(this.subId)); } qrModal.qrcodes.forEach((element,index) => { this.setQrCode("qrCode-"+index, element.link); }); } }); </script> {{end}}