@ynput/ayon-frontend-shared 0.3.55 → 0.3.56
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.
- package/dist/_virtual/index.cjs22.js +1 -1
- package/dist/_virtual/index.cjs23.js +1 -1
- package/dist/_virtual/index.cjs24.js +1 -1
- package/dist/_virtual/index.cjs5.js +1 -1
- package/dist/_virtual/index.cjs6.js +1 -1
- package/dist/_virtual/index.cjs8.js +1 -1
- package/dist/_virtual/index.es15.js +2 -2
- package/dist/_virtual/index.es22.js +3 -3
- package/dist/_virtual/index.es23.js +5 -5
- package/dist/_virtual/index.es24.js +5 -5
- package/dist/_virtual/index.es5.js +4 -4
- package/dist/_virtual/index.es6.js +5 -2
- package/dist/_virtual/index.es6.js.map +1 -1
- package/dist/_virtual/index.es8.js +2 -5
- package/dist/_virtual/index.es8.js.map +1 -1
- package/dist/_virtual/index.es9.js +2 -2
- package/dist/api.cjs.js +1 -1
- package/dist/api.es.js +193 -192
- package/dist/node_modules/match-sorter/dist/match-sorter.esm.cjs.js +1 -1
- package/dist/node_modules/match-sorter/dist/match-sorter.esm.es.js +1 -1
- package/dist/node_modules/rehype/node_modules/unified/lib/index.cjs.js +1 -1
- package/dist/node_modules/rehype/node_modules/unified/lib/index.es.js +2 -2
- package/dist/node_modules/rehype/node_modules/vfile/lib/index.cjs.js +1 -1
- package/dist/node_modules/rehype/node_modules/vfile/lib/index.es.js +1 -1
- package/dist/node_modules/rehype-parse/lib/index.cjs.js +1 -1
- package/dist/node_modules/rehype-parse/lib/index.es.js +1 -1
- package/dist/node_modules/remove-accents/index.cjs.js +1 -1
- package/dist/node_modules/remove-accents/index.cjs.js.map +1 -1
- package/dist/node_modules/remove-accents/index.es.js +1 -1
- package/dist/shared/node_modules/@module-federation/error-codes/dist/index.cjs.js +1 -1
- package/dist/shared/node_modules/@module-federation/error-codes/dist/index.es.js +1 -1
- package/dist/shared/node_modules/@module-federation/runtime-core/dist/index.cjs.js +1 -1
- package/dist/shared/node_modules/@module-federation/runtime-core/dist/index.es.js +1 -1
- package/dist/shared/node_modules/@module-federation/runtime-core/dist/utils/semver/utils.cjs.js +1 -1
- package/dist/shared/node_modules/@module-federation/runtime-core/dist/utils/semver/utils.es.js +1 -1
- package/dist/shared/node_modules/@module-federation/sdk/dist/utils.cjs.js +1 -1
- package/dist/shared/node_modules/@module-federation/sdk/dist/utils.es.js +1 -1
- package/dist/shared/node_modules/prop-types/index.cjs.js +1 -1
- package/dist/shared/node_modules/prop-types/index.cjs.js.map +1 -1
- package/dist/shared/node_modules/prop-types/index.es.js +1 -1
- package/dist/shared/node_modules/react-is/index.cjs.js +1 -1
- package/dist/shared/node_modules/react-is/index.es.js +1 -1
- package/dist/shared/node_modules/react-transition-group/esm/CSSTransition.cjs.js +1 -1
- package/dist/shared/node_modules/react-transition-group/esm/CSSTransition.es.js +1 -1
- package/dist/shared/node_modules/react-transition-group/esm/Transition.cjs.js +1 -1
- package/dist/shared/node_modules/react-transition-group/esm/Transition.es.js +1 -1
- package/dist/shared/node_modules/react-transition-group/esm/utils/PropTypes.cjs.js +1 -1
- package/dist/shared/node_modules/react-transition-group/esm/utils/PropTypes.es.js +1 -1
- package/dist/shared/src/api/generated/graphql.cjs.js +4 -0
- package/dist/shared/src/api/generated/graphql.cjs.js.map +1 -1
- package/dist/shared/src/api/generated/graphql.es.js +4 -0
- package/dist/shared/src/api/generated/graphql.es.js.map +1 -1
- package/dist/shared/src/api/generated/graphqlLinks.cjs.js.map +1 -1
- package/dist/shared/src/api/generated/graphqlLinks.es.js.map +1 -1
- package/dist/shared/src/api/queries/entities/transformDetailsPanelData.cjs.js +1 -1
- package/dist/shared/src/api/queries/entities/transformDetailsPanelData.cjs.js.map +1 -1
- package/dist/shared/src/api/queries/entities/transformDetailsPanelData.es.js +17 -16
- package/dist/shared/src/api/queries/entities/transformDetailsPanelData.es.js.map +1 -1
- package/dist/shared/src/api/queries/entityLists/getLists.cjs.js +1 -1
- package/dist/shared/src/api/queries/entityLists/getLists.cjs.js.map +1 -1
- package/dist/shared/src/api/queries/entityLists/getLists.es.js +47 -47
- package/dist/shared/src/api/queries/entityLists/getLists.es.js.map +1 -1
- package/dist/shared/src/api/queries/folders/getFolders.cjs.js +1 -1
- package/dist/shared/src/api/queries/folders/getFolders.cjs.js.map +1 -1
- package/dist/shared/src/api/queries/folders/getFolders.es.js +20 -22
- package/dist/shared/src/api/queries/folders/getFolders.es.js.map +1 -1
- package/dist/shared/src/api/queries/overview/getOverview.cjs.js +1 -1
- package/dist/shared/src/api/queries/overview/getOverview.cjs.js.map +1 -1
- package/dist/shared/src/api/queries/overview/getOverview.es.js +92 -89
- package/dist/shared/src/api/queries/overview/getOverview.es.js.map +1 -1
- package/dist/shared/src/api/queries/project/getProject.cjs.js +1 -1
- package/dist/shared/src/api/queries/project/getProject.cjs.js.map +1 -1
- package/dist/shared/src/api/queries/project/getProject.es.js +1 -1
- package/dist/shared/src/api/queries/project/getProject.es.js.map +1 -1
- package/dist/shared/src/api/queries/users/getUsers.cjs.js +1 -1
- package/dist/shared/src/api/queries/users/getUsers.cjs.js.map +1 -1
- package/dist/shared/src/api/queries/users/getUsers.es.js +1 -1
- package/dist/shared/src/api/queries/users/getUsers.es.js.map +1 -1
- package/dist/shared/src/api/queries/versions/getVersionsProducts.cjs.js +1 -1
- package/dist/shared/src/api/queries/versions/getVersionsProducts.cjs.js.map +1 -1
- package/dist/shared/src/api/queries/versions/getVersionsProducts.es.js +23 -23
- package/dist/shared/src/api/queries/versions/getVersionsProducts.es.js.map +1 -1
- package/dist/shared/src/api/queries/versions/getVersionsProductsUtils.cjs.js +1 -1
- package/dist/shared/src/api/queries/versions/getVersionsProductsUtils.cjs.js.map +1 -1
- package/dist/shared/src/api/queries/versions/getVersionsProductsUtils.es.js +13 -13
- package/dist/shared/src/api/queries/versions/getVersionsProductsUtils.es.js.map +1 -1
- package/dist/shared/src/components/DetailsPanelAttributes/components/RenderFieldWidget.cjs.js +3 -3
- package/dist/shared/src/components/DetailsPanelAttributes/components/RenderFieldWidget.cjs.js.map +1 -1
- package/dist/shared/src/components/DetailsPanelAttributes/components/RenderFieldWidget.es.js +51 -50
- package/dist/shared/src/components/DetailsPanelAttributes/components/RenderFieldWidget.es.js.map +1 -1
- package/dist/shared/src/containers/ListTable/ListTableWidgets.cjs.js +1 -1
- package/dist/shared/src/containers/ListTable/ListTableWidgets.cjs.js.map +1 -1
- package/dist/shared/src/containers/ListTable/ListTableWidgets.es.js +62 -58
- package/dist/shared/src/containers/ListTable/ListTableWidgets.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.es.js +21 -20
- package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildGroupByTableData.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildGroupByTableData.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildGroupByTableData.es.js +25 -24
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildGroupByTableData.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildProjectDataTable.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildProjectDataTable.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildProjectDataTable.es.js +20 -19
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildProjectDataTable.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useUpdateTableData.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useUpdateTableData.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useUpdateTableData.es.js +152 -133
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useUpdateTableData.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/CellWidget.cjs.js +2 -2
- package/dist/shared/src/containers/ProjectTreeTable/widgets/CellWidget.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/CellWidget.es.js +75 -73
- package/dist/shared/src/containers/ProjectTreeTable/widgets/CellWidget.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/DateWidget.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/DateWidget.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/DateWidget.es.js +21 -19
- package/dist/shared/src/containers/ProjectTreeTable/widgets/DateWidget.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/DateWidgetInput.cjs.js +2 -2
- package/dist/shared/src/containers/ProjectTreeTable/widgets/DateWidgetInput.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/DateWidgetInput.es.js +58 -43
- package/dist/shared/src/containers/ProjectTreeTable/widgets/DateWidgetInput.es.js.map +1 -1
- package/dist/types/api/generated/graphql.d.ts +5 -0
- package/dist/types/api/generated/graphqlLinks.d.ts +1 -0
- package/dist/types/api/queries/entities/transformDetailsPanelData.d.ts +1 -0
- package/dist/types/api/queries/overview/getOverview.d.ts +2 -1
- package/dist/types/containers/ProjectTreeTable/types/table.d.ts +3 -1
- package/dist/types/containers/ProjectTreeTable/widgets/CellWidget.d.ts +1 -0
- package/dist/types/containers/ProjectTreeTable/widgets/DateWidget.d.ts +1 -0
- package/dist/types/containers/ProjectTreeTable/widgets/DateWidgetInput.d.ts +1 -0
- package/package.json +1 -1
|
@@ -12,7 +12,7 @@ import "../../generated/bundles.es.js";
|
|
|
12
12
|
import "../../generated/configuration.es.js";
|
|
13
13
|
import "../../generated/dataImport.es.js";
|
|
14
14
|
import "../../generated/desktop.es.js";
|
|
15
|
-
import { api as
|
|
15
|
+
import { api as w } from "../../generated/entityLists.es.js";
|
|
16
16
|
import "../../generated/events.es.js";
|
|
17
17
|
import "../../generated/files.es.js";
|
|
18
18
|
import "../../generated/folders.es.js";
|
|
@@ -38,14 +38,14 @@ import "../../generated/workfiles.es.js";
|
|
|
38
38
|
import "../../generated/ynputCloud.es.js";
|
|
39
39
|
import "../../generated/grouping.es.js";
|
|
40
40
|
import "../../generated/views.es.js";
|
|
41
|
-
import {
|
|
41
|
+
import { parseJSONField as G } from "../overview/getOverview.es.js";
|
|
42
42
|
import "../overview/updateOverview.es.js";
|
|
43
43
|
import "../versions/getVersionsProducts.es.js";
|
|
44
44
|
import "../links/getEntityLinks.es.js";
|
|
45
45
|
import "lodash";
|
|
46
46
|
import "react-toastify";
|
|
47
47
|
import "uuid";
|
|
48
|
-
import { subscribeToThumbnailUpdates as
|
|
48
|
+
import { subscribeToThumbnailUpdates as A } from "../../../util/thumbnailWebsocket.es.js";
|
|
49
49
|
import "../actions/getActions.es.js";
|
|
50
50
|
import "../activities/getActivities.es.js";
|
|
51
51
|
import "../activities/updateReaction.es.js";
|
|
@@ -99,8 +99,8 @@ import "../views/updateViews.es.js";
|
|
|
99
99
|
import "../watchers/getWatchers.es.js";
|
|
100
100
|
import "../uris/getUris.es.js";
|
|
101
101
|
import I from "../../../util/pubsub.es.js";
|
|
102
|
-
const
|
|
103
|
-
function
|
|
102
|
+
const f = 10;
|
|
103
|
+
function O(s, e, t = 5e3) {
|
|
104
104
|
let r = [], i = null;
|
|
105
105
|
const o = (n, a) => {
|
|
106
106
|
r.push({ topic: n, message: a }), i || (i = setTimeout(() => {
|
|
@@ -119,7 +119,7 @@ const R = (s) => {
|
|
|
119
119
|
} catch (e) {
|
|
120
120
|
return console.warn("Failed to parse entity list data field:", e, s), {};
|
|
121
121
|
}
|
|
122
|
-
}, _ = 1e4,
|
|
122
|
+
}, _ = 1e4, F = 100, b = C.enhanceEndpoints({
|
|
123
123
|
endpoints: {
|
|
124
124
|
GetLists: {
|
|
125
125
|
transformResponse: (s) => ({
|
|
@@ -131,7 +131,7 @@ const R = (s) => {
|
|
|
131
131
|
})),
|
|
132
132
|
pageInfo: s.project.entityLists.pageInfo
|
|
133
133
|
}),
|
|
134
|
-
keepUnusedDataFor:
|
|
134
|
+
keepUnusedDataFor: f
|
|
135
135
|
},
|
|
136
136
|
GetListItems: {
|
|
137
137
|
transformResponse: (s) => {
|
|
@@ -143,23 +143,23 @@ const R = (s) => {
|
|
|
143
143
|
(t) => t.node.items.edges.map(({ node: r, ...i }) => ({
|
|
144
144
|
...r,
|
|
145
145
|
...i,
|
|
146
|
-
attrib:
|
|
146
|
+
attrib: G(i.allAttrib)
|
|
147
147
|
}))
|
|
148
148
|
),
|
|
149
149
|
pageInfo: e.node.items.pageInfo
|
|
150
150
|
};
|
|
151
151
|
},
|
|
152
|
-
keepUnusedDataFor:
|
|
152
|
+
keepUnusedDataFor: f
|
|
153
153
|
},
|
|
154
154
|
GetListsItemsForReviewSession: {
|
|
155
155
|
transformResponse: (s) => ({
|
|
156
156
|
lists: s.project.entityLists.edges.map((e) => e.node),
|
|
157
157
|
pageInfo: s.project.entityLists.pageInfo
|
|
158
158
|
}),
|
|
159
|
-
keepUnusedDataFor:
|
|
159
|
+
keepUnusedDataFor: f
|
|
160
160
|
}
|
|
161
161
|
}
|
|
162
|
-
}),
|
|
162
|
+
}), M = b.injectEndpoints({
|
|
163
163
|
endpoints: (s) => ({
|
|
164
164
|
getListsInfinite: s.infiniteQuery({
|
|
165
165
|
infiniteQueryOptions: {
|
|
@@ -179,7 +179,7 @@ const R = (s) => {
|
|
|
179
179
|
first: _,
|
|
180
180
|
after: i || void 0
|
|
181
181
|
}, n = await r.dispatch(
|
|
182
|
-
|
|
182
|
+
b.endpoints.GetLists.initiate(o, { forceRefetch: !0 })
|
|
183
183
|
);
|
|
184
184
|
return n.error ? { error: n.error } : {
|
|
185
185
|
data: n.data || {
|
|
@@ -211,12 +211,12 @@ const R = (s) => {
|
|
|
211
211
|
const o = ["entity_list.changed", "entity_list.created", "entity_list.deleted"];
|
|
212
212
|
let n = null;
|
|
213
213
|
try {
|
|
214
|
-
await t, n =
|
|
214
|
+
await t, n = O(
|
|
215
215
|
i,
|
|
216
216
|
(a, p) => {
|
|
217
|
-
p.forEach(({ topic: u, message:
|
|
218
|
-
const y =
|
|
219
|
-
if (!
|
|
217
|
+
p.forEach(({ topic: u, message: v }) => {
|
|
218
|
+
const y = v.summary, l = y.id;
|
|
219
|
+
if (!l) return;
|
|
220
220
|
const E = (m) => ({
|
|
221
221
|
// defaults
|
|
222
222
|
projectName: e,
|
|
@@ -240,7 +240,7 @@ const R = (s) => {
|
|
|
240
240
|
count: y.count
|
|
241
241
|
});
|
|
242
242
|
if (u === "entity_list.changed") {
|
|
243
|
-
const m = a.pages.flatMap((
|
|
243
|
+
const m = a.pages.flatMap((P) => P.lists).find((P) => P.id === l);
|
|
244
244
|
if (!m) return;
|
|
245
245
|
const g = E(m);
|
|
246
246
|
Object.assign(m, g);
|
|
@@ -248,7 +248,7 @@ const R = (s) => {
|
|
|
248
248
|
const m = E();
|
|
249
249
|
a.pages.length !== 0 && a.pages[0].lists.unshift(m);
|
|
250
250
|
} else u === "entity_list.deleted" && a.pages.forEach((m) => {
|
|
251
|
-
m.lists = m.lists.filter((g) => g.id !==
|
|
251
|
+
m.lists = m.lists.filter((g) => g.id !== l);
|
|
252
252
|
});
|
|
253
253
|
});
|
|
254
254
|
},
|
|
@@ -259,7 +259,7 @@ const R = (s) => {
|
|
|
259
259
|
}
|
|
260
260
|
await r, o.forEach((a) => I.unsubscribe(a)), n && typeof n.clear == "function" && n.clear();
|
|
261
261
|
},
|
|
262
|
-
keepUnusedDataFor:
|
|
262
|
+
keepUnusedDataFor: f
|
|
263
263
|
}),
|
|
264
264
|
getListItemsInfinite: s.infiniteQuery({
|
|
265
265
|
infiniteQueryOptions: {
|
|
@@ -276,12 +276,12 @@ const R = (s) => {
|
|
|
276
276
|
try {
|
|
277
277
|
const { sortBy: i, desc: o, ...n } = e, { cursor: a } = t, p = {
|
|
278
278
|
...n,
|
|
279
|
-
first:
|
|
279
|
+
first: F,
|
|
280
280
|
after: a || void 0
|
|
281
281
|
};
|
|
282
|
-
p.after = a || void 0, p.first =
|
|
282
|
+
p.after = a || void 0, p.first = F, i && (p.sortBy = i, o && (p.before = a || void 0, p.after = void 0, p.last = F, p.first = void 0));
|
|
283
283
|
const u = await r.dispatch(
|
|
284
|
-
|
|
284
|
+
b.endpoints.GetListItems.initiate(p, {
|
|
285
285
|
forceRefetch: !0
|
|
286
286
|
})
|
|
287
287
|
);
|
|
@@ -318,8 +318,8 @@ const R = (s) => {
|
|
|
318
318
|
async onCacheEntryAdded(e, { cacheDataLoaded: t, cacheEntryRemoved: r, dispatch: i, updateCachedData: o }) {
|
|
319
319
|
let n, a, p;
|
|
320
320
|
try {
|
|
321
|
-
const
|
|
322
|
-
p =
|
|
321
|
+
const l = (await t).data.pages.flatMap((c) => c.items)[0]?.entityType;
|
|
322
|
+
p = A(
|
|
323
323
|
(c) => {
|
|
324
324
|
o((L) => {
|
|
325
325
|
L?.pages && c.forEach((h) => {
|
|
@@ -332,23 +332,23 @@ const R = (s) => {
|
|
|
332
332
|
});
|
|
333
333
|
}
|
|
334
334
|
);
|
|
335
|
-
const E = "entity_list.changed", m = `entity.${
|
|
335
|
+
const E = "entity_list.changed", m = `entity.${l}`, g = (c) => {
|
|
336
336
|
i(C.util.invalidateTags([{ type: "entityListItem", id: c }]));
|
|
337
|
-
},
|
|
337
|
+
}, P = (c, L) => {
|
|
338
338
|
if (c !== E) return;
|
|
339
339
|
const d = L.summary.id;
|
|
340
340
|
d && g(d);
|
|
341
|
-
},
|
|
341
|
+
}, S = (c, L) => {
|
|
342
342
|
if (!c.startsWith(m)) return;
|
|
343
343
|
const d = L.summary.entityId;
|
|
344
344
|
d && g(d);
|
|
345
345
|
};
|
|
346
|
-
n = I.subscribe(E,
|
|
346
|
+
n = I.subscribe(E, P), l && (a = I.subscribe(m, S));
|
|
347
347
|
} catch {
|
|
348
348
|
}
|
|
349
349
|
await r, I.unsubscribe(n), I.unsubscribe(a), p && p();
|
|
350
350
|
},
|
|
351
|
-
keepUnusedDataFor:
|
|
351
|
+
keepUnusedDataFor: f
|
|
352
352
|
}),
|
|
353
353
|
getListsItemsForReviewSession: s.infiniteQuery({
|
|
354
354
|
infiniteQueryOptions: {
|
|
@@ -368,7 +368,7 @@ const R = (s) => {
|
|
|
368
368
|
first: _,
|
|
369
369
|
after: i || void 0
|
|
370
370
|
}, n = await r.dispatch(
|
|
371
|
-
|
|
371
|
+
b.endpoints.GetListsItemsForReviewSession.initiate(o, {
|
|
372
372
|
forceRefetch: !0
|
|
373
373
|
})
|
|
374
374
|
);
|
|
@@ -394,10 +394,10 @@ const R = (s) => {
|
|
|
394
394
|
id: t.id
|
|
395
395
|
}))
|
|
396
396
|
],
|
|
397
|
-
keepUnusedDataFor:
|
|
397
|
+
keepUnusedDataFor: f
|
|
398
398
|
})
|
|
399
399
|
})
|
|
400
|
-
}), N =
|
|
400
|
+
}), N = w.enhanceEndpoints({
|
|
401
401
|
endpoints: {
|
|
402
402
|
getEntityList: {
|
|
403
403
|
providesTags: (s, e, { listId: t, projectName: r }) => [
|
|
@@ -411,27 +411,27 @@ const R = (s) => {
|
|
|
411
411
|
}
|
|
412
412
|
] : []
|
|
413
413
|
],
|
|
414
|
-
keepUnusedDataFor:
|
|
414
|
+
keepUnusedDataFor: f
|
|
415
415
|
}
|
|
416
416
|
}
|
|
417
417
|
}), {
|
|
418
|
-
useGetListsInfiniteInfiniteQuery:
|
|
419
|
-
useGetListItemsInfiniteInfiniteQuery:
|
|
420
|
-
useGetListsItemsForReviewSessionInfiniteQuery:
|
|
421
|
-
useLazyGetListsItemsForReviewSessionQuery:
|
|
422
|
-
useLazyGetListItemsQuery:
|
|
423
|
-
} =
|
|
418
|
+
useGetListsInfiniteInfiniteQuery: we,
|
|
419
|
+
useGetListItemsInfiniteInfiniteQuery: Ge,
|
|
420
|
+
useGetListsItemsForReviewSessionInfiniteQuery: Ae,
|
|
421
|
+
useLazyGetListsItemsForReviewSessionQuery: Oe,
|
|
422
|
+
useLazyGetListItemsQuery: Me
|
|
423
|
+
} = M, { useGetEntityListQuery: Ne } = N;
|
|
424
424
|
export {
|
|
425
425
|
_ as LISTS_PER_PAGE,
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
426
|
+
F as LIST_ITEMS_PER_PAGE,
|
|
427
|
+
O as createBatchedCacheUpdater,
|
|
428
|
+
M as default,
|
|
429
429
|
N as getListsApiEnhanced,
|
|
430
430
|
Ne as useGetEntityListQuery,
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
431
|
+
Ge as useGetListItemsInfiniteInfiniteQuery,
|
|
432
|
+
we as useGetListsInfiniteInfiniteQuery,
|
|
433
|
+
Ae as useGetListsItemsForReviewSessionInfiniteQuery,
|
|
434
|
+
Me as useLazyGetListItemsQuery,
|
|
435
|
+
Oe as useLazyGetListsItemsForReviewSessionQuery
|
|
436
436
|
};
|
|
437
437
|
//# sourceMappingURL=getLists.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getLists.es.js","sources":["../../../../../../src/api/queries/entityLists/getLists.ts"],"sourcesContent":["import { entityListsApi, gqlApi } from '@shared/api/generated'\nimport {\n FetchBaseQueryError,\n DefinitionsFromApi,\n OverrideResultType,\n TagTypesFromApi,\n} from '@reduxjs/toolkit/query'\nimport type {\n EntityList,\n GetListItemsQuery,\n GetListItemsQueryVariables,\n GetListsItemsForReviewSessionQuery,\n GetListsItemsForReviewSessionResult,\n GetListsQuery,\n GetListsQueryVariables,\n} from '@shared/api'\nimport { parseAllAttribs } from '../overview'\nimport { PubSub, subscribeToThumbnailUpdates, ThumbnailUpdateMessage } from '@shared/util'\nimport {\n GetListItemsResult,\n GetListsResult,\n ListItemMessage,\n ListItemsPageParam,\n ListsPageParam,\n} from './types'\n\nconst CACHE_TIME = 10 // seconds\n\n// Helper function to batch pub/sub messages to avoid constant cache updates\nexport function createBatchedCacheUpdater<TMessage, TDraft>(\n updateCachedData: (updater: (draft: TDraft) => void) => void,\n applyBatch: (draft: TDraft, batch: { topic: string; message: TMessage }[]) => void,\n delay = 5000,\n) {\n let queue: { topic: string; message: TMessage }[] = []\n let timeout: ReturnType<typeof setTimeout> | null = null\n\n const handler = (topic: string, message: TMessage) => {\n queue.push({ topic, message })\n if (!timeout) {\n timeout = setTimeout(() => {\n const batch = [...queue]\n queue = []\n timeout = null\n if (batch.length > 0) {\n updateCachedData((draft) => applyBatch(draft, batch))\n }\n }, delay)\n }\n }\n\n handler.clear = () => {\n if (timeout) {\n clearTimeout(timeout)\n timeout = null\n }\n queue = []\n }\n\n return handler\n}\n\n// Helper function to safely parse entity list data field from JSON string to object\nconst parseJSON = (data: string | null | undefined): Record<string, any> => {\n if (!data) return {}\n\n try {\n if (typeof data !== 'string') {\n return (data as unknown as Record<string, any>) ?? {}\n }\n return JSON.parse(data)\n } catch (e) {\n console.warn('Failed to parse entity list data field:', e, data)\n return {}\n }\n}\n\n// GRAPHQL API (getLists and getListItems)\n// Define the LISTS_PER_PAGE constant for pagination\nexport const LISTS_PER_PAGE = 10000\nexport const LIST_ITEMS_PER_PAGE = 100\n\ntype Definitions = DefinitionsFromApi<typeof gqlApi>\ntype TagTypes = TagTypesFromApi<typeof gqlApi>\n// update the definitions to include the new types\ntype UpdatedDefinitions = Omit<Definitions, 'GetLists' | 'GetListItems'> & {\n GetLists: OverrideResultType<Definitions['GetLists'], GetListsResult>\n GetListItems: OverrideResultType<Definitions['GetListItems'], GetListItemsResult>\n GetListsItemsForReviewSession: OverrideResultType<\n Definitions['GetListsItemsForReviewSession'],\n GetListsItemsForReviewSessionResult\n >\n}\n\nconst getListsGqlApiEnhanced = gqlApi.enhanceEndpoints<TagTypes, UpdatedDefinitions>({\n endpoints: {\n GetLists: {\n transformResponse: (response: GetListsQuery): GetListsResult => {\n return {\n // @ts-expect-error - entityType is string\n lists: response.project.entityLists.edges.map((edge) => ({\n ...edge.node,\n data: parseJSON(edge.node.data),\n attrib: parseJSON(edge.node.allAttrib),\n })),\n pageInfo: response.project.entityLists.pageInfo,\n }\n },\n keepUnusedDataFor: CACHE_TIME,\n },\n GetListItems: {\n transformResponse: (response: GetListItemsQuery): GetListItemsResult => {\n const firstEdge = response.project.entityLists.edges[0]\n if (!firstEdge) {\n throw new Error('List does not exist, was it deleted?')\n }\n return {\n items: response.project.entityLists.edges.flatMap((listEdge) =>\n listEdge.node.items.edges.map(({ node, ...edge }) => {\n return {\n ...node,\n ...edge,\n attrib: parseAllAttribs(edge.allAttrib),\n } as GetListItemsResult['items'][number]\n }),\n ),\n pageInfo: firstEdge.node.items.pageInfo,\n }\n },\n keepUnusedDataFor: CACHE_TIME,\n },\n GetListsItemsForReviewSession: {\n transformResponse: (\n response: GetListsItemsForReviewSessionQuery,\n ): GetListsItemsForReviewSessionResult => {\n return {\n lists: response.project.entityLists.edges.map((edge) => edge.node),\n pageInfo: response.project.entityLists.pageInfo,\n }\n },\n keepUnusedDataFor: CACHE_TIME,\n },\n },\n})\n\nconst getListsGqlApiInjected = getListsGqlApiEnhanced.injectEndpoints({\n endpoints: (build) => ({\n getListsInfinite: build.infiniteQuery<\n GetListsResult,\n Omit<GetListsQueryVariables, 'first' | 'after' | 'before'>,\n ListsPageParam\n >({\n infiniteQueryOptions: {\n initialPageParam: { cursor: '' },\n getNextPageParam: (lastPage) => {\n const { pageInfo } = lastPage\n if (!pageInfo.hasNextPage || !pageInfo.endCursor) return undefined\n\n return {\n cursor: pageInfo.endCursor,\n }\n },\n },\n queryFn: async ({ queryArg, pageParam }, api) => {\n try {\n const { cursor } = pageParam\n\n // Build the query parameters for GetLists\n const queryParams = {\n ...queryArg,\n first: LISTS_PER_PAGE,\n after: cursor || undefined,\n }\n\n // Call the existing GetLists endpoint\n const result = await api.dispatch(\n getListsGqlApiEnhanced.endpoints.GetLists.initiate(queryParams, { forceRefetch: true }),\n )\n\n if (result.error) {\n // Preserve original error (e.g. 403) so the UI can react accordingly\n return { error: result.error as FetchBaseQueryError }\n }\n\n return {\n data: result.data || {\n lists: [],\n pageInfo: {\n hasNextPage: false,\n endCursor: null,\n startCursor: null,\n hasPreviousPage: false,\n },\n },\n }\n } catch (e: any) {\n console.error('Error in getListsInfinite queryFn:', e)\n return { error: { status: 'FETCH_ERROR', error: e.message } as FetchBaseQueryError }\n }\n },\n providesTags: (result) => {\n const lists = result?.pages.flatMap((page) => page.lists) || []\n return [\n { type: 'entityList', id: 'LIST' },\n ...lists.flatMap((list) => [\n { type: 'entityList' as const, id: list.id },\n { type: 'entityList' as const, id: list.entityListType },\n { type: 'entityList' as const, id: list.entityListFolderId || 'NO_FOLDER' },\n ]),\n ]\n },\n async onCacheEntryAdded(\n { projectName },\n { cacheDataLoaded, cacheEntryRemoved, updateCachedData },\n ) {\n const topics = ['entity_list.changed', 'entity_list.created', 'entity_list.deleted']\n let handlePubSub: any = null\n try {\n // wait for the initial query to resolve before proceeding\n await cacheDataLoaded\n\n handlePubSub = createBatchedCacheUpdater<ListItemMessage, any>(\n updateCachedData,\n (draft, batch) => {\n batch.forEach(({ topic, message }) => {\n const summary = message.summary\n const id = summary.id\n if (!id) return\n\n const getListFromSummary = (list?: EntityList): EntityList => {\n return {\n // defaults\n projectName: projectName,\n tags: [],\n data: {},\n allAttrib: '',\n attrib: {},\n createdAt: new Date().toISOString(),\n updatedAt: '',\n active: true,\n access: '',\n accessLevel: 30, // default admin\n // existing data\n ...(list || {}),\n // new data\n id: summary.id as string,\n label: summary.label,\n entityType: summary.entity_type,\n entityListType: summary.entity_list_type,\n count: summary.count,\n }\n }\n\n if (topic === 'entity_list.changed') {\n // update the data of existing list in cache\n const list = draft.pages\n .flatMap((page: any) => page.lists)\n .find((l: any) => l.id === id)\n if (!list) return\n const newList = getListFromSummary(list)\n\n Object.assign(list, newList)\n } else if (topic === 'entity_list.created') {\n // Add new list to the cache using basic summary\n const newList = getListFromSummary()\n // Insert the new list at the beginning of the first page\n if (draft.pages.length !== 0) {\n draft.pages[0].lists.unshift(newList)\n }\n } else if (topic === 'entity_list.deleted') {\n // delete the list from the cache\n draft.pages.forEach((page: any) => {\n page.lists = page.lists.filter((l: any) => l.id !== id)\n })\n }\n })\n },\n 10000, // 10 seconds debounce/batch window\n )\n\n topics.forEach((topic) => PubSub.subscribe(topic, handlePubSub))\n } catch {\n // no-op in case `cacheEntryRemoved` resolves before `cacheDataLoaded`,\n // in which case `cacheDataLoaded` will throw\n }\n // cacheEntryRemoved will resolve when the cache subscription is no longer active\n await cacheEntryRemoved\n // perform cleanup steps once the `cacheEntryRemoved` promise resolves\n topics.forEach((t) => PubSub.unsubscribe(t))\n if (handlePubSub && typeof handlePubSub.clear === 'function') handlePubSub.clear()\n },\n keepUnusedDataFor: CACHE_TIME,\n }),\n getListItemsInfinite: build.infiniteQuery<\n GetListItemsResult,\n Omit<GetListItemsQueryVariables, 'first' | 'after' | 'before' | 'last'> & { desc?: boolean },\n ListItemsPageParam\n >({\n infiniteQueryOptions: {\n initialPageParam: { cursor: '' },\n getNextPageParam: (lastPage) => {\n const { pageInfo } = lastPage\n // ascending paginates via hasNextPage, descending (last/before) via\n // hasPreviousPage — the backend only sets one depending on direction\n const hasMore = pageInfo.hasNextPage || pageInfo.hasPreviousPage\n if (!hasMore || !pageInfo.endCursor) return undefined\n\n return {\n cursor: pageInfo.endCursor,\n }\n },\n },\n queryFn: async ({ queryArg, pageParam }, api) => {\n try {\n const { sortBy, desc, ...rest } = queryArg\n const { cursor } = pageParam\n\n // Build the query parameters for GetLists\n const queryParams: GetListItemsQueryVariables = {\n ...rest,\n first: LIST_ITEMS_PER_PAGE,\n after: cursor || undefined,\n }\n\n // Add cursor-based pagination\n queryParams.after = cursor || undefined\n queryParams.first = LIST_ITEMS_PER_PAGE\n\n if (sortBy) {\n queryParams.sortBy = sortBy\n if (desc) {\n queryParams.before = cursor || undefined\n queryParams.after = undefined\n queryParams.last = LIST_ITEMS_PER_PAGE\n queryParams.first = undefined\n }\n }\n\n // Call the existing GetLists endpoint\n const result = await api.dispatch(\n getListsGqlApiEnhanced.endpoints.GetListItems.initiate(queryParams, {\n forceRefetch: true,\n }),\n )\n\n if (result.error) {\n return { error: result.error as FetchBaseQueryError }\n }\n\n return {\n data: result.data || {\n items: [],\n pageInfo: {\n hasNextPage: false,\n endCursor: null,\n startCursor: null,\n hasPreviousPage: false,\n },\n },\n }\n } catch (e: any) {\n console.error('Error in getListsInfinite queryFn:', e)\n return { error: { status: 'FETCH_ERROR', error: e.message } as FetchBaseQueryError }\n }\n },\n providesTags: (result, _e, { listId, projectName }) => [\n { type: 'entityListItem', id: 'LIST' },\n { type: 'entityListItem', id: listId },\n { type: 'entityListItem', id: projectName },\n ...(result?.pages.flatMap((page) => page.items) || [])\n .filter((i) => !!i)\n .flatMap((item) => [\n {\n type: 'entityListItem',\n id: item.id,\n },\n {\n type: 'entityListItem',\n id: item.entityId,\n },\n ]),\n ],\n async onCacheEntryAdded(\n _args,\n { cacheDataLoaded, cacheEntryRemoved, dispatch, updateCachedData },\n ) {\n let token, token2\n let unsubscribeThumbnails: (() => void) | undefined\n try {\n // wait for the initial query to resolve before proceeding\n const cache = await cacheDataLoaded\n const pages = cache.data.pages\n const items = pages.flatMap((page) => page.items)\n // get entityType of first item\n const entityType = items[0]?.entityType\n\n unsubscribeThumbnails = subscribeToThumbnailUpdates(\n (messages: ThumbnailUpdateMessage[]) => {\n updateCachedData((draft: any) => {\n if (!draft?.pages) return\n messages.forEach((message) => {\n draft.pages.forEach((page: any) => {\n const pageItems = page.items || []\n pageItems.forEach((item: any) => {\n if (\n item.entityId === message.summary.entityId &&\n item.entityType === message.summary.entityType &&\n message.summary.thumbnailHash\n ) {\n item.thumbnailHash = message.summary.thumbnailHash\n }\n })\n })\n })\n })\n },\n )\n\n const listTopic = `entity_list.changed`\n const entityTypeTopic = `entity.${entityType}`\n\n const invalidateListItems = (id: string) => {\n dispatch(gqlApi.util.invalidateTags([{ type: 'entityListItem', id: id }]))\n }\n\n const handleListMessage = (topic: string, message: ListItemMessage) => {\n if (topic !== listTopic) return\n const summary = message.summary\n const id = summary.id\n if (!id) return\n invalidateListItems(id)\n }\n\n const handleEntityMessage = (topic: string, message: ListItemMessage) => {\n if (!topic.startsWith(entityTypeTopic)) return\n const summary = message.summary\n const id = summary.entityId\n // check for id\n if (!id) return\n invalidateListItems(id)\n }\n\n // sub to websocket topic\n token = PubSub.subscribe(listTopic, handleListMessage)\n if (entityType) token2 = PubSub.subscribe(entityTypeTopic, handleEntityMessage)\n } catch {\n // no-op in case `cacheEntryRemoved` resolves before `cacheDataLoaded`,\n // in which case `cacheDataLoaded` will throw\n }\n // cacheEntryRemoved will resolve when the cache subscription is no longer active\n await cacheEntryRemoved\n // perform cleanup steps once the `cacheEntryRemoved` promise resolves\n PubSub.unsubscribe(token)\n PubSub.unsubscribe(token2)\n if (unsubscribeThumbnails) {\n unsubscribeThumbnails()\n }\n },\n keepUnusedDataFor: CACHE_TIME,\n }),\n getListsItemsForReviewSession: build.infiniteQuery<\n GetListsItemsForReviewSessionResult,\n Omit<GetListsQueryVariables, 'first' | 'after' | 'before' | 'filter'>,\n ListsPageParam\n >({\n infiniteQueryOptions: {\n initialPageParam: { cursor: '' },\n getNextPageParam: (lastPage) => {\n const { pageInfo } = lastPage\n if (!pageInfo.hasNextPage || !pageInfo.endCursor) return undefined\n\n return {\n cursor: pageInfo.endCursor,\n }\n },\n },\n queryFn: async ({ queryArg, pageParam }, api) => {\n try {\n const { cursor } = pageParam\n\n // Build the query parameters for GetLists\n const queryParams = {\n ...queryArg,\n first: LISTS_PER_PAGE,\n after: cursor || undefined,\n }\n\n // Call the existing GetLists endpoint\n const result = await api.dispatch(\n getListsGqlApiEnhanced.endpoints.GetListsItemsForReviewSession.initiate(queryParams, {\n forceRefetch: true,\n }),\n )\n\n if (result.error) {\n return { error: result.error as FetchBaseQueryError }\n }\n\n return {\n data: result.data || {\n lists: [],\n pageInfo: {\n hasNextPage: false,\n endCursor: null,\n startCursor: null,\n hasPreviousPage: false,\n },\n },\n }\n } catch (e: any) {\n console.error('Error in getListsInfinite queryFn:', e)\n return { error: { status: 'FETCH_ERROR', error: e.message } as FetchBaseQueryError }\n }\n },\n providesTags: (result) => [\n { type: 'entityList', id: 'LIST' },\n ...(result?.pages.flatMap((page) => page.lists) || []).map((list) => ({\n type: 'entityList' as const,\n id: list.id,\n })),\n ],\n keepUnusedDataFor: CACHE_TIME,\n }),\n }),\n})\n\nexport const getListsApiEnhanced = entityListsApi.enhanceEndpoints({\n endpoints: {\n getEntityList: {\n providesTags: (result, _e, { listId, projectName }) => [\n { type: 'entityList', id: listId },\n { type: 'entityList', id: projectName },\n ...(result\n ? [\n { type: 'entityList', id: result.entityListType },\n {\n type: 'entityList',\n id: result.entityListFolderId || 'NO_FOLDER',\n },\n ]\n : []),\n ],\n keepUnusedDataFor: CACHE_TIME,\n },\n },\n})\n\nexport default getListsGqlApiInjected\n\nexport const {\n useGetListsInfiniteInfiniteQuery,\n useGetListItemsInfiniteInfiniteQuery,\n useGetListsItemsForReviewSessionInfiniteQuery,\n useLazyGetListsItemsForReviewSessionQuery,\n useLazyGetListItemsQuery,\n} = getListsGqlApiInjected\n\nexport const { useGetEntityListQuery } = getListsApiEnhanced\n"],"names":["CACHE_TIME","createBatchedCacheUpdater","updateCachedData","applyBatch","delay","queue","timeout","handler","topic","message","batch","draft","parseJSON","data","LISTS_PER_PAGE","LIST_ITEMS_PER_PAGE","getListsGqlApiEnhanced","gqlApi","response","edge","firstEdge","listEdge","node","parseAllAttribs","getListsGqlApiInjected","build","lastPage","pageInfo","queryArg","pageParam","api","cursor","queryParams","result","e","lists","page","list","projectName","cacheDataLoaded","cacheEntryRemoved","topics","handlePubSub","summary","id","getListFromSummary","l","newList","PubSub","t","sortBy","desc","rest","_e","listId","i","item","_args","dispatch","token","token2","unsubscribeThumbnails","entityType","subscribeToThumbnailUpdates","messages","listTopic","entityTypeTopic","invalidateListItems","handleListMessage","handleEntityMessage","getListsApiEnhanced","entityListsApi","useGetListsInfiniteInfiniteQuery","useGetListItemsInfiniteInfiniteQuery","useGetListsItemsForReviewSessionInfiniteQuery","useLazyGetListsItemsForReviewSessionQuery","useLazyGetListItemsQuery","useGetEntityListQuery"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"getLists.es.js","sources":["../../../../../../src/api/queries/entityLists/getLists.ts"],"sourcesContent":["import { entityListsApi, gqlApi } from '@shared/api/generated'\nimport {\n FetchBaseQueryError,\n DefinitionsFromApi,\n OverrideResultType,\n TagTypesFromApi,\n} from '@reduxjs/toolkit/query'\nimport type {\n EntityList,\n GetListItemsQuery,\n GetListItemsQueryVariables,\n GetListsItemsForReviewSessionQuery,\n GetListsItemsForReviewSessionResult,\n GetListsQuery,\n GetListsQueryVariables,\n} from '@shared/api'\nimport { parseJSONField } from '../overview'\nimport { PubSub, subscribeToThumbnailUpdates, ThumbnailUpdateMessage } from '@shared/util'\nimport {\n GetListItemsResult,\n GetListsResult,\n ListItemMessage,\n ListItemsPageParam,\n ListsPageParam,\n} from './types'\n\nconst CACHE_TIME = 10 // seconds\n\n// Helper function to batch pub/sub messages to avoid constant cache updates\nexport function createBatchedCacheUpdater<TMessage, TDraft>(\n updateCachedData: (updater: (draft: TDraft) => void) => void,\n applyBatch: (draft: TDraft, batch: { topic: string; message: TMessage }[]) => void,\n delay = 5000,\n) {\n let queue: { topic: string; message: TMessage }[] = []\n let timeout: ReturnType<typeof setTimeout> | null = null\n\n const handler = (topic: string, message: TMessage) => {\n queue.push({ topic, message })\n if (!timeout) {\n timeout = setTimeout(() => {\n const batch = [...queue]\n queue = []\n timeout = null\n if (batch.length > 0) {\n updateCachedData((draft) => applyBatch(draft, batch))\n }\n }, delay)\n }\n }\n\n handler.clear = () => {\n if (timeout) {\n clearTimeout(timeout)\n timeout = null\n }\n queue = []\n }\n\n return handler\n}\n\n// Helper function to safely parse entity list data field from JSON string to object\nconst parseJSON = (data: string | null | undefined): Record<string, any> => {\n if (!data) return {}\n\n try {\n if (typeof data !== 'string') {\n return (data as unknown as Record<string, any>) ?? {}\n }\n return JSON.parse(data)\n } catch (e) {\n console.warn('Failed to parse entity list data field:', e, data)\n return {}\n }\n}\n\n// GRAPHQL API (getLists and getListItems)\n// Define the LISTS_PER_PAGE constant for pagination\nexport const LISTS_PER_PAGE = 10000\nexport const LIST_ITEMS_PER_PAGE = 100\n\ntype Definitions = DefinitionsFromApi<typeof gqlApi>\ntype TagTypes = TagTypesFromApi<typeof gqlApi>\n// update the definitions to include the new types\ntype UpdatedDefinitions = Omit<Definitions, 'GetLists' | 'GetListItems'> & {\n GetLists: OverrideResultType<Definitions['GetLists'], GetListsResult>\n GetListItems: OverrideResultType<Definitions['GetListItems'], GetListItemsResult>\n GetListsItemsForReviewSession: OverrideResultType<\n Definitions['GetListsItemsForReviewSession'],\n GetListsItemsForReviewSessionResult\n >\n}\n\nconst getListsGqlApiEnhanced = gqlApi.enhanceEndpoints<TagTypes, UpdatedDefinitions>({\n endpoints: {\n GetLists: {\n transformResponse: (response: GetListsQuery): GetListsResult => {\n return {\n // @ts-expect-error - entityType is string\n lists: response.project.entityLists.edges.map((edge) => ({\n ...edge.node,\n data: parseJSON(edge.node.data),\n attrib: parseJSON(edge.node.allAttrib),\n })),\n pageInfo: response.project.entityLists.pageInfo,\n }\n },\n keepUnusedDataFor: CACHE_TIME,\n },\n GetListItems: {\n transformResponse: (response: GetListItemsQuery): GetListItemsResult => {\n const firstEdge = response.project.entityLists.edges[0]\n if (!firstEdge) {\n throw new Error('List does not exist, was it deleted?')\n }\n return {\n items: response.project.entityLists.edges.flatMap((listEdge) =>\n listEdge.node.items.edges.map(({ node, ...edge }) => {\n return {\n ...node,\n ...edge,\n attrib: parseJSONField(edge.allAttrib),\n } as GetListItemsResult['items'][number]\n }),\n ),\n pageInfo: firstEdge.node.items.pageInfo,\n }\n },\n keepUnusedDataFor: CACHE_TIME,\n },\n GetListsItemsForReviewSession: {\n transformResponse: (\n response: GetListsItemsForReviewSessionQuery,\n ): GetListsItemsForReviewSessionResult => {\n return {\n lists: response.project.entityLists.edges.map((edge) => edge.node),\n pageInfo: response.project.entityLists.pageInfo,\n }\n },\n keepUnusedDataFor: CACHE_TIME,\n },\n },\n})\n\nconst getListsGqlApiInjected = getListsGqlApiEnhanced.injectEndpoints({\n endpoints: (build) => ({\n getListsInfinite: build.infiniteQuery<\n GetListsResult,\n Omit<GetListsQueryVariables, 'first' | 'after' | 'before'>,\n ListsPageParam\n >({\n infiniteQueryOptions: {\n initialPageParam: { cursor: '' },\n getNextPageParam: (lastPage) => {\n const { pageInfo } = lastPage\n if (!pageInfo.hasNextPage || !pageInfo.endCursor) return undefined\n\n return {\n cursor: pageInfo.endCursor,\n }\n },\n },\n queryFn: async ({ queryArg, pageParam }, api) => {\n try {\n const { cursor } = pageParam\n\n // Build the query parameters for GetLists\n const queryParams = {\n ...queryArg,\n first: LISTS_PER_PAGE,\n after: cursor || undefined,\n }\n\n // Call the existing GetLists endpoint\n const result = await api.dispatch(\n getListsGqlApiEnhanced.endpoints.GetLists.initiate(queryParams, { forceRefetch: true }),\n )\n\n if (result.error) {\n // Preserve original error (e.g. 403) so the UI can react accordingly\n return { error: result.error as FetchBaseQueryError }\n }\n\n return {\n data: result.data || {\n lists: [],\n pageInfo: {\n hasNextPage: false,\n endCursor: null,\n startCursor: null,\n hasPreviousPage: false,\n },\n },\n }\n } catch (e: any) {\n console.error('Error in getListsInfinite queryFn:', e)\n return { error: { status: 'FETCH_ERROR', error: e.message } as FetchBaseQueryError }\n }\n },\n providesTags: (result) => {\n const lists = result?.pages.flatMap((page) => page.lists) || []\n return [\n { type: 'entityList', id: 'LIST' },\n ...lists.flatMap((list) => [\n { type: 'entityList' as const, id: list.id },\n { type: 'entityList' as const, id: list.entityListType },\n { type: 'entityList' as const, id: list.entityListFolderId || 'NO_FOLDER' },\n ]),\n ]\n },\n async onCacheEntryAdded(\n { projectName },\n { cacheDataLoaded, cacheEntryRemoved, updateCachedData },\n ) {\n const topics = ['entity_list.changed', 'entity_list.created', 'entity_list.deleted']\n let handlePubSub: any = null\n try {\n // wait for the initial query to resolve before proceeding\n await cacheDataLoaded\n\n handlePubSub = createBatchedCacheUpdater<ListItemMessage, any>(\n updateCachedData,\n (draft, batch) => {\n batch.forEach(({ topic, message }) => {\n const summary = message.summary\n const id = summary.id\n if (!id) return\n\n const getListFromSummary = (list?: EntityList): EntityList => {\n return {\n // defaults\n projectName: projectName,\n tags: [],\n data: {},\n allAttrib: '',\n attrib: {},\n createdAt: new Date().toISOString(),\n updatedAt: '',\n active: true,\n access: '',\n accessLevel: 30, // default admin\n // existing data\n ...(list || {}),\n // new data\n id: summary.id as string,\n label: summary.label,\n entityType: summary.entity_type,\n entityListType: summary.entity_list_type,\n count: summary.count,\n }\n }\n\n if (topic === 'entity_list.changed') {\n // update the data of existing list in cache\n const list = draft.pages\n .flatMap((page: any) => page.lists)\n .find((l: any) => l.id === id)\n if (!list) return\n const newList = getListFromSummary(list)\n\n Object.assign(list, newList)\n } else if (topic === 'entity_list.created') {\n // Add new list to the cache using basic summary\n const newList = getListFromSummary()\n // Insert the new list at the beginning of the first page\n if (draft.pages.length !== 0) {\n draft.pages[0].lists.unshift(newList)\n }\n } else if (topic === 'entity_list.deleted') {\n // delete the list from the cache\n draft.pages.forEach((page: any) => {\n page.lists = page.lists.filter((l: any) => l.id !== id)\n })\n }\n })\n },\n 10000, // 10 seconds debounce/batch window\n )\n\n topics.forEach((topic) => PubSub.subscribe(topic, handlePubSub))\n } catch {\n // no-op in case `cacheEntryRemoved` resolves before `cacheDataLoaded`,\n // in which case `cacheDataLoaded` will throw\n }\n // cacheEntryRemoved will resolve when the cache subscription is no longer active\n await cacheEntryRemoved\n // perform cleanup steps once the `cacheEntryRemoved` promise resolves\n topics.forEach((t) => PubSub.unsubscribe(t))\n if (handlePubSub && typeof handlePubSub.clear === 'function') handlePubSub.clear()\n },\n keepUnusedDataFor: CACHE_TIME,\n }),\n getListItemsInfinite: build.infiniteQuery<\n GetListItemsResult,\n Omit<GetListItemsQueryVariables, 'first' | 'after' | 'before' | 'last'> & { desc?: boolean },\n ListItemsPageParam\n >({\n infiniteQueryOptions: {\n initialPageParam: { cursor: '' },\n getNextPageParam: (lastPage) => {\n const { pageInfo } = lastPage\n // ascending paginates via hasNextPage, descending (last/before) via\n // hasPreviousPage — the backend only sets one depending on direction\n const hasMore = pageInfo.hasNextPage || pageInfo.hasPreviousPage\n if (!hasMore || !pageInfo.endCursor) return undefined\n\n return {\n cursor: pageInfo.endCursor,\n }\n },\n },\n queryFn: async ({ queryArg, pageParam }, api) => {\n try {\n const { sortBy, desc, ...rest } = queryArg\n const { cursor } = pageParam\n\n // Build the query parameters for GetLists\n const queryParams: GetListItemsQueryVariables = {\n ...rest,\n first: LIST_ITEMS_PER_PAGE,\n after: cursor || undefined,\n }\n\n // Add cursor-based pagination\n queryParams.after = cursor || undefined\n queryParams.first = LIST_ITEMS_PER_PAGE\n\n if (sortBy) {\n queryParams.sortBy = sortBy\n if (desc) {\n queryParams.before = cursor || undefined\n queryParams.after = undefined\n queryParams.last = LIST_ITEMS_PER_PAGE\n queryParams.first = undefined\n }\n }\n\n // Call the existing GetLists endpoint\n const result = await api.dispatch(\n getListsGqlApiEnhanced.endpoints.GetListItems.initiate(queryParams, {\n forceRefetch: true,\n }),\n )\n\n if (result.error) {\n return { error: result.error as FetchBaseQueryError }\n }\n\n return {\n data: result.data || {\n items: [],\n pageInfo: {\n hasNextPage: false,\n endCursor: null,\n startCursor: null,\n hasPreviousPage: false,\n },\n },\n }\n } catch (e: any) {\n console.error('Error in getListsInfinite queryFn:', e)\n return { error: { status: 'FETCH_ERROR', error: e.message } as FetchBaseQueryError }\n }\n },\n providesTags: (result, _e, { listId, projectName }) => [\n { type: 'entityListItem', id: 'LIST' },\n { type: 'entityListItem', id: listId },\n { type: 'entityListItem', id: projectName },\n ...(result?.pages.flatMap((page) => page.items) || [])\n .filter((i) => !!i)\n .flatMap((item) => [\n {\n type: 'entityListItem',\n id: item.id,\n },\n {\n type: 'entityListItem',\n id: item.entityId,\n },\n ]),\n ],\n async onCacheEntryAdded(\n _args,\n { cacheDataLoaded, cacheEntryRemoved, dispatch, updateCachedData },\n ) {\n let token, token2\n let unsubscribeThumbnails: (() => void) | undefined\n try {\n // wait for the initial query to resolve before proceeding\n const cache = await cacheDataLoaded\n const pages = cache.data.pages\n const items = pages.flatMap((page) => page.items)\n // get entityType of first item\n const entityType = items[0]?.entityType\n\n unsubscribeThumbnails = subscribeToThumbnailUpdates(\n (messages: ThumbnailUpdateMessage[]) => {\n updateCachedData((draft: any) => {\n if (!draft?.pages) return\n messages.forEach((message) => {\n draft.pages.forEach((page: any) => {\n const pageItems = page.items || []\n pageItems.forEach((item: any) => {\n if (\n item.entityId === message.summary.entityId &&\n item.entityType === message.summary.entityType &&\n message.summary.thumbnailHash\n ) {\n item.thumbnailHash = message.summary.thumbnailHash\n }\n })\n })\n })\n })\n },\n )\n\n const listTopic = `entity_list.changed`\n const entityTypeTopic = `entity.${entityType}`\n\n const invalidateListItems = (id: string) => {\n dispatch(gqlApi.util.invalidateTags([{ type: 'entityListItem', id: id }]))\n }\n\n const handleListMessage = (topic: string, message: ListItemMessage) => {\n if (topic !== listTopic) return\n const summary = message.summary\n const id = summary.id\n if (!id) return\n invalidateListItems(id)\n }\n\n const handleEntityMessage = (topic: string, message: ListItemMessage) => {\n if (!topic.startsWith(entityTypeTopic)) return\n const summary = message.summary\n const id = summary.entityId\n // check for id\n if (!id) return\n invalidateListItems(id)\n }\n\n // sub to websocket topic\n token = PubSub.subscribe(listTopic, handleListMessage)\n if (entityType) token2 = PubSub.subscribe(entityTypeTopic, handleEntityMessage)\n } catch {\n // no-op in case `cacheEntryRemoved` resolves before `cacheDataLoaded`,\n // in which case `cacheDataLoaded` will throw\n }\n // cacheEntryRemoved will resolve when the cache subscription is no longer active\n await cacheEntryRemoved\n // perform cleanup steps once the `cacheEntryRemoved` promise resolves\n PubSub.unsubscribe(token)\n PubSub.unsubscribe(token2)\n if (unsubscribeThumbnails) {\n unsubscribeThumbnails()\n }\n },\n keepUnusedDataFor: CACHE_TIME,\n }),\n getListsItemsForReviewSession: build.infiniteQuery<\n GetListsItemsForReviewSessionResult,\n Omit<GetListsQueryVariables, 'first' | 'after' | 'before' | 'filter'>,\n ListsPageParam\n >({\n infiniteQueryOptions: {\n initialPageParam: { cursor: '' },\n getNextPageParam: (lastPage) => {\n const { pageInfo } = lastPage\n if (!pageInfo.hasNextPage || !pageInfo.endCursor) return undefined\n\n return {\n cursor: pageInfo.endCursor,\n }\n },\n },\n queryFn: async ({ queryArg, pageParam }, api) => {\n try {\n const { cursor } = pageParam\n\n // Build the query parameters for GetLists\n const queryParams = {\n ...queryArg,\n first: LISTS_PER_PAGE,\n after: cursor || undefined,\n }\n\n // Call the existing GetLists endpoint\n const result = await api.dispatch(\n getListsGqlApiEnhanced.endpoints.GetListsItemsForReviewSession.initiate(queryParams, {\n forceRefetch: true,\n }),\n )\n\n if (result.error) {\n return { error: result.error as FetchBaseQueryError }\n }\n\n return {\n data: result.data || {\n lists: [],\n pageInfo: {\n hasNextPage: false,\n endCursor: null,\n startCursor: null,\n hasPreviousPage: false,\n },\n },\n }\n } catch (e: any) {\n console.error('Error in getListsInfinite queryFn:', e)\n return { error: { status: 'FETCH_ERROR', error: e.message } as FetchBaseQueryError }\n }\n },\n providesTags: (result) => [\n { type: 'entityList', id: 'LIST' },\n ...(result?.pages.flatMap((page) => page.lists) || []).map((list) => ({\n type: 'entityList' as const,\n id: list.id,\n })),\n ],\n keepUnusedDataFor: CACHE_TIME,\n }),\n }),\n})\n\nexport const getListsApiEnhanced = entityListsApi.enhanceEndpoints({\n endpoints: {\n getEntityList: {\n providesTags: (result, _e, { listId, projectName }) => [\n { type: 'entityList', id: listId },\n { type: 'entityList', id: projectName },\n ...(result\n ? [\n { type: 'entityList', id: result.entityListType },\n {\n type: 'entityList',\n id: result.entityListFolderId || 'NO_FOLDER',\n },\n ]\n : []),\n ],\n keepUnusedDataFor: CACHE_TIME,\n },\n },\n})\n\nexport default getListsGqlApiInjected\n\nexport const {\n useGetListsInfiniteInfiniteQuery,\n useGetListItemsInfiniteInfiniteQuery,\n useGetListsItemsForReviewSessionInfiniteQuery,\n useLazyGetListsItemsForReviewSessionQuery,\n useLazyGetListItemsQuery,\n} = getListsGqlApiInjected\n\nexport const { useGetEntityListQuery } = getListsApiEnhanced\n"],"names":["CACHE_TIME","createBatchedCacheUpdater","updateCachedData","applyBatch","delay","queue","timeout","handler","topic","message","batch","draft","parseJSON","data","LISTS_PER_PAGE","LIST_ITEMS_PER_PAGE","getListsGqlApiEnhanced","gqlApi","response","edge","firstEdge","listEdge","node","parseJSONField","getListsGqlApiInjected","build","lastPage","pageInfo","queryArg","pageParam","api","cursor","queryParams","result","e","lists","page","list","projectName","cacheDataLoaded","cacheEntryRemoved","topics","handlePubSub","summary","id","getListFromSummary","l","newList","PubSub","t","sortBy","desc","rest","_e","listId","i","item","_args","dispatch","token","token2","unsubscribeThumbnails","entityType","subscribeToThumbnailUpdates","messages","listTopic","entityTypeTopic","invalidateListItems","handleListMessage","handleEntityMessage","getListsApiEnhanced","entityListsApi","useGetListsInfiniteInfiniteQuery","useGetListItemsInfiniteInfiniteQuery","useGetListsItemsForReviewSessionInfiniteQuery","useLazyGetListsItemsForReviewSessionQuery","useLazyGetListItemsQuery","useGetEntityListQuery"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require("../../base/client.cjs.js");const G=require("../../generated/graphql.cjs.js");require("../../generated/graphqlLinks.cjs.js");require("../../generated/access.cjs.js");require("../../generated/actions.cjs.js");require("../../generated/activityFeed.cjs.js");require("../../generated/addons.cjs.js");require("../../generated/anatomy.cjs.js");require("../../generated/attributes.cjs.js");require("../../generated/authentication.cjs.js");require("../../generated/bundles.cjs.js");require("../../generated/configuration.cjs.js");require("../../generated/dataImport.cjs.js");require("../../generated/desktop.cjs.js");require("../../generated/entityLists.cjs.js");require("../../generated/events.cjs.js");require("../../generated/files.cjs.js");const H=require("../../generated/folders.cjs.js");require("../../generated/inbox.cjs.js");require("../../generated/links.cjs.js");require("../../generated/market.cjs.js");require("../../generated/onboarding.cjs.js");require("../../generated/operations.cjs.js");require("../../generated/products.cjs.js");require("../../generated/projectDashboard.cjs.js");require("../../generated/projects.cjs.js");require("../../generated/projectFolders.cjs.js");require("../../generated/reviewables.cjs.js");require("../../generated/services.cjs.js");require("../../generated/system.cjs.js");require("../../generated/tasks.cjs.js");require("../../generated/teams.cjs.js");require("../../generated/thumbnails.cjs.js");require("../../generated/uRIs.cjs.js");require("../../generated/users.cjs.js");require("../../generated/versions.cjs.js");require("../../generated/workfiles.cjs.js");require("../../generated/ynputCloud.cjs.js");require("../../generated/grouping.cjs.js");require("../../generated/views.cjs.js");require("lodash");require("react-toastify");require("uuid");const
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require("../../base/client.cjs.js");const G=require("../../generated/graphql.cjs.js");require("../../generated/graphqlLinks.cjs.js");require("../../generated/access.cjs.js");require("../../generated/actions.cjs.js");require("../../generated/activityFeed.cjs.js");require("../../generated/addons.cjs.js");require("../../generated/anatomy.cjs.js");require("../../generated/attributes.cjs.js");require("../../generated/authentication.cjs.js");require("../../generated/bundles.cjs.js");require("../../generated/configuration.cjs.js");require("../../generated/dataImport.cjs.js");require("../../generated/desktop.cjs.js");require("../../generated/entityLists.cjs.js");require("../../generated/events.cjs.js");require("../../generated/files.cjs.js");const H=require("../../generated/folders.cjs.js");require("../../generated/inbox.cjs.js");require("../../generated/links.cjs.js");require("../../generated/market.cjs.js");require("../../generated/onboarding.cjs.js");require("../../generated/operations.cjs.js");require("../../generated/products.cjs.js");require("../../generated/projectDashboard.cjs.js");require("../../generated/projects.cjs.js");require("../../generated/projectFolders.cjs.js");require("../../generated/reviewables.cjs.js");require("../../generated/services.cjs.js");require("../../generated/system.cjs.js");require("../../generated/tasks.cjs.js");require("../../generated/teams.cjs.js");require("../../generated/thumbnails.cjs.js");require("../../generated/uRIs.cjs.js");require("../../generated/users.cjs.js");require("../../generated/versions.cjs.js");require("../../generated/workfiles.cjs.js");require("../../generated/ynputCloud.cjs.js");require("../../generated/grouping.cjs.js");require("../../generated/views.cjs.js");require("lodash");require("react-toastify");require("uuid");const N=require("../../../util/thumbnailWebsocket.cjs.js");require("../actions/getActions.cjs.js");require("../activities/getActivities.cjs.js");require("../activities/updateReaction.cjs.js");require("../activities/getMentions.cjs.js");require("../activities/getCategories.cjs.js");require("../addons/getAddons.cjs.js");require("../addons/updateAddons.cjs.js");require("../attributes/getAttributes.cjs.js");require("../attributes/updateAttributes.cjs.js");require("../authentication/getAuthentication.cjs.js");require("../bundles/getBundles.cjs.js");require("../bundles/updateBundles.cjs.js");require("../cloud/cloud.cjs.js");require("../columnStats/metricTargets.cjs.js");require("../columnStats/groupCounts.cjs.js");require("../config/getConfig.cjs.js");require("../config/updateConfig.cjs.js");require("../entities/getEntity.cjs.js");require("../entities/getEntityPanel.cjs.js");const O=require("../overview/getOverview.cjs.js");require("../overview/updateOverview.cjs.js");require("../versions/getVersionsProducts.cjs.js");require("../links/getEntityLinks.cjs.js");require("../entities/updateEntity.cjs.js");require("../entityLists/getLists.cjs.js");require("../entityLists/updateLists.cjs.js");require("../entityLists/getListsAttributes.cjs.js");require("../entityLists/listItemsColumnStats.cjs.js");require("../entityLists/updateListsAttributes.cjs.js");require("../entityLists/listFolders.cjs.js");require("./getFolderDeleteInfo.cjs.js");require("../grouping/getGrouping.cjs.js");require("../links/updateLinks.cjs.js");require("../links/getLinks.cjs.js");require("../permissions/getPermissions.cjs.js");require("../products/createProduct.cjs.js");require("../products/getFolderProducts.cjs.js");require("../project/getProject.cjs.js");require("../project/updateProject.cjs.js");require("../projectFolders/projectFolders.cjs.js");require("../review/getReview.cjs.js");require("../review/updateReview.cjs.js");require("../share/share.cjs.js");require("../system/getSystem.cjs.js");require("../tasks/getTasks.cjs.js");require("../tasks/updateTasks.cjs.js");require("../teams/getTeams.cjs.js");require("../userDashboard/getUserDashboard.cjs.js");require("../users/getUsers.cjs.js");require("../users/updateUsers.cjs.js");require("../users/guests.cjs.js");require("../versions/updateVersions.cjs.js");require("../views/getViews.cjs.js");require("../views/updateViews.cjs.js");require("../watchers/getWatchers.cjs.js");require("../uris/getUris.cjs.js");const p=require("../../../util/realtimeUpdatesUtils.cjs.js"),_=require("../../../util/pubsub.cjs.js"),Q=G.api.enhanceEndpoints({endpoints:{GetUpdatedAndNewFolders:{transformResponse:f=>f.project.folders.edges.map(({node:u})=>({...u,attrib:O.parseJSONField(u.allAttrib),path:u.path??"",parentId:u.parentId??void 0,label:u.label??void 0,taskNames:[],createdAt:String(u.createdAt),updatedAt:String(u.updatedAt)}))}}}),w=p.REALTIME_REST_CALL_LIMIT,L=H.api.enhanceEndpoints({endpoints:{getFolderHierarchy:{providesTags:["hierarchy"]},getFolderList:{providesTags:(f,u,{projectName:b})=>["hierarchy",{type:"folder",id:"LIST"},...f?.folders.map(({id:q})=>({type:"folder",id:q}))||[],{type:"folder",id:b}],async onCacheEntryAdded(f,{cacheDataLoaded:u,cacheEntryRemoved:b,updateCachedData:q,getCacheEntry:M,dispatch:R}){const{projectName:g}=f||{},v=["status","tags","folderType"],I={"entity.folder.label_changed":"label","entity.folder.renamed":"name","entity.folder.type_changed":"folderType","entity.folder.status_changed":"status","entity.folder.tags_changed":"tags","entity.folder.attrib_changed":"attrib"},P=["entity.folder"],S=[],U=async a=>{if(!g)return;const o=new Set,t=M().data;t&&Array.isArray(t.folders)&&t.folders.forEach(e=>o.add(e.id));const n=[],c=[],l=new Map,F=[];a.forEach(e=>{const i=e.summary?.entityId;if(!i)return;if(e.topic==="entity.folder.deleted"){n.push(i);return}if(e.topic==="entity.folder.created"){c.push(i);return}if(!o.has(i))return;const s=p.getSupportedEntityPatch(I[e.topic],e.summary,v);if(s)F.push({folderId:i,...s});else{const d=I[e.topic];if(!d)return;const r=l.get(i)||new Set;r.add(d),l.set(i,r)}}),n.length&&q(e=>{!e||!Array.isArray(e.folders)||(e.folders=e.folders.filter(i=>!n.includes(i.id)))}),F.length&&q(e=>{!e||!Array.isArray(e.folders)||F.forEach(({folderId:i,field:s,value:d})=>{const r=e.folders.find(h=>h.id===i);r&&(r[s]=d)})});const y=[...new Set([...c,...l.keys()])];if(!(y.length>w)&&y.length){await p.waitForRealtimeJitter();const e=await R(Q.endpoints.GetUpdatedAndNewFolders.initiate({projectName:g,folderIds:y,first:y.length})).unwrap().catch(()=>[]),i=new Set(c);q(s=>{if(!s||!Array.isArray(s.folders))return;const d=new Map(e.filter(Boolean).map(r=>[r.id,r]));s.folders.forEach((r,h)=>{const E=d.get(r.id);E&&(i.has(r.id)?s.folders[h]={...r,...E}:(l.get(r.id)||new Set).forEach(T=>{r[T]=E[T]}),d.delete(r.id))}),d.forEach((r,h)=>{i.has(h)&&s.folders.push(r)})})}},m=p.createRealtimeBatcher(U,a=>a.summary.entityId);let A;try{await u,A=N.subscribeToThumbnailUpdates(o=>{q(t=>{!t||!Array.isArray(t.folders)||o.forEach(n=>{if(n.summary.entityType==="folder"&&n.summary.thumbnailHash){const c=t.folders.findIndex(l=>l.id===n.summary.entityId);c!==-1&&(t.folders[c].thumbnailHash=n.summary.thumbnailHash)}})})},["folder"]);const a=(o,t)=>{t?.summary?.entityId&&m.add({...t,topic:o})};P.forEach(o=>S.push(_.subscribe(o,a)))}catch{}await b,m.clear(),S.forEach(a=>_.unsubscribe(a)),A&&A(),m.clear()}}}}),{useGetFolderHierarchyQuery:k,useGetFolderListQuery:j}=L;exports.MAX_FOLDER_UPDATE_REST_CALLS=w;exports.foldersQueries=L;exports.useGetFolderHierarchyQuery=k;exports.useGetFolderListQuery=j;
|
|
2
2
|
//# sourceMappingURL=getFolders.cjs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getFolders.cjs.js","sources":["../../../../../../src/api/queries/folders/getFolders.ts"],"sourcesContent":["import {\n FolderListItem,\n foldersApi,\n GetUpdatedAndNewFoldersQuery,\n gqlApi,\n} from '@shared/api/generated'\nimport {\n getSupportedEntityPatch,\n createRealtimeBatcher,\n REALTIME_REST_CALL_LIMIT,\n waitForRealtimeJitter,\n PubSub,\n subscribeToThumbnailUpdates,\n ThumbnailUpdateMessage,\n SupportedEntityPatchField,\n} from '@shared/util'\n\nimport { DefinitionsFromApi, OverrideResultType, TagTypesFromApi } from '@reduxjs/toolkit/query'\nimport { parseAllAttribs } from '../overview'\n\ntype GetUpdatedAndNewFoldersResult = FolderListItem[]\n\n// HELPER QUERIES FOR REALTIME UPDATES\ntype Definitions = DefinitionsFromApi<typeof gqlApi>\ntype TagTypes = TagTypesFromApi<typeof gqlApi>\n// update the definitions to include the new types\ntype UpdatedDefinitions = Omit<Definitions, 'GetUpdatedAndNewFolders'> & {\n GetUpdatedAndNewFolders: OverrideResultType<\n Definitions['GetUpdatedAndNewFolders'],\n GetUpdatedAndNewFoldersResult\n >\n}\n\nconst graphqlFolders = gqlApi.enhanceEndpoints<TagTypes, UpdatedDefinitions>({\n endpoints: {\n GetUpdatedAndNewFolders: {\n transformResponse: (response: GetUpdatedAndNewFoldersQuery): GetUpdatedAndNewFoldersResult =>\n response.project.folders.edges.map(({ node }) => ({\n ...node,\n attrib: parseAllAttribs(node.allAttrib),\n path: node.path ?? '',\n parentId: node.parentId ?? undefined,\n label: node.label ?? undefined,\n taskNames: [],\n createdAt: String(node.createdAt),\n updatedAt: String(node.updatedAt),\n })),\n },\n },\n})\n\n// the max number of folder to process in a single batch\n// TODO: Use this limit to trigger the reload button\nexport const MAX_FOLDER_UPDATE_REST_CALLS = REALTIME_REST_CALL_LIMIT\n\nconst enhancedApi = foldersApi.enhanceEndpoints({\n endpoints: {\n getFolderHierarchy: {\n providesTags: ['hierarchy'],\n },\n getFolderList: {\n providesTags: (result, _e, { projectName }) => [\n 'hierarchy',\n { type: 'folder', id: 'LIST' },\n ...(result?.folders.map(({ id }) => ({ type: 'folder', id })) || []),\n { type: 'folder', id: projectName },\n ],\n async onCacheEntryAdded(\n args,\n { cacheDataLoaded, cacheEntryRemoved, updateCachedData, getCacheEntry, dispatch },\n ) {\n const { projectName } = args || {}\n const supportedFolderFields = ['status', 'tags', 'folderType']\n const topicFieldMap: Record<string, string> = {\n 'entity.folder.label_changed': 'label',\n 'entity.folder.renamed': 'name',\n 'entity.folder.type_changed': 'folderType',\n 'entity.folder.status_changed': 'status',\n 'entity.folder.tags_changed': 'tags',\n 'entity.folder.attrib_changed': 'attrib',\n }\n\n const topics = ['entity.folder']\n const tokens: (string | undefined)[] = []\n\n // handle a batch of messages, updating the cache and fetching missing data as needed\n const batchProcessMessages = async (messages: any[]) => {\n if (!projectName) return\n\n const cachedFolderIds = new Set<string>()\n const cachedFolders = getCacheEntry().data\n if (cachedFolders && Array.isArray(cachedFolders.folders)) {\n cachedFolders.folders.forEach((folder: any) => cachedFolderIds.add(folder.id))\n }\n\n const deletedIds: string[] = []\n const createdIds: string[] = []\n const unsupportedFields = new Map<string, Set<string>>()\n const summaryPatches: {\n folderId: string\n field: SupportedEntityPatchField\n value: string | string[]\n }[] = []\n\n // for each message, check it's type and then add it to the appropriate list for processing\n messages.forEach((message) => {\n const folderId = message.summary?.entityId\n if (!folderId) return\n\n // delete: remove from cache - no additional API calls\n if (message.topic === 'entity.folder.deleted') {\n deletedIds.push(folderId)\n return\n }\n\n // create: add to cache - will fetch the full folder data later\n if (message.topic === 'entity.folder.created') {\n createdIds.push(folderId)\n return\n }\n\n // for updates, check if the folder is in the cache\n // no point updating a folder that does not exist for the user\n if (!cachedFolderIds.has(folderId)) return\n\n // check if the updated field data is in the summary (status, tags etc)\n // if it is, we can update the cache directly, otherwise we will need to fetch the full folder data later\n const patch = getSupportedEntityPatch(\n topicFieldMap[message.topic],\n message.summary,\n supportedFolderFields,\n )\n if (patch) summaryPatches.push({ folderId, ...patch })\n else {\n const field = topicFieldMap[message.topic]\n if (!field) return\n\n const fields = unsupportedFields.get(folderId) || new Set<string>()\n fields.add(field)\n unsupportedFields.set(folderId, fields)\n }\n })\n\n // DELETED: remove deleted folders from cache\n if (deletedIds.length) {\n updateCachedData((draft: any) => {\n if (!draft || !Array.isArray(draft.folders)) return\n draft.folders = draft.folders.filter((folder: any) => !deletedIds.includes(folder.id))\n })\n }\n\n // UPDATED: update cached folders with summary data from the message, if available\n if (summaryPatches.length) {\n updateCachedData((draft: any) => {\n if (!draft || !Array.isArray(draft.folders)) return\n summaryPatches.forEach(({ folderId, field, value }) => {\n const folder = draft.folders.find((item: any) => item.id === folderId)\n if (folder) folder[field] = value\n })\n })\n }\n\n // Fetch created and unsupported folders in one request.\n // This is to avoid overwhelming the API with too many requests at once, and to prevent potential performance issues in the frontend.\n const foldersToFetch = [\n ...new Set([...createdIds, ...unsupportedFields.keys()]),\n ]\n if (foldersToFetch.length > MAX_FOLDER_UPDATE_REST_CALLS) return\n\n if (foldersToFetch.length) {\n await waitForRealtimeJitter()\n const fetchedFolders = await dispatch(\n graphqlFolders.endpoints.GetUpdatedAndNewFolders.initiate({\n projectName,\n folderIds: foldersToFetch,\n first: foldersToFetch.length,\n }),\n )\n .unwrap()\n .catch(() => [])\n\n const createdFolderIds = new Set(createdIds)\n updateCachedData((draft: any) => {\n if (!draft || !Array.isArray(draft.folders)) return\n const fetchedById = new Map(\n fetchedFolders.filter(Boolean).map((folder: any) => [folder.id, folder] as const),\n )\n\n draft.folders.forEach((folder: any, index: number) => {\n const fetchedFolder = fetchedById.get(folder.id)\n if (!fetchedFolder) return\n\n if (createdFolderIds.has(folder.id)) {\n draft.folders[index] = { ...folder, ...fetchedFolder }\n } else {\n const fields = unsupportedFields.get(folder.id) || new Set<string>()\n fields.forEach((field) => {\n folder[field] = fetchedFolder[field]\n })\n }\n fetchedById.delete(folder.id)\n })\n\n fetchedById.forEach((folder, folderId) => {\n if (createdFolderIds.has(folderId)) draft.folders.push(folder)\n })\n })\n }\n }\n\n // create a batcher to process messages in batches\n const batcher = createRealtimeBatcher(\n batchProcessMessages,\n (message: any) => message.summary.entityId,\n )\n\n let unsubscribeThumbnails: (() => void) | undefined\n\n try {\n await cacheDataLoaded\n\n unsubscribeThumbnails = subscribeToThumbnailUpdates(\n (messages: ThumbnailUpdateMessage[]) => {\n updateCachedData((draft: any) => {\n if (!draft || !Array.isArray(draft.folders)) return\n messages.forEach((message) => {\n if (message.summary.entityType === 'folder' && message.summary.thumbnailHash) {\n const idx = draft.folders.findIndex(\n (f: any) => f.id === message.summary.entityId,\n )\n if (idx !== -1) {\n draft.folders[idx].thumbnailHash = message.summary.thumbnailHash\n }\n }\n })\n })\n },\n ['folder'],\n )\n\n const handlePubSub = (topic: string, message: any) => {\n const entityId = message?.summary?.entityId\n if (!entityId) return\n\n // add update to the batcher\n batcher.add({ ...message, topic })\n }\n\n topics.forEach((t) => tokens.push(PubSub.subscribe(t, handlePubSub)))\n } catch {\n // silent\n }\n\n await cacheEntryRemoved\n batcher.clear()\n tokens.forEach((t) => PubSub.unsubscribe(t))\n if (unsubscribeThumbnails) unsubscribeThumbnails()\n batcher.clear()\n },\n },\n },\n})\n\nexport const { useGetFolderHierarchyQuery, useGetFolderListQuery } = enhancedApi\nexport { enhancedApi as foldersQueries }\n"],"names":["graphqlFolders","gqlApi","response","node","parseAllAttribs","MAX_FOLDER_UPDATE_REST_CALLS","REALTIME_REST_CALL_LIMIT","enhancedApi","foldersApi","result","_e","projectName","id","args","cacheDataLoaded","cacheEntryRemoved","updateCachedData","getCacheEntry","dispatch","supportedFolderFields","topicFieldMap","topics","tokens","batchProcessMessages","messages","cachedFolderIds","cachedFolders","folder","deletedIds","createdIds","unsupportedFields","summaryPatches","message","folderId","patch","getSupportedEntityPatch","field","fields","draft","value","item","foldersToFetch","waitForRealtimeJitter","fetchedFolders","createdFolderIds","fetchedById","index","fetchedFolder","batcher","createRealtimeBatcher","unsubscribeThumbnails","subscribeToThumbnailUpdates","idx","f","handlePubSub","topic","t","PubSub","useGetFolderHierarchyQuery","useGetFolderListQuery"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"getFolders.cjs.js","sources":["../../../../../../src/api/queries/folders/getFolders.ts"],"sourcesContent":["import {\n FolderListItem,\n foldersApi,\n GetUpdatedAndNewFoldersQuery,\n gqlApi,\n} from '@shared/api/generated'\nimport {\n getSupportedEntityPatch,\n createRealtimeBatcher,\n REALTIME_REST_CALL_LIMIT,\n waitForRealtimeJitter,\n PubSub,\n subscribeToThumbnailUpdates,\n ThumbnailUpdateMessage,\n SupportedEntityPatchField,\n} from '@shared/util'\n\nimport { DefinitionsFromApi, OverrideResultType, TagTypesFromApi } from '@reduxjs/toolkit/query'\nimport { parseJSONField } from '../overview'\n\ntype GetUpdatedAndNewFoldersResult = FolderListItem[]\n\n// HELPER QUERIES FOR REALTIME UPDATES\ntype Definitions = DefinitionsFromApi<typeof gqlApi>\ntype TagTypes = TagTypesFromApi<typeof gqlApi>\n// update the definitions to include the new types\ntype UpdatedDefinitions = Omit<Definitions, 'GetUpdatedAndNewFolders'> & {\n GetUpdatedAndNewFolders: OverrideResultType<\n Definitions['GetUpdatedAndNewFolders'],\n GetUpdatedAndNewFoldersResult\n >\n}\n\nconst graphqlFolders = gqlApi.enhanceEndpoints<TagTypes, UpdatedDefinitions>({\n endpoints: {\n GetUpdatedAndNewFolders: {\n transformResponse: (response: GetUpdatedAndNewFoldersQuery): GetUpdatedAndNewFoldersResult =>\n response.project.folders.edges.map(({ node }) => ({\n ...node,\n attrib: parseJSONField(node.allAttrib),\n path: node.path ?? '',\n parentId: node.parentId ?? undefined,\n label: node.label ?? undefined,\n taskNames: [],\n createdAt: String(node.createdAt),\n updatedAt: String(node.updatedAt),\n })),\n },\n },\n})\n\n// the max number of folder to process in a single batch\n// TODO: Use this limit to trigger the reload button\nexport const MAX_FOLDER_UPDATE_REST_CALLS = REALTIME_REST_CALL_LIMIT\n\nconst enhancedApi = foldersApi.enhanceEndpoints({\n endpoints: {\n getFolderHierarchy: {\n providesTags: ['hierarchy'],\n },\n getFolderList: {\n providesTags: (result, _e, { projectName }) => [\n 'hierarchy',\n { type: 'folder', id: 'LIST' },\n ...(result?.folders.map(({ id }) => ({ type: 'folder', id })) || []),\n { type: 'folder', id: projectName },\n ],\n async onCacheEntryAdded(\n args,\n { cacheDataLoaded, cacheEntryRemoved, updateCachedData, getCacheEntry, dispatch },\n ) {\n const { projectName } = args || {}\n const supportedFolderFields = ['status', 'tags', 'folderType']\n const topicFieldMap: Record<string, string> = {\n 'entity.folder.label_changed': 'label',\n 'entity.folder.renamed': 'name',\n 'entity.folder.type_changed': 'folderType',\n 'entity.folder.status_changed': 'status',\n 'entity.folder.tags_changed': 'tags',\n 'entity.folder.attrib_changed': 'attrib',\n }\n\n const topics = ['entity.folder']\n const tokens: (string | undefined)[] = []\n\n // handle a batch of messages, updating the cache and fetching missing data as needed\n const batchProcessMessages = async (messages: any[]) => {\n if (!projectName) return\n\n const cachedFolderIds = new Set<string>()\n const cachedFolders = getCacheEntry().data\n if (cachedFolders && Array.isArray(cachedFolders.folders)) {\n cachedFolders.folders.forEach((folder: any) => cachedFolderIds.add(folder.id))\n }\n\n const deletedIds: string[] = []\n const createdIds: string[] = []\n const unsupportedFields = new Map<string, Set<string>>()\n const summaryPatches: {\n folderId: string\n field: SupportedEntityPatchField\n value: string | string[]\n }[] = []\n\n // for each message, check it's type and then add it to the appropriate list for processing\n messages.forEach((message) => {\n const folderId = message.summary?.entityId\n if (!folderId) return\n\n // delete: remove from cache - no additional API calls\n if (message.topic === 'entity.folder.deleted') {\n deletedIds.push(folderId)\n return\n }\n\n // create: add to cache - will fetch the full folder data later\n if (message.topic === 'entity.folder.created') {\n createdIds.push(folderId)\n return\n }\n\n // for updates, check if the folder is in the cache\n // no point updating a folder that does not exist for the user\n if (!cachedFolderIds.has(folderId)) return\n\n // check if the updated field data is in the summary (status, tags etc)\n // if it is, we can update the cache directly, otherwise we will need to fetch the full folder data later\n const patch = getSupportedEntityPatch(\n topicFieldMap[message.topic],\n message.summary,\n supportedFolderFields,\n )\n if (patch) summaryPatches.push({ folderId, ...patch })\n else {\n const field = topicFieldMap[message.topic]\n if (!field) return\n\n const fields = unsupportedFields.get(folderId) || new Set<string>()\n fields.add(field)\n unsupportedFields.set(folderId, fields)\n }\n })\n\n // DELETED: remove deleted folders from cache\n if (deletedIds.length) {\n updateCachedData((draft: any) => {\n if (!draft || !Array.isArray(draft.folders)) return\n draft.folders = draft.folders.filter((folder: any) => !deletedIds.includes(folder.id))\n })\n }\n\n // UPDATED: update cached folders with summary data from the message, if available\n if (summaryPatches.length) {\n updateCachedData((draft: any) => {\n if (!draft || !Array.isArray(draft.folders)) return\n summaryPatches.forEach(({ folderId, field, value }) => {\n const folder = draft.folders.find((item: any) => item.id === folderId)\n if (folder) folder[field] = value\n })\n })\n }\n\n // Fetch created and unsupported folders in one request.\n // This is to avoid overwhelming the API with too many requests at once, and to prevent potential performance issues in the frontend.\n const foldersToFetch = [...new Set([...createdIds, ...unsupportedFields.keys()])]\n if (foldersToFetch.length > MAX_FOLDER_UPDATE_REST_CALLS) return\n\n if (foldersToFetch.length) {\n await waitForRealtimeJitter()\n const fetchedFolders = await dispatch(\n graphqlFolders.endpoints.GetUpdatedAndNewFolders.initiate({\n projectName,\n folderIds: foldersToFetch,\n first: foldersToFetch.length,\n }),\n )\n .unwrap()\n .catch(() => [])\n\n const createdFolderIds = new Set(createdIds)\n updateCachedData((draft: any) => {\n if (!draft || !Array.isArray(draft.folders)) return\n const fetchedById = new Map(\n fetchedFolders.filter(Boolean).map((folder: any) => [folder.id, folder] as const),\n )\n\n draft.folders.forEach((folder: any, index: number) => {\n const fetchedFolder = fetchedById.get(folder.id)\n if (!fetchedFolder) return\n\n if (createdFolderIds.has(folder.id)) {\n draft.folders[index] = { ...folder, ...fetchedFolder }\n } else {\n const fields = unsupportedFields.get(folder.id) || new Set<string>()\n fields.forEach((field) => {\n folder[field] = fetchedFolder[field]\n })\n }\n fetchedById.delete(folder.id)\n })\n\n fetchedById.forEach((folder, folderId) => {\n if (createdFolderIds.has(folderId)) draft.folders.push(folder)\n })\n })\n }\n }\n\n // create a batcher to process messages in batches\n const batcher = createRealtimeBatcher(\n batchProcessMessages,\n (message: any) => message.summary.entityId,\n )\n\n let unsubscribeThumbnails: (() => void) | undefined\n\n try {\n await cacheDataLoaded\n\n unsubscribeThumbnails = subscribeToThumbnailUpdates(\n (messages: ThumbnailUpdateMessage[]) => {\n updateCachedData((draft: any) => {\n if (!draft || !Array.isArray(draft.folders)) return\n messages.forEach((message) => {\n if (message.summary.entityType === 'folder' && message.summary.thumbnailHash) {\n const idx = draft.folders.findIndex(\n (f: any) => f.id === message.summary.entityId,\n )\n if (idx !== -1) {\n draft.folders[idx].thumbnailHash = message.summary.thumbnailHash\n }\n }\n })\n })\n },\n ['folder'],\n )\n\n const handlePubSub = (topic: string, message: any) => {\n const entityId = message?.summary?.entityId\n if (!entityId) return\n\n // add update to the batcher\n batcher.add({ ...message, topic })\n }\n\n topics.forEach((t) => tokens.push(PubSub.subscribe(t, handlePubSub)))\n } catch {\n // silent\n }\n\n await cacheEntryRemoved\n batcher.clear()\n tokens.forEach((t) => PubSub.unsubscribe(t))\n if (unsubscribeThumbnails) unsubscribeThumbnails()\n batcher.clear()\n },\n },\n },\n})\n\nexport const { useGetFolderHierarchyQuery, useGetFolderListQuery } = enhancedApi\nexport { enhancedApi as foldersQueries }\n"],"names":["graphqlFolders","gqlApi","response","node","parseJSONField","MAX_FOLDER_UPDATE_REST_CALLS","REALTIME_REST_CALL_LIMIT","enhancedApi","foldersApi","result","_e","projectName","id","args","cacheDataLoaded","cacheEntryRemoved","updateCachedData","getCacheEntry","dispatch","supportedFolderFields","topicFieldMap","topics","tokens","batchProcessMessages","messages","cachedFolderIds","cachedFolders","folder","deletedIds","createdIds","unsupportedFields","summaryPatches","message","folderId","patch","getSupportedEntityPatch","field","fields","draft","value","item","foldersToFetch","waitForRealtimeJitter","fetchedFolders","createdFolderIds","fetchedById","index","fetchedFolder","batcher","createRealtimeBatcher","unsubscribeThumbnails","subscribeToThumbnailUpdates","idx","f","handlePubSub","topic","t","PubSub","useGetFolderHierarchyQuery","useGetFolderListQuery"],"mappings":"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"}
|