Added minimal object child table with modal popup.

This commit is contained in:
Tom Butcher 2026-06-20 23:10:10 +01:00
parent 27f5989eb8
commit 6cc3fdb0ce
2 changed files with 44 additions and 9 deletions

View File

@ -1,11 +1,11 @@
import { useMemo, useEffect, useRef } from 'react' import { useMemo, useEffect, useRef, useState } from 'react'
import PropTypes from 'prop-types' import PropTypes from 'prop-types'
import { Table, Skeleton, Card, Button, Flex, Typography } from 'antd' import { Table, Skeleton, Card, Button, Flex, Typography, Modal } from 'antd'
import PlusIcon from '../../Icons/PlusIcon' import PlusIcon from '../../Icons/PlusIcon'
import ObjectProperty from './ObjectProperty' import ObjectProperty from './ObjectProperty'
import { LoadingOutlined } from '@ant-design/icons' import { LoadingOutlined } from '@ant-design/icons'
import BinIcon from '../../Icons/BinIcon' import BinIcon from '../../Icons/BinIcon'
const { Text } = Typography const { Text, Link, Title } = Typography
const DEFAULT_COLUMN_WIDTHS = { const DEFAULT_COLUMN_WIDTHS = {
text: 200, text: 200,
@ -64,13 +64,15 @@ const ObjectChildTable = ({
value = [], value = [],
rollups = [], rollups = [],
onChange, onChange,
minimal = false,
label = '',
...tableProps ...tableProps
}) => { }) => {
const mainTableWrapperRef = useRef(null) const mainTableWrapperRef = useRef(null)
const rollupTableWrapperRef = useRef(null) const rollupTableWrapperRef = useRef(null)
const generatedRowKeysRef = useRef(new WeakMap()) const generatedRowKeysRef = useRef(new WeakMap())
const generatedRowKeyCountRef = useRef(0) const generatedRowKeyCountRef = useRef(0)
const [minimalModelOpen, setMinimalModelOpen] = useState(false)
const getFallbackRowKey = (record) => { const getFallbackRowKey = (record) => {
if (!record || typeof record !== 'object') { if (!record || typeof record !== 'object') {
return `object-child-table-row-${String(record)}` return `object-child-table-row-${String(record)}`
@ -274,8 +276,7 @@ const ObjectChildTable = ({
return itemsSource return itemsSource
}, [itemsSource, loading, skeletonData]) }, [itemsSource, loading, skeletonData])
const resolvedRowKey = const resolvedRowKey = (record) => getResolvedRecordKey(record)
(record) => getResolvedRecordKey(record)
const scrollConfig = const scrollConfig =
scrollHeight != null scrollHeight != null
@ -460,7 +461,8 @@ const ObjectChildTable = ({
rowKey={resolvedRowKey} rowKey={resolvedRowKey}
scroll={scrollConfig} scroll={scrollConfig}
locale={{ emptyText }} locale={{ emptyText }}
style={{ maxWidth, minWidth: 0 }} bordered={true}
style={{ maxWidth: minimal ? '100%' : maxWidth, minWidth: 0 }}
className='rollup-table' className='rollup-table'
/> />
</div> </div>
@ -470,13 +472,14 @@ const ObjectChildTable = ({
<Flex vertical> <Flex vertical>
<div ref={mainTableWrapperRef}> <div ref={mainTableWrapperRef}>
<Table <Table
style={{ maxWidth, minWidth: 0 }} style={{ maxWidth: minimal ? '100%' : maxWidth, minWidth: 0 }}
dataSource={dataSource} dataSource={dataSource}
columns={tableColumns} columns={tableColumns}
loading={{ spinning: loading, indicator: <LoadingOutlined spin /> }} loading={{ spinning: loading, indicator: <LoadingOutlined spin /> }}
size={size} size={size}
rowKey={resolvedRowKey} rowKey={resolvedRowKey}
scroll={scrollConfig} scroll={scrollConfig}
bordered={true}
locale={{ emptyText }} locale={{ emptyText }}
pagination={false} pagination={false}
className={hasRollups ? 'child-table-rollups' : 'child-table'} className={hasRollups ? 'child-table-rollups' : 'child-table'}
@ -509,6 +512,34 @@ const ObjectChildTable = ({
) )
} }
if (minimal == true) {
return (
<>
<Link
onClick={() => {
setMinimalModelOpen(true)
}}
>
{value?.length || 0} {value?.length == 1 ? 'item' : 'items'}
</Link>
<Modal
open={minimalModelOpen}
onCancel={() => setMinimalModelOpen(false)}
footer={null}
width='860px'
>
<Title
level={2}
style={{ marginTop: 0, lineHeight: '0.7', marginBottom: 20 }}
>
{label}
</Title>
{tableComponent}
</Modal>
</>
)
}
return tableComponent return tableComponent
} }
@ -530,13 +561,15 @@ ObjectChildTable.propTypes = {
skeletonRows: PropTypes.number, skeletonRows: PropTypes.number,
additionalColumns: PropTypes.arrayOf(PropTypes.object), additionalColumns: PropTypes.arrayOf(PropTypes.object),
emptyText: PropTypes.node, emptyText: PropTypes.node,
label: PropTypes.string,
isEditing: PropTypes.bool, isEditing: PropTypes.bool,
value: PropTypes.arrayOf(PropTypes.object), value: PropTypes.arrayOf(PropTypes.object),
onChange: PropTypes.func, onChange: PropTypes.func,
maxWidth: PropTypes.string, maxWidth: PropTypes.string,
rollups: PropTypes.arrayOf(PropTypes.object), rollups: PropTypes.arrayOf(PropTypes.object),
objectData: PropTypes.object, objectData: PropTypes.object,
canAddRemove: PropTypes.bool canAddRemove: PropTypes.bool,
minimal: PropTypes.bool
} }
export default ObjectChildTable export default ObjectChildTable

View File

@ -422,6 +422,8 @@ const ObjectProperty = ({
loading={loading} loading={loading}
rollups={rollups} rollups={rollups}
size={size} size={size}
minimal={minimal}
label={label}
canAddRemove={canAddRemove} canAddRemove={canAddRemove}
/> />
) )