EditJavascriptCode.vue 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. <template>
  2. <div class="mb-2 mt-4">
  3. <ui-textarea
  4. :model-value="data.description"
  5. autoresize
  6. :placeholder="t('common.description')"
  7. class="w-full mb-2"
  8. @change="updateData({ description: $event })"
  9. />
  10. <ui-input
  11. type="number"
  12. :model-value="data.timeout"
  13. class="mb-2 w-full"
  14. :placeholder="t('workflow.blocks.javascript-code.timeout.placeholder')"
  15. :title="t('workflow.blocks.javascript-code.timeout.title')"
  16. @change="updateData({ timeout: +$event })"
  17. />
  18. <prism-editor
  19. v-if="!state.showCodeModal"
  20. :model-value="data.code"
  21. :highlight="highlighter('javascript')"
  22. readonly
  23. class="p-4 max-h-80"
  24. @click="state.showCodeModal = true"
  25. />
  26. <ui-modal v-model="state.showCodeModal" content-class="max-w-3xl">
  27. <template #header>
  28. <ui-tabs v-model="state.activeTab" class="border-none">
  29. <ui-tab value="code">
  30. {{ t('workflow.blocks.javascript-code.modal.tabs.code') }}
  31. </ui-tab>
  32. <ui-tab value="preloadScript">
  33. {{ t('workflow.blocks.javascript-code.modal.tabs.preloadScript') }}
  34. </ui-tab>
  35. </ui-tabs>
  36. </template>
  37. <ui-tab-panels
  38. v-model="state.activeTab"
  39. class="overflow-auto"
  40. style="height: calc(100vh - 9rem)"
  41. >
  42. <ui-tab-panel value="code" class="h-full">
  43. <prism-editor
  44. v-model="state.code"
  45. :highlight="highlighter('javascript')"
  46. line-numbers
  47. class="py-4 overflow-auto"
  48. style="height: 87%"
  49. />
  50. <p class="mt-1">
  51. {{ t('workflow.blocks.javascript-code.availabeFuncs') }}
  52. </p>
  53. <p class="space-x-1">
  54. <a
  55. v-for="func in availableFuncs"
  56. :key="func.id"
  57. :href="`https://github.com/Kholid060/automa/wiki/Blocks#${func.id}`"
  58. target="_blank"
  59. rel="noopener"
  60. class="inline-block"
  61. >
  62. <code>
  63. {{ func.name }}
  64. </code>
  65. </a>
  66. </p>
  67. </ui-tab-panel>
  68. <ui-tab-panel value="preloadScript">
  69. <div
  70. v-for="(script, index) in state.preloadScripts"
  71. :key="index"
  72. class="flex items-center mt-4"
  73. >
  74. <v-remixicon
  75. name="riDeleteBin7Line"
  76. class="mr-2 cursor-pointer"
  77. @click="state.preloadScripts.splice(index, 1)"
  78. />
  79. <ui-input
  80. v-model="state.preloadScripts[index].src"
  81. placeholder="http://example.com/script.js"
  82. class="flex-1 mr-4"
  83. />
  84. <ui-checkbox v-model="state.preloadScripts[index].removeAfterExec">
  85. {{ t('workflow.blocks.javascript-code.removeAfterExec') }}
  86. </ui-checkbox>
  87. </div>
  88. <ui-button variant="accent" class="w-20 mt-4" @click="addScript">
  89. {{ t('common.add') }}
  90. </ui-button>
  91. </ui-tab-panel>
  92. </ui-tab-panels>
  93. </ui-modal>
  94. </div>
  95. </template>
  96. <script setup>
  97. import { watch, reactive } from 'vue';
  98. import { useI18n } from 'vue-i18n';
  99. import { PrismEditor } from 'vue-prism-editor';
  100. import { highlighter } from '@/lib/prism';
  101. const props = defineProps({
  102. data: {
  103. type: Object,
  104. default: () => ({}),
  105. },
  106. });
  107. const emit = defineEmits(['update:data']);
  108. const { t } = useI18n();
  109. const availableFuncs = [
  110. { name: 'automaNextBlock(data)', id: 'automanextblockdata' },
  111. { name: 'automaRefData(keyword, path)', id: 'automarefdatakeyword-path' },
  112. { name: 'automaResetTimeout', id: 'automaresettimeout' },
  113. ];
  114. const state = reactive({
  115. activeTab: 'code',
  116. code: `${props.data.code}`,
  117. preloadScripts: [...(props.data.preloadScripts || [])],
  118. showCodeModal: false,
  119. });
  120. function updateData(value) {
  121. emit('update:data', { ...props.data, ...value });
  122. }
  123. function addScript() {
  124. state.preloadScripts.push({ src: '', removeAfterExec: true });
  125. }
  126. watch(
  127. () => state.code,
  128. (value) => {
  129. updateData({ code: value });
  130. }
  131. );
  132. watch(
  133. () => state.preloadScripts,
  134. (value) => {
  135. updateData({ preloadScripts: value });
  136. },
  137. { deep: true }
  138. );
  139. </script>
  140. <style scoped>
  141. code {
  142. @apply bg-gray-900 text-sm text-white p-1 rounded-md;
  143. }
  144. </style>