synapse-react-client 4.0.15 → 4.0.16

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 (54) hide show
  1. package/dist/SWC.index.js +1 -1
  2. package/dist/components/DataGrid/hooks/useGetSchemaForGrid.d.ts.map +1 -1
  3. package/dist/components/DataGrid/hooks/useGetSchemaForGrid.js +1 -0
  4. package/dist/components/DataGrid/hooks/useGetSchemaForGrid.js.map +1 -1
  5. package/dist/components/QueryVisualizationWrapper/QueryVisualizationContext.d.ts +2 -0
  6. package/dist/components/QueryVisualizationWrapper/QueryVisualizationContext.d.ts.map +1 -1
  7. package/dist/components/QueryVisualizationWrapper/QueryVisualizationContext.js.map +1 -1
  8. package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.d.ts +2 -0
  9. package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.d.ts.map +1 -1
  10. package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.js +53 -51
  11. package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.js.map +1 -1
  12. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.d.ts +1 -1
  13. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.d.ts.map +1 -1
  14. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js +1 -0
  15. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js.map +1 -1
  16. package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.d.ts.map +1 -1
  17. package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.js +38 -23
  18. package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.js.map +1 -1
  19. package/dist/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.d.ts +1 -1
  20. package/dist/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.d.ts.map +1 -1
  21. package/dist/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.js +1 -0
  22. package/dist/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.js.map +1 -1
  23. package/dist/components/widgets/Range.d.ts.map +1 -1
  24. package/dist/components/widgets/Range.js +51 -41
  25. package/dist/components/widgets/Range.js.map +1 -1
  26. package/dist/components/widgets/facet-nav/SelectionCriteriaPill.d.ts +3 -1
  27. package/dist/components/widgets/facet-nav/SelectionCriteriaPill.d.ts.map +1 -1
  28. package/dist/components/widgets/facet-nav/SelectionCriteriaPill.js +3 -3
  29. package/dist/components/widgets/facet-nav/SelectionCriteriaPill.js.map +1 -1
  30. package/dist/components/widgets/facet-nav/SelectionCriteriaPills.d.ts +1 -1
  31. package/dist/components/widgets/facet-nav/SelectionCriteriaPills.d.ts.map +1 -1
  32. package/dist/components/widgets/facet-nav/SelectionCriteriaPills.js +11 -11
  33. package/dist/components/widgets/facet-nav/SelectionCriteriaPills.js.map +1 -1
  34. package/dist/components/widgets/query-filter/RangeFacetFilterUI.d.ts +9 -2
  35. package/dist/components/widgets/query-filter/RangeFacetFilterUI.d.ts.map +1 -1
  36. package/dist/components/widgets/query-filter/RangeFacetFilterUI.js +21 -14
  37. package/dist/components/widgets/query-filter/RangeFacetFilterUI.js.map +1 -1
  38. package/dist/features/curator/dashboard/components/CurationTaskCard.d.ts.map +1 -1
  39. package/dist/features/curator/dashboard/components/CurationTaskCard.js +16 -10
  40. package/dist/features/curator/dashboard/components/CurationTaskCard.js.map +1 -1
  41. package/dist/features/curator/dashboard/components/UserOrTeamChip.css +1 -1
  42. package/dist/features/curator/dashboard/components/UserOrTeamChip.module.js +1 -1
  43. package/dist/features/curator/dashboard/components/UserOrTeamChip.module.js.map +1 -1
  44. package/dist/features/curator/dashboard/components/UserOrTeamChip.module.scss +5 -2
  45. package/dist/features/entity/metadata-task/hooks/useMetadataTaskTable.d.ts.map +1 -1
  46. package/dist/features/entity/metadata-task/hooks/useMetadataTaskTable.js +9 -0
  47. package/dist/features/entity/metadata-task/hooks/useMetadataTaskTable.js.map +1 -1
  48. package/dist/features/entity/metadata-task/hooks/useOpenCuratorButton.d.ts.map +1 -1
  49. package/dist/features/entity/metadata-task/hooks/useOpenCuratorButton.js +1 -1
  50. package/dist/features/entity/metadata-task/hooks/useOpenCuratorButton.js.map +1 -1
  51. package/dist/style/components/_total-query-results.scss +4 -0
  52. package/dist/style/main.css +1 -1
  53. package/dist/tsconfig.build.tsbuildinfo +1 -1
  54. package/package.json +3 -3
@@ -1,7 +1,7 @@
1
1
  import { TextMatchesQueryFilter } from '@sage-bionetworks/synapse-types';
2
2
  import { QueryContextType } from '../../QueryContext';
3
3
  import { SelectionCriteriaPillProps } from './SelectionCriteriaPill';
4
- export declare function getPillPropsFromTextMatchesQueryFilter(queryFilter: TextMatchesQueryFilter, queryContext: QueryContextType): SelectionCriteriaPillProps;
4
+ export declare function getPillPropsFromTextMatchesQueryFilter(queryFilter: TextMatchesQueryFilter, queryContext: QueryContextType, isLocked?: boolean): SelectionCriteriaPillProps;
5
5
  declare function SelectionCriteriaPills(): import("react/jsx-runtime").JSX.Element;
6
6
  export default SelectionCriteriaPills;
7
7
  //# sourceMappingURL=SelectionCriteriaPills.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SelectionCriteriaPills.d.ts","sourceRoot":"","sources":["../../../../src/components/widgets/facet-nav/SelectionCriteriaPills.tsx"],"names":[],"mappings":"AASA,OAAO,EAOL,sBAAsB,EACvB,MAAM,iCAAiC,CAAA;AAGxC,OAAO,EAAE,gBAAgB,EAAmB,MAAM,oBAAoB,CAAA;AAMtE,OAA8B,EAC5B,0BAA0B,EAC3B,MAAM,yBAAyB,CAAA;AA8DhC,wBAAgB,sCAAsC,CACpD,WAAW,EAAE,sBAAsB,EACnC,YAAY,EAAE,gBAAgB,GAC7B,0BAA0B,CAgB5B;AA4KD,iBAAS,sBAAsB,4CAkC9B;AAED,eAAe,sBAAsB,CAAA"}
1
+ {"version":3,"file":"SelectionCriteriaPills.d.ts","sourceRoot":"","sources":["../../../../src/components/widgets/facet-nav/SelectionCriteriaPills.tsx"],"names":[],"mappings":"AASA,OAAO,EAOL,sBAAsB,EACvB,MAAM,iCAAiC,CAAA;AAGxC,OAAO,EAAE,gBAAgB,EAAmB,MAAM,oBAAoB,CAAA;AAMtE,OAA8B,EAC5B,0BAA0B,EAC3B,MAAM,yBAAyB,CAAA;AA8DhC,wBAAgB,sCAAsC,CACpD,WAAW,EAAE,sBAAsB,EACnC,YAAY,EAAE,gBAAgB,EAC9B,QAAQ,CAAC,EAAE,OAAO,GACjB,0BAA0B,CAoB5B;AAmLD,iBAAS,sBAAsB,4CAoC9B;AAED,eAAe,sBAAsB,CAAA"}
@@ -40,23 +40,23 @@ function g(e, t, n, r) {
40
40
  };
41
41
  });
42
42
  }
43
- function _(e, t) {
44
- let n = e.searchExpression;
45
- return e.searchMode == "BOOLEAN" && (n = u(e.searchExpression)), {
43
+ function _(e, t, n) {
44
+ let r = e.searchExpression;
45
+ return e.searchMode == "BOOLEAN" && (r = u(e.searchExpression)), {
46
46
  key: `queryFilter-${e.concreteType}-${e.searchExpression}`,
47
- innerText: n,
48
- tooltipText: `Text matches: "${n}"`,
49
- onRemoveFilter: () => {
47
+ innerText: r,
48
+ tooltipText: `Text matches: "${r}"`,
49
+ ...n ? { isLocked: !0 } : { onRemoveFilter: () => {
50
50
  t.removeQueryFilter(e);
51
- }
51
+ } }
52
52
  };
53
53
  }
54
- function v(e, r, i, o, s) {
54
+ function v(e, r, i, o, s, c) {
55
55
  return e.flatMap((e) => {
56
56
  if (n(e) || t(e)) {
57
57
  let t = i.find((t) => t.name === e.columnName);
58
58
  return e.columnName.toLowerCase() === s?.columnName?.toLowerCase() ? [] : g(e, r, t, o);
59
- } else if (a(e)) return [_(e, r)];
59
+ } else if (a(e)) return [_(e, r, c)];
60
60
  else return console.log("Unknown query filter type", e), [];
61
61
  });
62
62
  }
@@ -119,8 +119,8 @@ function b(e, t, n, a, o) {
119
119
  });
120
120
  }
121
121
  function x() {
122
- let e = o(), t = e.lockedColumn, n = c(), { currentQueryRequest: r } = e, { data: i } = s(), a = v(r.query?.additionalFilters ?? [], e, i?.columnModels || [], n, t), u = b(r.query.selectedFacets ?? [], e, i?.columnModels || [], n, t);
123
- return /* @__PURE__ */ p(f, { children: [...a, ...u].map((e) => {
122
+ let e = o(), t = e.lockedColumn, n = c(), { lockTextMatchesQueryFilterPill: r } = n, { currentQueryRequest: i } = e, { data: a } = s(), u = v(i.query?.additionalFilters ?? [], e, a?.columnModels || [], n, t, r), m = b(i.query.selectedFacets ?? [], e, a?.columnModels || [], n, t);
123
+ return /* @__PURE__ */ p(f, { children: [...u, ...m].map((e) => {
124
124
  let t = encodeURIComponent(e.key);
125
125
  return /* @__PURE__ */ d(l, {
126
126
  ...e,
@@ -1 +1 @@
1
- {"version":3,"file":"SelectionCriteriaPills.js","names":[],"sources":["../../../../src/components/widgets/facet-nav/SelectionCriteriaPills.tsx"],"sourcesContent":["import {\n isColumnMultiValueFunctionQueryFilter,\n isColumnSingleValueQueryFilter,\n isFacetColumnRangeRequest,\n isFacetColumnValuesRequest,\n isTextMatchesQueryFilter,\n LockedColumn,\n} from '@/utils'\nimport { FRIENDLY_VALUE_NOT_SET, VALUE_NOT_SET } from '@/utils/SynapseConstants'\nimport {\n ColumnModel,\n ColumnMultiValueFunctionQueryFilter,\n ColumnSingleValueQueryFilter,\n FacetColumnRangeRequest,\n FacetColumnRequest,\n QueryFilter,\n TextMatchesQueryFilter,\n} from '@sage-bionetworks/synapse-types'\nimport pluralize from 'pluralize'\nimport { ReadonlyDeep } from 'type-fest'\nimport { QueryContextType, useQueryContext } from '../../QueryContext'\nimport {\n QueryVisualizationContextType,\n useQueryVisualizationContext,\n} from '../../QueryVisualizationWrapper'\nimport { useGetQueryMetadata } from '../../QueryWrapper/useGetQueryMetadata'\nimport SelectionCriteriaPill, {\n SelectionCriteriaPillProps,\n} from './SelectionCriteriaPill'\nimport { getSearchTextFromBooleanModeSearchExpression } from '@/components/FullTextSearch/FullTextSearchUtils'\n\nconst MAX_VALUES_IN_FILTER_FOR_INDIVIDUAL_PILLS = 4\n\nfunction getPillPropsFromColumnQueryFilter(\n queryFilter:\n | ColumnSingleValueQueryFilter\n | ColumnMultiValueFunctionQueryFilter,\n queryContext: QueryContextType,\n columnModel: ColumnModel | undefined,\n queryVisualizationContext: QueryVisualizationContextType,\n): SelectionCriteriaPillProps[] {\n const { getColumnDisplayName } = queryVisualizationContext\n // ColumnSingleValueQueryFilter and ColumnMultiValueQueryFilter both allow for a list of values\n // If there are more than _n_ values, consolidate to one pill\n if (\n queryFilter.values.length > MAX_VALUES_IN_FILTER_FOR_INDIVIDUAL_PILLS ||\n !columnModel\n ) {\n const text = `${pluralize(\n getColumnDisplayName(queryFilter.columnName),\n )} (${queryFilter.values.length.toLocaleString()})`\n\n return [\n {\n key: `queryFilter-${queryFilter.concreteType}-${queryFilter.columnName}`,\n innerText: text,\n tooltipText: text,\n onRemoveFilter: () => {\n queryContext.removeQueryFilter(queryFilter)\n },\n },\n ]\n }\n\n // otherwise render one pill per value\n return queryFilter.values.map(value => {\n let filterValue = value\n\n if (value?.startsWith('%') && value?.endsWith('%')) {\n // strip '%' wildcard character when using a LIKE condition\n filterValue = filterValue.substring(1, filterValue.length - 1)\n }\n filterValue = queryVisualizationContext.getDisplayValue(\n filterValue,\n columnModel.columnType,\n )\n const text = `${getColumnDisplayName(\n queryFilter.columnName,\n )}: ${filterValue}`\n return {\n key: `queryFilter-${queryFilter.concreteType}-${queryFilter.columnName}-${value}`,\n innerText: text,\n tooltipText: text,\n onRemoveFilter: () => {\n queryContext.removeValueFromQueryFilter(queryFilter, value)\n },\n }\n })\n}\n\nexport function getPillPropsFromTextMatchesQueryFilter(\n queryFilter: TextMatchesQueryFilter,\n queryContext: QueryContextType,\n): SelectionCriteriaPillProps {\n let innerText = queryFilter.searchExpression\n if (queryFilter.searchMode == 'BOOLEAN') {\n innerText = getSearchTextFromBooleanModeSearchExpression(\n queryFilter.searchExpression,\n )\n }\n\n return {\n key: `queryFilter-${queryFilter.concreteType}-${queryFilter.searchExpression}`,\n innerText,\n tooltipText: `Text matches: \"${innerText}\"`,\n onRemoveFilter: () => {\n queryContext.removeQueryFilter(queryFilter)\n },\n }\n}\n\nfunction getPillPropsFromQueryFilters(\n queryFilters: ReadonlyDeep<QueryFilter[]>,\n queryContext: QueryContextType,\n columnModels: ColumnModel[],\n queryVisualizationContext: QueryVisualizationContextType,\n lockedColumn?: LockedColumn,\n): SelectionCriteriaPillProps[] {\n return queryFilters.flatMap(queryFilter => {\n if (\n isColumnSingleValueQueryFilter(queryFilter) ||\n isColumnMultiValueFunctionQueryFilter(queryFilter)\n ) {\n const columnModel = columnModels.find(\n cm => cm.name === queryFilter.columnName,\n )\n if (\n queryFilter.columnName.toLowerCase() ===\n lockedColumn?.columnName?.toLowerCase()\n ) {\n return []\n }\n return getPillPropsFromColumnQueryFilter(\n queryFilter,\n queryContext,\n columnModel,\n queryVisualizationContext,\n )\n } else if (isTextMatchesQueryFilter(queryFilter)) {\n return [getPillPropsFromTextMatchesQueryFilter(queryFilter, queryContext)]\n } else {\n console.log('Unknown query filter type', queryFilter)\n return []\n }\n })\n}\n\nfunction getRangeFacetInnerText(min?: string, max?: string) {\n if (min == undefined && max == undefined) {\n return 'Any value'\n } else if (min == undefined) {\n return `Up to ${max}`\n } else if (max == undefined) {\n return `${min} or greater`\n } else if (min === VALUE_NOT_SET && max === VALUE_NOT_SET) {\n return FRIENDLY_VALUE_NOT_SET\n } else {\n return `${min} - ${max}`\n }\n}\n\nfunction getPillPropsFromFacetFilters(\n selectedFacets: ReadonlyDeep<FacetColumnRequest[]>,\n queryContext: QueryContextType,\n columnModels: ColumnModel[],\n queryVisualizationContext: QueryVisualizationContextType,\n lockedColumn?: LockedColumn,\n): SelectionCriteriaPillProps[] {\n return selectedFacets.flatMap(selectedFacet => {\n if (\n selectedFacet.columnName.toLowerCase() ===\n lockedColumn?.columnName?.toLowerCase()\n ) {\n return []\n }\n const columnModel = columnModels.find(\n cm => cm.name === selectedFacet.columnName,\n )\n const { getColumnDisplayName, getDisplayValue } = queryVisualizationContext\n if (isFacetColumnValuesRequest(selectedFacet)) {\n // If there are more than _n_ values, consolidate to one pill\n if (\n selectedFacet.facetValues.length >\n MAX_VALUES_IN_FILTER_FOR_INDIVIDUAL_PILLS ||\n !columnModel\n ) {\n const text = `${pluralize(\n getColumnDisplayName(\n selectedFacet.columnName,\n selectedFacet.jsonPath,\n ),\n )} (${selectedFacet.facetValues.length.toLocaleString()})`\n return [\n {\n key: `facet-${selectedFacet.concreteType}-${selectedFacet.columnName}`,\n innerText: text,\n tooltipText: text,\n onRemoveFilter: () => {\n queryContext.removeSelectedFacet(selectedFacet)\n },\n },\n ]\n }\n\n // otherwise render one pill per value\n\n return selectedFacet.facetValues.map(facetValue => {\n const innerText = getDisplayValue(facetValue, columnModel.columnType)\n return {\n key: `facet-${selectedFacet.concreteType}-${selectedFacet.columnName}-${facetValue}`,\n innerText: innerText,\n tooltipText: `${getColumnDisplayName(\n selectedFacet.columnName,\n selectedFacet.jsonPath,\n )}: ${innerText}`,\n onRemoveFilter: () => {\n queryContext.removeValueFromSelectedFacet(selectedFacet, facetValue)\n },\n }\n })\n } else if (isFacetColumnRangeRequest(selectedFacet)) {\n // Include a single pill for both facet filters if a combined range facet filter config is defined\n const { combineRangeFacetConfig } = queryContext\n if (\n combineRangeFacetConfig &&\n (selectedFacet.columnName == combineRangeFacetConfig.minFacetColumn ||\n selectedFacet.columnName == combineRangeFacetConfig.maxFacetColumn)\n ) {\n if (\n selectedFacet.columnName == combineRangeFacetConfig.minFacetColumn\n ) {\n return []\n } else {\n // find the min facet also\n const maxFacet = selectedFacet\n const minFacet = selectedFacets.find(\n v => v.columnName == combineRangeFacetConfig.minFacetColumn,\n ) as FacetColumnRangeRequest\n const innerText = getRangeFacetInnerText(maxFacet.min, minFacet.max)\n return [\n {\n key: `facet-${selectedFacet.concreteType}-${selectedFacet.columnName}-${innerText}`,\n innerText: innerText,\n tooltipText: `${combineRangeFacetConfig.label}: ${innerText}`,\n onRemoveFilter: () => {\n // Remove both facets on pill click\n queryContext.removeSelectedFacet([minFacet, maxFacet])\n },\n },\n ]\n }\n }\n\n const innerText = getRangeFacetInnerText(\n selectedFacet.min,\n selectedFacet.max,\n )\n\n return [\n {\n key: `facet-${selectedFacet.concreteType}-${selectedFacet.columnName}-${selectedFacet.min}-${selectedFacet.max}`,\n innerText: innerText,\n tooltipText: `${getColumnDisplayName(\n selectedFacet.columnName,\n selectedFacet.jsonPath,\n )}: ${innerText}`,\n onRemoveFilter: () => {\n queryContext.removeSelectedFacet(selectedFacet)\n },\n },\n ]\n } else {\n console.log(\n 'Unknown facet type',\n (selectedFacet as unknown as FacetColumnRequest).concreteType,\n )\n return []\n }\n })\n}\n\nfunction SelectionCriteriaPills() {\n const queryContext = useQueryContext()\n const lockedColumn = queryContext.lockedColumn\n const queryVisualizationContext = useQueryVisualizationContext()\n const { currentQueryRequest } = queryContext\n const { data: queryMetadata } = useGetQueryMetadata()\n\n const queryFilterPillProps = getPillPropsFromQueryFilters(\n currentQueryRequest.query?.additionalFilters ?? [],\n queryContext,\n queryMetadata?.columnModels || [],\n queryVisualizationContext,\n lockedColumn,\n )\n\n const facetPillProps = getPillPropsFromFacetFilters(\n currentQueryRequest.query.selectedFacets ?? [],\n queryContext,\n queryMetadata?.columnModels || [],\n queryVisualizationContext,\n lockedColumn,\n )\n\n const allPills = [...queryFilterPillProps, ...facetPillProps]\n\n return (\n <>\n {allPills.map(pillProps => {\n // Encode the key because the facet may include an illegal character\n const key = encodeURIComponent(pillProps.key)\n return <SelectionCriteriaPill {...pillProps} key={key} />\n })}\n </>\n )\n}\n\nexport default SelectionCriteriaPills\n"],"mappings":"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"}
1
+ {"version":3,"file":"SelectionCriteriaPills.js","names":[],"sources":["../../../../src/components/widgets/facet-nav/SelectionCriteriaPills.tsx"],"sourcesContent":["import {\n isColumnMultiValueFunctionQueryFilter,\n isColumnSingleValueQueryFilter,\n isFacetColumnRangeRequest,\n isFacetColumnValuesRequest,\n isTextMatchesQueryFilter,\n LockedColumn,\n} from '@/utils'\nimport { FRIENDLY_VALUE_NOT_SET, VALUE_NOT_SET } from '@/utils/SynapseConstants'\nimport {\n ColumnModel,\n ColumnMultiValueFunctionQueryFilter,\n ColumnSingleValueQueryFilter,\n FacetColumnRangeRequest,\n FacetColumnRequest,\n QueryFilter,\n TextMatchesQueryFilter,\n} from '@sage-bionetworks/synapse-types'\nimport pluralize from 'pluralize'\nimport { ReadonlyDeep } from 'type-fest'\nimport { QueryContextType, useQueryContext } from '../../QueryContext'\nimport {\n QueryVisualizationContextType,\n useQueryVisualizationContext,\n} from '../../QueryVisualizationWrapper'\nimport { useGetQueryMetadata } from '../../QueryWrapper/useGetQueryMetadata'\nimport SelectionCriteriaPill, {\n SelectionCriteriaPillProps,\n} from './SelectionCriteriaPill'\nimport { getSearchTextFromBooleanModeSearchExpression } from '@/components/FullTextSearch/FullTextSearchUtils'\n\nconst MAX_VALUES_IN_FILTER_FOR_INDIVIDUAL_PILLS = 4\n\nfunction getPillPropsFromColumnQueryFilter(\n queryFilter:\n | ColumnSingleValueQueryFilter\n | ColumnMultiValueFunctionQueryFilter,\n queryContext: QueryContextType,\n columnModel: ColumnModel | undefined,\n queryVisualizationContext: QueryVisualizationContextType,\n): SelectionCriteriaPillProps[] {\n const { getColumnDisplayName } = queryVisualizationContext\n // ColumnSingleValueQueryFilter and ColumnMultiValueQueryFilter both allow for a list of values\n // If there are more than _n_ values, consolidate to one pill\n if (\n queryFilter.values.length > MAX_VALUES_IN_FILTER_FOR_INDIVIDUAL_PILLS ||\n !columnModel\n ) {\n const text = `${pluralize(\n getColumnDisplayName(queryFilter.columnName),\n )} (${queryFilter.values.length.toLocaleString()})`\n\n return [\n {\n key: `queryFilter-${queryFilter.concreteType}-${queryFilter.columnName}`,\n innerText: text,\n tooltipText: text,\n onRemoveFilter: () => {\n queryContext.removeQueryFilter(queryFilter)\n },\n },\n ]\n }\n\n // otherwise render one pill per value\n return queryFilter.values.map(value => {\n let filterValue = value\n\n if (value?.startsWith('%') && value?.endsWith('%')) {\n // strip '%' wildcard character when using a LIKE condition\n filterValue = filterValue.substring(1, filterValue.length - 1)\n }\n filterValue = queryVisualizationContext.getDisplayValue(\n filterValue,\n columnModel.columnType,\n )\n const text = `${getColumnDisplayName(\n queryFilter.columnName,\n )}: ${filterValue}`\n return {\n key: `queryFilter-${queryFilter.concreteType}-${queryFilter.columnName}-${value}`,\n innerText: text,\n tooltipText: text,\n onRemoveFilter: () => {\n queryContext.removeValueFromQueryFilter(queryFilter, value)\n },\n }\n })\n}\n\nexport function getPillPropsFromTextMatchesQueryFilter(\n queryFilter: TextMatchesQueryFilter,\n queryContext: QueryContextType,\n isLocked?: boolean,\n): SelectionCriteriaPillProps {\n let innerText = queryFilter.searchExpression\n if (queryFilter.searchMode == 'BOOLEAN') {\n innerText = getSearchTextFromBooleanModeSearchExpression(\n queryFilter.searchExpression,\n )\n }\n\n return {\n key: `queryFilter-${queryFilter.concreteType}-${queryFilter.searchExpression}`,\n innerText,\n tooltipText: `Text matches: \"${innerText}\"`,\n ...(isLocked\n ? { isLocked: true }\n : {\n onRemoveFilter: () => {\n queryContext.removeQueryFilter(queryFilter)\n },\n }),\n }\n}\n\nfunction getPillPropsFromQueryFilters(\n queryFilters: ReadonlyDeep<QueryFilter[]>,\n queryContext: QueryContextType,\n columnModels: ColumnModel[],\n queryVisualizationContext: QueryVisualizationContextType,\n lockedColumn?: LockedColumn,\n lockTextMatchesQueryFilterPill?: boolean,\n): SelectionCriteriaPillProps[] {\n return queryFilters.flatMap(queryFilter => {\n if (\n isColumnSingleValueQueryFilter(queryFilter) ||\n isColumnMultiValueFunctionQueryFilter(queryFilter)\n ) {\n const columnModel = columnModels.find(\n cm => cm.name === queryFilter.columnName,\n )\n if (\n queryFilter.columnName.toLowerCase() ===\n lockedColumn?.columnName?.toLowerCase()\n ) {\n return []\n }\n return getPillPropsFromColumnQueryFilter(\n queryFilter,\n queryContext,\n columnModel,\n queryVisualizationContext,\n )\n } else if (isTextMatchesQueryFilter(queryFilter)) {\n return [\n getPillPropsFromTextMatchesQueryFilter(\n queryFilter,\n queryContext,\n lockTextMatchesQueryFilterPill,\n ),\n ]\n } else {\n console.log('Unknown query filter type', queryFilter)\n return []\n }\n })\n}\n\nfunction getRangeFacetInnerText(min?: string, max?: string) {\n if (min == undefined && max == undefined) {\n return 'Any value'\n } else if (min == undefined) {\n return `Up to ${max}`\n } else if (max == undefined) {\n return `${min} or greater`\n } else if (min === VALUE_NOT_SET && max === VALUE_NOT_SET) {\n return FRIENDLY_VALUE_NOT_SET\n } else {\n return `${min} - ${max}`\n }\n}\n\nfunction getPillPropsFromFacetFilters(\n selectedFacets: ReadonlyDeep<FacetColumnRequest[]>,\n queryContext: QueryContextType,\n columnModels: ColumnModel[],\n queryVisualizationContext: QueryVisualizationContextType,\n lockedColumn?: LockedColumn,\n): SelectionCriteriaPillProps[] {\n return selectedFacets.flatMap(selectedFacet => {\n if (\n selectedFacet.columnName.toLowerCase() ===\n lockedColumn?.columnName?.toLowerCase()\n ) {\n return []\n }\n const columnModel = columnModels.find(\n cm => cm.name === selectedFacet.columnName,\n )\n const { getColumnDisplayName, getDisplayValue } = queryVisualizationContext\n if (isFacetColumnValuesRequest(selectedFacet)) {\n // If there are more than _n_ values, consolidate to one pill\n if (\n selectedFacet.facetValues.length >\n MAX_VALUES_IN_FILTER_FOR_INDIVIDUAL_PILLS ||\n !columnModel\n ) {\n const text = `${pluralize(\n getColumnDisplayName(\n selectedFacet.columnName,\n selectedFacet.jsonPath,\n ),\n )} (${selectedFacet.facetValues.length.toLocaleString()})`\n return [\n {\n key: `facet-${selectedFacet.concreteType}-${selectedFacet.columnName}`,\n innerText: text,\n tooltipText: text,\n onRemoveFilter: () => {\n queryContext.removeSelectedFacet(selectedFacet)\n },\n },\n ]\n }\n\n // otherwise render one pill per value\n\n return selectedFacet.facetValues.map(facetValue => {\n const innerText = getDisplayValue(facetValue, columnModel.columnType)\n return {\n key: `facet-${selectedFacet.concreteType}-${selectedFacet.columnName}-${facetValue}`,\n innerText: innerText,\n tooltipText: `${getColumnDisplayName(\n selectedFacet.columnName,\n selectedFacet.jsonPath,\n )}: ${innerText}`,\n onRemoveFilter: () => {\n queryContext.removeValueFromSelectedFacet(selectedFacet, facetValue)\n },\n }\n })\n } else if (isFacetColumnRangeRequest(selectedFacet)) {\n // Include a single pill for both facet filters if a combined range facet filter config is defined\n const { combineRangeFacetConfig } = queryContext\n if (\n combineRangeFacetConfig &&\n (selectedFacet.columnName == combineRangeFacetConfig.minFacetColumn ||\n selectedFacet.columnName == combineRangeFacetConfig.maxFacetColumn)\n ) {\n if (\n selectedFacet.columnName == combineRangeFacetConfig.minFacetColumn\n ) {\n return []\n } else {\n // find the min facet also\n const maxFacet = selectedFacet\n const minFacet = selectedFacets.find(\n v => v.columnName == combineRangeFacetConfig.minFacetColumn,\n ) as FacetColumnRangeRequest\n const innerText = getRangeFacetInnerText(maxFacet.min, minFacet.max)\n return [\n {\n key: `facet-${selectedFacet.concreteType}-${selectedFacet.columnName}-${innerText}`,\n innerText: innerText,\n tooltipText: `${combineRangeFacetConfig.label}: ${innerText}`,\n onRemoveFilter: () => {\n // Remove both facets on pill click\n queryContext.removeSelectedFacet([minFacet, maxFacet])\n },\n },\n ]\n }\n }\n\n const innerText = getRangeFacetInnerText(\n selectedFacet.min,\n selectedFacet.max,\n )\n\n return [\n {\n key: `facet-${selectedFacet.concreteType}-${selectedFacet.columnName}-${selectedFacet.min}-${selectedFacet.max}`,\n innerText: innerText,\n tooltipText: `${getColumnDisplayName(\n selectedFacet.columnName,\n selectedFacet.jsonPath,\n )}: ${innerText}`,\n onRemoveFilter: () => {\n queryContext.removeSelectedFacet(selectedFacet)\n },\n },\n ]\n } else {\n console.log(\n 'Unknown facet type',\n (selectedFacet as unknown as FacetColumnRequest).concreteType,\n )\n return []\n }\n })\n}\n\nfunction SelectionCriteriaPills() {\n const queryContext = useQueryContext()\n const lockedColumn = queryContext.lockedColumn\n const queryVisualizationContext = useQueryVisualizationContext()\n const { lockTextMatchesQueryFilterPill } = queryVisualizationContext\n const { currentQueryRequest } = queryContext\n const { data: queryMetadata } = useGetQueryMetadata()\n\n const queryFilterPillProps = getPillPropsFromQueryFilters(\n currentQueryRequest.query?.additionalFilters ?? [],\n queryContext,\n queryMetadata?.columnModels || [],\n queryVisualizationContext,\n lockedColumn,\n lockTextMatchesQueryFilterPill,\n )\n\n const facetPillProps = getPillPropsFromFacetFilters(\n currentQueryRequest.query.selectedFacets ?? [],\n queryContext,\n queryMetadata?.columnModels || [],\n queryVisualizationContext,\n lockedColumn,\n )\n\n const allPills = [...queryFilterPillProps, ...facetPillProps]\n\n return (\n <>\n {allPills.map(pillProps => {\n // Encode the key because the facet may include an illegal character\n const key = encodeURIComponent(pillProps.key)\n return <SelectionCriteriaPill {...pillProps} key={key} />\n })}\n </>\n )\n}\n\nexport default SelectionCriteriaPills\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { ColumnType, FacetColumnResultRange } from '@sage-bionetworks/synapse-types';
1
+ import { ColumnType } from '@sage-bionetworks/synapse-types';
2
2
  import { RangeValues } from '../Range';
3
3
  export declare enum RadioValuesEnum {
4
4
  NOT_SET = "org.sagebionetworks.UNDEFINED_NULL_NOTSET",
@@ -11,7 +11,14 @@ export declare const options: {
11
11
  }[];
12
12
  export type RangeFacetFilterProps = {
13
13
  label: string;
14
- facetResult: Pick<FacetColumnResultRange, 'columnMin' | 'columnMax' | 'selectedMin' | 'selectedMax'>;
14
+ facetResult: {
15
+ /** The smallest value in the column. May be absent when the server cannot supply stats (e.g. Search API). */
16
+ columnMin?: string;
17
+ /** The largest value in the column. May be absent when the server cannot supply stats (e.g. Search API). */
18
+ columnMax?: string;
19
+ selectedMin?: string;
20
+ selectedMax?: string;
21
+ };
15
22
  columnType: ColumnType;
16
23
  hideCollapsible?: boolean;
17
24
  onRangeValueSelected: (values: RangeValues) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"RangeFacetFilterUI.d.ts","sourceRoot":"","sources":["../../../../src/components/widgets/query-filter/RangeFacetFilterUI.tsx"],"names":[],"mappings":"AAEA,OAAO,EACL,UAAU,EACV,sBAAsB,EACvB,MAAM,iCAAiC,CAAA;AAGxC,OAAO,EAAS,WAAW,EAAE,MAAM,UAAU,CAAA;AAI7C,oBAAY,eAAe;IACzB,OAAO,8CAA8C;IACrD,KAAK,UAAU;IACf,GAAG,KAAK;CACT;AACD,eAAO,MAAM,OAAO;;;GAInB,CAAA;AACD,MAAM,MAAM,qBAAqB,GAAG;IAClC,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,IAAI,CACf,sBAAsB,EACtB,WAAW,GAAG,WAAW,GAAG,aAAa,GAAG,aAAa,CAC1D,CAAA;IACD,UAAU,EAAE,UAAU,CAAA;IACtB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,oBAAoB,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAA;IACnD,gBAAgB,EAAE,MAAM,IAAI,CAAA;IAC5B,aAAa,EAAE,MAAM,IAAI,CAAA;CAC1B,CAAA;AAED,eAAO,MAAM,aAAa,GAAI,KAAK,MAAM,EAAE,YAAY,OAAO,oBAO7D,CAAA;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,qBAAqB,2CAmH9D"}
1
+ {"version":3,"file":"RangeFacetFilterUI.d.ts","sourceRoot":"","sources":["../../../../src/components/widgets/query-filter/RangeFacetFilterUI.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAA;AAG5D,OAAO,EAAS,WAAW,EAAE,MAAM,UAAU,CAAA;AAI7C,oBAAY,eAAe;IACzB,OAAO,8CAA8C;IACrD,KAAK,UAAU;IACf,GAAG,KAAK;CACT;AACD,eAAO,MAAM,OAAO;;;GAInB,CAAA;AACD,MAAM,MAAM,qBAAqB,GAAG;IAClC,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE;QACX,6GAA6G;QAC7G,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,4GAA4G;QAC5G,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,WAAW,CAAC,EAAE,MAAM,CAAA;KACrB,CAAA;IACD,UAAU,EAAE,UAAU,CAAA;IACtB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,oBAAoB,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAA;IACnD,gBAAgB,EAAE,MAAM,IAAI,CAAA;IAC5B,aAAa,EAAE,MAAM,IAAI,CAAA;CAC1B,CAAA;AAED,eAAO,MAAM,aAAa,GAAI,KAAK,MAAM,EAAE,YAAY,OAAO,oBAO7D,CAAA;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,qBAAqB,2CAkJ9D"}
@@ -34,7 +34,7 @@ function g(e) {
34
34
  b();
35
35
  break;
36
36
  }
37
- }, [P, F] = i(h(A, k));
37
+ }, [P, F] = i(h(A ?? "", k));
38
38
  return /* @__PURE__ */ d("div", { children: [/* @__PURE__ */ u(t, {
39
39
  isCollapsed: C,
40
40
  label: g,
@@ -50,30 +50,37 @@ function g(e) {
50
50
  label: t,
51
51
  value: e
52
52
  }, e))
53
- }), P === p.RANGE && (T === E ? /* @__PURE__ */ u("label", { children: E }) : /* @__PURE__ */ d(l, { children: [
54
- y === "INTEGER" && /* @__PURE__ */ u(r, {
53
+ }), P === p.RANGE && (T && E && T === E ? /* @__PURE__ */ u("label", { children: E }) : /* @__PURE__ */ d(l, { children: [
54
+ y === "INTEGER" && (T && E ? /* @__PURE__ */ u(r, {
55
55
  domain: [T, E],
56
56
  initialValues: {
57
- min: parseInt(A),
58
- max: parseInt(j)
57
+ min: parseInt(A ?? T),
58
+ max: parseInt(j ?? E)
59
59
  },
60
60
  step: 1,
61
61
  onApplyClicked: S,
62
62
  children: ">"
63
- }, "RangeSlider"),
63
+ }, "RangeSlider") : /* @__PURE__ */ u(n, {
64
+ type: "number",
65
+ initialValues: A || j ? {
66
+ min: A ? parseInt(A) : void 0,
67
+ max: j ? parseInt(j) : void 0
68
+ } : void 0,
69
+ onApplyClicked: S
70
+ }, "Range")),
64
71
  y === "DATE" && /* @__PURE__ */ u(n, {
65
- initialValues: {
66
- min: D ?? f(parseInt(T)).toString(),
67
- max: O ?? f(parseInt(E)).toString()
68
- },
72
+ initialValues: D || O || T || E ? {
73
+ min: D ?? (T ? f(parseInt(T)).toString() : void 0),
74
+ max: O ?? (E ? f(parseInt(E)).toString() : void 0)
75
+ } : void 0,
69
76
  type: M,
70
77
  onApplyClicked: S
71
78
  }, "Range"),
72
79
  y === "DOUBLE" && /* @__PURE__ */ u(n, {
73
- initialValues: {
74
- min: parseFloat(A),
75
- max: parseFloat(j)
76
- },
80
+ initialValues: A || j ? {
81
+ min: A ? parseFloat(A) : void 0,
82
+ max: j ? parseFloat(j) : void 0
83
+ } : void 0,
77
84
  type: M,
78
85
  onApplyClicked: S
79
86
  }, "Range")
@@ -1 +1 @@
1
- {"version":3,"file":"RangeFacetFilterUI.js","names":[],"sources":["../../../../src/components/widgets/query-filter/RangeFacetFilterUI.tsx"],"sourcesContent":["import { FRIENDLY_VALUE_NOT_SET, VALUE_NOT_SET } from '@/utils/SynapseConstants'\nimport { Collapse, FormControlLabel, Radio, RadioGroup } from '@mui/material'\nimport {\n ColumnType,\n FacetColumnResultRange,\n} from '@sage-bionetworks/synapse-types'\nimport dayjs from 'dayjs'\nimport { useState } from 'react'\nimport { Range, RangeValues } from '../Range'\nimport RangeSlider from '../RangeSlider/RangeSlider'\nimport { FacetFilterHeader } from './FacetFilterHeader'\n\nexport enum RadioValuesEnum {\n NOT_SET = 'org.sagebionetworks.UNDEFINED_NULL_NOTSET',\n RANGE = 'RANGE',\n ANY = '',\n}\nexport const options = [\n { label: FRIENDLY_VALUE_NOT_SET, value: RadioValuesEnum.NOT_SET },\n { label: 'Any', value: RadioValuesEnum.ANY },\n { label: 'Range', value: RadioValuesEnum.RANGE },\n]\nexport type RangeFacetFilterProps = {\n label: string\n facetResult: Pick<\n FacetColumnResultRange,\n 'columnMin' | 'columnMax' | 'selectedMin' | 'selectedMax'\n >\n columnType: ColumnType\n hideCollapsible?: boolean\n onRangeValueSelected: (values: RangeValues) => void\n onNotSetSelected: () => void\n onAnySelected: () => void\n}\n\nexport const getRadioValue = (min: string, isAnyValue: boolean) => {\n if (isAnyValue) {\n return RadioValuesEnum.ANY\n } else if (min === VALUE_NOT_SET) {\n return RadioValuesEnum.NOT_SET\n }\n return RadioValuesEnum.RANGE\n}\n\nexport function RangeFacetFilterUI(props: RangeFacetFilterProps) {\n const {\n label,\n facetResult,\n hideCollapsible = false,\n columnType,\n onAnySelected,\n onNotSetSelected,\n onRangeValueSelected,\n } = props\n\n const [isCollapsed, setIsCollapsed] = useState<boolean>(false)\n\n const { columnMin, columnMax, selectedMin, selectedMax } = facetResult // the upper bound of the selected range\n\n const hasAnyValue = !selectedMin && !selectedMax\n\n const currentMin = selectedMin || columnMin\n const currentMax = selectedMax || columnMax\n\n const rangeType = columnType === 'DOUBLE' ? 'number' : 'date'\n\n const handleRadioGroupChange = (radioValue: RadioValuesEnum) => {\n setRadioValue(radioValue)\n\n switch (radioValue) {\n case RadioValuesEnum.RANGE:\n // The range facet value will update when the user clicks the apply button\n break\n case RadioValuesEnum.NOT_SET:\n onNotSetSelected()\n break\n case RadioValuesEnum.ANY: {\n onAnySelected()\n break\n }\n }\n }\n\n const [radioValue, setRadioValue] = useState(\n getRadioValue(currentMin, hasAnyValue),\n )\n\n return (\n <div>\n <FacetFilterHeader\n isCollapsed={isCollapsed}\n label={label}\n onClick={(isCollapsed: boolean) => setIsCollapsed(isCollapsed)}\n hideCollapsible={hideCollapsible}\n />\n <Collapse in={!isCollapsed}>\n <RadioGroup\n value={radioValue}\n onChange={(_event, value) =>\n handleRadioGroupChange(value as RadioValuesEnum)\n }\n >\n {options.map(({ value, label }) => (\n <FormControlLabel\n key={value}\n control={<Radio />}\n label={label}\n value={value}\n />\n ))}\n </RadioGroup>\n {radioValue === RadioValuesEnum.RANGE &&\n (columnMin === columnMax ? (\n <label>{columnMax}</label>\n ) : (\n <>\n {columnType === 'INTEGER' && (\n <RangeSlider\n key=\"RangeSlider\"\n domain={[columnMin, columnMax]}\n initialValues={{\n min: parseInt(currentMin),\n max: parseInt(currentMax),\n }}\n step={1}\n onApplyClicked={onRangeValueSelected}\n >\n {'>'}\n </RangeSlider>\n )}\n\n {columnType === 'DATE' && (\n <Range\n key=\"Range\"\n initialValues={{\n // From the backend, selectedMin is a formatted date (like \"2021-06-15\"), but columnMin is a unix timestamp in millis (like \"1624651794856\")\n min: selectedMin ?? dayjs(parseInt(columnMin)).toString(),\n max: selectedMax ?? dayjs(parseInt(columnMax)).toString(),\n }}\n type={rangeType}\n onApplyClicked={onRangeValueSelected}\n />\n )}\n {columnType === 'DOUBLE' && (\n <Range\n key=\"Range\"\n initialValues={{\n min: parseFloat(currentMin),\n max: parseFloat(currentMax),\n }}\n type={rangeType}\n onApplyClicked={onRangeValueSelected}\n />\n )}\n </>\n ))}\n </Collapse>\n </div>\n )\n}\n"],"mappings":";;;;;;;;;AAYA,IAAY,IAAL,yBAAA,GAAA;QACL,EAAA,UAAU,6CACV,EAAA,QAAQ,SACR,EAAA,MAAM;KACP,EACY,IAAU;CACrB;EAAE,OAAO;EAAwB,OAAO,EAAgB;EAAS;CACjE;EAAE,OAAO;EAAO,OAAO,EAAgB;EAAK;CAC5C;EAAE,OAAO;EAAS,OAAO,EAAgB;EAAO;CACjD,EAcY,KAAiB,GAAa,MACrC,IACK,EAAgB,MACd,MAAA,8CACF,EAAgB,UAElB,EAAgB;AAGzB,SAAgB,EAAmB,GAA8B;CAC/D,IAAM,EACJ,UACA,gBACA,qBAAkB,IAClB,eACA,kBACA,qBACA,4BACE,GAEE,CAAC,GAAa,KAAkB,EAAkB,GAAM,EAExD,EAAE,cAAW,cAAW,gBAAa,mBAAgB,GAErD,IAAc,CAAC,KAAe,CAAC,GAE/B,IAAa,KAAe,GAC5B,IAAa,KAAe,GAE5B,IAAY,MAAe,WAAW,WAAW,QAEjD,KAA0B,MAAgC;AAG9D,UAFA,EAAc,EAAW,EAEjB,GAAR;GACE,KAAK,EAAgB,MAEnB;GACF,KAAK,EAAgB;AACnB,OAAkB;AAClB;GACF,KAAK,EAAgB;AACnB,OAAe;AACf;;IAKA,CAAC,GAAY,KAAiB,EAClC,EAAc,GAAY,EAAY,CACvC;AAED,QACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,GAAD;EACe;EACN;EACP,UAAU,MAAyB,EAAe,EAAY;EAC7C;EACjB,CAAA,EACF,kBAAC,GAAD;EAAU,IAAI,CAAC;YAAf,CACE,kBAAC,GAAD;GACE,OAAO;GACP,WAAW,GAAQ,MACjB,EAAuB,EAAyB;aAGjD,EAAQ,KAAK,EAAE,UAAO,eACrB,kBAAC,GAAD;IAEE,SAAS,kBAAC,GAAD,EAAS,CAAA;IACX;IACA;IACP,EAJK,EAIL,CACF;GACS,CAAA,EACZ,MAAe,EAAgB,UAC7B,MAAc,IACb,kBAAC,SAAD,EAAA,UAAQ,GAAkB,CAAA,GAE1B,kBAAA,GAAA,EAAA,UAAA;GACG,MAAe,aACd,kBAAC,GAAD;IAEE,QAAQ,CAAC,GAAW,EAAU;IAC9B,eAAe;KACb,KAAK,SAAS,EAAW;KACzB,KAAK,SAAS,EAAW;KAC1B;IACD,MAAM;IACN,gBAAgB;cAEf;IACW,EAVR,cAUQ;GAGf,MAAe,UACd,kBAAC,GAAD;IAEE,eAAe;KAEb,KAAK,KAAe,EAAM,SAAS,EAAU,CAAC,CAAC,UAAU;KACzD,KAAK,KAAe,EAAM,SAAS,EAAU,CAAC,CAAC,UAAU;KAC1D;IACD,MAAM;IACN,gBAAgB;IAChB,EARI,QAQJ;GAEH,MAAe,YACd,kBAAC,GAAD;IAEE,eAAe;KACb,KAAK,WAAW,EAAW;KAC3B,KAAK,WAAW,EAAW;KAC5B;IACD,MAAM;IACN,gBAAgB;IAChB,EAPI,QAOJ;GAEH,EAAA,CAAA,EAEE;IACP,EAAA,CAAA"}
1
+ {"version":3,"file":"RangeFacetFilterUI.js","names":[],"sources":["../../../../src/components/widgets/query-filter/RangeFacetFilterUI.tsx"],"sourcesContent":["import { FRIENDLY_VALUE_NOT_SET, VALUE_NOT_SET } from '@/utils/SynapseConstants'\nimport { Collapse, FormControlLabel, Radio, RadioGroup } from '@mui/material'\nimport { ColumnType } from '@sage-bionetworks/synapse-types'\nimport dayjs from 'dayjs'\nimport { useState } from 'react'\nimport { Range, RangeValues } from '../Range'\nimport RangeSlider from '../RangeSlider/RangeSlider'\nimport { FacetFilterHeader } from './FacetFilterHeader'\n\nexport enum RadioValuesEnum {\n NOT_SET = 'org.sagebionetworks.UNDEFINED_NULL_NOTSET',\n RANGE = 'RANGE',\n ANY = '',\n}\nexport const options = [\n { label: FRIENDLY_VALUE_NOT_SET, value: RadioValuesEnum.NOT_SET },\n { label: 'Any', value: RadioValuesEnum.ANY },\n { label: 'Range', value: RadioValuesEnum.RANGE },\n]\nexport type RangeFacetFilterProps = {\n label: string\n facetResult: {\n /** The smallest value in the column. May be absent when the server cannot supply stats (e.g. Search API). */\n columnMin?: string\n /** The largest value in the column. May be absent when the server cannot supply stats (e.g. Search API). */\n columnMax?: string\n selectedMin?: string\n selectedMax?: string\n }\n columnType: ColumnType\n hideCollapsible?: boolean\n onRangeValueSelected: (values: RangeValues) => void\n onNotSetSelected: () => void\n onAnySelected: () => void\n}\n\nexport const getRadioValue = (min: string, isAnyValue: boolean) => {\n if (isAnyValue) {\n return RadioValuesEnum.ANY\n } else if (min === VALUE_NOT_SET) {\n return RadioValuesEnum.NOT_SET\n }\n return RadioValuesEnum.RANGE\n}\n\nexport function RangeFacetFilterUI(props: RangeFacetFilterProps) {\n const {\n label,\n facetResult,\n hideCollapsible = false,\n columnType,\n onAnySelected,\n onNotSetSelected,\n onRangeValueSelected,\n } = props\n\n const [isCollapsed, setIsCollapsed] = useState<boolean>(false)\n\n const { columnMin, columnMax, selectedMin, selectedMax } = facetResult // the upper bound of the selected range\n\n const hasAnyValue = !selectedMin && !selectedMax\n\n const currentMin = selectedMin || columnMin\n const currentMax = selectedMax || columnMax\n\n const rangeType = columnType === 'DOUBLE' ? 'number' : 'date'\n\n const handleRadioGroupChange = (radioValue: RadioValuesEnum) => {\n setRadioValue(radioValue)\n\n switch (radioValue) {\n case RadioValuesEnum.RANGE:\n // The range facet value will update when the user clicks the apply button\n break\n case RadioValuesEnum.NOT_SET:\n onNotSetSelected()\n break\n case RadioValuesEnum.ANY: {\n onAnySelected()\n break\n }\n }\n }\n\n const [radioValue, setRadioValue] = useState(\n getRadioValue(currentMin ?? '', hasAnyValue),\n )\n\n return (\n <div>\n <FacetFilterHeader\n isCollapsed={isCollapsed}\n label={label}\n onClick={(isCollapsed: boolean) => setIsCollapsed(isCollapsed)}\n hideCollapsible={hideCollapsible}\n />\n <Collapse in={!isCollapsed}>\n <RadioGroup\n value={radioValue}\n onChange={(_event, value) =>\n handleRadioGroupChange(value as RadioValuesEnum)\n }\n >\n {options.map(({ value, label }) => (\n <FormControlLabel\n key={value}\n control={<Radio />}\n label={label}\n value={value}\n />\n ))}\n </RadioGroup>\n {radioValue === RadioValuesEnum.RANGE &&\n (columnMin && columnMax && columnMin === columnMax ? (\n <label>{columnMax}</label>\n ) : (\n <>\n {columnType === 'INTEGER' &&\n (columnMin && columnMax ? (\n <RangeSlider\n key=\"RangeSlider\"\n domain={[columnMin, columnMax]}\n initialValues={{\n min: parseInt(currentMin ?? columnMin),\n max: parseInt(currentMax ?? columnMax),\n }}\n step={1}\n onApplyClicked={onRangeValueSelected}\n >\n {'>'}\n </RangeSlider>\n ) : (\n <Range\n key=\"Range\"\n type=\"number\"\n initialValues={\n currentMin || currentMax\n ? {\n min: currentMin ? parseInt(currentMin) : undefined,\n max: currentMax ? parseInt(currentMax) : undefined,\n }\n : undefined\n }\n onApplyClicked={onRangeValueSelected}\n />\n ))}\n\n {columnType === 'DATE' && (\n <Range\n key=\"Range\"\n initialValues={\n selectedMin || selectedMax || columnMin || columnMax\n ? {\n // From the backend, selectedMin is a formatted date (like \"2021-06-15\"), but columnMin is a unix timestamp in millis (like \"1624651794856\")\n min:\n selectedMin ??\n (columnMin\n ? dayjs(parseInt(columnMin)).toString()\n : undefined),\n max:\n selectedMax ??\n (columnMax\n ? dayjs(parseInt(columnMax)).toString()\n : undefined),\n }\n : undefined\n }\n type={rangeType}\n onApplyClicked={onRangeValueSelected}\n />\n )}\n {columnType === 'DOUBLE' && (\n <Range\n key=\"Range\"\n initialValues={\n currentMin || currentMax\n ? {\n min: currentMin ? parseFloat(currentMin) : undefined,\n max: currentMax ? parseFloat(currentMax) : undefined,\n }\n : undefined\n }\n type={rangeType}\n onApplyClicked={onRangeValueSelected}\n />\n )}\n </>\n ))}\n </Collapse>\n </div>\n )\n}\n"],"mappings":";;;;;;;;;AASA,IAAY,IAAL,yBAAA,GAAA;QACL,EAAA,UAAU,6CACV,EAAA,QAAQ,SACR,EAAA,MAAM;KACP,EACY,IAAU;CACrB;EAAE,OAAO;EAAwB,OAAO,EAAgB;EAAS;CACjE;EAAE,OAAO;EAAO,OAAO,EAAgB;EAAK;CAC5C;EAAE,OAAO;EAAS,OAAO,EAAgB;EAAO;CACjD,EAkBY,KAAiB,GAAa,MACrC,IACK,EAAgB,MACd,MAAA,8CACF,EAAgB,UAElB,EAAgB;AAGzB,SAAgB,EAAmB,GAA8B;CAC/D,IAAM,EACJ,UACA,gBACA,qBAAkB,IAClB,eACA,kBACA,qBACA,4BACE,GAEE,CAAC,GAAa,KAAkB,EAAkB,GAAM,EAExD,EAAE,cAAW,cAAW,gBAAa,mBAAgB,GAErD,IAAc,CAAC,KAAe,CAAC,GAE/B,IAAa,KAAe,GAC5B,IAAa,KAAe,GAE5B,IAAY,MAAe,WAAW,WAAW,QAEjD,KAA0B,MAAgC;AAG9D,UAFA,EAAc,EAAW,EAEjB,GAAR;GACE,KAAK,EAAgB,MAEnB;GACF,KAAK,EAAgB;AACnB,OAAkB;AAClB;GACF,KAAK,EAAgB;AACnB,OAAe;AACf;;IAKA,CAAC,GAAY,KAAiB,EAClC,EAAc,KAAc,IAAI,EAAY,CAC7C;AAED,QACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,GAAD;EACe;EACN;EACP,UAAU,MAAyB,EAAe,EAAY;EAC7C;EACjB,CAAA,EACF,kBAAC,GAAD;EAAU,IAAI,CAAC;YAAf,CACE,kBAAC,GAAD;GACE,OAAO;GACP,WAAW,GAAQ,MACjB,EAAuB,EAAyB;aAGjD,EAAQ,KAAK,EAAE,UAAO,eACrB,kBAAC,GAAD;IAEE,SAAS,kBAAC,GAAD,EAAS,CAAA;IACX;IACA;IACP,EAJK,EAIL,CACF;GACS,CAAA,EACZ,MAAe,EAAgB,UAC7B,KAAa,KAAa,MAAc,IACvC,kBAAC,SAAD,EAAA,UAAQ,GAAkB,CAAA,GAE1B,kBAAA,GAAA,EAAA,UAAA;GACG,MAAe,cACb,KAAa,IACZ,kBAAC,GAAD;IAEE,QAAQ,CAAC,GAAW,EAAU;IAC9B,eAAe;KACb,KAAK,SAAS,KAAc,EAAU;KACtC,KAAK,SAAS,KAAc,EAAU;KACvC;IACD,MAAM;IACN,gBAAgB;cAEf;IACW,EAVR,cAUQ,GAEd,kBAAC,GAAD;IAEE,MAAK;IACL,eACE,KAAc,IACV;KACE,KAAK,IAAa,SAAS,EAAW,GAAG,KAAA;KACzC,KAAK,IAAa,SAAS,EAAW,GAAG,KAAA;KAC1C,GACD,KAAA;IAEN,gBAAgB;IAChB,EAXI,QAWJ;GAGL,MAAe,UACd,kBAAC,GAAD;IAEE,eACE,KAAe,KAAe,KAAa,IACvC;KAEE,KACE,MACC,IACG,EAAM,SAAS,EAAU,CAAC,CAAC,UAAU,GACrC,KAAA;KACN,KACE,MACC,IACG,EAAM,SAAS,EAAU,CAAC,CAAC,UAAU,GACrC,KAAA;KACP,GACD,KAAA;IAEN,MAAM;IACN,gBAAgB;IAChB,EApBI,QAoBJ;GAEH,MAAe,YACd,kBAAC,GAAD;IAEE,eACE,KAAc,IACV;KACE,KAAK,IAAa,WAAW,EAAW,GAAG,KAAA;KAC3C,KAAK,IAAa,WAAW,EAAW,GAAG,KAAA;KAC5C,GACD,KAAA;IAEN,MAAM;IACN,gBAAgB;IAChB,EAXI,QAWJ;GAEH,EAAA,CAAA,EAEE;IACP,EAAA,CAAA"}
@@ -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;AA6DD;;GAEG;AACH,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,2CAqDpE"}
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"}
@@ -18,6 +18,7 @@ function m(t) {
18
18
  case "org.sagebionetworks.repo.model.curation.metadata.RecordBasedMetadataTaskProperties": return {
19
19
  title: t.task.dataType,
20
20
  description: t.task.instructions ?? "",
21
+ taskId: t.task.taskId,
21
22
  principalIds: t.task.assigneePrincipalId ? [t.task.assigneePrincipalId] : [],
22
23
  buttonText: "Open Curator",
23
24
  taskType: "Curate Data",
@@ -31,6 +32,7 @@ function m(t) {
31
32
  return {
32
33
  title: t.task.dataType,
33
34
  description: t.task.instructions ?? "",
35
+ taskId: t.task.taskId,
34
36
  principalIds: t.task.assigneePrincipalId ? [t.task.assigneePrincipalId] : [],
35
37
  buttonText: "Continue",
36
38
  taskType: "",
@@ -53,7 +55,7 @@ function h(e) {
53
55
  });
54
56
  }
55
57
  function g(n) {
56
- let { taskBundle: c } = n, { title: g, description: _, taskType: v, principalIds: y, buttonText: b, onClickNextStep: x, hasPermission: S, isLoading: C, isPending: w } = m(c);
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);
57
59
  return /* @__PURE__ */ d(s, {
58
60
  className: p(a.card, r.card),
59
61
  children: /* @__PURE__ */ f("div", {
@@ -64,10 +66,14 @@ function g(n) {
64
66
  children: [
65
67
  /* @__PURE__ */ f("div", {
66
68
  className: r.titleChipContainer,
67
- children: [/* @__PURE__ */ d(u, {
68
- variant: "headline3",
69
- children: g
70
- }), v && /* @__PURE__ */ d(h, { label: v })]
69
+ children: [
70
+ /* @__PURE__ */ d(u, {
71
+ variant: "headline3",
72
+ children: g
73
+ }),
74
+ y && /* @__PURE__ */ d(h, { label: y }),
75
+ v && /* @__PURE__ */ d(h, { label: `TaskId ${v}` })
76
+ ]
71
77
  }),
72
78
  /* @__PURE__ */ d(u, {
73
79
  variant: "body1",
@@ -75,7 +81,7 @@ function g(n) {
75
81
  }),
76
82
  /* @__PURE__ */ d("div", {
77
83
  className: r.userChipContainer,
78
- children: y.map((e) => /* @__PURE__ */ d(o, { principalId: e }, e))
84
+ children: b.map((e) => /* @__PURE__ */ d(o, { principalId: e }, e))
79
85
  })
80
86
  ]
81
87
  }),
@@ -89,12 +95,12 @@ function g(n) {
89
95
  }),
90
96
  /* @__PURE__ */ d(i, {
91
97
  className: r.cardButton,
92
- buttonText: b,
93
- onClick: S ? x : () => {
98
+ buttonText: x,
99
+ onClick: C ? S : () => {
94
100
  e(t, "danger");
95
101
  },
96
- disabled: C,
97
- loading: w
102
+ disabled: w,
103
+ loading: T
98
104
  })
99
105
  ]
100
106
  })
@@ -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 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 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 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 </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,EAAW;AAE1C,KAAI,CAAC,EAAW,QAAQ,CAAC,EAAW,OAClC,OAAU,MAAM,6CAA6C;AAG/D,SAAQ,EAAW,MAAM,gBAAgB,cAAzC;EACE,KAAK;EACL,KAAK,qFACH,QAAO;GACL,OAAO,EAAW,KAAK;GACvB,aAAa,EAAW,KAAK,gBAAgB;GAC7C,cAAc,EAAW,KAAK,sBAC1B,CAAC,EAAW,KAAK,oBAAoB,GACrC,EAAE;GACN,YAAY;GACZ,UAAU;GACV,iBAAiB;GACjB;GACA;GACA;GACD;EACH,QACE,SAAQ,MACN,sCAEE,EAAW,MAAM,gBAAgB,aACpC;;AAIL,QAAO;EACL,OAAO,EAAW,KAAK;EACvB,aAAa,EAAW,KAAK,gBAAgB;EAC7C,cAAc,EAAW,KAAK,sBAC1B,CAAC,EAAW,KAAK,oBAAoB,GACrC,EAAE;EACN,YAAY;EACZ,UAAU;EACV,uBAAuB;AACrB,KAAa,wCAAwC,UAAU,EAC7D,OAAO,oBACR,CAAC;;EAEJ,WAAW;EACX,WAAW;EACX,eAAe,KAAA;EAChB;;AAGH,SAAS,EAAa,GAA0B;CAC9C,IAAM,EAAE,aAAU;AAClB,QACE,kBAAC,GAAD;EAAM,IAAI;GAAE,YAAY;GAAK,iBAAiB;GAAW;EAAS;EAAS,CAAA;;AAO/E,SAAwB,EAAiB,GAA8B;CACrE,IAAM,EAAE,kBAAe,GACjB,EACJ,UACA,gBACA,aACA,iBACA,eACA,oBACA,kBACA,cACA,iBACE,EAAa,EAAW;AAE5B,QACE,kBAAC,GAAD;EAAM,WAAW,EAAW,EAAa,MAAM,EAAO,KAAK;YACzD,kBAAC,OAAD;GAAK,WAAW,EAAO;aAAvB;IACE,kBAAC,OAAD;KAAK,WAAW,EAAO;eAAvB;MACE,kBAAC,OAAD;OAAK,WAAW,EAAO;iBAAvB,CACE,kBAAC,GAAD;QAAY,SAAQ;kBAAa;QAAmB,CAAA,EACnD,KAAY,kBAAC,GAAD,EAAc,OAAO,GAAY,CAAA,CAC1C;;MACN,kBAAC,GAAD;OAAY,SAAQ;iBAAS;OAAyB,CAAA;MACtD,kBAAC,OAAD;OAAK,WAAW,EAAO;iBACpB,EAAa,KAAI,MAChB,kBAAC,GAAD,EAA+C,gBAAe,EAAzC,EAAyC,CAC9D;OACE,CAAA;MACF;;IACN,kBAAC,GAAD;KACE,aAAY;KACZ,UAAA;KACA,IAAI,EAAE,SAAS;MAAE,IAAI;MAAQ,IAAI;MAAS,EAAE;KAC5C,CAAA;IACF,kBAAC,GAAD;KACE,WAAW,EAAO;KACN;KACZ,SACE,IACI,UACM;AACJ,QACE,GACA,SACD;;KAGT,UAAU;KACV,SAAS;KACT,CAAA;IACE;;EACD,CAAA"}
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,EAAW;AAE1C,KAAI,CAAC,EAAW,QAAQ,CAAC,EAAW,OAClC,OAAU,MAAM,6CAA6C;AAG/D,SAAQ,EAAW,MAAM,gBAAgB,cAAzC;EACE,KAAK;EACL,KAAK,qFACH,QAAO;GACL,OAAO,EAAW,KAAK;GACvB,aAAa,EAAW,KAAK,gBAAgB;GAC7C,QAAQ,EAAW,KAAK;GACxB,cAAc,EAAW,KAAK,sBAC1B,CAAC,EAAW,KAAK,oBAAoB,GACrC,EAAE;GACN,YAAY;GACZ,UAAU;GACV,iBAAiB;GACjB;GACA;GACA;GACD;EACH,QACE,SAAQ,MACN,sCAEE,EAAW,MAAM,gBAAgB,aACpC;;AAIL,QAAO;EACL,OAAO,EAAW,KAAK;EACvB,aAAa,EAAW,KAAK,gBAAgB;EAC7C,QAAQ,EAAW,KAAK;EACxB,cAAc,EAAW,KAAK,sBAC1B,CAAC,EAAW,KAAK,oBAAoB,GACrC,EAAE;EACN,YAAY;EACZ,UAAU;EACV,uBAAuB;AACrB,KAAa,wCAAwC,UAAU,EAC7D,OAAO,oBACR,CAAC;;EAEJ,WAAW;EACX,WAAW;EACX,eAAe,KAAA;EAChB;;AAGH,SAAS,EAAa,GAA0B;CAC9C,IAAM,EAAE,aAAU;AAClB,QACE,kBAAC,GAAD;EAAM,IAAI;GAAE,YAAY;GAAK,iBAAiB;GAAW;EAAS;EAAS,CAAA;;AAO/E,SAAwB,EAAiB,GAA8B;CACrE,IAAM,EAAE,kBAAe,GACjB,EACJ,UACA,gBACA,WACA,aACA,iBACA,eACA,oBACA,kBACA,cACA,iBACE,EAAa,EAAW;AAE5B,QACE,kBAAC,GAAD;EAAM,WAAW,EAAW,EAAa,MAAM,EAAO,KAAK;YACzD,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;SAAmB,CAAA;QACnD,KAAY,kBAAC,GAAD,EAAc,OAAO,GAAY,CAAA;QAC7C,KAAU,kBAAC,GAAD,EAAc,OAAO,UAAU,KAAY,CAAA;QAClD;;MACN,kBAAC,GAAD;OAAY,SAAQ;iBAAS;OAAyB,CAAA;MACtD,kBAAC,OAAD;OAAK,WAAW,EAAO;iBACpB,EAAa,KAAI,MAChB,kBAAC,GAAD,EAA+C,gBAAe,EAAzC,EAAyC,CAC9D;OACE,CAAA;MACF;;IACN,kBAAC,GAAD;KACE,aAAY;KACZ,UAAA;KACA,IAAI,EAAE,SAAS;MAAE,IAAI;MAAQ,IAAI;MAAS,EAAE;KAC5C,CAAA;IACF,kBAAC,GAAD;KACE,WAAW,EAAO;KACN;KACZ,SACE,IACI,UACM;AACJ,QACE,GACA,SACD;;KAGT,UAAU;KACV,SAAS;KACT,CAAA;IACE;;EACD,CAAA"}
@@ -1 +1 @@
1
- ._chip_1pdl4_1.MuiChip-root{font-weight:600}._chip_1pdl4_1.MuiChip-root .MuiAvatar-root{margin-left:.5em}._chip_1pdl4_1.MuiChip-root .MuiChip-label{padding-left:.75em}
1
+ ._chip_1obdi_1.MuiChip-root{font-weight:600}._chip_1obdi_1.MuiChip-root .MuiAvatar-root,._chip_1obdi_1.MuiChip-root .MuiSvgIcon-root{margin-left:.5em}._chip_1obdi_1.MuiChip-root .MuiChip-label{padding-left:.75em}
@@ -1,4 +1,4 @@
1
- import './UserOrTeamChip.css';var e = { chip: "_chip_1pdl4_1" };
1
+ import './UserOrTeamChip.css';var e = { chip: "_chip_1obdi_1" };
2
2
  //#endregion
3
3
  export { e as default };
4
4
 
@@ -1 +1 @@
1
- {"version":3,"file":"UserOrTeamChip.module.js","names":[],"sources":["../../../../../src/features/curator/dashboard/components/UserOrTeamChip.module.scss"],"sourcesContent":[".chip:global(.MuiChip-root) {\n font-weight: 600;\n & :global(.MuiAvatar-root) {\n margin-left: 0.5em;\n }\n & :global(.MuiChip-label) {\n padding-left: 0.75em;\n }\n}\n"],"mappings":""}
1
+ {"version":3,"file":"UserOrTeamChip.module.js","names":[],"sources":["../../../../../src/features/curator/dashboard/components/UserOrTeamChip.module.scss"],"sourcesContent":[".chip:global(.MuiChip-root) {\n font-weight: 600;\n & :global {\n .MuiAvatar-root,\n .MuiSvgIcon-root {\n margin-left: 0.5em;\n }\n }\n & :global(.MuiChip-label) {\n padding-left: 0.75em;\n }\n}\n"],"mappings":""}
@@ -1,7 +1,10 @@
1
1
  .chip:global(.MuiChip-root) {
2
2
  font-weight: 600;
3
- & :global(.MuiAvatar-root) {
4
- margin-left: 0.5em;
3
+ & :global {
4
+ .MuiAvatar-root,
5
+ .MuiSvgIcon-root {
6
+ margin-left: 0.5em;
7
+ }
5
8
  }
6
9
  & :global(.MuiChip-label) {
7
10
  padding-left: 0.75em;
@@ -1 +1 @@
1
- {"version":3,"file":"useMetadataTaskTable.d.ts","sourceRoot":"","sources":["../../../../../src/features/entity/metadata-task/hooks/useMetadataTaskTable.tsx"],"names":[],"mappings":"AAOA,OAAO,EACL,uBAAuB,EACvB,UAAU,EACX,MAAM,kCAAkC,CAAA;AACzC,OAAO,EAGL,KAAK,EAEN,MAAM,uBAAuB,CAAA;AAsD9B,KAAK,2BAA2B,GAAG;IACjC,uBAAuB,EAAE,uBAAuB,CAAA;CACjD,CAAA;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,2BAA2B;;;;;;EA+CrE"}
1
+ {"version":3,"file":"useMetadataTaskTable.d.ts","sourceRoot":"","sources":["../../../../../src/features/entity/metadata-task/hooks/useMetadataTaskTable.tsx"],"names":[],"mappings":"AAOA,OAAO,EACL,uBAAuB,EACvB,UAAU,EACX,MAAM,kCAAkC,CAAA;AACzC,OAAO,EAGL,KAAK,EAEN,MAAM,uBAAuB,CAAA;AA4D9B,KAAK,2BAA2B,GAAG;IACjC,uBAAuB,EAAE,uBAAuB,CAAA;CACjD,CAAA;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,2BAA2B;;;;;;EA+CrE"}
@@ -28,6 +28,15 @@ function h(e) {
28
28
  enableSorting: !1,
29
29
  enableColumnFilter: !1
30
30
  }),
31
+ i.accessor("task.taskId", {
32
+ header: (e) => /* @__PURE__ */ u(n, {
33
+ ...e,
34
+ title: "Task ID"
35
+ }),
36
+ cell: ({ getValue: e }) => /* @__PURE__ */ u("p", { children: e() }),
37
+ enableSorting: !1,
38
+ enableColumnFilter: !1
39
+ }),
31
40
  i.accessor("task.instructions", {
32
41
  header: (e) => /* @__PURE__ */ u(n, {
33
42
  ...e,
@@ -1 +1 @@
1
- {"version":3,"file":"useMetadataTaskTable.js","names":[],"sources":["../../../../../src/features/entity/metadata-task/hooks/useMetadataTaskTable.tsx"],"sourcesContent":["import ColumnHeader from '@/components/TanStackTable/ColumnHeader'\nimport { getGridSourceIdForTask } from '@/features/entity/metadata-task/utils/getGridSourceIdForTask'\nimport { useGetCurationTasksInfinite } from '@/synapse-queries/curation/task/useCurationTask'\nimport { useGetEntityBundle } from '@/synapse-queries/index'\nimport { formatDate } from '@/utils/functions/DateFormatter'\nimport { getLinkToEntityPage } from '@/utils/functions/getSynapseWebClientLink'\nimport { Link } from '@mui/material'\nimport {\n ListCurationTaskRequest,\n TaskBundle,\n} from '@sage-bionetworks/synapse-client'\nimport {\n createColumnHelper,\n getCoreRowModel,\n Table,\n useReactTable,\n} from '@tanstack/react-table'\nimport dayjs from 'dayjs'\nimport { useMemo } from 'react'\nimport MetadataTaskTableActionCell from '../components/MetadataTaskTableActionCell'\nimport MetadataTasksTableAssigneeCell from '../components/MetadataTasksTableAssigneeCell'\n\nfunction getColumns(canEdit: boolean) {\n const columnHelper = createColumnHelper<TaskBundle>()\n return [\n columnHelper.accessor('task.dataType', {\n header: props => <ColumnHeader {...props} title={'Task'} />,\n cell: ({ row, getValue }) => {\n const entityId = getGridSourceIdForTask(row.original.task!)\n return <Link href={getLinkToEntityPage(entityId)}>{getValue()}</Link>\n },\n enableSorting: false,\n enableColumnFilter: false,\n }),\n columnHelper.accessor('task.instructions', {\n header: props => <ColumnHeader {...props} title={'Instructions'} />,\n cell: ({ getValue }) => <p>{getValue()}</p>,\n enableSorting: false,\n enableColumnFilter: false,\n }),\n columnHelper.accessor('task.assigneePrincipalId', {\n header: props => <ColumnHeader {...props} title={'Assignee'} />,\n cell: ({ row }) => (\n <MetadataTasksTableAssigneeCell\n taskBundle={row.original}\n canEdit={canEdit}\n />\n ),\n enableSorting: false,\n enableColumnFilter: false,\n }),\n columnHelper.accessor('task.modifiedOn', {\n header: props => <ColumnHeader {...props} title={'Modified On'} />,\n cell: ({ getValue }) => formatDate(dayjs(getValue())),\n enableSorting: false,\n enableColumnFilter: false,\n }),\n columnHelper.display({\n id: 'actions',\n header: props => <ColumnHeader {...props} title={'Actions'} />,\n cell: ({ row }) => (\n <MetadataTaskTableActionCell\n taskBundle={row.original}\n canEdit={canEdit}\n />\n ),\n }),\n ]\n}\n\ntype UseMetadataTaskTableOptions = {\n listCurationTaskRequest: ListCurationTaskRequest\n}\n\n/**\n * Provides a table instance and loading states for displaying metadata curation tasks associated with a project.\n */\nexport function useMetadataTaskTable(opts: UseMetadataTaskTableOptions) {\n const { listCurationTaskRequest } = opts\n\n const {\n data,\n hasNextPage,\n fetchNextPage,\n isLoading: isLoadingTasks,\n isFetchingNextPage,\n } = useGetCurationTasksInfinite(listCurationTaskRequest)\n\n const { data: projectBundle, isLoading: isLoadingProjectBundle } =\n useGetEntityBundle(\n listCurationTaskRequest.projectId,\n undefined,\n { includePermissions: true },\n {\n enabled: !!listCurationTaskRequest.projectId,\n },\n )\n\n const canEditTasks = projectBundle?.permissions?.canEdit ?? false\n\n const tasks = useMemo(\n () => data?.pages.flatMap(page => page.bundlePage!) ?? [],\n [data],\n )\n\n const table: Table<TaskBundle> = useReactTable<TaskBundle>({\n data: tasks,\n columns: getColumns(canEditTasks),\n getRowId: row => String(row.task!.taskId!),\n getCoreRowModel: getCoreRowModel(),\n columnResizeMode: 'onChange',\n manualSorting: false,\n meta: {\n getWrapInExpandableTd: cell => cell.column.id === 'instructions',\n },\n })\n\n return {\n table,\n isLoading: isLoadingTasks || isLoadingProjectBundle,\n hasNextPage,\n fetchNextPage,\n isFetchingNextPage,\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;AAsBA,SAAS,EAAW,GAAkB;CACpC,IAAM,IAAe,GAAgC;AACrD,QAAO;EACL,EAAa,SAAS,iBAAiB;GACrC,SAAQ,MAAS,kBAAC,GAAD;IAAc,GAAI;IAAO,OAAO;IAAU,CAAA;GAC3D,OAAO,EAAE,QAAK,kBAEL,kBAAC,GAAD;IAAM,MAAM,EADF,EAAuB,EAAI,SAAS,KACd,CAAS;cAAG,GAAU;IAAQ,CAAA;GAEvE,eAAe;GACf,oBAAoB;GACrB,CAAC;EACF,EAAa,SAAS,qBAAqB;GACzC,SAAQ,MAAS,kBAAC,GAAD;IAAc,GAAI;IAAO,OAAO;IAAkB,CAAA;GACnE,OAAO,EAAE,kBAAe,kBAAC,KAAD,EAAA,UAAI,GAAU,EAAK,CAAA;GAC3C,eAAe;GACf,oBAAoB;GACrB,CAAC;EACF,EAAa,SAAS,4BAA4B;GAChD,SAAQ,MAAS,kBAAC,GAAD;IAAc,GAAI;IAAO,OAAO;IAAc,CAAA;GAC/D,OAAO,EAAE,aACP,kBAAC,GAAD;IACE,YAAY,EAAI;IACP;IACT,CAAA;GAEJ,eAAe;GACf,oBAAoB;GACrB,CAAC;EACF,EAAa,SAAS,mBAAmB;GACvC,SAAQ,MAAS,kBAAC,GAAD;IAAc,GAAI;IAAO,OAAO;IAAiB,CAAA;GAClE,OAAO,EAAE,kBAAe,EAAW,EAAM,GAAU,CAAC,CAAC;GACrD,eAAe;GACf,oBAAoB;GACrB,CAAC;EACF,EAAa,QAAQ;GACnB,IAAI;GACJ,SAAQ,MAAS,kBAAC,GAAD;IAAc,GAAI;IAAO,OAAO;IAAa,CAAA;GAC9D,OAAO,EAAE,aACP,kBAAC,GAAD;IACE,YAAY,EAAI;IACP;IACT,CAAA;GAEL,CAAC;EACH;;AAUH,SAAgB,EAAqB,GAAmC;CACtE,IAAM,EAAE,+BAA4B,GAE9B,EACJ,SACA,gBACA,kBACA,WAAW,GACX,0BACE,EAA4B,EAAwB,EAElD,EAAE,MAAM,GAAe,WAAW,MACtC,EACE,EAAwB,WACxB,KAAA,GACA,EAAE,oBAAoB,IAAM,EAC5B,EACE,SAAS,CAAC,CAAC,EAAwB,WACpC,CACF,EAEG,IAAe,GAAe,aAAa,WAAW;AAmB5D,QAAO;EACL,OAb+B,EAA0B;GACzD,MANY,QACN,GAAM,MAAM,SAAQ,MAAQ,EAAK,WAAY,IAAI,EAAE,EACzD,CAAC,EAAK,CAIA;GACN,SAAS,EAAW,EAAa;GACjC,WAAU,MAAO,OAAO,EAAI,KAAM,OAAQ;GAC1C,iBAAiB,GAAiB;GAClC,kBAAkB;GAClB,eAAe;GACf,MAAM,EACJ,wBAAuB,MAAQ,EAAK,OAAO,OAAO,gBACnD;GACF,CAGC;EACA,WAAW,KAAkB;EAC7B;EACA;EACA;EACD"}
1
+ {"version":3,"file":"useMetadataTaskTable.js","names":[],"sources":["../../../../../src/features/entity/metadata-task/hooks/useMetadataTaskTable.tsx"],"sourcesContent":["import ColumnHeader from '@/components/TanStackTable/ColumnHeader'\nimport { getGridSourceIdForTask } from '@/features/entity/metadata-task/utils/getGridSourceIdForTask'\nimport { useGetCurationTasksInfinite } from '@/synapse-queries/curation/task/useCurationTask'\nimport { useGetEntityBundle } from '@/synapse-queries/index'\nimport { formatDate } from '@/utils/functions/DateFormatter'\nimport { getLinkToEntityPage } from '@/utils/functions/getSynapseWebClientLink'\nimport { Link } from '@mui/material'\nimport {\n ListCurationTaskRequest,\n TaskBundle,\n} from '@sage-bionetworks/synapse-client'\nimport {\n createColumnHelper,\n getCoreRowModel,\n Table,\n useReactTable,\n} from '@tanstack/react-table'\nimport dayjs from 'dayjs'\nimport { useMemo } from 'react'\nimport MetadataTaskTableActionCell from '../components/MetadataTaskTableActionCell'\nimport MetadataTasksTableAssigneeCell from '../components/MetadataTasksTableAssigneeCell'\n\nfunction getColumns(canEdit: boolean) {\n const columnHelper = createColumnHelper<TaskBundle>()\n return [\n columnHelper.accessor('task.dataType', {\n header: props => <ColumnHeader {...props} title={'Task'} />,\n cell: ({ row, getValue }) => {\n const entityId = getGridSourceIdForTask(row.original.task!)\n return <Link href={getLinkToEntityPage(entityId)}>{getValue()}</Link>\n },\n enableSorting: false,\n enableColumnFilter: false,\n }),\n columnHelper.accessor('task.taskId', {\n header: props => <ColumnHeader {...props} title={'Task ID'} />,\n cell: ({ getValue }) => <p>{getValue()}</p>,\n enableSorting: false,\n enableColumnFilter: false,\n }),\n columnHelper.accessor('task.instructions', {\n header: props => <ColumnHeader {...props} title={'Instructions'} />,\n cell: ({ getValue }) => <p>{getValue()}</p>,\n enableSorting: false,\n enableColumnFilter: false,\n }),\n columnHelper.accessor('task.assigneePrincipalId', {\n header: props => <ColumnHeader {...props} title={'Assignee'} />,\n cell: ({ row }) => (\n <MetadataTasksTableAssigneeCell\n taskBundle={row.original}\n canEdit={canEdit}\n />\n ),\n enableSorting: false,\n enableColumnFilter: false,\n }),\n columnHelper.accessor('task.modifiedOn', {\n header: props => <ColumnHeader {...props} title={'Modified On'} />,\n cell: ({ getValue }) => formatDate(dayjs(getValue())),\n enableSorting: false,\n enableColumnFilter: false,\n }),\n columnHelper.display({\n id: 'actions',\n header: props => <ColumnHeader {...props} title={'Actions'} />,\n cell: ({ row }) => (\n <MetadataTaskTableActionCell\n taskBundle={row.original}\n canEdit={canEdit}\n />\n ),\n }),\n ]\n}\n\ntype UseMetadataTaskTableOptions = {\n listCurationTaskRequest: ListCurationTaskRequest\n}\n\n/**\n * Provides a table instance and loading states for displaying metadata curation tasks associated with a project.\n */\nexport function useMetadataTaskTable(opts: UseMetadataTaskTableOptions) {\n const { listCurationTaskRequest } = opts\n\n const {\n data,\n hasNextPage,\n fetchNextPage,\n isLoading: isLoadingTasks,\n isFetchingNextPage,\n } = useGetCurationTasksInfinite(listCurationTaskRequest)\n\n const { data: projectBundle, isLoading: isLoadingProjectBundle } =\n useGetEntityBundle(\n listCurationTaskRequest.projectId,\n undefined,\n { includePermissions: true },\n {\n enabled: !!listCurationTaskRequest.projectId,\n },\n )\n\n const canEditTasks = projectBundle?.permissions?.canEdit ?? false\n\n const tasks = useMemo(\n () => data?.pages.flatMap(page => page.bundlePage!) ?? [],\n [data],\n )\n\n const table: Table<TaskBundle> = useReactTable<TaskBundle>({\n data: tasks,\n columns: getColumns(canEditTasks),\n getRowId: row => String(row.task!.taskId!),\n getCoreRowModel: getCoreRowModel(),\n columnResizeMode: 'onChange',\n manualSorting: false,\n meta: {\n getWrapInExpandableTd: cell => cell.column.id === 'instructions',\n },\n })\n\n return {\n table,\n isLoading: isLoadingTasks || isLoadingProjectBundle,\n hasNextPage,\n fetchNextPage,\n isFetchingNextPage,\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;AAsBA,SAAS,EAAW,GAAkB;CACpC,IAAM,IAAe,GAAgC;AACrD,QAAO;EACL,EAAa,SAAS,iBAAiB;GACrC,SAAQ,MAAS,kBAAC,GAAD;IAAc,GAAI;IAAO,OAAO;IAAU,CAAA;GAC3D,OAAO,EAAE,QAAK,kBAEL,kBAAC,GAAD;IAAM,MAAM,EADF,EAAuB,EAAI,SAAS,KACd,CAAS;cAAG,GAAU;IAAQ,CAAA;GAEvE,eAAe;GACf,oBAAoB;GACrB,CAAC;EACF,EAAa,SAAS,eAAe;GACnC,SAAQ,MAAS,kBAAC,GAAD;IAAc,GAAI;IAAO,OAAO;IAAa,CAAA;GAC9D,OAAO,EAAE,kBAAe,kBAAC,KAAD,EAAA,UAAI,GAAU,EAAK,CAAA;GAC3C,eAAe;GACf,oBAAoB;GACrB,CAAC;EACF,EAAa,SAAS,qBAAqB;GACzC,SAAQ,MAAS,kBAAC,GAAD;IAAc,GAAI;IAAO,OAAO;IAAkB,CAAA;GACnE,OAAO,EAAE,kBAAe,kBAAC,KAAD,EAAA,UAAI,GAAU,EAAK,CAAA;GAC3C,eAAe;GACf,oBAAoB;GACrB,CAAC;EACF,EAAa,SAAS,4BAA4B;GAChD,SAAQ,MAAS,kBAAC,GAAD;IAAc,GAAI;IAAO,OAAO;IAAc,CAAA;GAC/D,OAAO,EAAE,aACP,kBAAC,GAAD;IACE,YAAY,EAAI;IACP;IACT,CAAA;GAEJ,eAAe;GACf,oBAAoB;GACrB,CAAC;EACF,EAAa,SAAS,mBAAmB;GACvC,SAAQ,MAAS,kBAAC,GAAD;IAAc,GAAI;IAAO,OAAO;IAAiB,CAAA;GAClE,OAAO,EAAE,kBAAe,EAAW,EAAM,GAAU,CAAC,CAAC;GACrD,eAAe;GACf,oBAAoB;GACrB,CAAC;EACF,EAAa,QAAQ;GACnB,IAAI;GACJ,SAAQ,MAAS,kBAAC,GAAD;IAAc,GAAI;IAAO,OAAO;IAAa,CAAA;GAC9D,OAAO,EAAE,aACP,kBAAC,GAAD;IACE,YAAY,EAAI;IACP;IACT,CAAA;GAEL,CAAC;EACH;;AAUH,SAAgB,EAAqB,GAAmC;CACtE,IAAM,EAAE,+BAA4B,GAE9B,EACJ,SACA,gBACA,kBACA,WAAW,GACX,0BACE,EAA4B,EAAwB,EAElD,EAAE,MAAM,GAAe,WAAW,MACtC,EACE,EAAwB,WACxB,KAAA,GACA,EAAE,oBAAoB,IAAM,EAC5B,EACE,SAAS,CAAC,CAAC,EAAwB,WACpC,CACF,EAEG,IAAe,GAAe,aAAa,WAAW;AAmB5D,QAAO;EACL,OAb+B,EAA0B;GACzD,MANY,QACN,GAAM,MAAM,SAAQ,MAAQ,EAAK,WAAY,IAAI,EAAE,EACzD,CAAC,EAAK,CAIA;GACN,SAAS,EAAW,EAAa;GACjC,WAAU,MAAO,OAAO,EAAI,KAAM,OAAQ;GAC1C,iBAAiB,GAAiB;GAClC,kBAAkB;GAClB,eAAe;GACf,MAAM,EACJ,wBAAuB,MAAQ,EAAK,OAAO,OAAO,gBACnD;GACF,CAGC;EACA,WAAW,KAAkB;EAC7B;EACA;EACA;EACD"}
@@ -1 +1 @@
1
- {"version":3,"file":"useOpenCuratorButton.d.ts","sourceRoot":"","sources":["../../../../../src/features/entity/metadata-task/hooks/useOpenCuratorButton.ts"],"names":[],"mappings":"AAGA,OAAO,EAGL,UAAU,EACX,MAAM,kCAAkC,CAAA;AAYzC,KAAK,kCAAkC,GAAG;IACxC,SAAS,EAAE,OAAO,CAAA;IAClB,SAAS,EAAE,OAAO,CAAA;IAClB,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,OAAO,EAAE,MAAM,IAAI,CAAA;CACpB,CAAA;AAOD,MAAM,CAAC,OAAO,UAAU,4BAA4B,CAClD,UAAU,EAAE,UAAU,GACrB,kCAAkC,CAwEpC"}
1
+ {"version":3,"file":"useOpenCuratorButton.d.ts","sourceRoot":"","sources":["../../../../../src/features/entity/metadata-task/hooks/useOpenCuratorButton.ts"],"names":[],"mappings":"AAGA,OAAO,EAGL,UAAU,EACX,MAAM,kCAAkC,CAAA;AAYzC,KAAK,kCAAkC,GAAG;IACxC,SAAS,EAAE,OAAO,CAAA;IAClB,SAAS,EAAE,OAAO,CAAA;IAClB,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,OAAO,EAAE,MAAM,IAAI,CAAA;CACpB,CAAA;AAOD,MAAM,CAAC,OAAO,UAAU,4BAA4B,CAClD,UAAU,EAAE,UAAU,GACrB,kCAAkC,CA2EpC"}
@@ -17,7 +17,7 @@ function f(e, t) {
17
17
  window.open(n, "_blank", "noopener");
18
18
  }
19
19
  function p(r) {
20
- let p = r.task, m = n(u.CURATOR_LINK_TASK_TO_GRID_SESSION), { mutateAsync: h, isPending: g } = c(), { mutateAsync: _, isPending: v } = s(), { data: y, isLoading: b } = t(o(p)), x = y?.canView, S = l(async () => {
20
+ let p = r.task, m = n(u.CURATOR_LINK_TASK_TO_GRID_SESSION) && !1, { mutateAsync: h, isPending: g } = c(), { mutateAsync: _, isPending: v } = s(), { data: y, isLoading: b } = t(o(p)), x = y?.canView, S = l(async () => {
21
21
  let t;
22
22
  try {
23
23
  t = m ? (await _(r)).gridSession : await h({ curationTask: p }), f(t.sessionId, p.taskId);
@@ -1 +1 @@
1
- {"version":3,"file":"useOpenCuratorButton.js","names":[],"sources":["../../../../../src/features/entity/metadata-task/hooks/useOpenCuratorButton.ts"],"sourcesContent":["import { displayToast } from '@/components'\nimport { useGetEntityPermissions } from '@/synapse-queries'\nimport { useGetFeatureFlag } from '@/synapse-queries/featureflags/useGetFeatureFlag'\nimport {\n GridSession,\n SynapseClientError,\n TaskBundle,\n} from '@sage-bionetworks/synapse-client'\nimport { FeatureFlagEnum } from '@sage-bionetworks/synapse-types'\nimport { useCallback } from 'react'\nimport {\n OPEN_CURATOR_ERROR_TITLE,\n OPEN_CURATOR_UNAUTHORIZED_ERROR_MESSAGE,\n} from '../utils/constants'\nimport { getGridSourceIdForTask } from '../utils/getGridSourceIdForTask'\nimport useGridSessionForCurationTask from './useGridSessionForCurationTask'\nimport useGridSessionForCurationTask_legacy from './useGridSessionForCurationTask_legacy'\nimport { getLinkToGridSession } from '@/utils/functions/getSynapseWebClientLink'\n\ntype UseOpenCuratorFromTaskButtonReturn = {\n isLoading: boolean\n isPending: boolean\n hasPermission?: boolean\n onClick: () => void\n}\n\nfunction openGridSessionInNewWindow(gridSessionId: string, taskId: number) {\n const gridUrl = getLinkToGridSession(gridSessionId, taskId)\n window.open(gridUrl, '_blank', 'noopener')\n}\n\nexport default function useOpenCuratorFromTaskButton(\n taskBundle: TaskBundle,\n): UseOpenCuratorFromTaskButtonReturn {\n const curationTask = taskBundle.task!\n\n const isTaskLinkedSessionFlagEnabled = useGetFeatureFlag(\n FeatureFlagEnum.CURATOR_LINK_TASK_TO_GRID_SESSION,\n )\n\n const {\n mutateAsync: getOrCreateLegacyGridSessionForUnassignedTask,\n isPending: legacyOpenGridIsPending,\n } = useGridSessionForCurationTask_legacy()\n\n const {\n mutateAsync: getOrCreateTaskLinkedGridSession,\n isPending: taskLinkedOpenGridIsPending,\n } = useGridSessionForCurationTask()\n\n const gridSourceEntityId = getGridSourceIdForTask(curationTask)\n const {\n data: sourceEntityPermissions,\n isLoading: isLoadingEntityPermissions,\n } = useGetEntityPermissions(gridSourceEntityId)\n\n const hasPermission = sourceEntityPermissions?.canView\n\n const openNewOrExistingCuratorSession = useCallback(async () => {\n let gridSession: GridSession\n try {\n if (isTaskLinkedSessionFlagEnabled) {\n const result = await getOrCreateTaskLinkedGridSession(taskBundle)\n gridSession = result.gridSession\n } else {\n gridSession = await getOrCreateLegacyGridSessionForUnassignedTask({\n curationTask,\n })\n }\n openGridSessionInNewWindow(gridSession.sessionId!, curationTask.taskId!)\n } catch (error) {\n if (error instanceof SynapseClientError && error.status === 403) {\n console.error(error)\n displayToast(OPEN_CURATOR_UNAUTHORIZED_ERROR_MESSAGE, 'danger', {\n title: OPEN_CURATOR_ERROR_TITLE,\n })\n } else {\n console.error('Error opening Curator for curation task', error)\n const errorMessage =\n error instanceof Error ? error.message : String(error)\n displayToast(errorMessage, 'danger', {\n title: OPEN_CURATOR_ERROR_TITLE,\n })\n }\n }\n }, [\n curationTask,\n taskBundle,\n isTaskLinkedSessionFlagEnabled,\n getOrCreateLegacyGridSessionForUnassignedTask,\n getOrCreateTaskLinkedGridSession,\n ])\n\n const handleClickOpenCurator = useCallback(() => {\n void openNewOrExistingCuratorSession()\n }, [openNewOrExistingCuratorSession])\n\n return {\n hasPermission,\n isLoading: isLoadingEntityPermissions,\n isPending: isTaskLinkedSessionFlagEnabled\n ? taskLinkedOpenGridIsPending\n : legacyOpenGridIsPending,\n onClick: handleClickOpenCurator,\n }\n}\n"],"mappings":";;;;;;;;;;;;;;AA0BA,SAAS,EAA2B,GAAuB,GAAgB;CACzE,IAAM,IAAU,EAAqB,GAAe,EAAO;AAC3D,QAAO,KAAK,GAAS,UAAU,WAAW;;AAG5C,SAAwB,EACtB,GACoC;CACpC,IAAM,IAAe,EAAW,MAE1B,IAAiC,EACrC,EAAgB,kCACjB,EAEK,EACJ,aAAa,GACb,WAAW,MACT,GAAsC,EAEpC,EACJ,aAAa,GACb,WAAW,MACT,GAA+B,EAG7B,EACJ,MAAM,GACN,WAAW,MACT,EAJuB,EAAuB,EAItB,CAAmB,EAEzC,IAAgB,GAAyB,SAEzC,IAAkC,EAAY,YAAY;EAC9D,IAAI;AACJ,MAAI;AASF,GARA,AAIE,IAJE,KAEY,MADO,EAAiC,EAAW,EAC5C,cAEP,MAAM,EAA8C,EAChE,iBACD,CAAC,EAEJ,EAA2B,EAAY,WAAY,EAAa,OAAQ;WACjE,GAAO;AACd,GAAI,aAAiB,KAAsB,EAAM,WAAW,OAC1D,QAAQ,MAAM,EAAM,EACpB,EAAa,GAAyC,UAAU,EAC9D,OAAO,GACR,CAAC,KAEF,QAAQ,MAAM,2CAA2C,EAAM,EAG/D,EADE,aAAiB,QAAQ,EAAM,UAAU,OAAO,EAAM,EAC7B,UAAU,EACnC,OAAO,GACR,CAAC;;IAGL;EACD;EACA;EACA;EACA;EACA;EACD,CAAC,EAEI,IAAyB,QAAkB;AAC1C,KAAiC;IACrC,CAAC,EAAgC,CAAC;AAErC,QAAO;EACL;EACA,WAAW;EACX,WAAW,IACP,IACA;EACJ,SAAS;EACV"}
1
+ {"version":3,"file":"useOpenCuratorButton.js","names":[],"sources":["../../../../../src/features/entity/metadata-task/hooks/useOpenCuratorButton.ts"],"sourcesContent":["import { displayToast } from '@/components'\nimport { useGetEntityPermissions } from '@/synapse-queries'\nimport { useGetFeatureFlag } from '@/synapse-queries/featureflags/useGetFeatureFlag'\nimport {\n GridSession,\n SynapseClientError,\n TaskBundle,\n} from '@sage-bionetworks/synapse-client'\nimport { FeatureFlagEnum } from '@sage-bionetworks/synapse-types'\nimport { useCallback } from 'react'\nimport {\n OPEN_CURATOR_ERROR_TITLE,\n OPEN_CURATOR_UNAUTHORIZED_ERROR_MESSAGE,\n} from '../utils/constants'\nimport { getGridSourceIdForTask } from '../utils/getGridSourceIdForTask'\nimport useGridSessionForCurationTask from './useGridSessionForCurationTask'\nimport useGridSessionForCurationTask_legacy from './useGridSessionForCurationTask_legacy'\nimport { getLinkToGridSession } from '@/utils/functions/getSynapseWebClientLink'\n\ntype UseOpenCuratorFromTaskButtonReturn = {\n isLoading: boolean\n isPending: boolean\n hasPermission?: boolean\n onClick: () => void\n}\n\nfunction openGridSessionInNewWindow(gridSessionId: string, taskId: number) {\n const gridUrl = getLinkToGridSession(gridSessionId, taskId)\n window.open(gridUrl, '_blank', 'noopener')\n}\n\nexport default function useOpenCuratorFromTaskButton(\n taskBundle: TaskBundle,\n): UseOpenCuratorFromTaskButtonReturn {\n const curationTask = taskBundle.task!\n\n const isTaskLinkedSessionFlagEnabled =\n useGetFeatureFlag(FeatureFlagEnum.CURATOR_LINK_TASK_TO_GRID_SESSION) &&\n false // SWC-7835 - temporarily disable this feature flag\n // We want to add an opt-in (PLFM-9686)\n // Also the feature flag does not work because we did not bump synapse-client after adding the flag\n // FeatureFlagEnum['CURATOR_LINK_TASK_TO_GRID_SESSION'] in the old version of synapse-client returns `undefined`.\n\n const {\n mutateAsync: getOrCreateLegacyGridSessionForUnassignedTask,\n isPending: legacyOpenGridIsPending,\n } = useGridSessionForCurationTask_legacy()\n\n const {\n mutateAsync: getOrCreateTaskLinkedGridSession,\n isPending: taskLinkedOpenGridIsPending,\n } = useGridSessionForCurationTask()\n\n const gridSourceEntityId = getGridSourceIdForTask(curationTask)\n const {\n data: sourceEntityPermissions,\n isLoading: isLoadingEntityPermissions,\n } = useGetEntityPermissions(gridSourceEntityId)\n\n const hasPermission = sourceEntityPermissions?.canView\n\n const openNewOrExistingCuratorSession = useCallback(async () => {\n let gridSession: GridSession\n try {\n if (isTaskLinkedSessionFlagEnabled) {\n const result = await getOrCreateTaskLinkedGridSession(taskBundle)\n gridSession = result.gridSession\n } else {\n gridSession = await getOrCreateLegacyGridSessionForUnassignedTask({\n curationTask,\n })\n }\n openGridSessionInNewWindow(gridSession.sessionId!, curationTask.taskId!)\n } catch (error) {\n if (error instanceof SynapseClientError && error.status === 403) {\n console.error(error)\n displayToast(OPEN_CURATOR_UNAUTHORIZED_ERROR_MESSAGE, 'danger', {\n title: OPEN_CURATOR_ERROR_TITLE,\n })\n } else {\n console.error('Error opening Curator for curation task', error)\n const errorMessage =\n error instanceof Error ? error.message : String(error)\n displayToast(errorMessage, 'danger', {\n title: OPEN_CURATOR_ERROR_TITLE,\n })\n }\n }\n }, [\n curationTask,\n taskBundle,\n isTaskLinkedSessionFlagEnabled,\n getOrCreateLegacyGridSessionForUnassignedTask,\n getOrCreateTaskLinkedGridSession,\n ])\n\n const handleClickOpenCurator = useCallback(() => {\n void openNewOrExistingCuratorSession()\n }, [openNewOrExistingCuratorSession])\n\n return {\n hasPermission,\n isLoading: isLoadingEntityPermissions,\n isPending: isTaskLinkedSessionFlagEnabled\n ? taskLinkedOpenGridIsPending\n : legacyOpenGridIsPending,\n onClick: handleClickOpenCurator,\n }\n}\n"],"mappings":";;;;;;;;;;;;;;AA0BA,SAAS,EAA2B,GAAuB,GAAgB;CACzE,IAAM,IAAU,EAAqB,GAAe,EAAO;AAC3D,QAAO,KAAK,GAAS,UAAU,WAAW;;AAG5C,SAAwB,EACtB,GACoC;CACpC,IAAM,IAAe,EAAW,MAE1B,IACJ,EAAkB,EAAgB,kCAAkC,IACpE,IAKI,EACJ,aAAa,GACb,WAAW,MACT,GAAsC,EAEpC,EACJ,aAAa,GACb,WAAW,MACT,GAA+B,EAG7B,EACJ,MAAM,GACN,WAAW,MACT,EAJuB,EAAuB,EAItB,CAAmB,EAEzC,IAAgB,GAAyB,SAEzC,IAAkC,EAAY,YAAY;EAC9D,IAAI;AACJ,MAAI;AASF,GARA,AAIE,IAJE,KAEY,MADO,EAAiC,EAAW,EAC5C,cAEP,MAAM,EAA8C,EAChE,iBACD,CAAC,EAEJ,EAA2B,EAAY,WAAY,EAAa,OAAQ;WACjE,GAAO;AACd,GAAI,aAAiB,KAAsB,EAAM,WAAW,OAC1D,QAAQ,MAAM,EAAM,EACpB,EAAa,GAAyC,UAAU,EAC9D,OAAO,GACR,CAAC,KAEF,QAAQ,MAAM,2CAA2C,EAAM,EAG/D,EADE,aAAiB,QAAQ,EAAM,UAAU,OAAO,EAAM,EAC7B,UAAU,EACnC,OAAO,GACR,CAAC;;IAGL;EACD;EACA;EACA;EACA;EACA;EACD,CAAC,EAEI,IAAyB,QAAkB;AAC1C,KAAiC;IACrC,CAAC,EAAgC,CAAC;AAErC,QAAO;EACL;EACA,WAAW;EACX,WAAW,IACP,IACA;EACJ,SAAS;EACV"}
@@ -46,6 +46,10 @@
46
46
  margin: auto;
47
47
  }
48
48
 
49
+ &--locked {
50
+ padding: 5px 10px 5px 10px;
51
+ }
52
+
49
53
  &__btnRemove {
50
54
  color: var(--synapse-gray-900);
51
55
  border-radius: 100%;