Showing
6 changed files
with
145 additions
and
101 deletions
| @@ -28,11 +28,11 @@ | @@ -28,11 +28,11 @@ | ||
| 28 | "@antv/x6": "^1.34.6", | 28 | "@antv/x6": "^1.34.6", |
| 29 | "@antv/x6-react-shape": "^1.6.0", | 29 | "@antv/x6-react-shape": "^1.6.0", |
| 30 | "@formulajs/formulajs": "^3.1.7", | 30 | "@formulajs/formulajs": "^3.1.7", |
| 31 | - "@qx/common": "0.2.12-beta.5", | 31 | + "@qx/common": "^0.2.13", |
| 32 | "@qx/form-design": "^0.0.35", | 32 | "@qx/form-design": "^0.0.35", |
| 33 | - "@qx/form-render": "0.0.51", | 33 | + "@qx/form-render": "^0.0.60", |
| 34 | "@qx/utils": "^0.0.37", | 34 | "@qx/utils": "^0.0.37", |
| 35 | - "@qx/view-render": "0.1.9-beta.19", | 35 | + "@qx/view-render": "0.1.19", |
| 36 | "@tinymce/tinymce-react": "^4.2.0", | 36 | "@tinymce/tinymce-react": "^4.2.0", |
| 37 | "ahooks": "^3.7.2", | 37 | "ahooks": "^3.7.2", |
| 38 | "antd": "^4.24.1", | 38 | "antd": "^4.24.1", |
| 1 | -// import { QIXIAO_TOKEN } from '@/libs/token'; | 1 | +import { QIXIAO_TOKEN } from '@/libs/token'; |
| 2 | import { SYSTEM_WIDGETS } from '@/packages/qx-form-generator/src/utils/common'; | 2 | import { SYSTEM_WIDGETS } from '@/packages/qx-form-generator/src/utils/common'; |
| 3 | import QxIcon from '@/packages/qx-icon'; | 3 | import QxIcon from '@/packages/qx-icon'; |
| 4 | import { RelMoreModal, RelSingleModal } from '@/pages/app-view/form'; | 4 | import { RelMoreModal, RelSingleModal } from '@/pages/app-view/form'; |
| @@ -43,7 +43,7 @@ interface QxRuntimeTableProps { | @@ -43,7 +43,7 @@ interface QxRuntimeTableProps { | ||
| 43 | sort?: any[]; | 43 | sort?: any[]; |
| 44 | onChange?: (pagination: any, filters: any, sorter: any) => void; | 44 | onChange?: (pagination: any, filters: any, sorter: any) => void; |
| 45 | [propName: string]: any; | 45 | [propName: string]: any; |
| 46 | - bodyHeight?: number; | 46 | + bodyHeight?: number |
| 47 | } | 47 | } |
| 48 | 48 | ||
| 49 | const QxRuntimeTable: React.FC<QxRuntimeTableProps> = (props) => { | 49 | const QxRuntimeTable: React.FC<QxRuntimeTableProps> = (props) => { |
| @@ -84,15 +84,11 @@ const QxRuntimeTable: React.FC<QxRuntimeTableProps> = (props) => { | @@ -84,15 +84,11 @@ const QxRuntimeTable: React.FC<QxRuntimeTableProps> = (props) => { | ||
| 84 | return customAlphabet('abcdefghijklmnopqistuvwxyz', 6)(); | 84 | return customAlphabet('abcdefghijklmnopqistuvwxyz', 6)(); |
| 85 | } | 85 | } |
| 86 | 86 | ||
| 87 | - const handleCellClick = ( | ||
| 88 | - record: any, | ||
| 89 | - schemaData: QxTableCellAPISchema, | ||
| 90 | - info?: any, | ||
| 91 | - ) => { | 87 | + const handleCellClick = (record: any, schemaData: QxTableCellAPISchema, info?: any) => { |
| 92 | // console.log(record,schemaData,info) | 88 | // console.log(record,schemaData,info) |
| 93 | setRowData(record); //点击行的数据 | 89 | setRowData(record); //点击行的数据 |
| 94 | setCellSchema(schemaData); //列的schema | 90 | setCellSchema(schemaData); //列的schema |
| 95 | - setClickInfo(info || ''); // 点击标签的data_title id | 91 | + setClickInfo(info || '') // 点击标签的data_title id |
| 96 | setRandom(getId()); | 92 | setRandom(getId()); |
| 97 | }; | 93 | }; |
| 98 | 94 | ||
| @@ -104,10 +100,7 @@ const QxRuntimeTable: React.FC<QxRuntimeTableProps> = (props) => { | @@ -104,10 +100,7 @@ const QxRuntimeTable: React.FC<QxRuntimeTableProps> = (props) => { | ||
| 104 | //1、关联记录以标签显示的时候,直接弹出该条数据详情 | 100 | //1、关联记录以标签显示的时候,直接弹出该条数据详情 |
| 105 | //2、关联记录以表格显示的时候,弹出关联记录表格 | 101 | //2、关联记录以表格显示的时候,弹出关联记录表格 |
| 106 | if (cellSchema?.widget === 'relSelector') { | 102 | if (cellSchema?.widget === 'relSelector') { |
| 107 | - if ( | ||
| 108 | - cellSchema?.mode === 'TABLE' && | ||
| 109 | - (rowData[cellSchema?.dataIndex] || []).length | ||
| 110 | - ) { | 103 | + if (cellSchema?.mode === 'TABLE' && (rowData[cellSchema?.dataIndex] || []).length) { |
| 111 | //关联记录 表格形式 | 104 | //关联记录 表格形式 |
| 112 | relMoreModalRef.current.open({ | 105 | relMoreModalRef.current.open({ |
| 113 | appCode: appCode, | 106 | appCode: appCode, |
| @@ -135,10 +128,7 @@ const QxRuntimeTable: React.FC<QxRuntimeTableProps> = (props) => { | @@ -135,10 +128,7 @@ const QxRuntimeTable: React.FC<QxRuntimeTableProps> = (props) => { | ||
| 135 | modalTitle: clickInfo?.data_title, //表名 | 128 | modalTitle: clickInfo?.data_title, //表名 |
| 136 | }); | 129 | }); |
| 137 | } | 130 | } |
| 138 | - } else if ( | ||
| 139 | - cellSchema?.widget === 'subform' && | ||
| 140 | - cellSchema?.type === 'TABLE' | ||
| 141 | - ) { | 131 | + } else if (cellSchema?.widget === 'subform' && cellSchema?.type === 'TABLE') { |
| 142 | //子表 | 132 | //子表 |
| 143 | relMoreModalRef.current.open({ | 133 | relMoreModalRef.current.open({ |
| 144 | appCode: appCode, | 134 | appCode: appCode, |
| @@ -171,7 +161,7 @@ const QxRuntimeTable: React.FC<QxRuntimeTableProps> = (props) => { | @@ -171,7 +161,7 @@ const QxRuntimeTable: React.FC<QxRuntimeTableProps> = (props) => { | ||
| 171 | max={props.max} | 161 | max={props.max} |
| 172 | sort={props?.sort} | 162 | sort={props?.sort} |
| 173 | onPage={props?.onPage} | 163 | onPage={props?.onPage} |
| 174 | - // QIXIAO_TOKEN={QIXIAO_TOKEN} | 164 | + QIXIAO_TOKEN={QIXIAO_TOKEN} |
| 175 | /> | 165 | /> |
| 176 | <RelMoreModal cRef={relMoreModalRef} /> | 166 | <RelMoreModal cRef={relMoreModalRef} /> |
| 177 | <RelSingleModal cRef={relSingleModalRef} /> | 167 | <RelSingleModal cRef={relSingleModalRef} /> |
| @@ -274,26 +264,23 @@ const QxRuntimeTree: React.FC<QxRuntimeTreeProps> = (props) => { | @@ -274,26 +264,23 @@ const QxRuntimeTree: React.FC<QxRuntimeTreeProps> = (props) => { | ||
| 274 | }); | 264 | }); |
| 275 | }; | 265 | }; |
| 276 | 266 | ||
| 277 | - const generateTreeData = useCallback( | ||
| 278 | - (_data: any[], _keywords?: string): any[] => { | ||
| 279 | - const _treeNode: any[] = []; | ||
| 280 | - _data.map((item) => { | ||
| 281 | - if (typeof item.visible === 'boolean' && !item.visible) { | ||
| 282 | - return; | ||
| 283 | - } | ||
| 284 | - const _item: any = { | ||
| 285 | - ...item, | ||
| 286 | - children: [], | ||
| 287 | - }; | ||
| 288 | - if (item.children) { | ||
| 289 | - _item.children = generateTreeData(item.children, _keywords); | ||
| 290 | - } | ||
| 291 | - _treeNode.push(_item); | ||
| 292 | - }); | ||
| 293 | - return _treeNode; | ||
| 294 | - }, | ||
| 295 | - [], | ||
| 296 | - ); | 267 | + const generateTreeData = useCallback((_data: any[], _keywords?: string): any[] => { |
| 268 | + const _treeNode: any[] = []; | ||
| 269 | + _data.map((item) => { | ||
| 270 | + if (typeof item.visible === 'boolean' && !item.visible) { | ||
| 271 | + return; | ||
| 272 | + } | ||
| 273 | + const _item: any = { | ||
| 274 | + ...item, | ||
| 275 | + children: [], | ||
| 276 | + }; | ||
| 277 | + if (item.children) { | ||
| 278 | + _item.children = generateTreeData(item.children, _keywords); | ||
| 279 | + } | ||
| 280 | + _treeNode.push(_item); | ||
| 281 | + }); | ||
| 282 | + return _treeNode; | ||
| 283 | + }, []); | ||
| 297 | 284 | ||
| 298 | const filter = (word: string) => { | 285 | const filter = (word: string) => { |
| 299 | setKeyword(word); | 286 | setKeyword(word); |
| @@ -429,9 +416,7 @@ const QxRuntimeTree: React.FC<QxRuntimeTreeProps> = (props) => { | @@ -429,9 +416,7 @@ const QxRuntimeTree: React.FC<QxRuntimeTreeProps> = (props) => { | ||
| 429 | 416 | ||
| 430 | // 渲染节点 | 417 | // 渲染节点 |
| 431 | const renderTitle = (nodeData: any) => { | 418 | const renderTitle = (nodeData: any) => { |
| 432 | - const btnList = ( | ||
| 433 | - treeSchema?.tree?.action?.renderData?.buttons || [] | ||
| 434 | - ).filter((item: any) => { | 419 | + const btnList = (treeSchema?.tree?.action?.renderData?.buttons || []).filter((item: any) => { |
| 435 | if (!!nodeData?.extract?.[item.flag]) { | 420 | if (!!nodeData?.extract?.[item.flag]) { |
| 436 | return item; | 421 | return item; |
| 437 | } | 422 | } |
| @@ -472,9 +457,7 @@ const QxRuntimeTree: React.FC<QxRuntimeTreeProps> = (props) => { | @@ -472,9 +457,7 @@ const QxRuntimeTree: React.FC<QxRuntimeTreeProps> = (props) => { | ||
| 472 | <Menu> | 457 | <Menu> |
| 473 | {_.drop(btnList, MAX).map((val: any) => { | 458 | {_.drop(btnList, MAX).map((val: any) => { |
| 474 | return ( | 459 | return ( |
| 475 | - <Menu.Item key={val.code}> | ||
| 476 | - {getBtnDom(val, nodeData, treeSchema)} | ||
| 477 | - </Menu.Item> | 460 | + <Menu.Item key={val.code}>{getBtnDom(val, nodeData, treeSchema)}</Menu.Item> |
| 478 | ); | 461 | ); |
| 479 | })} | 462 | })} |
| 480 | </Menu> | 463 | </Menu> |
| @@ -492,10 +475,7 @@ const QxRuntimeTree: React.FC<QxRuntimeTreeProps> = (props) => { | @@ -492,10 +475,7 @@ const QxRuntimeTree: React.FC<QxRuntimeTreeProps> = (props) => { | ||
| 492 | }; | 475 | }; |
| 493 | 476 | ||
| 494 | return ( | 477 | return ( |
| 495 | - <div | ||
| 496 | - className={'qx-tree-list'} | ||
| 497 | - style={{ padding: '20px', backgroundColor: '#fff' }} | ||
| 498 | - > | 478 | + <div className={'qx-tree-list'} style={{ padding: '20px', backgroundColor: '#fff' }}> |
| 499 | {data && data.length > 0 && treeSchema?.tree?.searchSwitch && ( | 479 | {data && data.length > 0 && treeSchema?.tree?.searchSwitch && ( |
| 500 | <Input | 480 | <Input |
| 501 | className={'qx-selector-sub-search'} | 481 | className={'qx-selector-sub-search'} |
| @@ -545,10 +525,7 @@ const QxRuntimeTree: React.FC<QxRuntimeTreeProps> = (props) => { | @@ -545,10 +525,7 @@ const QxRuntimeTree: React.FC<QxRuntimeTreeProps> = (props) => { | ||
| 545 | onExpand={(keys) => setExpandedKeys(keys)} | 525 | onExpand={(keys) => setExpandedKeys(keys)} |
| 546 | /> | 526 | /> |
| 547 | ) : ( | 527 | ) : ( |
| 548 | - <Empty | ||
| 549 | - className={'qx-tree-list__empty'} | ||
| 550 | - image={Empty.PRESENTED_IMAGE_SIMPLE} | ||
| 551 | - /> | 528 | + <Empty className={'qx-tree-list__empty'} image={Empty.PRESENTED_IMAGE_SIMPLE} /> |
| 552 | )} | 529 | )} |
| 553 | </> | 530 | </> |
| 554 | </div> | 531 | </div> |
| @@ -596,8 +573,7 @@ const QxQuickSearchTabs: React.FC<QxQuickSearchTabsProps> = (props: any) => { | @@ -596,8 +573,7 @@ const QxQuickSearchTabs: React.FC<QxQuickSearchTabsProps> = (props: any) => { | ||
| 596 | setScroll(SCROLL.start); | 573 | setScroll(SCROLL.start); |
| 597 | } else if (Math.abs(Number(translateNum)) > 0) { | 574 | } else if (Math.abs(Number(translateNum)) > 0) { |
| 598 | if ( | 575 | if ( |
| 599 | - Math.abs(Number(translateNum)) == | ||
| 600 | - Math.abs(tabsDom?.offsetWidth - tabsDom?.scrollWidth) | 576 | + Math.abs(Number(translateNum)) == Math.abs(tabsDom?.offsetWidth - tabsDom?.scrollWidth) |
| 601 | ) { | 577 | ) { |
| 602 | setScroll(SCROLL.end); | 578 | setScroll(SCROLL.end); |
| 603 | } else { | 579 | } else { |
| @@ -614,19 +590,15 @@ const QxQuickSearchTabs: React.FC<QxQuickSearchTabsProps> = (props: any) => { | @@ -614,19 +590,15 @@ const QxQuickSearchTabs: React.FC<QxQuickSearchTabsProps> = (props: any) => { | ||
| 614 | const tabItemWidth = e.currentTarget.clientWidth; | 590 | const tabItemWidth = e.currentTarget.clientWidth; |
| 615 | const tabsDom: any = document?.getElementById('quickSearchTabs'); | 591 | const tabsDom: any = document?.getElementById('quickSearchTabs'); |
| 616 | const translate = tabsDom.style?.transform; | 592 | const translate = tabsDom.style?.transform; |
| 617 | - const translateNum = Math.abs( | ||
| 618 | - Number(translate.split('(').pop().split('p').shift() || 0), | ||
| 619 | - ); | ||
| 620 | - let widget = | ||
| 621 | - translateNum + tabsDom.clientWidth - (tabItemLeft + tabItemWidth); | 593 | + const translateNum = Math.abs(Number(translate.split('(').pop().split('p').shift() || 0)); |
| 594 | + let widget = translateNum + tabsDom.clientWidth - (tabItemLeft + tabItemWidth); | ||
| 622 | if (widget > 0) { | 595 | if (widget > 0) { |
| 623 | if (translateNum === 0) { | 596 | if (translateNum === 0) { |
| 624 | tabsDom.style.cssText = 'transform: translate(0px,0px);'; | 597 | tabsDom.style.cssText = 'transform: translate(0px,0px);'; |
| 625 | } else { | 598 | } else { |
| 626 | widget = index > 0 ? tabItemLeft + 20 : tabItemLeft; | 599 | widget = index > 0 ? tabItemLeft + 20 : tabItemLeft; |
| 627 | if (translateNum > tabItemLeft) { | 600 | if (translateNum > tabItemLeft) { |
| 628 | - tabsDom.style.cssText = | ||
| 629 | - 'transform: translate(' + -widget + 'px,0px);'; | 601 | + tabsDom.style.cssText = 'transform: translate(' + -widget + 'px,0px);'; |
| 630 | } | 602 | } |
| 631 | } | 603 | } |
| 632 | } else if (widget < 0) { | 604 | } else if (widget < 0) { |
| @@ -641,9 +613,7 @@ const QxQuickSearchTabs: React.FC<QxQuickSearchTabsProps> = (props: any) => { | @@ -641,9 +613,7 @@ const QxQuickSearchTabs: React.FC<QxQuickSearchTabsProps> = (props: any) => { | ||
| 641 | const scrollPrev = () => { | 613 | const scrollPrev = () => { |
| 642 | const tabsDom: any = document?.getElementById('quickSearchTabs'); | 614 | const tabsDom: any = document?.getElementById('quickSearchTabs'); |
| 643 | const translate = tabsDom.style?.transform; | 615 | const translate = tabsDom.style?.transform; |
| 644 | - const translateNum = Math.abs( | ||
| 645 | - Number(translate.split('(').pop().split('p').shift() || 0), | ||
| 646 | - ); | 616 | + const translateNum = Math.abs(Number(translate.split('(').pop().split('p').shift() || 0)); |
| 647 | let widget = translateNum - tabsDom?.offsetWidth; | 617 | let widget = translateNum - tabsDom?.offsetWidth; |
| 648 | if (widget < 0) { | 618 | if (widget < 0) { |
| 649 | widget = 0; | 619 | widget = 0; |
| @@ -657,9 +627,7 @@ const QxQuickSearchTabs: React.FC<QxQuickSearchTabsProps> = (props: any) => { | @@ -657,9 +627,7 @@ const QxQuickSearchTabs: React.FC<QxQuickSearchTabsProps> = (props: any) => { | ||
| 657 | const scrollNext = () => { | 627 | const scrollNext = () => { |
| 658 | const tabsDom: any = document?.getElementById('quickSearchTabs'); | 628 | const tabsDom: any = document?.getElementById('quickSearchTabs'); |
| 659 | const translate = tabsDom.style?.transform; | 629 | const translate = tabsDom.style?.transform; |
| 660 | - const translateNum = Math.abs( | ||
| 661 | - Number(translate.split('(').pop().split('p').shift() || 0), | ||
| 662 | - ); | 630 | + const translateNum = Math.abs(Number(translate.split('(').pop().split('p').shift() || 0)); |
| 663 | let widget = translateNum + tabsDom?.offsetWidth; | 631 | let widget = translateNum + tabsDom?.offsetWidth; |
| 664 | if (widget > Math.abs(tabsDom?.offsetWidth - tabsDom?.scrollWidth)) { | 632 | if (widget > Math.abs(tabsDom?.offsetWidth - tabsDom?.scrollWidth)) { |
| 665 | widget = Math.abs(tabsDom?.offsetWidth - tabsDom?.scrollWidth); | 633 | widget = Math.abs(tabsDom?.offsetWidth - tabsDom?.scrollWidth); |
| @@ -696,9 +664,7 @@ const QxQuickSearchTabs: React.FC<QxQuickSearchTabsProps> = (props: any) => { | @@ -696,9 +664,7 @@ const QxQuickSearchTabs: React.FC<QxQuickSearchTabsProps> = (props: any) => { | ||
| 696 | <Button | 664 | <Button |
| 697 | className={'left-button'} | 665 | className={'left-button'} |
| 698 | type="text" | 666 | type="text" |
| 699 | - icon={ | ||
| 700 | - <QxIcon type={'icon-tag-left-translate'} style={{ fontSize: 10 }} /> | ||
| 701 | - } | 667 | + icon={<QxIcon type={'icon-tag-left-translate'} style={{ fontSize: 10 }} />} |
| 702 | disabled={scroll == SCROLL.start} | 668 | disabled={scroll == SCROLL.start} |
| 703 | onClick={scrollPrev} | 669 | onClick={scrollPrev} |
| 704 | /> | 670 | /> |
| @@ -734,12 +700,7 @@ const QxQuickSearchTabs: React.FC<QxQuickSearchTabsProps> = (props: any) => { | @@ -734,12 +700,7 @@ const QxQuickSearchTabs: React.FC<QxQuickSearchTabsProps> = (props: any) => { | ||
| 734 | <Button | 700 | <Button |
| 735 | className={'right-button'} | 701 | className={'right-button'} |
| 736 | type="text" | 702 | type="text" |
| 737 | - icon={ | ||
| 738 | - <QxIcon | ||
| 739 | - type={'icon-tag-right-translate'} | ||
| 740 | - style={{ fontSize: 10 }} | ||
| 741 | - /> | ||
| 742 | - } | 703 | + icon={<QxIcon type={'icon-tag-right-translate'} style={{ fontSize: 10 }} />} |
| 743 | disabled={scroll == SCROLL.end} | 704 | disabled={scroll == SCROLL.end} |
| 744 | onClick={scrollNext} | 705 | onClick={scrollNext} |
| 745 | /> | 706 | /> |
| @@ -62,8 +62,11 @@ function loopSchema( | @@ -62,8 +62,11 @@ function loopSchema( | ||
| 62 | callbacks?: any, // 关联记录表格展示时,存储操作按钮的回调函数 | 62 | callbacks?: any, // 关联记录表格展示时,存储操作按钮的回调函数 |
| 63 | _isVirtualListExit?: boolean, | 63 | _isVirtualListExit?: boolean, |
| 64 | isDataSet = false, //代表是否为聚合表,聚合表查询的currentFunCode需要为relFunCode | 64 | isDataSet = false, //代表是否为聚合表,聚合表查询的currentFunCode需要为relFunCode |
| 65 | + merge_field?: string, | ||
| 65 | ) { | 66 | ) { |
| 66 | - const properties = schema.properties; | 67 | + const properties = merge_field?.startsWith('merge|') |
| 68 | + ? schema | ||
| 69 | + : schema.properties; | ||
| 67 | if (!properties) { | 70 | if (!properties) { |
| 68 | return; | 71 | return; |
| 69 | } | 72 | } |
| @@ -76,9 +79,15 @@ function loopSchema( | @@ -76,9 +79,15 @@ function loopSchema( | ||
| 76 | property.default_init = true; | 79 | property.default_init = true; |
| 77 | } | 80 | } |
| 78 | const { widget } = property; | 81 | const { widget } = property; |
| 82 | + if (merge_field?.startsWith('merge|')) { | ||
| 83 | + property.belongRelForm = true; | ||
| 84 | + property.relformKey = merge_field.split('|')[1]; | ||
| 85 | + property.readOnly = true; | ||
| 86 | + } | ||
| 79 | 87 | ||
| 80 | if (typeof property.auth === 'boolean' && property.auth === false) { | 88 | if (typeof property.auth === 'boolean' && property.auth === false) { |
| 81 | property.hidden = true; | 89 | property.hidden = true; |
| 90 | + property.bind = false; | ||
| 82 | // 仅有一个子元素且子元素被隐藏时,隐藏父元素 | 91 | // 仅有一个子元素且子元素被隐藏时,隐藏父元素 |
| 83 | if (type === 'view' && Object.keys(properties).length === 1) { | 92 | if (type === 'view' && Object.keys(properties).length === 1) { |
| 84 | schema.hidden = true; | 93 | schema.hidden = true; |
| @@ -568,6 +577,18 @@ function loopSchema( | @@ -568,6 +577,18 @@ function loopSchema( | ||
| 568 | property.qxProps.currentFunCode = param.referQuery?.funCode; | 577 | property.qxProps.currentFunCode = param.referQuery?.funCode; |
| 569 | property.props.isSub = true; | 578 | property.props.isSub = true; |
| 570 | delete property.items; | 579 | delete property.items; |
| 580 | + } else if (key.indexOf('_merge_field') > -1) { | ||
| 581 | + loopSchema( | ||
| 582 | + property.children, | ||
| 583 | + param, | ||
| 584 | + callback, | ||
| 585 | + undefined, | ||
| 586 | + type, | ||
| 587 | + '', | ||
| 588 | + isVirtualListExit, | ||
| 589 | + false, | ||
| 590 | + 'merge|' + property.relformKey, | ||
| 591 | + ); | ||
| 571 | } | 592 | } |
| 572 | 593 | ||
| 573 | // 处理关联属性 | 594 | // 处理关联属性 |
| @@ -869,6 +890,20 @@ export const handleEditFormSchema = ( | @@ -869,6 +890,20 @@ export const handleEditFormSchema = ( | ||
| 869 | property.default = _data[key]; | 890 | property.default = _data[key]; |
| 870 | property.defaultData = _data[key + '_info_'] || []; | 891 | property.defaultData = _data[key + '_info_'] || []; |
| 871 | } | 892 | } |
| 893 | + if (property.originWidget === 'subform') { | ||
| 894 | + Object.keys(property.items.properties || {}).forEach((sub: any) => { | ||
| 895 | + if (Array.isArray(_data[key])) { | ||
| 896 | + _data[key].map((item: string) => { | ||
| 897 | + if ( | ||
| 898 | + item[sub] && | ||
| 899 | + property.items.properties[sub].widget === 'relSelector' | ||
| 900 | + ) { | ||
| 901 | + property.items.properties[sub].default = item[sub]; | ||
| 902 | + } | ||
| 903 | + }); | ||
| 904 | + } | ||
| 905 | + }); | ||
| 906 | + } | ||
| 872 | //TODO 临时对按钮参数值处理 obj 对象 | 907 | //TODO 临时对按钮参数值处理 obj 对象 |
| 873 | if ( | 908 | if ( |
| 874 | !property.belongSubForm && | 909 | !property.belongSubForm && |
| @@ -1863,12 +1898,22 @@ function executeActions( | @@ -1863,12 +1898,22 @@ function executeActions( | ||
| 1863 | 1898 | ||
| 1864 | Object.keys(actionMap).forEach((key) => { | 1899 | Object.keys(actionMap).forEach((key) => { |
| 1865 | if (pathMap[key]) { | 1900 | if (pathMap[key]) { |
| 1866 | - const widget = | ||
| 1867 | - targetForm.getSchemaByPath(pathMap[key]).originWidget || ''; | ||
| 1868 | - if (widget === 'subform' && actionMap[key].hasOwnProperty('readOnly')) { | 1901 | + const schema = targetForm.getSchemaByPath(pathMap[key]) || {}; |
| 1902 | + if ( | ||
| 1903 | + schema.originWidget === 'subform' && | ||
| 1904 | + actionMap[key].hasOwnProperty('readOnly') | ||
| 1905 | + ) { | ||
| 1869 | // 子表的只读单独处理 | 1906 | // 子表的只读单独处理 |
| 1870 | actionMap[key].subReadOnly = actionMap[key].readOnly; | 1907 | actionMap[key].subReadOnly = actionMap[key].readOnly; |
| 1871 | delete actionMap[key].readOnly; | 1908 | delete actionMap[key].readOnly; |
| 1909 | + } else if ( | ||
| 1910 | + schema.originWidget === 'relSelector' && | ||
| 1911 | + ['TABLE', 'EDIT_TABLE'].includes(schema.props?.mode) && | ||
| 1912 | + actionMap[key].hasOwnProperty('readOnly') | ||
| 1913 | + ) { | ||
| 1914 | + // 关联记录的只读单独处理 | ||
| 1915 | + actionMap[key].isReadOnly = actionMap[key].readOnly; | ||
| 1916 | + delete actionMap[key].readOnly; | ||
| 1872 | } | 1917 | } |
| 1873 | targetForm.setSchemaByPath(pathMap[key], actionMap[key]); | 1918 | targetForm.setSchemaByPath(pathMap[key], actionMap[key]); |
| 1874 | } | 1919 | } |
| @@ -2548,7 +2593,7 @@ const getSubFormSummaries = ( | @@ -2548,7 +2593,7 @@ const getSubFormSummaries = ( | ||
| 2548 | // subTableSumArr = form?.schema?.properties?.[subTableKey]?.qxProps?.summary || []; | 2593 | // subTableSumArr = form?.schema?.properties?.[subTableKey]?.qxProps?.summary || []; |
| 2549 | // } else if (type === 'rel') { | 2594 | // } else if (type === 'rel') { |
| 2550 | subTableSumArr = | 2595 | subTableSumArr = |
| 2551 | - form.getSchemaByPath(pathMap[subTableKey])?.qxProps?.summary || []; | 2596 | + form?.getSchemaByPath(pathMap[subTableKey])?.qxProps?.summary || []; |
| 2552 | // } | 2597 | // } |
| 2553 | let subTableData: any[] = []; | 2598 | let subTableData: any[] = []; |
| 2554 | // 子表数据 | 2599 | // 子表数据 |
| @@ -2557,7 +2602,7 @@ const getSubFormSummaries = ( | @@ -2557,7 +2602,7 @@ const getSubFormSummaries = ( | ||
| 2557 | } else if (type === 'rel') { | 2602 | } else if (type === 'rel') { |
| 2558 | // subTableData = form?.formData?.[subTableKey + '_info_'] || []; | 2603 | // subTableData = form?.formData?.[subTableKey + '_info_'] || []; |
| 2559 | subTableData = | 2604 | subTableData = |
| 2560 | - form.getSchemaByPath(pathMap[subTableKey])?.dataForFormula || []; | 2605 | + form?.getSchemaByPath(pathMap[subTableKey])?.dataForFormula || []; |
| 2561 | } | 2606 | } |
| 2562 | 2607 | ||
| 2563 | // 对子表汇总项实时计算,得出结果 | 2608 | // 对子表汇总项实时计算,得出结果 |
| @@ -2583,10 +2628,10 @@ const getSubFormSummaries = ( | @@ -2583,10 +2628,10 @@ const getSubFormSummaries = ( | ||
| 2583 | if (sts.fx === 'MAX' || sts.fx === 'MIN') { | 2628 | if (sts.fx === 'MAX' || sts.fx === 'MIN') { |
| 2584 | let widget = ''; | 2629 | let widget = ''; |
| 2585 | if (type === 'rel') { | 2630 | if (type === 'rel') { |
| 2586 | - widget = form.getSchemaByPath(pathMap?.[subTableKey])?.items | 2631 | + widget = form?.getSchemaByPath(pathMap?.[subTableKey])?.items |
| 2587 | ?.properties?.[sts.relField]?.widget; | 2632 | ?.properties?.[sts.relField]?.widget; |
| 2588 | } else { | 2633 | } else { |
| 2589 | - widget = form.getSchemaByPath(pathMap?.[sts.relField])?.widget; | 2634 | + widget = form?.getSchemaByPath(pathMap?.[sts.relField])?.widget; |
| 2590 | } | 2635 | } |
| 2591 | if (['qxDatetime', 'createdAt', 'updatedAt'].includes(widget)) { | 2636 | if (['qxDatetime', 'createdAt', 'updatedAt'].includes(widget)) { |
| 2592 | fxSum = fxSum.filter((it: any) => it); // 计算日期的最大最小时,过滤掉空值 | 2637 | fxSum = fxSum.filter((it: any) => it); // 计算日期的最大最小时,过滤掉空值 |
| @@ -2687,7 +2732,18 @@ const getSchemaKeysByWidget = (form: any, widget: string) => { | @@ -2687,7 +2732,18 @@ const getSchemaKeysByWidget = (form: any, widget: string) => { | ||
| 2687 | return percentItemKeys; | 2732 | return percentItemKeys; |
| 2688 | }; | 2733 | }; |
| 2689 | 2734 | ||
| 2690 | -const getCurVal = (pathMap: any, values: any, key: string) => { | 2735 | +export const getCurVal = ( |
| 2736 | + pathMap: any, | ||
| 2737 | + values: any, | ||
| 2738 | + key: string, | ||
| 2739 | + form?: any, | ||
| 2740 | +) => { | ||
| 2741 | + const _arr = key.split('.'); | ||
| 2742 | + if (_arr.length === 3) { | ||
| 2743 | + // 关联表的汇总 | ||
| 2744 | + const res = getSubFormSummaries(form, _arr[0], '', 'rel', pathMap); | ||
| 2745 | + return res[key]; | ||
| 2746 | + } | ||
| 2691 | if (!values.hasOwnProperty(key)) { | 2747 | if (!values.hasOwnProperty(key)) { |
| 2692 | return getValue(values, pathMap[key]); | 2748 | return getValue(values, pathMap[key]); |
| 2693 | } else { | 2749 | } else { |
| @@ -2723,6 +2779,7 @@ export const dealFormula = ( | @@ -2723,6 +2779,7 @@ export const dealFormula = ( | ||
| 2723 | pathMap: any, | 2779 | pathMap: any, |
| 2724 | form: any, | 2780 | form: any, |
| 2725 | keyDownCount: number, | 2781 | keyDownCount: number, |
| 2782 | + formData: any, | ||
| 2726 | ) => { | 2783 | ) => { |
| 2727 | if (flag !== keyDownCount) { | 2784 | if (flag !== keyDownCount) { |
| 2728 | // flag = _.clone(keyDownCount); | 2785 | // flag = _.clone(keyDownCount); |
| @@ -2746,7 +2803,7 @@ export const dealFormula = ( | @@ -2746,7 +2803,7 @@ export const dealFormula = ( | ||
| 2746 | dateFormat, | 2803 | dateFormat, |
| 2747 | } = calculate; | 2804 | } = calculate; |
| 2748 | // 子表数据 | 2805 | // 子表数据 |
| 2749 | - const allValues = form.getValues(); | 2806 | + const allValues = formData; |
| 2750 | const subTableData: any[] = | 2807 | const subTableData: any[] = |
| 2751 | allValues?.[subForm?.subFormKey] || | 2808 | allValues?.[subForm?.subFormKey] || |
| 2752 | form.formData?.[subForm?.subFormKey] || | 2809 | form.formData?.[subForm?.subFormKey] || |
| @@ -2898,7 +2955,7 @@ export const dealFormula = ( | @@ -2898,7 +2955,7 @@ export const dealFormula = ( | ||
| 2898 | } else { | 2955 | } else { |
| 2899 | const _depsVal: any = handleNullType(depsVal, nullType); | 2956 | const _depsVal: any = handleNullType(depsVal, nullType); |
| 2900 | if (_depsVal === 'EMPTY' || _depsVal.includes('EMPTY')) { | 2957 | if (_depsVal === 'EMPTY' || _depsVal.includes('EMPTY')) { |
| 2901 | - return form.setValueByPath(schemaKeyRel, ''); | 2958 | + return form.setValueByPath(schemaKeyRel, null); |
| 2902 | } | 2959 | } |
| 2903 | if (formula) { | 2960 | if (formula) { |
| 2904 | // @ts-ignore | 2961 | // @ts-ignore |
| @@ -2910,8 +2967,8 @@ export const dealFormula = ( | @@ -2910,8 +2967,8 @@ export const dealFormula = ( | ||
| 2910 | } | 2967 | } |
| 2911 | 2968 | ||
| 2912 | if (typeof formulaRes !== 'object') { | 2969 | if (typeof formulaRes !== 'object') { |
| 2913 | - if (isNaN(formulaRes)) { | ||
| 2914 | - formulaRes = 0; | 2970 | + if (isNaN(formulaRes) || formulaRes === Infinity) { |
| 2971 | + formulaRes = null; | ||
| 2915 | } | 2972 | } |
| 2916 | // if (typeof formulaRes === 'number') { | 2973 | // if (typeof formulaRes === 'number') { |
| 2917 | // console.log(formulaRes, precision) | 2974 | // console.log(formulaRes, precision) |
| @@ -128,11 +128,30 @@ type ListViewCoreProps = { | @@ -128,11 +128,30 @@ type ListViewCoreProps = { | ||
| 128 | initSelectedIds?: string[]; | 128 | initSelectedIds?: string[]; |
| 129 | }; | 129 | }; |
| 130 | 130 | ||
| 131 | -const useTableScrollY = (deps: string[]) => { | 131 | +const getRows = (columns: any[]) => { |
| 132 | + let rows = 1; | ||
| 133 | + const _columns = columns.filter(item => (item.key || item.dataIndex).indexOf('_merge_field') === 0); | ||
| 134 | + _columns.forEach(item => { | ||
| 135 | + if (item.children?.length) { | ||
| 136 | + if (rows === 1) rows = 2; | ||
| 137 | + item.children.forEach((it: any) => { | ||
| 138 | + if ((it.key || it.dataIndex).indexOf('_merge_field') === 0 && it.children?.length) { | ||
| 139 | + rows = 3; | ||
| 140 | + } | ||
| 141 | + }) | ||
| 142 | + } | ||
| 143 | + }) | ||
| 144 | + return rows | ||
| 145 | +} | ||
| 146 | + | ||
| 147 | +const useTableScrollY = (deps: any[]) => { | ||
| 148 | + const size = deps?.[0]?.size; | ||
| 149 | + const itemHeaderHeight = size === 'middle' ? 48 : size === 'default' ? 56 : 40; | ||
| 150 | + const headerRows = getRows(deps?.[0]?.columns || []); | ||
| 132 | const TABLE_VIEW_LIST = 'qx-view-list'; | 151 | const TABLE_VIEW_LIST = 'qx-view-list'; |
| 133 | const PAGINATION_HEIGHT_CLASS_NAME = 'ant-pagination'; | 152 | const PAGINATION_HEIGHT_CLASS_NAME = 'ant-pagination'; |
| 134 | const TOOLBAR_NAME = 'qx-view-container__toolbar'; | 153 | const TOOLBAR_NAME = 'qx-view-container__toolbar'; |
| 135 | - const tableHeader = 55; | 154 | + const tableHeader = itemHeaderHeight * headerRows; |
| 136 | const paginationDefaultHeight = 32; | 155 | const paginationDefaultHeight = 32; |
| 137 | const paginationDefaultMargin = 32; | 156 | const paginationDefaultMargin = 32; |
| 138 | const tableViewListDefaultHeight = 400; | 157 | const tableViewListDefaultHeight = 400; |
| @@ -140,7 +159,7 @@ const useTableScrollY = (deps: string[]) => { | @@ -140,7 +159,7 @@ const useTableScrollY = (deps: string[]) => { | ||
| 140 | 159 | ||
| 141 | const $ = (selectors: string) => document.querySelector<HTMLElement>(selectors); | 160 | const $ = (selectors: string) => document.querySelector<HTMLElement>(selectors); |
| 142 | 161 | ||
| 143 | - const defaultScrollY = useMemo(() => document.body.clientHeight, []); | 162 | + const defaultScrollY = useMemo(() => document.body.clientHeight, [tableHeader]); |
| 144 | 163 | ||
| 145 | const [scrollY, setScrollY] = useState<number>(defaultScrollY ?? 200); | 164 | const [scrollY, setScrollY] = useState<number>(defaultScrollY ?? 200); |
| 146 | 165 | ||
| @@ -203,7 +222,7 @@ const useTableScrollY = (deps: string[]) => { | @@ -203,7 +222,7 @@ const useTableScrollY = (deps: string[]) => { | ||
| 203 | return () => { | 222 | return () => { |
| 204 | removeObserver(); | 223 | removeObserver(); |
| 205 | }; | 224 | }; |
| 206 | - }, []); | 225 | + }, [tableHeader]); |
| 207 | 226 | ||
| 208 | useEffect(() => { | 227 | useEffect(() => { |
| 209 | if (deps) { | 228 | if (deps) { |
| @@ -331,6 +350,7 @@ export const ListViewCore: React.FC<ListViewCoreProps> = ({ | @@ -331,6 +350,7 @@ export const ListViewCore: React.FC<ListViewCoreProps> = ({ | ||
| 331 | const [relationAside, setRelationAside] = useState<any>(); | 350 | const [relationAside, setRelationAside] = useState<any>(); |
| 332 | const [relationFun, setRelationFun] = useState<any>(); | 351 | const [relationFun, setRelationFun] = useState<any>(); |
| 333 | const [relationApp, setRelationApp] = useState<any>(); | 352 | const [relationApp, setRelationApp] = useState<any>(); |
| 353 | + const [relationView, setRelationView] = useState<any>(); | ||
| 334 | const [childFun, setChildFun] = useState<boolean>(false); | 354 | const [childFun, setChildFun] = useState<boolean>(false); |
| 335 | const [relationkeys, setRelationkeys] = useState<any>([]); | 355 | const [relationkeys, setRelationkeys] = useState<any>([]); |
| 336 | const [selectRelModalOpen, setSelectRelModalOpen] = useState(false); | 356 | const [selectRelModalOpen, setSelectRelModalOpen] = useState(false); |
| @@ -359,6 +379,7 @@ export const ListViewCore: React.FC<ListViewCoreProps> = ({ | @@ -359,6 +379,7 @@ export const ListViewCore: React.FC<ListViewCoreProps> = ({ | ||
| 359 | if (info) { | 379 | if (info) { |
| 360 | setRelationFun(info.extract?.code); | 380 | setRelationFun(info.extract?.code); |
| 361 | setRelationApp(info.extract?.appCode); | 381 | setRelationApp(info.extract?.appCode); |
| 382 | + setRelationView(info.extract?.viewCode); | ||
| 362 | } | 383 | } |
| 363 | if (_flag) { | 384 | if (_flag) { |
| 364 | return; | 385 | return; |
| @@ -709,7 +730,12 @@ export const ListViewCore: React.FC<ListViewCoreProps> = ({ | @@ -709,7 +730,12 @@ export const ListViewCore: React.FC<ListViewCoreProps> = ({ | ||
| 709 | setLoading(false); | 730 | setLoading(false); |
| 710 | }; | 731 | }; |
| 711 | 732 | ||
| 712 | - const relationView = async (data: any, _appCode: string, _funCode: string, _viewCode: string) => { | 733 | + const relationSetting = async ( |
| 734 | + data: any, | ||
| 735 | + _appCode: string, | ||
| 736 | + _funCode: string, | ||
| 737 | + _viewCode: string, | ||
| 738 | + ) => { | ||
| 713 | const params = { | 739 | const params = { |
| 714 | viewCode: _viewCode || (query && query.viewCode), | 740 | viewCode: _viewCode || (query && query.viewCode), |
| 715 | viewType: 'RELATION', | 741 | viewType: 'RELATION', |
| @@ -884,7 +910,7 @@ export const ListViewCore: React.FC<ListViewCoreProps> = ({ | @@ -884,7 +910,7 @@ export const ListViewCore: React.FC<ListViewCoreProps> = ({ | ||
| 884 | return; | 910 | return; |
| 885 | } else if (data.hasOwnProperty('relation')) { | 911 | } else if (data.hasOwnProperty('relation')) { |
| 886 | setViewType('RELATION'); | 912 | setViewType('RELATION'); |
| 887 | - await relationView(data, appCode, funCode, viewCode || (query && query.viewCode)); | 913 | + await relationSetting(data, appCode, funCode, viewCode || (query && query.viewCode)); |
| 888 | return; | 914 | return; |
| 889 | } | 915 | } |
| 890 | setViewType('list'); | 916 | setViewType('list'); |
| @@ -1961,7 +1987,7 @@ export const ListViewCore: React.FC<ListViewCoreProps> = ({ | @@ -1961,7 +1987,7 @@ export const ListViewCore: React.FC<ListViewCoreProps> = ({ | ||
| 1961 | {props.mode !== 'selector' ? ( | 1987 | {props.mode !== 'selector' ? ( |
| 1962 | <RuntimeFormDrawer | 1988 | <RuntimeFormDrawer |
| 1963 | appCode={childFun ? relationApp : appCode} | 1989 | appCode={childFun ? relationApp : appCode} |
| 1964 | - viewCode={viewCode} | 1990 | + viewCode={childFun ? relationView : viewCode} |
| 1965 | funCode={childFun ? relationFun : funCode} | 1991 | funCode={childFun ? relationFun : funCode} |
| 1966 | dRef={drawerRef} | 1992 | dRef={drawerRef} |
| 1967 | type={currDataItemCtrl.type || 'add'} | 1993 | type={currDataItemCtrl.type || 'add'} |
| @@ -2314,6 +2340,7 @@ const PageList: React.FC = () => { | @@ -2314,6 +2340,7 @@ const PageList: React.FC = () => { | ||
| 2314 | return msg; | 2340 | return msg; |
| 2315 | } | 2341 | } |
| 2316 | }; | 2342 | }; |
| 2343 | + | ||
| 2317 | return views.length ? ( | 2344 | return views.length ? ( |
| 2318 | <div | 2345 | <div |
| 2319 | className="app-view-cont" | 2346 | className="app-view-cont" |
| @@ -2391,4 +2418,3 @@ const PageList: React.FC = () => { | @@ -2391,4 +2418,3 @@ const PageList: React.FC = () => { | ||
| 2391 | }; | 2418 | }; |
| 2392 | 2419 | ||
| 2393 | export default PageList; | 2420 | export default PageList; |
| 2394 | - |