WorkflowEditBlock.vue 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. <template>
  2. <div class="px-4 overflow-auto scroll pb-1">
  3. <div class="sticky top-0 z-20 bg-white border-b border-gray-100 pb-4 mb-4">
  4. <button class="mr-2 align-middle" @click="$emit('close')">
  5. <v-remixicon name="riArrowLeftLine" />
  6. </button>
  7. <p class="font-semibold inline-block align-middle">
  8. {{ t(`workflow.blocks.${data.id}.name`) }}
  9. </p>
  10. </div>
  11. <component
  12. :is="data.editComponent"
  13. v-if="blockData"
  14. :key="data.blockId"
  15. v-model:data="blockData"
  16. :block-id="data.blockId"
  17. />
  18. </div>
  19. </template>
  20. <script>
  21. import { computed } from 'vue';
  22. import { useI18n } from 'vue-i18n';
  23. const editComponents = require.context(
  24. './edit',
  25. false,
  26. /^(?:.*\/)?Edit[^/]*\.vue$/
  27. );
  28. /* eslint-disable-next-line */
  29. const components = editComponents.keys().reduce((acc, key) => {
  30. const name = key.replace(/(.\/)|\.vue$/g, '');
  31. const componentObj = editComponents(key)?.default ?? {};
  32. acc[name] = componentObj;
  33. return acc;
  34. }, {});
  35. export default {
  36. components,
  37. props: {
  38. data: {
  39. type: Object,
  40. default: () => ({}),
  41. },
  42. },
  43. emits: ['close', 'update'],
  44. setup(props, { emit }) {
  45. const { t } = useI18n();
  46. const blockData = computed({
  47. get() {
  48. return props.data.data || {};
  49. },
  50. set(value) {
  51. emit('update', value);
  52. },
  53. });
  54. return {
  55. t,
  56. blockData,
  57. };
  58. },
  59. };
  60. </script>