synapse-react-client 4.0.21 → 4.0.22

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 (99) hide show
  1. package/dist/SWC.index.d.ts +1 -0
  2. package/dist/SWC.index.d.ts.map +1 -1
  3. package/dist/SWC.index.js +2 -1
  4. package/dist/SWC.index.js.map +1 -1
  5. package/dist/components/CardContainer/CardContainer.d.ts.map +1 -1
  6. package/dist/components/CardContainer/CardContainer.js +43 -49
  7. package/dist/components/CardContainer/CardContainer.js.map +1 -1
  8. package/dist/components/CardContainerLogic/CardContainerLogic.d.ts +13 -0
  9. package/dist/components/CardContainerLogic/CardContainerLogic.d.ts.map +1 -1
  10. package/dist/components/CardContainerLogic/CardContainerLogic.js +64 -40
  11. package/dist/components/CardContainerLogic/CardContainerLogic.js.map +1 -1
  12. package/dist/components/ChallengeSubmission/ChallengeSubmissionStepper.js +1 -1
  13. package/dist/components/ChallengeSubmission/ChallengeSubmissionStepper.js.map +1 -1
  14. package/dist/components/DataExplorer/DataExplorer.css +1 -1
  15. package/dist/components/DataExplorer/DataExplorer.module.js +16 -16
  16. package/dist/components/DataExplorer/DataExplorer.module.js.map +1 -1
  17. package/dist/components/DataExplorer/DataExplorer.module.scss +0 -1
  18. package/dist/components/DataGrid/DataGrid.d.ts +1 -0
  19. package/dist/components/DataGrid/DataGrid.d.ts.map +1 -1
  20. package/dist/components/DataGrid/DataGrid.js +72 -72
  21. package/dist/components/DataGrid/DataGrid.js.map +1 -1
  22. package/dist/components/DataGrid/SynapseGrid.d.ts.map +1 -1
  23. package/dist/components/DataGrid/SynapseGrid.js +209 -206
  24. package/dist/components/DataGrid/SynapseGrid.js.map +1 -1
  25. package/dist/components/DataGrid/components/ColumnHeaderWithTooltip.d.ts +2 -1
  26. package/dist/components/DataGrid/components/ColumnHeaderWithTooltip.d.ts.map +1 -1
  27. package/dist/components/DataGrid/components/ColumnHeaderWithTooltip.js +51 -42
  28. package/dist/components/DataGrid/components/ColumnHeaderWithTooltip.js.map +1 -1
  29. package/dist/components/DataGrid/useDataGridWebsocket.d.ts.map +1 -1
  30. package/dist/components/DataGrid/useDataGridWebsocket.js +68 -67
  31. package/dist/components/DataGrid/useDataGridWebsocket.js.map +1 -1
  32. package/dist/components/DataGrid/utils/columnFactory.d.ts +1 -0
  33. package/dist/components/DataGrid/utils/columnFactory.d.ts.map +1 -1
  34. package/dist/components/DataGrid/utils/columnFactory.js +4 -3
  35. package/dist/components/DataGrid/utils/columnFactory.js.map +1 -1
  36. package/dist/components/DataGrid/utils/modelColsToGrid.d.ts +1 -1
  37. package/dist/components/DataGrid/utils/modelColsToGrid.d.ts.map +1 -1
  38. package/dist/components/DataGrid/utils/modelColsToGrid.js +15 -14
  39. package/dist/components/DataGrid/utils/modelColsToGrid.js.map +1 -1
  40. package/dist/components/DataGrid/utils/normalizeWebsocketError.d.ts +7 -0
  41. package/dist/components/DataGrid/utils/normalizeWebsocketError.d.ts.map +1 -0
  42. package/dist/components/DataGrid/utils/normalizeWebsocketError.js +8 -0
  43. package/dist/components/DataGrid/utils/normalizeWebsocketError.js.map +1 -0
  44. package/dist/components/Goals/Goals.d.ts +8 -0
  45. package/dist/components/Goals/Goals.d.ts.map +1 -1
  46. package/dist/components/Goals/Goals.js +54 -40
  47. package/dist/components/Goals/Goals.js.map +1 -1
  48. package/dist/components/ProjectVisibilityChip/ProjectVisibilityChip.d.ts +9 -0
  49. package/dist/components/ProjectVisibilityChip/ProjectVisibilityChip.d.ts.map +1 -0
  50. package/dist/components/ProjectVisibilityChip/ProjectVisibilityChip.js +69 -0
  51. package/dist/components/ProjectVisibilityChip/ProjectVisibilityChip.js.map +1 -0
  52. package/dist/components/ProjectVisibilityChip/getProjectVisibilityFromACL.d.ts +13 -0
  53. package/dist/components/ProjectVisibilityChip/getProjectVisibilityFromACL.d.ts.map +1 -0
  54. package/dist/components/ProjectVisibilityChip/getProjectVisibilityFromACL.js +11 -0
  55. package/dist/components/ProjectVisibilityChip/getProjectVisibilityFromACL.js.map +1 -0
  56. package/dist/components/ProjectVisibilityChip/index.d.ts +5 -0
  57. package/dist/components/ProjectVisibilityChip/index.d.ts.map +1 -0
  58. package/dist/components/ProjectVisibilityChip/index.js +7 -0
  59. package/dist/components/ProjectVisibilityChip/index.js.map +1 -0
  60. package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.d.ts.map +1 -1
  61. package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.js +1 -1
  62. package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.js.map +1 -1
  63. package/dist/components/QueryWrapperPlotNav/RowSetView.d.ts.map +1 -1
  64. package/dist/components/QueryWrapperPlotNav/RowSetView.js +9 -12
  65. package/dist/components/QueryWrapperPlotNav/RowSetView.js.map +1 -1
  66. package/dist/components/RssFeedCards/RssFeedCards.d.ts +7 -15
  67. package/dist/components/RssFeedCards/RssFeedCards.d.ts.map +1 -1
  68. package/dist/components/RssFeedCards/RssFeedCards.js +114 -123
  69. package/dist/components/RssFeedCards/RssFeedCards.js.map +1 -1
  70. package/dist/components/UserCardList/UserCardList.d.ts +2 -20
  71. package/dist/components/UserCardList/UserCardList.d.ts.map +1 -1
  72. package/dist/components/UserCardList/UserCardList.js +49 -72
  73. package/dist/components/UserCardList/UserCardList.js.map +1 -1
  74. package/dist/components/UserCardList/UserCardListRotate.d.ts +13 -0
  75. package/dist/components/UserCardList/UserCardListRotate.d.ts.map +1 -1
  76. package/dist/components/UserCardList/UserCardListRotate.js +82 -57
  77. package/dist/components/UserCardList/UserCardListRotate.js.map +1 -1
  78. package/dist/style/abstracts/_cssVariables.scss +1 -0
  79. package/dist/style/main.css +1 -1
  80. package/dist/synapse-queries/KeyFactory.d.ts +1 -0
  81. package/dist/synapse-queries/KeyFactory.d.ts.map +1 -1
  82. package/dist/synapse-queries/KeyFactory.js +3 -0
  83. package/dist/synapse-queries/KeyFactory.js.map +1 -1
  84. package/dist/synapse-queries/index.js +46 -44
  85. package/dist/synapse-queries/user/index.js +3 -3
  86. package/dist/synapse-queries/user/useUserBundle.d.ts +12 -0
  87. package/dist/synapse-queries/user/useUserBundle.d.ts.map +1 -1
  88. package/dist/synapse-queries/user/useUserBundle.js +50 -36
  89. package/dist/synapse-queries/user/useUserBundle.js.map +1 -1
  90. package/dist/tsconfig.build.tsbuildinfo +1 -1
  91. package/dist/utils/AppUtils/session/SessionInitializedGuard.d.ts +10 -5
  92. package/dist/utils/AppUtils/session/SessionInitializedGuard.d.ts.map +1 -1
  93. package/dist/utils/AppUtils/session/SessionInitializedGuard.js +13 -9
  94. package/dist/utils/AppUtils/session/SessionInitializedGuard.js.map +1 -1
  95. package/dist/utils/functions/SqlFunctions.d.ts +1 -1
  96. package/dist/utils/functions/SqlFunctions.d.ts.map +1 -1
  97. package/dist/utils/functions/SqlFunctions.js +1 -1
  98. package/dist/utils/functions/SqlFunctions.js.map +1 -1
  99. package/package.json +4 -4
@@ -1,78 +1,55 @@
1
1
  import { MEDIUM_USER_CARD as e } from "../../utils/SynapseConstants.js";
2
- import { getUserProfileWithProfilePicAttached as t } from "../../utils/functions/getUserData.js";
2
+ import { useGetUserProfilesWithProfilePicAttached as t } from "../../synapse-queries/user/useUserBundle.js";
3
3
  import { UserCard as n } from "../UserCard/UserCard.js";
4
- import { Component as r } from "react";
5
- import { without as i } from "lodash-es";
6
- import { jsx as a } from "react/jsx-runtime";
7
- import { ColumnTypeEnum as o } from "@sage-bionetworks/synapse-types";
4
+ import { useMemo as r } from "react";
5
+ import { jsx as i } from "react/jsx-runtime";
6
+ import { ColumnTypeEnum as a } from "@sage-bionetworks/synapse-types";
8
7
  //#region src/components/UserCardList/UserCardList.tsx
9
- var s = class extends r {
10
- constructor(e) {
11
- super(e), this.state = { userProfileMap: {} }, this.update = this.update.bind(this);
12
- }
13
- componentDidMount() {
14
- let { list: e } = this.props;
15
- this.update(e);
16
- }
17
- componentDidUpdate(e) {
18
- let t = e.list, n = i(this.props.list.filter((e) => e), ...t);
19
- n.length > 0 && this.update(n);
20
- }
21
- update(e) {
22
- t(e.filter((e) => !!e)).then((e) => {
23
- let t = {};
24
- e.list.forEach((e) => {
25
- let { ownerId: n } = e;
26
- t[n] = e;
27
- }), this.setState({ userProfileMap: {
28
- ...this.state.userProfileMap,
29
- ...t
30
- } });
31
- }).catch((e) => {
32
- console.error("Error on batch call =", e);
33
- });
34
- }
35
- manuallyExtractData(e) {
36
- let t = e.headers.findIndex((e) => e.name === "firstName"), n = e.headers.findIndex((e) => e.name === "lastName"), r = e.headers.findIndex((e) => e.name === "institution"), i = e.headers.findIndex((e) => e.columnType === o.USERID);
37
- return e.rows.filter((e) => !e.values[i]).map((e) => {
38
- let i = e.values;
39
- return {
40
- firstName: i[t] ?? "",
41
- lastName: i[n] ?? "",
42
- company: i[r] ?? void 0,
43
- ownerId: null,
44
- userName: i[t] ? i[t][0] ?? "" : ""
45
- };
46
- });
47
- }
48
- render() {
49
- let { size: t = e, rowSet: r, list: i } = this.props, { userProfileMap: o = {} } = this.state, s = r && this.manuallyExtractData(r), c = 0;
50
- return /* @__PURE__ */ a("div", {
51
- className: "SRC-card-grid-row",
52
- children: i.map((e) => {
53
- let r = e == null ? null : o[e];
54
- if (r) return /* @__PURE__ */ a("div", {
55
- className: "SRC-grid-item SRC-narrow-grid-item",
56
- children: /* @__PURE__ */ a(n, {
57
- size: t,
58
- preSignedURL: r.clientPreSignedURL,
59
- userProfile: r
60
- })
61
- }, JSON.stringify(r));
62
- let i = s && s[c];
63
- return i ? (c += 1, /* @__PURE__ */ a("div", {
64
- className: "SRC-grid-item SRC-narrow-grid-item",
65
- children: /* @__PURE__ */ a(n, {
66
- disableLink: !0,
67
- hideEmail: !0,
68
- size: t,
69
- userProfile: i
70
- })
71
- }, JSON.stringify(i))) : !1;
72
- })
73
- });
74
- }
75
- };
8
+ function o(e) {
9
+ let t = e.headers.findIndex((e) => e.name === "firstName"), n = e.headers.findIndex((e) => e.name === "lastName"), r = e.headers.findIndex((e) => e.name === "institution"), i = e.headers.findIndex((e) => e.columnType === a.USERID);
10
+ return e.rows.filter((e) => !e.values[i]).map((e) => {
11
+ let i = e.values;
12
+ return {
13
+ firstName: i[t] ?? "",
14
+ lastName: i[n] ?? "",
15
+ company: i[r] ?? void 0,
16
+ ownerId: null,
17
+ userName: i[t] ? i[t][0] ?? "" : ""
18
+ };
19
+ });
20
+ }
21
+ function s(a) {
22
+ let { list: s, size: c = e, rowSet: l } = a, { data: u } = t(r(() => s.filter((e) => !!e), [s])), d = r(() => {
23
+ let e = {};
24
+ return u?.list.forEach((t) => {
25
+ t.ownerId && (e[t.ownerId] = t);
26
+ }), e;
27
+ }, [u]), f = l ? o(l) : void 0, p = 0;
28
+ return /* @__PURE__ */ i("div", {
29
+ className: "SRC-card-grid-row",
30
+ children: s.map((e) => {
31
+ let t = e == null ? null : d[e];
32
+ if (t) return /* @__PURE__ */ i("div", {
33
+ className: "SRC-grid-item SRC-narrow-grid-item",
34
+ children: /* @__PURE__ */ i(n, {
35
+ size: c,
36
+ preSignedURL: t.clientPreSignedURL,
37
+ userProfile: t
38
+ })
39
+ }, JSON.stringify(t));
40
+ let r = f && f[p];
41
+ return r ? (p += 1, /* @__PURE__ */ i("div", {
42
+ className: "SRC-grid-item SRC-narrow-grid-item",
43
+ children: /* @__PURE__ */ i(n, {
44
+ disableLink: !0,
45
+ hideEmail: !0,
46
+ size: c,
47
+ userProfile: r
48
+ })
49
+ }, JSON.stringify(r))) : !1;
50
+ })
51
+ });
52
+ }
76
53
  //#endregion
77
54
  export { s as UserCardList, s as default };
78
55
 
@@ -1 +1 @@
1
- {"version":3,"file":"UserCardList.js","names":[],"sources":["../../../src/components/UserCardList/UserCardList.tsx"],"sourcesContent":["import { UserProfileList } from '@/synapse-client/SynapseClient'\nimport { getUserProfileWithProfilePicAttached } from '@/utils/functions/getUserData'\nimport { MEDIUM_USER_CARD, UserCardSize } from '@/utils/SynapseConstants'\nimport {\n ColumnTypeEnum,\n RowSet,\n UserProfile,\n} from '@sage-bionetworks/synapse-types'\nimport { without } from 'lodash-es'\nimport { Component } from 'react'\nimport UserCard from '../UserCard/UserCard'\n\nexport type UserCardListProps = {\n /* The list of user IDs or null values to render. For null values, the card will be rendered with table data supplied by `firstName`, `lastName`, and `institution` columns supplied by the data prop. */\n list: (string | null)[]\n size?: UserCardSize\n // Data should not be needed, however, it gives the option to fill in a user profile with other column\n // fields. This is required specifically by AMP-AD Explore/People page\n rowSet?: RowSet\n}\n\nexport type UserCardListState = {\n userProfileMap: Record<string, UserProfile>\n}\nexport class UserCardList extends Component<\n UserCardListProps,\n UserCardListState\n> {\n constructor(props: UserCardListProps) {\n super(props)\n this.state = {\n userProfileMap: {},\n }\n this.update = this.update.bind(this)\n }\n\n componentDidMount() {\n const { list } = this.props\n this.update(list)\n }\n\n componentDidUpdate(prevProps: UserCardListProps) {\n const priorListOfIds = prevProps.list\n const newValues = without(\n this.props.list.filter(el => el),\n ...priorListOfIds,\n )\n // check that the props have changed by seeing that at least one element is different\n if (newValues.length > 0) {\n this.update(newValues)\n }\n }\n\n update(list: (string | null)[]) {\n getUserProfileWithProfilePicAttached(\n list.filter((el): el is string => !!el),\n )\n .then((data: UserProfileList) => {\n const newEntries: Record<string, UserProfile> = {}\n data.list.forEach(el => {\n const { ownerId } = el\n newEntries[ownerId] = el\n })\n this.setState({\n userProfileMap: { ...this.state.userProfileMap, ...newEntries },\n })\n })\n .catch((err: string) => {\n console.error('Error on batch call =', err)\n })\n }\n\n /**\n * Given data this will find rows where there is no userId columnType and create faux user profiles\n * using firstName, lastName, and institution (company in UserProfile object).\n * @param {RowSet} rowSet\n * @returns list of UserProfiles with firstName, lastName, company, userName (first letter of firstName) filled out.\n * @memberof UserCardList\n */\n manuallyExtractData(rowSet: RowSet) {\n const firstNameIndex = rowSet.headers.findIndex(\n el => el.name === 'firstName',\n )\n const lastNameIndex = rowSet.headers.findIndex(el => el.name === 'lastName')\n const institutionIndex = rowSet.headers.findIndex(\n el => el.name === 'institution',\n )\n const ownerId = rowSet.headers.findIndex(\n el => el.columnType === ColumnTypeEnum.USERID,\n )\n const nullOwnerIdsRows = rowSet.rows.filter(el => !el.values[ownerId])\n return nullOwnerIdsRows.map<Omit<UserProfile, 'ownerId'>>(el => {\n const values = el.values\n return {\n firstName: values[firstNameIndex] ?? '',\n lastName: values[lastNameIndex] ?? '',\n company: values[institutionIndex] ?? undefined,\n ownerId: null,\n userName: values[firstNameIndex]\n ? (values[firstNameIndex][0] ?? '')\n : '',\n }\n })\n }\n\n render() {\n const { size = MEDIUM_USER_CARD, rowSet, list } = this.props\n const { userProfileMap = {} } = this.state\n const fauxUserProfilesList = rowSet && this.manuallyExtractData(rowSet)\n let fauxUserProfileIndex = 0\n return (\n <div className=\"SRC-card-grid-row\">\n {\n // we loop through the list from the props because thats the 'active set of data' whereas the data stored in state could be stale\n list.map(ownerId => {\n const userProfile = ownerId != null ? userProfileMap[ownerId] : null\n if (userProfile) {\n return (\n <div\n key={JSON.stringify(userProfile)}\n className=\"SRC-grid-item SRC-narrow-grid-item\"\n >\n <UserCard\n size={size}\n preSignedURL={userProfile.clientPreSignedURL}\n userProfile={userProfile}\n />\n </div>\n )\n }\n const fauxUserProfile =\n fauxUserProfilesList && fauxUserProfilesList[fauxUserProfileIndex]\n if (!fauxUserProfile) {\n // This could happen in one of two cases:\n // - The props just updated with a new userlist where the data is being gathered for this particular user\n // OR there is no mapping for this user\n return false\n }\n fauxUserProfileIndex += 1\n return (\n <div\n key={JSON.stringify(fauxUserProfile)}\n className=\"SRC-grid-item SRC-narrow-grid-item\"\n >\n <UserCard\n disableLink={true}\n hideEmail={true}\n size={size}\n // TODO: Modify UserCard to accept a fake profile with no ownerId field, and remove this cast.\n userProfile={fauxUserProfile as UserProfile}\n />\n </div>\n )\n })\n }\n </div>\n )\n }\n}\nexport default UserCardList\n"],"mappings":";;;;;;;;AAwBA,IAAa,IAAb,cAAkC,EAGhC;CACA,YAAY,GAA0B;EAKpC,AAJA,MAAM,CAAK,GACX,KAAK,QAAQ,EACX,gBAAgB,CAAC,EACnB,GACA,KAAK,SAAS,KAAK,OAAO,KAAK,IAAI;CACrC;CAEA,oBAAoB;EAClB,IAAM,EAAE,YAAS,KAAK;EACtB,KAAK,OAAO,CAAI;CAClB;CAEA,mBAAmB,GAA8B;EAC/C,IAAM,IAAiB,EAAU,MAC3B,IAAY,EAChB,KAAK,MAAM,KAAK,QAAO,MAAM,CAAE,GAC/B,GAAG,CACL;EAEA,AAAI,EAAU,SAAS,KACrB,KAAK,OAAO,CAAS;CAEzB;CAEA,OAAO,GAAyB;EAC9B,EACE,EAAK,QAAQ,MAAqB,CAAC,CAAC,CAAE,CACxC,EACG,MAAM,MAA0B;GAC/B,IAAM,IAA0C,CAAC;GAKjD,AAJA,EAAK,KAAK,SAAQ,MAAM;IACtB,IAAM,EAAE,eAAY;IACpB,EAAW,KAAW;GACxB,CAAC,GACD,KAAK,SAAS,EACZ,gBAAgB;IAAE,GAAG,KAAK,MAAM;IAAgB,GAAG;GAAW,EAChE,CAAC;EACH,CAAC,EACA,OAAO,MAAgB;GACtB,QAAQ,MAAM,yBAAyB,CAAG;EAC5C,CAAC;CACL;CASA,oBAAoB,GAAgB;EAClC,IAAM,IAAiB,EAAO,QAAQ,WACpC,MAAM,EAAG,SAAS,WACpB,GACM,IAAgB,EAAO,QAAQ,WAAU,MAAM,EAAG,SAAS,UAAU,GACrE,IAAmB,EAAO,QAAQ,WACtC,MAAM,EAAG,SAAS,aACpB,GACM,IAAU,EAAO,QAAQ,WAC7B,MAAM,EAAG,eAAe,EAAe,MACzC;EAEA,OADyB,EAAO,KAAK,QAAO,MAAM,CAAC,EAAG,OAAO,EACtD,EAAiB,KAAkC,MAAM;GAC9D,IAAM,IAAS,EAAG;GAClB,OAAO;IACL,WAAW,EAAO,MAAmB;IACrC,UAAU,EAAO,MAAkB;IACnC,SAAS,EAAO,MAAqB,KAAA;IACrC,SAAS;IACT,UAAU,EAAO,KACZ,EAAO,GAAgB,MAAM,KAC9B;GACN;EACF,CAAC;CACH;CAEA,SAAS;EACP,IAAM,EAAE,UAAO,GAAkB,WAAQ,YAAS,KAAK,OACjD,EAAE,oBAAiB,CAAC,MAAM,KAAK,OAC/B,IAAuB,KAAU,KAAK,oBAAoB,CAAM,GAClE,IAAuB;EAC3B,OACE,kBAAC,OAAD;GAAK,WAAU;aAGX,EAAK,KAAI,MAAW;IAClB,IAAM,IAAc,KAAW,OAAiC,OAA1B,EAAe;IACrD,IAAI,GACF,OACE,kBAAC,OAAD;KAEE,WAAU;eAEV,kBAAC,GAAD;MACQ;MACN,cAAc,EAAY;MACb;KACd,CAAA;IACE,GARE,KAAK,UAAU,CAAW,CAQ5B;IAGT,IAAM,IACJ,KAAwB,EAAqB;IAQ/C,OAPK,KAML,KAAwB,GAEtB,kBAAC,OAAD;KAEE,WAAU;eAEV,kBAAC,GAAD;MACE,aAAa;MACb,WAAW;MACL;MAEN,aAAa;KACd,CAAA;IACE,GAVE,KAAK,UAAU,CAAe,CAUhC,KAfE;GAiBX,CAAC;EAEA,CAAA;CAET;AACF"}
1
+ {"version":3,"file":"UserCardList.js","names":[],"sources":["../../../src/components/UserCardList/UserCardList.tsx"],"sourcesContent":["import { useGetUserProfilesWithProfilePicAttached } from '@/synapse-queries/user/useUserBundle'\nimport { MEDIUM_USER_CARD, UserCardSize } from '@/utils/SynapseConstants'\nimport {\n ColumnTypeEnum,\n RowSet,\n UserProfile,\n} from '@sage-bionetworks/synapse-types'\nimport { useMemo } from 'react'\nimport UserCard from '../UserCard/UserCard'\n\nexport type UserCardListProps = {\n /* The list of user IDs or null values to render. For null values, the card will be rendered with table data supplied by `firstName`, `lastName`, and `institution` columns supplied by the data prop. */\n list: (string | null)[]\n size?: UserCardSize\n // Data should not be needed, however, it gives the option to fill in a user profile with other column\n // fields. This is required specifically by AMP-AD Explore/People page\n rowSet?: RowSet\n}\n\n/**\n * Given a RowSet, extracts faux user profiles for rows where ownerId is null,\n * using firstName, lastName, and institution columns.\n */\nfunction extractFauxUserProfiles(\n rowSet: RowSet,\n): Omit<UserProfile, 'ownerId'>[] {\n const firstNameIndex = rowSet.headers.findIndex(el => el.name === 'firstName')\n const lastNameIndex = rowSet.headers.findIndex(el => el.name === 'lastName')\n const institutionIndex = rowSet.headers.findIndex(\n el => el.name === 'institution',\n )\n const ownerIdIndex = rowSet.headers.findIndex(\n el => el.columnType === ColumnTypeEnum.USERID,\n )\n const nullOwnerIdsRows = rowSet.rows.filter(el => !el.values[ownerIdIndex])\n return nullOwnerIdsRows.map(el => {\n const values = el.values\n return {\n firstName: values[firstNameIndex] ?? '',\n lastName: values[lastNameIndex] ?? '',\n company: values[institutionIndex] ?? undefined,\n ownerId: null,\n userName: values[firstNameIndex] ? (values[firstNameIndex][0] ?? '') : '',\n }\n })\n}\n\nexport function UserCardList(props: UserCardListProps) {\n const { list, size = MEDIUM_USER_CARD, rowSet } = props\n\n const principalIds = useMemo(\n () => list.filter((el): el is string => !!el),\n [list],\n )\n\n const { data } = useGetUserProfilesWithProfilePicAttached(principalIds)\n\n const userProfileMap = useMemo(() => {\n const map: Record<string, UserProfile> = {}\n data?.list.forEach(profile => {\n if (profile.ownerId) {\n map[profile.ownerId] = profile\n }\n })\n return map\n }, [data])\n\n const fauxUserProfilesList = rowSet\n ? extractFauxUserProfiles(rowSet)\n : undefined\n let fauxUserProfileIndex = 0\n\n return (\n <div className=\"SRC-card-grid-row\">\n {list.map(ownerId => {\n const userProfile = ownerId != null ? userProfileMap[ownerId] : null\n if (userProfile) {\n return (\n <div\n key={JSON.stringify(userProfile)}\n className=\"SRC-grid-item SRC-narrow-grid-item\"\n >\n <UserCard\n size={size}\n preSignedURL={userProfile.clientPreSignedURL}\n userProfile={userProfile}\n />\n </div>\n )\n }\n const fauxUserProfile =\n fauxUserProfilesList && fauxUserProfilesList[fauxUserProfileIndex]\n if (!fauxUserProfile) {\n return false\n }\n fauxUserProfileIndex += 1\n return (\n <div\n key={JSON.stringify(fauxUserProfile)}\n className=\"SRC-grid-item SRC-narrow-grid-item\"\n >\n <UserCard\n disableLink={true}\n hideEmail={true}\n size={size}\n // TODO: Modify UserCard to accept a fake profile with no ownerId field, and remove this cast.\n userProfile={fauxUserProfile as UserProfile}\n />\n </div>\n )\n })}\n </div>\n )\n}\n\nexport default UserCardList\n"],"mappings":";;;;;;;AAuBA,SAAS,EACP,GACgC;CAChC,IAAM,IAAiB,EAAO,QAAQ,WAAU,MAAM,EAAG,SAAS,WAAW,GACvE,IAAgB,EAAO,QAAQ,WAAU,MAAM,EAAG,SAAS,UAAU,GACrE,IAAmB,EAAO,QAAQ,WACtC,MAAM,EAAG,SAAS,aACpB,GACM,IAAe,EAAO,QAAQ,WAClC,MAAM,EAAG,eAAe,EAAe,MACzC;CAEA,OADyB,EAAO,KAAK,QAAO,MAAM,CAAC,EAAG,OAAO,EACtD,EAAiB,KAAI,MAAM;EAChC,IAAM,IAAS,EAAG;EAClB,OAAO;GACL,WAAW,EAAO,MAAmB;GACrC,UAAU,EAAO,MAAkB;GACnC,SAAS,EAAO,MAAqB,KAAA;GACrC,SAAS;GACT,UAAU,EAAO,KAAmB,EAAO,GAAgB,MAAM,KAAM;EACzE;CACF,CAAC;AACH;AAEA,SAAgB,EAAa,GAA0B;CACrD,IAAM,EAAE,SAAM,UAAO,GAAkB,cAAW,GAO5C,EAAE,YAAS,EALI,QACb,EAAK,QAAQ,MAAqB,CAAC,CAAC,CAAE,GAC5C,CAAC,CAAI,CAGmD,CAAY,GAEhE,IAAiB,QAAc;EACnC,IAAM,IAAmC,CAAC;EAM1C,OALA,GAAM,KAAK,SAAQ,MAAW;GAC5B,AAAI,EAAQ,YACV,EAAI,EAAQ,WAAW;EAE3B,CAAC,GACM;CACT,GAAG,CAAC,CAAI,CAAC,GAEH,IAAuB,IACzB,EAAwB,CAAM,IAC9B,KAAA,GACA,IAAuB;CAE3B,OACE,kBAAC,OAAD;EAAK,WAAU;YACZ,EAAK,KAAI,MAAW;GACnB,IAAM,IAAc,KAAW,OAAiC,OAA1B,EAAe;GACrD,IAAI,GACF,OACE,kBAAC,OAAD;IAEE,WAAU;cAEV,kBAAC,GAAD;KACQ;KACN,cAAc,EAAY;KACb;IACd,CAAA;GACE,GARE,KAAK,UAAU,CAAW,CAQ5B;GAGT,IAAM,IACJ,KAAwB,EAAqB;GAK/C,OAJK,KAGL,KAAwB,GAEtB,kBAAC,OAAD;IAEE,WAAU;cAEV,kBAAC,GAAD;KACE,aAAa;KACb,WAAW;KACL;KAEN,aAAa;IACd,CAAA;GACE,GAVE,KAAK,UAAU,CAAe,CAUhC,KAfE;EAiBX,CAAC;CACE,CAAA;AAET"}
@@ -1,6 +1,7 @@
1
1
  import { SQLOperator } from '@/utils/functions/SqlFunctions';
2
2
  import { UserCardSize } from '@/utils/SynapseConstants';
3
3
  import { FacetColumnRequest } from '@sage-bionetworks/synapse-types';
4
+ import { QueryClient } from '@tanstack/react-query';
4
5
  export type UserCardListRotateProps = {
5
6
  sql: string;
6
7
  count: number;
@@ -16,4 +17,16 @@ export type UserCardListRotateProps = {
16
17
  export declare const getDisplayIds: (ids: string[] | undefined, count: number | undefined, storageUidKey: string) => string[];
17
18
  export declare function UserCardListRotate({ sql, count, useQueryResultUserData, size, summaryLink, summaryLinkText, selectedFacets, searchParams, sqlOperator, additionalFiltersSessionStorageKey, }: UserCardListRotateProps): import("react/jsx-runtime").JSX.Element;
18
19
  export default UserCardListRotate;
20
+ /**
21
+ * Prefetches the UserCardListRotate table query and the user profiles it
22
+ * references into a QueryClient for use with HydrationBoundary. Uses anonymous
23
+ * access; warm-caches for unauthenticated users.
24
+ */
25
+ export declare function prefetchUserCardListRotate(queryClient: QueryClient, sql: string, options?: {
26
+ selectedFacets?: FacetColumnRequest[];
27
+ searchParams?: Record<string, string>;
28
+ sqlOperator?: SQLOperator;
29
+ additionalFiltersSessionStorageKey?: string;
30
+ count?: number;
31
+ }): Promise<void>;
19
32
  //# sourceMappingURL=UserCardListRotate.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"UserCardListRotate.d.ts","sourceRoot":"","sources":["../../../src/components/UserCardList/UserCardListRotate.tsx"],"names":[],"mappings":"AAIA,OAAO,EAGL,WAAW,EACZ,MAAM,gCAAgC,CAAA;AACvC,OAAO,EAAmB,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACxE,OAAO,EAEL,kBAAkB,EAGnB,MAAM,iCAAiC,CAAA;AASxC,MAAM,MAAM,uBAAuB,GAAG;IACpC,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAChC,IAAI,CAAC,EAAE,YAAY,CAAA;IACnB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,cAAc,CAAC,EAAE,kBAAkB,EAAE,CAAA;IACrC,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACrC,kCAAkC,CAAC,EAAE,MAAM,CAAA;CAC5C,CAAA;AAED,eAAO,MAAM,aAAa,GACxB,KAAK,MAAM,EAAE,YAAK,EAClB,OAAO,MAAM,YAAwB,EACrC,eAAe,MAAM,aA8BtB,CAAA;AAED,wBAAgB,kBAAkB,CAAC,EACjC,GAAG,EACH,KAAK,EACL,sBAA8B,EAC9B,IAAsB,EACtB,WAAW,EACX,eAAe,EACf,cAAc,EACd,YAAY,EACZ,WAAW,EACX,kCAAkC,GACnC,EAAE,uBAAuB,2CAoFzB;AAED,eAAe,kBAAkB,CAAA"}
1
+ {"version":3,"file":"UserCardListRotate.d.ts","sourceRoot":"","sources":["../../../src/components/UserCardList/UserCardListRotate.tsx"],"names":[],"mappings":"AAOA,OAAO,EAGL,WAAW,EACZ,MAAM,gCAAgC,CAAA;AACvC,OAAO,EAAmB,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACxE,OAAO,EAEL,kBAAkB,EAGnB,MAAM,iCAAiC,CAAA;AACxC,OAAO,EAAE,WAAW,EAAY,MAAM,uBAAuB,CAAA;AAQ7D,MAAM,MAAM,uBAAuB,GAAG;IACpC,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAChC,IAAI,CAAC,EAAE,YAAY,CAAA;IACnB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,cAAc,CAAC,EAAE,kBAAkB,EAAE,CAAA;IACrC,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACrC,kCAAkC,CAAC,EAAE,MAAM,CAAA;CAC5C,CAAA;AAED,eAAO,MAAM,aAAa,GACxB,KAAK,MAAM,EAAE,YAAK,EAClB,OAAO,MAAM,YAAwB,EACrC,eAAe,MAAM,KACpB,MAAM,EAgCR,CAAA;AA0CD,wBAAgB,kBAAkB,CAAC,EACjC,GAAG,EACH,KAAK,EACL,sBAA8B,EAC9B,IAAsB,EACtB,WAAW,EACX,eAAe,EACf,cAAc,EACd,YAAY,EACZ,WAAW,EACX,kCAAkC,GACnC,EAAE,uBAAuB,2CAiEzB;AAED,eAAe,kBAAkB,CAAA;AAEjC;;;;GAIG;AACH,wBAAsB,0BAA0B,CAC9C,WAAW,EAAE,WAAW,EACxB,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE;IACR,cAAc,CAAC,EAAE,kBAAkB,EAAE,CAAA;IACrC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACrC,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB,kCAAkC,CAAC,EAAE,MAAM,CAAA;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,GACA,OAAO,CAAC,IAAI,CAAC,CA0Bf"}
@@ -1,81 +1,106 @@
1
1
  import { LARGE_USER_CARD as e } from "../../utils/SynapseConstants.js";
2
2
  import t from "../../synapse-client/index.js";
3
3
  import { getAdditionalFilters as n, parseEntityIdFromSqlStatement as r } from "../../utils/functions/SqlFunctions.js";
4
- import { useSynapseContext as i } from "../../utils/context/SynapseContext.js";
4
+ import { KeyFactory as i } from "../../synapse-queries/KeyFactory.js";
5
+ import { useSynapseContext as a } from "../../utils/context/SynapseContext.js";
5
6
  import "../../utils/index.js";
6
- import { LoadingUserCardMedium as a } from "../UserCard/UserCardMedium.js";
7
- import { UserCardList as o } from "./UserCardList.js";
8
- import { LargeButton as s } from "../styled/LargeButton.js";
9
- import { useState as c } from "react";
10
- import { jsx as l, jsxs as u } from "react/jsx-runtime";
11
- import { ColumnTypeEnum as d } from "@sage-bionetworks/synapse-types";
12
- import { useDeepCompareEffectNoCheck as f } from "use-deep-compare-effect";
7
+ import { tableQueryUseQueryDefaults as o } from "../../synapse-queries/entity/useGetQueryResultBundle.js";
8
+ import { getUserProfilesWithProfilePicAttachedQueryOptions as s } from "../../synapse-queries/user/useUserBundle.js";
9
+ import { LoadingUserCardMedium as c } from "../UserCard/UserCardMedium.js";
10
+ import { UserCardList as l } from "./UserCardList.js";
11
+ import { LargeButton as u } from "../styled/LargeButton.js";
12
+ import { useEffect as d, useMemo as f, useRef as p, useState as m } from "react";
13
+ import { jsx as h, jsxs as g } from "react/jsx-runtime";
14
+ import { ColumnTypeEnum as _ } from "@sage-bionetworks/synapse-types";
15
+ import { useQuery as v } from "@tanstack/react-query";
13
16
  //#region src/components/UserCardList/UserCardListRotate.tsx
14
- var p = "sage_rotate_uids", m = 3, h = (e = [], t = m, n) => {
15
- let r = [], i = [], a = localStorage.getItem(n);
16
- if (a != null && (r = JSON.parse(a)), r.length) {
17
- let a = e.filter((e) => !r.includes(e));
18
- if (a.length >= t) return i = a.slice(0, t), localStorage.setItem(n, JSON.stringify(r.concat(i))), i;
19
- {
20
- localStorage.removeItem(n);
21
- let r = e.slice(0, t - a.length);
22
- return localStorage.setItem(n, JSON.stringify(r)), a.concat(r);
23
- }
24
- } else return i = e.slice(0, t), localStorage.setItem(n, JSON.stringify(i)), i;
17
+ var y = "sage_rotate_uids", b = 3, x = (e = [], t = b, n) => {
18
+ if (typeof localStorage > "u") return e.slice(0, t);
19
+ let r = localStorage.getItem(n), i = r ? JSON.parse(r) : [];
20
+ if (!i.length) {
21
+ let r = e.slice(0, t);
22
+ return localStorage.setItem(n, JSON.stringify(r)), r;
23
+ }
24
+ let a = new Set(i), o = e.filter((e) => !a.has(e));
25
+ if (o.length >= t) {
26
+ let e = o.slice(0, t);
27
+ return localStorage.setItem(n, JSON.stringify([...i, ...e])), e;
28
+ }
29
+ let s = e.slice(0, t - o.length);
30
+ return localStorage.setItem(n, JSON.stringify(s)), [...o, ...s];
25
31
  };
26
- function g({ sql: m, count: g, useQueryResultUserData: _ = !1, size: v = e, summaryLink: y, summaryLinkText: b, selectedFacets: x, searchParams: S, sqlOperator: C, additionalFiltersSessionStorageKey: w }) {
27
- let { accessToken: T } = i(), [E, D] = c([]), [O, k] = c(), [A, j] = c(), M = !0, N = `${p}-${m}-${JSON.stringify(x)}`;
28
- return f(() => (async function() {
29
- j(!0);
30
- let e = {
31
- partMask: 1,
32
- concreteType: "org.sagebionetworks.repo.model.table.QueryBundleRequest",
33
- entityId: r(m),
34
- query: {
35
- sql: m,
36
- additionalFilters: n(S, C, w),
37
- selectedFacets: x
38
- }
39
- }, i = await t.getFullQueryTableResults(e, T), { queryResult: a } = i;
40
- if (a?.queryResults.rows) {
41
- let e = a.queryResults.headers.findIndex((e) => e.columnType === d.USERID), t = a.queryResults.rows.map((t) => t.values[e]).filter((e) => e !== null);
42
- M && (D(h(t, g, N)), _ && k(i), j(!1));
43
- } else console.log("UserCardListRotate: Error getting data");
44
- }(), () => {
45
- M = !1;
46
- }), [
47
- m,
48
- x,
49
- g,
50
- T,
51
- S,
52
- C
53
- ]), /* @__PURE__ */ u("div", {
32
+ function S(e, t) {
33
+ return {
34
+ partMask: 1,
35
+ concreteType: "org.sagebionetworks.repo.model.table.QueryBundleRequest",
36
+ entityId: r(e),
37
+ query: {
38
+ sql: e,
39
+ additionalFilters: n(t?.searchParams, t?.sqlOperator, t?.additionalFiltersSessionStorageKey),
40
+ selectedFacets: t?.selectedFacets
41
+ }
42
+ };
43
+ }
44
+ function C(e) {
45
+ if (!e?.queryResult?.queryResults.rows) return [];
46
+ let t = e.queryResult.queryResults.headers.findIndex((e) => e.columnType === _.USERID);
47
+ return t === -1 ? [] : e.queryResult.queryResults.rows.map((e) => e.values[t]).filter((e) => e !== null);
48
+ }
49
+ function w({ sql: n, count: r, useQueryResultUserData: i = !1, size: s = e, summaryLink: _, summaryLinkText: b, selectedFacets: w, searchParams: T, sqlOperator: E, additionalFiltersSessionStorageKey: D }) {
50
+ let { accessToken: O, keyFactory: k } = a(), A = `${y}-${n}-${JSON.stringify(w)}`, j = S(n, {
51
+ selectedFacets: w,
52
+ searchParams: T,
53
+ sqlOperator: E,
54
+ additionalFiltersSessionStorageKey: D
55
+ }), { data: M, isPending: N } = v({
56
+ ...o,
57
+ queryKey: k.getFullTableQueryResultQueryKey(j, !1),
58
+ queryFn: () => t.getFullQueryTableResults(j, O)
59
+ }), [P, F] = m([]), I = f(() => C(M), [M]), L = I.slice(0, r), R = p(!1);
60
+ d(() => {
61
+ R.current || (R.current = !0, F(x(I, r, A)));
62
+ }, [
63
+ I,
64
+ r,
65
+ A
66
+ ]);
67
+ let z = P.length > 0 ? P : L;
68
+ return /* @__PURE__ */ g("div", {
54
69
  className: "UserCardListRotate",
55
70
  children: [
56
- A && /* @__PURE__ */ l(a, {}),
57
- !A && E.length === 0 && /* @__PURE__ */ l("p", {
71
+ N && /* @__PURE__ */ h(c, {}),
72
+ !N && z.length === 0 && /* @__PURE__ */ h("p", {
58
73
  className: "font-italic",
59
74
  children: "No one was found."
60
75
  }),
61
- !A && E.length > 0 && /* @__PURE__ */ l(o, {
62
- list: E,
63
- size: v,
64
- rowSet: O?.queryResult?.queryResults
76
+ !N && z.length > 0 && /* @__PURE__ */ h(l, {
77
+ list: z,
78
+ size: s,
79
+ rowSet: i ? M?.queryResult?.queryResults : void 0
65
80
  }),
66
- y && b && /* @__PURE__ */ l("div", {
81
+ _ && b && /* @__PURE__ */ h("div", {
67
82
  className: "UserCardListRotate__summary",
68
- children: /* @__PURE__ */ l(s, {
83
+ children: /* @__PURE__ */ h(u, {
69
84
  color: "secondary",
70
85
  variant: "contained",
71
- href: y,
86
+ href: _,
72
87
  children: b
73
88
  })
74
89
  })
75
90
  ]
76
91
  });
77
92
  }
93
+ async function T(e, n, r) {
94
+ let a = new i(void 0), c = S(n, r), l = a.getFullTableQueryResultQueryKey(c, !1);
95
+ await e.prefetchQuery({
96
+ ...o,
97
+ queryKey: l,
98
+ queryFn: () => t.getFullQueryTableResults(c, void 0)
99
+ });
100
+ let u = C(e.getQueryData(l)).slice(0, r?.count ?? b);
101
+ u.length > 0 && await e.prefetchQuery(s(u, { keyFactory: a }));
102
+ }
78
103
  //#endregion
79
- export { g as UserCardListRotate, g as default, h as getDisplayIds };
104
+ export { w as UserCardListRotate, w as default, x as getDisplayIds, T as prefetchUserCardListRotate };
80
105
 
81
106
  //# sourceMappingURL=UserCardListRotate.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"UserCardListRotate.js","names":[],"sources":["../../../src/components/UserCardList/UserCardListRotate.tsx"],"sourcesContent":["import LargeButton from '@/components/styled/LargeButton'\nimport SynapseClient from '@/synapse-client'\nimport { SynapseConstants } from '@/utils'\nimport { useSynapseContext } from '@/utils/context/SynapseContext'\nimport {\n getAdditionalFilters,\n parseEntityIdFromSqlStatement,\n SQLOperator,\n} from '@/utils/functions/SqlFunctions'\nimport { LARGE_USER_CARD, UserCardSize } from '@/utils/SynapseConstants'\nimport {\n ColumnTypeEnum,\n FacetColumnRequest,\n QueryBundleRequest,\n QueryResultBundle,\n} from '@sage-bionetworks/synapse-types'\nimport { useState } from 'react'\nimport { useDeepCompareEffectNoCheck } from 'use-deep-compare-effect'\nimport { LoadingUserCardMedium } from '../UserCard/UserCardMedium'\nimport UserCardList from './UserCardList'\n\nconst STORED_UID_KEY = 'sage_rotate_uids'\nconst DEFAULT_DISPLAY_COUNT = 3\n\nexport type UserCardListRotateProps = {\n sql: string\n count: number\n useQueryResultUserData?: boolean\n size?: UserCardSize\n summaryLink?: string\n summaryLinkText?: string\n selectedFacets?: FacetColumnRequest[]\n sqlOperator?: SQLOperator\n searchParams?: Record<string, string>\n additionalFiltersSessionStorageKey?: string\n}\n\nexport const getDisplayIds = (\n ids: string[] = [],\n count: number = DEFAULT_DISPLAY_COUNT,\n storageUidKey: string,\n) => {\n let storedIds: string[] = []\n let newIds: string[] = []\n const storedIdsStr = localStorage.getItem(storageUidKey)\n if (storedIdsStr != null) {\n storedIds = JSON.parse(storedIdsStr)\n }\n if (!storedIds.length) {\n // no stuff in storage\n newIds = ids.slice(0, count)\n localStorage.setItem(storageUidKey, JSON.stringify(newIds))\n return newIds\n } else {\n // has stuff in storage\n const filtered = ids.filter(item => !storedIds.includes(item))\n if (filtered.length >= count) {\n newIds = filtered.slice(0, count)\n localStorage.setItem(\n storageUidKey,\n JSON.stringify(storedIds.concat(newIds)),\n )\n return newIds\n } else {\n localStorage.removeItem(storageUidKey)\n const part = ids.slice(0, count - filtered.length)\n localStorage.setItem(storageUidKey, JSON.stringify(part))\n return filtered.concat(part)\n }\n }\n}\n\nexport function UserCardListRotate({\n sql,\n count,\n useQueryResultUserData = false,\n size = LARGE_USER_CARD,\n summaryLink,\n summaryLinkText,\n selectedFacets,\n searchParams,\n sqlOperator,\n additionalFiltersSessionStorageKey,\n}: UserCardListRotateProps) {\n const { accessToken } = useSynapseContext()\n const [userIds, setUserIds] = useState<string[]>([])\n const [queryData, setQueryData] = useState<QueryResultBundle>()\n const [isLoading, setIsLoading] = useState<boolean>()\n let mounted = true\n const storageUidKey = `${STORED_UID_KEY}-${sql}-${JSON.stringify(\n selectedFacets,\n )}`\n useDeepCompareEffectNoCheck(() => {\n const fetchData = async function () {\n setIsLoading(true)\n const entityId = parseEntityIdFromSqlStatement(sql)\n const additionalFilters = getAdditionalFilters(\n searchParams,\n sqlOperator,\n additionalFiltersSessionStorageKey,\n )\n const partMask = SynapseConstants.BUNDLE_MASK_QUERY_RESULTS\n const request: QueryBundleRequest = {\n partMask,\n concreteType: 'org.sagebionetworks.repo.model.table.QueryBundleRequest',\n entityId,\n query: {\n sql,\n additionalFilters,\n selectedFacets,\n },\n }\n\n const queryResultBundle = await SynapseClient.getFullQueryTableResults(\n request,\n accessToken,\n )\n const { queryResult } = queryResultBundle\n if (queryResult?.queryResults.rows) {\n // find the column that has the USER_ID in it.\n const ownerIdColumnIndex = queryResult.queryResults.headers.findIndex(\n el => el.columnType === ColumnTypeEnum.USERID,\n )\n const ids: string[] = queryResult.queryResults.rows\n .map(d => d.values[ownerIdColumnIndex])\n .filter((id): id is string => id !== null)\n if (mounted) {\n const newIds = getDisplayIds(ids, count, storageUidKey)\n setUserIds(newIds)\n if (useQueryResultUserData) {\n setQueryData(queryResultBundle)\n }\n setIsLoading(false)\n }\n } else {\n console.log('UserCardListRotate: Error getting data')\n }\n }\n fetchData()\n\n return () => {\n mounted = false\n }\n }, [sql, selectedFacets, count, accessToken, searchParams, sqlOperator])\n\n return (\n <div className=\"UserCardListRotate\">\n {isLoading && <LoadingUserCardMedium />}\n {!isLoading && userIds.length === 0 && (\n <p className=\"font-italic\">No one was found.</p>\n )}\n {!isLoading && userIds.length > 0 && (\n <UserCardList\n list={userIds}\n size={size}\n rowSet={queryData?.queryResult?.queryResults}\n />\n )}\n {summaryLink && summaryLinkText && (\n <div className=\"UserCardListRotate__summary\">\n <LargeButton color=\"secondary\" variant=\"contained\" href={summaryLink}>\n {summaryLinkText}\n </LargeButton>\n </div>\n )}\n </div>\n )\n}\n\nexport default UserCardListRotate\n"],"mappings":";;;;;;;;;;;;;AAqBA,IAAM,IAAiB,oBACjB,IAAwB,GAejB,KACX,IAAgB,CAAC,GACjB,IAAgB,GAChB,MACG;CACH,IAAI,IAAsB,CAAC,GACvB,IAAmB,CAAC,GAClB,IAAe,aAAa,QAAQ,CAAa;CAIvD,IAHI,KAAgB,SAClB,IAAY,KAAK,MAAM,CAAY,IAEhC,EAAU,QAKR;EAEL,IAAM,IAAW,EAAI,QAAO,MAAQ,CAAC,EAAU,SAAS,CAAI,CAAC;EAC7D,IAAI,EAAS,UAAU,GAMrB,OALA,IAAS,EAAS,MAAM,GAAG,CAAK,GAChC,aAAa,QACX,GACA,KAAK,UAAU,EAAU,OAAO,CAAM,CAAC,CACzC,GACO;EACF;GACL,aAAa,WAAW,CAAa;GACrC,IAAM,IAAO,EAAI,MAAM,GAAG,IAAQ,EAAS,MAAM;GAEjD,OADA,aAAa,QAAQ,GAAe,KAAK,UAAU,CAAI,CAAC,GACjD,EAAS,OAAO,CAAI;EAC7B;CACF,OAjBE,OAFA,IAAS,EAAI,MAAM,GAAG,CAAK,GAC3B,aAAa,QAAQ,GAAe,KAAK,UAAU,CAAM,CAAC,GACnD;AAkBX;AAEA,SAAgB,EAAmB,EACjC,QACA,UACA,4BAAyB,IACzB,UAAO,GACP,gBACA,oBACA,mBACA,iBACA,gBACA,yCAC0B;CAC1B,IAAM,EAAE,mBAAgB,EAAkB,GACpC,CAAC,GAAS,KAAc,EAAmB,CAAC,CAAC,GAC7C,CAAC,GAAW,KAAgB,EAA4B,GACxD,CAAC,GAAW,KAAgB,EAAkB,GAChD,IAAU,IACR,IAAgB,GAAG,EAAe,GAAG,EAAI,GAAG,KAAK,UACrD,CACF;CAsDA,OArDA,SA8CE,iBA7CoC;EAClC,EAAa,EAAI;EAQjB,IAAM,IAA8B;GAClC,UAAA;GACA,cAAc;GACd,UAVe,EAA8B,CAU7C;GACA,OAAO;IACL;IACA,mBAZsB,EACxB,GACA,GACA,CASE;IACA;GACF;EACF,GAEM,IAAoB,MAAM,EAAc,yBAC5C,GACA,CACF,GACM,EAAE,mBAAgB;EACxB,IAAI,GAAa,aAAa,MAAM;GAElC,IAAM,IAAqB,EAAY,aAAa,QAAQ,WAC1D,MAAM,EAAG,eAAe,EAAe,MACzC,GACM,IAAgB,EAAY,aAAa,KAC5C,KAAI,MAAK,EAAE,OAAO,EAAmB,EACrC,QAAQ,MAAqB,MAAO,IAAI;GAC3C,AAAI,MAEF,EADe,EAAc,GAAK,GAAO,CAC9B,CAAM,GACb,KACF,EAAa,CAAiB,GAEhC,EAAa,EAAK;EAEtB,OACE,QAAQ,IAAI,wCAAwC;CAExD,EACU,SAEG;EACX,IAAU;CACZ,IACC;EAAC;EAAK;EAAgB;EAAO;EAAa;EAAc;CAAW,CAAC,GAGrE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACG,KAAa,kBAAC,GAAD,CAAwB,CAAA;GACrC,CAAC,KAAa,EAAQ,WAAW,KAChC,kBAAC,KAAD;IAAG,WAAU;cAAc;GAAoB,CAAA;GAEhD,CAAC,KAAa,EAAQ,SAAS,KAC9B,kBAAC,GAAD;IACE,MAAM;IACA;IACN,QAAQ,GAAW,aAAa;GACjC,CAAA;GAEF,KAAe,KACd,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,GAAD;KAAa,OAAM;KAAY,SAAQ;KAAY,MAAM;eACtD;IACU,CAAA;GACV,CAAA;EAEJ;;AAET"}
1
+ {"version":3,"file":"UserCardListRotate.js","names":[],"sources":["../../../src/components/UserCardList/UserCardListRotate.tsx"],"sourcesContent":["import LargeButton from '@/components/styled/LargeButton'\nimport SynapseClient from '@/synapse-client'\nimport { KeyFactory } from '@/synapse-queries/KeyFactory'\nimport { tableQueryUseQueryDefaults } from '@/synapse-queries/entity/useGetQueryResultBundle'\nimport { getUserProfilesWithProfilePicAttachedQueryOptions } from '@/synapse-queries/user/useUserBundle'\nimport { SynapseConstants } from '@/utils'\nimport { useSynapseContext } from '@/utils/context/SynapseContext'\nimport {\n getAdditionalFilters,\n parseEntityIdFromSqlStatement,\n SQLOperator,\n} from '@/utils/functions/SqlFunctions'\nimport { LARGE_USER_CARD, UserCardSize } from '@/utils/SynapseConstants'\nimport {\n ColumnTypeEnum,\n FacetColumnRequest,\n QueryBundleRequest,\n QueryResultBundle,\n} from '@sage-bionetworks/synapse-types'\nimport { QueryClient, useQuery } from '@tanstack/react-query'\nimport { useEffect, useMemo, useRef, useState } from 'react'\nimport { LoadingUserCardMedium } from '../UserCard/UserCardMedium'\nimport UserCardList from './UserCardList'\n\nconst STORED_UID_KEY = 'sage_rotate_uids'\nconst DEFAULT_DISPLAY_COUNT = 3\n\nexport type UserCardListRotateProps = {\n sql: string\n count: number\n useQueryResultUserData?: boolean\n size?: UserCardSize\n summaryLink?: string\n summaryLinkText?: string\n selectedFacets?: FacetColumnRequest[]\n sqlOperator?: SQLOperator\n searchParams?: Record<string, string>\n additionalFiltersSessionStorageKey?: string\n}\n\nexport const getDisplayIds = (\n ids: string[] = [],\n count: number = DEFAULT_DISPLAY_COUNT,\n storageUidKey: string,\n): string[] => {\n // Guard against SSR / Node.js environments where localStorage is unavailable\n if (typeof localStorage === 'undefined') {\n return ids.slice(0, count)\n }\n const storedIdsJson = localStorage.getItem(storageUidKey)\n const seenIds: string[] = storedIdsJson\n ? (JSON.parse(storedIdsJson) as string[])\n : []\n\n if (!seenIds.length) {\n const selected = ids.slice(0, count)\n localStorage.setItem(storageUidKey, JSON.stringify(selected))\n return selected\n }\n\n const seenSet = new Set(seenIds)\n const unseenIds = ids.filter(id => !seenSet.has(id))\n\n if (unseenIds.length >= count) {\n const selected = unseenIds.slice(0, count)\n localStorage.setItem(\n storageUidKey,\n JSON.stringify([...seenIds, ...selected]),\n )\n return selected\n }\n\n // Not enough unseen IDs — reset and cycle back to the beginning\n const fromStart = ids.slice(0, count - unseenIds.length)\n localStorage.setItem(storageUidKey, JSON.stringify(fromStart))\n return [...unseenIds, ...fromStart]\n}\n\nfunction buildRequest(\n sql: string,\n options?: {\n selectedFacets?: FacetColumnRequest[]\n searchParams?: Record<string, string>\n sqlOperator?: SQLOperator\n additionalFiltersSessionStorageKey?: string\n },\n): QueryBundleRequest {\n const entityId = parseEntityIdFromSqlStatement(sql)\n const additionalFilters = getAdditionalFilters(\n options?.searchParams,\n options?.sqlOperator,\n options?.additionalFiltersSessionStorageKey,\n )\n return {\n partMask: SynapseConstants.BUNDLE_MASK_QUERY_RESULTS,\n concreteType: 'org.sagebionetworks.repo.model.table.QueryBundleRequest',\n entityId,\n query: {\n sql,\n additionalFilters,\n selectedFacets: options?.selectedFacets,\n },\n }\n}\n\nfunction extractUserIdsFromBundle(\n bundle: QueryResultBundle | undefined,\n): string[] {\n if (!bundle?.queryResult?.queryResults.rows) return []\n const ownerIdColumnIndex = bundle.queryResult.queryResults.headers.findIndex(\n el => el.columnType === ColumnTypeEnum.USERID,\n )\n if (ownerIdColumnIndex === -1) return []\n return bundle.queryResult.queryResults.rows\n .map(d => d.values[ownerIdColumnIndex])\n .filter((id): id is string => id !== null)\n}\n\nexport function UserCardListRotate({\n sql,\n count,\n useQueryResultUserData = false,\n size = LARGE_USER_CARD,\n summaryLink,\n summaryLinkText,\n selectedFacets,\n searchParams,\n sqlOperator,\n additionalFiltersSessionStorageKey,\n}: UserCardListRotateProps) {\n const { accessToken, keyFactory } = useSynapseContext()\n const storageUidKey = `${STORED_UID_KEY}-${sql}-${JSON.stringify(\n selectedFacets,\n )}`\n\n const request = buildRequest(sql, {\n selectedFacets,\n searchParams,\n sqlOperator,\n additionalFiltersSessionStorageKey,\n })\n\n const { data: queryResultBundle, isPending } = useQuery({\n ...tableQueryUseQueryDefaults,\n queryKey: keyFactory.getFullTableQueryResultQueryKey(request, false),\n queryFn: () => SynapseClient.getFullQueryTableResults(request, accessToken),\n })\n\n const [rotatedShownIds, setRotatedShownIds] = useState<string[]>([])\n const allIds = useMemo(\n () => extractUserIdsFromBundle(queryResultBundle),\n [queryResultBundle],\n )\n\n const firstNIds = allIds.slice(0, count)\n\n // Not ideal to use an effect, but this ensures this is isomorphic for SSG\n // while ensuring a new set of IDs is shown after client rendering takes over.\n const hasMounted = useRef(false)\n useEffect(() => {\n if (!hasMounted.current) {\n hasMounted.current = true\n setRotatedShownIds(getDisplayIds(allIds, count, storageUidKey))\n }\n }, [allIds, count, storageUidKey])\n\n const renderedIds = rotatedShownIds.length > 0 ? rotatedShownIds : firstNIds\n\n return (\n <div className=\"UserCardListRotate\">\n {isPending && <LoadingUserCardMedium />}\n {!isPending && renderedIds.length === 0 && (\n <p className=\"font-italic\">No one was found.</p>\n )}\n {!isPending && renderedIds.length > 0 && (\n <UserCardList\n list={renderedIds}\n size={size}\n rowSet={\n useQueryResultUserData\n ? queryResultBundle?.queryResult?.queryResults\n : undefined\n }\n />\n )}\n {summaryLink && summaryLinkText && (\n <div className=\"UserCardListRotate__summary\">\n <LargeButton color=\"secondary\" variant=\"contained\" href={summaryLink}>\n {summaryLinkText}\n </LargeButton>\n </div>\n )}\n </div>\n )\n}\n\nexport default UserCardListRotate\n\n/**\n * Prefetches the UserCardListRotate table query and the user profiles it\n * references into a QueryClient for use with HydrationBoundary. Uses anonymous\n * access; warm-caches for unauthenticated users.\n */\nexport async function prefetchUserCardListRotate(\n queryClient: QueryClient,\n sql: string,\n options?: {\n selectedFacets?: FacetColumnRequest[]\n searchParams?: Record<string, string>\n sqlOperator?: SQLOperator\n additionalFiltersSessionStorageKey?: string\n count?: number\n },\n): Promise<void> {\n const keyFactory = new KeyFactory(undefined)\n const request = buildRequest(sql, options)\n const queryKey = keyFactory.getFullTableQueryResultQueryKey(request, false)\n await queryClient.prefetchQuery({\n ...tableQueryUseQueryDefaults,\n queryKey,\n queryFn: () => SynapseClient.getFullQueryTableResults(request, undefined),\n })\n\n const queryResultBundle =\n queryClient.getQueryData<QueryResultBundle>(queryKey)\n // During SSR localStorage is unavailable, so getDisplayIds falls back to\n // slice(0, count). Match that here so prefetched profiles cover exactly the\n // IDs the first render will request.\n const principalIds = extractUserIdsFromBundle(queryResultBundle).slice(\n 0,\n options?.count ?? DEFAULT_DISPLAY_COUNT,\n )\n if (principalIds.length > 0) {\n await queryClient.prefetchQuery(\n getUserProfilesWithProfilePicAttachedQueryOptions(principalIds, {\n keyFactory,\n }),\n )\n }\n}\n"],"mappings":"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"}
@@ -88,6 +88,7 @@
88
88
 
89
89
  // Primary / Secondary / Tertiary Action Colors
90
90
  --synapse-primary-action-color: #{v.$primary-action-color};
91
+ --synapse-focus-color: var(--synapse-primary-action-color);
91
92
  --synapse-primary-bgcolor-rgba: #{v.$primary-bgcolor-rgba};
92
93
  --synapse-secondary-action-color: #{v.$secondary-action-color};
93
94
  --synapse-tertiary-action-color: #{v.$tertiary-action-color};