xray_balancer_modal.html 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. {{define "balancerModal"}}
  2. <a-modal
  3. id="balancer-modal"
  4. v-model="balancerModal.visible"
  5. :title="balancerModal.title"
  6. @ok="balancerModal.ok"
  7. :confirm-loading="balancerModal.confirmLoading"
  8. :ok-button-props="{ props: { disabled: !balancerModal.isValid } }"
  9. :closable="true"
  10. :mask-closable="false"
  11. :ok-text="balancerModal.okText"
  12. cancel-text='{{ i18n "close" }}'
  13. :class="themeSwitcher.currentTheme">
  14. <a-form :colon="false" :label-col="{ md: {span:6} }" :wrapper-col="{ md: {span:14} }">
  15. <a-form-item label='{{ i18n "pages.xray.balancer.tag" }}' has-feedback
  16. :validate-status="balancerModal.duplicateTag? 'warning' : 'success'">
  17. <a-input v-model.trim="balancerModal.balancer.tag" @change="balancerModal.check()"
  18. placeholder='{{ i18n "balancerModal.balancer.tagDesc" }}'></a-input>
  19. </a-form-item>
  20. <a-form-item label='{{ i18n "pages.xray.balancer.balancerStrategy" }}'>
  21. <a-select v-model="balancerModal.balancer.strategy" :dropdown-class-name="themeSwitcher.currentTheme">
  22. <a-select-option value="random">Random</a-select-option>
  23. <a-select-option value="roundRobin">Round Robin</a-select-option>
  24. </a-select>
  25. </a-form-item>
  26. <a-form-item label='{{ i18n "pages.xray.balancer.balancerSelectors" }}' has-feedback :validate-status="balancerModal.emptySelector? 'warning' : 'success'">
  27. <a-select v-model="balancerModal.balancer.selector" mode="tags" @change="balancerModal.checkSelector()"
  28. :dropdown-class-name="themeSwitcher.currentTheme">
  29. <a-select-option v-for="tag in balancerModal.outboundTags" :value="tag">[[ tag ]]</a-select-option>
  30. </a-select>
  31. </a-form-item>
  32. </table>
  33. </a-form>
  34. </a-modal>
  35. <script>
  36. const balancerModal = {
  37. title: '',
  38. visible: false,
  39. confirmLoading: false,
  40. okText: '{{ i18n "sure" }}',
  41. isEdit: false,
  42. confirm: null,
  43. duplicateTag: false,
  44. emptySelector: false,
  45. balancer: {
  46. tag: '',
  47. strategy: 'random',
  48. selector: []
  49. },
  50. outboundTags: [],
  51. balancerTags:[],
  52. ok() {
  53. if (balancerModal.balancer.selector.length == 0) {
  54. balancerModal.emptySelector = true;
  55. return;
  56. }
  57. balancerModal.emptySelector = false;
  58. ObjectUtil.execute(balancerModal.confirm, balancerModal.balancer);
  59. },
  60. show({ title = '', okText = '{{ i18n "sure" }}', balancerTags = [], balancer, confirm = (balancer) => { }, isEdit = false }) {
  61. this.title = title;
  62. this.okText = okText;
  63. this.confirm = confirm;
  64. this.visible = true;
  65. if (isEdit) {
  66. balancerModal.balancer = balancer;
  67. } else {
  68. balancerModal.balancer = {
  69. tag: '',
  70. strategy: 'random',
  71. selector: []
  72. };
  73. }
  74. this.balancerTags = balancerTags.filter((tag) => tag != balancer.tag);
  75. this.outboundTags = app.templateSettings.outbounds.filter((o) => !ObjectUtil.isEmpty(o.tag)).map(obj => obj.tag);
  76. this.isEdit = isEdit;
  77. this.check()
  78. },
  79. close() {
  80. balancerModal.visible = false;
  81. balancerModal.loading(false);
  82. },
  83. loading(loading) {
  84. balancerModal.confirmLoading = loading;
  85. },
  86. check() {
  87. if (balancerModal.balancer.tag == '' || balancerModal.balancerTags.includes(balancerModal.balancer.tag)) {
  88. this.duplicateTag = true;
  89. this.isValid = false;
  90. } else {
  91. this.duplicateTag = false;
  92. this.isValid = true;
  93. }
  94. },
  95. checkSelector() {
  96. balancerModal.emptySelector = balancerModal.balancer.selector.length == 0;
  97. }
  98. };
  99. new Vue({
  100. delimiters: ['[[', ']]'],
  101. el: '#balancer-modal',
  102. data: {
  103. balancerModal: balancerModal
  104. },
  105. methods: {
  106. }
  107. });
  108. </script>
  109. {{end}}