DirectiveEditorItem.vue 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. <script setup lang="ts">
  2. import CodeEditor from '@/components/CodeEditor'
  3. import {DeleteOutlined, HolderOutlined} from '@ant-design/icons-vue'
  4. import {useGettext} from 'vue3-gettext'
  5. import {onMounted, ref, watch} from 'vue'
  6. import config from '@/api/config'
  7. import {message} from 'ant-design-vue'
  8. const {$gettext, interpolate} = useGettext()
  9. const props = defineProps(['directive', 'current_idx', 'index', 'ngx_directives', 'readonly'])
  10. function remove(index: number) {
  11. props.ngx_directives.splice(index, 1)
  12. }
  13. const content = ref('')
  14. function init() {
  15. if (props.directive.directive === 'include')
  16. config.get(props.directive.params).then(r => {
  17. content.value = r.config
  18. })
  19. }
  20. onMounted(init)
  21. watch(props, init)
  22. function save() {
  23. config.save(props.directive.params, {content: content.value}).then(r => {
  24. content.value = r.config
  25. message.success($gettext('Saved successfully'))
  26. }).catch(r => {
  27. message.error(interpolate($gettext('Save error %{msg}'), {msg: r.message ?? ''}))
  28. })
  29. }
  30. </script>
  31. <template>
  32. <div class="dir-editor-item">
  33. <div class="input-wrapper">
  34. <div class="code-editor-wrapper" v-if="directive.directive === ''">
  35. <HolderOutlined style="padding: 5px"/>
  36. <code-editor v-model:content="directive.params"
  37. defaultHeight="100px" style="width: 100%;"/>
  38. </div>
  39. <a-input v-else
  40. v-model:value="directive.params" @click="current_idx=index">
  41. <template #addonBefore>
  42. <HolderOutlined/>
  43. {{ directive.directive }}
  44. </template>
  45. </a-input>
  46. <a-popconfirm v-if="!readonly"
  47. @confirm="remove(index)"
  48. :title="$gettext('Are you sure you want to remove this directive?')"
  49. :ok-text="$gettext('Yes')"
  50. :cancel-text="$gettext('No')">
  51. <a-button>
  52. <template #icon>
  53. <DeleteOutlined style="font-size: 14px;"/>
  54. </template>
  55. </a-button>
  56. </a-popconfirm>
  57. </div>
  58. <div v-if="current_idx===index" class="directive-editor-extra">
  59. <div class="extra-content">
  60. <a-form layout="vertical">
  61. <a-form-item :label="$gettext('Comments')">
  62. <a-textarea v-model:value="directive.comments"/>
  63. </a-form-item>
  64. <a-form-item :label="$gettext('Content')" v-if="directive.directive==='include'">
  65. <code-editor v-model:content="content"
  66. defaultHeight="200px" style="width: 100%;"/>
  67. <div class="save-btn">
  68. <a-button @click="save">{{ $gettext('Save') }}</a-button>
  69. </div>
  70. </a-form-item>
  71. </a-form>
  72. </div>
  73. </div>
  74. </div>
  75. </template>
  76. <style lang="less" scoped>
  77. .dir-editor-item {
  78. margin: 15px 0;
  79. }
  80. .code-editor-wrapper {
  81. display: flex;
  82. width: 100%;
  83. align-items: center;
  84. }
  85. .anticon-holder {
  86. cursor: grab;
  87. }
  88. .directive-editor-extra {
  89. background-color: #fafafa;
  90. padding: 10px 20px;
  91. margin-bottom: 10px;
  92. .save-btn {
  93. display: flex;
  94. justify-content: flex-end;
  95. margin-top: 15px;
  96. }
  97. }
  98. .input-wrapper {
  99. display: flex;
  100. gap: 10px;
  101. align-items: center;
  102. }
  103. </style>