Table.js 5.07 KB
import template from "./Table.html";
import style from "antd/lib/table/style/index.css";

class Table {
    useModules = ["esNgAntd"];

    props = {
        columns: Array,
        dSource: Array,
        rowSelection: Object,
        rowKey: String,
        loading: Number,
        onChange: Function,
        size: String,
    };

    state = {
        size: this.props.size || "default",
        dataSource: [],
        selectedrecordKeys: [],
        selectedrecords: [],
        isSelectAll: false,
        rowKey: this.props.rowKey || "id",
        sortDirections: ["ascend", "descend"],
        sorter: {
            field: null,
            order: null,
        },
    };

    template = template;

    watch = {
        dSource: (newValue) => {
            if (newValue !== undefined) {
                let dataSource = [];
                newValue.forEach((record, index) => {
                    let row = {};
                    if (this.props.rowSelection) {
                        row.checked = false;
                        row.disabled = false;
                    }
                    if (
                        this.props.rowSelection &&
                        typeof this.props.rowSelection.getCheckboxProps ===
                            "function"
                    ) {
                        let extraAttr =
                            this.props.rowSelection.getCheckboxProps(record);
                        row = Object.assign(row, extraAttr);
                    }
                    this.props.columns.forEach((column) => {
                        // 排序
                        if (column.sortOrder) {
                            this.state.sorter.field = column.key;
                            this.state.sorter.order = column.sortOrder;
                        }
                        row[column.key] = column.render
                            ? column.render(record[column.key], record, index)
                            : record[column.key];
                    });
                    // 主键
                    if (this.props.rowKey !== undefined) {
                        row[this.state.rowKey] = record[this.state.rowKey];
                    } else {
                        row[this.state.rowKey] = index + 1;
                    }
                    dataSource[index] = row;
                });
                this.state.dataSource = dataSource;
            }
        },
        "rowSelection.selectedRowKeys": (newVal) => {
            if (Array.isArray(newVal)) {
                if (newVal.length > 0) {
                    this.state.dataSource.map(function (row, key) {
                        if (newVal.includes(key)) {
                            row.checked = true;
                        }
                    });
                } else {
                    this.state.dataSource.map(function (row) {
                        row.checked = false;
                    });
                }
            }
        },
    };

    constructor() {
        esNgAntd.createStyle("ant-table", style);
    }

    handleSelectAll(event) {
        this.state.isSelectAll = event.target.checked;
        this.state.selectedrecordKeys = [];
        this.state.selectedrecords = [];
        this.state.dataSource.map((record, key) => {
            if (record.disabled === false) {
                record.checked = event.target.checked;
            }
            if (record.checked) {
                this.state.selectedrecordKeys.push(key);
                this.state.selectedrecords.push(this.props.dSource[key]);
            }
            return record;
        });
        if (typeof this.props.rowSelection.onChange === "function") {
            this.props.rowSelection.onChange(
                this.state.selectedrecordKeys,
                this.state.selectedrecords
            );
        }
    }

    handleSelect(event, index) {
        let pos = this.state.selectedrecordKeys.findIndex(
            (value) => value === index
        );
        if (event.target.checked && pos === -1) {
            this.state.selectedrecordKeys.push(index);
            this.state.selectedrecords.push(this.props.dSource[index]);
        } else {
            this.state.selectedrecordKeys.splice(pos, 1);
            this.state.selectedrecords.splice(pos, 1);
        }
        if (this.state.selectedrecordKeys.length === 0) {
            this.state.isSelectAll = false;
        }
        if (typeof this.props.rowSelection.onChange === "function") {
            this.props.rowSelection.onChange(
                this.state.selectedrecordKeys,
                this.state.selectedrecords
            );
        }
    }

    handleSorter(key) {
        this.state.sorter.field = key;
        if (this.state.sorter.order === null) {
            this.state.sorter.order = "ascend";
        } else if (this.state.sorter.order === "ascend") {
            this.state.sorter.order = "descend";
        } else if (this.state.sorter.order === "descend") {
            this.state.sorter.order = null;
            this.state.sorter.field = null;
        }
        this.props.onChange({
            sorter: this.state.sorter,
        });
    }
}