1
0

xray_reverse_modal.html 6.6 KB

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