@lx-frontend/wrap-element-ui 1.0.1-beta.2 → 1.0.1-beta.3

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 (32) hide show
  1. package/package.json +2 -3
  2. package/src/components/EditableTable/index.less +34 -26
  3. package/src/components/EditableTable/index.vue +108 -35
  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 +53 -1
  11. package/dist/AddMembers/index.vue.d.ts +0 -31
  12. package/dist/AuditSteps/index.vue.d.ts +0 -46
  13. package/dist/DemoComponent/index.vue.d.ts +0 -2
  14. package/dist/EditableTable/index.vue.d.ts +0 -186
  15. package/dist/EditableTable/types.d.ts +0 -123
  16. package/dist/EditableTable/useCellHover.d.ts +0 -11
  17. package/dist/EditableTable/useColumnHeaderOperation.d.ts +0 -106
  18. package/dist/EditableTable/useDefaultOperation.d.ts +0 -22
  19. package/dist/EditableTable/useDragSort.d.ts +0 -15
  20. package/dist/EditableTable/usePagination.d.ts +0 -13
  21. package/dist/EditableTable/useRowBgColor.d.ts +0 -16
  22. package/dist/EditableTable/useViewSetting.d.ts +0 -58
  23. package/dist/Ellipsis/MultilineEllipsis.vue.d.ts +0 -91
  24. package/dist/Ellipsis/index.vue.d.ts +0 -89
  25. package/dist/LxTable/index.vue.d.ts +0 -2
  26. package/dist/PopoverForm/index.vue.d.ts +0 -50
  27. package/dist/SearchForm/index.vue.d.ts +0 -105
  28. package/dist/SearchSelect/index.vue.d.ts +0 -53
  29. package/dist/index.css +0 -1
  30. package/dist/index.d.ts +0 -12
  31. package/dist/index.mjs +0 -40826
  32. package/dist/singleMessage/index.d.ts +0 -4
package/package.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "@lx-frontend/wrap-element-ui",
3
- "version": "1.0.1-beta.2",
3
+ "version": "1.0.1-beta.3",
4
4
  "description": "wrap-element-ui",
5
5
  "author": "",
6
- "main": "dist/index.mjs",
6
+ "main": "src/components/index.ts",
7
7
  "private": false,
8
8
  "scripts": {
9
9
  "clean": "rimraf dist",
@@ -18,7 +18,6 @@
18
18
  "lint": "eslint src"
19
19
  },
20
20
  "files": [
21
- "dist",
22
21
  "README.md",
23
22
  "package.json",
24
23
  "src/components"
@@ -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"
@@ -51,8 +55,9 @@
51
55
  <div class="view-setting__content-right-frize">
52
56
  冻结前
53
57
  <el-input
54
- v-model="leftFixedColumnCount"
55
58
  class="view-setting__content-right-input"
59
+ :value="tempLeftFixedColumnCount"
60
+ @input="handleInputTempLeftFixedColumnCount"
56
61
  />
57
62
 
58
63
  </div>
@@ -218,7 +223,7 @@
218
223
  :key="column.prop + index"
219
224
  resizable
220
225
  class-name="editable-table__data-column"
221
- :filtered-value="filteredValue[column.prop] || []"
226
+ :filtered-value="Array.isArray(filteredValue[column.prop]) ? filteredValue[column.prop] : []"
222
227
  v-bind="getColumnBindProps(column)"
223
228
  >
224
229
  <template
@@ -267,7 +272,7 @@
267
272
  </div>
268
273
  </div>
269
274
  <div
270
- v-if="column.isColumnSearchAble"
275
+ v-if="column.search && !Array.isArray(column.search)"
271
276
  class="sort-filter__search"
272
277
  >
273
278
  <div class="sort-filter__search-title">
@@ -279,19 +284,41 @@
279
284
  placeholder="请输入内容"
280
285
  />
281
286
  </div>
287
+
282
288
  <div
283
- v-if="column.filters && column.filters.length > 0"
289
+ v-if="column.search && Array.isArray(column.search)"
290
+ class="sort-filter__search"
291
+ style="display: flex;flex-direction: column;gap: 12px;"
292
+ >
293
+ <div
294
+ v-for="item in column.search"
295
+ :key="item.prop"
296
+ >
297
+ <div class="sort-filter__search-title">
298
+ {{ item.label }}
299
+ </div>
300
+ <el-input
301
+ v-model="tempSearchValue[item.prop]"
302
+ class="sort-filter__search-input"
303
+ placeholder="请输入内容"
304
+ />
305
+ </div>
306
+ </div>
307
+
308
+ <div
309
+ v-if="column.filters && ((Array.isArray(column.filters) ? column.filters : column.filters.options).length > 0)"
284
310
  class="sort-filter__filter"
285
311
  >
286
312
  <div class="sort-filter__filter-title">
287
313
  筛选
288
314
  </div>
289
315
  <el-checkbox-group
316
+ v-if="column.filters && (Array.isArray(column.filters) || column.filters.type === 'checkbox')"
290
317
  v-model="tempFilteredValue[column.prop]"
291
318
  class="sort-filter__filter-checkbox-group"
292
319
  >
293
320
  <el-checkbox
294
- v-for="item in column.filters"
321
+ v-for="item in (Array.isArray(column.filters) ? column.filters : column.filters.options)"
295
322
  :key="item.value"
296
323
  :label="item.value"
297
324
  class="sort-filter__filter-checkbox"
@@ -304,6 +331,25 @@
304
331
  </slot>
305
332
  </el-checkbox>
306
333
  </el-checkbox-group>
334
+
335
+ <el-radio-group
336
+ v-if="column.filters && !Array.isArray(column.filters) && column.filters.type === 'radio'"
337
+ v-model="tempFilteredValue[column.prop]"
338
+ style="display: flex;flex-direction: column;gap: 6px;"
339
+ >
340
+ <el-radio
341
+ v-for="item in column.filters.options"
342
+ :key="item.value"
343
+ :label="item.value"
344
+ >
345
+ <slot
346
+ :name="column.prop + '-filter-item'"
347
+ v-bind="item"
348
+ >
349
+ {{ item.text }}
350
+ </slot>
351
+ </el-radio>
352
+ </el-radio-group>
307
353
  </div>
308
354
  <div
309
355
  v-if="column.summary"
@@ -339,7 +385,7 @@
339
385
  <el-button
340
386
  class="sort-filter__confirm-btn"
341
387
  type="primary"
342
- @click="handleHeaderOperationConfirm(scope)"
388
+ @click="handleHeaderOperationConfirm(column, scope)"
343
389
  >
344
390
  确定
345
391
  </el-button>
@@ -538,7 +584,7 @@
538
584
  :page-sizes="[10, 15, 30, 60, 100]"
539
585
  :page-size.sync="pageSize"
540
586
  :pager-count="11"
541
- :current-page.sync="currentPage"
587
+ :current-page="currentPage"
542
588
  :total="total"
543
589
  @size-change="handlePageSizeChange"
544
590
  @current-change="handleCurrPageChange"
@@ -565,7 +611,7 @@ interface IProps {
565
611
  dataList: ITableDataItem[];
566
612
  /** 列配置 */
567
613
  columnConfig: IColumnConfig[];
568
- /** 是否展示展开行 */
614
+ /** 是否展示展开行 */
569
615
  hasExpandRow?: boolean;
570
616
  /** 是否展示序号 */
571
617
  hasIndexColumn?: boolean;
@@ -585,6 +631,16 @@ interface IProps {
585
631
  dragSemiRange?: number;
586
632
  /** 是否显示加载 */
587
633
  loading?: boolean;
634
+ /** 是否隐藏显示设置按钮 */
635
+ hideViewSettingBtn?: boolean
636
+ /** 设置的缓存的key */
637
+ settingStorgeKey?: string
638
+ /** 前端排序,默认关闭 */
639
+ localSort?: boolean
640
+ /** 前端过滤,默认关闭 */
641
+ localFilter?: boolean
642
+ /** 页码 */
643
+ currentPage: number
588
644
  }
589
645
 
590
646
  interface IEmits {
@@ -606,6 +662,10 @@ interface IEmits {
606
662
  (e: 'row-edit-cancel', param: { row: any; page: number; size: number;}): void
607
663
  /** 页码改变 */
608
664
  (e: 'page-change', param: { page: number, size: number }): void
665
+ /** 查询 */
666
+ (e: 'search', param: Record<string, any>): void
667
+ /** 排序 */
668
+ (e: 'sort-change', param: { order: 'descending' | 'ascending' | null, prop: string }): void
609
669
  }
610
670
 
611
671
  const props = withDefaults(defineProps<IProps>(), {
@@ -620,7 +680,12 @@ const props = withDefaults(defineProps<IProps>(), {
620
680
  colorList: () => [],
621
681
  leftFixedCount: 1,
622
682
  dragSemiRange: 15,
623
- loading: false
683
+ loading: false,
684
+ hideViewSettingBtn: false,
685
+ settingStorgeKey: '',
686
+ localSort: false,
687
+ localFilter: false,
688
+ currentPage: 1,
624
689
  })
625
690
 
626
691
  // 同defineProps一样,不支持泛型参数从外部导入
@@ -640,16 +705,14 @@ const actualColumns = computed(() => {
640
705
  isColumnSortable: rawItem.sortable,
641
706
  sortable: inSorting.value ? rawItem.sortable : false
642
707
  };
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);
708
+ if (cnt > 0) {
709
+ item.fixed = 'left';
710
+ // eslint-disable-next-line no-plusplus
711
+ cnt--;
712
+ } else {
713
+ item.fixed = undefined;
652
714
  }
715
+ res.push(item);
653
716
  }
654
717
 
655
718
  // 使用默认操作项,添加默认操作列。该列在编辑模式下隐藏
@@ -675,9 +738,8 @@ const beforePageChange = () => {
675
738
  }
676
739
  const {
677
740
  pageSize,
678
- currentPage,
679
741
  handleCurrPageChange,
680
- handlePageSizeChange
742
+ handlePageSizeChange,
681
743
  } = usePagination({
682
744
  emit,
683
745
  beforePageChange
@@ -717,7 +779,7 @@ const {
717
779
  emit,
718
780
  tableDomRef,
719
781
  pageSize,
720
- currentPage,
782
+ props,
721
783
  hasExpandRow: props.hasExpandRow
722
784
  })
723
785
 
@@ -727,6 +789,8 @@ const {
727
789
  columnsToBeShown,
728
790
  viewSettingVisible,
729
791
  leftFixedColumnCount,
792
+ tempLeftFixedColumnCount,
793
+ handleInputTempLeftFixedColumnCount,
730
794
  handleViewSettingShow,
731
795
  handleViewSettingClose,
732
796
  handleViewSettingConfirm
@@ -739,6 +803,9 @@ const {
739
803
 
740
804
  /************ 列头部操作相关 ************ */
741
805
  const {
806
+ setSort,
807
+ clearSort,
808
+ setSearchParams,
742
809
  isColumnHeadActive,
743
810
  handleSort,
744
811
  handleHeaderPopoverShow,
@@ -756,11 +823,13 @@ const {
756
823
  sortingColumn,
757
824
  isColumnFiltering,
758
825
  searchValue,
759
- inSorting
826
+ inSorting,
760
827
  } = useColumnHeaderOperation({
761
828
  tableDomRef,
762
829
  sortFilterPopoverRef,
763
- props
830
+ props,
831
+ emit,
832
+ showingColumns,
764
833
  })
765
834
 
766
835
  /************ 表格行拖拽和显示设置列拖拽 ************ */
@@ -787,7 +856,6 @@ useDragSort({
787
856
  props,
788
857
  viewSettingDragSortOptions,
789
858
  beforeDragStart,
790
- currentPage,
791
859
  pageSize,
792
860
  currScope,
793
861
  tableDomRef,
@@ -798,18 +866,10 @@ const doTableLayout = async () => {
798
866
  tableDomRef.value?.doLayout();
799
867
  }
800
868
 
801
- watch(
802
- () => props.columnConfig,
803
- (val) => {
804
- showingColumns.value = val.map(c => c.prop);
805
- },
806
- { immediate: true }
807
- )
808
-
809
869
  // 过滤出自定义属性,将其它属性全部透传给 el-table-column
810
870
  const getColumnBindProps = (column: IColumnConfig) => {
811
871
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
812
- const { editAble, editType, slotName, inputType, options, ...rest } = column;
872
+ const { editAble, editType, slotName, inputType, options, filters, ...rest } = column;
813
873
  return rest;
814
874
  }
815
875
 
@@ -832,7 +892,20 @@ const handleColumnClose = (item) => {
832
892
 
833
893
  defineExpose({
834
894
  closeAllExpandedRows,
835
- elTableRef: tableDomRef
895
+ openViewSetting: handleViewSettingShow,
896
+ elTableRef: tableDomRef,
897
+ setSort,
898
+ clearSort,
899
+ setSearchParams,
900
+ })
901
+
902
+ // loading 结束和页码变化时滚动到顶部
903
+ watch([
904
+ () => props.loading,
905
+ () => props.currentPage,
906
+ ], ([loading]) => {
907
+ if (loading) return;
908
+ tableDomRef.value.$el.querySelector('.el-table__body-wrapper').scrollTop = 0
836
909
  })
837
910
 
838
911
  </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
  }