浏览代码

feat: sortable workflow parameters

Ahmad Kholid 2 年之前
父节点
当前提交
9862eb39a9
共有 1 个文件被更改,包括 72 次插入63 次删除
  1. 72 63
      src/components/newtab/workflow/edit/EditWorkflowParameters.vue

+ 72 - 63
src/components/newtab/workflow/edit/EditWorkflowParameters.vue

@@ -10,66 +10,69 @@
       No parameters
       No parameters
     </p>
     </p>
     <table v-else class="w-full">
     <table v-else class="w-full">
-      <thead>
-        <tr class="text-sm text-left">
-          <th>Name</th>
-          <th>Type</th>
-          <th>Placeholder</th>
-          <th>Default Value</th>
-          <th></th>
-        </tr>
-      </thead>
-      <tbody>
-        <template v-for="(param, index) in state.parameters" :key="index">
-          <tr class="align-top">
-            <td>
-              <ui-input
-                :model-value="param.name"
-                placeholder="Parameter name"
-                @change="updateParam(index, $event)"
-              />
-            </td>
-            <td>
-              <ui-select
-                :model-value="param.type"
-                @change="updateParamType(index, $event)"
-              >
-                <option
-                  v-for="type in paramTypesArr"
-                  :key="type.id"
-                  :value="type.id"
+      <div class="text-sm grid grid-cols-12 space-x-2">
+        <div class="col-span-3" style="padding-left: 30px">Name</div>
+        <div class="col-span-2">Type</div>
+        <div class="col-span-3">Placeholder</div>
+        <div class="col-span-4">Default Value</div>
+      </div>
+      <draggable v-model="state.parameters" tag="div" handle=".handle">
+        <template #item="{ element: param, index }">
+          <div class="mb-4">
+            <div class="grid grid-cols-12 space-x-2">
+              <div class="col-span-3 flex items-center">
+                <v-remixicon name="mdiDrag" class="handle mr-2 cursor-move" />
+                <ui-input
+                  :model-value="param.name"
+                  placeholder="Parameter name"
+                  @change="updateParam(index, $event)"
+                />
+              </div>
+              <div class="col-span-2">
+                <ui-select
+                  :model-value="param.type"
+                  @change="updateParamType(index, $event)"
+                >
+                  <option
+                    v-for="type in paramTypesArr"
+                    :key="type.id"
+                    :value="type.id"
+                  >
+                    {{ type.name }}
+                  </option>
+                </ui-select>
+              </div>
+              <div class="col-span-3">
+                <ui-input
+                  v-model="param.placeholder"
+                  placeholder="A parameter"
+                />
+              </div>
+              <div class="col-span-4 flex items-center">
+                <component
+                  :is="paramTypes[param.type].valueComp"
+                  v-if="paramTypes[param.type].valueComp"
+                  v-model="param.defaultValue"
+                  :param-data="param"
+                  :editor="true"
+                  max-width="250px"
+                />
+                <ui-input
+                  v-else
+                  v-model="param.defaultValue"
+                  :type="param.type === 'number' ? 'number' : 'text'"
+                  placeholder="NULL"
+                />
+                <ui-button
+                  icon
+                  class="ml-2"
+                  @click="state.parameters.splice(index, 1)"
                 >
                 >
-                  {{ type.name }}
-                </option>
-              </ui-select>
-            </td>
-            <td>
-              <ui-input v-model="param.placeholder" placeholder="A parameter" />
-            </td>
-            <td>
-              <component
-                :is="paramTypes[param.type].valueComp"
-                v-if="paramTypes[param.type].valueComp"
-                v-model="param.defaultValue"
-                :param-data="param"
-                :editor="true"
-                max-width="250px"
-              />
-              <ui-input
-                v-else
-                v-model="param.defaultValue"
-                :type="param.type === 'number' ? 'number' : 'text'"
-                placeholder="NULL"
-              />
-            </td>
-            <td>
-              <ui-button icon @click="state.parameters.splice(index, 1)">
-                <v-remixicon name="riDeleteBin7Line" />
-              </ui-button>
-            </td>
-          </tr>
-          <tr>
-            <td colspan="999" style="padding-top: 0">
+                  <v-remixicon name="riDeleteBin7Line" />
+                </ui-button>
+              </div>
+            </div>
+            <div class="w-full">
               <ui-expand
               <ui-expand
                 hide-header-icon
                 hide-header-icon
                 header-class="flex items-center focus:ring-0 w-full"
                 header-class="flex items-center focus:ring-0 w-full"
@@ -98,10 +101,10 @@
                   />
                   />
                 </div>
                 </div>
               </ui-expand>
               </ui-expand>
-            </td>
-          </tr>
+            </div>
+          </div>
         </template>
         </template>
-      </tbody>
+      </draggable>
     </table>
     </table>
   </div>
   </div>
   <ui-button variant="accent" class="mt-4" @click="addParameter">
   <ui-button variant="accent" class="mt-4" @click="addParameter">
@@ -110,8 +113,10 @@
 </template>
 </template>
 <script setup>
 <script setup>
 import { reactive, watch } from 'vue';
 import { reactive, watch } from 'vue';
+import { nanoid } from 'nanoid/non-secure';
 import cloneDeep from 'lodash.clonedeep';
 import cloneDeep from 'lodash.clonedeep';
 import * as workflowParameters from '@business/parameters';
 import * as workflowParameters from '@business/parameters';
+import Draggable from 'vuedraggable';
 import ParameterInputValue from './Parameter/ParameterInputValue.vue';
 import ParameterInputValue from './Parameter/ParameterInputValue.vue';
 import ParameterInputOptions from './Parameter/ParameterInputOptions.vue';
 import ParameterInputOptions from './Parameter/ParameterInputOptions.vue';
 
 
@@ -144,7 +149,11 @@ const paramTypes = {
 const paramTypesArr = Object.values(paramTypes).filter((item) => item.id);
 const paramTypesArr = Object.values(paramTypes).filter((item) => item.id);
 
 
 const state = reactive({
 const state = reactive({
-  parameters: cloneDeep(props.data || []),
+  parameters: cloneDeep(props.data || []).map((item) => {
+    item.id = nanoid(4);
+
+    return item;
+  }),
 });
 });
 
 
 function addParameter() {
 function addParameter() {