@seemusic/ui-components
Version:
A Vue 3 UI Library. Uses Composable.
1 lines • 13.1 kB
Source Map (JSON)
{"version":3,"file":"SopBasicTable.mjs","sources":["../../../src/components/SopBasicTable/SopBasicTable.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { defineComponent, ref } from 'vue';\nimport { ElTable, ElTableColumn } from 'element-plus';\nimport { Icon } from '@iconify/vue';\nimport EditTableCell from './EditTableCell.vue';\nimport { SopPagination } from '../SopPagination';\nimport { extend } from '../../utils';\nimport type { PropType, VNode } from 'vue';\nimport type { Column, PaginationProps } from 'element-plus';\nimport type { Recordable } from '../../shims';\n\nexport type Mutable<Type> = {\n -readonly [Key in keyof Type]: Type[Key];\n};\n\nexport type ComponentsType = 'ElInput' |\n 'ElInputNumber' |\n 'ElSelect' |\n 'ElSwitch' |\n 'ElTimeSelect' |\n 'ElTimePicker' |\n 'ElSelectV2' |\n 'ElDatePicker' |\n 'ElCascader'\n\nexport interface TableColumn extends Omit<Column, 'width'> {\n prop?: string\n customRender?: string\n // custom 值等于 render 时传入 render 生效,否则它的值就被视为 slot\n render?: (scope: Recordable) => VNode\n // 表头的名称\n label?: string\n // cell 的类型\n type?: 'index' | 'selection' | 'expand'\n // cell 的宽度\n width?: string | number\n // 当 prop 对应的值为空时,则显示此内容\n placeholder?: string\n\n // 表格编辑开关\n editable?: boolean\n // 编辑行\n editRow?: boolean\n // 编辑列\n editColumn?: boolean\n editColumnScheduler?: () => Promise<boolean>\n // 是否必填\n editRule?: boolean\n editComponent?: ComponentsType\n editComponentProps?: Recordable\n}\n\nexport interface TableConfig {\n // 是否开启分页\n isPagination?: boolean\n pagination: Partial<Mutable<PaginationProps>>\n}\n\nexport default defineComponent({\n name: 'SopBasicTable',\n components: { ElTable, ElTableColumn, EditTableCell },\n props: {\n columns: {\n type: Object as PropType<TableColumn[]>,\n required: true\n },\n data: {\n type: Array as PropType<Recordable[]>,\n required: true\n },\n config: {\n type: Object as PropType<TableConfig>,\n default: () => {\n return {\n isPagination: true,\n };\n }\n }\n },\n emits: ['edit-column-change', 'current-change', 'size-change'],\n setup(props, { attrs, slots, emit, expose }) {\n const tableRef = ref<InstanceType<typeof ElTable> | null>(null);\n const editRowIndex = ref<number | null>(null);\n const isCancelEditRow = ref(false);\n\n const cancelEdit = () => isCancelEditRow.value = true;\n const getEditRowIndex = () => editRowIndex.value;\n\n /**\n * 设置当前被编辑行的索引\n */\n function setEditRowIndex(idx: number | number) {\n editRowIndex.value = idx;\n // !防止用户频繁调用 cancelEdit 方法\n isCancelEditRow.value = false;\n }\n\n const headerSlot = slots.header ? { header: (scope: Recordable) => slots.header?.(scope) } : {};\n\n /**\n * 默认要被渲染的 column\n */\n function getDefaultColumn(column: TableColumn) {\n return <ElTableColumn {...column}>\n {\n extend(\n { default: (scope: Recordable) => slots.default?.(scope) },\n headerSlot\n )\n }\n </ElTableColumn>;\n }\n\n /**\n * 给带有 editable 的 header 增加编辑 icon\n */\n function editHeaderSlot(column: TableColumn) {\n if (column.editable) {\n return {\n header: ({ column }: Recordable) => {\n return (\n <>\n <span>{column.label}</span>\n <Icon icon='solar:pen-2-outline' />\n </>\n );\n }\n };\n }\n return {};\n }\n\n /**\n * 编辑表格 column\n */\n function renderEditCellColumn(column: TableColumn) {\n return <ElTableColumn {...column}>\n {\n extend(\n {\n default: (scope: Recordable) => {\n if (column.editable) {\n return (\n <EditTableCell\n column={column}\n scope={scope}\n isCancelEditRow={isCancelEditRow.value}\n isOpenEdit={scope.$index === editRowIndex.value}\n onEdit-column-change={(val: any) => onEditChange(val, scope, column)}\n onCancel-edit-row-state-change={() => isCancelEditRow.value = false}\n />\n );\n } else {\n slots.default?.(scope);\n }\n }\n },\n editHeaderSlot(column)\n )\n }\n </ElTableColumn>;\n }\n\n /**\n * 单元格 change event\n */\n function onEditChange(val: any, scope: Recordable, column: TableColumn) {\n const { row } = scope;\n row[column.prop as string] = val;\n emit('edit-column-change', scope);\n }\n\n /**\n * slot or render Column\n */\n function renderCustomColumn(column: TableColumn) {\n if (column.customRender != 'render') {\n return <ElTableColumn {...column}>\n {\n extend(\n { default: (scope: Recordable) => slots[column.customRender as string]?.(scope) },\n headerSlot\n )\n }\n </ElTableColumn>;\n } else {\n return <ElTableColumn {...column}>\n {\n extend(\n { default: (scope: Recordable) => column.render?.(scope) },\n headerSlot\n )\n }\n </ElTableColumn>;\n }\n }\n\n /**\n * 根据不同情况处理 tableColumn\n */\n function renderColumn(column: TableColumn) {\n if (!Object.keys(column).includes('formatter')) {\n column['formatter'] = (row: Recordable, _: TableColumn, cellValue: any) => {\n return cellValue ? cellValue : (column.placeholder || '-');\n };\n }\n\n switch(column.type) {\n case 'index':\n case 'selection':\n return getDefaultColumn(column);\n // 表格展开 expand 插槽\n case 'expand':\n return <ElTableColumn {...column}>\n {\n extend(\n { default: (scope: Recordable) => slots.expand?.(scope) },\n headerSlot\n )\n }\n </ElTableColumn>;\n }\n\n // render-header\n if (column.renderHeader && typeof column.renderHeader === 'function') {\n {\n extend(\n { default: (scope: Recordable) => slots.default?.(scope) },\n { header: (scope: Recordable) => column.renderHeader(scope) }\n );\n }\n }\n\n // render 或 slot\n if (column.customRender) {\n return renderCustomColumn(column);\n }\n\n // 编辑表格\n if (column.editable) {\n return renderEditCellColumn(column);\n }\n\n // 其他处理\n return getDefaultColumn(column);\n }\n\n\n expose({\n tableRef,\n setEditRowIndex,\n getEditRowIndex,\n cancelEdit,\n });\n return () => (\n <div class=\"basic-table\">\n <ElTable\n ref={tableRef}\n class='basic-table'\n border\n stripe\n data={props.data}\n {...attrs}\n >\n {\n props.columns\n && props.columns.length\n && props.columns.map((column) => renderColumn(column))\n }\n </ElTable>\n\n {\n props.config\n && props.config.isPagination\n && <SopPagination\n {...props.config.pagination}\n onCurrent-change={(pageNum: number) => emit('current-change', pageNum)}\n onSize-change={(sizeNum: number) => emit('size-change', sizeNum)}\n />\n }\n </div>\n );\n }\n});\n"],"names":["_isSlot","s","Object","prototype","toString","call","_isVNode","defineComponent","name","components","ElTable","ElTableColumn","EditTableCell","props","columns","type","required","data","Array","config","default","isPagination","emits","setup","attrs","slots","emit","expose","tableRef","ref","editRowIndex","isCancelEditRow","cancelEdit","value","getEditRowIndex","setEditRowIndex","idx","headerSlot","header","scope","getDefaultColumn","column","_slot","_createVNode","extend","editHeaderSlot","editable","_Fragment","label","Icon","renderEditCellColumn","_slot2","$index","val","onEditChange","onCancel-edit-row-state-change","row","prop","renderCustomColumn","customRender","_slot3","_slot4","render","renderColumn","_slot5","keys","includes","_","cellValue","placeholder","expand","renderHeader","_mergeProps","length","map","SopPagination","pagination","pageNum","sizeNum"],"mappings":"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"}