DirectiveEditor.vue 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. <script setup lang="ts">
  2. import CodeEditor from '@/components/CodeEditor'
  3. import {If} from '@/views/domain/ngx_conf'
  4. import DirectiveAdd from '@/views/domain/ngx_conf/directive/DirectiveAdd'
  5. import {useGettext} from 'vue3-gettext'
  6. import {reactive, ref} from 'vue'
  7. import {DeleteOutlined, HolderOutlined} from '@ant-design/icons-vue'
  8. import draggable from 'vuedraggable'
  9. const {$gettext} = useGettext()
  10. const props = defineProps<{
  11. ngx_directives: any[]
  12. }>()
  13. const adding = ref(false)
  14. let directive = reactive({})
  15. const current_idx = ref(-1)
  16. function add() {
  17. adding.value = true
  18. directive = reactive({})
  19. }
  20. function save() {
  21. adding.value = false
  22. props.ngx_directives.push(directive)
  23. }
  24. function remove(index: number) {
  25. props.ngx_directives.splice(index, 1)
  26. }
  27. function onSave(idx: number) {
  28. setTimeout(() => {
  29. current_idx.value = idx + 1
  30. }, 50)
  31. }
  32. </script>
  33. <template>
  34. <h2>{{ $gettext('Directives') }}</h2>
  35. <draggable
  36. :list="props.ngx_directives"
  37. item-key="name"
  38. class="list-group"
  39. ghost-class="ghost"
  40. handle=".ant-input-group-addon"
  41. >
  42. <template #item="{ element: directive, index }">
  43. <a-form-item @click="current_idx=index">
  44. <div class="input-wrapper">
  45. <code-editor v-if="directive.directive === If" v-model:content="directive.params"
  46. defaultHeight="100px" style="width: 100%;"/>
  47. <a-input v-else
  48. v-model:value="directive.params" @click="current_idx=index" @blur="current_idx=-1">
  49. <template #addonBefore>
  50. <HolderOutlined/>
  51. {{ directive.directive }}
  52. </template>
  53. </a-input>
  54. <a-popconfirm @confirm="remove(index)"
  55. :title="$gettext('Are you sure you want to remove this directive?')"
  56. :ok-text="$gettext('Yes')"
  57. :cancel-text="$gettext('No')">
  58. <a-button>
  59. <template #icon>
  60. <DeleteOutlined style="font-size: 14px;"/>
  61. </template>
  62. </a-button>
  63. </a-popconfirm>
  64. </div>
  65. <transition name="slide">
  66. <div v-if="current_idx===index" class="directive-editor-extra">
  67. <div class="extra-content">
  68. <a-form layout="vertical">
  69. <a-form-item :label="$gettext('Comments')">
  70. <a-textarea v-model:value="directive.comments"/>
  71. </a-form-item>
  72. </a-form>
  73. </div>
  74. </div>
  75. </transition>
  76. </a-form-item>
  77. </template>
  78. </draggable>
  79. <directive-add :ngx_directives="props.ngx_directives"/>
  80. </template>
  81. <style lang="less" scoped>
  82. .directive-editor-extra {
  83. background-color: #fafafa;
  84. padding: 10px 20px;
  85. margin-bottom: 10px;
  86. }
  87. .slide-enter-active, .slide-leave-active {
  88. transition: max-height .2s ease;
  89. overflow: hidden;
  90. }
  91. .slide-enter-from, .slide-leave-to {
  92. max-height: 0;
  93. }
  94. .slide-enter-to, .slide-leave-from {
  95. max-height: 600px;
  96. }
  97. .input-wrapper {
  98. display: flex;
  99. gap: 10px;
  100. align-items: center;
  101. }
  102. </style>