@lx-frontend/wrap-element-ui 1.0.0-beta.3 → 1.0.0-beta.4

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 +5 -4
  2. package/src/components/EditableTable/index.less +34 -26
  3. package/src/components/EditableTable/index.vue +104 -34
  4. package/src/components/EditableTable/types.ts +32 -10
  5. package/src/components/EditableTable/useColumnHeaderOperation.ts +166 -28
  6. package/src/components/EditableTable/useDefaultOperation.ts +10 -10
  7. package/src/components/EditableTable/useDragSort.ts +4 -5
  8. package/src/components/EditableTable/usePagination.ts +4 -7
  9. package/src/components/EditableTable/useRowBgColor.ts +3 -3
  10. package/src/components/EditableTable/useViewSetting.ts +44 -1
  11. package/src/components/index.ts +3 -1
  12. package/dist/AddMembers/index.vue.d.ts +0 -31
  13. package/dist/AuditSteps/index.vue.d.ts +0 -46
  14. package/dist/DemoComponent/index.vue.d.ts +0 -2
  15. package/dist/EditableTable/index.vue.d.ts +0 -186
  16. package/dist/EditableTable/types.d.ts +0 -123
  17. package/dist/EditableTable/useCellHover.d.ts +0 -11
  18. package/dist/EditableTable/useColumnHeaderOperation.d.ts +0 -106
  19. package/dist/EditableTable/useDefaultOperation.d.ts +0 -22
  20. package/dist/EditableTable/useDragSort.d.ts +0 -15
  21. package/dist/EditableTable/usePagination.d.ts +0 -13
  22. package/dist/EditableTable/useRowBgColor.d.ts +0 -16
  23. package/dist/EditableTable/useViewSetting.d.ts +0 -58
  24. package/dist/Ellipsis/MultilineEllipsis.vue.d.ts +0 -91
  25. package/dist/Ellipsis/index.vue.d.ts +0 -89
  26. package/dist/LxTable/index.vue.d.ts +0 -2
  27. package/dist/PopoverForm/index.vue.d.ts +0 -50
  28. package/dist/SearchForm/index.vue.d.ts +0 -105
  29. package/dist/SearchSelect/index.vue.d.ts +0 -53
  30. package/dist/index.css +0 -1
  31. package/dist/index.d.ts +0 -11
  32. package/dist/index.mjs +0 -40808
  33. package/dist/singleMessage/index.d.ts +0 -4
package/package.json CHANGED
@@ -1,9 +1,10 @@
1
1
  {
2
2
  "name": "@lx-frontend/wrap-element-ui",
3
- "version": "1.0.0-beta.3",
3
+ "version": "1.0.0-beta.4",
4
4
  "description": "wrap-element-ui",
5
5
  "author": "",
6
6
  "main": "dist/index.mjs",
7
+ "types": "dist/index.d.ts",
7
8
  "private": false,
8
9
  "scripts": {
9
10
  "clean": "rimraf dist",
@@ -14,6 +15,7 @@
14
15
  "preview": "serve ./storybook-static",
15
16
  "publish:dev": "npm publish --access public --tag beta",
16
17
  "publish:prod": "npm publish --access public",
18
+ "cdn": "gulp oss",
17
19
  "lint": "eslint src"
18
20
  },
19
21
  "files": [
@@ -49,12 +51,11 @@
49
51
  "@vue/eslint-config-typescript": "^13.0.0",
50
52
  "@vue/test-utils": "1.0.0-beta.29",
51
53
  "ali-oss": "^6.20.0",
54
+ "autoprefixer": "^10.4.19",
52
55
  "cross-env": "^7.0.3",
53
56
  "eslint": "^8.57.0",
54
57
  "eslint-plugin-vue": "^9.27.0",
55
58
  "gulp": "^4.0.2",
56
- "gulp-autoprefixer": "^4.0.0",
57
- "gulp-cssmin": "^0.1.7",
58
59
  "less": "^4.2.0",
59
60
  "react": "^18.3.1",
60
61
  "react-dom": "^18.3.1",
@@ -64,7 +65,7 @@
64
65
  "storybook": "7.6.19",
65
66
  "through2": "^4.0.2",
66
67
  "typescript": "^4.9.5",
67
- "vite": "^4.5.3",
68
+ "vite": "^3.2.7",
68
69
  "vite-plugin-dts": "^3.9.1",
69
70
  "vite-plugin-lib-inject-css": "^2.1.1",
70
71
  "vite-tsconfig-paths": "^4.3.2",
@@ -180,6 +180,31 @@
180
180
  border-right: 2px #e4e8ef solid;
181
181
  }
182
182
  }
183
+
184
+ .el-table-filter,
185
+ th.el-table__cell .el-table__column-filter-trigger,
186
+ th.is-sortable .caret-wrapper {
187
+ display: none;
188
+ }
189
+
190
+ .el-table__body tr.current-row > td,
191
+ .el-table__body tr.hover-row > td {
192
+ background-color: #fafafa;
193
+ }
194
+
195
+ table tbody tr td {
196
+ & .el-date-editor.el-input {
197
+ width: 100%;
198
+ }
199
+
200
+ & .cell {
201
+ font-size: 14px;
202
+ }
203
+ }
204
+
205
+ .el-table__fixed-body-wrapper {
206
+ background: #fff;
207
+ }
183
208
  }
184
209
 
185
210
  .view-setting {
@@ -207,7 +232,7 @@
207
232
  padding: 0px;
208
233
 
209
234
  .el-dialog__body {
210
- max-height: 800px;
235
+ max-height: 70vh;
211
236
  }
212
237
 
213
238
  .el-dialog__body {
@@ -497,6 +522,12 @@
497
522
  background-color: @--theme-blue--;
498
523
  border-color: @--theme-blue--;
499
524
  }
525
+
526
+ .el-checkbox__input.is-checked .el-checkbox__inner,
527
+ .el-radio__input.is-checked .el-radio__inner {
528
+ background: #2468f2;
529
+ border-color: #2468f2;
530
+ }
500
531
  }
501
532
 
502
533
  .btn-pointer {
@@ -576,6 +607,8 @@
576
607
  margin-top: 12px;
577
608
 
578
609
  & .el-pagination {
610
+ padding: 0;
611
+
579
612
  .el-pager li.number {
580
613
  background-color: #fff;
581
614
  border: 1px solid #d6dbe3;
@@ -605,26 +638,7 @@
605
638
  }
606
639
  }
607
640
 
608
- .el-table__body tr.current-row > td,
609
- .el-table__body tr.hover-row > td {
610
- background-color: #fafafa;
611
- }
612
-
613
- .el-table-filter,
614
- th.el-table__cell .el-table__column-filter-trigger,
615
- th.is-sortable .caret-wrapper {
616
- display: none;
617
- }
618
641
 
619
- table tbody tr td {
620
- & .el-date-editor.el-input {
621
- width: 100%;
622
- }
623
-
624
- & .cell {
625
- font-size: 14px;
626
- }
627
- }
628
642
 
629
643
  .editable-table {
630
644
  & table th {
@@ -674,12 +688,6 @@ table tbody tr td {
674
688
  }
675
689
  }
676
690
 
677
- .el-select-dropdown {
678
- &__item {
679
- text-align: center;
680
- }
681
- }
682
-
683
691
  .el-dialog__header {
684
692
  display: flex;
685
693
  justify-content: space-between;
@@ -1,7 +1,10 @@
1
1
  <template>
2
2
  <div class="editable-table">
3
3
  <div class="view-setting">
4
- <div class="view-setting__btn-wrapper">
4
+ <div
5
+ v-if="!hideViewSettingBtn"
6
+ class="view-setting__btn-wrapper"
7
+ >
5
8
  <div
6
9
  class="view-setting__btn btn-pointer"
7
10
  @click="handleViewSettingShow"
@@ -17,6 +20,7 @@
17
20
  title="显示设置"
18
21
  :visible.sync="viewSettingVisible"
19
22
  width="750px"
23
+ top="12vh"
20
24
  :close-on-click-modal="false"
21
25
  :append-to-body="true"
22
26
  custom-class="view-setting__dialog"
@@ -218,7 +222,7 @@
218
222
  :key="column.prop + index"
219
223
  resizable
220
224
  class-name="editable-table__data-column"
221
- :filtered-value="filteredValue[column.prop] || []"
225
+ :filtered-value="Array.isArray(filteredValue[column.prop]) ? filteredValue[column.prop] : []"
222
226
  v-bind="getColumnBindProps(column)"
223
227
  >
224
228
  <template
@@ -267,7 +271,7 @@
267
271
  </div>
268
272
  </div>
269
273
  <div
270
- v-if="column.isColumnSearchAble"
274
+ v-if="column.search && !Array.isArray(column.search)"
271
275
  class="sort-filter__search"
272
276
  >
273
277
  <div class="sort-filter__search-title">
@@ -279,19 +283,41 @@
279
283
  placeholder="请输入内容"
280
284
  />
281
285
  </div>
286
+
282
287
  <div
283
- v-if="column.filters && column.filters.length > 0"
288
+ v-if="column.search && Array.isArray(column.search)"
289
+ class="sort-filter__search"
290
+ style="display: flex;flex-direction: column;gap: 12px;"
291
+ >
292
+ <div
293
+ v-for="item in column.search"
294
+ :key="item.prop"
295
+ >
296
+ <div class="sort-filter__search-title">
297
+ {{ item.label }}
298
+ </div>
299
+ <el-input
300
+ v-model="tempSearchValue[item.prop]"
301
+ class="sort-filter__search-input"
302
+ placeholder="请输入内容"
303
+ />
304
+ </div>
305
+ </div>
306
+
307
+ <div
308
+ v-if="column.filters && ((Array.isArray(column.filters) ? column.filters : column.filters.options).length > 0)"
284
309
  class="sort-filter__filter"
285
310
  >
286
311
  <div class="sort-filter__filter-title">
287
312
  筛选
288
313
  </div>
289
314
  <el-checkbox-group
315
+ v-if="column.filters && (Array.isArray(column.filters) || column.filters.type === 'checkbox')"
290
316
  v-model="tempFilteredValue[column.prop]"
291
317
  class="sort-filter__filter-checkbox-group"
292
318
  >
293
319
  <el-checkbox
294
- v-for="item in column.filters"
320
+ v-for="item in (Array.isArray(column.filters) ? column.filters : column.filters.options)"
295
321
  :key="item.value"
296
322
  :label="item.value"
297
323
  class="sort-filter__filter-checkbox"
@@ -304,6 +330,25 @@
304
330
  </slot>
305
331
  </el-checkbox>
306
332
  </el-checkbox-group>
333
+
334
+ <el-radio-group
335
+ v-if="column.filters && !Array.isArray(column.filters) && column.filters.type === 'radio'"
336
+ v-model="tempFilteredValue[column.prop]"
337
+ style="display: flex;flex-direction: column;gap: 6px;"
338
+ >
339
+ <el-radio
340
+ v-for="item in column.filters.options"
341
+ :key="item.value"
342
+ :label="item.value"
343
+ >
344
+ <slot
345
+ :name="column.prop + '-filter-item'"
346
+ v-bind="item"
347
+ >
348
+ {{ item.text }}
349
+ </slot>
350
+ </el-radio>
351
+ </el-radio-group>
307
352
  </div>
308
353
  <div
309
354
  v-if="column.summary"
@@ -339,7 +384,7 @@
339
384
  <el-button
340
385
  class="sort-filter__confirm-btn"
341
386
  type="primary"
342
- @click="handleHeaderOperationConfirm(scope)"
387
+ @click="handleHeaderOperationConfirm(column, scope)"
343
388
  >
344
389
  确定
345
390
  </el-button>
@@ -538,7 +583,7 @@
538
583
  :page-sizes="[10, 15, 30, 60, 100]"
539
584
  :page-size.sync="pageSize"
540
585
  :pager-count="11"
541
- :current-page.sync="currentPage"
586
+ :current-page="currentPage"
542
587
  :total="total"
543
588
  @size-change="handlePageSizeChange"
544
589
  @current-change="handleCurrPageChange"
@@ -565,7 +610,7 @@ interface IProps {
565
610
  dataList: ITableDataItem[];
566
611
  /** 列配置 */
567
612
  columnConfig: IColumnConfig[];
568
- /** 是否展示展开行 */
613
+ /** 是否展示展开行 */
569
614
  hasExpandRow?: boolean;
570
615
  /** 是否展示序号 */
571
616
  hasIndexColumn?: boolean;
@@ -585,6 +630,16 @@ interface IProps {
585
630
  dragSemiRange?: number;
586
631
  /** 是否显示加载 */
587
632
  loading?: boolean;
633
+ /** 是否隐藏显示设置按钮 */
634
+ hideViewSettingBtn?: boolean
635
+ /** 设置的缓存的key */
636
+ settingStorgeKey?: string
637
+ /** 前端排序,默认关闭 */
638
+ localSort?: boolean
639
+ /** 前端过滤,默认关闭 */
640
+ localFilter?: boolean
641
+ /** 页码 */
642
+ currentPage: number
588
643
  }
589
644
 
590
645
  interface IEmits {
@@ -606,6 +661,10 @@ interface IEmits {
606
661
  (e: 'row-edit-cancel', param: { row: any; page: number; size: number;}): void
607
662
  /** 页码改变 */
608
663
  (e: 'page-change', param: { page: number, size: number }): void
664
+ /** 查询 */
665
+ (e: 'search', param: Record<string, any>): void
666
+ /** 排序 */
667
+ (e: 'sort-change', param: { order: 'descending' | 'ascending' | null, prop: string }): void
609
668
  }
610
669
 
611
670
  const props = withDefaults(defineProps<IProps>(), {
@@ -620,7 +679,12 @@ const props = withDefaults(defineProps<IProps>(), {
620
679
  colorList: () => [],
621
680
  leftFixedCount: 1,
622
681
  dragSemiRange: 15,
623
- loading: false
682
+ loading: false,
683
+ hideViewSettingBtn: false,
684
+ settingStorgeKey: '',
685
+ localSort: false,
686
+ localFilter: false,
687
+ currentPage: 1,
624
688
  })
625
689
 
626
690
  // 同defineProps一样,不支持泛型参数从外部导入
@@ -640,16 +704,14 @@ const actualColumns = computed(() => {
640
704
  isColumnSortable: rawItem.sortable,
641
705
  sortable: inSorting.value ? rawItem.sortable : false
642
706
  };
643
- if (item) {
644
- if (cnt > 0) {
645
- item.fixed = 'left';
646
- // eslint-disable-next-line no-plusplus
647
- cnt--;
648
- } else {
649
- item.fixed = undefined;
650
- }
651
- res.push(item);
707
+ if (cnt > 0) {
708
+ item.fixed = 'left';
709
+ // eslint-disable-next-line no-plusplus
710
+ cnt--;
711
+ } else {
712
+ item.fixed = undefined;
652
713
  }
714
+ res.push(item);
653
715
  }
654
716
 
655
717
  // 使用默认操作项,添加默认操作列。该列在编辑模式下隐藏
@@ -675,9 +737,8 @@ const beforePageChange = () => {
675
737
  }
676
738
  const {
677
739
  pageSize,
678
- currentPage,
679
740
  handleCurrPageChange,
680
- handlePageSizeChange
741
+ handlePageSizeChange,
681
742
  } = usePagination({
682
743
  emit,
683
744
  beforePageChange
@@ -717,7 +778,7 @@ const {
717
778
  emit,
718
779
  tableDomRef,
719
780
  pageSize,
720
- currentPage,
781
+ props,
721
782
  hasExpandRow: props.hasExpandRow
722
783
  })
723
784
 
@@ -739,6 +800,9 @@ const {
739
800
 
740
801
  /************ 列头部操作相关 ************ */
741
802
  const {
803
+ setSort,
804
+ clearSort,
805
+ setSearchParams,
742
806
  isColumnHeadActive,
743
807
  handleSort,
744
808
  handleHeaderPopoverShow,
@@ -756,11 +820,13 @@ const {
756
820
  sortingColumn,
757
821
  isColumnFiltering,
758
822
  searchValue,
759
- inSorting
823
+ inSorting,
760
824
  } = useColumnHeaderOperation({
761
825
  tableDomRef,
762
826
  sortFilterPopoverRef,
763
- props
827
+ props,
828
+ emit,
829
+ showingColumns,
764
830
  })
765
831
 
766
832
  /************ 表格行拖拽和显示设置列拖拽 ************ */
@@ -787,7 +853,6 @@ useDragSort({
787
853
  props,
788
854
  viewSettingDragSortOptions,
789
855
  beforeDragStart,
790
- currentPage,
791
856
  pageSize,
792
857
  currScope,
793
858
  tableDomRef,
@@ -798,18 +863,10 @@ const doTableLayout = async () => {
798
863
  tableDomRef.value?.doLayout();
799
864
  }
800
865
 
801
- watch(
802
- () => props.columnConfig,
803
- (val) => {
804
- showingColumns.value = val.map(c => c.prop);
805
- },
806
- { immediate: true }
807
- )
808
-
809
866
  // 过滤出自定义属性,将其它属性全部透传给 el-table-column
810
867
  const getColumnBindProps = (column: IColumnConfig) => {
811
868
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
812
- const { editAble, editType, slotName, inputType, options, ...rest } = column;
869
+ const { editAble, editType, slotName, inputType, options, filters, ...rest } = column;
813
870
  return rest;
814
871
  }
815
872
 
@@ -832,7 +889,20 @@ const handleColumnClose = (item) => {
832
889
 
833
890
  defineExpose({
834
891
  closeAllExpandedRows,
835
- elTableRef: tableDomRef
892
+ openViewSetting: handleViewSettingShow,
893
+ elTableRef: tableDomRef,
894
+ setSort,
895
+ clearSort,
896
+ setSearchParams,
897
+ })
898
+
899
+ // loading 结束和页码变化时滚动到顶部
900
+ watch([
901
+ () => props.loading,
902
+ () => props.currentPage,
903
+ ], ([loading]) => {
904
+ if (loading) return;
905
+ tableDomRef.value.$el.querySelector('.el-table__body-wrapper').scrollTop = 0
836
906
  })
837
907
 
838
908
  </script>
@@ -11,24 +11,40 @@ export interface IColumnConfigRequired {
11
11
  sortable?: boolean; // 该列是否允许排序,ture则表头弹窗会显示升降序按钮
12
12
  slotName?: string; // 如果要自定义,传入 slotName
13
13
  isAlwaysShow?: boolean; // 不可隐藏,显示设置中,该列不允许隐藏
14
- isColumnSearchAble?: boolean; // 列是否允许搜索,true则表头弹窗会多一个搜索框
14
+ /** 默认隐藏,显示设置中,该列默认隐藏 */
15
+ defaultHide?: boolean;
16
+ /** 列是否允许搜索,true则表头弹窗会多一个搜索框,一列中有多个搜索字段时传数组进行配置 */
17
+ search?: boolean | ISearchOptions
15
18
  summary?: boolean; // 是否可以显示该列的统计
16
19
  summaryMethod?: (values: any[]) => string | number; // 这一列的统计方法,values为该列的所有值
17
- // filters?: {value: string | number; text: string; [key: string]: any}[];
20
+ /** 过滤,传数组时默认复选框 */
21
+ filters?: {
22
+ type?: 'checkbox' | 'radio',
23
+ options: FiltersOption[]
24
+ default?: string | number | string[] | number[]
25
+ } | FiltersOption[]
18
26
  // 透传el-table column有的属性, https://element.eleme.cn/#/en-US/component/table#table-column-attributes
19
27
  [key: string]: any;
20
28
  }
21
29
 
30
+ type FiltersOption = { value: string | number; text: string; [key: string]: any }
31
+
32
+ type ISearchOptions = {
33
+ prop: string,
34
+ label: string,
35
+ validator?: (value: string) => boolean
36
+ }[]
37
+
22
38
  type IInputColumn = IColumnConfigRequired & {
23
39
  inputType: string | number;
24
40
  }
25
41
 
26
42
  type ISelectColumn = IColumnConfigRequired & {
27
- options: {key: string; value: string | number; [key: string]: any}[];
43
+ options: { key: string; value: string | number; [key: string]: any }[];
28
44
  }
29
45
 
30
- type IDateOnlyColumn = IColumnConfigRequired & {}
31
- type IDateTimeColumn = IColumnConfigRequired & {}
46
+ type IDateOnlyColumn = IColumnConfigRequired
47
+ type IDateTimeColumn = IColumnConfigRequired
32
48
 
33
49
  export type IColumnConfig = IInputColumn | ISelectColumn | IDateOnlyColumn | IDateTimeColumn
34
50
 
@@ -79,16 +95,22 @@ export interface IProps {
79
95
  leftFixedCount?: number;
80
96
  dragSemiRange?: number;
81
97
  loading?: boolean;
98
+ settingStorgeKey?: string
99
+ localSort?: boolean
100
+ localFilter?: boolean
101
+ currentPage: number
82
102
  }
83
103
 
84
104
  export interface IEmits {
85
105
  (e: 'selection-change', selection: any): void
86
- (e: 'row-bg-change', param: {colorId: number; row: ITableDataItem; rowIndex: number}): void
87
- (e: 'row-drag-drop', param: { row: any; fromIndex: number; toIndex: number; page: number; size: number;}): void
106
+ (e: 'row-bg-change', param: { colorId: number; row: ITableDataItem; rowIndex: number }): void
107
+ (e: 'row-drag-drop', param: { row: any; fromIndex: number; toIndex: number; page: number; size: number; }): void
88
108
  (e: 'row-delete', param: { row: any; index: number; page: number; size: number; }): void
89
- (e: 'row-edit', param: { row: any, index: number; page: number; size: number;}): void
90
- (e: 'row-pin-to-top', param: { row: any, rawIndex: number; page: number; size: number;}): void
109
+ (e: 'row-edit', param: { row: any, index: number; page: number; size: number; }): void
110
+ (e: 'row-pin-to-top', param: { row: any, rawIndex: number; page: number; size: number; }): void
91
111
  (e: 'row-edit-save', param: { page: number; size: number; row: any; changedData: Record<string, any>; }): void
92
- (e: 'row-edit-cancel', param: { row: any; page: number; size: number;}): void
112
+ (e: 'row-edit-cancel', param: { row: any; page: number; size: number; }): void
93
113
  (e: 'page-change', param: { page: number, size: number }): void
114
+ (e: 'search', param: Record<string, any>): void
115
+ (e: 'sort-change', param: { order: 'descending' | 'ascending' | null, prop: string }): void
94
116
  }