xray_reverse_modal.html 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. {{define "reverseModal"}}
  2. <a-modal id="reverse-modal" v-model="reverseModal.visible" :title="reverseModal.title" @ok="reverseModal.ok"
  3. :confirm-loading="reverseModal.confirmLoading" :closable="true" :mask-closable="false"
  4. :ok-text="reverseModal.okText" cancel-text='{{ i18n "close" }}' :class="themeSwitcher.currentTheme">
  5. <a-form layout="inline">
  6. <table width="100%" class="ant-table-tbody">
  7. <tr>
  8. <td>{{ i18n "pages.xray.outbound.type" }}</td>
  9. <td>
  10. <a-form-item>
  11. <a-select v-model="reverseModal.reverse.type" style="width: 250px;" :dropdown-class-name="themeSwitcher.currentTheme">
  12. <a-select-option v-for="x,y in reverseTypes" :value="y">[[ x ]]</a-select-option>
  13. </a-select>
  14. </a-form-item>
  15. </td>
  16. </tr>
  17. <tr>
  18. <td>{{ i18n "pages.xray.outbound.tag" }}</td>
  19. <td>
  20. <a-form-item>
  21. <a-input v-model.trim="reverseModal.reverse.tag" style="width: 250px"></a-input>
  22. </a-form-item>
  23. </td>
  24. </tr>
  25. <tr>
  26. <td>{{ i18n "pages.xray.outbound.domain" }}</td>
  27. <td>
  28. <a-form-item>
  29. <a-input v-model.trim="reverseModal.reverse.domain" style="width: 250px"></a-input>
  30. </a-form-item>
  31. </td>
  32. </tr>
  33. <template v-if="reverseModal.reverse.type=='bridge'">
  34. <tr>
  35. <td>{{ i18n "pages.xray.outbound.intercon" }}</td>
  36. <td>
  37. <a-form-item>
  38. <a-select v-model="reverseModal.rules[0].outboundTag" style="width: 250px;" :dropdown-class-name="themeSwitcher.currentTheme">
  39. <a-select-option v-for="x in reverseModal.outboundTags" :value="x">[[ x ]]</a-select-option>
  40. </a-select>
  41. </a-form-item>
  42. </td>
  43. </tr>
  44. <tr>
  45. <td>{{ i18n "pages.xray.rules.outbound" }}</td>
  46. <td>
  47. <a-form-item>
  48. <a-select v-model="reverseModal.rules[1].outboundTag" style="width: 250px;" :dropdown-class-name="themeSwitcher.currentTheme">
  49. <a-select-option v-for="x in reverseModal.outboundTags" :value="x">[[ x ]]</a-select-option>
  50. </a-select>
  51. </a-form-item>
  52. </td>
  53. </tr>
  54. </template>
  55. <template v-else>
  56. <tr>
  57. <td>{{ i18n "pages.xray.outbound.intercon" }}</td>
  58. <td>
  59. <a-form-item>
  60. <a-checkbox-group
  61. v-model="reverseModal.rules[0].inboundTag"
  62. :options="reverseModal.inboundTags"></a-checkbox-group>
  63. </a-form-item>
  64. </td>
  65. </tr>
  66. <tr>
  67. <td>{{ i18n "pages.xray.rules.inbound" }}</td>
  68. <td>
  69. <a-form-item>
  70. <a-checkbox-group
  71. v-model="reverseModal.rules[1].inboundTag"
  72. :options="reverseModal.inboundTags"></a-checkbox-group>
  73. </a-form-item>
  74. </td>
  75. </tr>
  76. </template>
  77. </table>
  78. </a-form>
  79. </a-modal>
  80. <script>
  81. const reverseModal = {
  82. title: '',
  83. visible: false,
  84. confirmLoading: false,
  85. okText: '{{ i18n "sure" }}',
  86. isEdit: false,
  87. confirm: null,
  88. reverse: {
  89. tag: "",
  90. type: "",
  91. domain: ""
  92. },
  93. rules: [
  94. { outboundTag: '', inboundTag: []},
  95. { outboundTag: '', inboundTag: []}
  96. ],
  97. inboundTags: [],
  98. outboundTags: [],
  99. ok() {
  100. reverseModal.rules[0].domain = ["full:" + reverseModal.reverse.domain];
  101. reverseModal.rules[0].type = 'field';
  102. reverseModal.rules[1].type = 'field';
  103. if(reverseModal.reverse.type == 'bridge'){
  104. reverseModal.rules[0].inboundTag = [reverseModal.reverse.tag];
  105. reverseModal.rules[1].inboundTag = [reverseModal.reverse.tag];
  106. } else {
  107. reverseModal.rules[0].outboundTag = reverseModal.reverse.tag;
  108. reverseModal.rules[1].outboundTag = reverseModal.reverse.tag;
  109. }
  110. ObjectUtil.execute(reverseModal.confirm, reverseModal.reverse, reverseModal.rules);
  111. },
  112. show({ title='', okText='{{ i18n "sure" }}', reverse, rules, confirm=(reverse, rules)=>{}, isEdit=false }) {
  113. this.title = title;
  114. this.okText = okText;
  115. this.confirm = confirm;
  116. this.visible = true;
  117. if(isEdit) {
  118. this.reverse = {
  119. tag: reverse.tag,
  120. type: reverse.type,
  121. domain: reverse.domain,
  122. };
  123. reverse;
  124. rules0 = rules.filter(r => r.domain != null);
  125. if(rules0.length == 0) rules0 = [{ outboundTag: '', domain: ["full:" + this.reverse.domain], inboundTag: []}];
  126. rules1 = rules.filter(r => r.domain == null);
  127. if(rules1.length == 0) rules1 = [{ outboundTag: '', inboundTag: []}];
  128. this.rules = [];
  129. this.rules.push({
  130. domain: rules0[0].domain,
  131. outboundTag: rules0[0].outboundTag,
  132. inboundTag: rules0.map(r => r.inboundTag).flat()
  133. });
  134. this.rules.push({
  135. outboundTag: rules1[0].outboundTag,
  136. inboundTag: rules1.map(r => r.inboundTag).flat()
  137. });
  138. } else {
  139. this.reverse = {
  140. tag: "reverse-" + app.reverseData.length,
  141. type: "bridge",
  142. domain: "reverse.xui"
  143. }
  144. this.rules = [
  145. { outboundTag: '', inboundTag: []},
  146. { outboundTag: '', inboundTag: []}
  147. ]
  148. }
  149. this.isEdit = isEdit;
  150. this.inboundTags = app.templateSettings.inbounds.filter((i) => !ObjectUtil.isEmpty(i.tag)).map(obj => obj.tag);
  151. this.inboundTags.push(...app.inboundTags);
  152. this.outboundTags = app.templateSettings.outbounds.filter((o) => !ObjectUtil.isEmpty(o.tag)).map(obj => obj.tag);
  153. },
  154. close() {
  155. reverseModal.visible = false;
  156. reverseModal.loading(false);
  157. },
  158. loading(loading) {
  159. reverseModal.confirmLoading = loading;
  160. },
  161. };
  162. new Vue({
  163. delimiters: ['[[', ']]'],
  164. el: '#reverse-modal',
  165. data: {
  166. reverseModal: reverseModal,
  167. reverseTypes: { bridge: '{{ i18n "pages.xray.outbound.bridge" }}', portal:'{{ i18n "pages.xray.outbound.portal" }}'},
  168. },
  169. methods: {
  170. }
  171. });
  172. </script>
  173. {{end}}