synapse-react-client 4.0.6 → 4.0.7

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 (119) hide show
  1. package/dist/SWC.index.js +1 -1
  2. package/dist/components/CardDeck/TableQueryCardDeck.js +3 -4
  3. package/dist/components/CardDeck/TableQueryCardDeck.js.map +1 -1
  4. package/dist/components/ChangePassword/useChangePasswordFormState.js +2 -3
  5. package/dist/components/ChangePassword/useChangePasswordFormState.js.map +1 -1
  6. package/dist/components/ColoredBulletListItem/ColoredBulletListItem.css +1 -0
  7. package/dist/components/ColoredBulletListItem/ColoredBulletListItem.d.ts +8 -0
  8. package/dist/components/ColoredBulletListItem/ColoredBulletListItem.d.ts.map +1 -0
  9. package/dist/components/ColoredBulletListItem/ColoredBulletListItem.js +21 -0
  10. package/dist/components/ColoredBulletListItem/ColoredBulletListItem.js.map +1 -0
  11. package/dist/components/ColoredBulletListItem/ColoredBulletListItem.module.scss +32 -0
  12. package/dist/components/ColoredBulletListItem/ColoredBulletListItem.module.scss.js +14 -0
  13. package/dist/components/ColoredBulletListItem/ColoredBulletListItem.module.scss.js.map +1 -0
  14. package/dist/components/ColoredBulletListItem/index.d.ts +5 -0
  15. package/dist/components/ColoredBulletListItem/index.d.ts.map +1 -0
  16. package/dist/components/ColoredBulletListItem/index.js +6 -0
  17. package/dist/components/ColoredBulletListItem/index.js.map +1 -0
  18. package/dist/components/CreateOrUpdateAccessRequirementWizard/CreateOrUpdateAccessRequirementWizard.js +3 -4
  19. package/dist/components/CreateOrUpdateAccessRequirementWizard/CreateOrUpdateAccessRequirementWizard.js.map +1 -1
  20. package/dist/components/CreateProjectModal/CreateProjectModal.d.ts.map +1 -1
  21. package/dist/components/CreateProjectModal/CreateProjectModal.js +120 -46
  22. package/dist/components/CreateProjectModal/CreateProjectModal.js.map +1 -1
  23. package/dist/components/CreateProjectModal/ProjectVisibilityRadioGroup.d.ts +7 -0
  24. package/dist/components/CreateProjectModal/ProjectVisibilityRadioGroup.d.ts.map +1 -0
  25. package/dist/components/CreateProjectModal/ProjectVisibilityRadioGroup.js +132 -0
  26. package/dist/components/CreateProjectModal/ProjectVisibilityRadioGroup.js.map +1 -0
  27. package/dist/components/DataGrid/DataGrid.d.ts +2 -0
  28. package/dist/components/DataGrid/DataGrid.d.ts.map +1 -1
  29. package/dist/components/DataGrid/DataGrid.js +69 -67
  30. package/dist/components/DataGrid/DataGrid.js.map +1 -1
  31. package/dist/components/DataGrid/MergeGridWithSourceTableButton.js +2 -3
  32. package/dist/components/DataGrid/MergeGridWithSourceTableButton.js.map +1 -1
  33. package/dist/components/DataGrid/SynapseGrid.d.ts.map +1 -1
  34. package/dist/components/DataGrid/SynapseGrid.js +117 -111
  35. package/dist/components/DataGrid/SynapseGrid.js.map +1 -1
  36. package/dist/components/DataGrid/components/UploadCsvToGridDialog.js +2 -3
  37. package/dist/components/DataGrid/components/UploadCsvToGridDialog.js.map +1 -1
  38. package/dist/components/DataGrid/hooks/useRemoteSelections.d.ts +16 -0
  39. package/dist/components/DataGrid/hooks/useRemoteSelections.d.ts.map +1 -0
  40. package/dist/components/DataGrid/hooks/useRemoteSelections.js +30 -0
  41. package/dist/components/DataGrid/hooks/useRemoteSelections.js.map +1 -0
  42. package/dist/components/DataGrid/utils/getCellClassName.d.ts +3 -0
  43. package/dist/components/DataGrid/utils/getCellClassName.d.ts.map +1 -1
  44. package/dist/components/DataGrid/utils/getCellClassName.js +21 -12
  45. package/dist/components/DataGrid/utils/getCellClassName.js.map +1 -1
  46. package/dist/components/DataGrid/utils/replicaSelectionToGridSelection.d.ts +15 -0
  47. package/dist/components/DataGrid/utils/replicaSelectionToGridSelection.d.ts.map +1 -0
  48. package/dist/components/DataGrid/utils/replicaSelectionToGridSelection.js +43 -0
  49. package/dist/components/DataGrid/utils/replicaSelectionToGridSelection.js.map +1 -0
  50. package/dist/components/DialogBase.d.ts +3 -1
  51. package/dist/components/DialogBase.d.ts.map +1 -1
  52. package/dist/components/DialogBase.js +75 -56
  53. package/dist/components/DialogBase.js.map +1 -1
  54. package/dist/components/Ecosystem/EcosystemSkeleton.js +2 -3
  55. package/dist/components/Ecosystem/EcosystemSkeleton.js.map +1 -1
  56. package/dist/components/FeaturedDataTabs/FacetPlotsCard.js +2 -3
  57. package/dist/components/FeaturedDataTabs/FacetPlotsCard.js.map +1 -1
  58. package/dist/components/FeaturedDataTabs/FeaturedDataTabs.js +2 -3
  59. package/dist/components/FeaturedDataTabs/FeaturedDataTabs.js.map +1 -1
  60. package/dist/components/GenericCard/GenericCard.js +3 -4
  61. package/dist/components/GenericCard/GenericCard.js.map +1 -1
  62. package/dist/components/HeaderCard.js +2 -3
  63. package/dist/components/HeaderCard.js.map +1 -1
  64. package/dist/components/IconSvg/IconSvg.d.ts +1 -1
  65. package/dist/components/IconSvg/IconSvg.d.ts.map +1 -1
  66. package/dist/components/IconSvg/IconSvg.js +168 -165
  67. package/dist/components/IconSvg/IconSvg.js.map +1 -1
  68. package/dist/components/StorybookComponentWrapper.js +3 -4
  69. package/dist/components/StorybookComponentWrapper.js.map +1 -1
  70. package/dist/components/SynapseForm/SynapseFormSubmissionGrid.d.ts +1 -0
  71. package/dist/components/SynapseForm/SynapseFormSubmissionGrid.d.ts.map +1 -1
  72. package/dist/components/SynapseForm/SynapseFormSubmissionGrid.js +23 -16
  73. package/dist/components/SynapseForm/SynapseFormSubmissionGrid.js.map +1 -1
  74. package/dist/components/TextField/TextField.css +1 -1
  75. package/dist/components/TextField/TextField.d.ts +1 -0
  76. package/dist/components/TextField/TextField.d.ts.map +1 -1
  77. package/dist/components/TextField/TextField.js +32 -20
  78. package/dist/components/TextField/TextField.js.map +1 -1
  79. package/dist/components/TextField/TextField.module.scss +7 -0
  80. package/dist/components/TextField/TextField.module.scss.js +5 -3
  81. package/dist/components/TextField/TextField.module.scss.js.map +1 -1
  82. package/dist/components/download_list/AddToDownloadListConfirmationAlert/AddToDownloadListConfirmationAlert.js +2 -3
  83. package/dist/components/download_list/AddToDownloadListConfirmationAlert/AddToDownloadListConfirmationAlert.js.map +1 -1
  84. package/dist/components/index.d.ts +1 -0
  85. package/dist/components/index.d.ts.map +1 -1
  86. package/dist/components/index.js +242 -240
  87. package/dist/components/index.js.map +1 -1
  88. package/dist/components/styled/StyledFormControl.js +1 -1
  89. package/dist/components/styled/StyledFormControl.js.map +1 -1
  90. package/dist/components/table/CsvPreview/CsvPreview.js +2 -3
  91. package/dist/components/table/CsvPreview/CsvPreview.js.map +1 -1
  92. package/dist/components/table/CsvPreview/CsvPreviewDialog.js +2 -3
  93. package/dist/components/table/CsvPreview/CsvPreviewDialog.js.map +1 -1
  94. package/dist/features/curator/GridPage/GridPage.js +2 -3
  95. package/dist/features/curator/GridPage/GridPage.js.map +1 -1
  96. package/dist/features/curator/GridPage/components/GridPageTitle.js +2 -3
  97. package/dist/features/curator/GridPage/components/GridPageTitle.js.map +1 -1
  98. package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.d.ts.map +1 -1
  99. package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.js +49 -180
  100. package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.js.map +1 -1
  101. package/dist/features/entity/metadata-task/components/MetadataTasksTableAssigneeCell.js +2 -3
  102. package/dist/features/entity/metadata-task/components/MetadataTasksTableAssigneeCell.js.map +1 -1
  103. package/dist/index.js +306 -304
  104. package/dist/index.js.map +1 -1
  105. package/dist/style/components/_data-grid-extra.css +1 -1
  106. package/dist/style/components/_data-grid-extra.scss +16 -0
  107. package/dist/synapse-client/SynapseClient.d.ts +1 -1
  108. package/dist/synapse-client/SynapseClient.d.ts.map +1 -1
  109. package/dist/synapse-client/SynapseClient.js +3 -2
  110. package/dist/synapse-client/SynapseClient.js.map +1 -1
  111. package/dist/theme/palette/Palettes.d.ts +2 -0
  112. package/dist/theme/palette/Palettes.d.ts.map +1 -1
  113. package/dist/theme/palette/Palettes.js +46 -40
  114. package/dist/theme/palette/Palettes.js.map +1 -1
  115. package/dist/tsconfig.build.tsbuildinfo +1 -1
  116. package/package.json +3 -3
  117. package/dist/assets/ArcusBioIcon.svg +0 -1
  118. package/dist/assets/ArcusBioIcon.svg.js +0 -7
  119. package/dist/assets/ArcusBioIcon.svg.js.map +0 -1
@@ -48,7 +48,6 @@ import "../../../assets/icons/account-validated.svg.js";
48
48
  import "../../../utils/functions/DateFormatter.js";
49
49
  import "@react-hookz/web";
50
50
  import "dayjs";
51
- import "../../../assets/ArcusBioIcon.svg.js";
52
51
  import "@mui/material/SvgIcon";
53
52
  import "../../../assets/icons/AccessPending.svg.js";
54
53
  import "../../../assets/icons/AccessPendingCloud.svg.js";
@@ -224,7 +223,7 @@ import E from "@mui/material/AccordionDetails";
224
223
  import M from "@mui/material/AccordionSummary";
225
224
  import a from "@mui/material/Button";
226
225
  import j from "@mui/material/Stack";
227
- function _i(u) {
226
+ function Zi(u) {
228
227
  const { open: C, onClose: l, onConfirm: v, confirmIsPending: h, errorMessage: s } = u, [i, g] = t(
229
228
  0
230
229
  /* UPLOAD_CSV */
@@ -332,6 +331,6 @@ function _i(u) {
332
331
  );
333
332
  }
334
333
  export {
335
- _i as default
334
+ Zi as default
336
335
  };
337
336
  //# sourceMappingURL=CsvPreviewDialog.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CsvPreviewDialog.js","sources":["../../../../src/components/table/CsvPreview/CsvPreviewDialog.tsx"],"sourcesContent":["import { DialogBase } from '@/components/DialogBase'\nimport {\n BasicFileHandleUpload,\n FileUploadHandle,\n} from '@/components/file/upload/BasicFileHandleUpload'\nimport { ErrorBanner } from '@/components/index'\nimport CsvPreview from '@/components/table/CsvPreview/CsvPreview'\nimport CsvTableDescriptorForm, {\n CsvTableDescriptorFormHandle,\n} from '@/components/table/CsvTableDescriptorForm/CsvTableDescriptorForm'\nimport { RefreshTwoTone } from '@mui/icons-material'\nimport ExpandMoreIcon from '@mui/icons-material/ExpandMore'\nimport Accordion from '@mui/material/Accordion'\nimport AccordionDetails from '@mui/material/AccordionDetails'\nimport AccordionSummary from '@mui/material/AccordionSummary'\nimport Button from '@mui/material/Button'\nimport Stack from '@mui/material/Stack'\nimport Typography from '@mui/material/Typography'\nimport {\n ColumnModel,\n CsvTableDescriptor,\n UploadToTablePreviewResult,\n} from '@sage-bionetworks/synapse-client'\nimport { useCallback, useRef, useState } from 'react'\n\nenum CsvPreviewDialogStep {\n UPLOAD_CSV = 0,\n COLUMN_PREVIEW = 1,\n}\n\nexport type CsvPreviewDialogProps = {\n /** Whether the dialog is open */\n open: boolean\n /** Callback when the dialog is closed */\n onClose: () => void\n /** Callback when the user confirms the column models\n * @param dataFileHandleId - The file handle ID of the uploaded CSV\n * @param columnModels - The confirmed column models\n * */\n onConfirm: (\n dataFileHandleId: string,\n columnModels: ColumnModel[],\n csvTableDescriptor: CsvTableDescriptor,\n ) => void\n /** Whether the confirm action is pending */\n confirmIsPending?: boolean\n /** An optional error message to display */\n errorMessage?: string\n}\n\nexport default function CsvPreviewDialog(props: CsvPreviewDialogProps) {\n const { open, onClose, onConfirm, confirmIsPending, errorMessage } = props\n const [step, setStep] = useState(CsvPreviewDialogStep.UPLOAD_CSV)\n const [csvTableDescriptor, setCsvTableDescriptor] =\n useState<CsvTableDescriptor>({\n separator: ',',\n quoteCharacter: '\"',\n escapeCharacter: '\\\\',\n lineEnd: '\\n',\n isFirstLineHeader: true,\n })\n const [csvPreviewData, setCsvPreviewData] =\n useState<UploadToTablePreviewResult | null>(null)\n const [isLoadingPreview, setIsLoadingPreview] = useState(false)\n\n const [uploadedFileHandleId, setUploadedFileHandleId] = useState<\n string | null\n >(null)\n\n const onFileUploaded = useCallback((fileHandleId: string) => {\n setUploadedFileHandleId(fileHandleId)\n setStep(CsvPreviewDialogStep.COLUMN_PREVIEW)\n }, [])\n\n const uploadRef = useRef<FileUploadHandle | null>(null)\n const csvDescriptorFormRef = useRef<CsvTableDescriptorFormHandle | null>(null)\n\n const uploadStepContent = (\n <BasicFileHandleUpload\n ref={uploadRef}\n allowMultipleUpload={false}\n onFileUploadComplete={fileHandleId => {\n onFileUploaded(fileHandleId)\n }}\n disableDragAndDrop={true}\n />\n )\n\n const previewStepContent = (\n <Stack spacing={2}>\n {uploadedFileHandleId && (\n <CsvPreview\n fileHandleId={uploadedFileHandleId}\n csvTableDescriptor={csvTableDescriptor}\n onCsvPreviewDataChange={setCsvPreviewData}\n onIsLoadingChange={setIsLoadingPreview}\n />\n )}\n <Accordion>\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <Typography variant={'headline3'}>Show Options</Typography>\n </AccordionSummary>\n <AccordionDetails>\n <CsvTableDescriptorForm\n defaultValue={csvTableDescriptor}\n ref={csvDescriptorFormRef}\n />\n <Button\n variant={'outlined'}\n startIcon={<RefreshTwoTone />}\n sx={{ mt: 2 }}\n onClick={() => {\n // Get the state from the form and update local state, which will re-render the preview\n if (csvDescriptorFormRef.current) {\n setCsvTableDescriptor(\n csvDescriptorFormRef.current.getFormData(),\n )\n }\n }}\n >\n Refresh Preview\n </Button>\n </AccordionDetails>\n </Accordion>\n </Stack>\n )\n\n return (\n <DialogBase\n maxWidth={'lg'}\n title={'Upload CSV'}\n onCancel={onClose}\n open={open}\n content={\n <>\n {step === CsvPreviewDialogStep.UPLOAD_CSV && uploadStepContent}\n {step === CsvPreviewDialogStep.COLUMN_PREVIEW && previewStepContent}\n {errorMessage && <ErrorBanner error={errorMessage} />}\n </>\n }\n actions={\n <>\n <Button\n variant={'outlined'}\n disabled={isLoadingPreview}\n onClick={() => {\n onClose()\n }}\n >\n Cancel\n </Button>\n {step === CsvPreviewDialogStep.COLUMN_PREVIEW && (\n <Button\n disabled={isLoadingPreview}\n variant={'contained'}\n onClick={() => {\n onConfirm(\n uploadedFileHandleId!,\n csvPreviewData!.suggestedColumns!,\n csvTableDescriptor,\n )\n }}\n loading={confirmIsPending}\n >\n Confirm\n </Button>\n )}\n </>\n }\n />\n )\n}\n"],"names":["CsvPreviewDialog","props","open","onClose","onConfirm","confirmIsPending","errorMessage","step","setStep","useState","csvTableDescriptor","setCsvTableDescriptor","csvPreviewData","setCsvPreviewData","isLoadingPreview","setIsLoadingPreview","uploadedFileHandleId","setUploadedFileHandleId","onFileUploaded","useCallback","fileHandleId","uploadRef","useRef","csvDescriptorFormRef","jsx","DialogBase","jsxs","Fragment","BasicFileHandleUpload","Stack","CsvPreview","Accordion","AccordionSummary","ExpandMoreIcon","Typography","AccordionDetails","CsvTableDescriptorForm","Button","RefreshTwoTone","ErrorBanner"],"mappings":"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"}
1
+ {"version":3,"file":"CsvPreviewDialog.js","sources":["../../../../src/components/table/CsvPreview/CsvPreviewDialog.tsx"],"sourcesContent":["import { DialogBase } from '@/components/DialogBase'\nimport {\n BasicFileHandleUpload,\n FileUploadHandle,\n} from '@/components/file/upload/BasicFileHandleUpload'\nimport { ErrorBanner } from '@/components/index'\nimport CsvPreview from '@/components/table/CsvPreview/CsvPreview'\nimport CsvTableDescriptorForm, {\n CsvTableDescriptorFormHandle,\n} from '@/components/table/CsvTableDescriptorForm/CsvTableDescriptorForm'\nimport { RefreshTwoTone } from '@mui/icons-material'\nimport ExpandMoreIcon from '@mui/icons-material/ExpandMore'\nimport Accordion from '@mui/material/Accordion'\nimport AccordionDetails from '@mui/material/AccordionDetails'\nimport AccordionSummary from '@mui/material/AccordionSummary'\nimport Button from '@mui/material/Button'\nimport Stack from '@mui/material/Stack'\nimport Typography from '@mui/material/Typography'\nimport {\n ColumnModel,\n CsvTableDescriptor,\n UploadToTablePreviewResult,\n} from '@sage-bionetworks/synapse-client'\nimport { useCallback, useRef, useState } from 'react'\n\nenum CsvPreviewDialogStep {\n UPLOAD_CSV = 0,\n COLUMN_PREVIEW = 1,\n}\n\nexport type CsvPreviewDialogProps = {\n /** Whether the dialog is open */\n open: boolean\n /** Callback when the dialog is closed */\n onClose: () => void\n /** Callback when the user confirms the column models\n * @param dataFileHandleId - The file handle ID of the uploaded CSV\n * @param columnModels - The confirmed column models\n * */\n onConfirm: (\n dataFileHandleId: string,\n columnModels: ColumnModel[],\n csvTableDescriptor: CsvTableDescriptor,\n ) => void\n /** Whether the confirm action is pending */\n confirmIsPending?: boolean\n /** An optional error message to display */\n errorMessage?: string\n}\n\nexport default function CsvPreviewDialog(props: CsvPreviewDialogProps) {\n const { open, onClose, onConfirm, confirmIsPending, errorMessage } = props\n const [step, setStep] = useState(CsvPreviewDialogStep.UPLOAD_CSV)\n const [csvTableDescriptor, setCsvTableDescriptor] =\n useState<CsvTableDescriptor>({\n separator: ',',\n quoteCharacter: '\"',\n escapeCharacter: '\\\\',\n lineEnd: '\\n',\n isFirstLineHeader: true,\n })\n const [csvPreviewData, setCsvPreviewData] =\n useState<UploadToTablePreviewResult | null>(null)\n const [isLoadingPreview, setIsLoadingPreview] = useState(false)\n\n const [uploadedFileHandleId, setUploadedFileHandleId] = useState<\n string | null\n >(null)\n\n const onFileUploaded = useCallback((fileHandleId: string) => {\n setUploadedFileHandleId(fileHandleId)\n setStep(CsvPreviewDialogStep.COLUMN_PREVIEW)\n }, [])\n\n const uploadRef = useRef<FileUploadHandle | null>(null)\n const csvDescriptorFormRef = useRef<CsvTableDescriptorFormHandle | null>(null)\n\n const uploadStepContent = (\n <BasicFileHandleUpload\n ref={uploadRef}\n allowMultipleUpload={false}\n onFileUploadComplete={fileHandleId => {\n onFileUploaded(fileHandleId)\n }}\n disableDragAndDrop={true}\n />\n )\n\n const previewStepContent = (\n <Stack spacing={2}>\n {uploadedFileHandleId && (\n <CsvPreview\n fileHandleId={uploadedFileHandleId}\n csvTableDescriptor={csvTableDescriptor}\n onCsvPreviewDataChange={setCsvPreviewData}\n onIsLoadingChange={setIsLoadingPreview}\n />\n )}\n <Accordion>\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <Typography variant={'headline3'}>Show Options</Typography>\n </AccordionSummary>\n <AccordionDetails>\n <CsvTableDescriptorForm\n defaultValue={csvTableDescriptor}\n ref={csvDescriptorFormRef}\n />\n <Button\n variant={'outlined'}\n startIcon={<RefreshTwoTone />}\n sx={{ mt: 2 }}\n onClick={() => {\n // Get the state from the form and update local state, which will re-render the preview\n if (csvDescriptorFormRef.current) {\n setCsvTableDescriptor(\n csvDescriptorFormRef.current.getFormData(),\n )\n }\n }}\n >\n Refresh Preview\n </Button>\n </AccordionDetails>\n </Accordion>\n </Stack>\n )\n\n return (\n <DialogBase\n maxWidth={'lg'}\n title={'Upload CSV'}\n onCancel={onClose}\n open={open}\n content={\n <>\n {step === CsvPreviewDialogStep.UPLOAD_CSV && uploadStepContent}\n {step === CsvPreviewDialogStep.COLUMN_PREVIEW && previewStepContent}\n {errorMessage && <ErrorBanner error={errorMessage} />}\n </>\n }\n actions={\n <>\n <Button\n variant={'outlined'}\n disabled={isLoadingPreview}\n onClick={() => {\n onClose()\n }}\n >\n Cancel\n </Button>\n {step === CsvPreviewDialogStep.COLUMN_PREVIEW && (\n <Button\n disabled={isLoadingPreview}\n variant={'contained'}\n onClick={() => {\n onConfirm(\n uploadedFileHandleId!,\n csvPreviewData!.suggestedColumns!,\n csvTableDescriptor,\n )\n }}\n loading={confirmIsPending}\n >\n Confirm\n </Button>\n )}\n </>\n }\n />\n )\n}\n"],"names":["CsvPreviewDialog","props","open","onClose","onConfirm","confirmIsPending","errorMessage","step","setStep","useState","csvTableDescriptor","setCsvTableDescriptor","csvPreviewData","setCsvPreviewData","isLoadingPreview","setIsLoadingPreview","uploadedFileHandleId","setUploadedFileHandleId","onFileUploaded","useCallback","fileHandleId","uploadRef","useRef","csvDescriptorFormRef","jsx","DialogBase","jsxs","Fragment","BasicFileHandleUpload","Stack","CsvPreview","Accordion","AccordionSummary","ExpandMoreIcon","Typography","AccordionDetails","CsvTableDescriptorForm","Button","RefreshTwoTone","ErrorBanner"],"mappings":"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"}
@@ -50,7 +50,6 @@ import "../../../assets/icons/account-validated.svg.js";
50
50
  import "../../../utils/functions/DateFormatter.js";
51
51
  import "@react-hookz/web";
52
52
  import "dayjs";
53
- import "../../../assets/ArcusBioIcon.svg.js";
54
53
  import "@mui/material/SvgIcon";
55
54
  import "../../../assets/icons/AccessPending.svg.js";
56
55
  import "../../../assets/icons/AccessPendingCloud.svg.js";
@@ -236,10 +235,10 @@ function G() {
236
235
  ) })
237
236
  ] }) : /* @__PURE__ */ r(R, { error: "Missing sessionId" });
238
237
  }
239
- function Si(t) {
238
+ function ui(t) {
240
239
  return /* @__PURE__ */ r(c, { ...t, children: /* @__PURE__ */ r(G, {}) });
241
240
  }
242
241
  export {
243
- Si as default
242
+ ui as default
244
243
  };
245
244
  //# sourceMappingURL=GridPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"GridPage.js","sources":["../../../../src/features/curator/GridPage/GridPage.tsx"],"sourcesContent":["import SynapseGrid from '@/components/DataGrid/index'\nimport { ErrorBanner } from '@/components/index'\nimport GridPageRouter, {\n GridPageRouterProps,\n} from '@/features/curator/GridPage/components/GridPageRouter'\nimport GridPageTitle from '@/features/curator/GridPage/components/GridPageTitle'\nimport {\n GRID_PAGE_SESSION_ID_QUERY_PARAM,\n GRID_PAGE_AGENT_REGISTRATION_ID_QUERY_PARAM,\n GRID_PAGE_TASK_ID_QUERY_PARAM,\n} from '@/utils/SynapseConstants'\nimport { useSearchParams } from 'react-router'\n\nfunction GridPageInternal() {\n const [searchParams] = useSearchParams()\n\n const sessionId = decodeURIComponent(\n searchParams.get(GRID_PAGE_SESSION_ID_QUERY_PARAM) ?? '',\n )\n const rawTaskId = searchParams.get(GRID_PAGE_TASK_ID_QUERY_PARAM)\n const taskId = rawTaskId ? parseInt(rawTaskId) : undefined\n const agentRegistrationId = searchParams.get(\n GRID_PAGE_AGENT_REGISTRATION_ID_QUERY_PARAM,\n )\n\n // If no session id, error\n if (!sessionId) {\n return <ErrorBanner error={'Missing sessionId'} />\n }\n\n return (\n <>\n <GridPageTitle sessionId={sessionId} taskId={taskId} />\n <div className={'pageContent'}>\n <SynapseGrid\n agentRegistrationId={agentRegistrationId ?? undefined}\n ref={handle => {\n if (handle) {\n handle.loadExistingSession(sessionId)\n }\n }}\n />\n </div>\n </>\n )\n}\n\nexport type GridPageProps = Omit<GridPageRouterProps, 'children'>\n\n/**\n * A page that displays the Curator grid, with included routing logic\n */\nexport default function GridPage(props: GridPageProps) {\n return (\n <GridPageRouter {...props}>\n <GridPageInternal />\n </GridPageRouter>\n )\n}\n"],"names":["GridPageInternal","searchParams","useSearchParams","sessionId","GRID_PAGE_SESSION_ID_QUERY_PARAM","rawTaskId","GRID_PAGE_TASK_ID_QUERY_PARAM","taskId","agentRegistrationId","GRID_PAGE_AGENT_REGISTRATION_ID_QUERY_PARAM","jsxs","Fragment","jsx","GridPageTitle","SynapseGrid","handle","ErrorBanner","GridPage","props","GridPageRouter"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaA,SAASA,IAAmB;AAC1B,QAAM,CAACC,CAAY,IAAIC,EAAA,GAEjBC,IAAY;AAAA,IAChBF,EAAa,IAAIG,CAAgC,KAAK;AAAA,EAAA,GAElDC,IAAYJ,EAAa,IAAIK,CAA6B,GAC1DC,IAASF,IAAY,SAASA,CAAS,IAAI,QAC3CG,IAAsBP,EAAa;AAAA,IACvCQ;AAAA,EAAA;AAIF,SAAKN,IAKH,gBAAAO,EAAAC,GAAA,EACE,UAAA;AAAA,IAAA,gBAAAC,EAACC,GAAA,EAAc,WAAAV,GAAsB,QAAAI,EAAA,CAAgB;AAAA,IACrD,gBAAAK,EAAC,OAAA,EAAI,WAAW,eACd,UAAA,gBAAAA;AAAA,MAACE;AAAA,MAAA;AAAA,QACC,qBAAqBN,KAAuB;AAAA,QAC5C,KAAK,CAAAO,MAAU;AACb,UAAIA,KACFA,EAAO,oBAAoBZ,CAAS;AAAA,QAExC;AAAA,MAAA;AAAA,IAAA,EACF,CACF;AAAA,EAAA,GACF,IAhBO,gBAAAS,EAACI,GAAA,EAAY,OAAO,oBAAA,CAAqB;AAkBpD;AAOA,SAAwBC,GAASC,GAAsB;AACrD,2BACGC,GAAA,EAAgB,GAAGD,GAClB,UAAA,gBAAAN,EAACZ,KAAiB,GACpB;AAEJ;"}
1
+ {"version":3,"file":"GridPage.js","sources":["../../../../src/features/curator/GridPage/GridPage.tsx"],"sourcesContent":["import SynapseGrid from '@/components/DataGrid/index'\nimport { ErrorBanner } from '@/components/index'\nimport GridPageRouter, {\n GridPageRouterProps,\n} from '@/features/curator/GridPage/components/GridPageRouter'\nimport GridPageTitle from '@/features/curator/GridPage/components/GridPageTitle'\nimport {\n GRID_PAGE_SESSION_ID_QUERY_PARAM,\n GRID_PAGE_AGENT_REGISTRATION_ID_QUERY_PARAM,\n GRID_PAGE_TASK_ID_QUERY_PARAM,\n} from '@/utils/SynapseConstants'\nimport { useSearchParams } from 'react-router'\n\nfunction GridPageInternal() {\n const [searchParams] = useSearchParams()\n\n const sessionId = decodeURIComponent(\n searchParams.get(GRID_PAGE_SESSION_ID_QUERY_PARAM) ?? '',\n )\n const rawTaskId = searchParams.get(GRID_PAGE_TASK_ID_QUERY_PARAM)\n const taskId = rawTaskId ? parseInt(rawTaskId) : undefined\n const agentRegistrationId = searchParams.get(\n GRID_PAGE_AGENT_REGISTRATION_ID_QUERY_PARAM,\n )\n\n // If no session id, error\n if (!sessionId) {\n return <ErrorBanner error={'Missing sessionId'} />\n }\n\n return (\n <>\n <GridPageTitle sessionId={sessionId} taskId={taskId} />\n <div className={'pageContent'}>\n <SynapseGrid\n agentRegistrationId={agentRegistrationId ?? undefined}\n ref={handle => {\n if (handle) {\n handle.loadExistingSession(sessionId)\n }\n }}\n />\n </div>\n </>\n )\n}\n\nexport type GridPageProps = Omit<GridPageRouterProps, 'children'>\n\n/**\n * A page that displays the Curator grid, with included routing logic\n */\nexport default function GridPage(props: GridPageProps) {\n return (\n <GridPageRouter {...props}>\n <GridPageInternal />\n </GridPageRouter>\n )\n}\n"],"names":["GridPageInternal","searchParams","useSearchParams","sessionId","GRID_PAGE_SESSION_ID_QUERY_PARAM","rawTaskId","GRID_PAGE_TASK_ID_QUERY_PARAM","taskId","agentRegistrationId","GRID_PAGE_AGENT_REGISTRATION_ID_QUERY_PARAM","jsxs","Fragment","jsx","GridPageTitle","SynapseGrid","handle","ErrorBanner","GridPage","props","GridPageRouter"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaA,SAASA,IAAmB;AAC1B,QAAM,CAACC,CAAY,IAAIC,EAAA,GAEjBC,IAAY;AAAA,IAChBF,EAAa,IAAIG,CAAgC,KAAK;AAAA,EAAA,GAElDC,IAAYJ,EAAa,IAAIK,CAA6B,GAC1DC,IAASF,IAAY,SAASA,CAAS,IAAI,QAC3CG,IAAsBP,EAAa;AAAA,IACvCQ;AAAA,EAAA;AAIF,SAAKN,IAKH,gBAAAO,EAAAC,GAAA,EACE,UAAA;AAAA,IAAA,gBAAAC,EAACC,GAAA,EAAc,WAAAV,GAAsB,QAAAI,EAAA,CAAgB;AAAA,IACrD,gBAAAK,EAAC,OAAA,EAAI,WAAW,eACd,UAAA,gBAAAA;AAAA,MAACE;AAAA,MAAA;AAAA,QACC,qBAAqBN,KAAuB;AAAA,QAC5C,KAAK,CAAAO,MAAU;AACb,UAAIA,KACFA,EAAO,oBAAoBZ,CAAS;AAAA,QAExC;AAAA,MAAA;AAAA,IAAA,EACF,CACF;AAAA,EAAA,GACF,IAhBO,gBAAAS,EAACI,GAAA,EAAY,OAAO,oBAAA,CAAqB;AAkBpD;AAOA,SAAwBC,GAASC,GAAsB;AACrD,2BACGC,GAAA,EAAgB,GAAGD,GAClB,UAAA,gBAAAN,EAACZ,KAAiB,GACpB;AAEJ;"}
@@ -51,7 +51,6 @@ import "../../../../assets/icons/account-validated.svg.js";
51
51
  import "../../../../utils/functions/DateFormatter.js";
52
52
  import "@react-hookz/web";
53
53
  import "dayjs";
54
- import "../../../../assets/ArcusBioIcon.svg.js";
55
54
  import "@mui/material/SvgIcon";
56
55
  import "../../../../assets/icons/AccessPending.svg.js";
57
56
  import "../../../../assets/icons/AccessPendingCloud.svg.js";
@@ -218,7 +217,7 @@ import "../../../../components/PortalAclEditor/PortalAclEditor.js";
218
217
  import "../../../../components/SynapseHomepageV2/HomepageStyles.js";
219
218
  import { useGetCurationTask as y } from "../../../../synapse-queries/curation/task/useCurationTask.js";
220
219
  import { useGetGridSession as I } from "../../../../synapse-queries/grid/useGridSession.js";
221
- function $o(c) {
220
+ function No(c) {
222
221
  const { sessionId: m, taskId: p } = c, { data: t, error: e } = I(m), { data: n } = u(
223
222
  t?.sourceEntityId
224
223
  ), { data: o } = y(p || 0, {
@@ -258,6 +257,6 @@ function $o(c) {
258
257
  ] });
259
258
  }
260
259
  export {
261
- $o as default
260
+ No as default
262
261
  };
263
262
  //# sourceMappingURL=GridPageTitle.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"GridPageTitle.js","sources":["../../../../../src/features/curator/GridPage/components/GridPageTitle.tsx"],"sourcesContent":["import { ErrorBanner } from '@/components/index'\nimport { StyledPopover } from '@/components/styled/StyledPopover'\nimport { useGetCurationTask } from '@/synapse-queries/curation/task/useCurationTask'\nimport { useGetGridSession } from '@/synapse-queries/grid/useGridSession'\nimport { useGetEntityHeader } from '@/synapse-queries/index'\nimport { BackendDestinationEnum, getEndpoint } from '@/utils/functions/index'\nimport { Link, Stack, Tooltip, Typography } from '@mui/material'\n\ntype GridPageTitleProps = {\n sessionId: string\n taskId?: number\n}\n\nexport default function GridPageTitle(props: GridPageTitleProps) {\n const { sessionId, taskId } = props\n const { data: gridSession, error: gridSessionError } =\n useGetGridSession(sessionId)\n const { data: gridSourceEntity } = useGetEntityHeader(\n gridSession?.sourceEntityId,\n )\n const { data: curationTask } = useGetCurationTask(taskId || 0, {\n enabled: taskId != null,\n })\n\n if (gridSessionError) {\n return <ErrorBanner error={gridSessionError} />\n }\n\n return (\n <div className={'pageHeader'}>\n <h3 className={'pageHeaderTitle'}>\n Working Copy{' '}\n {gridSourceEntity?.name ? `of ${gridSourceEntity.name}` : ''}\n </h3>\n <Stack className={'description'} spacing={1}>\n <Typography variant={'headline2'}>ID: {sessionId}</Typography>\n {curationTask && (\n <Stack direction=\"row\" spacing={1} alignItems=\"center\">\n <Typography variant={'body1'}>\n <strong>Task Name:</strong> {curationTask.dataType}{' '}\n </Typography>\n <StyledPopover popoverContent={curationTask.instructions}>\n <Link underline=\"hover\">View Instructions</Link>\n </StyledPopover>\n </Stack>\n )}\n {gridSession?.gridJsonSchema$Id && (\n <div>\n <Tooltip title={gridSession?.gridJsonSchema$Id} placement={'right'}>\n <Link\n target={'_blank'}\n href={`${getEndpoint(\n BackendDestinationEnum.REPO_ENDPOINT,\n )}/repo/v1/schema/type/registered/${\n gridSession?.gridJsonSchema$Id\n }`}\n >\n View Validation Schema (JSON)\n </Link>\n </Tooltip>\n </div>\n )}\n </Stack>\n </div>\n )\n}\n"],"names":["GridPageTitle","props","sessionId","taskId","gridSession","gridSessionError","useGetGridSession","gridSourceEntity","useGetEntityHeader","curationTask","useGetCurationTask","jsx","ErrorBanner","jsxs","Stack","Typography","StyledPopover","Link","Tooltip","getEndpoint","BackendDestinationEnum"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaA,SAAwBA,GAAcC,GAA2B;AAC/D,QAAM,EAAE,WAAAC,GAAW,QAAAC,EAAA,IAAWF,GACxB,EAAE,MAAMG,GAAa,OAAOC,EAAA,IAChCC,EAAkBJ,CAAS,GACvB,EAAE,MAAMK,EAAA,IAAqBC;AAAA,IACjCJ,GAAa;AAAA,EAAA,GAET,EAAE,MAAMK,EAAA,IAAiBC,EAAmBP,KAAU,GAAG;AAAA,IAC7D,SAASA,KAAU;AAAA,EAAA,CACpB;AAED,SAAIE,IACK,gBAAAM,EAACC,GAAA,EAAY,OAAOP,EAAA,CAAkB,IAI7C,gBAAAQ,EAAC,OAAA,EAAI,WAAW,cACd,UAAA;AAAA,IAAA,gBAAAA,EAAC,MAAA,EAAG,WAAW,mBAAmB,UAAA;AAAA,MAAA;AAAA,MACnB;AAAA,MACZN,GAAkB,OAAO,MAAMA,EAAiB,IAAI,KAAK;AAAA,IAAA,GAC5D;AAAA,IACA,gBAAAM,EAACC,GAAA,EAAM,WAAW,eAAe,SAAS,GACxC,UAAA;AAAA,MAAA,gBAAAD,EAACE,GAAA,EAAW,SAAS,aAAa,UAAA;AAAA,QAAA;AAAA,QAAKb;AAAA,MAAA,GAAU;AAAA,MAChDO,uBACEK,GAAA,EAAM,WAAU,OAAM,SAAS,GAAG,YAAW,UAC5C,UAAA;AAAA,QAAA,gBAAAD,EAACE,GAAA,EAAW,SAAS,SACnB,UAAA;AAAA,UAAA,gBAAAJ,EAAC,YAAO,UAAA,aAAA,CAAU;AAAA,UAAS;AAAA,UAAEF,EAAa;AAAA,UAAU;AAAA,QAAA,GACtD;AAAA,QACA,gBAAAE,EAACK,GAAA,EAAc,gBAAgBP,EAAa,cAC1C,4BAACQ,GAAA,EAAK,WAAU,SAAQ,UAAA,oBAAA,CAAiB,EAAA,CAC3C;AAAA,MAAA,GACF;AAAA,MAEDb,GAAa,qBACZ,gBAAAO,EAAC,OAAA,EACC,UAAA,gBAAAA,EAACO,KAAQ,OAAOd,GAAa,mBAAmB,WAAW,SACzD,UAAA,gBAAAO;AAAA,QAACM;AAAA,QAAA;AAAA,UACC,QAAQ;AAAA,UACR,MAAM,GAAGE;AAAA,YACPC,EAAuB;AAAA,UAAA,CACxB,mCACChB,GAAa,iBACf;AAAA,UACD,UAAA;AAAA,QAAA;AAAA,MAAA,GAGH,EAAA,CACF;AAAA,IAAA,EAAA,CAEJ;AAAA,EAAA,GACF;AAEJ;"}
1
+ {"version":3,"file":"GridPageTitle.js","sources":["../../../../../src/features/curator/GridPage/components/GridPageTitle.tsx"],"sourcesContent":["import { ErrorBanner } from '@/components/index'\nimport { StyledPopover } from '@/components/styled/StyledPopover'\nimport { useGetCurationTask } from '@/synapse-queries/curation/task/useCurationTask'\nimport { useGetGridSession } from '@/synapse-queries/grid/useGridSession'\nimport { useGetEntityHeader } from '@/synapse-queries/index'\nimport { BackendDestinationEnum, getEndpoint } from '@/utils/functions/index'\nimport { Link, Stack, Tooltip, Typography } from '@mui/material'\n\ntype GridPageTitleProps = {\n sessionId: string\n taskId?: number\n}\n\nexport default function GridPageTitle(props: GridPageTitleProps) {\n const { sessionId, taskId } = props\n const { data: gridSession, error: gridSessionError } =\n useGetGridSession(sessionId)\n const { data: gridSourceEntity } = useGetEntityHeader(\n gridSession?.sourceEntityId,\n )\n const { data: curationTask } = useGetCurationTask(taskId || 0, {\n enabled: taskId != null,\n })\n\n if (gridSessionError) {\n return <ErrorBanner error={gridSessionError} />\n }\n\n return (\n <div className={'pageHeader'}>\n <h3 className={'pageHeaderTitle'}>\n Working Copy{' '}\n {gridSourceEntity?.name ? `of ${gridSourceEntity.name}` : ''}\n </h3>\n <Stack className={'description'} spacing={1}>\n <Typography variant={'headline2'}>ID: {sessionId}</Typography>\n {curationTask && (\n <Stack direction=\"row\" spacing={1} alignItems=\"center\">\n <Typography variant={'body1'}>\n <strong>Task Name:</strong> {curationTask.dataType}{' '}\n </Typography>\n <StyledPopover popoverContent={curationTask.instructions}>\n <Link underline=\"hover\">View Instructions</Link>\n </StyledPopover>\n </Stack>\n )}\n {gridSession?.gridJsonSchema$Id && (\n <div>\n <Tooltip title={gridSession?.gridJsonSchema$Id} placement={'right'}>\n <Link\n target={'_blank'}\n href={`${getEndpoint(\n BackendDestinationEnum.REPO_ENDPOINT,\n )}/repo/v1/schema/type/registered/${\n gridSession?.gridJsonSchema$Id\n }`}\n >\n View Validation Schema (JSON)\n </Link>\n </Tooltip>\n </div>\n )}\n </Stack>\n </div>\n )\n}\n"],"names":["GridPageTitle","props","sessionId","taskId","gridSession","gridSessionError","useGetGridSession","gridSourceEntity","useGetEntityHeader","curationTask","useGetCurationTask","jsx","ErrorBanner","jsxs","Stack","Typography","StyledPopover","Link","Tooltip","getEndpoint","BackendDestinationEnum"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaA,SAAwBA,GAAcC,GAA2B;AAC/D,QAAM,EAAE,WAAAC,GAAW,QAAAC,EAAA,IAAWF,GACxB,EAAE,MAAMG,GAAa,OAAOC,EAAA,IAChCC,EAAkBJ,CAAS,GACvB,EAAE,MAAMK,EAAA,IAAqBC;AAAA,IACjCJ,GAAa;AAAA,EAAA,GAET,EAAE,MAAMK,EAAA,IAAiBC,EAAmBP,KAAU,GAAG;AAAA,IAC7D,SAASA,KAAU;AAAA,EAAA,CACpB;AAED,SAAIE,IACK,gBAAAM,EAACC,GAAA,EAAY,OAAOP,EAAA,CAAkB,IAI7C,gBAAAQ,EAAC,OAAA,EAAI,WAAW,cACd,UAAA;AAAA,IAAA,gBAAAA,EAAC,MAAA,EAAG,WAAW,mBAAmB,UAAA;AAAA,MAAA;AAAA,MACnB;AAAA,MACZN,GAAkB,OAAO,MAAMA,EAAiB,IAAI,KAAK;AAAA,IAAA,GAC5D;AAAA,IACA,gBAAAM,EAACC,GAAA,EAAM,WAAW,eAAe,SAAS,GACxC,UAAA;AAAA,MAAA,gBAAAD,EAACE,GAAA,EAAW,SAAS,aAAa,UAAA;AAAA,QAAA;AAAA,QAAKb;AAAA,MAAA,GAAU;AAAA,MAChDO,uBACEK,GAAA,EAAM,WAAU,OAAM,SAAS,GAAG,YAAW,UAC5C,UAAA;AAAA,QAAA,gBAAAD,EAACE,GAAA,EAAW,SAAS,SACnB,UAAA;AAAA,UAAA,gBAAAJ,EAAC,YAAO,UAAA,aAAA,CAAU;AAAA,UAAS;AAAA,UAAEF,EAAa;AAAA,UAAU;AAAA,QAAA,GACtD;AAAA,QACA,gBAAAE,EAACK,GAAA,EAAc,gBAAgBP,EAAa,cAC1C,4BAACQ,GAAA,EAAK,WAAU,SAAQ,UAAA,oBAAA,CAAiB,EAAA,CAC3C;AAAA,MAAA,GACF;AAAA,MAEDb,GAAa,qBACZ,gBAAAO,EAAC,OAAA,EACC,UAAA,gBAAAA,EAACO,KAAQ,OAAOd,GAAa,mBAAmB,WAAW,SACzD,UAAA,gBAAAO;AAAA,QAACM;AAAA,QAAA;AAAA,UACC,QAAQ;AAAA,UACR,MAAM,GAAGE;AAAA,YACPC,EAAuB;AAAA,UAAA,CACxB,mCACChB,GAAa,iBACf;AAAA,UACD,UAAA;AAAA,QAAA;AAAA,MAAA,GAGH,EAAA,CACF;AAAA,IAAA,EAAA,CAEJ;AAAA,EAAA,GACF;AAEJ;"}
@@ -1 +1 @@
1
- {"version":3,"file":"MetadataTaskTableActionCell.d.ts","sourceRoot":"","sources":["../../../../../src/features/entity/metadata-task/components/MetadataTaskTableActionCell.tsx"],"names":[],"mappings":"AAaA,OAAO,EAGL,UAAU,EACX,MAAM,kCAAkC,CAAA;AAOzC,eAAO,MAAM,wBAAwB,mDACa,CAAA;AAClD,eAAO,MAAM,uCAAuC,gNAC2J,CAAA;AAE/M,eAAO,MAAM,qCAAqC,uBAAuB,CAAA;AAOzE;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,2BAA2B,CAAC,KAAK,EAAE;IACzD,UAAU,EAAE,UAAU,CAAA;IACtB,OAAO,EAAE,OAAO,CAAA;CACjB,2CAsOA"}
1
+ {"version":3,"file":"MetadataTaskTableActionCell.d.ts","sourceRoot":"","sources":["../../../../../src/features/entity/metadata-task/components/MetadataTaskTableActionCell.tsx"],"names":[],"mappings":"AAMA,OAAO,EAGL,UAAU,EACX,MAAM,kCAAkC,CAAA;AAIzC,eAAO,MAAM,wBAAwB,mDACa,CAAA;AAClD,eAAO,MAAM,uCAAuC,gNAC2J,CAAA;AAE/M,eAAO,MAAM,qCAAqC,uBAAuB,CAAA;AAOzE;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,2BAA2B,CAAC,KAAK,EAAE;IACzD,UAAU,EAAE,UAAU,CAAA;IACtB,OAAO,EAAE,OAAO,CAAA;CACjB,2CAwEA"}
@@ -1,188 +1,57 @@
1
- import { jsx as e, jsxs as s, Fragment as u } from "react/jsx-runtime";
2
- import { ConfirmationDialog as A } from "../../../../components/ConfirmationDialog/ConfirmationDialog.js";
3
- import { displayToast as O } from "../../../../components/ToastMessage/ToastMessage.js";
4
- import E from "../../../../components/UserOrTeamBadge/UserOrTeamBadge.js";
5
- import H from "../hooks/useGridSessionForCurationTask_legacy.js";
6
- import "../../../../synapse-client/SynapseClient.js";
7
- import "@sage-bionetworks/synapse-client/generated/models/ErrorResponseCode";
8
- import "@sage-bionetworks/synapse-client/generated/models/TwoFactorAuthErrorResponse";
9
- import "@sage-bionetworks/synapse-client/util/SynapseClientError";
10
- import { FeatureFlagEnum as K } from "@sage-bionetworks/synapse-types";
11
- import "../../../../utils/functions/EntityTypeUtils.js";
12
- import "../../../../utils/SynapseConstants.js";
13
- import "lodash-es";
14
- import "@sage-bionetworks/synapse-client/util/synapseClientFetch";
15
- import "@tanstack/react-query";
16
- import "../../../../utils/PermissionLevelToAccessType.js";
17
- import { useState as P, useCallback as G } from "react";
18
- import "../../../../utils/context/SynapseContext.js";
19
- import "use-deep-compare-effect";
20
- import { Tooltip as V, Button as z, Typography as _ } from "@mui/material";
21
- import "../../../../utils/hooks/useCookiePreferences.js";
22
- import "../../../../utils/hooks/useSourceAppConfigs.js";
23
- import "universal-cookie";
24
- import "../../../../utils/AppUtils/session/ApplicationSessionContext.js";
25
- import "../../../../utils/context/FullContextProvider.js";
26
- import "../../../../utils/context/DocumentMetadataContext.js";
27
- import '../../../../style/components/_spinner.css';/* empty css */
28
- import "@tanstack/query-core";
29
- import "lodash-es/isEmpty";
30
- import "lodash-es/isEqual";
31
- import "lodash-es/xorWith";
32
- import "react-router";
33
- import { SynapseClientError as Z } from "@sage-bionetworks/synapse-client";
34
- import "../../../../utils/types/IsType.js";
35
- import { useGetEntityPermissions as q } from "../../../../synapse-queries/entity/useEntity.js";
36
- import { useGetFeatureFlag as J } from "../../../../synapse-queries/featureflags/useGetFeatureFlag.js";
37
- import { useGetIsPrincipalIdUserOrMemberOfTeam as Q } from "../../../../synapse-queries/team/useTeamMembers.js";
38
- import { useGetCurrentUserProfile as X } from "../../../../synapse-queries/user/useUserBundle.js";
39
- import { getLinkToGridSession as $ } from "../../../../utils/functions/getSynapseWebClientLink.js";
40
- import { StickyNote2Outlined as ee } from "@mui/icons-material";
41
- import oe from "../hooks/useGridSessionForCurationTask.js";
42
- import { getGridSourceIdForTask as ie } from "../utils/getGridSourceIdForTask.js";
43
- import se from "../utils/taskHasAssignee.js";
44
- const b = "An error occurred while trying to open Curator", te = "You don't have permission to view the existing Curator session for this task. It was likely created by another data contributor. A data manager should create a new task and assign it to you or your team.", ne = "Task is Unassigned";
45
- function N(r, t) {
46
- const a = $(r, t);
47
- window.open(a, "_blank", "noopener");
1
+ import { jsx as e, Fragment as f } from "react/jsx-runtime";
2
+ import { displayToast as p } from "../../../../components/ToastMessage/ToastMessage.js";
3
+ import h from "../hooks/useGridSessionForCurationTask_legacy.js";
4
+ import { useGetEntityPermissions as O } from "../../../../synapse-queries/entity/useEntity.js";
5
+ import { getLinkToGridSession as S } from "../../../../utils/functions/getSynapseWebClientLink.js";
6
+ import { StickyNote2Outlined as w } from "@mui/icons-material";
7
+ import { Tooltip as I, Button as _ } from "@mui/material";
8
+ import { SynapseClientError as A } from "@sage-bionetworks/synapse-client";
9
+ import { useCallback as g } from "react";
10
+ import { getGridSourceIdForTask as R } from "../utils/getGridSourceIdForTask.js";
11
+ const k = "An error occurred while trying to open Curator", G = "You don't have permission to view the existing Curator session for this task. It was likely created by another data contributor. A data manager should create a new task and assign it to you or your team.", B = "Task is Unassigned";
12
+ function N(i, n) {
13
+ const o = S(i, n);
14
+ window.open(o, "_blank", "noopener");
48
15
  }
49
- function qe(r) {
50
- const { taskBundle: t, canEdit: a } = r, o = t.task, d = J(
51
- K.CURATOR_DISABLE_OPEN_FOR_UNASSIGNED_TASKS
52
- ), [R, c] = P(!1), [
53
- v,
54
- p
55
- ] = P(!1), { data: h } = X(), { data: U } = Q(
56
- h?.ownerId,
57
- o.assigneePrincipalId,
58
- { enabled: !!h?.ownerId && !!o.assigneePrincipalId }
59
- ), {
60
- data: n,
61
- mutateAsync: f,
62
- isPending: D
63
- } = oe(), {
64
- mutateAsync: S,
65
- isPending: F
66
- } = H(), k = D || F, y = ie(o), {
67
- data: T,
68
- isLoading: L
69
- } = q(y), w = L, l = se(o), C = a || U || !l, I = T?.canView && (C || !d), W = k || w || !I, B = I ? "Open Curator to edit metadata" : !C && d ? "You must be assigned to this task to open it" : T?.canView ? "You must have READ access to " + y + " to view the Working Copy" : "You do not have permission to view the Working Copy", m = G(
70
- async (j = !1) => {
71
- let g;
72
- try {
73
- if (j && !d)
74
- g = await S({
75
- curationTask: o
76
- });
77
- else {
78
- const i = await f(t);
79
- if (g = i.gridSession, !i.gridSessionOwnerMatchesTaskAssignee) {
80
- p(!0);
81
- return;
82
- }
83
- }
84
- N(g.sessionId, o.taskId);
85
- } catch (i) {
86
- i instanceof Z && i.status === 403 ? (console.error(i), O(te, "danger", {
87
- title: b
88
- })) : (console.error("Error opening Curator for curation task", i), O(i.message, "danger", {
89
- title: b
90
- }));
91
- }
92
- },
93
- [
94
- o,
95
- f,
96
- S,
97
- t
98
- ]
99
- ), M = G(() => {
100
- l ? m() : c(!0);
101
- }, [m, l]), x = /* @__PURE__ */ e(
102
- A,
103
- {
104
- open: R,
105
- title: ne,
106
- content: /* @__PURE__ */ s(u, { children: [
107
- /* @__PURE__ */ e(_, { variant: "body1", gutterBottom: !0, children: "This task is currently unassigned. A Curator session created using an unassigned task will be private to your account. If the task is assigned later, a new Curator session will be created and you may be unable to recover any unsaved changes." }),
108
- /* @__PURE__ */ e(_, { variant: "body1", children: "Do you want to proceed and open Curator using this unassigned task?" })
109
- ] }),
110
- confirmButtonProps: { children: "Proceed" },
111
- onConfirm: () => {
112
- m(!0), c(!1);
113
- },
114
- onCancel: () => {
115
- c(!1);
116
- }
16
+ function M(i) {
17
+ const { taskBundle: n } = i, o = n.task, {
18
+ mutateAsync: r,
19
+ isPending: s
20
+ } = h(), a = R(o), {
21
+ data: d,
22
+ isLoading: T
23
+ } = O(a), c = T, l = d?.canView, y = s || c || !l, E = l ? "Open Curator to edit metadata" : d?.canView ? "You must have READ access to " + a + " to view the Working Copy" : "You do not have permission to view the Working Copy", m = g(async () => {
24
+ let u;
25
+ try {
26
+ u = await r({
27
+ curationTask: o
28
+ }), N(u.sessionId, o.taskId);
29
+ } catch (t) {
30
+ t instanceof A && t.status === 403 ? (console.error(t), p(G, "danger", {
31
+ title: k
32
+ })) : (console.error("Error opening Curator for curation task", t), p(t.message, "danger", {
33
+ title: k
34
+ }));
117
35
  }
118
- ), Y = /* @__PURE__ */ e(
119
- A,
36
+ }, [o, r]), C = g(() => {
37
+ m();
38
+ }, [m]);
39
+ return /* @__PURE__ */ e(f, { children: /* @__PURE__ */ e(I, { title: E, children: /* @__PURE__ */ e("span", { children: /* @__PURE__ */ e(
40
+ _,
120
41
  {
121
- open: v,
122
- title: "Task assignee changed",
123
- content: /* @__PURE__ */ s(u, { children: [
124
- /* @__PURE__ */ s("p", { children: [
125
- "The existing Curator session for the task was created with a different owner",
126
- " ",
127
- /* @__PURE__ */ s("span", { style: { whiteSpace: "nowrap" }, children: [
128
- "(",
129
- n?.gridSession.ownerPrincipalId && /* @__PURE__ */ e(
130
- E,
131
- {
132
- principalId: n.gridSession.ownerPrincipalId
133
- }
134
- ),
135
- ")"
136
- ] }),
137
- " ",
138
- "than the current assignee",
139
- " ",
140
- /* @__PURE__ */ s("span", { style: { whiteSpace: "nowrap" }, children: [
141
- "(",
142
- o.assigneePrincipalId ? /* @__PURE__ */ e(
143
- E,
144
- {
145
- principalId: o.assigneePrincipalId
146
- }
147
- ) : "None",
148
- ")"
149
- ] }),
150
- ". Collaborators may not have access to this session."
151
- ] }),
152
- /* @__PURE__ */ e("p", { children: "Are you sure you want to open Curator?" })
153
- ] }),
154
- confirmButtonProps: { children: "Open Curator" },
155
- onConfirm: () => {
156
- n?.gridSession && (N(
157
- n.gridSession.sessionId,
158
- o.taskId
159
- ), p(!1));
160
- },
161
- onCancel: () => {
162
- p(!1);
163
- }
42
+ size: "small",
43
+ startIcon: /* @__PURE__ */ e(w, {}),
44
+ loading: s || c,
45
+ disabled: y,
46
+ onClick: C,
47
+ children: "Open Curator"
164
48
  }
165
- );
166
- return /* @__PURE__ */ s(u, { children: [
167
- x,
168
- Y,
169
- /* @__PURE__ */ e(V, { title: B, children: /* @__PURE__ */ e("span", { children: /* @__PURE__ */ e(
170
- z,
171
- {
172
- size: "small",
173
- startIcon: /* @__PURE__ */ e(ee, {}),
174
- loading: k || w,
175
- disabled: W,
176
- onClick: M,
177
- children: "Open Curator"
178
- }
179
- ) }) })
180
- ] });
49
+ ) }) }) });
181
50
  }
182
51
  export {
183
- ne as NO_TASK_ASSIGNEE_WARNING_DIALOG_TITLE,
184
- b as OPEN_CURATOR_ERROR_TITLE,
185
- te as OPEN_CURATOR_UNAUTHORIZED_ERROR_MESSAGE,
186
- qe as default
52
+ B as NO_TASK_ASSIGNEE_WARNING_DIALOG_TITLE,
53
+ k as OPEN_CURATOR_ERROR_TITLE,
54
+ G as OPEN_CURATOR_UNAUTHORIZED_ERROR_MESSAGE,
55
+ M as default
187
56
  };
188
57
  //# sourceMappingURL=MetadataTaskTableActionCell.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MetadataTaskTableActionCell.js","sources":["../../../../../src/features/entity/metadata-task/components/MetadataTaskTableActionCell.tsx"],"sourcesContent":["import { ConfirmationDialog } from '@/components/ConfirmationDialog'\nimport { displayToast } from '@/components/ToastMessage/ToastMessage'\nimport { UserOrTeamBadge } from '@/components/UserOrTeamBadge'\nimport useGridSessionForCurationTask_legacy from '@/features/entity/metadata-task/hooks/useGridSessionForCurationTask_legacy'\nimport {\n useGetCurrentUserProfile,\n useGetFeatureFlag,\n useGetIsPrincipalIdUserOrMemberOfTeam,\n} from '@/synapse-queries'\nimport { useGetEntityPermissions } from '@/synapse-queries/entity/useEntity'\nimport { getLinkToGridSession } from '@/utils/functions/getSynapseWebClientLink'\nimport { StickyNote2Outlined } from '@mui/icons-material'\nimport { Button, Tooltip, Typography } from '@mui/material'\nimport {\n GridSession,\n SynapseClientError,\n TaskBundle,\n} from '@sage-bionetworks/synapse-client'\nimport { FeatureFlagEnum } from '@sage-bionetworks/synapse-types'\nimport { useCallback, useState } from 'react'\nimport useGridSessionForCurationTask from '../hooks/useGridSessionForCurationTask'\nimport { getGridSourceIdForTask } from '../utils/getGridSourceIdForTask'\nimport taskHasAssignee from '../utils/taskHasAssignee'\n\nexport const OPEN_CURATOR_ERROR_TITLE =\n 'An error occurred while trying to open Curator'\nexport const OPEN_CURATOR_UNAUTHORIZED_ERROR_MESSAGE =\n \"You don't have permission to view the existing Curator session for this task. It was likely created by another data contributor. A data manager should create a new task and assign it to you or your team.\"\n\nexport const NO_TASK_ASSIGNEE_WARNING_DIALOG_TITLE = 'Task is Unassigned'\n\nfunction openGridSessionInNewWindow(gridSessionId: string, taskId: number) {\n const gridUrl = getLinkToGridSession(gridSessionId, taskId)\n window.open(gridUrl, '_blank', 'noopener')\n}\n\n/**\n * Handles rendering the 'Actions' cell in the Metadata Task table, which provides buttons for the user\n * to accomplish the actions they can take on a Metadata Task, such as opening a data grid for the entity referenced\n * by the task.\n */\nexport default function MetadataTaskTableActionCell(props: {\n taskBundle: TaskBundle\n canEdit: boolean\n}) {\n const { taskBundle, canEdit } = props\n const curationTask = taskBundle.task!\n\n // If false, allows opening a grid session for an unassigned task, even if it can lead to data loss,\n // because blocking this behavior prevents important use cases such as data contributors creating a\n // grid session before a task is assigned\n const disableLegacyUnassignedTaskBehavior = useGetFeatureFlag(\n FeatureFlagEnum.CURATOR_DISABLE_OPEN_FOR_UNASSIGNED_TASKS,\n )\n\n const [showOpenWithNoAssigneeWarning, setShowOpenWithNoAssigneeWarning] =\n useState(false)\n const [\n showGridSessionAssigneeMismatchDialog,\n setShowGridSessionAssigneeMismatchDialog,\n ] = useState(false)\n\n const { data: currentUser } = useGetCurrentUserProfile()\n\n const { data: isUserAssignedToTask } = useGetIsPrincipalIdUserOrMemberOfTeam(\n currentUser?.ownerId!,\n curationTask.assigneePrincipalId!,\n { enabled: !!currentUser?.ownerId && !!curationTask.assigneePrincipalId },\n )\n\n const {\n data: gridSessionInfoForCurationTask,\n mutateAsync: getGridSessionForTask,\n isPending: getOrCreateGridSessionIsPending,\n } = useGridSessionForCurationTask()\n\n const {\n mutateAsync: getOrCreateLegacyGridSessionForUnassignedTask,\n isPending: getOrCreateLegacyGridSessionIsPending,\n } = useGridSessionForCurationTask_legacy()\n\n const openGridIsPending =\n getOrCreateGridSessionIsPending || getOrCreateLegacyGridSessionIsPending\n\n const gridSourceEntityId = getGridSourceIdForTask(curationTask)\n const {\n data: sourceEntityPermissions,\n isLoading: isLoadingEntityPermissions,\n } = useGetEntityPermissions(gridSourceEntityId)\n\n const isLoading = isLoadingEntityPermissions\n const hasAssignee = taskHasAssignee(curationTask)\n const isAssignedToTask = canEdit || isUserAssignedToTask || !hasAssignee\n\n const hasPermission =\n sourceEntityPermissions?.canView &&\n (isAssignedToTask || !disableLegacyUnassignedTaskBehavior)\n\n const isOpenDataGridDisabled =\n openGridIsPending || isLoading || !hasPermission\n const toolTipTitle = hasPermission\n ? 'Open Curator to edit metadata'\n : !isAssignedToTask && disableLegacyUnassignedTaskBehavior\n ? 'You must be assigned to this task to open it'\n : sourceEntityPermissions?.canView\n ? 'You must have READ access to ' +\n gridSourceEntityId +\n ' to view the Working Copy'\n : 'You do not have permission to view the Working Copy'\n\n const openNewOrExistingCuratorSession = useCallback(\n async (\n /**\n * If unassigned, use legacy grid session retrieval behavior where grid sessions are not linked to the task\n * This can lead to data loss because different users create multiple grid sessions that overwrite each other\n */\n legacyIgnoreLinkedGridSession = false,\n ) => {\n let gridSession: GridSession\n try {\n if (\n legacyIgnoreLinkedGridSession &&\n !disableLegacyUnassignedTaskBehavior\n ) {\n gridSession = await getOrCreateLegacyGridSessionForUnassignedTask({\n curationTask,\n })\n } else {\n const getSessionResult = await getGridSessionForTask(taskBundle)\n gridSession = getSessionResult.gridSession\n\n if (!getSessionResult.gridSessionOwnerMatchesTaskAssignee) {\n // The user has access, but the assignee does not match the grid session owner.\n // Show a warning before allowing the user to proceed.\n setShowGridSessionAssigneeMismatchDialog(true)\n return\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 displayToast(error.message, 'danger', {\n title: OPEN_CURATOR_ERROR_TITLE,\n })\n }\n }\n },\n [\n curationTask,\n getGridSessionForTask,\n getOrCreateLegacyGridSessionForUnassignedTask,\n taskBundle,\n ],\n )\n\n const handleClickOpenCurator = useCallback(() => {\n if (!hasAssignee) {\n setShowOpenWithNoAssigneeWarning(true)\n } else {\n void openNewOrExistingCuratorSession()\n }\n }, [openNewOrExistingCuratorSession, hasAssignee])\n\n // Dialog to warn a user before opening a curation task without an assignee. Intended to discourage creating\n // grid sessions for unassigned tasks without completely blocking data contributors from doing so\n const openWithNoAssigneeWarningDialog = (\n <ConfirmationDialog\n open={showOpenWithNoAssigneeWarning}\n title={NO_TASK_ASSIGNEE_WARNING_DIALOG_TITLE}\n content={\n <>\n <Typography variant=\"body1\" gutterBottom>\n This task is currently unassigned. A Curator session created using\n an unassigned task will be private to your account. If the task is\n assigned later, a new Curator session will be created and you may be\n unable to recover any unsaved changes.\n </Typography>\n <Typography variant=\"body1\">\n Do you want to proceed and open Curator using this unassigned task?\n </Typography>\n </>\n }\n confirmButtonProps={{ children: 'Proceed' }}\n onConfirm={() => {\n // If unassigned, use legacy grid session retrieval behavior where grid sessions are not linked to the task\n // This can lead to data loss because different users create multiple grid sessions that overwrite each other\n void openNewOrExistingCuratorSession(true)\n setShowOpenWithNoAssigneeWarning(false)\n }}\n onCancel={() => {\n setShowOpenWithNoAssigneeWarning(false)\n }}\n />\n )\n\n const assigneeMismatchWarningDialog = (\n <ConfirmationDialog\n open={showGridSessionAssigneeMismatchDialog}\n title={'Task assignee changed'}\n content={\n <>\n <p>\n The existing Curator session for the task was created with a\n different owner{' '}\n <span style={{ whiteSpace: 'nowrap' }}>\n (\n {gridSessionInfoForCurationTask?.gridSession.ownerPrincipalId && (\n <UserOrTeamBadge\n principalId={\n gridSessionInfoForCurationTask.gridSession.ownerPrincipalId\n }\n />\n )}\n )\n </span>{' '}\n than the current assignee{' '}\n <span style={{ whiteSpace: 'nowrap' }}>\n (\n {curationTask.assigneePrincipalId ? (\n <UserOrTeamBadge\n principalId={curationTask.assigneePrincipalId}\n />\n ) : (\n 'None'\n )}\n )\n </span>\n . Collaborators may not have access to this session.\n </p>\n <p>Are you sure you want to open Curator?</p>\n </>\n }\n confirmButtonProps={{ children: 'Open Curator' }}\n onConfirm={() => {\n if (gridSessionInfoForCurationTask?.gridSession) {\n openGridSessionInNewWindow(\n gridSessionInfoForCurationTask.gridSession.sessionId!,\n curationTask.taskId!,\n )\n\n setShowGridSessionAssigneeMismatchDialog(false)\n }\n }}\n onCancel={() => {\n setShowGridSessionAssigneeMismatchDialog(false)\n }}\n />\n )\n\n return (\n <>\n {openWithNoAssigneeWarningDialog}\n {assigneeMismatchWarningDialog}\n <Tooltip title={toolTipTitle}>\n <span>\n <Button\n size={'small'}\n startIcon={<StickyNote2Outlined />}\n loading={openGridIsPending || isLoading}\n disabled={isOpenDataGridDisabled}\n onClick={handleClickOpenCurator}\n >\n Open Curator\n </Button>\n </span>\n </Tooltip>\n </>\n )\n}\n"],"names":["OPEN_CURATOR_ERROR_TITLE","OPEN_CURATOR_UNAUTHORIZED_ERROR_MESSAGE","NO_TASK_ASSIGNEE_WARNING_DIALOG_TITLE","openGridSessionInNewWindow","gridSessionId","taskId","gridUrl","getLinkToGridSession","MetadataTaskTableActionCell","props","taskBundle","canEdit","curationTask","disableLegacyUnassignedTaskBehavior","useGetFeatureFlag","FeatureFlagEnum","showOpenWithNoAssigneeWarning","setShowOpenWithNoAssigneeWarning","useState","showGridSessionAssigneeMismatchDialog","setShowGridSessionAssigneeMismatchDialog","currentUser","useGetCurrentUserProfile","isUserAssignedToTask","useGetIsPrincipalIdUserOrMemberOfTeam","gridSessionInfoForCurationTask","getGridSessionForTask","getOrCreateGridSessionIsPending","useGridSessionForCurationTask","getOrCreateLegacyGridSessionForUnassignedTask","getOrCreateLegacyGridSessionIsPending","useGridSessionForCurationTask_legacy","openGridIsPending","gridSourceEntityId","getGridSourceIdForTask","sourceEntityPermissions","isLoadingEntityPermissions","useGetEntityPermissions","isLoading","hasAssignee","taskHasAssignee","isAssignedToTask","hasPermission","isOpenDataGridDisabled","toolTipTitle","openNewOrExistingCuratorSession","useCallback","legacyIgnoreLinkedGridSession","gridSession","getSessionResult","error","SynapseClientError","displayToast","handleClickOpenCurator","openWithNoAssigneeWarningDialog","jsx","ConfirmationDialog","jsxs","Fragment","Typography","assigneeMismatchWarningDialog","UserOrTeamBadge","Tooltip","Button","StickyNote2Outlined"],"mappings":"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"}
1
+ {"version":3,"file":"MetadataTaskTableActionCell.js","sources":["../../../../../src/features/entity/metadata-task/components/MetadataTaskTableActionCell.tsx"],"sourcesContent":["import { displayToast } from '@/components/ToastMessage/ToastMessage'\nimport useGridSessionForCurationTask_legacy from '@/features/entity/metadata-task/hooks/useGridSessionForCurationTask_legacy'\nimport { useGetEntityPermissions } from '@/synapse-queries/entity/useEntity'\nimport { getLinkToGridSession } from '@/utils/functions/getSynapseWebClientLink'\nimport { StickyNote2Outlined } from '@mui/icons-material'\nimport { Button, Tooltip } from '@mui/material'\nimport {\n GridSession,\n SynapseClientError,\n TaskBundle,\n} from '@sage-bionetworks/synapse-client'\nimport { useCallback } from 'react'\nimport { getGridSourceIdForTask } from '../utils/getGridSourceIdForTask'\n\nexport const OPEN_CURATOR_ERROR_TITLE =\n 'An error occurred while trying to open Curator'\nexport const OPEN_CURATOR_UNAUTHORIZED_ERROR_MESSAGE =\n \"You don't have permission to view the existing Curator session for this task. It was likely created by another data contributor. A data manager should create a new task and assign it to you or your team.\"\n\nexport const NO_TASK_ASSIGNEE_WARNING_DIALOG_TITLE = 'Task is Unassigned'\n\nfunction openGridSessionInNewWindow(gridSessionId: string, taskId: number) {\n const gridUrl = getLinkToGridSession(gridSessionId, taskId)\n window.open(gridUrl, '_blank', 'noopener')\n}\n\n/**\n * Handles rendering the 'Actions' cell in the Metadata Task table, which provides buttons for the user\n * to accomplish the actions they can take on a Metadata Task, such as opening a data grid for the entity referenced\n * by the task.\n */\nexport default function MetadataTaskTableActionCell(props: {\n taskBundle: TaskBundle\n canEdit: boolean\n}) {\n const { taskBundle } = props\n const curationTask = taskBundle.task!\n\n const {\n mutateAsync: getOrCreateLegacyGridSessionForUnassignedTask,\n isPending: openGridIsPending,\n } = useGridSessionForCurationTask_legacy()\n\n const gridSourceEntityId = getGridSourceIdForTask(curationTask)\n const {\n data: sourceEntityPermissions,\n isLoading: isLoadingEntityPermissions,\n } = useGetEntityPermissions(gridSourceEntityId)\n\n const isLoading = isLoadingEntityPermissions\n\n const hasPermission = sourceEntityPermissions?.canView\n\n const isOpenDataGridDisabled =\n openGridIsPending || isLoading || !hasPermission\n const toolTipTitle = hasPermission\n ? 'Open Curator to edit metadata'\n : sourceEntityPermissions?.canView\n ? 'You must have READ access to ' +\n gridSourceEntityId +\n ' to view the Working Copy'\n : 'You do not have permission to view the Working Copy'\n\n const openNewOrExistingCuratorSession = useCallback(async () => {\n let gridSession: GridSession\n try {\n gridSession = await getOrCreateLegacyGridSessionForUnassignedTask({\n curationTask,\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 displayToast(error.message, 'danger', {\n title: OPEN_CURATOR_ERROR_TITLE,\n })\n }\n }\n }, [curationTask, getOrCreateLegacyGridSessionForUnassignedTask])\n\n const handleClickOpenCurator = useCallback(() => {\n void openNewOrExistingCuratorSession()\n }, [openNewOrExistingCuratorSession])\n\n return (\n <>\n <Tooltip title={toolTipTitle}>\n <span>\n <Button\n size={'small'}\n startIcon={<StickyNote2Outlined />}\n loading={openGridIsPending || isLoading}\n disabled={isOpenDataGridDisabled}\n onClick={handleClickOpenCurator}\n >\n Open Curator\n </Button>\n </span>\n </Tooltip>\n </>\n )\n}\n"],"names":["OPEN_CURATOR_ERROR_TITLE","OPEN_CURATOR_UNAUTHORIZED_ERROR_MESSAGE","NO_TASK_ASSIGNEE_WARNING_DIALOG_TITLE","openGridSessionInNewWindow","gridSessionId","taskId","gridUrl","getLinkToGridSession","MetadataTaskTableActionCell","props","taskBundle","curationTask","getOrCreateLegacyGridSessionForUnassignedTask","openGridIsPending","useGridSessionForCurationTask_legacy","gridSourceEntityId","getGridSourceIdForTask","sourceEntityPermissions","isLoadingEntityPermissions","useGetEntityPermissions","isLoading","hasPermission","isOpenDataGridDisabled","toolTipTitle","openNewOrExistingCuratorSession","useCallback","gridSession","error","SynapseClientError","displayToast","handleClickOpenCurator","jsx","Tooltip","Button","StickyNote2Outlined"],"mappings":";;;;;;;;;;AAcO,MAAMA,IACX,kDACWC,IACX,+MAEWC,IAAwC;AAErD,SAASC,EAA2BC,GAAuBC,GAAgB;AACzE,QAAMC,IAAUC,EAAqBH,GAAeC,CAAM;AAC1D,SAAO,KAAKC,GAAS,UAAU,UAAU;AAC3C;AAOA,SAAwBE,EAA4BC,GAGjD;AACD,QAAM,EAAE,YAAAC,MAAeD,GACjBE,IAAeD,EAAW,MAE1B;AAAA,IACJ,aAAaE;AAAA,IACb,WAAWC;AAAA,EAAA,IACTC,EAAA,GAEEC,IAAqBC,EAAuBL,CAAY,GACxD;AAAA,IACJ,MAAMM;AAAA,IACN,WAAWC;AAAA,EAAA,IACTC,EAAwBJ,CAAkB,GAExCK,IAAYF,GAEZG,IAAgBJ,GAAyB,SAEzCK,IACJT,KAAqBO,KAAa,CAACC,GAC/BE,IAAeF,IACjB,kCACAJ,GAAyB,UACzB,kCACAF,IACA,8BACA,uDAEES,IAAkCC,EAAY,YAAY;AAC9D,QAAIC;AACJ,QAAI;AACF,MAAAA,IAAc,MAAMd,EAA8C;AAAA,QAChE,cAAAD;AAAA,MAAA,CACD,GACDR,EAA2BuB,EAAY,WAAYf,EAAa,MAAO;AAAA,IACzE,SAASgB,GAAO;AACd,MAAIA,aAAiBC,KAAsBD,EAAM,WAAW,OAC1D,QAAQ,MAAMA,CAAK,GACnBE,EAAa5B,GAAyC,UAAU;AAAA,QAC9D,OAAOD;AAAA,MAAA,CACR,MAED,QAAQ,MAAM,2CAA2C2B,CAAK,GAC9DE,EAAaF,EAAM,SAAS,UAAU;AAAA,QACpC,OAAO3B;AAAA,MAAA,CACR;AAAA,IAEL;AAAA,EACF,GAAG,CAACW,GAAcC,CAA6C,CAAC,GAE1DkB,IAAyBL,EAAY,MAAM;AAC/C,IAAKD,EAAA;AAAA,EACP,GAAG,CAACA,CAA+B,CAAC;AAEpC,gCAEI,UAAA,gBAAAO,EAACC,GAAA,EAAQ,OAAOT,GACd,4BAAC,QAAA,EACC,UAAA,gBAAAQ;AAAA,IAACE;AAAA,IAAA;AAAA,MACC,MAAM;AAAA,MACN,6BAAYC,GAAA,EAAoB;AAAA,MAChC,SAASrB,KAAqBO;AAAA,MAC9B,UAAUE;AAAA,MACV,SAASQ;AAAA,MACV,UAAA;AAAA,IAAA;AAAA,EAAA,EAED,CACF,GACF,GACF;AAEJ;"}
@@ -48,7 +48,6 @@ import "../../../../assets/icons/account-validated.svg.js";
48
48
  import "../../../../utils/functions/DateFormatter.js";
49
49
  import "@react-hookz/web";
50
50
  import "dayjs";
51
- import "../../../../assets/ArcusBioIcon.svg.js";
52
51
  import "@mui/material/SvgIcon";
53
52
  import "../../../../assets/icons/AccessPending.svg.js";
54
53
  import "../../../../assets/icons/AccessPendingCloud.svg.js";
@@ -228,7 +227,7 @@ import "../../../../mocks/query/mock_query_data.js";
228
227
  import "../../../../mocks/realm/mockRealmPrincipal.js";
229
228
  import { useUpdateCurationTask as D } from "../../../../synapse-queries/curation/task/useCurationTask.js";
230
229
  import L from "../utils/taskHasAssignee.js";
231
- function Xr(u) {
230
+ function Wr(u) {
232
231
  const { taskBundle: s, canEdit: g } = u, o = s.task, { assigneePrincipalId: m } = o, [n, p] = e(!1), [h, f] = e(
233
232
  m ?? null
234
233
  ), [k, a] = e(!1), { mutateAsync: l, isPending: y } = D({
@@ -318,6 +317,6 @@ function Xr(u) {
318
317
  );
319
318
  }
320
319
  export {
321
- Xr as default
320
+ Wr as default
322
321
  };
323
322
  //# sourceMappingURL=MetadataTasksTableAssigneeCell.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MetadataTasksTableAssigneeCell.js","sources":["../../../../../src/features/entity/metadata-task/components/MetadataTasksTableAssigneeCell.tsx"],"sourcesContent":["import { ConfirmationDialog } from '@/components/ConfirmationDialog'\nimport UserOrTeamBadge from '@/components/UserOrTeamBadge/UserOrTeamBadge'\nimport UserSearchBox from '@/components/UserSearchBox/UserSearchBox'\nimport { displayToast } from '@/index'\nimport { useUpdateCurationTask } from '@/synapse-queries/curation/task/useCurationTask'\nimport { EditTwoTone } from '@mui/icons-material'\nimport { Alert, Box, IconButton, Stack, Typography } from '@mui/material'\nimport { TaskBundle } from '@sage-bionetworks/synapse-client'\nimport { TYPE_FILTER } from '@sage-bionetworks/synapse-types'\nimport { useCallback, useState } from 'react'\nimport taskHasAssignee from '../utils/taskHasAssignee'\n\nexport type MetadataTasksTableAssigneeCellProps = {\n taskBundle: TaskBundle\n canEdit: boolean\n}\n\nexport default function MetadataTasksTableAssigneeCell(\n props: MetadataTasksTableAssigneeCellProps,\n) {\n const { taskBundle, canEdit } = props\n const curationTask = taskBundle.task!\n const { assigneePrincipalId } = curationTask\n const [showUserPicker, setShowUserPicker] = useState(false)\n const [selectedPrincipalId, setSelectedPrincipalId] = useState<string | null>(\n assigneePrincipalId ?? null,\n )\n const [isHoveringOnCell, setIsHoveringOnCell] = useState(false)\n\n const { mutateAsync: updateCurationTask, isPending: updateTaskIsPending } =\n useUpdateCurationTask({\n onError: error => {\n displayToast('Error updating task assignee: ' + error.message, 'danger')\n },\n })\n\n let assigneeDisplay = (\n <Box\n component=\"span\"\n sx={{ flexGrow: 1, fontStyle: 'italic', color: 'grey.700' }}\n >\n Unassigned\n </Box>\n )\n\n const hasAssignee = taskHasAssignee(curationTask)\n if (hasAssignee) {\n assigneeDisplay = <UserOrTeamBadge principalId={assigneePrincipalId} />\n }\n\n const onConfirmUpdateAssignee = useCallback(\n async (assigneeId: string | undefined) => {\n await updateCurationTask({\n ...curationTask,\n assigneePrincipalId: assigneeId,\n })\n setShowUserPicker(false)\n },\n [curationTask, updateCurationTask],\n )\n\n const editDialog = (\n <ConfirmationDialog\n title=\"Set Assignee\"\n open={showUserPicker}\n content={\n <Stack gap={2}>\n <Typography variant=\"body1\" gutterBottom>\n Assign this task to a team or an individual user. All members of a\n team will be able to collaborate in the same Curator session.\n </Typography>\n <UserSearchBox\n key={showUserPicker.toString()}\n defaultValue={assigneePrincipalId}\n onChange={principalId => setSelectedPrincipalId(principalId)}\n typeFilter={TYPE_FILTER.ALL}\n />\n {taskBundle.status?.executionDetails?.activeSessionId && (\n <Alert severity=\"warning\">\n This task has an active Curator session. If you change the\n assignee, these effects could happen:\n <ul>\n <li>\n Current assignee(s) may lose access to the session, unsaved\n changes will be lost, and they may not be able to complete\n their work.\n </li>\n <li>\n New assignee(s) may not have permission to access the current\n session\n </li>\n </ul>\n To avoid these issues, a data manager should create a new task.\n </Alert>\n )}\n </Stack>\n }\n confirmButtonProps={{\n children: 'Save',\n loading: updateTaskIsPending,\n }}\n onConfirm={() => {\n onConfirmUpdateAssignee(selectedPrincipalId ?? undefined)\n }}\n onCancel={() => setShowUserPicker(false)}\n />\n )\n\n const editButton = (\n <div>\n <IconButton\n aria-label=\"Edit assignee\"\n size=\"small\"\n onClick={() => setShowUserPicker(true)}\n >\n <EditTwoTone fontSize=\"inherit\" />\n </IconButton>\n </div>\n )\n\n return (\n <Stack\n direction={'row'}\n alignItems={'center'}\n justifyContent={'space-between'}\n spacing={1}\n onMouseOver={() => {\n setIsHoveringOnCell(true)\n }}\n onMouseLeave={() => {\n setIsHoveringOnCell(false)\n }}\n >\n <span style={{ overflow: 'hidden' }}>{assigneeDisplay}</span>\n {isHoveringOnCell && canEdit && editButton}\n {editDialog}\n </Stack>\n )\n}\n"],"names":["MetadataTasksTableAssigneeCell","props","taskBundle","canEdit","curationTask","assigneePrincipalId","showUserPicker","setShowUserPicker","useState","selectedPrincipalId","setSelectedPrincipalId","isHoveringOnCell","setIsHoveringOnCell","updateCurationTask","updateTaskIsPending","useUpdateCurationTask","error","displayToast","assigneeDisplay","jsx","Box","taskHasAssignee","UserOrTeamBadge","onConfirmUpdateAssignee","useCallback","assigneeId","editDialog","ConfirmationDialog","jsxs","Stack","Typography","UserSearchBox","principalId","TYPE_FILTER","Alert","IconButton","EditTwoTone"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiBA,SAAwBA,GACtBC,GACA;AACA,QAAM,EAAE,YAAAC,GAAY,SAAAC,EAAA,IAAYF,GAC1BG,IAAeF,EAAW,MAC1B,EAAE,qBAAAG,MAAwBD,GAC1B,CAACE,GAAgBC,CAAiB,IAAIC,EAAS,EAAK,GACpD,CAACC,GAAqBC,CAAsB,IAAIF;AAAA,IACpDH,KAAuB;AAAA,EAAA,GAEnB,CAACM,GAAkBC,CAAmB,IAAIJ,EAAS,EAAK,GAExD,EAAE,aAAaK,GAAoB,WAAWC,EAAA,IAClDC,EAAsB;AAAA,IACpB,SAAS,CAAAC,MAAS;AAChB,MAAAC,EAAa,mCAAmCD,EAAM,SAAS,QAAQ;AAAA,IACzE;AAAA,EAAA,CACD;AAEH,MAAIE,IACF,gBAAAC;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,IAAI,EAAE,UAAU,GAAG,WAAW,UAAU,OAAO,WAAA;AAAA,MAChD,UAAA;AAAA,IAAA;AAAA,EAAA;AAMH,EADoBC,EAAgBjB,CAAY,MAE9Cc,IAAkB,gBAAAC,EAACG,GAAA,EAAgB,aAAajB,EAAA,CAAqB;AAGvE,QAAMkB,IAA0BC;AAAA,IAC9B,OAAOC,MAAmC;AACxC,YAAMZ,EAAmB;AAAA,QACvB,GAAGT;AAAA,QACH,qBAAqBqB;AAAA,MAAA,CACtB,GACDlB,EAAkB,EAAK;AAAA,IACzB;AAAA,IACA,CAACH,GAAcS,CAAkB;AAAA,EAAA,GAG7Ba,IACJ,gBAAAP;AAAA,IAACQ;AAAA,IAAA;AAAA,MACC,OAAM;AAAA,MACN,MAAMrB;AAAA,MACN,SACE,gBAAAsB,EAACC,GAAA,EAAM,KAAK,GACV,UAAA;AAAA,QAAA,gBAAAV,EAACW,GAAA,EAAW,SAAQ,SAAQ,cAAY,IAAC,UAAA,oIAGzC;AAAA,QACA,gBAAAX;AAAA,UAACY;AAAA,UAAA;AAAA,YAEC,cAAc1B;AAAA,YACd,UAAU,CAAA2B,MAAetB,EAAuBsB,CAAW;AAAA,YAC3D,YAAYC,EAAY;AAAA,UAAA;AAAA,UAHnB3B,EAAe,SAAA;AAAA,QAAS;AAAA,QAK9BJ,EAAW,QAAQ,kBAAkB,mBACpC,gBAAA0B,EAACM,GAAA,EAAM,UAAS,WAAU,UAAA;AAAA,UAAA;AAAA,4BAGvB,MAAA,EACC,UAAA;AAAA,YAAA,gBAAAf,EAAC,QAAG,UAAA,qIAAA,CAIJ;AAAA,YACA,gBAAAA,EAAC,QAAG,UAAA,wEAAA,CAGJ;AAAA,UAAA,GACF;AAAA,UAAK;AAAA,QAAA,EAAA,CAEP;AAAA,MAAA,GAEJ;AAAA,MAEF,oBAAoB;AAAA,QAClB,UAAU;AAAA,QACV,SAASL;AAAA,MAAA;AAAA,MAEX,WAAW,MAAM;AACf,QAAAS,EAAwBd,KAAuB,MAAS;AAAA,MAC1D;AAAA,MACA,UAAU,MAAMF,EAAkB,EAAK;AAAA,IAAA;AAAA,EAAA;AAgB3C,SACE,gBAAAqB;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,SAAS;AAAA,MACT,aAAa,MAAM;AACjB,QAAAjB,EAAoB,EAAI;AAAA,MAC1B;AAAA,MACA,cAAc,MAAM;AAClB,QAAAA,EAAoB,EAAK;AAAA,MAC3B;AAAA,MAEA,UAAA;AAAA,QAAA,gBAAAO,EAAC,UAAK,OAAO,EAAE,UAAU,SAAA,GAAa,UAAAD,GAAgB;AAAA,QACrDP,KAAoBR,uBAzBtB,OAAA,EACC,UAAA,gBAAAgB;AAAA,UAACgB;AAAA,UAAA;AAAA,YACC,cAAW;AAAA,YACX,MAAK;AAAA,YACL,SAAS,MAAM5B,EAAkB,EAAI;AAAA,YAErC,UAAA,gBAAAY,EAACiB,GAAA,EAAY,UAAS,UAAA,CAAU;AAAA,UAAA;AAAA,QAAA,GAEpC;AAAA,QAkBGV;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGP;"}
1
+ {"version":3,"file":"MetadataTasksTableAssigneeCell.js","sources":["../../../../../src/features/entity/metadata-task/components/MetadataTasksTableAssigneeCell.tsx"],"sourcesContent":["import { ConfirmationDialog } from '@/components/ConfirmationDialog'\nimport UserOrTeamBadge from '@/components/UserOrTeamBadge/UserOrTeamBadge'\nimport UserSearchBox from '@/components/UserSearchBox/UserSearchBox'\nimport { displayToast } from '@/index'\nimport { useUpdateCurationTask } from '@/synapse-queries/curation/task/useCurationTask'\nimport { EditTwoTone } from '@mui/icons-material'\nimport { Alert, Box, IconButton, Stack, Typography } from '@mui/material'\nimport { TaskBundle } from '@sage-bionetworks/synapse-client'\nimport { TYPE_FILTER } from '@sage-bionetworks/synapse-types'\nimport { useCallback, useState } from 'react'\nimport taskHasAssignee from '../utils/taskHasAssignee'\n\nexport type MetadataTasksTableAssigneeCellProps = {\n taskBundle: TaskBundle\n canEdit: boolean\n}\n\nexport default function MetadataTasksTableAssigneeCell(\n props: MetadataTasksTableAssigneeCellProps,\n) {\n const { taskBundle, canEdit } = props\n const curationTask = taskBundle.task!\n const { assigneePrincipalId } = curationTask\n const [showUserPicker, setShowUserPicker] = useState(false)\n const [selectedPrincipalId, setSelectedPrincipalId] = useState<string | null>(\n assigneePrincipalId ?? null,\n )\n const [isHoveringOnCell, setIsHoveringOnCell] = useState(false)\n\n const { mutateAsync: updateCurationTask, isPending: updateTaskIsPending } =\n useUpdateCurationTask({\n onError: error => {\n displayToast('Error updating task assignee: ' + error.message, 'danger')\n },\n })\n\n let assigneeDisplay = (\n <Box\n component=\"span\"\n sx={{ flexGrow: 1, fontStyle: 'italic', color: 'grey.700' }}\n >\n Unassigned\n </Box>\n )\n\n const hasAssignee = taskHasAssignee(curationTask)\n if (hasAssignee) {\n assigneeDisplay = <UserOrTeamBadge principalId={assigneePrincipalId} />\n }\n\n const onConfirmUpdateAssignee = useCallback(\n async (assigneeId: string | undefined) => {\n await updateCurationTask({\n ...curationTask,\n assigneePrincipalId: assigneeId,\n })\n setShowUserPicker(false)\n },\n [curationTask, updateCurationTask],\n )\n\n const editDialog = (\n <ConfirmationDialog\n title=\"Set Assignee\"\n open={showUserPicker}\n content={\n <Stack gap={2}>\n <Typography variant=\"body1\" gutterBottom>\n Assign this task to a team or an individual user. All members of a\n team will be able to collaborate in the same Curator session.\n </Typography>\n <UserSearchBox\n key={showUserPicker.toString()}\n defaultValue={assigneePrincipalId}\n onChange={principalId => setSelectedPrincipalId(principalId)}\n typeFilter={TYPE_FILTER.ALL}\n />\n {taskBundle.status?.executionDetails?.activeSessionId && (\n <Alert severity=\"warning\">\n This task has an active Curator session. If you change the\n assignee, these effects could happen:\n <ul>\n <li>\n Current assignee(s) may lose access to the session, unsaved\n changes will be lost, and they may not be able to complete\n their work.\n </li>\n <li>\n New assignee(s) may not have permission to access the current\n session\n </li>\n </ul>\n To avoid these issues, a data manager should create a new task.\n </Alert>\n )}\n </Stack>\n }\n confirmButtonProps={{\n children: 'Save',\n loading: updateTaskIsPending,\n }}\n onConfirm={() => {\n onConfirmUpdateAssignee(selectedPrincipalId ?? undefined)\n }}\n onCancel={() => setShowUserPicker(false)}\n />\n )\n\n const editButton = (\n <div>\n <IconButton\n aria-label=\"Edit assignee\"\n size=\"small\"\n onClick={() => setShowUserPicker(true)}\n >\n <EditTwoTone fontSize=\"inherit\" />\n </IconButton>\n </div>\n )\n\n return (\n <Stack\n direction={'row'}\n alignItems={'center'}\n justifyContent={'space-between'}\n spacing={1}\n onMouseOver={() => {\n setIsHoveringOnCell(true)\n }}\n onMouseLeave={() => {\n setIsHoveringOnCell(false)\n }}\n >\n <span style={{ overflow: 'hidden' }}>{assigneeDisplay}</span>\n {isHoveringOnCell && canEdit && editButton}\n {editDialog}\n </Stack>\n )\n}\n"],"names":["MetadataTasksTableAssigneeCell","props","taskBundle","canEdit","curationTask","assigneePrincipalId","showUserPicker","setShowUserPicker","useState","selectedPrincipalId","setSelectedPrincipalId","isHoveringOnCell","setIsHoveringOnCell","updateCurationTask","updateTaskIsPending","useUpdateCurationTask","error","displayToast","assigneeDisplay","jsx","Box","taskHasAssignee","UserOrTeamBadge","onConfirmUpdateAssignee","useCallback","assigneeId","editDialog","ConfirmationDialog","jsxs","Stack","Typography","UserSearchBox","principalId","TYPE_FILTER","Alert","IconButton","EditTwoTone"],"mappings":"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"}