synapse-react-client 4.0.6 → 4.0.8

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 (160) 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/DataGridTypes.d.ts +8 -2
  32. package/dist/components/DataGrid/DataGridTypes.d.ts.map +1 -1
  33. package/dist/components/DataGrid/DataGridTypes.js.map +1 -1
  34. package/dist/components/DataGrid/MergeGridWithSourceTableButton.js +2 -3
  35. package/dist/components/DataGrid/MergeGridWithSourceTableButton.js.map +1 -1
  36. package/dist/components/DataGrid/SynapseGrid.d.ts.map +1 -1
  37. package/dist/components/DataGrid/SynapseGrid.js +184 -164
  38. package/dist/components/DataGrid/SynapseGrid.js.map +1 -1
  39. package/dist/components/DataGrid/components/UploadCsvToGridDialog.js +2 -3
  40. package/dist/components/DataGrid/components/UploadCsvToGridDialog.js.map +1 -1
  41. package/dist/components/DataGrid/hooks/useGridReplicaUsers.d.ts +15 -0
  42. package/dist/components/DataGrid/hooks/useGridReplicaUsers.d.ts.map +1 -0
  43. package/dist/components/DataGrid/hooks/useGridReplicaUsers.js +55 -0
  44. package/dist/components/DataGrid/hooks/useGridReplicaUsers.js.map +1 -0
  45. package/dist/components/DataGrid/hooks/useRemoteSelections.d.ts +16 -0
  46. package/dist/components/DataGrid/hooks/useRemoteSelections.d.ts.map +1 -0
  47. package/dist/components/DataGrid/hooks/useRemoteSelections.js +30 -0
  48. package/dist/components/DataGrid/hooks/useRemoteSelections.js.map +1 -0
  49. package/dist/components/DataGrid/utils/DataGridUtils.js +31 -31
  50. package/dist/components/DataGrid/utils/DataGridUtils.js.map +1 -1
  51. package/dist/components/DataGrid/utils/applyModelChange.d.ts +1 -1
  52. package/dist/components/DataGrid/utils/applyModelChange.d.ts.map +1 -1
  53. package/dist/components/DataGrid/utils/applyModelChange.js +28 -23
  54. package/dist/components/DataGrid/utils/applyModelChange.js.map +1 -1
  55. package/dist/components/DataGrid/utils/columnFactory.d.ts.map +1 -1
  56. package/dist/components/DataGrid/utils/columnFactory.js +90 -49
  57. package/dist/components/DataGrid/utils/columnFactory.js.map +1 -1
  58. package/dist/components/DataGrid/utils/enrichRowsWithChangeInfo.d.ts +14 -0
  59. package/dist/components/DataGrid/utils/enrichRowsWithChangeInfo.d.ts.map +1 -0
  60. package/dist/components/DataGrid/utils/enrichRowsWithChangeInfo.js +24 -0
  61. package/dist/components/DataGrid/utils/enrichRowsWithChangeInfo.js.map +1 -0
  62. package/dist/components/DataGrid/utils/getCellAuthorSid.d.ts +7 -0
  63. package/dist/components/DataGrid/utils/getCellAuthorSid.d.ts.map +1 -0
  64. package/dist/components/DataGrid/utils/getCellAuthorSid.js +11 -0
  65. package/dist/components/DataGrid/utils/getCellAuthorSid.js.map +1 -0
  66. package/dist/components/DataGrid/utils/getCellClassName.d.ts +2 -0
  67. package/dist/components/DataGrid/utils/getCellClassName.d.ts.map +1 -1
  68. package/dist/components/DataGrid/utils/getCellClassName.js +23 -12
  69. package/dist/components/DataGrid/utils/getCellClassName.js.map +1 -1
  70. package/dist/components/DataGrid/utils/getChangeTooltipText.d.ts +7 -0
  71. package/dist/components/DataGrid/utils/getChangeTooltipText.d.ts.map +1 -0
  72. package/dist/components/DataGrid/utils/getChangeTooltipText.js +18 -0
  73. package/dist/components/DataGrid/utils/getChangeTooltipText.js.map +1 -0
  74. package/dist/components/DataGrid/utils/getReplicaCategory.d.ts +12 -0
  75. package/dist/components/DataGrid/utils/getReplicaCategory.d.ts.map +1 -0
  76. package/dist/components/DataGrid/utils/getReplicaCategory.js +13 -0
  77. package/dist/components/DataGrid/utils/getReplicaCategory.js.map +1 -0
  78. package/dist/components/DataGrid/utils/replicaSelectionToGridSelection.d.ts +15 -0
  79. package/dist/components/DataGrid/utils/replicaSelectionToGridSelection.d.ts.map +1 -0
  80. package/dist/components/DataGrid/utils/replicaSelectionToGridSelection.js +43 -0
  81. package/dist/components/DataGrid/utils/replicaSelectionToGridSelection.js.map +1 -0
  82. package/dist/components/DialogBase.d.ts +3 -1
  83. package/dist/components/DialogBase.d.ts.map +1 -1
  84. package/dist/components/DialogBase.js +75 -56
  85. package/dist/components/DialogBase.js.map +1 -1
  86. package/dist/components/Ecosystem/EcosystemSkeleton.js +2 -3
  87. package/dist/components/Ecosystem/EcosystemSkeleton.js.map +1 -1
  88. package/dist/components/FeaturedDataTabs/FacetPlotsCard.js +2 -3
  89. package/dist/components/FeaturedDataTabs/FacetPlotsCard.js.map +1 -1
  90. package/dist/components/FeaturedDataTabs/FeaturedDataTabs.js +2 -3
  91. package/dist/components/FeaturedDataTabs/FeaturedDataTabs.js.map +1 -1
  92. package/dist/components/GenericCard/GenericCard.js +3 -4
  93. package/dist/components/GenericCard/GenericCard.js.map +1 -1
  94. package/dist/components/HeaderCard.js +2 -3
  95. package/dist/components/HeaderCard.js.map +1 -1
  96. package/dist/components/IconSvg/IconSvg.d.ts +1 -1
  97. package/dist/components/IconSvg/IconSvg.d.ts.map +1 -1
  98. package/dist/components/IconSvg/IconSvg.js +168 -165
  99. package/dist/components/IconSvg/IconSvg.js.map +1 -1
  100. package/dist/components/StorybookComponentWrapper.js +3 -4
  101. package/dist/components/StorybookComponentWrapper.js.map +1 -1
  102. package/dist/components/SynapseForm/SynapseFormSubmissionGrid.d.ts +1 -0
  103. package/dist/components/SynapseForm/SynapseFormSubmissionGrid.d.ts.map +1 -1
  104. package/dist/components/SynapseForm/SynapseFormSubmissionGrid.js +23 -16
  105. package/dist/components/SynapseForm/SynapseFormSubmissionGrid.js.map +1 -1
  106. package/dist/components/TextField/TextField.css +1 -1
  107. package/dist/components/TextField/TextField.d.ts +1 -0
  108. package/dist/components/TextField/TextField.d.ts.map +1 -1
  109. package/dist/components/TextField/TextField.js +32 -20
  110. package/dist/components/TextField/TextField.js.map +1 -1
  111. package/dist/components/TextField/TextField.module.scss +7 -0
  112. package/dist/components/TextField/TextField.module.scss.js +5 -3
  113. package/dist/components/TextField/TextField.module.scss.js.map +1 -1
  114. package/dist/components/download_list/AddToDownloadListConfirmationAlert/AddToDownloadListConfirmationAlert.js +2 -3
  115. package/dist/components/download_list/AddToDownloadListConfirmationAlert/AddToDownloadListConfirmationAlert.js.map +1 -1
  116. package/dist/components/index.d.ts +1 -0
  117. package/dist/components/index.d.ts.map +1 -1
  118. package/dist/components/index.js +242 -240
  119. package/dist/components/index.js.map +1 -1
  120. package/dist/components/styled/StyledFormControl.js +1 -1
  121. package/dist/components/styled/StyledFormControl.js.map +1 -1
  122. package/dist/components/table/CsvPreview/CsvPreview.js +2 -3
  123. package/dist/components/table/CsvPreview/CsvPreview.js.map +1 -1
  124. package/dist/components/table/CsvPreview/CsvPreviewDialog.js +2 -3
  125. package/dist/components/table/CsvPreview/CsvPreviewDialog.js.map +1 -1
  126. package/dist/features/curator/GridPage/GridPage.js +2 -3
  127. package/dist/features/curator/GridPage/GridPage.js.map +1 -1
  128. package/dist/features/curator/GridPage/components/GridPageTitle.js +2 -3
  129. package/dist/features/curator/GridPage/components/GridPageTitle.js.map +1 -1
  130. package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.d.ts.map +1 -1
  131. package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.js +49 -180
  132. package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.js.map +1 -1
  133. package/dist/features/entity/metadata-task/components/MetadataTasksTableAssigneeCell.js +2 -3
  134. package/dist/features/entity/metadata-task/components/MetadataTasksTableAssigneeCell.js.map +1 -1
  135. package/dist/features/entity/metadata-task/utils/getCreateGridRequestForMetadataTask.d.ts.map +1 -1
  136. package/dist/features/entity/metadata-task/utils/getCreateGridRequestForMetadataTask.js +4 -8
  137. package/dist/features/entity/metadata-task/utils/getCreateGridRequestForMetadataTask.js.map +1 -1
  138. package/dist/index.js +306 -304
  139. package/dist/index.js.map +1 -1
  140. package/dist/style/components/_data-grid-extra.css +1 -1
  141. package/dist/style/components/_data-grid-extra.scss +49 -0
  142. package/dist/synapse-client/SynapseClient.d.ts +1 -1
  143. package/dist/synapse-client/SynapseClient.d.ts.map +1 -1
  144. package/dist/synapse-client/SynapseClient.js +3 -2
  145. package/dist/synapse-client/SynapseClient.js.map +1 -1
  146. package/dist/synapse-queries/index.js +42 -41
  147. package/dist/synapse-queries/user/index.js +17 -16
  148. package/dist/synapse-queries/user/useUserBundle.d.ts +9 -0
  149. package/dist/synapse-queries/user/useUserBundle.d.ts.map +1 -1
  150. package/dist/synapse-queries/user/useUserBundle.js +45 -37
  151. package/dist/synapse-queries/user/useUserBundle.js.map +1 -1
  152. package/dist/theme/palette/Palettes.d.ts +2 -0
  153. package/dist/theme/palette/Palettes.d.ts.map +1 -1
  154. package/dist/theme/palette/Palettes.js +46 -40
  155. package/dist/theme/palette/Palettes.js.map +1 -1
  156. package/dist/tsconfig.build.tsbuildinfo +1 -1
  157. package/package.json +3 -3
  158. package/dist/assets/ArcusBioIcon.svg +0 -1
  159. package/dist/assets/ArcusBioIcon.svg.js +0 -7
  160. package/dist/assets/ArcusBioIcon.svg.js.map +0 -1
package/dist/SWC.index.js CHANGED
@@ -221,7 +221,7 @@ const Y = {
221
221
  sendSearchResultsReturnedEvent: y,
222
222
  sendSearchResultReturnedEvent: c,
223
223
  sendSearchResultClickedEvent: d
224
- }, tt = "4.0.6";
224
+ }, tt = "4.0.8";
225
225
  export {
226
226
  $ as Analytics,
227
227
  g as HttpClient,
@@ -36,7 +36,6 @@ import { getFieldIndex as e } from "../../utils/functions/queryUtils.js";
36
36
  import { getLinkParams as V, getFileHandleAssociation as d } from "../GenericCard/CardUtils.js";
37
37
  import "../../utils/functions/DateFormatter.js";
38
38
  import "dayjs";
39
- import "../../assets/ArcusBioIcon.svg.js";
40
39
  import "@mui/material/SvgIcon";
41
40
  import "../../assets/icons/AccessPending.svg.js";
42
41
  import "../../assets/icons/AccessPendingCloud.svg.js";
@@ -60,7 +59,7 @@ import "react-transition-group";
60
59
  import "@mui/system";
61
60
  import "../GenericCard/Linkify.js";
62
61
  import "../GenericCard/GenericCard.js";
63
- function to(I) {
62
+ function Zt(I) {
64
63
  const {
65
64
  entityId: r,
66
65
  titleColumnName: f,
@@ -136,7 +135,7 @@ function to(I) {
136
135
  return /* @__PURE__ */ n(M, { cards: N || [], cardDeckType: a });
137
136
  }
138
137
  export {
139
- to as TableQueryCardDeck,
140
- to as default
138
+ Zt as TableQueryCardDeck,
139
+ Zt as default
141
140
  };
142
141
  //# sourceMappingURL=TableQueryCardDeck.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TableQueryCardDeck.js","sources":["../../../src/components/CardDeck/TableQueryCardDeck.tsx"],"sourcesContent":["import { CardDeck } from '@/components/CardDeck/CardDeck'\nimport { CardDeckCardProps } from '@/components/CardDeck/CardDeckCardProps'\nimport { ImageFileHandle } from '@/components/widgets/ImageFileHandle'\nimport { useGetEntity } from '@/synapse-queries/entity/useEntity'\nimport useGetQueryResultBundle from '@/synapse-queries/entity/useGetQueryResultBundle'\nimport { SynapseConstants } from '@/utils'\nimport { getFieldIndex } from '@/utils/functions/queryUtils'\nimport { QueryBundleRequest } from '@sage-bionetworks/synapse-types'\nimport { CardLink } from '../CardContainer/CardLink'\nimport { getFileHandleAssociation, getLinkParams } from '../GenericCard'\n\nexport type TableQueryCardDeckProps = {\n entityId: string /* The table entity which should be queried */\n titleColumnName: string /* The column name for the title */\n descriptionColumnName: string /* The column name for the description */\n ctaButtonTextColumnName: string /* The column name for the call to action button text */\n ctaButtonURLColumnName: string /* The column name for the call to action button URL */\n titleIconFileHandleColumnName?: string /* The column name for the title icon image file */\n headerImageFileHandleColumnName?: string /* The column name for the header image file */\n cardDeckType?: 'cckp' | 'b2ai' /* The type of card deck (cckp or b2ai)*/\n linkConfig: CardLink /* The link configuration */\n}\n\n/**\n * Transforms a Synapse table into a card deck.\n */\nexport function TableQueryCardDeck(props: TableQueryCardDeckProps) {\n const {\n entityId,\n titleColumnName,\n descriptionColumnName,\n ctaButtonTextColumnName,\n ctaButtonURLColumnName,\n titleIconFileHandleColumnName,\n headerImageFileHandleColumnName,\n cardDeckType,\n linkConfig,\n } = props\n const entity = useGetEntity(entityId)\n const queryBundleRequest: QueryBundleRequest = {\n concreteType: 'org.sagebionetworks.repo.model.table.QueryBundleRequest',\n entityId,\n partMask:\n SynapseConstants.BUNDLE_MASK_QUERY_SELECT_COLUMNS |\n SynapseConstants.BUNDLE_MASK_QUERY_RESULTS,\n query: {\n sql: `select * from ${entityId}`,\n },\n }\n const { data: queryResultBundle } =\n useGetQueryResultBundle(queryBundleRequest)\n\n const titleColumnIndex = getFieldIndex(titleColumnName, queryResultBundle)\n const descriptionColumnIndex = getFieldIndex(\n descriptionColumnName,\n queryResultBundle,\n )\n const ctaButtonTextColumnIndex = getFieldIndex(\n ctaButtonTextColumnName,\n queryResultBundle,\n )\n const ctaButtonURLColumnIndex = getFieldIndex(\n ctaButtonURLColumnName,\n queryResultBundle,\n )\n const titleIconColumnIndex = getFieldIndex(\n titleIconFileHandleColumnName,\n queryResultBundle,\n )\n const headerImageColumnIndex = getFieldIndex(\n headerImageFileHandleColumnName,\n queryResultBundle,\n )\n\n const cards = queryResultBundle?.queryResult!.queryResults.rows.map(\n (el): CardDeckCardProps => {\n const values = el.values as string[]\n if (values.some(value => value === null)) {\n // We cast values above assuming there are no null values, emit a warning just in case.\n console.warn('Row has null value(s) when no nulls expected')\n }\n\n const title = values[titleColumnIndex]\n const description = values[descriptionColumnIndex]\n const ctaButtonText = values[ctaButtonTextColumnIndex]\n const ctaButtonURL = values[ctaButtonURLColumnIndex] ?? ''\n const titleIconFileHandleIdValue = values[titleIconColumnIndex] ?? ''\n const headerImageFileHandleIdValue = values[headerImageColumnIndex] ?? ''\n\n const schema: Record<string, number> = {}\n queryResultBundle?.queryResult!.queryResults.headers.forEach(\n (header, colIndex) => {\n schema[header.name] = colIndex\n },\n )\n const { href } = getLinkParams(ctaButtonURL, linkConfig, values, schema)\n\n const titleIconFileHandleAssociation = getFileHandleAssociation(\n entity.data,\n titleIconFileHandleIdValue,\n `syn${el.rowId}`,\n )\n\n const titleIcon = titleIconFileHandleAssociation ? (\n <ImageFileHandle\n fileHandleAssociation={titleIconFileHandleAssociation}\n />\n ) : undefined\n\n const headerImageFileHandleAssociation = getFileHandleAssociation(\n entity.data,\n headerImageFileHandleIdValue,\n `syn${el.rowId}`,\n )\n\n const headerImage = headerImageFileHandleAssociation ? (\n <ImageFileHandle\n fileHandleAssociation={headerImageFileHandleAssociation}\n />\n ) : undefined\n\n return {\n title,\n description,\n ctaButtonText,\n ctaButtonURL: href,\n titleIcon,\n headerImage,\n cardDeckType,\n } satisfies CardDeckCardProps\n },\n )\n\n return <CardDeck cards={cards || []} cardDeckType={cardDeckType} />\n}\n\nexport default TableQueryCardDeck\n"],"names":["TableQueryCardDeck","props","entityId","titleColumnName","descriptionColumnName","ctaButtonTextColumnName","ctaButtonURLColumnName","titleIconFileHandleColumnName","headerImageFileHandleColumnName","cardDeckType","linkConfig","entity","useGetEntity","queryBundleRequest","SynapseConstants.BUNDLE_MASK_QUERY_SELECT_COLUMNS","SynapseConstants.BUNDLE_MASK_QUERY_RESULTS","queryResultBundle","useGetQueryResultBundle","titleColumnIndex","getFieldIndex","descriptionColumnIndex","ctaButtonTextColumnIndex","ctaButtonURLColumnIndex","titleIconColumnIndex","headerImageColumnIndex","cards","el","values","value","title","description","ctaButtonText","ctaButtonURL","titleIconFileHandleIdValue","headerImageFileHandleIdValue","schema","header","colIndex","href","getLinkParams","titleIconFileHandleAssociation","getFileHandleAssociation","titleIcon","jsx","ImageFileHandle","headerImageFileHandleAssociation","CardDeck"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BO,SAASA,GAAmBC,GAAgC;AACjE,QAAM;AAAA,IACJ,UAAAC;AAAA,IACA,iBAAAC;AAAA,IACA,uBAAAC;AAAA,IACA,yBAAAC;AAAA,IACA,wBAAAC;AAAA,IACA,+BAAAC;AAAA,IACA,iCAAAC;AAAA,IACA,cAAAC;AAAA,IACA,YAAAC;AAAA,EAAA,IACET,GACEU,IAASC,EAAaV,CAAQ,GAC9BW,IAAyC;AAAA,IAC7C,cAAc;AAAA,IACd,UAAAX;AAAA,IACA,UACEY,IACAC;AAAAA,IACF,OAAO;AAAA,MACL,KAAK,iBAAiBb,CAAQ;AAAA,IAAA;AAAA,EAChC,GAEI,EAAE,MAAMc,MACZC,EAAwBJ,CAAkB,GAEtCK,IAAmBC,EAAchB,GAAiBa,CAAiB,GACnEI,IAAyBD;AAAA,IAC7Bf;AAAA,IACAY;AAAA,EAAA,GAEIK,IAA2BF;AAAA,IAC/Bd;AAAA,IACAW;AAAA,EAAA,GAEIM,IAA0BH;AAAA,IAC9Bb;AAAA,IACAU;AAAA,EAAA,GAEIO,IAAuBJ;AAAA,IAC3BZ;AAAA,IACAS;AAAA,EAAA,GAEIQ,IAAyBL;AAAA,IAC7BX;AAAA,IACAQ;AAAA,EAAA,GAGIS,IAAQT,GAAmB,YAAa,aAAa,KAAK;AAAA,IAC9D,CAACU,MAA0B;AACzB,YAAMC,IAASD,EAAG;AAClB,MAAIC,EAAO,KAAK,CAAAC,MAASA,MAAU,IAAI,KAErC,QAAQ,KAAK,8CAA8C;AAG7D,YAAMC,IAAQF,EAAOT,CAAgB,GAC/BY,IAAcH,EAAOP,CAAsB,GAC3CW,IAAgBJ,EAAON,CAAwB,GAC/CW,IAAeL,EAAOL,CAAuB,KAAK,IAClDW,IAA6BN,EAAOJ,CAAoB,KAAK,IAC7DW,IAA+BP,EAAOH,CAAsB,KAAK,IAEjEW,IAAiC,CAAA;AACvC,MAAAnB,GAAmB,YAAa,aAAa,QAAQ;AAAA,QACnD,CAACoB,GAAQC,MAAa;AACpB,UAAAF,EAAOC,EAAO,IAAI,IAAIC;AAAA,QACxB;AAAA,MAAA;AAEF,YAAM,EAAE,MAAAC,EAAA,IAASC,EAAcP,GAActB,GAAYiB,GAAQQ,CAAM,GAEjEK,IAAiCC;AAAA,QACrC9B,EAAO;AAAA,QACPsB;AAAA,QACA,MAAMP,EAAG,KAAK;AAAA,MAAA,GAGVgB,IAAYF,IAChB,gBAAAG;AAAA,QAACC;AAAA,QAAA;AAAA,UACC,uBAAuBJ;AAAA,QAAA;AAAA,MAAA,IAEvB,QAEEK,IAAmCJ;AAAA,QACvC9B,EAAO;AAAA,QACPuB;AAAA,QACA,MAAMR,EAAG,KAAK;AAAA,MAAA;AAShB,aAAO;AAAA,QACL,OAAAG;AAAA,QACA,aAAAC;AAAA,QACA,eAAAC;AAAA,QACA,cAAcO;AAAA,QACd,WAAAI;AAAA,QACA,aAZkBG,IAClB,gBAAAF;AAAA,UAACC;AAAA,UAAA;AAAA,YACC,uBAAuBC;AAAA,UAAA;AAAA,QAAA,IAEvB;AAAA,QASF,cAAApC;AAAA,MAAA;AAAA,IAEJ;AAAA,EAAA;AAGF,2BAAQqC,GAAA,EAAS,OAAOrB,KAAS,CAAA,GAAI,cAAAhB,GAA4B;AACnE;"}
1
+ {"version":3,"file":"TableQueryCardDeck.js","sources":["../../../src/components/CardDeck/TableQueryCardDeck.tsx"],"sourcesContent":["import { CardDeck } from '@/components/CardDeck/CardDeck'\nimport { CardDeckCardProps } from '@/components/CardDeck/CardDeckCardProps'\nimport { ImageFileHandle } from '@/components/widgets/ImageFileHandle'\nimport { useGetEntity } from '@/synapse-queries/entity/useEntity'\nimport useGetQueryResultBundle from '@/synapse-queries/entity/useGetQueryResultBundle'\nimport { SynapseConstants } from '@/utils'\nimport { getFieldIndex } from '@/utils/functions/queryUtils'\nimport { QueryBundleRequest } from '@sage-bionetworks/synapse-types'\nimport { CardLink } from '../CardContainer/CardLink'\nimport { getFileHandleAssociation, getLinkParams } from '../GenericCard'\n\nexport type TableQueryCardDeckProps = {\n entityId: string /* The table entity which should be queried */\n titleColumnName: string /* The column name for the title */\n descriptionColumnName: string /* The column name for the description */\n ctaButtonTextColumnName: string /* The column name for the call to action button text */\n ctaButtonURLColumnName: string /* The column name for the call to action button URL */\n titleIconFileHandleColumnName?: string /* The column name for the title icon image file */\n headerImageFileHandleColumnName?: string /* The column name for the header image file */\n cardDeckType?: 'cckp' | 'b2ai' /* The type of card deck (cckp or b2ai)*/\n linkConfig: CardLink /* The link configuration */\n}\n\n/**\n * Transforms a Synapse table into a card deck.\n */\nexport function TableQueryCardDeck(props: TableQueryCardDeckProps) {\n const {\n entityId,\n titleColumnName,\n descriptionColumnName,\n ctaButtonTextColumnName,\n ctaButtonURLColumnName,\n titleIconFileHandleColumnName,\n headerImageFileHandleColumnName,\n cardDeckType,\n linkConfig,\n } = props\n const entity = useGetEntity(entityId)\n const queryBundleRequest: QueryBundleRequest = {\n concreteType: 'org.sagebionetworks.repo.model.table.QueryBundleRequest',\n entityId,\n partMask:\n SynapseConstants.BUNDLE_MASK_QUERY_SELECT_COLUMNS |\n SynapseConstants.BUNDLE_MASK_QUERY_RESULTS,\n query: {\n sql: `select * from ${entityId}`,\n },\n }\n const { data: queryResultBundle } =\n useGetQueryResultBundle(queryBundleRequest)\n\n const titleColumnIndex = getFieldIndex(titleColumnName, queryResultBundle)\n const descriptionColumnIndex = getFieldIndex(\n descriptionColumnName,\n queryResultBundle,\n )\n const ctaButtonTextColumnIndex = getFieldIndex(\n ctaButtonTextColumnName,\n queryResultBundle,\n )\n const ctaButtonURLColumnIndex = getFieldIndex(\n ctaButtonURLColumnName,\n queryResultBundle,\n )\n const titleIconColumnIndex = getFieldIndex(\n titleIconFileHandleColumnName,\n queryResultBundle,\n )\n const headerImageColumnIndex = getFieldIndex(\n headerImageFileHandleColumnName,\n queryResultBundle,\n )\n\n const cards = queryResultBundle?.queryResult!.queryResults.rows.map(\n (el): CardDeckCardProps => {\n const values = el.values as string[]\n if (values.some(value => value === null)) {\n // We cast values above assuming there are no null values, emit a warning just in case.\n console.warn('Row has null value(s) when no nulls expected')\n }\n\n const title = values[titleColumnIndex]\n const description = values[descriptionColumnIndex]\n const ctaButtonText = values[ctaButtonTextColumnIndex]\n const ctaButtonURL = values[ctaButtonURLColumnIndex] ?? ''\n const titleIconFileHandleIdValue = values[titleIconColumnIndex] ?? ''\n const headerImageFileHandleIdValue = values[headerImageColumnIndex] ?? ''\n\n const schema: Record<string, number> = {}\n queryResultBundle?.queryResult!.queryResults.headers.forEach(\n (header, colIndex) => {\n schema[header.name] = colIndex\n },\n )\n const { href } = getLinkParams(ctaButtonURL, linkConfig, values, schema)\n\n const titleIconFileHandleAssociation = getFileHandleAssociation(\n entity.data,\n titleIconFileHandleIdValue,\n `syn${el.rowId}`,\n )\n\n const titleIcon = titleIconFileHandleAssociation ? (\n <ImageFileHandle\n fileHandleAssociation={titleIconFileHandleAssociation}\n />\n ) : undefined\n\n const headerImageFileHandleAssociation = getFileHandleAssociation(\n entity.data,\n headerImageFileHandleIdValue,\n `syn${el.rowId}`,\n )\n\n const headerImage = headerImageFileHandleAssociation ? (\n <ImageFileHandle\n fileHandleAssociation={headerImageFileHandleAssociation}\n />\n ) : undefined\n\n return {\n title,\n description,\n ctaButtonText,\n ctaButtonURL: href,\n titleIcon,\n headerImage,\n cardDeckType,\n } satisfies CardDeckCardProps\n },\n )\n\n return <CardDeck cards={cards || []} cardDeckType={cardDeckType} />\n}\n\nexport default TableQueryCardDeck\n"],"names":["TableQueryCardDeck","props","entityId","titleColumnName","descriptionColumnName","ctaButtonTextColumnName","ctaButtonURLColumnName","titleIconFileHandleColumnName","headerImageFileHandleColumnName","cardDeckType","linkConfig","entity","useGetEntity","queryBundleRequest","SynapseConstants.BUNDLE_MASK_QUERY_SELECT_COLUMNS","SynapseConstants.BUNDLE_MASK_QUERY_RESULTS","queryResultBundle","useGetQueryResultBundle","titleColumnIndex","getFieldIndex","descriptionColumnIndex","ctaButtonTextColumnIndex","ctaButtonURLColumnIndex","titleIconColumnIndex","headerImageColumnIndex","cards","el","values","value","title","description","ctaButtonText","ctaButtonURL","titleIconFileHandleIdValue","headerImageFileHandleIdValue","schema","header","colIndex","href","getLinkParams","titleIconFileHandleAssociation","getFileHandleAssociation","titleIcon","jsx","ImageFileHandle","headerImageFileHandleAssociation","CardDeck"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BO,SAASA,GAAmBC,GAAgC;AACjE,QAAM;AAAA,IACJ,UAAAC;AAAA,IACA,iBAAAC;AAAA,IACA,uBAAAC;AAAA,IACA,yBAAAC;AAAA,IACA,wBAAAC;AAAA,IACA,+BAAAC;AAAA,IACA,iCAAAC;AAAA,IACA,cAAAC;AAAA,IACA,YAAAC;AAAA,EAAA,IACET,GACEU,IAASC,EAAaV,CAAQ,GAC9BW,IAAyC;AAAA,IAC7C,cAAc;AAAA,IACd,UAAAX;AAAA,IACA,UACEY,IACAC;AAAAA,IACF,OAAO;AAAA,MACL,KAAK,iBAAiBb,CAAQ;AAAA,IAAA;AAAA,EAChC,GAEI,EAAE,MAAMc,MACZC,EAAwBJ,CAAkB,GAEtCK,IAAmBC,EAAchB,GAAiBa,CAAiB,GACnEI,IAAyBD;AAAA,IAC7Bf;AAAA,IACAY;AAAA,EAAA,GAEIK,IAA2BF;AAAA,IAC/Bd;AAAA,IACAW;AAAA,EAAA,GAEIM,IAA0BH;AAAA,IAC9Bb;AAAA,IACAU;AAAA,EAAA,GAEIO,IAAuBJ;AAAA,IAC3BZ;AAAA,IACAS;AAAA,EAAA,GAEIQ,IAAyBL;AAAA,IAC7BX;AAAA,IACAQ;AAAA,EAAA,GAGIS,IAAQT,GAAmB,YAAa,aAAa,KAAK;AAAA,IAC9D,CAACU,MAA0B;AACzB,YAAMC,IAASD,EAAG;AAClB,MAAIC,EAAO,KAAK,CAAAC,MAASA,MAAU,IAAI,KAErC,QAAQ,KAAK,8CAA8C;AAG7D,YAAMC,IAAQF,EAAOT,CAAgB,GAC/BY,IAAcH,EAAOP,CAAsB,GAC3CW,IAAgBJ,EAAON,CAAwB,GAC/CW,IAAeL,EAAOL,CAAuB,KAAK,IAClDW,IAA6BN,EAAOJ,CAAoB,KAAK,IAC7DW,IAA+BP,EAAOH,CAAsB,KAAK,IAEjEW,IAAiC,CAAA;AACvC,MAAAnB,GAAmB,YAAa,aAAa,QAAQ;AAAA,QACnD,CAACoB,GAAQC,MAAa;AACpB,UAAAF,EAAOC,EAAO,IAAI,IAAIC;AAAA,QACxB;AAAA,MAAA;AAEF,YAAM,EAAE,MAAAC,EAAA,IAASC,EAAcP,GAActB,GAAYiB,GAAQQ,CAAM,GAEjEK,IAAiCC;AAAA,QACrC9B,EAAO;AAAA,QACPsB;AAAA,QACA,MAAMP,EAAG,KAAK;AAAA,MAAA,GAGVgB,IAAYF,IAChB,gBAAAG;AAAA,QAACC;AAAA,QAAA;AAAA,UACC,uBAAuBJ;AAAA,QAAA;AAAA,MAAA,IAEvB,QAEEK,IAAmCJ;AAAA,QACvC9B,EAAO;AAAA,QACPuB;AAAA,QACA,MAAMR,EAAG,KAAK;AAAA,MAAA;AAShB,aAAO;AAAA,QACL,OAAAG;AAAA,QACA,aAAAC;AAAA,QACA,eAAAC;AAAA,QACA,cAAcO;AAAA,QACd,WAAAI;AAAA,QACA,aAZkBG,IAClB,gBAAAF;AAAA,UAACC;AAAA,UAAA;AAAA,YACC,uBAAuBC;AAAA,UAAA;AAAA,QAAA,IAEvB;AAAA,QASF,cAAApC;AAAA,MAAA;AAAA,IAEJ;AAAA,EAAA;AAGF,2BAAQqC,GAAA,EAAS,OAAOrB,KAAS,CAAA,GAAI,cAAAhB,GAA4B;AACnE;"}
@@ -38,7 +38,6 @@ import "@react-hookz/web";
38
38
  import "dayjs";
39
39
  import "../styled/StyledFormControl.js";
40
40
  import { TOTP_GUIDANCE_TEXT as v, RECOVERY_CODE_GUIDANCE_TEXT_SHORT as B } from "../Authentication/Constants.js";
41
- import "../../assets/ArcusBioIcon.svg.js";
42
41
  import "@mui/material/SvgIcon";
43
42
  import "../../assets/icons/AccessPending.svg.js";
44
43
  import "../../assets/icons/AccessPendingCloud.svg.js";
@@ -61,7 +60,7 @@ import "react-hot-toast";
61
60
  import "react-transition-group";
62
61
  import "../Authentication/RecoveryCodeGrid.js";
63
62
  const H = "Two-factor authentication is required to change your password. Your password has not yet been changed.";
64
- function $o(p) {
63
+ function Zo(p) {
65
64
  const _ = W("/reset2FA"), w = Y(
66
65
  _,
67
66
  "twoFAResetToken"
@@ -179,6 +178,6 @@ function $o(p) {
179
178
  }
180
179
  export {
181
180
  H as TWO_FACTOR_AUTH_CHANGE_PASSWORD_PROMPT,
182
- $o as default
181
+ Zo as default
183
182
  };
184
183
  //# sourceMappingURL=useChangePasswordFormState.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useChangePasswordFormState.js","sources":["../../../src/components/ChangePassword/useChangePasswordFormState.tsx"],"sourcesContent":["import { useChangePassword, useResetTwoFactorAuth } from '@/synapse-queries'\nimport appendFinalQueryParamKey from '@/utils/appendFinalQueryParamKey'\nimport { useOneSageURL } from '@/utils/hooks'\nimport { Alert, Typography } from '@mui/material'\nimport { TwoFactorAuthErrorResponse } from '@sage-bionetworks/synapse-client/generated/models/TwoFactorAuthErrorResponse'\nimport {\n ChangePasswordWithCurrentPassword,\n ChangePasswordWithToken as ChangePasswordWithTokenObject,\n ChangePasswordWithTwoFactorAuthToken,\n PasswordResetSignedToken,\n TwoFactorAuthOtpType,\n TwoFactorAuthResetRequest,\n} from '@sage-bionetworks/synapse-types'\nimport { useCallback, useState } from 'react'\nimport { ONE_TIME_PASSWORD_STEP, OneTimePasswordForm } from '../Authentication'\nimport {\n RECOVERY_CODE_GUIDANCE_TEXT_SHORT,\n TOTP_GUIDANCE_TEXT,\n} from '../Authentication/Constants'\n\nexport const TWO_FACTOR_AUTH_CHANGE_PASSWORD_PROMPT =\n 'Two-factor authentication is required to change your password. Your password has not yet been changed.'\n\nexport type UseChangePasswordFormStateOptions = {\n hideReset2FA?: boolean\n onChangePasswordSuccess?: () => void\n}\n\n/**\n * Hook that handles submitting a change password request and prompting the user for 2FA if necessary.\n * @param options\n */\nexport default function useChangePasswordFormState(\n options?: UseChangePasswordFormStateOptions,\n) {\n const defaultTwoFactorAuthResetUrl = useOneSageURL('/reset2FA')\n const twoFactorAuthResetUri = appendFinalQueryParamKey(\n defaultTwoFactorAuthResetUrl,\n 'twoFAResetToken',\n )\n\n // Store current and new password in state so that we can re-use it if 2FA is required\n const [currentPassword, setCurrentPassword] = useState<string>('')\n const [newPassword, setNewPassword] = useState<string>('')\n const [twoFactorAuthErrorResponse, setTwoFactorAuthErrorResponse] = useState<\n TwoFactorAuthErrorResponse | undefined\n >()\n const [otpStep, setOtpStep] =\n useState<ONE_TIME_PASSWORD_STEP>('VERIFICATION_CODE')\n const [successfullyChangedPassword, setSuccessfullyChangedPassword] =\n useState(false)\n const {\n mutate: changePassword,\n isPending,\n error,\n } = useChangePassword({\n onSuccess: maybeTwoFactorResponse => {\n if (maybeTwoFactorResponse) {\n // We store the 2FA Error Response in state because the `changePasswordResult` may change before we are done with the 2FA code,\n // e.g. if the user enters the wrong 2FA code\n setTwoFactorAuthErrorResponse(maybeTwoFactorResponse)\n } else {\n setSuccessfullyChangedPassword(true)\n setTwoFactorAuthErrorResponse(undefined)\n if (options?.onChangePasswordSuccess) {\n options.onChangePasswordSuccess()\n }\n }\n },\n })\n\n const handleChangePasswordWithCurrentPassword = useCallback(\n (username: string, currentPassword: string, newPassword: string) => {\n setCurrentPassword(currentPassword)\n setNewPassword(newPassword)\n const changeRequest: ChangePasswordWithCurrentPassword = {\n username,\n currentPassword,\n newPassword,\n concreteType:\n 'org.sagebionetworks.repo.model.auth.ChangePasswordWithCurrentPassword',\n }\n changePassword(changeRequest)\n },\n [changePassword],\n )\n\n const handleChangePasswordWithResetToken = useCallback(\n (newPassword: string, passwordChangeToken: PasswordResetSignedToken) => {\n setNewPassword(newPassword)\n const changeRequest: ChangePasswordWithTokenObject = {\n newPassword,\n concreteType:\n 'org.sagebionetworks.repo.model.auth.ChangePasswordWithToken',\n passwordChangeToken: passwordChangeToken,\n }\n changePassword(changeRequest)\n },\n [changePassword],\n )\n\n const handleChangePasswordWithOtp = useCallback(\n (newPassword: string, code: string, otpType: TwoFactorAuthOtpType) => {\n if (twoFactorAuthErrorResponse) {\n const changeRequest: ChangePasswordWithTwoFactorAuthToken = {\n newPassword,\n concreteType:\n 'org.sagebionetworks.repo.model.auth.ChangePasswordWithTwoFactorAuthToken',\n userId: twoFactorAuthErrorResponse.userId!,\n twoFaToken: twoFactorAuthErrorResponse.twoFaToken!,\n otpType: otpType,\n otpCode: code,\n }\n changePassword(changeRequest)\n }\n },\n [changePassword, twoFactorAuthErrorResponse],\n )\n const promptForTwoFactorAuth = Boolean(twoFactorAuthErrorResponse)\n const {\n mutate: resetTwoFactorAuth,\n isSuccess: twoFactorAuthResetIsSuccess,\n isPending: twoFactorAuthResetIsPending,\n } = useResetTwoFactorAuth()\n\n const beginTwoFactorAuthReset = useCallback(\n (twoFaResetEndpoint: string) => {\n if (twoFactorAuthErrorResponse) {\n const request: TwoFactorAuthResetRequest = {\n userId: twoFactorAuthErrorResponse.userId!,\n twoFaResetEndpoint: twoFaResetEndpoint,\n // When attempting to reset 2FA while resetting a password, the current password must be used to request 2FA reset\n password: currentPassword,\n }\n resetTwoFactorAuth(request)\n }\n },\n [currentPassword, resetTwoFactorAuth, twoFactorAuthErrorResponse],\n )\n\n const TwoFactorAuthPrompt = useCallback(() => {\n if (!promptForTwoFactorAuth) {\n return <></>\n }\n return (\n <>\n {otpStep === 'VERIFICATION_CODE' && (\n <Typography variant={'body1'} sx={{ my: 2 }} align={'center'}>\n {TOTP_GUIDANCE_TEXT}\n </Typography>\n )}\n {otpStep === 'RECOVERY_CODE' && (\n <Typography variant={'body1'} sx={{ my: 2 }} align={'center'}>\n {RECOVERY_CODE_GUIDANCE_TEXT_SHORT}\n </Typography>\n )}\n <OneTimePasswordForm\n step={otpStep}\n onClickUseTOTP={() => {\n setOtpStep('VERIFICATION_CODE')\n }}\n onClickUseBackupCode={() => {\n setOtpStep('RECOVERY_CODE')\n }}\n loginIsPending={isPending}\n onSubmit={(code, otpType) =>\n handleChangePasswordWithOtp(newPassword, code, otpType)\n }\n hideReset2FA={options?.hideReset2FA}\n onClickPromptReset2FA={() => {\n setOtpStep('DISABLE_2FA_PROMPT')\n }}\n onClickReset2FA={() => {\n beginTwoFactorAuthReset(twoFactorAuthResetUri)\n }}\n twoFactorAuthResetIsPending={twoFactorAuthResetIsPending}\n twoFactorAuthResetIsSuccess={twoFactorAuthResetIsSuccess}\n />\n {(otpStep === 'RECOVERY_CODE' || otpStep === 'VERIFICATION_CODE') && (\n <Alert severity={'info'} sx={{ my: 2 }}>\n {TWO_FACTOR_AUTH_CHANGE_PASSWORD_PROMPT}\n </Alert>\n )}\n {otpStep === 'DISABLE_2FA_PROMPT' && twoFactorAuthResetIsSuccess && (\n <Alert severity={'warning'} sx={{ my: 2 }}>\n <strong>Your password has not been changed.</strong> To disable\n two-factor authentication, you may be required to enter your current\n password after clicking the link sent to your email address.\n </Alert>\n )}\n </>\n )\n }, [\n beginTwoFactorAuthReset,\n handleChangePasswordWithOtp,\n isPending,\n newPassword,\n options?.hideReset2FA,\n otpStep,\n promptForTwoFactorAuth,\n twoFactorAuthResetIsPending,\n twoFactorAuthResetIsSuccess,\n twoFactorAuthResetUri,\n ])\n\n return {\n successfullyChangedPassword,\n isPending,\n error,\n promptForTwoFactorAuth,\n TwoFactorAuthPrompt: TwoFactorAuthPrompt,\n handleChangePasswordWithCurrentPassword,\n handleChangePasswordWithResetToken,\n }\n}\n"],"names":["TWO_FACTOR_AUTH_CHANGE_PASSWORD_PROMPT","useChangePasswordFormState","options","defaultTwoFactorAuthResetUrl","useOneSageURL","twoFactorAuthResetUri","appendFinalQueryParamKey","currentPassword","setCurrentPassword","useState","newPassword","setNewPassword","twoFactorAuthErrorResponse","setTwoFactorAuthErrorResponse","otpStep","setOtpStep","successfullyChangedPassword","setSuccessfullyChangedPassword","changePassword","isPending","error","useChangePassword","maybeTwoFactorResponse","handleChangePasswordWithCurrentPassword","useCallback","username","handleChangePasswordWithResetToken","passwordChangeToken","handleChangePasswordWithOtp","code","otpType","changeRequest","promptForTwoFactorAuth","resetTwoFactorAuth","twoFactorAuthResetIsSuccess","twoFactorAuthResetIsPending","useResetTwoFactorAuth","beginTwoFactorAuthReset","twoFaResetEndpoint","request","TwoFactorAuthPrompt","jsxs","Fragment","jsx","Typography","TOTP_GUIDANCE_TEXT","RECOVERY_CODE_GUIDANCE_TEXT_SHORT","OneTimePasswordForm","Alert"],"mappings":"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"}
1
+ {"version":3,"file":"useChangePasswordFormState.js","sources":["../../../src/components/ChangePassword/useChangePasswordFormState.tsx"],"sourcesContent":["import { useChangePassword, useResetTwoFactorAuth } from '@/synapse-queries'\nimport appendFinalQueryParamKey from '@/utils/appendFinalQueryParamKey'\nimport { useOneSageURL } from '@/utils/hooks'\nimport { Alert, Typography } from '@mui/material'\nimport { TwoFactorAuthErrorResponse } from '@sage-bionetworks/synapse-client/generated/models/TwoFactorAuthErrorResponse'\nimport {\n ChangePasswordWithCurrentPassword,\n ChangePasswordWithToken as ChangePasswordWithTokenObject,\n ChangePasswordWithTwoFactorAuthToken,\n PasswordResetSignedToken,\n TwoFactorAuthOtpType,\n TwoFactorAuthResetRequest,\n} from '@sage-bionetworks/synapse-types'\nimport { useCallback, useState } from 'react'\nimport { ONE_TIME_PASSWORD_STEP, OneTimePasswordForm } from '../Authentication'\nimport {\n RECOVERY_CODE_GUIDANCE_TEXT_SHORT,\n TOTP_GUIDANCE_TEXT,\n} from '../Authentication/Constants'\n\nexport const TWO_FACTOR_AUTH_CHANGE_PASSWORD_PROMPT =\n 'Two-factor authentication is required to change your password. Your password has not yet been changed.'\n\nexport type UseChangePasswordFormStateOptions = {\n hideReset2FA?: boolean\n onChangePasswordSuccess?: () => void\n}\n\n/**\n * Hook that handles submitting a change password request and prompting the user for 2FA if necessary.\n * @param options\n */\nexport default function useChangePasswordFormState(\n options?: UseChangePasswordFormStateOptions,\n) {\n const defaultTwoFactorAuthResetUrl = useOneSageURL('/reset2FA')\n const twoFactorAuthResetUri = appendFinalQueryParamKey(\n defaultTwoFactorAuthResetUrl,\n 'twoFAResetToken',\n )\n\n // Store current and new password in state so that we can re-use it if 2FA is required\n const [currentPassword, setCurrentPassword] = useState<string>('')\n const [newPassword, setNewPassword] = useState<string>('')\n const [twoFactorAuthErrorResponse, setTwoFactorAuthErrorResponse] = useState<\n TwoFactorAuthErrorResponse | undefined\n >()\n const [otpStep, setOtpStep] =\n useState<ONE_TIME_PASSWORD_STEP>('VERIFICATION_CODE')\n const [successfullyChangedPassword, setSuccessfullyChangedPassword] =\n useState(false)\n const {\n mutate: changePassword,\n isPending,\n error,\n } = useChangePassword({\n onSuccess: maybeTwoFactorResponse => {\n if (maybeTwoFactorResponse) {\n // We store the 2FA Error Response in state because the `changePasswordResult` may change before we are done with the 2FA code,\n // e.g. if the user enters the wrong 2FA code\n setTwoFactorAuthErrorResponse(maybeTwoFactorResponse)\n } else {\n setSuccessfullyChangedPassword(true)\n setTwoFactorAuthErrorResponse(undefined)\n if (options?.onChangePasswordSuccess) {\n options.onChangePasswordSuccess()\n }\n }\n },\n })\n\n const handleChangePasswordWithCurrentPassword = useCallback(\n (username: string, currentPassword: string, newPassword: string) => {\n setCurrentPassword(currentPassword)\n setNewPassword(newPassword)\n const changeRequest: ChangePasswordWithCurrentPassword = {\n username,\n currentPassword,\n newPassword,\n concreteType:\n 'org.sagebionetworks.repo.model.auth.ChangePasswordWithCurrentPassword',\n }\n changePassword(changeRequest)\n },\n [changePassword],\n )\n\n const handleChangePasswordWithResetToken = useCallback(\n (newPassword: string, passwordChangeToken: PasswordResetSignedToken) => {\n setNewPassword(newPassword)\n const changeRequest: ChangePasswordWithTokenObject = {\n newPassword,\n concreteType:\n 'org.sagebionetworks.repo.model.auth.ChangePasswordWithToken',\n passwordChangeToken: passwordChangeToken,\n }\n changePassword(changeRequest)\n },\n [changePassword],\n )\n\n const handleChangePasswordWithOtp = useCallback(\n (newPassword: string, code: string, otpType: TwoFactorAuthOtpType) => {\n if (twoFactorAuthErrorResponse) {\n const changeRequest: ChangePasswordWithTwoFactorAuthToken = {\n newPassword,\n concreteType:\n 'org.sagebionetworks.repo.model.auth.ChangePasswordWithTwoFactorAuthToken',\n userId: twoFactorAuthErrorResponse.userId!,\n twoFaToken: twoFactorAuthErrorResponse.twoFaToken!,\n otpType: otpType,\n otpCode: code,\n }\n changePassword(changeRequest)\n }\n },\n [changePassword, twoFactorAuthErrorResponse],\n )\n const promptForTwoFactorAuth = Boolean(twoFactorAuthErrorResponse)\n const {\n mutate: resetTwoFactorAuth,\n isSuccess: twoFactorAuthResetIsSuccess,\n isPending: twoFactorAuthResetIsPending,\n } = useResetTwoFactorAuth()\n\n const beginTwoFactorAuthReset = useCallback(\n (twoFaResetEndpoint: string) => {\n if (twoFactorAuthErrorResponse) {\n const request: TwoFactorAuthResetRequest = {\n userId: twoFactorAuthErrorResponse.userId!,\n twoFaResetEndpoint: twoFaResetEndpoint,\n // When attempting to reset 2FA while resetting a password, the current password must be used to request 2FA reset\n password: currentPassword,\n }\n resetTwoFactorAuth(request)\n }\n },\n [currentPassword, resetTwoFactorAuth, twoFactorAuthErrorResponse],\n )\n\n const TwoFactorAuthPrompt = useCallback(() => {\n if (!promptForTwoFactorAuth) {\n return <></>\n }\n return (\n <>\n {otpStep === 'VERIFICATION_CODE' && (\n <Typography variant={'body1'} sx={{ my: 2 }} align={'center'}>\n {TOTP_GUIDANCE_TEXT}\n </Typography>\n )}\n {otpStep === 'RECOVERY_CODE' && (\n <Typography variant={'body1'} sx={{ my: 2 }} align={'center'}>\n {RECOVERY_CODE_GUIDANCE_TEXT_SHORT}\n </Typography>\n )}\n <OneTimePasswordForm\n step={otpStep}\n onClickUseTOTP={() => {\n setOtpStep('VERIFICATION_CODE')\n }}\n onClickUseBackupCode={() => {\n setOtpStep('RECOVERY_CODE')\n }}\n loginIsPending={isPending}\n onSubmit={(code, otpType) =>\n handleChangePasswordWithOtp(newPassword, code, otpType)\n }\n hideReset2FA={options?.hideReset2FA}\n onClickPromptReset2FA={() => {\n setOtpStep('DISABLE_2FA_PROMPT')\n }}\n onClickReset2FA={() => {\n beginTwoFactorAuthReset(twoFactorAuthResetUri)\n }}\n twoFactorAuthResetIsPending={twoFactorAuthResetIsPending}\n twoFactorAuthResetIsSuccess={twoFactorAuthResetIsSuccess}\n />\n {(otpStep === 'RECOVERY_CODE' || otpStep === 'VERIFICATION_CODE') && (\n <Alert severity={'info'} sx={{ my: 2 }}>\n {TWO_FACTOR_AUTH_CHANGE_PASSWORD_PROMPT}\n </Alert>\n )}\n {otpStep === 'DISABLE_2FA_PROMPT' && twoFactorAuthResetIsSuccess && (\n <Alert severity={'warning'} sx={{ my: 2 }}>\n <strong>Your password has not been changed.</strong> To disable\n two-factor authentication, you may be required to enter your current\n password after clicking the link sent to your email address.\n </Alert>\n )}\n </>\n )\n }, [\n beginTwoFactorAuthReset,\n handleChangePasswordWithOtp,\n isPending,\n newPassword,\n options?.hideReset2FA,\n otpStep,\n promptForTwoFactorAuth,\n twoFactorAuthResetIsPending,\n twoFactorAuthResetIsSuccess,\n twoFactorAuthResetUri,\n ])\n\n return {\n successfullyChangedPassword,\n isPending,\n error,\n promptForTwoFactorAuth,\n TwoFactorAuthPrompt: TwoFactorAuthPrompt,\n handleChangePasswordWithCurrentPassword,\n handleChangePasswordWithResetToken,\n }\n}\n"],"names":["TWO_FACTOR_AUTH_CHANGE_PASSWORD_PROMPT","useChangePasswordFormState","options","defaultTwoFactorAuthResetUrl","useOneSageURL","twoFactorAuthResetUri","appendFinalQueryParamKey","currentPassword","setCurrentPassword","useState","newPassword","setNewPassword","twoFactorAuthErrorResponse","setTwoFactorAuthErrorResponse","otpStep","setOtpStep","successfullyChangedPassword","setSuccessfullyChangedPassword","changePassword","isPending","error","useChangePassword","maybeTwoFactorResponse","handleChangePasswordWithCurrentPassword","useCallback","username","handleChangePasswordWithResetToken","passwordChangeToken","handleChangePasswordWithOtp","code","otpType","changeRequest","promptForTwoFactorAuth","resetTwoFactorAuth","twoFactorAuthResetIsSuccess","twoFactorAuthResetIsPending","useResetTwoFactorAuth","beginTwoFactorAuthReset","twoFaResetEndpoint","request","TwoFactorAuthPrompt","jsxs","Fragment","jsx","Typography","TOTP_GUIDANCE_TEXT","RECOVERY_CODE_GUIDANCE_TEXT_SHORT","OneTimePasswordForm","Alert"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ ._container_36spd_1{display:flex;justify-content:start;align-items:center;gap:10px;margin-top:16px}._bullet_36spd_9{width:21px;height:21px;border-radius:50%;border:4px solid;flex-shrink:0}._mainText_36spd_17{font-size:16px;font-weight:700}@media(min-width:768px){._mainText_36spd_17{font-size:18px}}._subText_36spd_27{font-size:14px;line-height:144%}
@@ -0,0 +1,8 @@
1
+ export type ColoredBulletListItemProps = {
2
+ bulletColor: string;
3
+ mainText: string;
4
+ subText: string;
5
+ };
6
+ declare function ColoredBulletListItem(props: ColoredBulletListItemProps): import("react/jsx-runtime").JSX.Element;
7
+ export default ColoredBulletListItem;
8
+ //# sourceMappingURL=ColoredBulletListItem.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ColoredBulletListItem.d.ts","sourceRoot":"","sources":["../../../src/components/ColoredBulletListItem/ColoredBulletListItem.tsx"],"names":[],"mappings":"AAGA,MAAM,MAAM,0BAA0B,GAAG;IACvC,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,iBAAS,qBAAqB,CAAC,KAAK,EAAE,0BAA0B,2CAiB/D;AAED,eAAe,qBAAqB,CAAA"}
@@ -0,0 +1,21 @@
1
+ import { jsxs as i, jsx as r } from "react/jsx-runtime";
2
+ import { Typography as t } from "@mui/material";
3
+ import e from "./ColoredBulletListItem.module.scss.js";
4
+ function d(l) {
5
+ const { bulletColor: o, mainText: a, subText: s } = l;
6
+ return /* @__PURE__ */ i("div", { className: e.container, children: [
7
+ /* @__PURE__ */ r(
8
+ "div",
9
+ {
10
+ className: e.bullet,
11
+ style: { borderColor: o, backgroundColor: o }
12
+ }
13
+ ),
14
+ /* @__PURE__ */ r(t, { variant: "headline1", className: e.mainText, children: a }),
15
+ /* @__PURE__ */ r(t, { variant: "body1", className: e.subText, children: s })
16
+ ] });
17
+ }
18
+ export {
19
+ d as default
20
+ };
21
+ //# sourceMappingURL=ColoredBulletListItem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ColoredBulletListItem.js","sources":["../../../src/components/ColoredBulletListItem/ColoredBulletListItem.tsx"],"sourcesContent":["import { Typography } from '@mui/material'\nimport styles from './ColoredBulletListItem.module.scss'\n\nexport type ColoredBulletListItemProps = {\n bulletColor: string\n mainText: string\n subText: string\n}\n\nfunction ColoredBulletListItem(props: ColoredBulletListItemProps) {\n const { bulletColor, mainText, subText } = props\n\n return (\n <div className={styles.container}>\n <div\n className={styles.bullet}\n style={{ borderColor: bulletColor, backgroundColor: bulletColor }}\n />\n <Typography variant=\"headline1\" className={styles.mainText}>\n {mainText}\n </Typography>\n <Typography variant=\"body1\" className={styles.subText}>\n {subText}\n </Typography>\n </div>\n )\n}\n\nexport default ColoredBulletListItem\n"],"names":["ColoredBulletListItem","props","bulletColor","mainText","subText","jsxs","styles","jsx","Typography"],"mappings":";;;AASA,SAASA,EAAsBC,GAAmC;AAChE,QAAM,EAAE,aAAAC,GAAa,UAAAC,GAAU,SAAAC,EAAA,IAAYH;AAE3C,SACE,gBAAAI,EAAC,OAAA,EAAI,WAAWC,EAAO,WACrB,UAAA;AAAA,IAAA,gBAAAC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAWD,EAAO;AAAA,QAClB,OAAO,EAAE,aAAaJ,GAAa,iBAAiBA,EAAA;AAAA,MAAY;AAAA,IAAA;AAAA,sBAEjEM,GAAA,EAAW,SAAQ,aAAY,WAAWF,EAAO,UAC/C,UAAAH,GACH;AAAA,sBACCK,GAAA,EAAW,SAAQ,SAAQ,WAAWF,EAAO,SAC3C,UAAAF,EAAA,CACH;AAAA,EAAA,GACF;AAEJ;"}
@@ -0,0 +1,32 @@
1
+ @use '../../style/abstracts/variables' as SrcVariables;
2
+ @use 'sass:map';
3
+
4
+ .container {
5
+ display: flex;
6
+ justify-content: start;
7
+ align-items: center;
8
+ gap: 10px;
9
+ margin-top: 16px;
10
+ }
11
+
12
+ .bullet {
13
+ width: 21px;
14
+ height: 21px;
15
+ border-radius: 50%;
16
+ border: 4px solid;
17
+ flex-shrink: 0;
18
+ }
19
+
20
+ .mainText {
21
+ font-size: 16px;
22
+ font-weight: bold;
23
+
24
+ @media (min-width: map.get(SrcVariables.$breakpoints, 'medium')) {
25
+ font-size: 18px;
26
+ }
27
+ }
28
+
29
+ .subText {
30
+ font-size: 14px;
31
+ line-height: 144%;
32
+ }
@@ -0,0 +1,14 @@
1
+ import './ColoredBulletListItem.css';const t = "_container_36spd_1", e = "_bullet_36spd_9", s = "_mainText_36spd_17", n = "_subText_36spd_27", _ = {
2
+ container: t,
3
+ bullet: e,
4
+ mainText: s,
5
+ subText: n
6
+ };
7
+ export {
8
+ e as bullet,
9
+ t as container,
10
+ _ as default,
11
+ s as mainText,
12
+ n as subText
13
+ };
14
+ //# sourceMappingURL=ColoredBulletListItem.module.scss.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ColoredBulletListItem.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -0,0 +1,5 @@
1
+ import ColoredBulletListItem from './ColoredBulletListItem';
2
+ import type { ColoredBulletListItemProps } from './ColoredBulletListItem';
3
+ export { ColoredBulletListItem, ColoredBulletListItemProps };
4
+ export default ColoredBulletListItem;
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/ColoredBulletListItem/index.ts"],"names":[],"mappings":"AAAA,OAAO,qBAAqB,MAAM,yBAAyB,CAAA;AAC3D,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAA;AACzE,OAAO,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,CAAA;AAC5D,eAAe,qBAAqB,CAAA"}
@@ -0,0 +1,6 @@
1
+ import e from "./ColoredBulletListItem.js";
2
+ export {
3
+ e as ColoredBulletListItem,
4
+ e as default
5
+ };
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -35,7 +35,6 @@ import "../Markdown/MarkdownSynapse.js";
35
35
  import "@mui/icons-material/Close";
36
36
  import "../styled/StyledPopover.js";
37
37
  import "@mui/icons-material";
38
- import "../../assets/ArcusBioIcon.svg.js";
39
38
  import "@mui/material/SvgIcon";
40
39
  import "../../assets/icons/AccessPending.svg.js";
41
40
  import "../../assets/icons/AccessPendingCloud.svg.js";
@@ -56,7 +55,7 @@ import "react-transition-group";
56
55
  import { SetBasicAccessRequirementFields as F } from "../SetBasicAccessRequirementFields/SetBasicAccessRequirementFields.js";
57
56
  import { SetManagedAccessRequirementFields as N } from "../SetManagedAccessRequirementFields/SetManagedAccessRequirementFields.js";
58
57
  import { getDialogTitle as q, isLastStep as v } from "./CreateOrUpdateAccessRequirementWizardUtils.js";
59
- function be(t) {
58
+ function xe(t) {
60
59
  const { open: E, onCancel: u, onComplete: n } = t, [o, p] = c(
61
60
  "SET_AR_COMMON_FIELDS"
62
61
  ), [l, e] = c(!1), [r, R] = c(t.accessRequirementId), a = s(null), S = s(null), A = s(null), _ = s(null), f = !!t.accessRequirementId, d = M(() => {
@@ -150,7 +149,7 @@ function be(t) {
150
149
  );
151
150
  }
152
151
  export {
153
- be as CreateOrUpdateAccessRequirementWizard,
154
- be as default
152
+ xe as CreateOrUpdateAccessRequirementWizard,
153
+ xe as default
155
154
  };
156
155
  //# sourceMappingURL=CreateOrUpdateAccessRequirementWizard.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CreateOrUpdateAccessRequirementWizard.js","sources":["../../../src/components/CreateOrUpdateAccessRequirementWizard/CreateOrUpdateAccessRequirementWizard.tsx"],"sourcesContent":["import { MANAGED_ACT_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE } from '@sage-bionetworks/synapse-types'\nimport { MouseEventHandler, useMemo, useRef, useState } from 'react'\nimport {\n AccessRequirementAclEditor,\n AccessRequirementAclEditorHandle,\n} from '../AccessRequirementAclEditor/AccessRequirementAclEditor'\nimport ConfirmationDialog from '../ConfirmationDialog'\nimport {\n SetAccessRequirementCommonFields,\n SetAccessRequirementCommonFieldsHandle,\n SetAccessRequirementCommonFieldsProps,\n} from '../SetAccessRequirementCommonFields'\nimport SetBasicAccessRequirementFields, {\n SetBasicAccessRequirementFieldsHandle,\n} from '../SetBasicAccessRequirementFields'\nimport SetManagedAccessRequirementFields, {\n SetManagedAccessRequirementFieldsHandle,\n} from '../SetManagedAccessRequirementFields'\nimport {\n CreateOrUpdateAccessRequirementWizardStep,\n getDialogTitle,\n isLastStep,\n} from './CreateOrUpdateAccessRequirementWizardUtils'\n\nexport type CreateOrUpdateAccessRequirementWizardProps = {\n open: boolean\n onCancel: () => void\n onComplete: (accessRequirementID?: string) => void // return the (possibly new) Access Requirement ID\n} & Pick<\n SetAccessRequirementCommonFieldsProps,\n 'subject' | 'accessRequirementId'\n>\n\nexport function CreateOrUpdateAccessRequirementWizard(\n props: CreateOrUpdateAccessRequirementWizardProps,\n) {\n const { open, onCancel, onComplete } = props\n\n const [step, setStep] = useState<CreateOrUpdateAccessRequirementWizardStep>(\n 'SET_AR_COMMON_FIELDS',\n )\n const [isLoading, setIsLoading] = useState<boolean>(false)\n const [accessRequirementId, setAccessRequirementId] = useState<\n string | undefined\n >(props.accessRequirementId)\n\n const setArCommonFieldsRef =\n useRef<SetAccessRequirementCommonFieldsHandle>(null)\n const setManagedArFieldsRef =\n useRef<SetManagedAccessRequirementFieldsHandle>(null)\n const editArAclRef = useRef<AccessRequirementAclEditorHandle>(null)\n const setBasicArFieldsRef =\n useRef<SetBasicAccessRequirementFieldsHandle>(null)\n\n const isEditing = Boolean(props['accessRequirementId'])\n\n const stepContent = useMemo(() => {\n switch (step) {\n case 'SET_AR_COMMON_FIELDS':\n return (\n <SetAccessRequirementCommonFields\n ref={setArCommonFieldsRef}\n onSave={(accessRequirementId, accessRequirementConcreteType) => {\n setAccessRequirementId(accessRequirementId)\n const nextStep: CreateOrUpdateAccessRequirementWizardStep =\n accessRequirementConcreteType ===\n MANAGED_ACT_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE\n ? 'SET_MANAGED_AR_FIELDS'\n : 'SET_BASIC_AR_FIELDS'\n setStep(nextStep)\n setIsLoading(false)\n }}\n onError={() => setIsLoading(false)}\n subject={props.subject}\n accessRequirementId={props.accessRequirementId}\n />\n )\n case 'SET_MANAGED_AR_FIELDS':\n return (\n <SetManagedAccessRequirementFields\n ref={setManagedArFieldsRef}\n accessRequirementId={accessRequirementId!}\n onSave={() => {\n setStep('SET_MANAGED_AR_ACL_PERMISSIONS')\n setIsLoading(false)\n }}\n onError={() => {\n setIsLoading(false)\n }}\n />\n )\n case 'SET_MANAGED_AR_ACL_PERMISSIONS':\n return (\n <AccessRequirementAclEditor\n ref={editArAclRef}\n accessRequirementId={accessRequirementId!}\n onSaveComplete={saveSuccessful => {\n if (saveSuccessful) {\n onComplete(accessRequirementId)\n }\n setIsLoading(false)\n }}\n />\n )\n case 'SET_BASIC_AR_FIELDS':\n return (\n <SetBasicAccessRequirementFields\n ref={setBasicArFieldsRef}\n accessRequirementId={accessRequirementId!}\n onSave={() => {\n onComplete(accessRequirementId)\n setIsLoading(false)\n }}\n onError={() => setIsLoading(false)}\n />\n )\n }\n }, [\n step,\n props.subject,\n props.accessRequirementId,\n accessRequirementId,\n onComplete,\n ])\n\n const onClickPrimary: MouseEventHandler<HTMLButtonElement> = e => {\n // SWC-7055 - The default action may trigger `beforeunload` and erroneously warn the user about leaving the page.\n e.preventDefault()\n setIsLoading(true)\n switch (step) {\n case 'SET_AR_COMMON_FIELDS':\n setArCommonFieldsRef?.current?.save()\n return\n case 'SET_MANAGED_AR_FIELDS':\n setManagedArFieldsRef?.current?.save()\n return\n case 'SET_MANAGED_AR_ACL_PERMISSIONS':\n editArAclRef?.current?.save()\n return\n case 'SET_BASIC_AR_FIELDS':\n setBasicArFieldsRef?.current?.save()\n }\n }\n\n return (\n <ConfirmationDialog\n open={open}\n onCancel={onCancel}\n onConfirm={onClickPrimary}\n confirmButtonProps={{\n children: isLastStep(step) ? 'Save' : 'Save & Continue',\n disabled: isLoading,\n }}\n maxWidth={'md'}\n title={getDialogTitle(step, isEditing)}\n content={stepContent}\n />\n )\n}\n\nexport default CreateOrUpdateAccessRequirementWizard\n"],"names":["CreateOrUpdateAccessRequirementWizard","props","open","onCancel","onComplete","step","setStep","useState","isLoading","setIsLoading","accessRequirementId","setAccessRequirementId","setArCommonFieldsRef","useRef","setManagedArFieldsRef","editArAclRef","setBasicArFieldsRef","isEditing","stepContent","useMemo","jsx","SetAccessRequirementCommonFields","accessRequirementConcreteType","MANAGED_ACT_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE","SetManagedAccessRequirementFields","AccessRequirementAclEditor","saveSuccessful","SetBasicAccessRequirementFields","ConfirmationDialog","e","isLastStep","getDialogTitle"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiCO,SAASA,GACdC,GACA;AACA,QAAM,EAAE,MAAAC,GAAM,UAAAC,GAAU,YAAAC,EAAA,IAAeH,GAEjC,CAACI,GAAMC,CAAO,IAAIC;AAAA,IACtB;AAAA,EAAA,GAEI,CAACC,GAAWC,CAAY,IAAIF,EAAkB,EAAK,GACnD,CAACG,GAAqBC,CAAsB,IAAIJ,EAEpDN,EAAM,mBAAmB,GAErBW,IACJC,EAA+C,IAAI,GAC/CC,IACJD,EAAgD,IAAI,GAChDE,IAAeF,EAAyC,IAAI,GAC5DG,IACJH,EAA8C,IAAI,GAE9CI,IAAY,EAAQhB,EAAM,qBAE1BiB,IAAcC,EAAQ,MAAM;AAChC,YAAQd,GAAA;AAAA,MACN,KAAK;AACH,eACE,gBAAAe;AAAA,UAACC;AAAA,UAAA;AAAA,YACC,KAAKT;AAAA,YACL,QAAQ,CAACF,GAAqBY,MAAkC;AAC9D,cAAAX,EAAuBD,CAAmB,GAM1CJ,EAJEgB,MACAC,IACI,0BACA,qBACU,GAChBd,EAAa,EAAK;AAAA,YACpB;AAAA,YACA,SAAS,MAAMA,EAAa,EAAK;AAAA,YACjC,SAASR,EAAM;AAAA,YACf,qBAAqBA,EAAM;AAAA,UAAA;AAAA,QAAA;AAAA,MAGjC,KAAK;AACH,eACE,gBAAAmB;AAAA,UAACI;AAAA,UAAA;AAAA,YACC,KAAKV;AAAA,YACL,qBAAAJ;AAAA,YACA,QAAQ,MAAM;AACZ,cAAAJ,EAAQ,gCAAgC,GACxCG,EAAa,EAAK;AAAA,YACpB;AAAA,YACA,SAAS,MAAM;AACb,cAAAA,EAAa,EAAK;AAAA,YACpB;AAAA,UAAA;AAAA,QAAA;AAAA,MAGN,KAAK;AACH,eACE,gBAAAW;AAAA,UAACK;AAAA,UAAA;AAAA,YACC,KAAKV;AAAA,YACL,qBAAAL;AAAA,YACA,gBAAgB,CAAAgB,MAAkB;AAChC,cAAIA,KACFtB,EAAWM,CAAmB,GAEhCD,EAAa,EAAK;AAAA,YACpB;AAAA,UAAA;AAAA,QAAA;AAAA,MAGN,KAAK;AACH,eACE,gBAAAW;AAAA,UAACO;AAAA,UAAA;AAAA,YACC,KAAKX;AAAA,YACL,qBAAAN;AAAA,YACA,QAAQ,MAAM;AACZ,cAAAN,EAAWM,CAAmB,GAC9BD,EAAa,EAAK;AAAA,YACpB;AAAA,YACA,SAAS,MAAMA,EAAa,EAAK;AAAA,UAAA;AAAA,QAAA;AAAA,IACnC;AAAA,EAGR,GAAG;AAAA,IACDJ;AAAA,IACAJ,EAAM;AAAA,IACNA,EAAM;AAAA,IACNS;AAAA,IACAN;AAAA,EAAA,CACD;AAqBD,SACE,gBAAAgB;AAAA,IAACQ;AAAA,IAAA;AAAA,MACC,MAAA1B;AAAA,MACA,UAAAC;AAAA,MACA,WAvByD,CAAA0B,MAAK;AAIhE,gBAFAA,EAAE,eAAA,GACFpB,EAAa,EAAI,GACTJ,GAAA;AAAA,UACN,KAAK;AACH,YAAAO,GAAsB,SAAS,KAAA;AAC/B;AAAA,UACF,KAAK;AACH,YAAAE,GAAuB,SAAS,KAAA;AAChC;AAAA,UACF,KAAK;AACH,YAAAC,GAAc,SAAS,KAAA;AACvB;AAAA,UACF,KAAK;AACH,YAAAC,GAAqB,SAAS,KAAA;AAAA,QAAK;AAAA,MAEzC;AAAA,MAOI,oBAAoB;AAAA,QAClB,UAAUc,EAAWzB,CAAI,IAAI,SAAS;AAAA,QACtC,UAAUG;AAAA,MAAA;AAAA,MAEZ,UAAU;AAAA,MACV,OAAOuB,EAAe1B,GAAMY,CAAS;AAAA,MACrC,SAASC;AAAA,IAAA;AAAA,EAAA;AAGf;"}
1
+ {"version":3,"file":"CreateOrUpdateAccessRequirementWizard.js","sources":["../../../src/components/CreateOrUpdateAccessRequirementWizard/CreateOrUpdateAccessRequirementWizard.tsx"],"sourcesContent":["import { MANAGED_ACT_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE } from '@sage-bionetworks/synapse-types'\nimport { MouseEventHandler, useMemo, useRef, useState } from 'react'\nimport {\n AccessRequirementAclEditor,\n AccessRequirementAclEditorHandle,\n} from '../AccessRequirementAclEditor/AccessRequirementAclEditor'\nimport ConfirmationDialog from '../ConfirmationDialog'\nimport {\n SetAccessRequirementCommonFields,\n SetAccessRequirementCommonFieldsHandle,\n SetAccessRequirementCommonFieldsProps,\n} from '../SetAccessRequirementCommonFields'\nimport SetBasicAccessRequirementFields, {\n SetBasicAccessRequirementFieldsHandle,\n} from '../SetBasicAccessRequirementFields'\nimport SetManagedAccessRequirementFields, {\n SetManagedAccessRequirementFieldsHandle,\n} from '../SetManagedAccessRequirementFields'\nimport {\n CreateOrUpdateAccessRequirementWizardStep,\n getDialogTitle,\n isLastStep,\n} from './CreateOrUpdateAccessRequirementWizardUtils'\n\nexport type CreateOrUpdateAccessRequirementWizardProps = {\n open: boolean\n onCancel: () => void\n onComplete: (accessRequirementID?: string) => void // return the (possibly new) Access Requirement ID\n} & Pick<\n SetAccessRequirementCommonFieldsProps,\n 'subject' | 'accessRequirementId'\n>\n\nexport function CreateOrUpdateAccessRequirementWizard(\n props: CreateOrUpdateAccessRequirementWizardProps,\n) {\n const { open, onCancel, onComplete } = props\n\n const [step, setStep] = useState<CreateOrUpdateAccessRequirementWizardStep>(\n 'SET_AR_COMMON_FIELDS',\n )\n const [isLoading, setIsLoading] = useState<boolean>(false)\n const [accessRequirementId, setAccessRequirementId] = useState<\n string | undefined\n >(props.accessRequirementId)\n\n const setArCommonFieldsRef =\n useRef<SetAccessRequirementCommonFieldsHandle>(null)\n const setManagedArFieldsRef =\n useRef<SetManagedAccessRequirementFieldsHandle>(null)\n const editArAclRef = useRef<AccessRequirementAclEditorHandle>(null)\n const setBasicArFieldsRef =\n useRef<SetBasicAccessRequirementFieldsHandle>(null)\n\n const isEditing = Boolean(props['accessRequirementId'])\n\n const stepContent = useMemo(() => {\n switch (step) {\n case 'SET_AR_COMMON_FIELDS':\n return (\n <SetAccessRequirementCommonFields\n ref={setArCommonFieldsRef}\n onSave={(accessRequirementId, accessRequirementConcreteType) => {\n setAccessRequirementId(accessRequirementId)\n const nextStep: CreateOrUpdateAccessRequirementWizardStep =\n accessRequirementConcreteType ===\n MANAGED_ACT_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE\n ? 'SET_MANAGED_AR_FIELDS'\n : 'SET_BASIC_AR_FIELDS'\n setStep(nextStep)\n setIsLoading(false)\n }}\n onError={() => setIsLoading(false)}\n subject={props.subject}\n accessRequirementId={props.accessRequirementId}\n />\n )\n case 'SET_MANAGED_AR_FIELDS':\n return (\n <SetManagedAccessRequirementFields\n ref={setManagedArFieldsRef}\n accessRequirementId={accessRequirementId!}\n onSave={() => {\n setStep('SET_MANAGED_AR_ACL_PERMISSIONS')\n setIsLoading(false)\n }}\n onError={() => {\n setIsLoading(false)\n }}\n />\n )\n case 'SET_MANAGED_AR_ACL_PERMISSIONS':\n return (\n <AccessRequirementAclEditor\n ref={editArAclRef}\n accessRequirementId={accessRequirementId!}\n onSaveComplete={saveSuccessful => {\n if (saveSuccessful) {\n onComplete(accessRequirementId)\n }\n setIsLoading(false)\n }}\n />\n )\n case 'SET_BASIC_AR_FIELDS':\n return (\n <SetBasicAccessRequirementFields\n ref={setBasicArFieldsRef}\n accessRequirementId={accessRequirementId!}\n onSave={() => {\n onComplete(accessRequirementId)\n setIsLoading(false)\n }}\n onError={() => setIsLoading(false)}\n />\n )\n }\n }, [\n step,\n props.subject,\n props.accessRequirementId,\n accessRequirementId,\n onComplete,\n ])\n\n const onClickPrimary: MouseEventHandler<HTMLButtonElement> = e => {\n // SWC-7055 - The default action may trigger `beforeunload` and erroneously warn the user about leaving the page.\n e.preventDefault()\n setIsLoading(true)\n switch (step) {\n case 'SET_AR_COMMON_FIELDS':\n setArCommonFieldsRef?.current?.save()\n return\n case 'SET_MANAGED_AR_FIELDS':\n setManagedArFieldsRef?.current?.save()\n return\n case 'SET_MANAGED_AR_ACL_PERMISSIONS':\n editArAclRef?.current?.save()\n return\n case 'SET_BASIC_AR_FIELDS':\n setBasicArFieldsRef?.current?.save()\n }\n }\n\n return (\n <ConfirmationDialog\n open={open}\n onCancel={onCancel}\n onConfirm={onClickPrimary}\n confirmButtonProps={{\n children: isLastStep(step) ? 'Save' : 'Save & Continue',\n disabled: isLoading,\n }}\n maxWidth={'md'}\n title={getDialogTitle(step, isEditing)}\n content={stepContent}\n />\n )\n}\n\nexport default CreateOrUpdateAccessRequirementWizard\n"],"names":["CreateOrUpdateAccessRequirementWizard","props","open","onCancel","onComplete","step","setStep","useState","isLoading","setIsLoading","accessRequirementId","setAccessRequirementId","setArCommonFieldsRef","useRef","setManagedArFieldsRef","editArAclRef","setBasicArFieldsRef","isEditing","stepContent","useMemo","jsx","SetAccessRequirementCommonFields","accessRequirementConcreteType","MANAGED_ACT_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE","SetManagedAccessRequirementFields","AccessRequirementAclEditor","saveSuccessful","SetBasicAccessRequirementFields","ConfirmationDialog","e","isLastStep","getDialogTitle"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiCO,SAASA,GACdC,GACA;AACA,QAAM,EAAE,MAAAC,GAAM,UAAAC,GAAU,YAAAC,EAAA,IAAeH,GAEjC,CAACI,GAAMC,CAAO,IAAIC;AAAA,IACtB;AAAA,EAAA,GAEI,CAACC,GAAWC,CAAY,IAAIF,EAAkB,EAAK,GACnD,CAACG,GAAqBC,CAAsB,IAAIJ,EAEpDN,EAAM,mBAAmB,GAErBW,IACJC,EAA+C,IAAI,GAC/CC,IACJD,EAAgD,IAAI,GAChDE,IAAeF,EAAyC,IAAI,GAC5DG,IACJH,EAA8C,IAAI,GAE9CI,IAAY,EAAQhB,EAAM,qBAE1BiB,IAAcC,EAAQ,MAAM;AAChC,YAAQd,GAAA;AAAA,MACN,KAAK;AACH,eACE,gBAAAe;AAAA,UAACC;AAAA,UAAA;AAAA,YACC,KAAKT;AAAA,YACL,QAAQ,CAACF,GAAqBY,MAAkC;AAC9D,cAAAX,EAAuBD,CAAmB,GAM1CJ,EAJEgB,MACAC,IACI,0BACA,qBACU,GAChBd,EAAa,EAAK;AAAA,YACpB;AAAA,YACA,SAAS,MAAMA,EAAa,EAAK;AAAA,YACjC,SAASR,EAAM;AAAA,YACf,qBAAqBA,EAAM;AAAA,UAAA;AAAA,QAAA;AAAA,MAGjC,KAAK;AACH,eACE,gBAAAmB;AAAA,UAACI;AAAA,UAAA;AAAA,YACC,KAAKV;AAAA,YACL,qBAAAJ;AAAA,YACA,QAAQ,MAAM;AACZ,cAAAJ,EAAQ,gCAAgC,GACxCG,EAAa,EAAK;AAAA,YACpB;AAAA,YACA,SAAS,MAAM;AACb,cAAAA,EAAa,EAAK;AAAA,YACpB;AAAA,UAAA;AAAA,QAAA;AAAA,MAGN,KAAK;AACH,eACE,gBAAAW;AAAA,UAACK;AAAA,UAAA;AAAA,YACC,KAAKV;AAAA,YACL,qBAAAL;AAAA,YACA,gBAAgB,CAAAgB,MAAkB;AAChC,cAAIA,KACFtB,EAAWM,CAAmB,GAEhCD,EAAa,EAAK;AAAA,YACpB;AAAA,UAAA;AAAA,QAAA;AAAA,MAGN,KAAK;AACH,eACE,gBAAAW;AAAA,UAACO;AAAA,UAAA;AAAA,YACC,KAAKX;AAAA,YACL,qBAAAN;AAAA,YACA,QAAQ,MAAM;AACZ,cAAAN,EAAWM,CAAmB,GAC9BD,EAAa,EAAK;AAAA,YACpB;AAAA,YACA,SAAS,MAAMA,EAAa,EAAK;AAAA,UAAA;AAAA,QAAA;AAAA,IACnC;AAAA,EAGR,GAAG;AAAA,IACDJ;AAAA,IACAJ,EAAM;AAAA,IACNA,EAAM;AAAA,IACNS;AAAA,IACAN;AAAA,EAAA,CACD;AAqBD,SACE,gBAAAgB;AAAA,IAACQ;AAAA,IAAA;AAAA,MACC,MAAA1B;AAAA,MACA,UAAAC;AAAA,MACA,WAvByD,CAAA0B,MAAK;AAIhE,gBAFAA,EAAE,eAAA,GACFpB,EAAa,EAAI,GACTJ,GAAA;AAAA,UACN,KAAK;AACH,YAAAO,GAAsB,SAAS,KAAA;AAC/B;AAAA,UACF,KAAK;AACH,YAAAE,GAAuB,SAAS,KAAA;AAChC;AAAA,UACF,KAAK;AACH,YAAAC,GAAc,SAAS,KAAA;AACvB;AAAA,UACF,KAAK;AACH,YAAAC,GAAqB,SAAS,KAAA;AAAA,QAAK;AAAA,MAEzC;AAAA,MAOI,oBAAoB;AAAA,QAClB,UAAUc,EAAWzB,CAAI,IAAI,SAAS;AAAA,QACtC,UAAUG;AAAA,MAAA;AAAA,MAEZ,UAAU;AAAA,MACV,OAAOuB,EAAe1B,GAAMY,CAAS;AAAA,MACrC,SAASC;AAAA,IAAA;AAAA,EAAA;AAGf;"}
@@ -1 +1 @@
1
- {"version":3,"file":"CreateProjectModal.d.ts","sourceRoot":"","sources":["../../../src/components/CreateProjectModal/CreateProjectModal.tsx"],"names":[],"mappings":"AAQA,MAAM,MAAM,uBAAuB,GAAG;IACpC,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CACnC,CAAA;AAED,wBAAgB,kBAAkB,CAAC,EACjC,cAAsB,EACtB,OAAO,EACP,SAAS,GACV,EAAE,uBAAuB,2CAqFzB"}
1
+ {"version":3,"file":"CreateProjectModal.d.ts","sourceRoot":"","sources":["../../../src/components/CreateProjectModal/CreateProjectModal.tsx"],"names":[],"mappings":"AAgBA,MAAM,MAAM,uBAAuB,GAAG;IACpC,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CACnC,CAAA;AAED,wBAAgB,kBAAkB,CAAC,EACjC,cAAsB,EACtB,OAAO,EACP,SAAS,GACV,EAAE,uBAAuB,2CA2MzB"}
@@ -1,91 +1,165 @@
1
- import { jsxs as f, Fragment as d, jsx as t } from "react/jsx-runtime";
2
- import * as S from "../../synapse-client/SynapseClient.js";
1
+ import { jsxs as D, Fragment as V, jsx as n } from "react/jsx-runtime";
2
+ import * as y from "../../synapse-client/SynapseClient.js";
3
3
  import "@sage-bionetworks/synapse-client/generated/models/ErrorResponseCode";
4
4
  import "@sage-bionetworks/synapse-client/generated/models/TwoFactorAuthErrorResponse";
5
5
  import "@sage-bionetworks/synapse-client/util/SynapseClientError";
6
- import "@sage-bionetworks/synapse-types";
6
+ import { ACCESS_TYPE as a } from "@sage-bionetworks/synapse-types";
7
7
  import "../../utils/functions/EntityTypeUtils.js";
8
8
  import "../../utils/SynapseConstants.js";
9
9
  import "lodash-es";
10
10
  import "@sage-bionetworks/synapse-client/util/synapseClientFetch";
11
- import { useSynapseContext as g } from "../../utils/context/SynapseContext.js";
12
- import { Alert as y } from "@mui/material";
13
- import { useState as n } from "react";
14
- import { ConfirmationDialog as P } from "../ConfirmationDialog/ConfirmationDialog.js";
15
- import w from "../FullWidthAlert/FullWidthAlert.js";
16
- import v from "../TextField/TextField.js";
17
- function z({
18
- isShowingModal: u = !1,
19
- onClose: h,
20
- gotoPlace: i
11
+ import { useGetRealmPrincipals as B } from "../../synapse-queries/realm/useRealmPrincipals.js";
12
+ import { useSynapseContext as O } from "../../utils/context/SynapseContext.js";
13
+ import { Stack as W, Alert as R } from "@mui/material";
14
+ import { useState as p } from "react";
15
+ import { useMutation as k } from "@tanstack/react-query";
16
+ import { ConfirmationDialog as F } from "../ConfirmationDialog/ConfirmationDialog.js";
17
+ import G from "../FullWidthAlert/FullWidthAlert.js";
18
+ import x from "../TextField/TextField.js";
19
+ import { ProjectVisibilityRadioGroup as M } from "./ProjectVisibilityRadioGroup.js";
20
+ function ce({
21
+ isShowingModal: I = !1,
22
+ onClose: T,
23
+ gotoPlace: C
21
24
  }) {
22
- const { accessToken: j } = g(), [o, s] = n(""), [C, a] = n(!1), [c, r] = n(), l = () => {
23
- s(""), r(void 0), h();
24
- }, m = async () => {
25
- try {
26
- const e = await S.createProject(
27
- o,
28
- j
25
+ const { accessToken: m } = O(), [d, g] = p(""), [A, P] = p(""), [c, w] = p("DISCOVERABLE"), [N, j] = p(!1), { data: S } = B(), l = S?.publicGroup, u = S?.authenticatedUsers, L = async (e) => {
26
+ if (c !== "PRIVATE")
27
+ try {
28
+ const i = await y.getEntityACL(
29
+ e,
30
+ m
31
+ ), o = (f, h, v) => f.find((s) => s.principalId === h) ? f.map(
32
+ (s) => s.principalId === h ? {
33
+ ...s,
34
+ accessType: [.../* @__PURE__ */ new Set([...s.accessType, ...v])]
35
+ } : s
36
+ ) : [...f, { principalId: h, accessType: v }];
37
+ let t = [...i.resourceAccess];
38
+ c === "DISCOVERABLE" ? (l && (t = o(
39
+ t,
40
+ Number(l),
41
+ [a.READ]
42
+ )), u && (t = o(
43
+ t,
44
+ Number(u),
45
+ [a.READ]
46
+ ))) : c === "PUBLIC" && (l && (t = o(
47
+ t,
48
+ Number(l),
49
+ [a.READ]
50
+ )), u && (t = o(
51
+ t,
52
+ Number(u),
53
+ [a.READ, a.DOWNLOAD]
54
+ ))), await y.updateEntityACL(
55
+ { ...i, resourceAccess: t },
56
+ m
57
+ );
58
+ } catch (i) {
59
+ const o = i;
60
+ throw new Error(
61
+ `Project was created, but visibility could not be set: ${o.reason ?? o.message}`
62
+ );
63
+ }
64
+ }, r = k({
65
+ mutationFn: async () => {
66
+ const e = await y.createProject(
67
+ d,
68
+ A,
69
+ m
29
70
  );
30
- a(!0), l();
31
- const p = `/Synapse:${e.id}`;
32
- i ? i(p) : window.location.href = p;
33
- } catch (e) {
34
- e.reason ? r(e.reason) : r(e.toString());
71
+ return await L(e.id), e;
72
+ },
73
+ onSuccess: (e) => {
74
+ j(!0), b();
75
+ const i = `/Synapse:${e.id}`;
76
+ C ? C(i) : window.location.href = i;
35
77
  }
36
- };
37
- return /* @__PURE__ */ f(d, { children: [
38
- /* @__PURE__ */ t(
39
- P,
78
+ }), b = () => {
79
+ g(""), P(""), w("DISCOVERABLE"), r.reset(), T();
80
+ }, E = r.error ? r.error.reason ?? r.error.message : void 0;
81
+ return /* @__PURE__ */ D(V, { children: [
82
+ /* @__PURE__ */ n(
83
+ F,
40
84
  {
41
- open: u,
85
+ open: I,
42
86
  title: "Create a new Project",
43
- content: /* @__PURE__ */ f(d, { children: [
44
- /* @__PURE__ */ t(
45
- v,
87
+ content: /* @__PURE__ */ D(W, { gap: 2, children: [
88
+ /* @__PURE__ */ n(
89
+ x,
46
90
  {
47
91
  id: "projectInput",
48
92
  label: "Project Name",
49
93
  required: !0,
50
94
  helperText: "Pick a unique title for your project",
51
- value: o,
95
+ value: d,
52
96
  fullWidth: !0,
53
97
  onChange: (e) => {
54
- s(e.target.value);
98
+ g(e.target.value);
55
99
  },
56
100
  inputProps: {
57
101
  onKeyDown: (e) => {
58
- e.key === "Enter" && o !== "" && m();
102
+ e.key === "Enter" && d !== "" && r.mutate();
59
103
  }
60
104
  }
61
105
  }
62
106
  ),
63
- c && /* @__PURE__ */ t(y, { severity: "error", children: c })
107
+ /* @__PURE__ */ n(
108
+ x,
109
+ {
110
+ id: "descriptionInput",
111
+ label: "Description",
112
+ helperText: "(optional)",
113
+ placeholder: "Brief description of this project",
114
+ multiline: !0,
115
+ minRows: 3,
116
+ value: A,
117
+ fullWidth: !0,
118
+ maxCharacterCount: 350,
119
+ onChange: (e) => {
120
+ P(e.target.value);
121
+ }
122
+ }
123
+ ),
124
+ /* @__PURE__ */ n(
125
+ M,
126
+ {
127
+ value: c,
128
+ onChange: w
129
+ }
130
+ ),
131
+ E && /* @__PURE__ */ n(R, { severity: "error", children: E }),
132
+ /* @__PURE__ */ n(R, { severity: "warning", children: "You can update project visibility at any time in Project Tools, or manage access at a more granular level for individual files and folders." })
64
133
  ] }),
65
- confirmButtonProps: { children: "Save" },
134
+ confirmButtonProps: {
135
+ children: "Save",
136
+ disabled: r.isPending,
137
+ loading: r.isPending
138
+ },
66
139
  onConfirm: () => {
67
- m();
140
+ r.mutate();
68
141
  },
69
- onCancel: l,
70
- maxWidth: "md"
142
+ onCancel: b,
143
+ maxWidth: "sm",
144
+ dense: !0
71
145
  }
72
146
  ),
73
- /* @__PURE__ */ t(
74
- w,
147
+ /* @__PURE__ */ n(
148
+ G,
75
149
  {
76
- show: C,
150
+ show: N,
77
151
  variant: "info",
78
152
  title: "Project created",
79
153
  description: "",
80
154
  autoCloseAfterDelayInSeconds: 10,
81
155
  onClose: () => {
82
- a(!1);
156
+ j(!1);
83
157
  }
84
158
  }
85
159
  )
86
160
  ] });
87
161
  }
88
162
  export {
89
- z as CreateProjectModal
163
+ ce as CreateProjectModal
90
164
  };
91
165
  //# sourceMappingURL=CreateProjectModal.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CreateProjectModal.js","sources":["../../../src/components/CreateProjectModal/CreateProjectModal.tsx"],"sourcesContent":["import SynapseClient from '@/synapse-client'\nimport { useSynapseContext } from '@/utils/context/SynapseContext'\nimport { Alert } from '@mui/material'\nimport { KeyboardEvent, useState } from 'react'\nimport { ConfirmationDialog } from '../ConfirmationDialog/ConfirmationDialog'\nimport FullWidthAlert from '../FullWidthAlert/FullWidthAlert'\nimport TextField from '../TextField/TextField'\n\nexport type CreateProjectModalProps = {\n isShowingModal?: boolean\n onClose: () => void\n gotoPlace?: (href: string) => void\n}\n\nexport function CreateProjectModal({\n isShowingModal = false,\n onClose,\n gotoPlace,\n}: CreateProjectModalProps) {\n const { accessToken } = useSynapseContext()\n const [projectName, setProjectName] = useState<string>('')\n const [isShowingSuccessAlert, setIsShowingSuccessAlert] =\n useState<boolean>(false)\n const [errorMessage, setErrorMessage] = useState<string>()\n const hide = () => {\n setProjectName('')\n setErrorMessage(undefined)\n onClose()\n }\n const onCreateProject = async () => {\n try {\n const newProject = await SynapseClient.createProject(\n projectName,\n accessToken,\n )\n setIsShowingSuccessAlert(true)\n hide()\n const href = `/Synapse:${newProject.id}`\n if (gotoPlace) {\n gotoPlace(href)\n } else {\n window.location.href = href\n }\n } catch (err) {\n if (err.reason) {\n setErrorMessage(err.reason)\n } else {\n setErrorMessage(err.toString())\n }\n }\n }\n\n const dialogContent = (\n <>\n <TextField\n id=\"projectInput\"\n label=\"Project Name\"\n required\n helperText=\"Pick a unique title for your project\"\n value={projectName}\n fullWidth\n onChange={event => {\n setProjectName(event.target.value)\n }}\n inputProps={{\n onKeyDown: (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter') {\n if (projectName !== '') {\n onCreateProject()\n }\n }\n },\n }}\n />\n {errorMessage && <Alert severity=\"error\">{errorMessage}</Alert>}\n </>\n )\n\n return (\n <>\n <ConfirmationDialog\n open={isShowingModal}\n title=\"Create a new Project\"\n content={dialogContent}\n confirmButtonProps={{ children: 'Save' }}\n onConfirm={() => {\n void onCreateProject()\n }}\n onCancel={hide}\n maxWidth=\"md\"\n />\n <FullWidthAlert\n show={isShowingSuccessAlert}\n variant=\"info\"\n title=\"Project created\"\n description=\"\"\n autoCloseAfterDelayInSeconds={10}\n onClose={() => {\n setIsShowingSuccessAlert(false)\n }}\n />\n </>\n )\n}\n"],"names":["CreateProjectModal","isShowingModal","onClose","gotoPlace","accessToken","useSynapseContext","projectName","setProjectName","useState","isShowingSuccessAlert","setIsShowingSuccessAlert","errorMessage","setErrorMessage","hide","onCreateProject","newProject","SynapseClient","href","err","jsxs","Fragment","jsx","ConfirmationDialog","TextField","event","Alert","FullWidthAlert"],"mappings":";;;;;;;;;;;;;;;;AAcO,SAASA,EAAmB;AAAA,EACjC,gBAAAC,IAAiB;AAAA,EACjB,SAAAC;AAAA,EACA,WAAAC;AACF,GAA4B;AAC1B,QAAM,EAAE,aAAAC,EAAA,IAAgBC,EAAA,GAClB,CAACC,GAAaC,CAAc,IAAIC,EAAiB,EAAE,GACnD,CAACC,GAAuBC,CAAwB,IACpDF,EAAkB,EAAK,GACnB,CAACG,GAAcC,CAAe,IAAIJ,EAAA,GAClCK,IAAO,MAAM;AACjB,IAAAN,EAAe,EAAE,GACjBK,EAAgB,MAAS,GACzBV,EAAA;AAAA,EACF,GACMY,IAAkB,YAAY;AAClC,QAAI;AACF,YAAMC,IAAa,MAAMC,EAAc;AAAA,QACrCV;AAAA,QACAF;AAAA,MAAA;AAEF,MAAAM,EAAyB,EAAI,GAC7BG,EAAA;AACA,YAAMI,IAAO,YAAYF,EAAW,EAAE;AACtC,MAAIZ,IACFA,EAAUc,CAAI,IAEd,OAAO,SAAS,OAAOA;AAAA,IAE3B,SAASC,GAAK;AACZ,MAAIA,EAAI,SACNN,EAAgBM,EAAI,MAAM,IAE1BN,EAAgBM,EAAI,UAAU;AAAA,IAElC;AAAA,EACF;AA4BA,SACE,gBAAAC,EAAAC,GAAA,EACE,UAAA;AAAA,IAAA,gBAAAC;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,MAAMrB;AAAA,QACN,OAAM;AAAA,QACN,SA9BJ,gBAAAkB,EAAAC,GAAA,EACE,UAAA;AAAA,UAAA,gBAAAC;AAAA,YAACE;AAAA,YAAA;AAAA,cACC,IAAG;AAAA,cACH,OAAM;AAAA,cACN,UAAQ;AAAA,cACR,YAAW;AAAA,cACX,OAAOjB;AAAA,cACP,WAAS;AAAA,cACT,UAAU,CAAAkB,MAAS;AACjB,gBAAAjB,EAAeiB,EAAM,OAAO,KAAK;AAAA,cACnC;AAAA,cACA,YAAY;AAAA,gBACV,WAAW,CAACA,MAA2C;AACrD,kBAAIA,EAAM,QAAQ,WACZlB,MAAgB,MAClBQ,EAAA;AAAA,gBAGN;AAAA,cAAA;AAAA,YACF;AAAA,UAAA;AAAA,UAEDH,KAAgB,gBAAAU,EAACI,GAAA,EAAM,UAAS,SAAS,UAAAd,EAAA,CAAa;AAAA,QAAA,GACzD;AAAA,QASI,oBAAoB,EAAE,UAAU,OAAA;AAAA,QAChC,WAAW,MAAM;AACf,UAAKG,EAAA;AAAA,QACP;AAAA,QACA,UAAUD;AAAA,QACV,UAAS;AAAA,MAAA;AAAA,IAAA;AAAA,IAEX,gBAAAQ;AAAA,MAACK;AAAA,MAAA;AAAA,QACC,MAAMjB;AAAA,QACN,SAAQ;AAAA,QACR,OAAM;AAAA,QACN,aAAY;AAAA,QACZ,8BAA8B;AAAA,QAC9B,SAAS,MAAM;AACb,UAAAC,EAAyB,EAAK;AAAA,QAChC;AAAA,MAAA;AAAA,IAAA;AAAA,EACF,GACF;AAEJ;"}
1
+ {"version":3,"file":"CreateProjectModal.js","sources":["../../../src/components/CreateProjectModal/CreateProjectModal.tsx"],"sourcesContent":["import SynapseClient from '@/synapse-client'\nimport { useGetRealmPrincipals } from '@/synapse-queries/realm/useRealmPrincipals'\nimport { SynapseClientError } from '@sage-bionetworks/synapse-client'\nimport { useSynapseContext } from '@/utils/context/SynapseContext'\nimport { Alert, Stack } from '@mui/material'\nimport { ACCESS_TYPE } from '@sage-bionetworks/synapse-types'\nimport { KeyboardEvent, useState } from 'react'\nimport { useMutation } from '@tanstack/react-query'\nimport { ConfirmationDialog } from '../ConfirmationDialog/ConfirmationDialog'\nimport FullWidthAlert from '../FullWidthAlert/FullWidthAlert'\nimport TextField from '../TextField/TextField'\nimport {\n ProjectVisibility,\n ProjectVisibilityRadioGroup,\n} from './ProjectVisibilityRadioGroup'\n\nexport type CreateProjectModalProps = {\n isShowingModal?: boolean\n onClose: () => void\n gotoPlace?: (href: string) => void\n}\n\nexport function CreateProjectModal({\n isShowingModal = false,\n onClose,\n gotoPlace,\n}: CreateProjectModalProps) {\n const { accessToken } = useSynapseContext()\n const [projectName, setProjectName] = useState<string>('')\n const [description, setDescription] = useState<string>('')\n const [visibility, setVisibility] =\n useState<ProjectVisibility>('DISCOVERABLE')\n const [isShowingSuccessAlert, setIsShowingSuccessAlert] =\n useState<boolean>(false)\n\n const { data: realmPrincipals } = useGetRealmPrincipals()\n const publicGroupId = realmPrincipals?.publicGroup\n const authenticatedUsersId = realmPrincipals?.authenticatedUsers\n\n const applyVisibilityAcl = async (projectId: string): Promise<void> => {\n if (visibility === 'PRIVATE') {\n return\n }\n try {\n const currentAcl = await SynapseClient.getEntityACL(\n projectId,\n accessToken,\n )\n\n const upsertAccessTypes = (\n entries: typeof currentAcl.resourceAccess,\n principalId: number,\n accessTypes: ACCESS_TYPE[],\n ): typeof currentAcl.resourceAccess => {\n const existing = entries.find(e => e.principalId === principalId)\n if (existing) {\n return entries.map(e =>\n e.principalId === principalId\n ? {\n ...e,\n accessType: [...new Set([...e.accessType, ...accessTypes])],\n }\n : e,\n )\n }\n return [...entries, { principalId, accessType: accessTypes }]\n }\n\n let newResourceAccess = [...currentAcl.resourceAccess]\n\n if (visibility === 'DISCOVERABLE') {\n if (publicGroupId) {\n newResourceAccess = upsertAccessTypes(\n newResourceAccess,\n Number(publicGroupId),\n [ACCESS_TYPE.READ],\n )\n }\n if (authenticatedUsersId) {\n newResourceAccess = upsertAccessTypes(\n newResourceAccess,\n Number(authenticatedUsersId),\n [ACCESS_TYPE.READ],\n )\n }\n } else if (visibility === 'PUBLIC') {\n if (publicGroupId) {\n newResourceAccess = upsertAccessTypes(\n newResourceAccess,\n Number(publicGroupId),\n [ACCESS_TYPE.READ],\n )\n }\n if (authenticatedUsersId) {\n newResourceAccess = upsertAccessTypes(\n newResourceAccess,\n Number(authenticatedUsersId),\n [ACCESS_TYPE.READ, ACCESS_TYPE.DOWNLOAD],\n )\n }\n }\n\n await SynapseClient.updateEntityACL(\n { ...currentAcl, resourceAccess: newResourceAccess },\n accessToken,\n )\n } catch (e) {\n const err = e as SynapseClientError\n throw new Error(\n `Project was created, but visibility could not be set: ${\n err.reason ?? err.message\n }`,\n )\n }\n }\n\n const createProjectMutation = useMutation({\n mutationFn: async () => {\n const newProject = await SynapseClient.createProject(\n projectName,\n description,\n accessToken,\n )\n await applyVisibilityAcl(newProject.id!)\n return newProject\n },\n onSuccess: newProject => {\n setIsShowingSuccessAlert(true)\n hide()\n const href = `/Synapse:${newProject.id}`\n if (gotoPlace) {\n gotoPlace(href)\n } else {\n window.location.href = href\n }\n },\n })\n\n const hide = () => {\n setProjectName('')\n setDescription('')\n setVisibility('DISCOVERABLE')\n createProjectMutation.reset()\n onClose()\n }\n\n const errorMessage = createProjectMutation.error\n ? (createProjectMutation.error as SynapseClientError).reason ??\n createProjectMutation.error.message\n : undefined\n\n const dialogContent = (\n <Stack gap={2}>\n <TextField\n id=\"projectInput\"\n label=\"Project Name\"\n required\n helperText=\"Pick a unique title for your project\"\n value={projectName}\n fullWidth\n onChange={event => {\n setProjectName(event.target.value)\n }}\n inputProps={{\n onKeyDown: (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter') {\n if (projectName !== '') {\n createProjectMutation.mutate()\n }\n }\n },\n }}\n />\n <TextField\n id=\"descriptionInput\"\n label=\"Description\"\n helperText=\"(optional)\"\n placeholder=\"Brief description of this project\"\n multiline\n minRows={3}\n value={description}\n fullWidth\n maxCharacterCount={350}\n onChange={event => {\n setDescription(event.target.value)\n }}\n />\n <ProjectVisibilityRadioGroup\n value={visibility}\n onChange={setVisibility}\n />\n {errorMessage && <Alert severity=\"error\">{errorMessage}</Alert>}\n <Alert severity=\"warning\">\n You can update project visibility at any time in Project Tools, or\n manage access at a more granular level for individual files and folders.\n </Alert>\n </Stack>\n )\n\n return (\n <>\n <ConfirmationDialog\n open={isShowingModal}\n title=\"Create a new Project\"\n content={dialogContent}\n confirmButtonProps={{\n children: 'Save',\n disabled: createProjectMutation.isPending,\n loading: createProjectMutation.isPending,\n }}\n onConfirm={() => {\n createProjectMutation.mutate()\n }}\n onCancel={hide}\n maxWidth=\"sm\"\n dense\n />\n <FullWidthAlert\n show={isShowingSuccessAlert}\n variant=\"info\"\n title=\"Project created\"\n description=\"\"\n autoCloseAfterDelayInSeconds={10}\n onClose={() => {\n setIsShowingSuccessAlert(false)\n }}\n />\n </>\n )\n}\n"],"names":["CreateProjectModal","isShowingModal","onClose","gotoPlace","accessToken","useSynapseContext","projectName","setProjectName","useState","description","setDescription","visibility","setVisibility","isShowingSuccessAlert","setIsShowingSuccessAlert","realmPrincipals","useGetRealmPrincipals","publicGroupId","authenticatedUsersId","applyVisibilityAcl","projectId","currentAcl","SynapseClient","upsertAccessTypes","entries","principalId","accessTypes","e","newResourceAccess","ACCESS_TYPE","err","createProjectMutation","useMutation","newProject","hide","href","errorMessage","jsxs","Fragment","jsx","ConfirmationDialog","Stack","TextField","event","ProjectVisibilityRadioGroup","Alert","FullWidthAlert"],"mappings":"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"}