@lx-frontend/wrap-element-ui 1.0.0-beta.8 → 1.0.1-7.beta-2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/README.md +2 -2
  2. package/package.json +6 -5
  3. package/src/components/AddMembers/index.vue +32 -40
  4. package/src/components/EditableTable/bizHooks/index.ts +7 -0
  5. package/src/components/EditableTable/{useCellHover.ts → bizHooks/useCellHover.ts} +1 -1
  6. package/src/components/EditableTable/bizHooks/useColumnHeaderOperation.ts +329 -0
  7. package/src/components/EditableTable/{useDefaultOperation.ts → bizHooks/useDefaultOperation.ts} +2 -2
  8. package/src/components/EditableTable/{useDragSort.ts → bizHooks/useDragSort.ts} +4 -4
  9. package/src/components/EditableTable/{usePagination.ts → bizHooks/usePagination.ts} +3 -3
  10. package/src/components/EditableTable/{useRowBgColor.ts → bizHooks/useRowBgColor.ts} +9 -16
  11. package/src/components/EditableTable/bizHooks/useViewSetting.ts +125 -0
  12. package/src/components/EditableTable/features/bizColorSelect.vue +63 -0
  13. package/src/components/EditableTable/features/bizEditCell.vue +44 -0
  14. package/src/components/EditableTable/features/bizTableHeaderPopover/BizCheckboxFilter.vue +40 -0
  15. package/src/components/EditableTable/features/bizTableHeaderPopover/BizColorRadioFilter.vue +56 -0
  16. package/src/components/EditableTable/features/bizTableHeaderPopover/BizDoubleDatePickerFilter.vue +91 -0
  17. package/src/components/EditableTable/features/bizTableHeaderPopover/BizInputFilter.vue +26 -0
  18. package/src/components/EditableTable/features/bizTableHeaderPopover/BizMonthDayPicker.helper.ts +131 -0
  19. package/src/components/EditableTable/features/bizTableHeaderPopover/BizMonthDayPicker.vue +115 -0
  20. package/src/components/EditableTable/features/bizTableHeaderPopover/BizRadioFilter.vue +39 -0
  21. package/src/components/EditableTable/features/bizTableHeaderPopover/BizSortFilter.vue +50 -0
  22. package/src/components/EditableTable/features/bizTableHeaderPopover/index.vue +155 -0
  23. package/src/components/EditableTable/features/bizTableOperatePopover.vue +67 -0
  24. package/src/components/EditableTable/features/bizViewSettingDialog.vue +137 -0
  25. package/src/components/EditableTable/index.less +524 -428
  26. package/src/components/EditableTable/index.vue +167 -456
  27. package/src/components/EditableTable/{types.ts → types/index.ts} +176 -116
  28. package/src/components/SearchForm/index.vue +7 -4
  29. package/src/components/SearchForm/types/index.ts +63 -0
  30. package/src/components/EditableTable/useColumnHeaderOperation.ts +0 -326
  31. package/src/components/EditableTable/useViewSetting.ts +0 -119
@@ -0,0 +1,39 @@
1
+ <!-- 单选框 -->
2
+ <template>
3
+ <div class="editable-table-sort-filter__filter">
4
+ <div class="editable-table-sort-filter__filter-title">
5
+ {{ config.label || '筛选' }}
6
+ </div>
7
+ <el-radio-group
8
+ style="display: flex;flex-direction: column;gap: 6px;"
9
+ :value="tempFilteredValue[config.prop]"
10
+ @input="val => emit('update:tempFilteredValue', config.prop, val)"
11
+ >
12
+ <el-radio
13
+ v-for="item in config.options"
14
+ :key="item.value"
15
+ :label="item.value"
16
+ :title="item.text"
17
+ >
18
+ {{ item.text }}
19
+ </el-radio>
20
+ </el-radio-group>
21
+ </div>
22
+ </template>
23
+
24
+ <script setup lang="ts">
25
+ import { IFilterSelect } from '../../types';
26
+
27
+ defineProps<{
28
+ config: IFilterSelect
29
+ tempFilteredValue: Record<string, string>
30
+ }>()
31
+
32
+ const emit = defineEmits<{
33
+ (e: 'update:tempFilteredValue', key: string, value: string): void
34
+ }>()
35
+ </script>
36
+
37
+ <style scoped lang="less">
38
+
39
+ </style>
@@ -0,0 +1,50 @@
1
+ <template>
2
+ <div class="editable-table-sort-filter__sort">
3
+ <div
4
+ v-for="item in sortConfigs"
5
+ :key="item.prop"
6
+ >
7
+ <div class="editable-table-sort-filter__sort-title">
8
+ {{ item.label || '排序' }}
9
+ </div>
10
+ <div class="editable-table-sort-filter__sort-btns">
11
+ <el-button
12
+ :class="['editable-table-sort-filter__sort-btn', checkActiveProp('ascending', item.prop) && 'editable-table-sort-filter__sort-btn--active']"
13
+ @click="() => emit('update:sort', 'ascending', item.prop)"
14
+ >
15
+ 升序
16
+ </el-button>
17
+ <el-button
18
+ :class="['editable-table-sort-filter__sort-btn', checkActiveProp('descending', item.prop) && 'editable-table-sort-filter__sort-btn--active']"
19
+ @click="() => emit('update:sort', 'descending', item.prop)"
20
+ >
21
+ 降序
22
+ </el-button>
23
+ </div>
24
+ </div>
25
+ </div>
26
+ </template>
27
+
28
+ <script setup lang="ts">
29
+ import { computed } from 'vue';
30
+ import { IColumnConfig } from '../../types';
31
+
32
+ const props = defineProps<{
33
+ column: IColumnConfig
34
+ tempSortType: 'ascending' | 'descending' | ''
35
+ tempSortProp: string
36
+ }>()
37
+
38
+ const emit = defineEmits<{
39
+ (e: 'update:sort', type: 'ascending' | 'descending', prop: string): void
40
+ }>()
41
+
42
+ const checkActiveProp = (type: 'ascending' | 'descending', prop: string) => {
43
+ return props.tempSortType === type && props.tempSortProp === prop
44
+ }
45
+
46
+ const sortConfigs = computed(() => {
47
+ if (Array.isArray(props.column._sortable)) return props.column._sortable
48
+ return [{ ...props.column, label: '排序' }]
49
+ })
50
+ </script>
@@ -0,0 +1,155 @@
1
+ <template>
2
+ <el-popover
3
+ ref="popoverRef"
4
+ placement="bottom"
5
+ trigger="click"
6
+ popper-class="editable-table-sort-filter"
7
+ data-popper-name="editable-table-sort-filter"
8
+ :data-prop="column.prop"
9
+ @show="() => emit('popover-show')"
10
+ >
11
+ <template slot="reference">
12
+ <slot name="custom">
13
+ <!-- 筛选中,或排序中,高亮 -->
14
+ <span
15
+ :class="['editable-table__sort-reference', headActive && 'editable-table__sort-reference--active']"
16
+ >
17
+ {{ column.label }}
18
+ <div :class="['editable-table__sort-icon', headActive && 'editable-table__sort-icon--active']" />
19
+ </span>
20
+ </slot>
21
+ </template>
22
+ <div class="editable-table-sort-filter">
23
+ <div class="editable-table-sort-filter__column-title">
24
+ {{ column.label }}
25
+ </div>
26
+
27
+ <div class="editable-table-sort-filter__item">
28
+ <BizSortFilter
29
+ v-if="column.isColumnSortable"
30
+ :column="column"
31
+ :temp-sort-prop="tempSortProp"
32
+ :temp-sort-type="tempSortType"
33
+ @update:sort="(type, prop) => emit('update:sort', type, prop)"
34
+ />
35
+ </div>
36
+
37
+ <template v-if="column.filters">
38
+ <div
39
+ v-for="(filterItem, index) in column.filters"
40
+ :key="index"
41
+ class="editable-table-sort-filter__item editable-table__filter-group__filter"
42
+ >
43
+ <component
44
+ :is="componentMap[filterItem.type]"
45
+ :config="filterItem"
46
+ :temp-filtered-value="tempFilteredValue"
47
+ @update:tempFilteredValue="onUpdate"
48
+ />
49
+ </div>
50
+ </template>
51
+
52
+ <div
53
+ v-if="column.summary"
54
+ class="editable-table-sort-filter__item editable-table-sort-filter__filter"
55
+ >
56
+ <div class="editable-table-sort-filter__filter-title">
57
+ 统计
58
+ </div>
59
+ <el-checkbox-group
60
+ class="editable-table-sort-filter__filter-checkbox-group"
61
+ :value="tempSummaryList"
62
+ @input="val => emit('update:tempSummaryList', val)"
63
+ >
64
+ <el-checkbox
65
+ :label="column.prop"
66
+ class="editable-table-sort-filter__filter-checkbox"
67
+ >
68
+ <slot
69
+ name="summay-item"
70
+ v-bind="column"
71
+ >
72
+ {{ column.label }}
73
+ </slot>
74
+ </el-checkbox>
75
+ </el-checkbox-group>
76
+ </div>
77
+
78
+ <div class="editable-table-sort-filter__footer">
79
+ <el-button
80
+ class="editable-table-sort-filter__reset-btn"
81
+ @click="() => emit('reset')"
82
+ >
83
+ 重置
84
+ </el-button>
85
+ <el-button
86
+ class="editable-table-sort-filter__confirm-btn"
87
+ type="primary"
88
+ @click="() => emit('confirm')"
89
+ >
90
+ 确定
91
+ </el-button>
92
+ </div>
93
+ </div>
94
+ </el-popover>
95
+ </template>
96
+
97
+ <script setup lang="ts">
98
+ import { ref } from 'vue'
99
+
100
+ import BizCheckboxFilter from './BizCheckboxFilter.vue';
101
+ import BizColorRadioFilter from './BizColorRadioFilter.vue';
102
+ import BizDoubleDatePickerFilter from './BizDoubleDatePickerFilter.vue';
103
+ import BizInputFilter from './BizInputFilter.vue';
104
+ import BizMonthDayPicker from './BizMonthDayPicker.vue';
105
+ import BizSortFilter from './BizSortFilter.vue';
106
+ import BizRadioFilter from "./BizRadioFilter.vue";
107
+ import { FilterItem, IColumnConfig } from '../../types'
108
+
109
+ defineProps<{
110
+ headActive: boolean
111
+ column: IColumnConfig
112
+ tempSummaryList: string[]
113
+ tempSortType: 'ascending' | 'descending' | ''
114
+ tempSortProp: string
115
+ tempFilteredValue: Record<string, string | number | number[] | string[]>
116
+ }>()
117
+
118
+ const emit = defineEmits<{
119
+ (e: 'update:tempFilteredValue', key: string, value: string): void
120
+ (e: 'update:tempSummaryList', value: string[]): void
121
+ (e: 'update:sort', type: 'ascending' | 'descending', prop: string): void
122
+ (e: 'popover-show'): void
123
+ (e: 'reset'): void
124
+ (e: 'confirm'): void
125
+ }>()
126
+
127
+ // 把 filterItem.type 映射到组件
128
+ const componentMap: Record<FilterItem['type'], any> = {
129
+ /** 输入框 */
130
+ input: BizInputFilter,
131
+ /** 日期范围 */
132
+ doubleDatePicker: BizDoubleDatePickerFilter,
133
+ /** 单选框 */
134
+ radio: BizRadioFilter,
135
+ /** 复选框 */
136
+ checkbox: BizCheckboxFilter,
137
+ /** 月日选择器 */
138
+ monthDayPicker: BizMonthDayPicker,
139
+ /** 颜色选择器 */
140
+ colorRadio: BizColorRadioFilter,
141
+ }
142
+
143
+ const popoverRef = ref(null as any)
144
+
145
+ // 统一的事件派发
146
+ function onUpdate(key: string, val: any) {
147
+ emit('update:tempFilteredValue', key, val)
148
+ }
149
+
150
+ defineExpose({
151
+ close: () => {
152
+ popoverRef.value?.doClose()
153
+ }
154
+ })
155
+ </script>
@@ -0,0 +1,67 @@
1
+ <template>
2
+ <el-popover
3
+ ref="operationPopoverRef"
4
+ placement="bottom"
5
+ trigger="click"
6
+ popper-class="editable-table-operation-popover"
7
+ >
8
+ <div
9
+ slot="reference"
10
+ class="editable-table-operation-popover__operation-reference btn-pointer"
11
+ >
12
+ <el-button class="editable-table-operation-popover__operation-btn">
13
+ 操作
14
+ </el-button>
15
+ </div>
16
+ <div class="editable-table-operation-popover__operation">
17
+ <div
18
+ v-if="defaultOperations.includes('delete')"
19
+ class="editable-table-operation-popover__operation-item btn-pointer"
20
+ @click="() => emit('delete')"
21
+ >
22
+ 删除
23
+ </div>
24
+ <div
25
+ v-if="defaultOperations.includes('edit')"
26
+ class="editable-table-operation-popover__operation-item btn-pointer"
27
+ @click="() => emit('edit')"
28
+ >
29
+ 编辑
30
+ </div>
31
+ <div
32
+ v-if="defaultOperations.includes('top')"
33
+ class="editable-table-operation-popover__operation-item btn-pointer"
34
+ @click="() => emit('rowPinToTop')"
35
+ >
36
+ 置顶
37
+ </div>
38
+ <slot />
39
+ </div>
40
+ </el-popover>
41
+ </template>
42
+
43
+ <script setup lang="ts">
44
+ import { ref } from 'vue';
45
+ import { IDefaultOperationType } from '../types';
46
+
47
+ defineProps<{
48
+ defaultOperations: IDefaultOperationType[]
49
+ // hoveringCellInfo: {
50
+ // rowIndex: number
51
+ // columnProperty: string
52
+ // }
53
+ scope: any
54
+ }>()
55
+
56
+ const emit = defineEmits<{
57
+ (e: 'edit'): void
58
+ (e: 'delete'): void
59
+ (e: 'rowPinToTop'): void
60
+ }>()
61
+
62
+ const operationPopoverRef = ref(null as any)
63
+
64
+ defineExpose({
65
+ doClose: () => operationPopoverRef.value?.doClose?.()
66
+ })
67
+ </script>
@@ -0,0 +1,137 @@
1
+ <template>
2
+ <el-dialog
3
+ title="显示设置"
4
+ :visible.sync="viewSettingVisible"
5
+ width="750px"
6
+ top="12vh"
7
+ :close-on-click-modal="false"
8
+ append-to-body
9
+ custom-class="editable-table-view-setting__dialog"
10
+ >
11
+ <div class="editable-table-view-setting__content">
12
+ <div class="editable-table-view-setting__content-left">
13
+ <div class="editable-table-view-setting__checkbox-wrapper">
14
+ <el-checkbox-group v-model="columnsToBeShown">
15
+ <el-checkbox
16
+ v-for="item in props.columnConfig"
17
+ :key="item.label"
18
+ :label="item.prop"
19
+ :disabled="item.isAlwaysShow"
20
+ >
21
+ <div class="editable-table-view-setting__content-left-item">
22
+ {{ item.label }}
23
+ </div>
24
+ </el-checkbox>
25
+ </el-checkbox-group>
26
+ </div>
27
+ </div>
28
+ <div class="editable-table-view-setting__content-right">
29
+ <div class="editable-table-view-setting__content-right-title">
30
+ 已选择
31
+ <div class="editable-table-view-setting__selected-count">
32
+ {{ columnsToBeShown.length }}
33
+ </div>
34
+ </div>
35
+ <div class="editable-table-view-setting__content-right-frize">
36
+ 冻结前
37
+ <el-input
38
+ class="editable-table-view-setting__content-right-input"
39
+ :value="tempLeftFixedColumnCount"
40
+ @input="handleInputTempLeftFixedColumnCount"
41
+ />
42
+
43
+ </div>
44
+ <div class="editable-table-view-setting__content-right-selected">
45
+ <div
46
+ v-for="(item, index) in viewSettingDragSortOptions"
47
+ :key="item.prop"
48
+ class="editable-table-view-setting__selected-item editable-table-view-setting-draggable-item"
49
+ >
50
+ <div class="editable-table-view-setting__selected-item-left">
51
+ <div
52
+ class="editable-table-view-setting-drag-target editable-table-view-setting__icon-wrapper"
53
+ :data-index="index"
54
+ >
55
+ <div
56
+ class="editable-table-view-setting-drag-target editable-table-drag-icon"
57
+ :data-index="index"
58
+ />
59
+ </div>
60
+ <div class="editable-table-view-setting__selected-item-name">
61
+ {{ item.label }}
62
+ </div>
63
+ </div>
64
+ <div
65
+ :class="['editable-table-view-setting__selected-item-close', item.isAlwaysShow ? 'editable-table-view-setting__selected-item-close--disabled' : '']"
66
+ @click="handleColumnClose(item)"
67
+ >
68
+ <i class="el-icon-close" />
69
+ </div>
70
+ </div>
71
+ </div>
72
+ </div>
73
+ </div>
74
+ <template #footer>
75
+ <el-button @click="handleViewSettingClose">
76
+ 取消
77
+ </el-button>
78
+ <el-button
79
+ type="primary"
80
+ @click="handleViewSettingConfirm"
81
+ >
82
+ 确认
83
+ </el-button>
84
+ </template>
85
+ </el-dialog>
86
+ </template>
87
+
88
+ <script setup lang="ts">
89
+ import { toRefs } from 'vue';
90
+ import { useViewSetting } from '../bizHooks'
91
+ import { IColumnConfig, IProps } from '../types';
92
+
93
+ const emit = defineEmits<{
94
+ (e: 'update:leftFixedColumnCount', val: number): void
95
+ (e: 'update:showingColumns', val: string[]): void
96
+ (e: 'update:viewSettingDragSortOptions', val: IColumnConfig[]): void
97
+ (e: 'tableDoLayout'): void
98
+ }>()
99
+
100
+ const _props = defineProps<{
101
+ actualColumns: IColumnConfig[]
102
+ viewSettingDragSortOptions: IColumnConfig[]
103
+ showingColumns: string[]
104
+ props: IProps
105
+ }>()
106
+
107
+ const {
108
+ actualColumns,
109
+ showingColumns,
110
+ viewSettingDragSortOptions,
111
+ } = toRefs(_props)
112
+
113
+ const {
114
+ columnsToBeShown,
115
+ viewSettingVisible,
116
+ tempLeftFixedColumnCount,
117
+ handleInputTempLeftFixedColumnCount,
118
+ handleViewSettingShow,
119
+ handleViewSettingClose,
120
+ handleViewSettingConfirm
121
+ } = useViewSetting({
122
+ showingColumns,
123
+ actualColumns,
124
+ viewSettingDragSortOptions,
125
+ props: _props.props,
126
+ emit,
127
+ });
128
+
129
+ const handleColumnClose = (item) => {
130
+ if (item.isAlwaysShow) return;
131
+ columnsToBeShown.value = columnsToBeShown.value.filter(c => c !== item.prop);
132
+ };
133
+
134
+ defineExpose({
135
+ open: handleViewSettingShow
136
+ })
137
+ </script>