EditUploadFile.vue 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. <template>
  2. <edit-interaction-base
  3. v-bind="{ data, autocomplete, hide: hideBase }"
  4. @change="updateData"
  5. >
  6. <template v-if="hasFileAccess">
  7. <div class="mt-4 space-y-2">
  8. <div
  9. v-for="(path, index) in filePaths"
  10. :key="index"
  11. class="flex items-center group"
  12. >
  13. <ui-autocomplete
  14. :items="autocomplete"
  15. :trigger-char="['{{', '}}']"
  16. block
  17. class="mr-2"
  18. >
  19. <ui-input
  20. v-model="filePaths[index]"
  21. :placeholder="t('workflow.blocks.upload-file.filePath')"
  22. autocomplete="off"
  23. class="w-full"
  24. />
  25. </ui-autocomplete>
  26. <v-remixicon
  27. name="riDeleteBin7Line"
  28. class="invisible cursor-pointer group-hover:visible"
  29. @click="filePaths.splice(index, 1)"
  30. />
  31. </div>
  32. </div>
  33. <ui-button variant="accent" class="mt-2" @click="filePaths.push('')">
  34. {{ t('workflow.blocks.upload-file.addFile') }}
  35. </ui-button>
  36. </template>
  37. <template v-else>
  38. <div class="mt-4 p-2 rounded-lg bg-red-200 flex items-start">
  39. <v-remixicon name="riErrorWarningLine" />
  40. <div class="ml-2 flex-1 leading-tight">
  41. <p>{{ t('workflow.blocks.upload-file.noFileAccess') }}</p>
  42. </div>
  43. </div>
  44. <a
  45. href="https://docs.automa.site/blocks/upload-file.html#requirements"
  46. target="_blank"
  47. rel="noopener"
  48. class="leading-tight inline-block text-primary mt-2"
  49. >
  50. {{ t('workflow.blocks.upload-file.requirement') }}
  51. </a>
  52. </template>
  53. </edit-interaction-base>
  54. </template>
  55. <script setup>
  56. import { useI18n } from 'vue-i18n';
  57. import { ref, watch } from 'vue';
  58. import EditInteractionBase from './EditInteractionBase.vue';
  59. const props = defineProps({
  60. data: {
  61. type: Object,
  62. default: () => ({}),
  63. },
  64. hideBase: {
  65. type: Boolean,
  66. default: false,
  67. },
  68. autocomplete: {
  69. type: Array,
  70. default: () => [],
  71. },
  72. });
  73. const emit = defineEmits(['update:data']);
  74. const { t } = useI18n();
  75. const filePaths = ref([...props.data.filePaths]);
  76. const hasFileAccess = ref(true);
  77. function updateData(value) {
  78. emit('update:data', { ...props.data, ...value });
  79. }
  80. chrome.extension.isAllowedFileSchemeAccess((value) => {
  81. hasFileAccess.value = value;
  82. });
  83. watch(
  84. filePaths,
  85. (paths) => {
  86. updateData({ filePaths: paths });
  87. },
  88. { deep: true }
  89. );
  90. </script>