Tom Butcher 6da485bc8f Enhance IdDisplay component with reference and plainCode props
- Added reference prop to allow custom display of IDs.
- Introduced plainCode prop to toggle between code and text display styles.
- Updated rendering logic to accommodate new props for improved flexibility in ID presentation.
2025-12-07 02:41:45 +00:00

156 lines
3.7 KiB
JavaScript

// PrinterSelect.js
import PropTypes from 'prop-types'
import { Flex, Typography, Popover } from 'antd'
import { useNavigate } from 'react-router-dom'
import { useMediaQuery } from 'react-responsive'
import CopyButton from './CopyButton'
import SpotlightTooltip from './SpotlightTooltip'
import { getModelByName } from '../../../database/ObjectModels'
const { Text, Link } = Typography
const IdDisplay = ({
id,
reference = null,
plainCode = false,
type,
showCopy = true,
longId = true,
showHyperlink = false,
showSpotlight = true
}) => {
const navigate = useNavigate()
const isMobile = useMediaQuery({ maxWidth: 768 })
const model = getModelByName(type)
const prefix = model.prefix
var hyperlink = null
const defaultModelActions =
model.actions?.filter((action) => action.default == true) || []
if (defaultModelActions.length >= 1) {
hyperlink = defaultModelActions[0].url(id)
}
if (!id) {
return <Text type='secondary'>n/a</Text>
}
id = typeof id === 'string' ? id.toString().toUpperCase() : 'XXXXXX'
var displayId = prefix + ':' + id
var copyId = prefix + ':' + id
if (longId == false || isMobile) {
displayId = prefix + ':' + id.toString().slice(-6)
}
if (reference) {
displayId = prefix + ':' + reference
}
return (
<Flex
align={'center'}
className='iddisplay'
style={{ minWidth: '0px', width: '100%' }}
>
{(() => {
var textElement = (
<code
style={showCopy ? { marginRight: 6, minWidth: '0px' } : undefined}
>
{displayId}
</code>
)
if (plainCode == false) {
textElement = (
<Text
code
ellipsis
style={showCopy ? { marginRight: 6, minWidth: '0px' } : undefined}
>
{displayId}
</Text>
)
}
// If hyperlink is enabled
if (showHyperlink && hyperlink != null) {
const linkElement = (
<Link
onClick={() => navigate(hyperlink)}
ellipsis
style={showCopy ? { marginRight: 6 } : undefined}
>
{textElement}
</Link>
)
if (showSpotlight) {
return (
<Popover
content={
id && type ? (
<SpotlightTooltip query={prefix + ':' + id} type={type} />
) : null
}
trigger={['hover', 'click']}
placement='topLeft'
arrow={false}
style={{ padding: 0 }}
>
{linkElement}
</Popover>
)
}
return linkElement
}
// If hyperlink is disabled
if (showSpotlight) {
return (
<Popover
content={
id && type ? (
<SpotlightTooltip query={prefix + ':' + id} type={type} />
) : null
}
trigger={['hover', 'click']}
placement='topLeft'
arrow={false}
>
{textElement}
</Popover>
)
}
return textElement
})()}
{showCopy && (
<CopyButton
text={copyId}
tooltip='Copy ID'
style={{ marginLeft: 0 }}
iconStyle={{ fontSize: '14px' }}
/>
)}
</Flex>
)
}
IdDisplay.propTypes = {
id: PropTypes.string,
type: PropTypes.string,
reference: PropTypes.string,
showCopy: PropTypes.bool,
longId: PropTypes.bool,
showHyperlink: PropTypes.bool,
plainCode: PropTypes.bool,
showSpotlight: PropTypes.bool
}
export default IdDisplay