folderTreeModal.vue 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. <template>
  2. <BasicModal
  3. v-bind="$attrs"
  4. @register="register"
  5. :title="t('routes.scenes.moveScene')"
  6. width="600px"
  7. :minHeight="400"
  8. :centered="true"
  9. @ok="handleSubmit"
  10. @cancel="handleCancel"
  11. >
  12. <div class="pt-20px">
  13. <div class="ScreahNmae">
  14. <a-input
  15. class="ScreahInput"
  16. v-model:value="selectData.title"
  17. :placeholder="t('routes.scenes.moveSceneTitle')"
  18. />
  19. </div>
  20. <div class="treeList">
  21. <Tree
  22. class="draggable-tree"
  23. v-model:selectedKeys="selectedKeys"
  24. :tree-data="treeData"
  25. show-icon
  26. default-expand-all
  27. >
  28. <template #icon>
  29. <!-- <i class="ph:folder-open-fill"></i> -->
  30. <img src="/resource/img/file.png" style="padding: 3px 6px 0 0" alt="" />
  31. <!-- <FolderOpenOutlined /> -->
  32. </template>
  33. </Tree>
  34. </div>
  35. </div>
  36. <template #centerFooter>
  37. <!-- <a-button>xxxx</a-button> -->
  38. </template>
  39. </BasicModal>
  40. </template>
  41. <script lang="ts">
  42. import { defineComponent, reactive, ref } from 'vue';
  43. import { BasicModal, useModalInner } from '/@/components/Modal';
  44. import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
  45. import { FolderOpenOutlined } from '@ant-design/icons-vue';
  46. import { Tree } from 'ant-design-vue';
  47. import { folderMoveScene, folderTree } from '/@/api/scene/list';
  48. import { useI18n } from '/@/hooks/web/useI18n';
  49. import { useMessage } from '/@/hooks/web/useMessage';
  50. import type { TreeProps } from 'ant-design-vue';
  51. const { t } = useI18n();
  52. const { createMessage } = useMessage();
  53. export default defineComponent({
  54. components: { BasicModal, BasicForm, Tree, FolderOpenOutlined },
  55. props: {
  56. userData: { type: Object },
  57. },
  58. emits: ['register', 'success', 'cancel'],
  59. setup(_, { emit }) {
  60. const [register, { closeModal }] = useModalInner((data) => {
  61. data && onDataReceive(data);
  62. });
  63. const selectData = ref({
  64. account: '',
  65. type: '',
  66. title: '',
  67. numList: [],
  68. });
  69. const expandedKeys = ref<string[]>(['0-0', '0-1']);
  70. const selectedKeys = ref<string[]>([]);
  71. const treeData: TreeProps['treeData'] = ref([]);
  72. const checked = ref<boolean>(false);
  73. const headerInfo = reactive<Recordable>({});
  74. const searchInfo = reactive<Recordable>({});
  75. async function onDataReceive(data: any) {
  76. let tree = await folderTree({ type: data.type });
  77. treeData.value = [{
  78. title: t('common.root'),
  79. key: null,
  80. children: getTreeData(tree)
  81. }]
  82. selectData.value.type = Number(data.type);
  83. selectData.value.numList = data.numList;
  84. }
  85. const handleSelect = async () => {
  86. // const keys = getSelectRowKeys();
  87. // console.log('key', key);
  88. };
  89. const handleChange = (val, row) => {
  90. console.log('val,row', val, row);
  91. };
  92. const handleSubmit = async () => {
  93. console.log('selectData', selectedKeys);
  94. if(selectedKeys.value && selectedKeys.value.length == 0) {
  95. return createMessage.error(t('routes.scenes.pleaseFloder'));
  96. }
  97. try {
  98. await folderMoveScene({...selectData.value, folderId: selectedKeys.value[0] });
  99. createMessage.success(t('common.optSuccess'));
  100. closeModal();
  101. emit('success');
  102. setTimeout(() => {
  103. createMessage.destroy();
  104. }, 3000);
  105. } catch (error) {
  106. console.error('error', error);
  107. }
  108. };
  109. const getTreeData = (tree = []) => {
  110. return tree.map((item) => {
  111. return {
  112. ...item,
  113. title: item.name,
  114. key: item.id,
  115. children: getTreeData(item.childrenList),
  116. };
  117. });
  118. };
  119. const handleCancel = async () => {
  120. selectData.value.account = '';
  121. selectData.value.tableType = NaN;
  122. selectData.value.numList = [];
  123. removeSchemaByField('cameraId');
  124. appendSchemaByField(schemas[1], 'cameraId');
  125. resetFields();
  126. emit('cancel');
  127. };
  128. return {
  129. register,
  130. searchInfo,
  131. closeModal,
  132. handleSelect,
  133. headerInfo,
  134. handleChange,
  135. t,
  136. checked,
  137. selectData,
  138. handleSubmit,
  139. handleCancel,
  140. expandedKeys,
  141. selectedKeys,
  142. treeData,
  143. };
  144. },
  145. });
  146. </script>
  147. <style lang="less">
  148. .ScreahNmae {
  149. .ScreahInput {
  150. height: 40px;
  151. line-height: 40px;
  152. }
  153. }
  154. .treeList {
  155. min-height: 350px;
  156. padding: 5px 20px;
  157. max-height: 350px;
  158. overflow-y: scroll;
  159. border: 1px solid rgba(0, 0, 0, 0.15);
  160. border-top: none;
  161. ::-webkit-scrollbar {
  162. display: none; /* Chrome Safari */
  163. }
  164. .ant-tree .ant-tree-treenode{
  165. padding: 5px 0;
  166. }
  167. }
  168. </style>