mtable.jsx 10.2 KB
Newer Older
wuhao's avatar
wuhao committed
1
import React, { useEffect, useRef, useState, memo } from "react";
wuhao's avatar
wuhao committed
2
import { ProTable } from "@ant-design/pro-components";
wuhao's avatar
wuhao committed
3 4 5
import Resizecell from "./Resizecell";
import { Tooltip } from "antd";
import { doFetch } from "@/utils/doFetch";
wuhao's avatar
wuhao committed
6
import { useAsyncEffect } from "ahooks";
wuhao's avatar
wuhao committed
7
import bodyParse from "@/utils/bodyParse";
krysent's avatar
krysent committed
8
import { history } from "umi";
wuhao's avatar
wuhao committed
9 10 11 12 13 14 15 16 17 18 19 20 21 22
const Mtable = (props) => {
  const {
    actionRef, //表格动作
    formRef, //表单Ref
    rowKey, // key
    columns, //columns
    style, //style
    path, //接口地址
    extraparams, //额外参数
    pageSize, //修改默认pageSize
    pagination, //分页设置
    x, //横向滚动
    activeTabKey, //激活的tabKey 拖拽表格唯一标识使用 其他情况用不到
    refreshDep, //依赖刷新 (已废弃)
wuhao's avatar
wuhao committed
23
    getDefaultSelected, //存在默认选中向上返回选中值
wuhao's avatar
wuhao committed
24
  } = props;
wuhao's avatar
wuhao committed
25

wuhao's avatar
wuhao committed
26 27 28 29
  const actionRefs = actionRef ?? useRef(),
    formRefs = formRef ?? useRef(),
    ifspagination = pagination == "false" || pagination === false,
    [size, setsize] = useState("small"),
wuhao's avatar
wuhao committed
30
    [valueColumns, setvalueColumns] = useState({});
wuhao's avatar
wuhao committed
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
  const [columnes, setcolumnes] = useState(columns ?? []);

  //调用接口
  const request = async (params, sort, filter) => {
    if (!path) return;
    let newparams = {
      ...params,
      ...extraparams, //父组件传参
      pageIndex: params.current,
      pageSize: params.pageSize || pageSize,
    };
    delete newparams.current;
    if (ifspagination) {
      delete newparams.pageIndex;
      delete newparams.pageSize;
    }
    const result = await doFetch({ url: path, params: newparams });
    //分页结果
krysent's avatar
krysent committed
49
    let data = result?.data?.page?.records,
wuhao's avatar
wuhao committed
50 51 52 53 54 55 56
      success = true,
      total = result?.data?.page?.total;
    //不带分页获取结果
    if (ifspagination) {
      data = result?.data?.dataList;
      total = result?.data?.dataList?.length;
    }
wuhao's avatar
wuhao committed
57 58 59
    //存在默认选中向上返回选中值
    getDefaultSelected && getDefaultSelected(result?.data);

wuhao's avatar
wuhao committed
60 61 62 63
    return {
      data,
      success,
      total,
wuhao's avatar
wuhao committed
64
    };
wuhao's avatar
wuhao committed
65
  };
krysent's avatar
krysent committed
66

wuhao's avatar
wuhao committed
67 68 69
  //更新 columns
  useEffect(() => {
    setcolumnes((s) => {
wuhao's avatar
wuhao committed
70
      return columns.map((it, index) => {
wuhao's avatar
wuhao committed
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
        let itemwidth = valueColumns[it.key]?.width
          ? valueColumns[it.key].width
          : it.width
          ? it.width
          : 160;
        let options = {};
        if (it.valueType == "select" || it.valueType == "checkbox") {
          if (Array.isArray(it.options)) {
            options = {
              fieldProps: {
                options: [...it.options],
              },
            };
          } else if (it.options) {
            options = {
              request: async (params) => {
                console.log(it.options.database);
                let list = await it?.options?.database(
                  it.options?.params ?? {}
                );
                return list.data.dataList;
              },
            };
          }
        }
        if (it.valueType == "option") {
          options = {
            key: "option",
            dataIndex: "option",
            fixed: "right",
          };
        }
        if (!it.render) {
          options = {
            ...options,
            render: (text, row) => {
              return (
                <Tooltip title={row[it.dataIndex]} placement="topLeft">
                  <span className="table-cell">{row[it.dataIndex] ?? "-"}</span>
                </Tooltip>
              );
            },
          };
        }
wuhao's avatar
wuhao committed
115

wuhao's avatar
wuhao committed
116 117 118 119
        options = {
          ...options,
          width: itemwidth,
        };
wuhao's avatar
wuhao committed
120

wuhao's avatar
wuhao committed
121 122 123 124 125 126 127 128 129 130 131
        return {
          ...it,
          ...options,
          onHeaderCell: (column) => ({
            width: column.width ?? itemwidth,
            onResize: handleResize(index),
            onResizeStop: handleResizeStop(index),
          }),
        };
      });
    });
wuhao's avatar
wuhao committed
132
  }, [valueColumns]);
wuhao's avatar
wuhao committed
133 134

  //初始化操作数据
wuhao's avatar
wuhao committed
135
  const initDrage = async () => {
krysent's avatar
krysent committed
136 137
    console.log(valueColumns);

wuhao's avatar
wuhao committed
138
    if (!path) return;
krysent's avatar
krysent committed
139 140 141 142 143 144
    if (Object.keys(valueColumns).length !== 0) {
      console.log(valueColumns);
      return;
    }
    actionRefs?.current?.reset();

wuhao's avatar
wuhao committed
145
    let res = await doFetch({
wuhao's avatar
wuhao committed
146 147 148 149 150
      url: "/ngic-base-business/paFieldScene/queryContro",
      params: {
        sceneMark: extraparams
          ? path + bodyParse(extraparams)
          : activeTabKey
wuhao's avatar
wuhao committed
151 152
          ? path + activeTabKey
          : path,
wuhao's avatar
wuhao committed
153
      },
wuhao's avatar
wuhao committed
154 155
    });
    if (res.code == "0000") {
krysent's avatar
krysent committed
156 157 158
      // if (res?.data?.dataList?.length == 0) {
      //   setvalueColumns({});
      // }
wuhao's avatar
wuhao committed
159 160 161 162 163 164 165 166 167 168 169 170 171 172
      //datalist:接口返回状态
      let datalist = {};
      res?.data?.dataList &&
        res.data.dataList.map((it) => {
          const { fieldKey, fieldWidth, fieldOrder, fieldFixed, fieldShow } =
            it ?? {};
          datalist[fieldKey] = {
            width: fieldWidth,
            order: fieldOrder,
            fixed:
              fieldKey == "option" || fieldKey == "option_dataindex"
                ? "right"
                : fieldFixed,
            show: fieldShow,
wuhao's avatar
wuhao committed
173 174
          };
        });
wuhao's avatar
wuhao committed
175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194
      //allcol 默认状态设置 valueColumns 为columns全列设置
      let allcol = {};
      columns.map((it, i) => {
        if (it.valueType == "option") {
          allcol.option = {
            order: columns.length - 1,
            show: true,
            fixed: "right",
            ...datalist.option,
          };
        } else {
          allcol[it.key] = {
            order: i,
            show: true,
            ...datalist[it.key],
          };
        }
      });
      setvalueColumns(allcol);
    }
krysent's avatar
krysent committed
195
    // actionRefs?.current?.clearSelected();
196
    // actionRefs?.current?.reload();
wuhao's avatar
wuhao committed
197 198
  };

wuhao's avatar
wuhao committed
199
  //调用重新渲染表格
krysent's avatar
krysent committed
200 201
  useEffect(async () => {
    // console.log(history?.location?.pathname);
wuhao's avatar
wuhao committed
202
    await initDrage();
krysent's avatar
krysent committed
203 204 205 206 207 208 209
    setvalueColumns({});
  }, [extraparams, path, activeTabKey, refreshDep]);

  // useEffect(() => {
  //   actionRefs?.current?.reload();
  // }, [columns]);
  //
wuhao's avatar
wuhao committed
210
  //缩放表格
wuhao's avatar
wuhao committed
211
  const handleResize =
wuhao's avatar
wuhao committed
212
    (index) =>
wuhao's avatar
wuhao committed
213 214 215 216 217 218 219 220 221 222 223
    (e, { size }) => {
      e.stopImmediatePropagation();
      setcolumnes((s) => {
        const nextColumns = [...s];
        nextColumns[index] = {
          ...nextColumns[index],
          width: size.width,
        };
        return nextColumns;
      });
    };
wuhao's avatar
wuhao committed
224 225

  //更新表格缩放
wuhao's avatar
wuhao committed
226
  const handleResizeStop =
wuhao's avatar
wuhao committed
227
    (index) =>
wuhao's avatar
wuhao committed
228 229
    (e, { size }) => {
      e.stopImmediatePropagation();
wuhao's avatar
wuhao committed
230
      let submitdata = { ...valueColumns } ?? {},
wuhao's avatar
wuhao committed
231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252
        curkey = Object.keys(submitdata)[index];
      submitdata[curkey].width = parseInt(size.width);
      setvalueColumns(submitdata);
      doFetch({
        url: "/ngic-base-business/paFieldScene/save",
        params: {
          sceneMark: extraparams
            ? path + bodyParse(extraparams)
            : activeTabKey
            ? path + activeTabKey
            : path,
          controList: Object.keys(submitdata).map((it, i) => {
            return {
              fieldKey: it,
              fieldWidth:
                i == index ? parseInt(size.width) : submitdata[it].width,
              fieldOrder: submitdata[it].order,
              fieldFixed: submitdata[it].fixed,
              fieldShow: submitdata[it].show,
            };
          }),
        },
wuhao's avatar
wuhao committed
253 254
      });
    };
wuhao's avatar
wuhao committed
255

wuhao's avatar
wuhao committed
256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284
  return (
    <ProTable
      {...props}
      size={size}
      onSubmit={(params) => {
        console.log(params, "onSubmit");
      }}
      onSizeChange={(size) => {
        localStorage.setItem("size", size); //设置全局表格规格缓存
        setsize(size);
      }}
      columns={columnes ?? []}
      style={style || {}}
      actionRef={actionRefs}
      formRef={formRefs}
      rowKey={rowKey ?? "id"} //表格每行数据的key
      dateFormatter="string"
      request={request}
      scroll={{
        x: x ?? 1024,
      }}
      components={{
        header: {
          cell: Resizecell,
        },
      }}
      columnsState={{
        value: valueColumns,
        onChange: (val, state) => {
krysent's avatar
krysent committed
285 286 287 288 289 290 291 292
          console.log(val);
          if (Object.keys(val).length === 0) {
            console.log(val, valueColumns);
            setvalueColumns((s) => {
              let submitdata = {
                ...s,
                ...valueColumns,
              };
krysent's avatar
krysent committed
293
              console.log(submitdata);
krysent's avatar
krysent committed
294 295 296 297 298
              let controList = Object.keys(submitdata).map((it, i) => {
                return {
                  fieldKey: it,
                  fieldWidth: submitdata[it].width,
                  fieldOrder: i,
krysent's avatar
krysent committed
299
                  fieldFixed: "",
krysent's avatar
krysent committed
300 301 302 303 304 305 306 307 308 309 310 311 312 313 314
                  fieldShow: true,
                };
              });
              doFetch({
                url: "/ngic-base-business/paFieldScene/save",
                params: {
                  sceneMark: extraparams
                    ? path + bodyParse(extraparams)
                    : activeTabKey
                    ? path + activeTabKey
                    : path,
                  controList: controList,
                },
              });
              return controList;
wuhao's avatar
wuhao committed
315
            });
krysent's avatar
krysent committed
316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343
          } else {
            setvalueColumns((s) => {
              let submitdata = {
                ...s,
                ...val,
              };
              doFetch({
                url: "/ngic-base-business/paFieldScene/save",
                params: {
                  sceneMark: extraparams
                    ? path + bodyParse(extraparams)
                    : activeTabKey
                    ? path + activeTabKey
                    : path,
                  controList: Object.keys(submitdata).map((it) => {
                    return {
                      fieldKey: it,
                      fieldWidth: submitdata[it].width,
                      fieldOrder: submitdata[it].order,
                      fieldFixed: submitdata[it].fixed,
                      fieldShow: submitdata[it].show,
                    };
                  }),
                },
              });
              return submitdata;
            });
          }
wuhao's avatar
wuhao committed
344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362
        },
      }}
      pagination={
        ifspagination
          ? false
          : {
              showTotal: (total, range) => <span>{total}</span>,
              showQuickJumper: true,
              showSizeChanger: true,
              pageSizeOptions: [5, 10, 15, 30, 50, 100, 200],
              defaultPageSize: pageSize || 15,
            }
      }
      search={{
        filterType: "light", //轻量模式
      }}
    />
  );
};
wuhao's avatar
wuhao committed
363

wuhao's avatar
wuhao committed
364
export default memo(Mtable);