buli
2023-06-05 e9b970ea36eea5dcf93fd5b965bf13d7010ce0ad
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
import { LightningElement, api, track } from 'lwc';
 
const dateTableConfig_init = {
    // 如果存在,则用于行选择的复选框列将被隐藏。
    hideCheckboxColumn: false,
    // 指定未排序列的默认排序方向。有效选项包括“ asc”和“ desc”。默认值为“ asc”,用于按升序排序。
    defaultSortDirection: 'asc',
    // 指定排序方向。使用onsort事件处理程序对数据进行排序。有效选项包括“ asc”和“ desc”。
    sortDirection: 'asc',
    // 控制排序顺序的列字段名。使用onsort事件处理程序对数据进行排序
    sortedBy: undefined,
    // 是否后台接口排序
    sortInterfaces: true,
    // 搜索列
    searchColumns: [],
    // 搜索条件
    listQuery: {
        page: 1,
        limit: 10,
        sort: "",
        sortOrder: "",
        search: ""
    }, 
    // 分页
    page: {
        currentPage: 1,
        total: 0,
        pageSize: 10
    },
 
}
 
export default class BasicDatatable extends LightningElement {
    @api name;
    @api idkey = "Id";
    @api miniheight = "min-height: 250px";
    @api options = {};
    // 数据集
    @api tableData = [];
    @api tableIsLoding = false;
 
    connectedCallback(){
        this.initJzDataTable(this.options);
    }
 
    @track dataTableConfig = dateTableConfig_init;
 
    initJzDataTable(init){
        let searchParams = {};
        for(let obj of init.searchColumns){
            if(obj.value) searchParams[obj.name] = obj.value;
        }
        this.refreshDataTable(init);
    }
 
    @api
    refreshDataTable(init){
        init = init || {};
        // 定义搜索参数变量
        let listQuery = {};
        // 获取搜索信息 将搜索信息放入搜索变量中
        listQuery = {search: init.searchParams ? encodeURI(JSON.stringify(init.searchParams), 'utf-8') : this.dataTableConfig.listQuery.search};
        // 获取当前分页信息 将分页信息放入搜索条件中
        let page = init.page || this.dataTableConfig.page;
        listQuery = {...listQuery, page: page.currentPage, pageLimit: page.pageSize};
        // 将排序信息放入搜索条件中
        listQuery = {...listQuery, sortPlus: init.sortedBy || this.dataTableConfig.sortedBy, sortOrder: init.sortDirection || this.dataTableConfig.sortDirection };
        // 执行搜索获取数据
        // let data = await fetchDataHelper(listQuery);
        const getTableDataEvent = new CustomEvent('gettabledata', {
            detail: {listQuery: listQuery}
        });
        this.dispatchEvent(getTableDataEvent);
 
        // 将数据返回给表格中
        this.dataTableConfig = {...this.dataTableConfig, ...init, listQuery: listQuery, page: page};
    }
 
    // 点击排序
    onHandleSort(event) {
        const { fieldName: sortedBy, sortDirection } = event.detail;
        if(this.dataTableConfig.sortInterfaces){
            this.refreshDataTable({sortDirection,sortedBy});
        } else {
            const cloneData = [...this.tableData];
 
            cloneData.sort(this.sortBy(sortedBy, sortDirection === 'asc' ? 1 : -1));
            this.tableData = cloneData;
            this.dataTableConfig.sortDirection = sortDirection;
            this.dataTableConfig.sortedBy = sortedBy;
        }
    }
 
    sortBy(field, reverse, primer) {
        const key = primer
            ? function(x) {
                  return primer(x[field]);
              }
            : function(x) {
                  return x[field];
              };
 
        return function(a, b) {
            a = key(a);
            b = key(b);
            return reverse * ((a > b) - (b > a));
        };
    }
 
    get dataPlus(){
        return this.tableData;
    }
 
    get isLoading(){
        return this.tableIsLoding;
    }
 
    selecttionPlus(event){
        const getSearchParamsEvent = new CustomEvent('rowselection', {
            detail: {rows:event.detail.selectedRows}
        });
        this.dispatchEvent(getSearchParamsEvent);
    }
    handleSave(event)
    {
        const getSearchParamsEvent = new CustomEvent('save', {
            detail: {rows:event.detail.draftValues}
        });
        this.dispatchEvent(getSearchParamsEvent);
    }
 
}