synapse-react-client 4.0.22 → 4.0.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (131) hide show
  1. package/dist/SWC.index.js +1 -1
  2. package/dist/assets/icons/GeneticsIcon.d.ts +3 -0
  3. package/dist/assets/icons/GeneticsIcon.d.ts.map +1 -0
  4. package/dist/assets/icons/GeneticsIcon.js +14 -0
  5. package/dist/assets/icons/GeneticsIcon.js.map +1 -0
  6. package/dist/components/EntityCitation/EntityCitation.d.ts.map +1 -1
  7. package/dist/components/EntityCitation/EntityCitation.js +49 -32
  8. package/dist/components/EntityCitation/EntityCitation.js.map +1 -1
  9. package/dist/components/GenericCard/DuoTermTags/DuoTermTags.d.ts +18 -0
  10. package/dist/components/GenericCard/DuoTermTags/DuoTermTags.d.ts.map +1 -0
  11. package/dist/components/GenericCard/DuoTermTags/DuoTermTags.js +112 -0
  12. package/dist/components/GenericCard/DuoTermTags/DuoTermTags.js.map +1 -0
  13. package/dist/components/GenericCard/DuoTermTags/duoTerms.d.ts +31 -0
  14. package/dist/components/GenericCard/DuoTermTags/duoTerms.d.ts.map +1 -0
  15. package/dist/components/GenericCard/DuoTermTags/duoTerms.js +198 -0
  16. package/dist/components/GenericCard/DuoTermTags/duoTerms.js.map +1 -0
  17. package/dist/components/GenericCard/SynapseCardLabel.d.ts.map +1 -1
  18. package/dist/components/GenericCard/SynapseCardLabel.js +4 -8
  19. package/dist/components/GenericCard/SynapseCardLabel.js.map +1 -1
  20. package/dist/components/GenericCard/TableRowGenericCard.d.ts +6 -0
  21. package/dist/components/GenericCard/TableRowGenericCard.d.ts.map +1 -1
  22. package/dist/components/GenericCard/TableRowGenericCard.js +168 -153
  23. package/dist/components/GenericCard/TableRowGenericCard.js.map +1 -1
  24. package/dist/components/IconSvg/IconSvg.d.ts +1 -1
  25. package/dist/components/IconSvg/IconSvg.d.ts.map +1 -1
  26. package/dist/components/IconSvg/IconSvg.js +19 -18
  27. package/dist/components/IconSvg/IconSvg.js.map +1 -1
  28. package/dist/components/Plot/SynapsePlot.d.ts +4 -0
  29. package/dist/components/Plot/SynapsePlot.d.ts.map +1 -1
  30. package/dist/components/Plot/SynapsePlot.js +57 -44
  31. package/dist/components/Plot/SynapsePlot.js.map +1 -1
  32. package/dist/components/QueryVisualizationWrapper/QueryVisualizationContext.d.ts +21 -0
  33. package/dist/components/QueryVisualizationWrapper/QueryVisualizationContext.d.ts.map +1 -1
  34. package/dist/components/QueryVisualizationWrapper/QueryVisualizationContext.js.map +1 -1
  35. package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.d.ts +10 -0
  36. package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.d.ts.map +1 -1
  37. package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.js +65 -59
  38. package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.js.map +1 -1
  39. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.d.ts +1 -1
  40. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.d.ts.map +1 -1
  41. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js +2 -0
  42. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js.map +1 -1
  43. package/dist/components/QueryWrapperPlotNav/QueryWrapperSynapsePlot.d.ts.map +1 -1
  44. package/dist/components/QueryWrapperPlotNav/QueryWrapperSynapsePlot.js +77 -34
  45. package/dist/components/QueryWrapperPlotNav/QueryWrapperSynapsePlot.js.map +1 -1
  46. package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.d.ts +33 -6
  47. package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.d.ts.map +1 -1
  48. package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.js +93 -55
  49. package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.js.map +1 -1
  50. package/dist/components/SearchQueryWrapper/SearchQueryWrapper.d.ts +3 -0
  51. package/dist/components/SearchQueryWrapper/SearchQueryWrapper.d.ts.map +1 -1
  52. package/dist/components/SearchQueryWrapper/SearchQueryWrapper.js +39 -37
  53. package/dist/components/SearchQueryWrapper/SearchQueryWrapper.js.map +1 -1
  54. package/dist/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.d.ts +3 -1
  55. package/dist/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.d.ts.map +1 -1
  56. package/dist/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.js +5 -0
  57. package/dist/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.js.map +1 -1
  58. package/dist/components/entity/page/action_menu/EntityActionMenu.d.ts +7 -2
  59. package/dist/components/entity/page/action_menu/EntityActionMenu.d.ts.map +1 -1
  60. package/dist/components/entity/page/action_menu/EntityActionMenu.js +87 -51
  61. package/dist/components/entity/page/action_menu/EntityActionMenu.js.map +1 -1
  62. package/dist/components/entity/page/breadcrumbs/EntityPageBreadcrumbs.d.ts.map +1 -1
  63. package/dist/components/entity/page/breadcrumbs/EntityPageBreadcrumbs.js +0 -1
  64. package/dist/components/entity/page/breadcrumbs/EntityPageBreadcrumbs.js.map +1 -1
  65. package/dist/components/entity/page/title_bar/EntityPageTitleBar.d.ts +1 -0
  66. package/dist/components/entity/page/title_bar/EntityPageTitleBar.d.ts.map +1 -1
  67. package/dist/components/entity/page/title_bar/EntityPageTitleBar.js +31 -22
  68. package/dist/components/entity/page/title_bar/EntityPageTitleBar.js.map +1 -1
  69. package/dist/components/entity/page/title_bar/EntityTitleBarVersionInfo.d.ts.map +1 -1
  70. package/dist/components/entity/page/title_bar/EntityTitleBarVersionInfo.js +34 -20
  71. package/dist/components/entity/page/title_bar/EntityTitleBarVersionInfo.js.map +1 -1
  72. package/dist/components/favorites/FavoriteButton.d.ts +1 -0
  73. package/dist/components/favorites/FavoriteButton.d.ts.map +1 -1
  74. package/dist/components/favorites/FavoriteButton.js +8 -8
  75. package/dist/components/favorites/FavoriteButton.js.map +1 -1
  76. package/dist/components/index.d.ts +1 -0
  77. package/dist/components/index.d.ts.map +1 -1
  78. package/dist/components/menu/ComplexMenu.d.ts +8 -1
  79. package/dist/components/menu/ComplexMenu.d.ts.map +1 -1
  80. package/dist/components/menu/ComplexMenu.js +50 -20
  81. package/dist/components/menu/ComplexMenu.js.map +1 -1
  82. package/dist/components/menu/DropdownMenu.d.ts +1 -0
  83. package/dist/components/menu/DropdownMenu.d.ts.map +1 -1
  84. package/dist/components/menu/DropdownMenu.js +24 -24
  85. package/dist/components/menu/DropdownMenu.js.map +1 -1
  86. package/dist/components/widgets/facet-nav/FacetNavPanel.d.ts.map +1 -1
  87. package/dist/components/widgets/facet-nav/FacetNavPanel.js +59 -49
  88. package/dist/components/widgets/facet-nav/FacetNavPanel.js.map +1 -1
  89. package/dist/components/widgets/facet-nav/FacetValueChip.d.ts +25 -0
  90. package/dist/components/widgets/facet-nav/FacetValueChip.d.ts.map +1 -0
  91. package/dist/components/widgets/facet-nav/FacetValueChip.js +40 -0
  92. package/dist/components/widgets/facet-nav/FacetValueChip.js.map +1 -0
  93. package/dist/components/widgets/facet-nav/PlotsContainer.d.ts.map +1 -1
  94. package/dist/components/widgets/facet-nav/PlotsContainer.js +8 -2
  95. package/dist/components/widgets/facet-nav/PlotsContainer.js.map +1 -1
  96. package/dist/components/widgets/facet-nav/SelectionCriteriaPill.d.ts +10 -5
  97. package/dist/components/widgets/facet-nav/SelectionCriteriaPill.d.ts.map +1 -1
  98. package/dist/components/widgets/facet-nav/SelectionCriteriaPill.js +10 -17
  99. package/dist/components/widgets/facet-nav/SelectionCriteriaPill.js.map +1 -1
  100. package/dist/components/widgets/facet-nav/SelectionCriteriaPills.d.ts.map +1 -1
  101. package/dist/components/widgets/facet-nav/SelectionCriteriaPills.js +11 -10
  102. package/dist/components/widgets/facet-nav/SelectionCriteriaPills.js.map +1 -1
  103. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilter.d.ts.map +1 -1
  104. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilter.js +70 -54
  105. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilter.js.map +1 -1
  106. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterOption.d.ts +2 -1
  107. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterOption.d.ts.map +1 -1
  108. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterOption.js +17 -1
  109. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterOption.js.map +1 -1
  110. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUI.d.ts +2 -0
  111. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUI.d.ts.map +1 -1
  112. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUI.js +7 -7
  113. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUI.js.map +1 -1
  114. package/dist/features/curator/dashboard/components/CurationTaskCard.d.ts.map +1 -1
  115. package/dist/features/curator/dashboard/components/CurationTaskCard.js +99 -45
  116. package/dist/features/curator/dashboard/components/CurationTaskCard.js.map +1 -1
  117. package/dist/features/entity/metadata-task/components/CreateOrUpdateCurationTaskDialog.d.ts.map +1 -1
  118. package/dist/features/entity/metadata-task/components/CreateOrUpdateCurationTaskDialog.js +174 -149
  119. package/dist/features/entity/metadata-task/components/CreateOrUpdateCurationTaskDialog.js.map +1 -1
  120. package/dist/features/entity/metadata-task/utils/constants.d.ts +6 -0
  121. package/dist/features/entity/metadata-task/utils/constants.d.ts.map +1 -1
  122. package/dist/features/entity/metadata-task/utils/constants.js +19 -2
  123. package/dist/features/entity/metadata-task/utils/constants.js.map +1 -1
  124. package/dist/style/components/_total-query-results.scss +10 -34
  125. package/dist/style/components/facet_nav/_facet-nav-panel.scss +11 -0
  126. package/dist/style/main.css +1 -1
  127. package/dist/synapse-queries/curation/task/useCurationTask.d.ts.map +1 -1
  128. package/dist/synapse-queries/curation/task/useCurationTask.js +1 -1
  129. package/dist/synapse-queries/curation/task/useCurationTask.js.map +1 -1
  130. package/dist/tsconfig.build.tsbuildinfo +1 -1
  131. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"EnumFacetFilter.js","names":[],"sources":["../../../../../src/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilter.tsx"],"sourcesContent":["import { isFacetColumnValuesRequest, SynapseConstants } from '@/utils'\nimport {\n getCorrespondingColumnForFacet,\n getCorrespondingSelectedFacet,\n} from '@/utils/functions/queryUtils'\nimport useGetInfoFromIds from '@/utils/hooks/useGetInfoFromIds'\nimport {\n ColumnTypeEnum,\n EntityHeader,\n Evaluation,\n FacetColumnRequest,\n FacetColumnResultValueCount,\n FacetColumnResultValues,\n FacetColumnValuesRequest,\n QueryBundleRequest,\n UserGroupHeader,\n} from '@sage-bionetworks/synapse-types'\nimport { cloneDeep, partition, pick, sortBy } from 'lodash-es'\nimport { Suspense, useMemo } from 'react'\nimport { useQueryContext } from '../../../QueryContext'\nimport { useQueryVisualizationContext } from '../../../QueryVisualizationWrapper'\nimport { useSuspenseGetQueryMetadata } from '../../../QueryWrapper/useGetQueryMetadata'\nimport { EnumFacetFilterSkeleton } from './EnumFacetFilterSkeleton'\nimport EnumFacetFilterUI, { RenderedFacetValue } from './EnumFacetFilterUI'\nimport { getAllIsSelected, valueToLabel } from './EnumFacetFilterUtils'\n\nexport type EnumFacetFilterProps = {\n labelId?: string\n facet: FacetColumnResultValues\n containerAs?: 'Collapsible' | 'Dropdown'\n dropdownType?: 'Icon' | 'SelectBox'\n hideCollapsible?: boolean\n defaultShowAllValues?: boolean\n}\n\nfunction EnumFacetFilterInternal(props: EnumFacetFilterProps) {\n const {\n facet,\n containerAs = 'Collapsible',\n dropdownType = 'Icon',\n hideCollapsible = false,\n defaultShowAllValues = false,\n labelId,\n } = props\n const {\n nextQueryRequest,\n addValueToSelectedFacet,\n removeSelectedFacet,\n removeValueFromSelectedFacet,\n resetDebounceTimer,\n } = useQueryContext()\n\n const { data: queryMetadata } = useSuspenseGetQueryMetadata()\n const { getColumnDisplayName } = useQueryVisualizationContext()\n\n const currentSelectedFacet: FacetColumnValuesRequest | undefined =\n useMemo(() => {\n const facetColumnRequest = getCorrespondingSelectedFacet(\n facet,\n cloneDeep(nextQueryRequest.query.selectedFacets) as\n | FacetColumnRequest[]\n | undefined,\n )\n\n if (\n facetColumnRequest &&\n !isFacetColumnValuesRequest(facetColumnRequest)\n ) {\n console.error(\n `The facet rendered in EnumFacetFilter is not a FacetColumnValuesRequest`,\n facet,\n )\n return undefined\n }\n return facetColumnRequest\n }, [facet, nextQueryRequest.query.selectedFacets])\n\n // Must compare the known facet values to the \"uncommitted\" current query\n const allIsSelected = getAllIsSelected(\n cloneDeep(nextQueryRequest) as QueryBundleRequest,\n facet,\n )\n\n const columnModel = queryMetadata.columnModels\n ? getCorrespondingColumnForFacet(facet, queryMetadata.columnModels)\n : undefined\n\n const isNumberColumnType = useMemo(() => {\n switch (columnModel?.columnType) {\n case ColumnTypeEnum.DOUBLE:\n case ColumnTypeEnum.DATE:\n case ColumnTypeEnum.INTEGER:\n return true\n default:\n return false\n }\n }, [columnModel])\n\n const userIds =\n columnModel?.columnType === ColumnTypeEnum.USERID ||\n columnModel?.columnType === ColumnTypeEnum.USERID_LIST\n ? facet.facetValues.map(facet => facet.value)\n : []\n const userGroupHeaders = useGetInfoFromIds<UserGroupHeader>({\n ids: userIds,\n type: 'USER_PROFILE',\n })\n\n const entityIds =\n columnModel?.columnType === ColumnTypeEnum.ENTITYID ||\n columnModel?.columnType === ColumnTypeEnum.ENTITYID_LIST\n ? facet.facetValues.map(facet => facet.value)\n : []\n const entityHeaders = useGetInfoFromIds<EntityHeader>({\n ids: entityIds,\n type: 'ENTITY_HEADER',\n })\n\n const evaluationIds =\n columnModel?.columnType === ColumnTypeEnum.EVALUATIONID\n ? facet.facetValues.map(facet => facet.value)\n : []\n const evaluations = useGetInfoFromIds<Evaluation>({\n ids: evaluationIds,\n type: 'EVALUATION_QUEUE',\n })\n\n const displayedFacetValues: RenderedFacetValue[] = useMemo(() => {\n const renderedFacetValues = facet.facetValues.map(\n (facetValue: FacetColumnResultValueCount): RenderedFacetValue => {\n return {\n ...facetValue,\n // Selected status should be based on the 'nextQuery', not the result data\n // This ensures the checkboxes respond instantly to user interaction, like while waiting for multiple changes to debounce\n isSelected:\n currentSelectedFacet?.facetValues.includes(facetValue.value) ??\n false,\n displayText: valueToLabel(\n facetValue,\n userGroupHeaders,\n entityHeaders,\n evaluations,\n ),\n }\n },\n )\n //Abby V's suggestion, always show the VALUE_NOT_SET facet value on the bottom of this sorted list\n const partitions = partition(\n renderedFacetValues,\n facet => facet.value === SynapseConstants.VALUE_NOT_SET,\n )\n const valueNotSetFacetArray = partitions[0]\n const restOfFacetValuesArray = partitions[1]\n\n // Apply client-side sorting if no server-side sort is specified\n let sortedValues: RenderedFacetValue[] = restOfFacetValuesArray\n const isClientSideSort =\n columnModel == undefined || columnModel.facetSortConfig == undefined\n if (isClientSideSort) {\n if (isNumberColumnType) {\n sortedValues = sortBy(restOfFacetValuesArray, fv => Number(fv.value))\n } else {\n sortedValues = sortBy(restOfFacetValuesArray, fv =>\n fv.displayText.toLowerCase(),\n )\n }\n }\n\n return [...sortedValues, ...valueNotSetFacetArray]\n }, [\n facet.facetValues,\n columnModel,\n currentSelectedFacet?.facetValues,\n userGroupHeaders,\n entityHeaders,\n evaluations,\n isNumberColumnType,\n ])\n\n if (!columnModel) {\n return <></>\n }\n\n return (\n <EnumFacetFilterUI\n labelId={labelId}\n facetTitle={getColumnDisplayName(facet.columnName, facet.jsonPath)}\n filterIsActive={!allIsSelected}\n facetValues={displayedFacetValues}\n containerAs={containerAs}\n dropdownType={dropdownType}\n hideCollapsible={hideCollapsible}\n defaultShowAllValues={defaultShowAllValues}\n onHoverOverValue={() => {\n // SWC-6698: delay the query execution (via the debounce) when an item is hovered over\n resetDebounceTimer()\n }}\n onAddValueToSelection={value => {\n addValueToSelectedFacet(\n pick(facet, ['columnName', 'jsonPath']),\n value,\n { debounce: true },\n )\n }}\n onRemoveValueFromSelection={value => {\n removeValueFromSelectedFacet(\n pick(facet, ['columnName', 'jsonPath']),\n value,\n { debounce: true },\n )\n }}\n onRemoveAllFacetSelections={() =>\n removeSelectedFacet(pick(facet, ['columnName', 'jsonPath']))\n }\n canMultiSelect={true}\n />\n )\n}\n\nexport function EnumFacetFilter(props: EnumFacetFilterProps) {\n const { containerAs = 'Collapsible', dropdownType = 'Icon' } = props\n return (\n <Suspense\n fallback={\n <EnumFacetFilterSkeleton\n containerAs={containerAs}\n dropdownType={dropdownType}\n />\n }\n >\n <EnumFacetFilterInternal {...props} />\n </Suspense>\n )\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"EnumFacetFilter.js","names":[],"sources":["../../../../../src/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilter.tsx"],"sourcesContent":["import { isFacetColumnValuesRequest, SynapseConstants } from '@/utils'\nimport {\n getCorrespondingColumnForFacet,\n getCorrespondingSelectedFacet,\n} from '@/utils/functions/queryUtils'\nimport useGetInfoFromIds from '@/utils/hooks/useGetInfoFromIds'\nimport {\n ColumnTypeEnum,\n EntityHeader,\n Evaluation,\n FacetColumnRequest,\n FacetColumnResultValueCount,\n FacetColumnResultValues,\n FacetColumnValuesRequest,\n QueryBundleRequest,\n UserGroupHeader,\n} from '@sage-bionetworks/synapse-types'\nimport { cloneDeep, partition, pick, sortBy } from 'lodash-es'\nimport { Suspense, useMemo } from 'react'\nimport { useQueryContext } from '../../../QueryContext'\nimport { useQueryVisualizationContext } from '../../../QueryVisualizationWrapper'\nimport { useSuspenseGetQueryMetadata } from '../../../QueryWrapper/useGetQueryMetadata'\nimport { EnumFacetFilterSkeleton } from './EnumFacetFilterSkeleton'\nimport EnumFacetFilterUI, { RenderedFacetValue } from './EnumFacetFilterUI'\nimport { getAllIsSelected, valueToLabel } from './EnumFacetFilterUtils'\nimport FacetValueChip from '../../facet-nav/FacetValueChip'\n\nexport type EnumFacetFilterProps = {\n labelId?: string\n facet: FacetColumnResultValues\n containerAs?: 'Collapsible' | 'Dropdown'\n dropdownType?: 'Icon' | 'SelectBox'\n hideCollapsible?: boolean\n defaultShowAllValues?: boolean\n}\n\nfunction EnumFacetFilterInternal(props: EnumFacetFilterProps) {\n const {\n facet,\n containerAs = 'Collapsible',\n dropdownType = 'Icon',\n hideCollapsible = false,\n defaultShowAllValues = false,\n labelId,\n } = props\n const {\n nextQueryRequest,\n addValueToSelectedFacet,\n removeSelectedFacet,\n removeValueFromSelectedFacet,\n resetDebounceTimer,\n } = useQueryContext()\n\n const { data: queryMetadata } = useSuspenseGetQueryMetadata()\n const { getColumnDisplayName, renderFacetValue } =\n useQueryVisualizationContext()\n\n const currentSelectedFacet: FacetColumnValuesRequest | undefined =\n useMemo(() => {\n const facetColumnRequest = getCorrespondingSelectedFacet(\n facet,\n cloneDeep(nextQueryRequest.query.selectedFacets) as\n | FacetColumnRequest[]\n | undefined,\n )\n\n if (\n facetColumnRequest &&\n !isFacetColumnValuesRequest(facetColumnRequest)\n ) {\n console.error(\n `The facet rendered in EnumFacetFilter is not a FacetColumnValuesRequest`,\n facet,\n )\n return undefined\n }\n return facetColumnRequest\n }, [facet, nextQueryRequest.query.selectedFacets])\n\n // Must compare the known facet values to the \"uncommitted\" current query\n const allIsSelected = getAllIsSelected(\n cloneDeep(nextQueryRequest) as QueryBundleRequest,\n facet,\n )\n\n const columnModel = queryMetadata.columnModels\n ? getCorrespondingColumnForFacet(facet, queryMetadata.columnModels)\n : undefined\n\n const isNumberColumnType = useMemo(() => {\n switch (columnModel?.columnType) {\n case ColumnTypeEnum.DOUBLE:\n case ColumnTypeEnum.DATE:\n case ColumnTypeEnum.INTEGER:\n return true\n default:\n return false\n }\n }, [columnModel])\n\n const userIds =\n columnModel?.columnType === ColumnTypeEnum.USERID ||\n columnModel?.columnType === ColumnTypeEnum.USERID_LIST\n ? facet.facetValues.map(facet => facet.value)\n : []\n const userGroupHeaders = useGetInfoFromIds<UserGroupHeader>({\n ids: userIds,\n type: 'USER_PROFILE',\n })\n\n const entityIds =\n columnModel?.columnType === ColumnTypeEnum.ENTITYID ||\n columnModel?.columnType === ColumnTypeEnum.ENTITYID_LIST\n ? facet.facetValues.map(facet => facet.value)\n : []\n const entityHeaders = useGetInfoFromIds<EntityHeader>({\n ids: entityIds,\n type: 'ENTITY_HEADER',\n })\n\n const evaluationIds =\n columnModel?.columnType === ColumnTypeEnum.EVALUATIONID\n ? facet.facetValues.map(facet => facet.value)\n : []\n const evaluations = useGetInfoFromIds<Evaluation>({\n ids: evaluationIds,\n type: 'EVALUATION_QUEUE',\n })\n\n const displayedFacetValues: RenderedFacetValue[] = useMemo(() => {\n const renderedFacetValues = facet.facetValues.map(\n (facetValue: FacetColumnResultValueCount): RenderedFacetValue => {\n const displayText = valueToLabel(\n facetValue,\n userGroupHeaders,\n entityHeaders,\n evaluations,\n )\n return {\n ...facetValue,\n // Selected status should be based on the 'nextQuery', not the result data\n // This ensures the checkboxes respond instantly to user interaction, like while waiting for multiple changes to debounce\n isSelected:\n currentSelectedFacet?.facetValues.includes(facetValue.value) ??\n false,\n displayText,\n renderedLabel: (() => {\n const rendered = renderFacetValue?.(\n facet.columnName,\n facetValue.value,\n )\n return rendered ? (\n <FacetValueChip\n label={rendered.label}\n icon={rendered.icon}\n tooltipTitle={rendered.tooltipTitle}\n placement=\"right\"\n truncate\n />\n ) : undefined\n })(),\n }\n },\n )\n //Abby V's suggestion, always show the VALUE_NOT_SET facet value on the bottom of this sorted list\n const partitions = partition(\n renderedFacetValues,\n facet => facet.value === SynapseConstants.VALUE_NOT_SET,\n )\n const valueNotSetFacetArray = partitions[0]\n const restOfFacetValuesArray = partitions[1]\n\n // Apply client-side sorting if no server-side sort is specified\n let sortedValues: RenderedFacetValue[] = restOfFacetValuesArray\n const isClientSideSort =\n columnModel == undefined || columnModel.facetSortConfig == undefined\n if (isClientSideSort) {\n if (isNumberColumnType) {\n sortedValues = sortBy(restOfFacetValuesArray, fv => Number(fv.value))\n } else {\n sortedValues = sortBy(restOfFacetValuesArray, fv =>\n fv.displayText.toLowerCase(),\n )\n }\n }\n\n return [...sortedValues, ...valueNotSetFacetArray]\n }, [\n facet.facetValues,\n facet.columnName,\n columnModel,\n currentSelectedFacet?.facetValues,\n userGroupHeaders,\n entityHeaders,\n evaluations,\n isNumberColumnType,\n renderFacetValue,\n ])\n\n if (!columnModel) {\n return <></>\n }\n\n return (\n <EnumFacetFilterUI\n labelId={labelId}\n facetTitle={getColumnDisplayName(facet.columnName, facet.jsonPath)}\n filterIsActive={!allIsSelected}\n facetValues={displayedFacetValues}\n containerAs={containerAs}\n dropdownType={dropdownType}\n hideCollapsible={hideCollapsible}\n defaultShowAllValues={defaultShowAllValues}\n onHoverOverValue={() => {\n // SWC-6698: delay the query execution (via the debounce) when an item is hovered over\n resetDebounceTimer()\n }}\n onAddValueToSelection={value => {\n addValueToSelectedFacet(\n pick(facet, ['columnName', 'jsonPath']),\n value,\n { debounce: true },\n )\n }}\n onRemoveValueFromSelection={value => {\n removeValueFromSelectedFacet(\n pick(facet, ['columnName', 'jsonPath']),\n value,\n { debounce: true },\n )\n }}\n onRemoveAllFacetSelections={() =>\n removeSelectedFacet(pick(facet, ['columnName', 'jsonPath']))\n }\n canMultiSelect={true}\n />\n )\n}\n\nexport function EnumFacetFilter(props: EnumFacetFilterProps) {\n const { containerAs = 'Collapsible', dropdownType = 'Icon' } = props\n return (\n <Suspense\n fallback={\n <EnumFacetFilterSkeleton\n containerAs={containerAs}\n dropdownType={dropdownType}\n />\n }\n >\n <EnumFacetFilterInternal {...props} />\n </Suspense>\n )\n}\n"],"mappings":"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"}
@@ -1,6 +1,7 @@
1
+ import { ReactNode } from 'react';
1
2
  type EnumFacetFilterOptionProps = {
2
3
  readonly id: string;
3
- readonly label: string;
4
+ readonly label: ReactNode;
4
5
  readonly count?: number;
5
6
  readonly isDropdown: boolean;
6
7
  readonly checked: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"EnumFacetFilterOption.d.ts","sourceRoot":"","sources":["../../../../../src/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterOption.tsx"],"names":[],"mappings":"AAEA,KAAK,0BAA0B,GAAG;IAChC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAA;IAC5B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAA;IAC9C,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAA;IAC5B,QAAQ,CAAC,SAAS,EAAE,UAAU,GAAG,OAAO,CAAA;CACzC,CAAA;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,0BAA0B,2CA6DtE"}
1
+ {"version":3,"file":"EnumFacetFilterOption.d.ts","sourceRoot":"","sources":["../../../../../src/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterOption.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEjC,KAAK,0BAA0B,GAAG;IAChC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAA;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAA;IAC5B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAA;IAC9C,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAA;IAC5B,QAAQ,CAAC,SAAS,EAAE,UAAU,GAAG,OAAO,CAAA;CACzC,CAAA;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,0BAA0B,2CAwEtE"}
@@ -17,7 +17,15 @@ function s(s) {
17
17
  children: [/* @__PURE__ */ a(n, {
18
18
  control: a(h === "checkbox" ? t : r, {}),
19
19
  className: "EnumFacetFilter__checkbox",
20
- sx: { overflowWrap: "anywhere" },
20
+ sx: {
21
+ overflowWrap: "anywhere",
22
+ flex: 1,
23
+ minWidth: 0,
24
+ "& .MuiFormControlLabel-label": {
25
+ minWidth: 0,
26
+ overflow: "hidden"
27
+ }
28
+ },
21
29
  onClick: (e) => e.stopPropagation(),
22
30
  onChange: (e, t) => {
23
31
  p(t);
@@ -26,6 +34,10 @@ function s(s) {
26
34
  label: l
27
35
  }, `${c}`), u != null && /* @__PURE__ */ o(i, { children: [d && /* @__PURE__ */ o("span", {
28
36
  className: "EnumFacetFilter__count",
37
+ style: {
38
+ flexShrink: 0,
39
+ marginLeft: 8
40
+ },
29
41
  children: [
30
42
  "(",
31
43
  u.toLocaleString(),
@@ -33,6 +45,10 @@ function s(s) {
33
45
  ]
34
46
  }), !d && /* @__PURE__ */ a("div", {
35
47
  className: "EnumFacetFilter__count",
48
+ style: {
49
+ flexShrink: 0,
50
+ marginLeft: 8
51
+ },
36
52
  children: u.toLocaleString()
37
53
  })] })]
38
54
  });
@@ -1 +1 @@
1
- {"version":3,"file":"EnumFacetFilterOption.js","names":[],"sources":["../../../../../src/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterOption.tsx"],"sourcesContent":["import { Box, Checkbox, FormControlLabel, Radio } from '@mui/material'\n\ntype EnumFacetFilterOptionProps = {\n readonly id: string\n readonly label: string\n readonly count?: number\n readonly isDropdown: boolean\n readonly checked: boolean\n readonly onChange: (selected: boolean) => void\n readonly onHover: () => void\n readonly inputType: 'checkbox' | 'radio'\n}\n\nexport function EnumFacetFilterOption(props: EnumFacetFilterOptionProps) {\n const {\n id,\n label,\n count,\n isDropdown,\n checked,\n onChange,\n onHover,\n inputType,\n } = props\n\n const control = inputType === 'checkbox' ? <Checkbox /> : <Radio />\n\n return (\n <Box\n className=\"EnumFacetFilter__checkboxContainer\"\n onClick={() => {\n // If this is a dropdown option, clicking anywhere in the field should toggle selection\n if (isDropdown) {\n onChange(!checked)\n }\n }}\n onMouseEnter={onHover}\n sx={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n }}\n >\n <FormControlLabel\n control={control}\n className=\"EnumFacetFilter__checkbox\"\n sx={{\n overflowWrap: 'anywhere',\n }}\n onClick={event => event.stopPropagation()}\n onChange={(_event, newValue) => {\n onChange(newValue)\n }}\n key={`${id}`}\n checked={checked}\n label={label}\n />\n\n {count != null && (\n <>\n {isDropdown && (\n <span className=\"EnumFacetFilter__count\">\n ({count.toLocaleString()})\n </span>\n )}\n {!isDropdown && (\n <div className=\"EnumFacetFilter__count\">\n {count.toLocaleString()}\n </div>\n )}\n </>\n )}\n </Box>\n )\n}\n"],"mappings":";;;AAaA,SAAgB,EAAsB,GAAmC;CACvE,IAAM,EACJ,OACA,UACA,UACA,eACA,YACA,aACA,YACA,iBACE;CAIJ,OACE,kBAAC,GAAD;EACE,WAAU;EACV,eAAe;GAEb,AAAI,KACF,EAAS,CAAC,CAAO;EAErB;EACA,cAAc;EACd,IAAI;GACF,SAAS;GACT,gBAAgB;GAChB,YAAY;EACd;YAbF,CAeE,kBAAC,GAAD;GACW,SAnB4B,EAA3B,MAAc,aAAc,IAAe,GAAhB,CAAW,CAAY;GAoB5D,WAAU;GACV,IAAI,EACF,cAAc,WAChB;GACA,UAAS,MAAS,EAAM,gBAAgB;GACxC,WAAW,GAAQ,MAAa;IAC9B,EAAS,CAAQ;GACnB;GAES;GACF;EACR,GAHM,GAAG,GAGT,GAEA,KAAS,QACR,kBAAA,GAAA,EAAA,UAAA,CACG,KACC,kBAAC,QAAD;GAAM,WAAU;aAAhB;IAAyC;IACrC,EAAM,eAAe;IAAE;GACrB;MAEP,CAAC,KACA,kBAAC,OAAD;GAAK,WAAU;aACZ,EAAM,eAAe;EACnB,CAAA,CAEP,EAAA,CAAA,CAED;;AAET"}
1
+ {"version":3,"file":"EnumFacetFilterOption.js","names":[],"sources":["../../../../../src/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterOption.tsx"],"sourcesContent":["import { Box, Checkbox, FormControlLabel, Radio } from '@mui/material'\nimport { ReactNode } from 'react'\n\ntype EnumFacetFilterOptionProps = {\n readonly id: string\n readonly label: ReactNode\n readonly count?: number\n readonly isDropdown: boolean\n readonly checked: boolean\n readonly onChange: (selected: boolean) => void\n readonly onHover: () => void\n readonly inputType: 'checkbox' | 'radio'\n}\n\nexport function EnumFacetFilterOption(props: EnumFacetFilterOptionProps) {\n const {\n id,\n label,\n count,\n isDropdown,\n checked,\n onChange,\n onHover,\n inputType,\n } = props\n\n const control = inputType === 'checkbox' ? <Checkbox /> : <Radio />\n\n return (\n <Box\n className=\"EnumFacetFilter__checkboxContainer\"\n onClick={() => {\n // If this is a dropdown option, clicking anywhere in the field should toggle selection\n if (isDropdown) {\n onChange(!checked)\n }\n }}\n onMouseEnter={onHover}\n sx={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n }}\n >\n <FormControlLabel\n control={control}\n className=\"EnumFacetFilter__checkbox\"\n sx={{\n overflowWrap: 'anywhere',\n // Let the label shrink so the count stays in a consistent column\n // (and custom node labels can truncate rather than overflow the row).\n flex: 1,\n minWidth: 0,\n '& .MuiFormControlLabel-label': { minWidth: 0, overflow: 'hidden' },\n }}\n onClick={event => event.stopPropagation()}\n onChange={(_event, newValue) => {\n onChange(newValue)\n }}\n key={`${id}`}\n checked={checked}\n label={label}\n />\n\n {count != null && (\n <>\n {isDropdown && (\n <span\n className=\"EnumFacetFilter__count\"\n style={{ flexShrink: 0, marginLeft: 8 }}\n >\n ({count.toLocaleString()})\n </span>\n )}\n {!isDropdown && (\n <div\n className=\"EnumFacetFilter__count\"\n style={{ flexShrink: 0, marginLeft: 8 }}\n >\n {count.toLocaleString()}\n </div>\n )}\n </>\n )}\n </Box>\n )\n}\n"],"mappings":";;;AAcA,SAAgB,EAAsB,GAAmC;CACvE,IAAM,EACJ,OACA,UACA,UACA,eACA,YACA,aACA,YACA,iBACE;CAIJ,OACE,kBAAC,GAAD;EACE,WAAU;EACV,eAAe;GAEb,AAAI,KACF,EAAS,CAAC,CAAO;EAErB;EACA,cAAc;EACd,IAAI;GACF,SAAS;GACT,gBAAgB;GAChB,YAAY;EACd;YAbF,CAeE,kBAAC,GAAD;GACW,SAnB4B,EAA3B,MAAc,aAAc,IAAe,GAAhB,CAAW,CAAY;GAoB5D,WAAU;GACV,IAAI;IACF,cAAc;IAGd,MAAM;IACN,UAAU;IACV,gCAAgC;KAAE,UAAU;KAAG,UAAU;IAAS;GACpE;GACA,UAAS,MAAS,EAAM,gBAAgB;GACxC,WAAW,GAAQ,MAAa;IAC9B,EAAS,CAAQ;GACnB;GAES;GACF;EACR,GAHM,GAAG,GAGT,GAEA,KAAS,QACR,kBAAA,GAAA,EAAA,UAAA,CACG,KACC,kBAAC,QAAD;GACE,WAAU;GACV,OAAO;IAAE,YAAY;IAAG,YAAY;GAAE;aAFxC;IAGC;IACG,EAAM,eAAe;IAAE;GACrB;MAEP,CAAC,KACA,kBAAC,OAAD;GACE,WAAU;GACV,OAAO;IAAE,YAAY;IAAG,YAAY;GAAE;aAErC,EAAM,eAAe;EACnB,CAAA,CAEP,EAAA,CAAA,CAED;;AAET"}
@@ -1,8 +1,10 @@
1
+ import { ReactNode } from 'react';
1
2
  import { FacetColumnResultValueCount } from '@sage-bionetworks/synapse-types';
2
3
  import { SetOptional } from 'type-fest';
3
4
  export type RenderedFacetValue<TValue = string> = Omit<SetOptional<FacetColumnResultValueCount, 'count'>, 'value'> & {
4
5
  value: TValue;
5
6
  displayText: string;
7
+ renderedLabel?: ReactNode;
6
8
  };
7
9
  export type EnumFacetFilterUIProps<TValue = string> = {
8
10
  labelId?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"EnumFacetFilterUI.d.ts","sourceRoot":"","sources":["../../../../../src/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUI.tsx"],"names":[],"mappings":"AASA,OAAO,EAAE,2BAA2B,EAAE,MAAM,iCAAiC,CAAA;AAK7E,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAIvC,MAAM,MAAM,kBAAkB,CAAC,MAAM,GAAG,MAAM,IAAI,IAAI,CACpD,WAAW,CAAC,2BAA2B,EAAE,OAAO,CAAC,EACjD,OAAO,CACR,GAAG;IACF,KAAK,EAAE,MAAM,CAAA;IAEb,WAAW,EAAE,MAAM,CAAA;CACpB,CAAA;AAED,MAAM,MAAM,sBAAsB,CAAC,MAAM,GAAG,MAAM,IAAI;IAEpD,OAAO,CAAC,EAAE,MAAM,CAAA;IAEhB,UAAU,EAAE,MAAM,CAAA;IAElB,WAAW,EAAE,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAA;IAEzC,cAAc,EAAE,OAAO,CAAA;IAEvB,WAAW,CAAC,EAAE,aAAa,GAAG,UAAU,CAAA;IAExC,YAAY,CAAC,EAAE,MAAM,GAAG,WAAW,CAAA;IAEnC,eAAe,CAAC,EAAE,OAAO,CAAA;IAEzB,qBAAqB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IAE9C,0BAA0B,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IAEnD,0BAA0B,EAAE,MAAM,IAAI,CAAA;IAEtC,gBAAgB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IAEzC,cAAc,EAAE,OAAO,CAAA;IAEvB,oBAAoB,CAAC,EAAE,OAAO,CAAA;CAC/B,CAAA;AAMD,MAAM,CAAC,OAAO,UAAU,iBAAiB,CAAC,MAAM,GAAG,MAAM,EACvD,KAAK,EAAE,sBAAsB,CAAC,MAAM,CAAC,2CAgQtC"}
1
+ {"version":3,"file":"EnumFacetFilterUI.d.ts","sourceRoot":"","sources":["../../../../../src/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUI.tsx"],"names":[],"mappings":"AAQA,OAAO,EAAE,SAAS,EAA6B,MAAM,OAAO,CAAA;AAC5D,OAAO,EAAE,2BAA2B,EAAE,MAAM,iCAAiC,CAAA;AAK7E,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAIvC,MAAM,MAAM,kBAAkB,CAAC,MAAM,GAAG,MAAM,IAAI,IAAI,CACpD,WAAW,CAAC,2BAA2B,EAAE,OAAO,CAAC,EACjD,OAAO,CACR,GAAG;IACF,KAAK,EAAE,MAAM,CAAA;IAEb,WAAW,EAAE,MAAM,CAAA;IAEnB,aAAa,CAAC,EAAE,SAAS,CAAA;CAC1B,CAAA;AAED,MAAM,MAAM,sBAAsB,CAAC,MAAM,GAAG,MAAM,IAAI;IAEpD,OAAO,CAAC,EAAE,MAAM,CAAA;IAEhB,UAAU,EAAE,MAAM,CAAA;IAElB,WAAW,EAAE,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAA;IAEzC,cAAc,EAAE,OAAO,CAAA;IAEvB,WAAW,CAAC,EAAE,aAAa,GAAG,UAAU,CAAA;IAExC,YAAY,CAAC,EAAE,MAAM,GAAG,WAAW,CAAA;IAEnC,eAAe,CAAC,EAAE,OAAO,CAAA;IAEzB,qBAAqB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IAE9C,0BAA0B,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IAEnD,0BAA0B,EAAE,MAAM,IAAI,CAAA;IAEtC,gBAAgB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IAEzC,cAAc,EAAE,OAAO,CAAA;IAEvB,oBAAoB,CAAC,EAAE,OAAO,CAAA;CAC/B,CAAA;AAMD,MAAM,CAAC,OAAO,UAAU,iBAAiB,CAAC,MAAM,GAAG,MAAM,EACvD,KAAK,EAAE,sBAAsB,CAAC,MAAM,CAAC,2CAiQtC"}
@@ -89,25 +89,25 @@ function v(v) {
89
89
  })]
90
90
  }), /* @__PURE__ */ h("div", { children: [
91
91
  H.map((e, t) => {
92
- let { isSelected: r, displayText: i, value: a, count: o } = e;
92
+ let { isSelected: r, displayText: i, renderedLabel: a, value: o, count: s } = e;
93
93
  return /* @__PURE__ */ m(n, {
94
94
  id: [
95
95
  _(D),
96
- _(String(a)),
96
+ _(String(o)),
97
97
  t
98
98
  ].join("-"),
99
- label: i,
100
- count: o,
99
+ label: a ?? i,
100
+ count: s,
101
101
  isDropdown: W,
102
102
  checked: r,
103
103
  onHover: () => {
104
- k(a);
104
+ k(o);
105
105
  },
106
106
  onChange: (e) => {
107
- e ? T(a) : E(a);
107
+ e ? T(o) : E(o);
108
108
  },
109
109
  inputType: A ? "checkbox" : "radio"
110
- }, String(a));
110
+ }, String(o));
111
111
  }),
112
112
  !W && /* @__PURE__ */ h(p, { children: [G && /* @__PURE__ */ m("button", {
113
113
  className: "EnumFacetFilter__showMoreFacetsBtn",
@@ -1 +1 @@
1
- {"version":3,"file":"EnumFacetFilterUI.js","names":[],"sources":["../../../../../src/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUI.tsx"],"sourcesContent":["import {\n Checkbox,\n Collapse,\n FormControlLabel,\n IconButton,\n TextField,\n Tooltip,\n} from '@mui/material'\nimport { useMemo, useRef, useState } from 'react'\nimport { FacetColumnResultValueCount } from '@sage-bionetworks/synapse-types'\nimport IconSvg from '../../../IconSvg/IconSvg'\nimport { FacetFilterHeader } from '../FacetFilterHeader'\nimport { EnumFacetFilterOption } from './EnumFacetFilterOption'\nimport EnumFacetFilterDropdown from './EnumFacetFilterDropdown'\nimport { SetOptional } from 'type-fest'\n\nconst MAX_ENUMERATION_VALUES_TO_SHOW = 5\n\nexport type RenderedFacetValue<TValue = string> = Omit<\n SetOptional<FacetColumnResultValueCount, 'count'>,\n 'value'\n> & {\n value: TValue\n /* Text displayed for the option, and also used to filter in search */\n displayText: string\n}\n\nexport type EnumFacetFilterUIProps<TValue = string> = {\n /* The ID of the corresponding label, for testing and accessibility */\n labelId?: string\n /* The title of the faceted column to be displayed */\n facetTitle: string\n /* List of all facet values and information associated with each value */\n facetValues: RenderedFacetValue<TValue>[]\n /* Determines how the component is styled and whether the 'All' checkbox should be selected. */\n filterIsActive: boolean // filterIsActive cannot be derived from facetValues[*].isSelected. See PORTALS-2680\n /* The EnumFacetFilter can be rendered as a collapsible panel or a dropdown. Default is `'Collapsible'` */\n containerAs?: 'Collapsible' | 'Dropdown'\n /* If `containerAs` is a dropdown, the dropdown can be either an IconButton or a SelectBox. Default is `'Icon'` */\n dropdownType?: 'Icon' | 'SelectBox'\n /* If true, hides the button to collapse the panel (only shown if `containerAs` is 'Collapsible'). Default is false.*/\n hideCollapsible?: boolean\n /* Called when an unselected value is selected */\n onAddValueToSelection: (value: TValue) => void\n /* Called when a selected value is unselected */\n onRemoveValueFromSelection: (value: TValue) => void\n /* Called when all values should be unselected (e.g. 'All' is clicked) */\n onRemoveAllFacetSelections: () => void\n /* Called when an value is hovered over */\n onHoverOverValue: (value: TValue) => void\n /* Set to true if multiple values can be selected for the filter */\n canMultiSelect: boolean\n /* By default, all values are not shown (defaultShowAllValues = false) */\n defaultShowAllValues?: boolean\n}\n\nfunction removeWhitespace(value: string): string {\n return value.replace(/\\s/g, '').toLowerCase()\n}\n\nexport default function EnumFacetFilterUI<TValue = string>(\n props: EnumFacetFilterUIProps<TValue>,\n) {\n const {\n labelId,\n filterIsActive,\n containerAs = 'Collapsible',\n dropdownType = 'Icon',\n hideCollapsible = false,\n facetValues,\n onAddValueToSelection,\n onRemoveValueFromSelection,\n facetTitle,\n onRemoveAllFacetSelections,\n onHoverOverValue,\n canMultiSelect = true,\n defaultShowAllValues = false,\n } = props\n const [toggleShowAll, setToggleShowAll] =\n useState<boolean>(defaultShowAllValues)\n const [isCollapsed, setIsCollapsed] = useState<boolean>(false)\n const [showSearch, setShowSearch] = useState<boolean>(false)\n const [searchTerm, setSearchText] = useState<string>('')\n\n // e.g. we show a subset of facet values before hiding the rest behind \"Show More\"\n // If the user has selected a value that would normally be hidden, always show all of the values\n const valueIndexedGreaterThanMaxToShowIsSelected =\n facetValues.length > MAX_ENUMERATION_VALUES_TO_SHOW &&\n facetValues\n .slice(MAX_ENUMERATION_VALUES_TO_SHOW)\n .some(({ isSelected }) => isSelected)\n const showAll =\n containerAs === 'Dropdown' ||\n toggleShowAll ||\n showSearch ||\n valueIndexedGreaterThanMaxToShowIsSelected\n\n const facetValuesToShow = useMemo(() => {\n if (showSearch && searchTerm.length > 0) {\n return facetValues.filter(({ displayText }) => {\n return (\n displayText.toLowerCase().indexOf(searchTerm.trim().toLowerCase()) >\n -1\n )\n })\n }\n if (showAll) {\n return facetValues\n }\n return facetValues.slice(0, MAX_ENUMERATION_VALUES_TO_SHOW)\n }, [facetValues, searchTerm, showSearch, showAll])\n\n const textInput = useRef<HTMLInputElement>(null)\n\n const isDropdown = containerAs === 'Dropdown'\n const showMoreButtonIsVisible =\n !showAll && facetValues.length > MAX_ENUMERATION_VALUES_TO_SHOW\n const showLessButtonIsVisible =\n showAll &&\n !searchTerm &&\n !valueIndexedGreaterThanMaxToShowIsSelected &&\n facetValues.length > MAX_ENUMERATION_VALUES_TO_SHOW\n\n const content = (\n <div className={isDropdown ? 'EnumFacetFilter__dropdown_menu' : ''}>\n <div className=\"EnumFacetFilter__checkboxContainer--forAll\">\n <TextField // Search Filter Text\n sx={{\n display: showSearch ? undefined : 'none',\n }}\n size={'small'}\n fullWidth={true}\n slotProps={{\n input: {\n startAdornment: (\n <Tooltip title={'Close search'}>\n <IconButton\n size={'small'}\n onClick={() => {\n setShowSearch(false)\n setToggleShowAll(defaultShowAllValues)\n }}\n >\n <IconSvg\n sx={{ fontSize: 'inherit' }}\n wrap={false}\n icon=\"arrowBack\"\n />\n </IconButton>\n </Tooltip>\n ),\n endAdornment: searchTerm.length > 0 && (\n <Tooltip title={'Clear'}>\n <IconButton\n size={'small'}\n onClick={() => {\n setSearchText('')\n textInput.current?.focus()\n }}\n >\n <IconSvg\n sx={{ fontSize: 'inherit' }}\n wrap={false}\n icon=\"close\"\n />\n </IconButton>\n </Tooltip>\n ),\n },\n }}\n type=\"text\"\n placeholder=\"Find values\"\n value={searchTerm}\n ref={textInput}\n onChange={e => {\n setSearchText(e.target.value)\n }}\n />\n {!showSearch && (\n <div className=\"EnumFacetFilter__checkAll\">\n <FormControlLabel\n control={<Checkbox />}\n className=\"EnumFacetFilter__checkbox\"\n onChange={() => {\n if (filterIsActive) {\n onRemoveAllFacetSelections()\n }\n }}\n key=\"select_all\"\n checked={!filterIsActive}\n label=\"All\"\n />\n <Tooltip title={'Search'}>\n <IconButton\n size={'small'}\n sx={{ aspectRatio: '1 / 1' }}\n onClick={() => {\n setSearchText('')\n setShowSearch(true)\n textInput.current?.focus()\n }}\n >\n <IconSvg\n sx={{ fontSize: 'inherit' }}\n wrap={false}\n icon=\"search\"\n />\n </IconButton>\n </Tooltip>\n </div>\n )}\n </div>\n <div>\n {facetValuesToShow.map((facetValueAndCount, index: number) => {\n const { isSelected, displayText, value, count } = facetValueAndCount\n\n return (\n <EnumFacetFilterOption\n key={String(value)}\n id={[\n removeWhitespace(facetTitle),\n removeWhitespace(String(value)),\n index,\n ].join('-')}\n label={displayText}\n count={count}\n isDropdown={isDropdown}\n checked={isSelected}\n onHover={() => {\n onHoverOverValue(value)\n }}\n onChange={(newIsSelected: boolean) => {\n if (newIsSelected) {\n onAddValueToSelection(value)\n } else {\n onRemoveValueFromSelection(value)\n }\n }}\n inputType={canMultiSelect ? 'checkbox' : 'radio'}\n />\n )\n })}\n {!isDropdown && (\n <>\n {showMoreButtonIsVisible && (\n <button\n className=\"EnumFacetFilter__showMoreFacetsBtn\"\n onClick={() => setToggleShowAll(true)}\n >\n <div className=\"EnumFacetFilter__checkboxContainer\">\n <div className=\"EnumFacetFilter__showMoreFacetsLabel\">\n Show all ({facetValues.length})\n </div>\n </div>\n </button>\n )}\n {showLessButtonIsVisible && (\n <button\n className=\"EnumFacetFilter__showMoreFacetsBtn\"\n onClick={() => setToggleShowAll(false)}\n >\n <div className=\"EnumFacetFilter__checkboxContainer\">\n <div className=\"EnumFacetFilter__showMoreFacetsLabel\">\n Show less\n </div>\n </div>\n </button>\n )}\n </>\n )}\n {facetValuesToShow.length <= 0 && (\n <div className=\"EnumFacetFilter__noMatch\">No match found</div>\n )}\n </div>\n </div>\n )\n\n const menuText = useMemo(() => {\n if (!filterIsActive) {\n return 'All'\n } else if (\n filterIsActive &&\n facetValuesToShow.filter(item => item.isSelected).length === 1\n ) {\n return facetValuesToShow.filter(item => item.isSelected)[0].displayText\n } else {\n return 'Multiple Values Selected'\n }\n }, [filterIsActive, facetValuesToShow])\n\n if (isDropdown) {\n return (\n <EnumFacetFilterDropdown\n facetTitle={facetTitle}\n dropdownType={dropdownType}\n menuText={menuText}\n filterIsActive={filterIsActive}\n labelId={labelId}\n >\n {content}\n </EnumFacetFilterDropdown>\n )\n } else {\n return (\n <>\n <FacetFilterHeader\n hideCollapsible={hideCollapsible}\n isCollapsed={isCollapsed}\n label={facetTitle}\n onClick={(isCollapsed: boolean) => setIsCollapsed(isCollapsed)}\n />\n <Collapse className=\"EnumFacetFilter\" in={!isCollapsed}>\n {content}\n </Collapse>\n </>\n )\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"EnumFacetFilterUI.js","names":[],"sources":["../../../../../src/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUI.tsx"],"sourcesContent":["import {\n Checkbox,\n Collapse,\n FormControlLabel,\n IconButton,\n TextField,\n Tooltip,\n} from '@mui/material'\nimport { ReactNode, useMemo, useRef, useState } from 'react'\nimport { FacetColumnResultValueCount } from '@sage-bionetworks/synapse-types'\nimport IconSvg from '../../../IconSvg/IconSvg'\nimport { FacetFilterHeader } from '../FacetFilterHeader'\nimport { EnumFacetFilterOption } from './EnumFacetFilterOption'\nimport EnumFacetFilterDropdown from './EnumFacetFilterDropdown'\nimport { SetOptional } from 'type-fest'\n\nconst MAX_ENUMERATION_VALUES_TO_SHOW = 5\n\nexport type RenderedFacetValue<TValue = string> = Omit<\n SetOptional<FacetColumnResultValueCount, 'count'>,\n 'value'\n> & {\n value: TValue\n /* Text displayed for the option, and also used to filter in search */\n displayText: string\n /* Optional custom node to render in place of the plain-text label. */\n renderedLabel?: ReactNode\n}\n\nexport type EnumFacetFilterUIProps<TValue = string> = {\n /* The ID of the corresponding label, for testing and accessibility */\n labelId?: string\n /* The title of the faceted column to be displayed */\n facetTitle: string\n /* List of all facet values and information associated with each value */\n facetValues: RenderedFacetValue<TValue>[]\n /* Determines how the component is styled and whether the 'All' checkbox should be selected. */\n filterIsActive: boolean // filterIsActive cannot be derived from facetValues[*].isSelected. See PORTALS-2680\n /* The EnumFacetFilter can be rendered as a collapsible panel or a dropdown. Default is `'Collapsible'` */\n containerAs?: 'Collapsible' | 'Dropdown'\n /* If `containerAs` is a dropdown, the dropdown can be either an IconButton or a SelectBox. Default is `'Icon'` */\n dropdownType?: 'Icon' | 'SelectBox'\n /* If true, hides the button to collapse the panel (only shown if `containerAs` is 'Collapsible'). Default is false.*/\n hideCollapsible?: boolean\n /* Called when an unselected value is selected */\n onAddValueToSelection: (value: TValue) => void\n /* Called when a selected value is unselected */\n onRemoveValueFromSelection: (value: TValue) => void\n /* Called when all values should be unselected (e.g. 'All' is clicked) */\n onRemoveAllFacetSelections: () => void\n /* Called when an value is hovered over */\n onHoverOverValue: (value: TValue) => void\n /* Set to true if multiple values can be selected for the filter */\n canMultiSelect: boolean\n /* By default, all values are not shown (defaultShowAllValues = false) */\n defaultShowAllValues?: boolean\n}\n\nfunction removeWhitespace(value: string): string {\n return value.replace(/\\s/g, '').toLowerCase()\n}\n\nexport default function EnumFacetFilterUI<TValue = string>(\n props: EnumFacetFilterUIProps<TValue>,\n) {\n const {\n labelId,\n filterIsActive,\n containerAs = 'Collapsible',\n dropdownType = 'Icon',\n hideCollapsible = false,\n facetValues,\n onAddValueToSelection,\n onRemoveValueFromSelection,\n facetTitle,\n onRemoveAllFacetSelections,\n onHoverOverValue,\n canMultiSelect = true,\n defaultShowAllValues = false,\n } = props\n const [toggleShowAll, setToggleShowAll] =\n useState<boolean>(defaultShowAllValues)\n const [isCollapsed, setIsCollapsed] = useState<boolean>(false)\n const [showSearch, setShowSearch] = useState<boolean>(false)\n const [searchTerm, setSearchText] = useState<string>('')\n\n // e.g. we show a subset of facet values before hiding the rest behind \"Show More\"\n // If the user has selected a value that would normally be hidden, always show all of the values\n const valueIndexedGreaterThanMaxToShowIsSelected =\n facetValues.length > MAX_ENUMERATION_VALUES_TO_SHOW &&\n facetValues\n .slice(MAX_ENUMERATION_VALUES_TO_SHOW)\n .some(({ isSelected }) => isSelected)\n const showAll =\n containerAs === 'Dropdown' ||\n toggleShowAll ||\n showSearch ||\n valueIndexedGreaterThanMaxToShowIsSelected\n\n const facetValuesToShow = useMemo(() => {\n if (showSearch && searchTerm.length > 0) {\n return facetValues.filter(({ displayText }) => {\n return (\n displayText.toLowerCase().indexOf(searchTerm.trim().toLowerCase()) >\n -1\n )\n })\n }\n if (showAll) {\n return facetValues\n }\n return facetValues.slice(0, MAX_ENUMERATION_VALUES_TO_SHOW)\n }, [facetValues, searchTerm, showSearch, showAll])\n\n const textInput = useRef<HTMLInputElement>(null)\n\n const isDropdown = containerAs === 'Dropdown'\n const showMoreButtonIsVisible =\n !showAll && facetValues.length > MAX_ENUMERATION_VALUES_TO_SHOW\n const showLessButtonIsVisible =\n showAll &&\n !searchTerm &&\n !valueIndexedGreaterThanMaxToShowIsSelected &&\n facetValues.length > MAX_ENUMERATION_VALUES_TO_SHOW\n\n const content = (\n <div className={isDropdown ? 'EnumFacetFilter__dropdown_menu' : ''}>\n <div className=\"EnumFacetFilter__checkboxContainer--forAll\">\n <TextField // Search Filter Text\n sx={{\n display: showSearch ? undefined : 'none',\n }}\n size={'small'}\n fullWidth={true}\n slotProps={{\n input: {\n startAdornment: (\n <Tooltip title={'Close search'}>\n <IconButton\n size={'small'}\n onClick={() => {\n setShowSearch(false)\n setToggleShowAll(defaultShowAllValues)\n }}\n >\n <IconSvg\n sx={{ fontSize: 'inherit' }}\n wrap={false}\n icon=\"arrowBack\"\n />\n </IconButton>\n </Tooltip>\n ),\n endAdornment: searchTerm.length > 0 && (\n <Tooltip title={'Clear'}>\n <IconButton\n size={'small'}\n onClick={() => {\n setSearchText('')\n textInput.current?.focus()\n }}\n >\n <IconSvg\n sx={{ fontSize: 'inherit' }}\n wrap={false}\n icon=\"close\"\n />\n </IconButton>\n </Tooltip>\n ),\n },\n }}\n type=\"text\"\n placeholder=\"Find values\"\n value={searchTerm}\n ref={textInput}\n onChange={e => {\n setSearchText(e.target.value)\n }}\n />\n {!showSearch && (\n <div className=\"EnumFacetFilter__checkAll\">\n <FormControlLabel\n control={<Checkbox />}\n className=\"EnumFacetFilter__checkbox\"\n onChange={() => {\n if (filterIsActive) {\n onRemoveAllFacetSelections()\n }\n }}\n key=\"select_all\"\n checked={!filterIsActive}\n label=\"All\"\n />\n <Tooltip title={'Search'}>\n <IconButton\n size={'small'}\n sx={{ aspectRatio: '1 / 1' }}\n onClick={() => {\n setSearchText('')\n setShowSearch(true)\n textInput.current?.focus()\n }}\n >\n <IconSvg\n sx={{ fontSize: 'inherit' }}\n wrap={false}\n icon=\"search\"\n />\n </IconButton>\n </Tooltip>\n </div>\n )}\n </div>\n <div>\n {facetValuesToShow.map((facetValueAndCount, index: number) => {\n const { isSelected, displayText, renderedLabel, value, count } =\n facetValueAndCount\n\n return (\n <EnumFacetFilterOption\n key={String(value)}\n id={[\n removeWhitespace(facetTitle),\n removeWhitespace(String(value)),\n index,\n ].join('-')}\n label={renderedLabel ?? displayText}\n count={count}\n isDropdown={isDropdown}\n checked={isSelected}\n onHover={() => {\n onHoverOverValue(value)\n }}\n onChange={(newIsSelected: boolean) => {\n if (newIsSelected) {\n onAddValueToSelection(value)\n } else {\n onRemoveValueFromSelection(value)\n }\n }}\n inputType={canMultiSelect ? 'checkbox' : 'radio'}\n />\n )\n })}\n {!isDropdown && (\n <>\n {showMoreButtonIsVisible && (\n <button\n className=\"EnumFacetFilter__showMoreFacetsBtn\"\n onClick={() => setToggleShowAll(true)}\n >\n <div className=\"EnumFacetFilter__checkboxContainer\">\n <div className=\"EnumFacetFilter__showMoreFacetsLabel\">\n Show all ({facetValues.length})\n </div>\n </div>\n </button>\n )}\n {showLessButtonIsVisible && (\n <button\n className=\"EnumFacetFilter__showMoreFacetsBtn\"\n onClick={() => setToggleShowAll(false)}\n >\n <div className=\"EnumFacetFilter__checkboxContainer\">\n <div className=\"EnumFacetFilter__showMoreFacetsLabel\">\n Show less\n </div>\n </div>\n </button>\n )}\n </>\n )}\n {facetValuesToShow.length <= 0 && (\n <div className=\"EnumFacetFilter__noMatch\">No match found</div>\n )}\n </div>\n </div>\n )\n\n const menuText = useMemo(() => {\n if (!filterIsActive) {\n return 'All'\n } else if (\n filterIsActive &&\n facetValuesToShow.filter(item => item.isSelected).length === 1\n ) {\n return facetValuesToShow.filter(item => item.isSelected)[0].displayText\n } else {\n return 'Multiple Values Selected'\n }\n }, [filterIsActive, facetValuesToShow])\n\n if (isDropdown) {\n return (\n <EnumFacetFilterDropdown\n facetTitle={facetTitle}\n dropdownType={dropdownType}\n menuText={menuText}\n filterIsActive={filterIsActive}\n labelId={labelId}\n >\n {content}\n </EnumFacetFilterDropdown>\n )\n } else {\n return (\n <>\n <FacetFilterHeader\n hideCollapsible={hideCollapsible}\n isCollapsed={isCollapsed}\n label={facetTitle}\n onClick={(isCollapsed: boolean) => setIsCollapsed(isCollapsed)}\n />\n <Collapse className=\"EnumFacetFilter\" in={!isCollapsed}>\n {content}\n </Collapse>\n </>\n )\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"CurationTaskCard.d.ts","sourceRoot":"","sources":["../../../../../src/features/curator/dashboard/components/CurationTaskCard.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAA;AAO7D,MAAM,MAAM,qBAAqB,GAAG;IAClC,UAAU,EAAE,UAAU,CAAA;CACvB,CAAA;AA+DD;;GAEG;AACH,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,2CAuDpE"}
1
+ {"version":3,"file":"CurationTaskCard.d.ts","sourceRoot":"","sources":["../../../../../src/features/curator/dashboard/components/CurationTaskCard.tsx"],"names":[],"mappings":"AAeA,OAAO,EACL,UAAU,EAEX,MAAM,kCAAkC,CAAA;AASzC,MAAM,MAAM,qBAAqB,GAAG;IAClC,UAAU,EAAE,UAAU,CAAA;CACvB,CAAA;AA8ED;;GAEG;AACH,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,2CA+FpE"}
@@ -1,17 +1,21 @@
1
1
  import { displayToast as e } from "../../../../components/ToastMessage/ToastMessage.js";
2
+ import t from "../../../../synapse-queries/entity/useEntityBundle.js";
2
3
  import "../../../../components/index.js";
3
- import { OPEN_CURATOR_NO_PERMISSION_ON_SOURCE_ERROR_MESSAGE as t } from "../../../entity/metadata-task/utils/constants.js";
4
- import n from "../../../entity/metadata-task/hooks/useOpenCuratorButton.js";
5
- import r from "./CurationTaskCard.module.js";
6
- import i from "./NextStepButton.js";
7
- import a from "./shared.module.js";
8
- import o from "./UserOrTeamChip.js";
9
- import { Card as s, Chip as c, Divider as l, Typography as u } from "@mui/material";
10
- import { jsx as d, jsxs as f } from "react/jsx-runtime";
11
- import p from "classnames";
4
+ import { OPEN_CURATOR_NO_PERMISSION_ON_SOURCE_ERROR_MESSAGE as n, TASK_STATUS_CONFIG as r } from "../../../entity/metadata-task/utils/constants.js";
5
+ import i from "../../../entity/metadata-task/hooks/useOpenCuratorButton.js";
6
+ import a from "../../../entity/metadata-task/components/CreateOrUpdateCurationTaskDialog.js";
7
+ import o from "./CurationTaskCard.module.js";
8
+ import s from "./NextStepButton.js";
9
+ import c from "./shared.module.js";
10
+ import l from "./UserOrTeamChip.js";
11
+ import { useState as u } from "react";
12
+ import { Box as d, Card as f, Chip as p, Divider as m, IconButton as h, Skeleton as g, Typography as _ } from "@mui/material";
13
+ import { jsx as v, jsxs as y } from "react/jsx-runtime";
14
+ import b from "classnames";
15
+ import x from "@mui/icons-material/SettingsOutlined";
12
16
  //#region src/features/curator/dashboard/components/CurationTaskCard.tsx
13
- function m(t) {
14
- let { onClick: r, isLoading: i, isPending: a, hasPermission: o } = n(t);
17
+ function S(t) {
18
+ let { onClick: n, isLoading: r, isPending: a, hasPermission: o } = i(t);
15
19
  if (!t.task || !t.status) throw Error("Task bundle is missing required properties");
16
20
  switch (t.task?.taskProperties?.concreteType) {
17
21
  case "org.sagebionetworks.repo.model.curation.metadata.FileBasedMetadataTaskProperties":
@@ -22,8 +26,9 @@ function m(t) {
22
26
  principalIds: t.task.assigneePrincipalId ? [t.task.assigneePrincipalId] : [],
23
27
  buttonText: "Open Curator",
24
28
  taskType: "Curate Data",
25
- onClickNextStep: r,
26
- isLoading: i,
29
+ statusState: t.status.state,
30
+ onClickNextStep: n,
31
+ isLoading: r,
27
32
  isPending: a,
28
33
  hasPermission: o
29
34
  };
@@ -36,6 +41,7 @@ function m(t) {
36
41
  principalIds: t.task.assigneePrincipalId ? [t.task.assigneePrincipalId] : [],
37
42
  buttonText: "Continue",
38
43
  taskType: "",
44
+ statusState: t.status.state,
39
45
  onClickNextStep: () => {
40
46
  e("No action defined for this task type", "danger", { title: "Unexpected Error" });
41
47
  },
@@ -44,9 +50,9 @@ function m(t) {
44
50
  hasPermission: void 0
45
51
  };
46
52
  }
47
- function h(e) {
53
+ function C(e) {
48
54
  let { label: t } = e;
49
- return /* @__PURE__ */ d(c, {
55
+ return /* @__PURE__ */ v(p, {
50
56
  sx: {
51
57
  fontWeight: 600,
52
58
  backgroundColor: "#BFD3ED"
@@ -54,38 +60,81 @@ function h(e) {
54
60
  label: t
55
61
  });
56
62
  }
57
- function g(n) {
58
- let { taskBundle: c } = n, { title: g, description: _, taskId: v, taskType: y, principalIds: b, buttonText: x, onClickNextStep: S, hasPermission: C, isLoading: w, isPending: T } = m(c);
59
- return /* @__PURE__ */ d(s, {
60
- className: p(a.card, r.card),
61
- children: /* @__PURE__ */ f("div", {
62
- className: r.cardContent,
63
+ function w(e) {
64
+ let { state: t } = e;
65
+ if (!t) return null;
66
+ let { label: n, backgroundColor: i } = r[t];
67
+ return /* @__PURE__ */ v(p, {
68
+ size: "small",
69
+ sx: {
70
+ fontWeight: 600,
71
+ backgroundColor: i
72
+ },
73
+ label: n
74
+ });
75
+ }
76
+ function T(r) {
77
+ let { taskBundle: i } = r, { title: p, description: T, taskId: E, taskType: D, principalIds: O, buttonText: k, statusState: A, onClickNextStep: j, hasPermission: M, isLoading: N, isPending: P } = S(i), [F, I] = u(!1), L = i.task?.projectId, { data: R } = t(L, void 0, {
78
+ includeEntity: !0,
79
+ includePermissions: !0
80
+ }), z = R?.permissions?.canEdit ?? !1;
81
+ function B() {
82
+ M ? j() : e(n, "danger");
83
+ }
84
+ return /* @__PURE__ */ y(f, {
85
+ className: b(c.card, o.card),
86
+ children: [/* @__PURE__ */ y("div", {
87
+ className: o.cardContent,
63
88
  children: [
64
- /* @__PURE__ */ f("div", {
65
- className: r.mainContent,
89
+ /* @__PURE__ */ y("div", {
90
+ className: o.mainContent,
66
91
  children: [
67
- /* @__PURE__ */ f("div", {
68
- className: r.titleChipContainer,
92
+ /* @__PURE__ */ y("div", {
93
+ className: o.titleChipContainer,
69
94
  children: [
70
- /* @__PURE__ */ d(u, {
95
+ /* @__PURE__ */ v(_, {
71
96
  variant: "headline3",
72
- children: g
97
+ children: p
73
98
  }),
74
- y && /* @__PURE__ */ d(h, { label: y }),
75
- v && /* @__PURE__ */ d(h, { label: `TaskId ${v}` })
99
+ D && /* @__PURE__ */ v(C, { label: D }),
100
+ z && /* @__PURE__ */ v(h, {
101
+ onClick: () => I(!0),
102
+ "aria-label": "Task settings",
103
+ children: /* @__PURE__ */ v(x, {})
104
+ })
76
105
  ]
77
106
  }),
78
- /* @__PURE__ */ d(u, {
107
+ /* @__PURE__ */ y(d, {
108
+ sx: {
109
+ display: "flex",
110
+ gap: 4
111
+ },
112
+ children: [R?.entity?.name ? /* @__PURE__ */ v(_, {
113
+ variant: "body1",
114
+ children: R.entity.name
115
+ }) : /* @__PURE__ */ v(g, { width: 100 }), E && /* @__PURE__ */ y(_, {
116
+ variant: "body1",
117
+ children: ["Task ID: ", E]
118
+ })]
119
+ }),
120
+ T && /* @__PURE__ */ v(_, {
79
121
  variant: "body1",
80
- children: _
122
+ children: T
81
123
  }),
82
- /* @__PURE__ */ d("div", {
83
- className: r.userChipContainer,
84
- children: b.map((e) => /* @__PURE__ */ d(o, { principalId: e }, e))
124
+ /* @__PURE__ */ v("div", {
125
+ className: o.userChipContainer,
126
+ children: O.map((e) => /* @__PURE__ */ v(l, { principalId: e }, e))
85
127
  })
86
128
  ]
87
129
  }),
88
- /* @__PURE__ */ d(l, {
130
+ /* @__PURE__ */ v(d, {
131
+ sx: {
132
+ display: "flex",
133
+ alignItems: "center"
134
+ },
135
+ children: /* @__PURE__ */ v(w, { state: A })
136
+ }),
137
+ /* @__PURE__ */ v(m, {
89
138
  orientation: "vertical",
90
139
  flexItem: !0,
91
140
  sx: { display: {
@@ -93,20 +142,25 @@ function g(n) {
93
142
  md: "block"
94
143
  } }
95
144
  }),
96
- /* @__PURE__ */ d(i, {
97
- className: r.cardButton,
98
- buttonText: x,
99
- onClick: C ? S : () => {
100
- e(t, "danger");
101
- },
102
- disabled: w,
103
- loading: T
145
+ /* @__PURE__ */ v(s, {
146
+ className: o.cardButton,
147
+ buttonText: k,
148
+ onClick: B,
149
+ disabled: N,
150
+ loading: P
104
151
  })
105
152
  ]
106
- })
153
+ }), /* @__PURE__ */ v(a, {
154
+ open: F,
155
+ onCancel: () => I(!1),
156
+ onSuccess: () => I(!1),
157
+ onDeleteSuccess: () => I(!1),
158
+ projectId: L ?? "",
159
+ task: i.task
160
+ }, String(F))]
107
161
  });
108
162
  }
109
163
  //#endregion
110
- export { g as default };
164
+ export { T as default };
111
165
 
112
166
  //# sourceMappingURL=CurationTaskCard.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CurationTaskCard.js","names":[],"sources":["../../../../../src/features/curator/dashboard/components/CurationTaskCard.tsx"],"sourcesContent":["import { displayToast } from '@/components'\nimport useOpenCuratorFromTaskButton from '@/features/entity/metadata-task/hooks/useOpenCuratorButton'\nimport { OPEN_CURATOR_NO_PERMISSION_ON_SOURCE_ERROR_MESSAGE } from '@/features/entity/metadata-task/utils/constants'\nimport { Card, Chip, Divider, Typography } from '@mui/material'\nimport { TaskBundle } from '@sage-bionetworks/synapse-client'\nimport classNames from 'classnames'\nimport styles from './CurationTaskCard.module.scss'\nimport NextStepButton from './NextStepButton'\nimport sharedStyles from './shared.module.scss'\nimport UserOrTeamChip from './UserOrTeamChip'\n\nexport type CurationTaskCardProps = {\n taskBundle: TaskBundle\n}\n\nfunction useUiForTask(taskBundle: TaskBundle) {\n const { onClick, isLoading, isPending, hasPermission } =\n useOpenCuratorFromTaskButton(taskBundle)\n\n if (!taskBundle.task || !taskBundle.status) {\n throw new Error('Task bundle is missing required properties')\n }\n\n switch (taskBundle.task?.taskProperties?.concreteType) {\n case 'org.sagebionetworks.repo.model.curation.metadata.FileBasedMetadataTaskProperties':\n case 'org.sagebionetworks.repo.model.curation.metadata.RecordBasedMetadataTaskProperties':\n return {\n title: taskBundle.task.dataType,\n description: taskBundle.task.instructions ?? '',\n taskId: taskBundle.task.taskId,\n principalIds: taskBundle.task.assigneePrincipalId\n ? [taskBundle.task.assigneePrincipalId]\n : [],\n buttonText: 'Open Curator',\n taskType: 'Curate Data',\n onClickNextStep: onClick,\n isLoading,\n isPending,\n hasPermission,\n }\n default: {\n console.error(\n 'No UI implemented for task type: ' +\n // @ts-expect-error - the switch should be exhaustive for known types\n taskBundle.task?.taskProperties?.concreteType,\n )\n }\n }\n\n return {\n title: taskBundle.task.dataType,\n description: taskBundle.task.instructions ?? '',\n taskId: taskBundle.task.taskId!,\n principalIds: taskBundle.task.assigneePrincipalId\n ? [taskBundle.task.assigneePrincipalId]\n : [],\n buttonText: 'Continue',\n taskType: '',\n onClickNextStep: () => {\n displayToast('No action defined for this task type', 'danger', {\n title: 'Unexpected Error',\n })\n },\n isLoading: false,\n isPending: false,\n hasPermission: undefined,\n }\n}\n\nfunction TaskTypeChip(props: { label: string }) {\n const { label } = props\n return (\n <Chip sx={{ fontWeight: 600, backgroundColor: '#BFD3ED' }} label={label} />\n )\n}\n\n/**\n * Card component for displaying a curation task on the curator dashboard. Shows relevant information about the task and includes a button to proceed to the next step in the workflow.\n */\nexport default function CurationTaskCard(props: CurationTaskCardProps) {\n const { taskBundle } = props\n const {\n title,\n description,\n taskId,\n taskType,\n principalIds,\n buttonText,\n onClickNextStep,\n hasPermission,\n isLoading,\n isPending,\n } = useUiForTask(taskBundle)\n\n return (\n <Card className={classNames(sharedStyles.card, styles.card)}>\n <div className={styles.cardContent}>\n <div className={styles.mainContent}>\n <div className={styles.titleChipContainer}>\n <Typography variant=\"headline3\">{title}</Typography>\n {taskType && <TaskTypeChip label={taskType} />}\n {taskId && <TaskTypeChip label={`TaskId ${taskId}`} />}\n </div>\n <Typography variant=\"body1\">{description}</Typography>\n <div className={styles.userChipContainer}>\n {principalIds.map(principalId => (\n <UserOrTeamChip key={principalId} principalId={principalId} />\n ))}\n </div>\n </div>\n <Divider\n orientation=\"vertical\"\n flexItem\n sx={{ display: { xs: 'none', md: 'block' } }}\n />\n <NextStepButton\n className={styles.cardButton}\n buttonText={buttonText}\n onClick={\n hasPermission\n ? onClickNextStep\n : () => {\n displayToast(\n OPEN_CURATOR_NO_PERMISSION_ON_SOURCE_ERROR_MESSAGE,\n 'danger',\n )\n }\n }\n disabled={isLoading}\n loading={isPending}\n />\n </div>\n </Card>\n )\n}\n"],"mappings":";;;;;;;;;;;;AAeA,SAAS,EAAa,GAAwB;CAC5C,IAAM,EAAE,YAAS,cAAW,cAAW,qBACrC,EAA6B,CAAU;CAEzC,IAAI,CAAC,EAAW,QAAQ,CAAC,EAAW,QAClC,MAAU,MAAM,4CAA4C;CAG9D,QAAQ,EAAW,MAAM,gBAAgB,cAAzC;EACE,KAAK;EACL,KAAK,sFACH,OAAO;GACL,OAAO,EAAW,KAAK;GACvB,aAAa,EAAW,KAAK,gBAAgB;GAC7C,QAAQ,EAAW,KAAK;GACxB,cAAc,EAAW,KAAK,sBAC1B,CAAC,EAAW,KAAK,mBAAmB,IACpC,CAAC;GACL,YAAY;GACZ,UAAU;GACV,iBAAiB;GACjB;GACA;GACA;EACF;EACF,SACE,QAAQ,MACN,sCAEE,EAAW,MAAM,gBAAgB,YACrC;CAEJ;CAEA,OAAO;EACL,OAAO,EAAW,KAAK;EACvB,aAAa,EAAW,KAAK,gBAAgB;EAC7C,QAAQ,EAAW,KAAK;EACxB,cAAc,EAAW,KAAK,sBAC1B,CAAC,EAAW,KAAK,mBAAmB,IACpC,CAAC;EACL,YAAY;EACZ,UAAU;EACV,uBAAuB;GACrB,EAAa,wCAAwC,UAAU,EAC7D,OAAO,mBACT,CAAC;EACH;EACA,WAAW;EACX,WAAW;EACX,eAAe,KAAA;CACjB;AACF;AAEA,SAAS,EAAa,GAA0B;CAC9C,IAAM,EAAE,aAAU;CAClB,OACE,kBAAC,GAAD;EAAM,IAAI;GAAE,YAAY;GAAK,iBAAiB;EAAU;EAAU;CAAQ,CAAA;AAE9E;AAKA,SAAwB,EAAiB,GAA8B;CACrE,IAAM,EAAE,kBAAe,GACjB,EACJ,UACA,gBACA,WACA,aACA,iBACA,eACA,oBACA,kBACA,cACA,iBACE,EAAa,CAAU;CAE3B,OACE,kBAAC,GAAD;EAAM,WAAW,EAAW,EAAa,MAAM,EAAO,IAAI;YACxD,kBAAC,OAAD;GAAK,WAAW,EAAO;aAAvB;IACE,kBAAC,OAAD;KAAK,WAAW,EAAO;eAAvB;MACE,kBAAC,OAAD;OAAK,WAAW,EAAO;iBAAvB;QACE,kBAAC,GAAD;SAAY,SAAQ;mBAAa;QAAkB,CAAA;QAClD,KAAY,kBAAC,GAAD,EAAc,OAAO,EAAW,CAAA;QAC5C,KAAU,kBAAC,GAAD,EAAc,OAAO,UAAU,IAAW,CAAA;OAClD;;MACL,kBAAC,GAAD;OAAY,SAAQ;iBAAS;MAAwB,CAAA;MACrD,kBAAC,OAAD;OAAK,WAAW,EAAO;iBACpB,EAAa,KAAI,MAChB,kBAAC,GAAD,EAA+C,eAAc,GAAxC,CAAwC,CAC9D;MACE,CAAA;KACF;;IACL,kBAAC,GAAD;KACE,aAAY;KACZ,UAAA;KACA,IAAI,EAAE,SAAS;MAAE,IAAI;MAAQ,IAAI;KAAQ,EAAE;IAC5C,CAAA;IACD,kBAAC,GAAD;KACE,WAAW,EAAO;KACN;KACZ,SACE,IACI,UACM;MACJ,EACE,GACA,QACF;KACF;KAEN,UAAU;KACV,SAAS;IACV,CAAA;GACE;;CACD,CAAA;AAEV"}
1
+ {"version":3,"file":"CurationTaskCard.js","names":[],"sources":["../../../../../src/features/curator/dashboard/components/CurationTaskCard.tsx"],"sourcesContent":["import { displayToast } from '@/components'\nimport CreateOrUpdateCurationTaskDialog from '@/features/entity/metadata-task/components/CreateOrUpdateCurationTaskDialog'\nimport { TASK_STATUS_CONFIG } from '@/features/entity/metadata-task/utils/constants'\nimport useOpenCuratorFromTaskButton from '@/features/entity/metadata-task/hooks/useOpenCuratorButton'\nimport { OPEN_CURATOR_NO_PERMISSION_ON_SOURCE_ERROR_MESSAGE } from '@/features/entity/metadata-task/utils/constants'\nimport useGetEntityBundle from '@/synapse-queries/entity/useEntityBundle'\nimport {\n Box,\n Card,\n Chip,\n Divider,\n IconButton,\n Skeleton,\n Typography,\n} from '@mui/material'\nimport {\n TaskBundle,\n TaskStatusStateEnum,\n} from '@sage-bionetworks/synapse-client'\nimport classNames from 'classnames'\nimport styles from './CurationTaskCard.module.scss'\nimport NextStepButton from './NextStepButton'\nimport sharedStyles from './shared.module.scss'\nimport UserOrTeamChip from './UserOrTeamChip'\nimport SettingsOutlinedIcon from '@mui/icons-material/SettingsOutlined'\nimport { useState } from 'react'\n\nexport type CurationTaskCardProps = {\n taskBundle: TaskBundle\n}\n\nfunction useUiForTask(taskBundle: TaskBundle) {\n const { onClick, isLoading, isPending, hasPermission } =\n useOpenCuratorFromTaskButton(taskBundle)\n\n if (!taskBundle.task || !taskBundle.status) {\n throw new Error('Task bundle is missing required properties')\n }\n\n switch (taskBundle.task?.taskProperties?.concreteType) {\n case 'org.sagebionetworks.repo.model.curation.metadata.FileBasedMetadataTaskProperties':\n case 'org.sagebionetworks.repo.model.curation.metadata.RecordBasedMetadataTaskProperties':\n return {\n title: taskBundle.task.dataType,\n description: taskBundle.task.instructions ?? '',\n taskId: taskBundle.task.taskId,\n principalIds: taskBundle.task.assigneePrincipalId\n ? [taskBundle.task.assigneePrincipalId]\n : [],\n buttonText: 'Open Curator',\n taskType: 'Curate Data',\n statusState: taskBundle.status.state,\n onClickNextStep: onClick,\n isLoading,\n isPending,\n hasPermission,\n }\n default: {\n console.error(\n 'No UI implemented for task type: ' +\n // @ts-expect-error - the switch should be exhaustive for known types\n taskBundle.task?.taskProperties?.concreteType,\n )\n }\n }\n\n return {\n title: taskBundle.task.dataType,\n description: taskBundle.task.instructions ?? '',\n taskId: taskBundle.task.taskId!,\n principalIds: taskBundle.task.assigneePrincipalId\n ? [taskBundle.task.assigneePrincipalId]\n : [],\n buttonText: 'Continue',\n taskType: '',\n statusState: taskBundle.status.state,\n onClickNextStep: () => {\n displayToast('No action defined for this task type', 'danger', {\n title: 'Unexpected Error',\n })\n },\n isLoading: false,\n isPending: false,\n hasPermission: undefined,\n }\n}\n\nfunction TaskTypeChip(props: { label: string }) {\n const { label } = props\n return (\n <Chip sx={{ fontWeight: 600, backgroundColor: '#BFD3ED' }} label={label} />\n )\n}\n\nfunction TaskStatusChip(props: { state: TaskStatusStateEnum | undefined }) {\n const { state } = props\n if (!state) return null\n const { label, backgroundColor } = TASK_STATUS_CONFIG[state]\n return (\n <Chip\n size=\"small\"\n sx={{ fontWeight: 600, backgroundColor }}\n label={label}\n />\n )\n}\n\n/**\n * Card component for displaying a curation task on the curator dashboard. Shows relevant information about the task and includes a button to proceed to the next step in the workflow.\n */\nexport default function CurationTaskCard(props: CurationTaskCardProps) {\n const { taskBundle } = props\n const {\n title,\n description,\n taskId,\n taskType,\n principalIds,\n buttonText,\n statusState,\n onClickNextStep,\n hasPermission: hasPermissionToOpenGrid,\n isLoading,\n isPending,\n } = useUiForTask(taskBundle)\n\n const [isSettingsOpen, setIsSettingsOpen] = useState(false)\n\n const projectId = taskBundle.task?.projectId\n const { data: bundle } = useGetEntityBundle(projectId, undefined, {\n includeEntity: true,\n includePermissions: true,\n })\n const canEdit = bundle?.permissions?.canEdit ?? false\n\n function onClickAction() {\n if (hasPermissionToOpenGrid) {\n onClickNextStep()\n } else {\n displayToast(OPEN_CURATOR_NO_PERMISSION_ON_SOURCE_ERROR_MESSAGE, 'danger')\n }\n }\n\n return (\n <Card className={classNames(sharedStyles.card, styles.card)}>\n <div className={styles.cardContent}>\n <div className={styles.mainContent}>\n <div className={styles.titleChipContainer}>\n <Typography variant=\"headline3\">{title}</Typography>\n {taskType && <TaskTypeChip label={taskType} />}\n {canEdit && (\n <IconButton\n onClick={() => setIsSettingsOpen(true)}\n aria-label=\"Task settings\"\n >\n <SettingsOutlinedIcon />\n </IconButton>\n )}\n </div>\n <Box sx={{ display: 'flex', gap: 4 }}>\n {bundle?.entity?.name ? (\n <Typography variant=\"body1\">{bundle.entity.name}</Typography>\n ) : (\n <Skeleton width={100} />\n )}\n {taskId && (\n <Typography variant=\"body1\">Task ID: {taskId}</Typography>\n )}\n </Box>\n {description && (\n <Typography variant=\"body1\">{description}</Typography>\n )}\n <div className={styles.userChipContainer}>\n {principalIds.map(principalId => (\n <UserOrTeamChip key={principalId} principalId={principalId} />\n ))}\n </div>\n </div>\n <Box sx={{ display: 'flex', alignItems: 'center' }}>\n <TaskStatusChip state={statusState} />\n </Box>\n <Divider\n orientation=\"vertical\"\n flexItem\n sx={{ display: { xs: 'none', md: 'block' } }}\n />\n <NextStepButton\n className={styles.cardButton}\n buttonText={buttonText}\n onClick={onClickAction}\n disabled={isLoading}\n loading={isPending}\n />\n </div>\n <CreateOrUpdateCurationTaskDialog\n key={String(isSettingsOpen)}\n open={isSettingsOpen}\n onCancel={() => setIsSettingsOpen(false)}\n onSuccess={() => setIsSettingsOpen(false)}\n onDeleteSuccess={() => setIsSettingsOpen(false)}\n projectId={projectId ?? ''}\n task={taskBundle.task}\n />\n </Card>\n )\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"CreateOrUpdateCurationTaskDialog.d.ts","sourceRoot":"","sources":["../../../../../src/features/entity/metadata-task/components/CreateOrUpdateCurationTaskDialog.tsx"],"names":[],"mappings":"AAmCA,OAAO,EACL,YAAY,EAKb,MAAM,kCAAkC,CAAA;AA0CzC,MAAM,MAAM,qCAAqC,GAAG;IAClD,IAAI,EAAE,OAAO,CAAA;IACb,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,SAAS,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI,CAAA;IACvC;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,IAAI,CAAA;IAC5B,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,CAAC,EAAE,YAAY,CAAA;CACpB,CAAA;AAsBD;;GAEG;AACH,MAAM,CAAC,OAAO,UAAU,gCAAgC,CACtD,KAAK,EAAE,qCAAqC,2CAmlB7C"}
1
+ {"version":3,"file":"CreateOrUpdateCurationTaskDialog.d.ts","sourceRoot":"","sources":["../../../../../src/features/entity/metadata-task/components/CreateOrUpdateCurationTaskDialog.tsx"],"names":[],"mappings":"AAuCA,OAAO,EACL,YAAY,EAMb,MAAM,kCAAkC,CAAA;AA6CzC,MAAM,MAAM,qCAAqC,GAAG;IAClD,IAAI,EAAE,OAAO,CAAA;IACb,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,SAAS,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI,CAAA;IACvC;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,IAAI,CAAA;IAC5B,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,CAAC,EAAE,YAAY,CAAA;CACpB,CAAA;AAsBD;;GAEG;AACH,MAAM,CAAC,OAAO,UAAU,gCAAgC,CACtD,KAAK,EAAE,qCAAqC,2CAsoB7C"}