|  | @@ -16,20 +16,22 @@
 | 
	
		
			
				|  |  |          :data-source="treeData"
 | 
	
		
			
				|  |  |          :columns="columns"
 | 
	
		
			
				|  |  |          size="small"
 | 
	
		
			
				|  |  | +        :bordered="true"
 | 
	
		
			
				|  |  |          row-key="id"
 | 
	
		
			
				|  |  |          :pagination="false"
 | 
	
		
			
				|  |  | -        :defaultExpandAllRows="true"
 | 
	
		
			
				|  |  | +        :default-expand-all-rows="true"
 | 
	
		
			
				|  |  |          :custom-row="customRow"
 | 
	
		
			
				|  |  |          :row-class-name="rowClassName"
 | 
	
		
			
				|  |  | +        :scroll="{ y: scrollY }"
 | 
	
		
			
				|  |  |        >
 | 
	
		
			
				|  |  |          <template #name="{ text, record }">
 | 
	
		
			
				|  |  |            <div class="editable-cell">
 | 
	
		
			
				|  |  |              <div v-if="editableData[record.id]" class="editable-cell-input-wrapper">
 | 
	
		
			
				|  |  | -              <a-input
 | 
	
		
			
				|  |  | +              <AInput
 | 
	
		
			
				|  |  |                  v-model:value="editableData[record.id].name"
 | 
	
		
			
				|  |  |                  @pressEnter="onSave(record.id)"
 | 
	
		
			
				|  |  |                />
 | 
	
		
			
				|  |  | -              <check-outlined class="editable-cell-icon-check" @click="onSave(record.id)" />
 | 
	
		
			
				|  |  | +              <CheckOutlined class="editable-cell-icon-check" @click="onSave(record.id)" />
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                <CloseOutlined
 | 
	
		
			
				|  |  |                  class="editable-cell-icon-check"
 | 
	
	
		
			
				|  | @@ -39,14 +41,14 @@
 | 
	
		
			
				|  |  |              </div>
 | 
	
		
			
				|  |  |              <div v-else class="editable-cell-text-wrapper">
 | 
	
		
			
				|  |  |                {{ text || ' ' }}
 | 
	
		
			
				|  |  | -              <edit-outlined class="editable-cell-icon" @click="onEdit(record.id, record)" />
 | 
	
		
			
				|  |  | +              <EditOutlined class="editable-cell-icon" @click="onEdit(record.id, record)" />
 | 
	
		
			
				|  |  |              </div>
 | 
	
		
			
				|  |  |            </div>
 | 
	
		
			
				|  |  |          </template>
 | 
	
		
			
				|  |  |          <template #operation="{ record }">
 | 
	
		
			
				|  |  | -          <a-popconfirm v-if="treeData.length" title="确认删除?" @confirm="onDelete(record.id)">
 | 
	
		
			
				|  |  | +          <APopconfirm v-if="treeData.length" title="确认删除?" @confirm="onDelete(record.id)">
 | 
	
		
			
				|  |  |              <a>删除</a>
 | 
	
		
			
				|  |  | -          </a-popconfirm>
 | 
	
		
			
				|  |  | +          </APopconfirm>
 | 
	
		
			
				|  |  |          </template>
 | 
	
		
			
				|  |  |        </ATable>
 | 
	
		
			
				|  |  |      </section>
 | 
	
	
		
			
				|  | @@ -59,34 +61,45 @@
 | 
	
		
			
				|  |  |        :cancel-button-props="{ size: 'small' }"
 | 
	
		
			
				|  |  |      >
 | 
	
		
			
				|  |  |        <div class="p-3">
 | 
	
		
			
				|  |  | -        <a-form :model="formState" :rules="rules" layout="vertical" ref="formRef">
 | 
	
		
			
				|  |  | -          <a-form-item name="name" required label="名称">
 | 
	
		
			
				|  |  | -            <a-input v-model:value="formState.name" autocomplete="off" class="w-6" />
 | 
	
		
			
				|  |  | -          </a-form-item>
 | 
	
		
			
				|  |  | -          <a-form-item
 | 
	
		
			
				|  |  | +        <AForm :model="formState" :rules="rules" layout="vertical" ref="formRef">
 | 
	
		
			
				|  |  | +          <AFormItem name="name" required label="名称">
 | 
	
		
			
				|  |  | +            <AInput v-model:value="formState.name" autocomplete="off" class="w-6" />
 | 
	
		
			
				|  |  | +          </AFormItem>
 | 
	
		
			
				|  |  | +          <AFormItem
 | 
	
		
			
				|  |  |              name="id"
 | 
	
		
			
				|  |  |              required
 | 
	
		
			
				|  |  |              :label="treeSelectLabel"
 | 
	
		
			
				|  |  |              :hidden="type === 'edit' ? true : false"
 | 
	
		
			
				|  |  |            >
 | 
	
		
			
				|  |  | -            <a-tree-select
 | 
	
		
			
				|  |  | +            <ATreeSelect
 | 
	
		
			
				|  |  |                v-model:value="formState.id"
 | 
	
		
			
				|  |  | -              :treeData="treeSelectData"
 | 
	
		
			
				|  |  | +              :tree-data="treeSelectData"
 | 
	
		
			
				|  |  |                :replace-fields="replaceFields"
 | 
	
		
			
				|  |  |                :tree-default-expand-all="true"
 | 
	
		
			
				|  |  |                :dropdown-style="{ height: '20rem' }"
 | 
	
		
			
				|  |  |              />
 | 
	
		
			
				|  |  | -          </a-form-item>
 | 
	
		
			
				|  |  | -          <a-form-item name="code2" label="图标编码">
 | 
	
		
			
				|  |  | -            <a-input v-model:value="formState.code2" autocomplete="off" />
 | 
	
		
			
				|  |  | -          </a-form-item>
 | 
	
		
			
				|  |  | -        </a-form>
 | 
	
		
			
				|  |  | +          </AFormItem>
 | 
	
		
			
				|  |  | +          <AFormItem name="code2" label="图标编码">
 | 
	
		
			
				|  |  | +            <AInput v-model:value="formState.code2" autocomplete="off" />
 | 
	
		
			
				|  |  | +          </AFormItem>
 | 
	
		
			
				|  |  | +        </AForm>
 | 
	
		
			
				|  |  |        </div>
 | 
	
		
			
				|  |  |      </AModal>
 | 
	
		
			
				|  |  |    </div>
 | 
	
		
			
				|  |  |  </template>
 | 
	
		
			
				|  |  |  <script lang="ts">
 | 
	
		
			
				|  |  | -  import { computed, defineComponent, reactive, ref, toRaw, toRefs, unref, UnwrapRef } from 'vue'
 | 
	
		
			
				|  |  | +  import {
 | 
	
		
			
				|  |  | +    computed,
 | 
	
		
			
				|  |  | +    defineComponent,
 | 
	
		
			
				|  |  | +    onMounted,
 | 
	
		
			
				|  |  | +    onUnmounted,
 | 
	
		
			
				|  |  | +    reactive,
 | 
	
		
			
				|  |  | +    ref,
 | 
	
		
			
				|  |  | +    toRaw,
 | 
	
		
			
				|  |  | +    toRefs,
 | 
	
		
			
				|  |  | +    unref,
 | 
	
		
			
				|  |  | +    UnwrapRef
 | 
	
		
			
				|  |  | +  } from 'vue'
 | 
	
		
			
				|  |  |    import { useDesign } from '/@/hooks/web/useDesign'
 | 
	
		
			
				|  |  |    import { Table, Modal, Form, Input, TreeSelect, Popconfirm, message } from 'ant-design-vue'
 | 
	
		
			
				|  |  |    import { CheckOutlined, EditOutlined, CloseOutlined } from '@ant-design/icons-vue'
 | 
	
	
		
			
				|  | @@ -100,6 +113,7 @@
 | 
	
		
			
				|  |  |    import { TreeResultModel } from '/@/api/model/tree'
 | 
	
		
			
				|  |  |    import { TreeRow } from '/#/tree'
 | 
	
		
			
				|  |  |    import { useMessage } from '/@/hooks/web/useMessage'
 | 
	
		
			
				|  |  | +  import { useWindowSizeFn } from '/@/hooks/event/useWindowSizeFn'
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    interface FormState {
 | 
	
		
			
				|  |  |      id: string
 | 
	
	
		
			
				|  | @@ -129,7 +143,16 @@
 | 
	
		
			
				|  |  |        const { prefixCls } = useDesign('management')
 | 
	
		
			
				|  |  |        const treeData = ref<TreeResultModel[]>([])
 | 
	
		
			
				|  |  |        const editableData: UnwrapRef<Record<string, TreeRow>> = reactive({})
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +      const scrollY = ref<number | null>(null)
 | 
	
		
			
				|  |  | +      function autoTableScroll() {
 | 
	
		
			
				|  |  | +        const bodyFontSize =
 | 
	
		
			
				|  |  | +          parseInt(window.getComputedStyle(document.body).fontSize.replace('px', '')) * 1.25 * 2
 | 
	
		
			
				|  |  | +        scrollY.value =
 | 
	
		
			
				|  |  | +          document.body.clientHeight - 48 - 29 - 48 - 39 - bodyFontSize - bodyFontSize * 0.75 * 2
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      useWindowSizeFn(autoTableScroll, 150, { immediate: true })
 | 
	
		
			
				|  |  | +      // onMounted(() => start())
 | 
	
		
			
				|  |  | +      // onUnmounted(() => stop())
 | 
	
		
			
				|  |  |        const row = ref<TreeRow>({
 | 
	
		
			
				|  |  |          name: '',
 | 
	
		
			
				|  |  |          code: '',
 | 
	
	
		
			
				|  | @@ -160,6 +183,8 @@
 | 
	
		
			
				|  |  |              const unRow = unref(row)
 | 
	
		
			
				|  |  |              if (type === ModalType.ADD) {
 | 
	
		
			
				|  |  |                formState.id = unRow.depth === 3 ? unRow.parentId : unRow.id
 | 
	
		
			
				|  |  | +              formState.name = ''
 | 
	
		
			
				|  |  | +              formState.code2 = ''
 | 
	
		
			
				|  |  |              } else {
 | 
	
		
			
				|  |  |                formState.id = unRow.id
 | 
	
		
			
				|  |  |                formState.name = unRow.name
 | 
	
	
		
			
				|  | @@ -228,17 +253,20 @@
 | 
	
		
			
				|  |  |            title: '名称',
 | 
	
		
			
				|  |  |            dataIndex: 'name',
 | 
	
		
			
				|  |  |            key: 'name',
 | 
	
		
			
				|  |  | +          width: '60%',
 | 
	
		
			
				|  |  |            slots: { customRender: 'name' }
 | 
	
		
			
				|  |  |          },
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |            title: '图表编码',
 | 
	
		
			
				|  |  |            dataIndex: 'code2',
 | 
	
		
			
				|  |  |            key: 'code2',
 | 
	
		
			
				|  |  | +          width: '30%',
 | 
	
		
			
				|  |  |            slots: { customRender: 'code2' }
 | 
	
		
			
				|  |  |          },
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |            title: '操作',
 | 
	
		
			
				|  |  |            dataIndex: 'operation',
 | 
	
		
			
				|  |  | +          width: '10%',
 | 
	
		
			
				|  |  |            slots: { customRender: 'operation' }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |        ]
 | 
	
	
		
			
				|  | @@ -321,7 +349,8 @@
 | 
	
		
			
				|  |  |          handleTreeOpreate,
 | 
	
		
			
				|  |  |          treeSelectData,
 | 
	
		
			
				|  |  |          treeSelectLabel,
 | 
	
		
			
				|  |  | -        onCancel
 | 
	
		
			
				|  |  | +        onCancel,
 | 
	
		
			
				|  |  | +        scrollY
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |    })
 |