Commit 7f97ea9cf65e0d74024a5e18c9ef2e2c88d7df08

Authored by chenxt
1 parent 117ad119

齿轮排序

src/components/Common/AffixMenu.js
... ... @@ -8,6 +8,8 @@ import config from '@/utils/config';
8 8 import * as commonFunc from '@/components/Common/commonFunc';
9 9 import AntdDraggableModal from '@/components/Common/AntdDraggableModal';
10 10 import SvgIcon from '../SvgIcon';
  11 +import { DndProvider, useDrag, useDrop } from 'react-dnd';
  12 +import { HTML5Backend } from 'react-dnd-html5-backend';
11 13  
12 14 const { Option } = Select;
13 15 const { TabPane } = Tabs;
... ... @@ -370,7 +372,48 @@ class AffixMenuComponent extends Component {
370 372 })
371 373 this.onInit();
372 374 }
  375 + moveRow = (dragIndex, hoverIndex, dataSourceKey) => {
  376 + const dataSource = this.state[dataSourceKey];
373 377  
  378 + // 确保 dataSource 是一个数组
  379 + if (!Array.isArray(dataSource)) {
  380 + console.error(`dataSource for key ${dataSourceKey} is not an array.`, dataSource);
  381 + return;
  382 + }
  383 +
  384 + // 确保索引在合法范围内
  385 + if (
  386 + dragIndex < 0 ||
  387 + dragIndex >= dataSource.length ||
  388 + hoverIndex < 0 ||
  389 + hoverIndex >= dataSource.length ||
  390 + dragIndex === hoverIndex
  391 + ) {
  392 + console.warn('Invalid indices for moveRow:', dragIndex, hoverIndex);
  393 + return;
  394 + }
  395 +
  396 + // const newData = update(dataSource, {
  397 + // $splice: [
  398 + // [dragIndex, 1], // 从 dragIndex 位置移除 1 个元素
  399 + // [hoverIndex, 0, dataSource[dragIndex]], // 在 hoverIndex 位置插入移除的元素
  400 + // ],
  401 + // });
  402 + // 创建一个新的数组来存储更新后的数据
  403 + const newData = [...dataSource];
  404 + // 移除 dragIndex 位置的元素
  405 + const [removed] = newData.splice(dragIndex, 1);
  406 + // 在 hoverIndex 位置插入移除的元素
  407 + newData.splice(hoverIndex, 0, removed);
  408 +
  409 + // 更新 iOrder 字段,使其与新的顺序一致
  410 + newData.forEach((item, index) => {
  411 + // 根据索引来更新 iOrder,使用 index + 1 因为排序通常从1开始,而不是0
  412 + newData[index].iOrder = (index + 1);
  413 + });
  414 +
  415 + this.setState({ [dataSourceKey]: newData });
  416 + };
374 417 render() {
375 418 const { modalData, roleShow } = this.state;
376 419 const { app, sTabId, sModelsType } = this.props;
... ... @@ -400,12 +443,21 @@ class AffixMenuComponent extends Component {
400 443 const configName = commonUtils.isNotEmptyArr(splitArr) ? splitArr[0] : '';
401 444 const configId = commonUtils.isNotEmptyArr(splitArr) ? splitArr[1] : '';
402 445 let childTable = '';
403   - let dataSource = [];
404   - if (commonUtils.isNotEmptyObject(configId)) { /* 从缓存中取宽度 */
405   - dataSource = this.state[`modalContentData_${configId}`];
406   - } else {
407   - dataSource = this.state[`modalContentData${count}`];
  446 + // let dataSource = [];
  447 + // if (commonUtils.isNotEmptyObject(configId)) { /* 从缓存中取宽度 */
  448 + // dataSource = this.state[`modalContentData_${configId}`];
  449 + // } else {
  450 + // dataSource = this.state[`modalContentData${count}`];
  451 + // }
  452 + let dataSourceKey = `modalContentData${count}`;
  453 + if (commonUtils.isNotEmptyObject(configId)) {
  454 + dataSourceKey = `modalContentData_${configId}`;
408 455 }
  456 + let dataSource = this.state[dataSourceKey] || [];
  457 + dataSource.forEach((item, index) => {
  458 + // 根据索引来更新 iOrder,使用 index + 1 因为排序通常从1开始,而不是0
  459 + dataSource[index].iOrder = (index + 1) * 10;
  460 + });
409 461 dataSource?.forEach((item, index) => {
410 462 // 根据索引来更新 iOrder,使用 index + 1 因为排序通常从1开始,而不是0
411 463 dataSource[index].iOrder = (index + 1) * 10;
... ... @@ -510,21 +562,28 @@ class AffixMenuComponent extends Component {
510 562 {checkBoxShow}
511 563 &nbsp;&nbsp;&nbsp;
512 564 {checkAll}
513   - <Table
514   - bordered
515   - columns={columns}
516   - components={components}
517   - dataSource={dataSource_dep}
518   - pagination={false}
519   - scroll={{ y: 310 }}
520   - className={styles.affixMenuTable}
521   - />
  565 + <DndProvider backend={HTML5Backend}>
  566 + <Table
  567 + bordered
  568 + columns={columns}
  569 + dataSource={dataSource}
  570 + components={components}
  571 + onRow={(record, index) => ({
  572 + index,
  573 + moveRow: (dragIndex, hoverIndex) => this.moveRow(dragIndex, hoverIndex, dataSourceKey),
  574 + })}
  575 + pagination={false}
  576 + scroll={{ y: 310 }}
  577 + className={styles.affixMenuTable}
  578 + />
  579 + </DndProvider>
522 580 </div>
523 581 </TabPane>
524 582 );
525 583 modalContent.push(childTable);
526 584 count += 1;
527 585 });
  586 +
528 587 return (
529 588 <div>
530 589 <Affix offsetTop={this.state.top} style={{ position: 'absolute', top: 50, left: 1000 }}>
... ...