DomainEdit.vue 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. <template>
  2. <div>
  3. <a-card :bordered="false">
  4. <template v-slot:title>
  5. <span style="margin-right: 10px">{{ $gettextInterpolate($gettext('Edit %{n}'), {n: name}) }}</span>
  6. <a-tag color="blue" v-if="enabled">
  7. {{ $gettext('Enabled') }}
  8. </a-tag>
  9. <a-tag color="orange" v-else>
  10. {{ $gettext('Disabled') }}
  11. </a-tag>
  12. </template>
  13. <template v-slot:extra>
  14. <a-switch size="small" v-model="advance_mode" @change="on_mode_change"/>
  15. <template v-if="advance_mode">
  16. {{ $gettext('Advance Mode') }}
  17. </template>
  18. <template v-else>
  19. {{ $gettext('Basic Mode') }}
  20. </template>
  21. </template>
  22. <transition name="slide-fade">
  23. <div v-if="advance_mode" key="advance">
  24. <vue-itextarea v-model="configText"/>
  25. </div>
  26. <div class="domain-edit-container" key="basic" v-else>
  27. <a-form-item :label="$gettext('Enabled')">
  28. <a-switch v-model="enabled" @change="checked=>{checked?enable():disable()}"/>
  29. </a-form-item>
  30. <ngx-config-editor
  31. ref="ngx_config"
  32. :ngx_config="ngx_config"
  33. v-model="auto_cert"
  34. :enabled="enabled"
  35. />
  36. </div>
  37. </transition>
  38. </a-card>
  39. <footer-tool-bar>
  40. <a-space>
  41. <a-button @click="$router.go(-1)">
  42. <translate>Back</translate>
  43. </a-button>
  44. <a-button type="primary" @click="save" :loading="saving">
  45. <translate>Save</translate>
  46. </a-button>
  47. </a-space>
  48. </footer-tool-bar>
  49. </div>
  50. </template>
  51. <script>
  52. import FooterToolBar from '@/components/FooterToolbar/FooterToolBar'
  53. import VueItextarea from '@/components/VueItextarea/VueItextarea'
  54. import {$gettext, $interpolate} from '@/lib/translate/gettext'
  55. import NgxConfigEditor from '@/views/domain/ngx_conf/NgxConfigEditor'
  56. export default {
  57. name: 'DomainEdit',
  58. components: {NgxConfigEditor, FooterToolBar, VueItextarea},
  59. data() {
  60. return {
  61. name: this.$route.params.name.toString(),
  62. update: 0,
  63. ngx_config: {
  64. filename: '',
  65. upstreams: [],
  66. servers: []
  67. },
  68. auto_cert: false,
  69. current_server_index: 0,
  70. enabled: false,
  71. configText: '',
  72. ws: null,
  73. ok: false,
  74. issuing_cert: false,
  75. advance_mode: false,
  76. saving: false
  77. }
  78. },
  79. watch: {
  80. '$route'() {
  81. this.init()
  82. },
  83. },
  84. created() {
  85. this.init()
  86. },
  87. destroyed() {
  88. if (this.ws !== null) {
  89. this.ws.close()
  90. }
  91. },
  92. methods: {
  93. init() {
  94. if (this.name) {
  95. this.$api.domain.get(this.name).then(r => {
  96. this.configText = r.config
  97. this.enabled = r.enabled
  98. this.ngx_config = r.tokenized
  99. this.auto_cert = r.auto_cert
  100. }).catch(r => {
  101. this.$message.error(r.message ?? $gettext('Server error'))
  102. })
  103. }
  104. },
  105. on_mode_change(advance_mode) {
  106. if (advance_mode) {
  107. this.build_config()
  108. } else {
  109. return this.$api.ngx.tokenize_config(this.configText).then(r => {
  110. this.ngx_config = r
  111. }).catch(r => {
  112. this.$message.error(r.message ?? $gettext('Server error'))
  113. })
  114. }
  115. },
  116. build_config() {
  117. return this.$api.ngx.build_config(this.ngx_config).then(r => {
  118. this.configText = r.content
  119. }).catch(r => {
  120. this.$message.error(r.message ?? $gettext('Server error'))
  121. })
  122. },
  123. async save() {
  124. this.saving = true
  125. if (!this.advance_mode) {
  126. await this.build_config()
  127. }
  128. this.$api.domain.save(this.name, {content: this.configText}).then(r => {
  129. this.configText = r.config
  130. this.enabled = r.enabled
  131. this.ngx_config = r.tokenized
  132. this.$message.success($gettext('Saved successfully'))
  133. this.$refs.ngx_config.update_cert_info()
  134. }).catch(r => {
  135. this.$message.error($interpolate($gettext('Save error %{msg}'), {msg: r.message ?? ''}), 10)
  136. }).finally(() => {
  137. this.saving = false
  138. })
  139. },
  140. enable() {
  141. this.$api.domain.enable(this.name).then(() => {
  142. this.$message.success($gettext('Enabled successfully'))
  143. this.enabled = true
  144. }).catch(r => {
  145. this.$message.error($interpolate($gettext('Failed to enable %{msg}'), {msg: r.message ?? ''}), 10)
  146. })
  147. },
  148. disable() {
  149. this.$api.domain.disable(this.name).then(() => {
  150. this.$message.success($gettext('Disabled successfully'))
  151. this.enabled = false
  152. }).catch(r => {
  153. this.$message.error($interpolate($gettext('Failed to disable %{msg}'), {msg: r.message ?? ''}))
  154. })
  155. }
  156. },
  157. computed: {
  158. is_demo() {
  159. return this.$store.getters.env.demo === true
  160. }
  161. }
  162. }
  163. </script>
  164. <style lang="less">
  165. </style>
  166. <style lang="less" scoped>
  167. .ant-card {
  168. margin: 10px 0;
  169. box-shadow: unset;
  170. }
  171. .domain-edit-container {
  172. max-width: 800px;
  173. margin: 0 auto;
  174. /deep/ .ant-form-item-label > label::after {
  175. content: none;
  176. }
  177. }
  178. .slide-fade-enter-active {
  179. transition: all .5s ease-in-out;
  180. }
  181. .slide-fade-leave-active {
  182. transition: all .5s cubic-bezier(1.0, 0.5, 0.8, 1.0);
  183. }
  184. .slide-fade-enter, .slide-fade-leave-to
  185. /* .slide-fade-leave-active for below version 2.1.8 */ {
  186. transform: translateX(10px);
  187. opacity: 0;
  188. }
  189. .location-block {
  190. }
  191. .directive-params-wrapper {
  192. margin: 10px 0;
  193. }
  194. .tab-content {
  195. padding: 10px;
  196. }
  197. </style>