@lx-frontend/wrap-element-ui 1.0.28 → 2.0.0-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 (33) hide show
  1. package/package.json +21 -12
  2. package/src/components/AddMembers/index.vue +100 -89
  3. package/src/components/AuditSteps/index.vue +107 -74
  4. package/src/components/DemoComponent/index.vue +8 -5
  5. package/src/components/EditableTable/bizHooks/useCellHover.ts +47 -2
  6. package/src/components/EditableTable/bizHooks/useColumnHeaderOperation.ts +5 -4
  7. package/src/components/EditableTable/bizHooks/useDefaultOperation.ts +12 -4
  8. package/src/components/EditableTable/bizHooks/useDragSort.ts +36 -3
  9. package/src/components/EditableTable/bizHooks/useRowBgColor.ts +6 -2
  10. package/src/components/EditableTable/bizHooks/useViewSetting.ts +2 -1
  11. package/src/components/EditableTable/features/bizColorSelect.vue +4 -3
  12. package/src/components/EditableTable/features/bizEditCell.vue +6 -6
  13. package/src/components/EditableTable/features/bizTableHeaderPopover/BizCheckboxFilter.vue +3 -3
  14. package/src/components/EditableTable/features/bizTableHeaderPopover/BizColorRadioFilter.vue +3 -4
  15. package/src/components/EditableTable/features/bizTableHeaderPopover/BizDoubleDatePickerFilter.vue +8 -8
  16. package/src/components/EditableTable/features/bizTableHeaderPopover/BizInputFilter.vue +2 -2
  17. package/src/components/EditableTable/features/bizTableHeaderPopover/BizMonthDayPicker.vue +2 -2
  18. package/src/components/EditableTable/features/bizTableHeaderPopover/BizRadioFilter.vue +3 -4
  19. package/src/components/EditableTable/features/bizTableHeaderPopover/index.vue +28 -19
  20. package/src/components/EditableTable/features/bizTableOperatePopover.vue +11 -9
  21. package/src/components/EditableTable/features/bizViewSettingDialog.vue +10 -6
  22. package/src/components/EditableTable/index.less +189 -186
  23. package/src/components/EditableTable/index.vue +34 -16
  24. package/src/components/EditableTable/types/index.ts +4 -4
  25. package/src/components/Ellipsis/MultilineEllipsis.vue +96 -109
  26. package/src/components/Ellipsis/index.vue +114 -89
  27. package/src/components/LxTable/index.vue +98 -143
  28. package/src/components/PopoverForm/index.vue +52 -47
  29. package/src/components/SearchForm/index.vue +128 -138
  30. package/src/components/SearchForm/types/index.ts +4 -4
  31. package/src/components/SearchSelect/index.vue +83 -67
  32. package/src/components/index.ts +1 -1
  33. package/src/components/singleMessage/index.ts +15 -44
@@ -1,6 +1,35 @@
1
1
  import { onBeforeUnmount, onMounted, ref, Ref } from 'vue';
2
2
  import { IColumnConfig, IDraggingData, IEmits, IProps } from "../types"
3
- import throttle from "lodash/throttle"
3
+
4
+ /** 简单实现 throttle */
5
+ function throttle<T extends (...args: any[]) => any>(fn: T, delay: number) {
6
+ let lastTime = 0;
7
+ let timer: ReturnType<typeof setTimeout> | null = null;
8
+ const throttled = (...args: any[]) => {
9
+ const now = Date.now();
10
+ const remaining = delay - (now - lastTime);
11
+ if (remaining <= 0) {
12
+ if (timer !== null) {
13
+ clearTimeout(timer);
14
+ timer = null;
15
+ }
16
+ lastTime = now;
17
+ fn(...args);
18
+ } else if (timer === null) {
19
+ timer = setTimeout(() => {
20
+ lastTime = Date.now();
21
+ timer = null;
22
+ fn(...args);
23
+ }, remaining);
24
+ }
25
+ };
26
+ throttled.cancel = () => {
27
+ if (timer !== null) clearTimeout(timer);
28
+ timer = null;
29
+ lastTime = 0;
30
+ };
31
+ return throttled as T & { cancel: () => void };
32
+ }
4
33
 
5
34
  interface IUseDragSortParams {
6
35
  props: IProps
@@ -188,14 +217,18 @@ export function useDragSort({ props, emit, viewSettingDragSortOptions, pageSize,
188
217
  const handleDragDrop = (event, scope) => {
189
218
  if (!scope) return
190
219
  const { draggingIndex = 0, dropIndex = draggingIndex } = draggingData.value;
191
- const dataList = scope.store.states.data;
220
+ const dataList = scope.store.states.data.value ?? scope.store.states.data;
192
221
  const movedRow = dataList[draggingIndex];
193
222
  const newList = [
194
223
  ...dataList.slice(0, +draggingIndex),
195
224
  ...dataList.slice(draggingIndex + 1)
196
225
  ];
197
226
  newList.splice(dropIndex, 0, movedRow);
198
- scope.store.states.data = newList;
227
+ if (typeof scope.store.states.data.value !== 'undefined') {
228
+ scope.store.states.data.value = newList;
229
+ } else {
230
+ scope.store.states.data = newList;
231
+ }
199
232
  emit('row-drag-drop', {
200
233
  row: movedRow,
201
234
  fromIndex: draggingIndex,
@@ -27,11 +27,15 @@ export function useRowBgColor({ colorList, emit }: IUseRowBgColorParams) {
27
27
 
28
28
  const handleColorChange = async (colorId: number, scope) => {
29
29
  const { row, $index: rowIndex, store } = scope;
30
- const dataList = store.states.data;
30
+ const dataList = store.states.data.value ?? store.states.data;
31
31
  const curRow = { ...dataList[rowIndex], colorId: +colorId };
32
32
  const newList = [...dataList];
33
33
  newList.splice(rowIndex, 1, curRow);
34
- store.states.data = newList;
34
+ if (store.states.data.value !== undefined) {
35
+ store.states.data.value = newList;
36
+ } else {
37
+ store.states.data = newList;
38
+ }
35
39
  emit('row-bg-change', { colorId, row, rowIndex });
36
40
  };
37
41
 
@@ -115,7 +115,7 @@ export function useViewSetting({
115
115
  () => props.columnConfig,
116
116
  async(val) => {
117
117
  const _cache = localStorage.getItem(storageKey.value);
118
- const setColumns = () => updateShowingColumns(val.filter(v => !v.defaultHide).map(c => c.prop));
118
+ const setColumns = () => updateShowingColumns(val.filter(v => !v.defaultHide || v.isAlwaysShow).map(c => c.prop));
119
119
  if (!_cache) {
120
120
  setColumns();
121
121
  leftFixedColumnCount.value = props.leftFixedCount as number;
@@ -156,6 +156,7 @@ export function useViewSetting({
156
156
 
157
157
  updateShowingColumns(
158
158
  val.filter(v => {
159
+ if (v.isAlwaysShow) return true;
159
160
  return cache.config.fields[v.prop] ? !cache.config.fields[v.prop].hidden : !v.defaultHide
160
161
  }).sort((a, b) => {
161
162
  return (cache.config.fields[a.prop]?.order ?? 0) - (cache.config.fields[b.prop]?.order ?? 0)
@@ -1,7 +1,8 @@
1
1
  <!-- 行颜色选择组件 -->
2
2
  <template>
3
3
  <el-popover
4
- v-model="visible"
4
+ v-model:visible="visible"
5
+ :width="'auto'"
5
6
  placement="right"
6
7
  trigger="click"
7
8
  popper-class="editable-table-color-popover"
@@ -21,7 +22,7 @@
21
22
  </div>
22
23
  </div>
23
24
 
24
- <div slot="reference">
25
+ <template #reference>
25
26
  <div
26
27
  v-if="isDefaultColor(scope.row.colorId)"
27
28
  class="editable-table__color-icon"
@@ -31,7 +32,7 @@
31
32
  class="editable-table__selected-color"
32
33
  :style="{ backgroundColor: getColorById(scope.row.colorId, 'sample') }"
33
34
  />
34
- </div>
35
+ </template>
35
36
  </el-popover>
36
37
  </template>
37
38
 
@@ -3,14 +3,14 @@
3
3
  <el-input
4
4
  v-if="column.editType === 'input'"
5
5
  clearable
6
- :value="value"
7
- @input="val => emit('input', val)"
6
+ :model-value="value"
7
+ @update:modelValue="val => emit('input', val)"
8
8
  />
9
9
 
10
10
  <el-select
11
11
  v-if="column.editType === 'select'"
12
- :value="value"
13
- @input="val => emit('input', val)"
12
+ :model-value="value"
13
+ @update:modelValue="val => emit('input', val)"
14
14
  >
15
15
  <el-option
16
16
  v-for="item in column.selectOptions"
@@ -24,8 +24,8 @@
24
24
  v-if="column.editType === 'date'"
25
25
  type="date"
26
26
  placeholder="选择日期"
27
- :value="value"
28
- @input="val => emit('input', val)"
27
+ :model-value="value"
28
+ @update:modelValue="val => emit('input', val)"
29
29
  />
30
30
  </div>
31
31
  </template>
@@ -6,13 +6,13 @@
6
6
  </div>
7
7
  <el-checkbox-group
8
8
  class="editable-table-sort-filter__filter-checkbox-group"
9
- :value="tempFilteredValue[config.prop]"
10
- @input="val => emit('update:tempFilteredValue', config.prop, val)"
9
+ :model-value="tempFilteredValue[config.prop]"
10
+ @update:modelValue="val => emit('update:tempFilteredValue', config.prop, val)"
11
11
  >
12
12
  <el-checkbox
13
13
  v-for="item in config.options"
14
14
  :key="item.value"
15
- :label="item.value"
15
+ :value="item.value"
16
16
  :title="item.text"
17
17
  class="editable-table-sort-filter__filter-checkbox"
18
18
  >
@@ -5,14 +5,13 @@
5
5
  {{ config.label || '筛选' }}
6
6
  </div>
7
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)"
8
+ :model-value="tempFilteredValue[config.prop]"
9
+ @update:modelValue="val => emit('update:tempFilteredValue', config.prop, val)"
11
10
  >
12
11
  <el-radio
13
12
  v-for="item in config.options"
14
13
  :key="item.value"
15
- :label="item.value"
14
+ :value="item.value"
16
15
  :title="item.text"
17
16
  >
18
17
  <span class="color-option">
@@ -8,16 +8,16 @@
8
8
  <el-date-picker
9
9
  v-bind="datePickerCommonProps"
10
10
  placeholder="开始日期"
11
- :value="tempFilteredValue[config.prop[0]]"
12
- :picker-options="pickerStartOptions"
13
- @input="handleStartDateChange"
11
+ :model-value="tempFilteredValue[config.prop[0]]"
12
+ :disabled-date="(pickerStartOptions as any)?.disabledDate"
13
+ @update:modelValue="handleStartDateChange"
14
14
  />
15
15
  <el-date-picker
16
16
  v-bind="datePickerCommonProps"
17
17
  placeholder="结束日期"
18
- :value="tempFilteredValue[config.prop[1]]"
19
- :picker-options="pickerEndOptions"
20
- @input="handleEndDateChange"
18
+ :model-value="tempFilteredValue[config.prop[1]]"
19
+ :disabled-date="(pickerEndOptions as any)?.disabledDate"
20
+ @update:modelValue="handleEndDateChange"
21
21
  />
22
22
  </div>
23
23
  </div>
@@ -44,8 +44,8 @@ const emit = defineEmits<{
44
44
 
45
45
  /** 日期选择器通用配置 */
46
46
  const datePickerCommonProps = {
47
- valueFormat: 'yyyy-MM-dd',
48
- format: 'yyyy-MM-dd',
47
+ valueFormat: 'YYYY-MM-DD',
48
+ format: 'YYYY-MM-DD',
49
49
  type: 'date',
50
50
  size: 'small',
51
51
  editable: false,
@@ -6,8 +6,8 @@
6
6
  <el-input
7
7
  class="editable-table-sort-filter__search-input"
8
8
  :placeholder="config.placeholder || '请输入内容'"
9
- :value="tempFilteredValue[config.prop]"
10
- @input="val => emit('update:tempFilteredValue', config.prop, val)"
9
+ :model-value="tempFilteredValue[config.prop]"
10
+ @update:modelValue="val => emit('update:tempFilteredValue', config.prop, val)"
11
11
  />
12
12
  </div>
13
13
  </template>
@@ -7,7 +7,7 @@
7
7
  <div class="editable-table-sort-filter__date-picker-content">
8
8
  <el-cascader
9
9
  clearable
10
- :value="startDate"
10
+ :model-value="startDate"
11
11
  separator=""
12
12
  size="small"
13
13
  placeholder="开始日期"
@@ -17,7 +17,7 @@
17
17
  />
18
18
  <el-cascader
19
19
  clearable
20
- :value="endDate"
20
+ :model-value="endDate"
21
21
  separator=""
22
22
  size="small"
23
23
  placeholder="结束日期"
@@ -5,14 +5,13 @@
5
5
  {{ config.label || '筛选' }}
6
6
  </div>
7
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)"
8
+ :model-value="tempFilteredValue[config.prop]"
9
+ @update:modelValue="val => emit('update:tempFilteredValue', config.prop, val)"
11
10
  >
12
11
  <el-radio
13
12
  v-for="item in config.options"
14
13
  :key="item.value"
15
- :label="item.value"
14
+ :value="item.value"
16
15
  :title="item.text"
17
16
  >
18
17
  {{ item.text }}
@@ -1,14 +1,13 @@
1
1
  <template>
2
2
  <el-popover
3
3
  ref="popoverRef"
4
+ v-model:visible="visible"
4
5
  placement="bottom"
5
6
  trigger="click"
6
7
  popper-class="editable-table-sort-filter"
7
- data-popper-name="editable-table-sort-filter"
8
- :data-prop="column.prop"
9
8
  @show="() => emit('popover-show')"
10
9
  >
11
- <template slot="reference">
10
+ <template #reference>
12
11
  <slot name="custom">
13
12
  <!-- 筛选中,或排序中,高亮 -->
14
13
  <span
@@ -63,11 +62,11 @@
63
62
  </div>
64
63
  <el-checkbox-group
65
64
  class="editable-table-sort-filter__filter-checkbox-group"
66
- :value="tempSummaryList"
67
- @input="val => emit('update:tempSummaryList', val)"
65
+ :model-value="tempSummaryList"
66
+ @update:modelValue="val => emit('update:tempSummaryList', val)"
68
67
  >
69
68
  <el-checkbox
70
- :label="column.prop"
69
+ :value="column.prop"
71
70
  class="editable-table-sort-filter__filter-checkbox"
72
71
  >
73
72
  <slot
@@ -80,17 +79,17 @@
80
79
  </el-checkbox-group>
81
80
  </div>
82
81
 
83
- <div class="editable-table-sort-filter__footer">
82
+ <div class="editable-table-sort-filter__footer" @click.stop>
84
83
  <el-button
85
84
  class="editable-table-sort-filter__reset-btn"
86
- @click="() => emit('reset')"
85
+ @click.stop="handleReset"
87
86
  >
88
87
  重置
89
88
  </el-button>
90
89
  <el-button
91
90
  class="editable-table-sort-filter__confirm-btn"
92
91
  type="primary"
93
- @click="() => emit('confirm')"
92
+ @click.stop="handleConfirm"
94
93
  >
95
94
  确定
96
95
  </el-button>
@@ -100,7 +99,7 @@
100
99
  </template>
101
100
 
102
101
  <script setup lang="ts">
103
- import { ref } from 'vue'
102
+ import { ref, markRaw } from 'vue'
104
103
 
105
104
  import BizCheckboxFilter from './BizCheckboxFilter.vue';
106
105
  import BizColorRadioFilter from './BizColorRadioFilter.vue';
@@ -129,32 +128,42 @@ const emit = defineEmits<{
129
128
  (e: 'confirm'): void
130
129
  }>()
131
130
 
132
- // 把 filterItem.type 映射到组件
131
+ // 把 filterItem.type 映射到组件(markRaw 防止 Vue 响应式代理包装组件定义)
133
132
  const componentMap: Record<Exclude<FilterItem['type'], 'slot'>, any> = {
134
133
  /** 输入框 */
135
- input: BizInputFilter,
134
+ input: markRaw(BizInputFilter),
136
135
  /** 日期范围 */
137
- doubleDatePicker: BizDoubleDatePickerFilter,
136
+ doubleDatePicker: markRaw(BizDoubleDatePickerFilter),
138
137
  /** 单选框 */
139
- radio: BizRadioFilter,
138
+ radio: markRaw(BizRadioFilter),
140
139
  /** 复选框 */
141
- checkbox: BizCheckboxFilter,
140
+ checkbox: markRaw(BizCheckboxFilter),
142
141
  /** 月日选择器 */
143
- monthDayPicker: BizMonthDayPicker,
142
+ monthDayPicker: markRaw(BizMonthDayPicker),
144
143
  /** 颜色选择器 */
145
- colorRadio: BizColorRadioFilter,
144
+ colorRadio: markRaw(BizColorRadioFilter),
146
145
  }
147
146
 
148
- const popoverRef = ref(null as any)
147
+ const visible = ref(false)
149
148
 
150
149
  // 统一的事件派发
151
150
  function onUpdate(key: string, val: any) {
152
151
  emit('update:tempFilteredValue', key, val)
153
152
  }
154
153
 
154
+ function handleReset() {
155
+ emit('reset')
156
+ visible.value = false
157
+ }
158
+
159
+ function handleConfirm() {
160
+ emit('confirm')
161
+ visible.value = false
162
+ }
163
+
155
164
  defineExpose({
156
165
  close: () => {
157
- popoverRef.value?.doClose()
166
+ visible.value = false
158
167
  }
159
168
  })
160
169
  </script>
@@ -1,18 +1,20 @@
1
1
  <template>
2
2
  <el-popover
3
3
  ref="operationPopoverRef"
4
+ :width="'auto'"
4
5
  placement="bottom"
5
6
  trigger="click"
6
7
  popper-class="editable-table-operation-popover"
7
8
  >
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>
9
+ <template #reference>
10
+ <div
11
+ class="editable-table-operation-popover__operation-reference btn-pointer"
12
+ >
13
+ <el-button class="editable-table-operation-popover__operation-btn">
14
+ 操作
15
+ </el-button>
16
+ </div>
17
+ </template>
16
18
  <div class="editable-table-operation-popover__operation">
17
19
  <div
18
20
  v-if="defaultOperations.includes('delete')"
@@ -62,6 +64,6 @@ const emit = defineEmits<{
62
64
  const operationPopoverRef = ref(null as any)
63
65
 
64
66
  defineExpose({
65
- doClose: () => operationPopoverRef.value?.doClose?.()
67
+ doClose: () => operationPopoverRef.value?.hide?.()
66
68
  })
67
69
  </script>
@@ -1,12 +1,15 @@
1
1
  <template>
2
2
  <el-dialog
3
3
  title="显示设置"
4
- :visible.sync="viewSettingVisible"
4
+ v-model="viewSettingVisible"
5
5
  width="750px"
6
6
  top="12vh"
7
7
  :close-on-click-modal="false"
8
8
  append-to-body
9
- custom-class="editable-table-view-setting__dialog"
9
+ class="editable-table-view-setting__dialog"
10
+ header-class="editable-table-view-setting__header"
11
+ body-class="editable-table-view-setting__body"
12
+ footer-class="editable-table-view-setting__footer"
10
13
  >
11
14
  <div class="editable-table-view-setting__content">
12
15
  <div class="editable-table-view-setting__content-left">
@@ -15,7 +18,7 @@
15
18
  <el-checkbox
16
19
  v-for="item in props.columnConfig"
17
20
  :key="item.label"
18
- :label="item.prop"
21
+ :value="item.prop"
19
22
  :disabled="item.isAlwaysShow"
20
23
  >
21
24
  <div class="editable-table-view-setting__content-left-item">
@@ -36,8 +39,8 @@
36
39
  冻结前
37
40
  <el-input
38
41
  class="editable-table-view-setting__content-right-input"
39
- :value="tempLeftFixedColumnCount"
40
- @input="handleInputTempLeftFixedColumnCount"
42
+ :model-value="tempLeftFixedColumnCount"
43
+ @update:modelValue="handleInputTempLeftFixedColumnCount"
41
44
  />
42
45
 
43
46
  </div>
@@ -65,7 +68,7 @@
65
68
  :class="['editable-table-view-setting__selected-item-close', item.isAlwaysShow ? 'editable-table-view-setting__selected-item-close--disabled' : '']"
66
69
  @click="handleColumnClose(item)"
67
70
  >
68
- <i class="el-icon-close" />
71
+ <el-icon><Close /></el-icon>
69
72
  </div>
70
73
  </div>
71
74
  </div>
@@ -86,6 +89,7 @@
86
89
  </template>
87
90
 
88
91
  <script setup lang="ts">
92
+ import { Close } from '@element-plus/icons-vue';
89
93
  import { toRefs } from 'vue';
90
94
  import { useViewSetting } from '../bizHooks'
91
95
  import { IColumnConfig, IProps } from '../types';