From 0907d45e2296a878a19e97bc820e0b6b60dcaab9 Mon Sep 17 00:00:00 2001 From: Sunny Aggarwal Date: Wed, 15 Apr 2026 12:07:45 +0530 Subject: [PATCH 1/2] OpenConceptLab/ocl_issues#1854 | References list | translation to raw --- src/components/search/TableResults.jsx | 60 +++++++++++++++++++------- 1 file changed, 44 insertions(+), 16 deletions(-) diff --git a/src/components/search/TableResults.jsx b/src/components/search/TableResults.jsx index 7939c355..f111b4b3 100644 --- a/src/components/search/TableResults.jsx +++ b/src/components/search/TableResults.jsx @@ -8,6 +8,8 @@ import TableContainer from '@mui/material/TableContainer'; import TableHead from '@mui/material/TableHead'; import TableRow from '@mui/material/TableRow'; import TableSortLabel from '@mui/material/TableSortLabel'; +import FormControlLabel from '@mui/material/FormControlLabel'; +import Switch from '@mui/material/Switch'; import Checkbox from '@mui/material/Checkbox'; import Skeleton from '@mui/material/Skeleton' import { visuallyHidden } from '@mui/utils'; @@ -17,7 +19,7 @@ import { ALL_COLUMNS } from './ResultConstants'; const EnhancedTableHead = props => { const { t } = useTranslation() - const { onSelectAllClick, order, orderBy, numSelected, rowCount, onRequestSort, columns } = props; + const { onSelectAllClick, order, orderBy, numSelected, rowCount, onRequestSort, columns, refTranslation, setRefTranslation } = props; const createSortHandler = property => event => { onRequestSort(event, property); }; @@ -54,20 +56,43 @@ const EnhancedTableHead = props => { sortDirection={orderBy === headCell.id ? order : false} sx={{background: 'inherit', ...headCell.sx}} > - - {label} - { - orderBy === headCell.id ? ( - - {order === 'desc' ? 'sorted descending' : 'sorted ascending'} - - ) : null - } - + { + headCell?.translation ? + + {label} + + setRefTranslation(event.target.checked)} /> + } + label={ + + {refTranslation ? 'Show Expression' : 'Show Translation'} + + } + /> + + : + + {label} + { + orderBy === headCell.id ? ( + + {order === 'desc' ? 'sorted descending' : 'sorted ascending'} + + ) : null + } + + } ) })} @@ -77,13 +102,14 @@ const EnhancedTableHead = props => { } const TableResults = ({selected, bgColor, handleClick, handleRowClick, handleSelectAllClick, results, resource, nested, isSelected, isItemShown, order, orderBy, className, style, onOrderByChange, selectedToShowItem, size, excludedColumns, extraColumns, properties, propertyFilters, loading}) => { + const [refTranslation, setRefTranslation] = React.useState(true) const rows = results?.results || [] const getValue = (row, column) => { let val = get(row, column.value) if(column.formatter) return column.formatter(val) if(column.renderer) - return column.translation ? column.renderer(row, column.translation) : column.renderer(row, Boolean(selectedToShowItem)) + return column.translation ? column.renderer(row, refTranslation) : column.renderer(row, Boolean(selectedToShowItem)) return val } @@ -156,6 +182,8 @@ const TableResults = ({selected, bgColor, handleClick, handleRowClick, handleSel rowCount={rows.length || 0} resource={resource} columns={columns} + refTranslation={refTranslation} + setRefTranslation={setRefTranslation} /> { From e1269ee261ac5028ba14eb56ee6586732531a961 Mon Sep 17 00:00:00 2001 From: Sunny Aggarwal Date: Wed, 15 Apr 2026 13:15:45 +0530 Subject: [PATCH 2/2] OpenConceptLab/ocl_issues#1854 | References list --- .eslintrc.json | 3 +- src/components/common/ReferenceChip.jsx | 15 +----- .../common/ReferenceTranslation.jsx | 12 ++--- src/components/common/ReferenceTypeChips.jsx | 34 ++++++++++++++ src/components/search/ResultConstants.js | 47 +++++++++++++++++-- src/components/search/Search.jsx | 2 + src/components/search/TableResults.jsx | 2 +- src/i18n/locales/en/translations.json | 14 +++++- 8 files changed, 99 insertions(+), 30 deletions(-) create mode 100644 src/components/common/ReferenceTypeChips.jsx diff --git a/.eslintrc.json b/.eslintrc.json index 63200042..032728dc 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -256,7 +256,8 @@ "unversioned", "reranker", "lte", - "gte" + "gte", + "resourceversions" ], "skipIfMatch": [ "http://[^s]*", diff --git a/src/components/common/ReferenceChip.jsx b/src/components/common/ReferenceChip.jsx index d5f181bb..265db6e8 100644 --- a/src/components/common/ReferenceChip.jsx +++ b/src/components/common/ReferenceChip.jsx @@ -3,10 +3,9 @@ import { Chip } from '@mui/material'; import { LocalOffer as LocalOfferIcon, Link as LinkIcon, } from '@mui/icons-material'; -import { toFullAPIURL, copyURL } from '../../common/utils'; +import { toFullAPIURL } from '../../common/utils'; const ReferenceChip = props => { - const isReference = !props.notReference const isResolved = Boolean(props.last_resolved_at) const type = props.reference_type; const expression = isResolved ? props.expression : `${props.expression} (unresolved)`; @@ -29,18 +28,6 @@ const ReferenceChip = props => { {chip} - { - isReference && ( - props.include ? - : - - ) - } - { - isReference && - copyURL(toFullAPIURL(props.expression))} style={{marginLeft: '5px'}} /> - - } ) } diff --git a/src/components/common/ReferenceTranslation.jsx b/src/components/common/ReferenceTranslation.jsx index 9e4dd954..4d0a97de 100644 --- a/src/components/common/ReferenceTranslation.jsx +++ b/src/components/common/ReferenceTranslation.jsx @@ -3,10 +3,9 @@ import { Chip } from '@mui/material'; import { LocalOffer as LocalOfferIcon, Link as LinkIcon, } from '@mui/icons-material'; -import { toFullAPIURL, copyURL } from '../../common/utils'; +import { toFullAPIURL } from '../../common/utils'; const ReferenceTranslation = props => { - const isReference = !props.notReference const isResolved = Boolean(props.last_resolved_at) const type = props.reference_type; const expression = isResolved ? props.translation : `${props.translation} (unresolved)`; @@ -22,19 +21,14 @@ const ReferenceTranslation = props => { label={expression} variant='outlined' color='primary' - style={{border: 'none'}} + sx={{border: 'none', ...props.chipSx}} classes={{label: 'chip-label-wrapped'}} /> return ( - + {chip} - { - isReference && - copyURL(toFullAPIURL(props.expression))} style={{marginLeft: '5px'}} /> - - } ) } diff --git a/src/components/common/ReferenceTypeChips.jsx b/src/components/common/ReferenceTypeChips.jsx new file mode 100644 index 00000000..04b04b21 --- /dev/null +++ b/src/components/common/ReferenceTypeChips.jsx @@ -0,0 +1,34 @@ +import React from 'react'; +import Chip from '@mui/material/Chip' +import { useTranslation } from 'react-i18next' + + +const ReferenceTypeChips = ({ reference }) => { + const { t } = useTranslation() + return ( + + { + reference.include === false && + + } + { + reference.transform?.toLowerCase() === 'extensional' && + + } + { + ['resourceversions', 'intensional'].includes(reference.transform?.toLowerCase()) && + + } + { + reference.cascade && + + } + { + !reference.last_resolved_at && !reference.concepts && !reference.mappings && + + } + + ) +} + +export default ReferenceTypeChips diff --git a/src/components/search/ResultConstants.js b/src/components/search/ResultConstants.js index 8bc89d13..02e9a7a1 100644 --- a/src/components/search/ResultConstants.js +++ b/src/components/search/ResultConstants.js @@ -1,5 +1,7 @@ import React from 'react'; import find from 'lodash/find' +import map from 'lodash/map' +import isNumber from 'lodash/isNumber' import { formatDate, formatWebsiteLink, @@ -7,10 +9,12 @@ import { import Retired from '../common/Retired'; import OwnerIcon from '../common/OwnerIcon'; import RepoVersionButton from '../repos/RepoVersionButton'; +import RepoChip from '../repos/RepoChip'; import FromAndTargetSource from '../mappings/FromAndTargetSource' import ConceptCell from '../mappings/ConceptCell' import ReferenceChip from '../common/ReferenceChip'; import ReferenceTranslation from '../common/ReferenceTranslation'; +import ReferenceTypeChips from '../common/ReferenceTypeChips' const getLocale = (concept, synonym) => { @@ -20,6 +24,26 @@ const getLocale = (concept, synonym) => { return
{locale?.locale ? `[${locale.locale}] ${[locale.name]}` : cleaned}
} +const getReferenceSummary = (reference) => { + let label = ''; + if(reference.last_resolved_at && reference.concepts === 0 && reference.mappings === 0) { + if(reference.reference_type === 'mappings') + return '0 mappings' + if(reference.reference_type === 'concepts') + return '0 concepts' + return '0 concepts, 0 mappings' + } + if(isNumber(reference.concepts) && reference.concepts > 0) + label += `${reference.concepts.toLocaleString()} concepts` + if(isNumber(reference.mappings) && reference.mappings > 0) { + if(label?.length) + label += ', ' + label += `${reference.mappings.toLocaleString()} mappings` + } + + return label +} + export const ALL_COLUMNS = { concepts: [ @@ -52,9 +76,26 @@ export const ALL_COLUMNS = { {id: 'toConcept', labelKey: 'mapping.toConcept', value: 'toConceptCode', className: 'searchable', sortable: false, renderer: item => }, ], references: [ - {id: 'expression', labelKey: 'reference.reference', value: 'expression', sortable: false, translation: true, renderer: (reference, translation) => translation ? : }, - {id: 'concepts', labelKey: 'concept.concepts', value: 'concepts', sortable: false, align: 'center', renderer: reference => reference.last_resolved_at ? : '-'}, - {id: 'mappings', labelKey: 'mapping.mappings', value: 'mappings', sortable: false, align: 'center', renderer: reference => reference.last_resolved_at ? : '-'} + { + id: 'expression', + labelKey: 'reference.expression', + value: 'expression', + sortable: false, + translation: true, + renderer: (reference, translation) => translation ? + : + + }, + {id: 'ref_types', labelKey: 'reference.reference_type', value: 'ref_type', sortable: false, renderer: (reference) => }, + {id: 'resolved_repo_versions', labelKey: 'reference.resolved_repo', value: 'resolved_repo_versions', sortable: false, renderer: (reference) => { + return map(reference?.resolved_repo_versions, (version, index) => { + return + }) + }}, + {id: 'summary', labelKey: 'common.results', value: 'summary', sortable: false, renderer: reference => reference.last_resolved_at ? getReferenceSummary(reference) : '-'}, ], repos: [ {id: 'id', labelKey: 'common.id', value: 'id', sortOn: 'id', className: 'searchable'}, diff --git a/src/components/search/Search.jsx b/src/components/search/Search.jsx index 52ef35f8..6168732b 100644 --- a/src/components/search/Search.jsx +++ b/src/components/search/Search.jsx @@ -272,6 +272,8 @@ const Search = props => { }) if(['users', 'orgs', 'references'].includes(__resource)) params.verbose = true + if(__resource === 'references') + params.includeResolvedRepoVersions = true APIService.new().overrideURL(getURL(__resource)).get(null, null, params).then(response => { if(response?.detail) { setAlert({message: response.detail, severity: 'error', duration: 5000}) diff --git a/src/components/search/TableResults.jsx b/src/components/search/TableResults.jsx index f111b4b3..5a9e77da 100644 --- a/src/components/search/TableResults.jsx +++ b/src/components/search/TableResults.jsx @@ -72,7 +72,7 @@ const EnhancedTableHead = props => { } label={ - {refTranslation ? 'Show Expression' : 'Show Translation'} + {refTranslation ? t('reference.raw') : t('reference.translation')} } /> diff --git a/src/i18n/locales/en/translations.json b/src/i18n/locales/en/translations.json index 86fdebe4..bd1a4924 100644 --- a/src/i18n/locales/en/translations.json +++ b/src/i18n/locales/en/translations.json @@ -136,7 +136,8 @@ "copy_api_url": "Copy API URL", "copy_standard_checksum": "Copy Standard Checksum", "copy_smart_checksum": "Copy Smart Checksum", - "committed": "committed" + "committed": "committed", + "results": "Results" }, "errors": { "404": "Sorry your page could not be found.", @@ -251,8 +252,17 @@ "edit_mapping": "Edit Mapping" }, "reference": { + "expression": "Expression", "references": "References", - "reference": "Reference" + "reference": "Reference", + "reference_type": "Ref Type", + "exclude": "Exclude", + "intensional": "Intensional", + "extensional": "Extensional", + "cascade": "Cascade", + "resolved_repo": "Resolved Repo", + "raw": "Raw", + "translation": "Translation" }, "checksums": { "standard": "Standard Checksum",