@ynput/ayon-frontend-shared 0.4.2 → 0.4.3
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/ProjectTreeTable.cjs.js +1 -1
- package/dist/ProjectTreeTable.es.js +247 -243
- 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.cjs4.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.es22.js +3 -3
- package/dist/_virtual/index.es23.js +5 -5
- package/dist/_virtual/index.es24.js +5 -5
- package/dist/_virtual/index.es4.js +2 -5
- package/dist/_virtual/index.es4.js.map +1 -1
- package/dist/_virtual/index.es5.js +5 -2
- package/dist/_virtual/index.es5.js.map +1 -1
- package/dist/_virtual/index.es6.js +2 -2
- package/dist/_virtual/index.es8.js +2 -2
- package/dist/api.cjs.js +1 -1
- package/dist/api.es.js +446 -445
- package/dist/index.cjs.js +1 -1
- package/dist/index.es.js +20 -9
- package/dist/index.es.js.map +1 -1
- 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/parse-numeric-range/index.cjs.js +1 -1
- package/dist/node_modules/parse-numeric-range/index.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.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/dist/index.cjs.js +1 -1
- package/dist/shared/node_modules/@module-federation/runtime/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/react-is/index.cjs.js +1 -1
- package/dist/shared/node_modules/react-is/index.es.js +1 -1
- package/dist/shared/src/api/generated/graphql.cjs.js +85 -28
- package/dist/shared/src/api/generated/graphql.cjs.js.map +1 -1
- package/dist/shared/src/api/generated/graphql.es.js +129 -68
- package/dist/shared/src/api/generated/graphql.es.js.map +1 -1
- package/dist/shared/src/api/queries/columnStats/metricTargets.cjs.js +1 -1
- package/dist/shared/src/api/queries/columnStats/metricTargets.cjs.js.map +1 -1
- package/dist/shared/src/api/queries/columnStats/metricTargets.es.js +36 -36
- package/dist/shared/src/api/queries/columnStats/metricTargets.es.js.map +1 -1
- package/dist/shared/src/components/Chips/Chips.cjs.js +12 -6
- package/dist/shared/src/components/Chips/Chips.cjs.js.map +1 -1
- package/dist/shared/src/components/Chips/Chips.es.js +69 -62
- package/dist/shared/src/components/Chips/Chips.es.js.map +1 -1
- package/dist/shared/src/components/DetailsPanelAttributes/components/RenderFieldWidget.cjs.js +1 -1
- package/dist/shared/src/components/DetailsPanelAttributes/components/RenderFieldWidget.cjs.js.map +1 -1
- package/dist/shared/src/components/DetailsPanelAttributes/components/RenderFieldWidget.es.js +32 -12
- package/dist/shared/src/components/DetailsPanelAttributes/components/RenderFieldWidget.es.js.map +1 -1
- package/dist/shared/src/components/ProjectTableSettings/ProjectTableSettings.cjs.js +2 -2
- package/dist/shared/src/components/ProjectTableSettings/ProjectTableSettings.cjs.js.map +1 -1
- package/dist/shared/src/components/ProjectTableSettings/ProjectTableSettings.es.js +33 -33
- package/dist/shared/src/components/ProjectTableSettings/ProjectTableSettings.es.js.map +1 -1
- package/dist/shared/src/components/RemotePage/RemotePageWrapper.cjs.js.map +1 -1
- package/dist/shared/src/components/RemotePage/RemotePageWrapper.es.js.map +1 -1
- package/dist/shared/src/components/SubtasksManager/SubtasksManagerWrapper.cjs.js +1 -1
- package/dist/shared/src/components/SubtasksManager/SubtasksManagerWrapper.cjs.js.map +1 -1
- package/dist/shared/src/components/SubtasksManager/SubtasksManagerWrapper.es.js +39 -8
- package/dist/shared/src/components/SubtasksManager/SubtasksManagerWrapper.es.js.map +1 -1
- package/dist/shared/src/containers/DetailsPanel/DetailsPanel.cjs.js +1 -1
- package/dist/shared/src/containers/DetailsPanel/DetailsPanel.cjs.js.map +1 -1
- package/dist/shared/src/containers/DetailsPanel/DetailsPanel.es.js +32 -31
- package/dist/shared/src/containers/DetailsPanel/DetailsPanel.es.js.map +1 -1
- package/dist/shared/src/containers/DetailsPanel/containers/FeedWrapper.cjs.js.map +1 -1
- package/dist/shared/src/containers/DetailsPanel/containers/FeedWrapper.es.js.map +1 -1
- package/dist/shared/src/containers/Feed/helpers/buildBackendFilter.cjs.js +1 -1
- package/dist/shared/src/containers/Feed/helpers/buildBackendFilter.cjs.js.map +1 -1
- package/dist/shared/src/containers/Feed/helpers/buildBackendFilter.es.js +24 -18
- package/dist/shared/src/containers/Feed/helpers/buildBackendFilter.es.js.map +1 -1
- package/dist/shared/src/containers/Feed/helpers/feedFilterAdapter.cjs.js +1 -1
- package/dist/shared/src/containers/Feed/helpers/feedFilterAdapter.cjs.js.map +1 -1
- package/dist/shared/src/containers/Feed/helpers/feedFilterAdapter.es.js +26 -25
- package/dist/shared/src/containers/Feed/helpers/feedFilterAdapter.es.js.map +1 -1
- package/dist/shared/src/containers/ListTable/ListTableCell.cjs.js +1 -1
- package/dist/shared/src/containers/ListTable/ListTableCell.cjs.js.map +1 -1
- package/dist/shared/src/containers/ListTable/ListTableCell.es.js +14 -2
- package/dist/shared/src/containers/ListTable/ListTableCell.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.es.js +125 -126
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.styled.cjs.js +6 -0
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.styled.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.styled.es.js +14 -8
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.styled.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 +200 -178
- package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.es.js +14 -3
- package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/constants.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/constants.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/constants.es.js +6 -3
- package/dist/shared/src/containers/ProjectTreeTable/constants.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useSortBySettings.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useSortBySettings.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useSortBySettings.es.js +19 -19
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useSortBySettings.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/CellWidget.cjs.js +5 -3
- package/dist/shared/src/containers/ProjectTreeTable/widgets/CellWidget.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/CellWidget.es.js +100 -97
- package/dist/shared/src/containers/ProjectTreeTable/widgets/CellWidget.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/DateWidget.cjs.js +9 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/DateWidget.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/DateWidget.es.js +47 -31
- package/dist/shared/src/containers/ProjectTreeTable/widgets/DateWidget.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EntityNameWidget.cjs.js +28 -9
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EntityNameWidget.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EntityNameWidget.es.js +58 -39
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EntityNameWidget.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumCellValue.cjs.js +53 -25
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumCellValue.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumCellValue.es.js +150 -103
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumCellValue.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumWidget.cjs.js +9 -2
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumWidget.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumWidget.es.js +66 -57
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumWidget.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/SubtasksWidget.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/SubtasksWidget.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/SubtasksWidget.es.js +9 -8
- package/dist/shared/src/containers/ProjectTreeTable/widgets/SubtasksWidget.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/TextWidget.cjs.js +20 -4
- package/dist/shared/src/containers/ProjectTreeTable/widgets/TextWidget.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/TextWidget.es.js +86 -67
- package/dist/shared/src/containers/ProjectTreeTable/widgets/TextWidget.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/wrapMode.cjs.js +6 -0
- package/dist/shared/src/containers/ProjectTreeTable/widgets/wrapMode.cjs.js.map +1 -0
- package/dist/shared/src/containers/ProjectTreeTable/widgets/wrapMode.es.js +11 -0
- package/dist/shared/src/containers/ProjectTreeTable/widgets/wrapMode.es.js.map +1 -0
- package/dist/shared/src/containers/Views/context/ViewsContext.cjs.js +1 -1
- package/dist/shared/src/containers/Views/context/ViewsContext.cjs.js.map +1 -1
- package/dist/shared/src/containers/Views/context/ViewsContext.es.js +67 -62
- package/dist/shared/src/containers/Views/context/ViewsContext.es.js.map +1 -1
- package/dist/shared/src/containers/Views/utils/viewUpdateHelper.cjs.js +1 -1
- package/dist/shared/src/containers/Views/utils/viewUpdateHelper.cjs.js.map +1 -1
- package/dist/shared/src/containers/Views/utils/viewUpdateHelper.es.js +47 -46
- package/dist/shared/src/containers/Views/utils/viewUpdateHelper.es.js.map +1 -1
- package/dist/shared/src/context/ProjectContext.cjs.js +1 -1
- package/dist/shared/src/context/ProjectContext.cjs.js.map +1 -1
- package/dist/shared/src/context/ProjectContext.es.js +1 -1
- package/dist/shared/src/context/ProjectContext.es.js.map +1 -1
- package/dist/shared/src/util/buildHierarchicalTableRows.cjs.js +1 -1
- package/dist/shared/src/util/buildHierarchicalTableRows.cjs.js.map +1 -1
- package/dist/shared/src/util/buildHierarchicalTableRows.es.js +36 -33
- package/dist/shared/src/util/buildHierarchicalTableRows.es.js.map +1 -1
- package/dist/types/api/generated/graphql.d.ts +71 -0
- package/dist/types/api/queries/activities/getActivities.d.ts +28 -0
- package/dist/types/api/queries/entities/getEntity.d.ts +14 -0
- package/dist/types/api/queries/entities/getEntityPanel.d.ts +14 -0
- package/dist/types/api/queries/entities/updateEntity.d.ts +14 -0
- package/dist/types/api/queries/entityLists/getLists.d.ts +14 -0
- package/dist/types/api/queries/overview/getOverview.d.ts +14 -0
- package/dist/types/api/queries/project/getProject.d.ts +14 -0
- package/dist/types/api/queries/userDashboard/getUserDashboard.d.ts +14 -0
- package/dist/types/api/queries/users/getUsers.d.ts +14 -0
- package/dist/types/api/queries/versions/getVersionsProducts.d.ts +28 -0
- package/dist/types/components/SubtasksManager/SubtasksManagerWrapper.d.ts +4 -1
- package/dist/types/containers/Feed/helpers/buildBackendFilter.d.ts +1 -0
- package/dist/types/containers/ProjectTreeTable/buildTreeTableColumns.d.ts +1 -0
- package/dist/types/containers/ProjectTreeTable/constants.d.ts +3 -0
- package/dist/types/containers/ProjectTreeTable/widgets/SubtasksWidget.d.ts +1 -0
- package/dist/types/containers/ProjectTreeTable/widgets/wrapMode.d.ts +2 -0
- package/dist/types/containers/Views/context/ViewsContext.d.ts +1 -0
- package/dist/types/util/buildHierarchicalTableRows.d.ts +2 -0
- package/package.json +1 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { j as o } from "../../../../_virtual/jsx-runtime.es.js";
|
|
2
|
-
import { Button as
|
|
2
|
+
import { Button as Dt } from "@ynput/ayon-react-components";
|
|
3
3
|
import { useRef as b, useEffect as l, useMemo as R } from "react";
|
|
4
4
|
import wt from "./hooks/useDetailsPanelURLSync.es.js";
|
|
5
5
|
import { Panel as Ft, Toolbar as Rt, RightTools as St } from "./DetailsPanel.styled.es.js";
|
|
@@ -176,10 +176,10 @@ const te = ["product", "representation"], ee = ({
|
|
|
176
176
|
}, [e, m, j]), l(() => {
|
|
177
177
|
d.length && r && v(null);
|
|
178
178
|
}, [d, r, v]);
|
|
179
|
-
const
|
|
179
|
+
const I = R(
|
|
180
180
|
() => Yt(g, f),
|
|
181
181
|
[g, f]
|
|
182
|
-
), Pt = R(() => Zt(
|
|
182
|
+
), Pt = R(() => Zt(I), [I]);
|
|
183
183
|
l(() => {
|
|
184
184
|
m === "files" && e !== "version" && j("feed"), m === "subtasks" && e !== "task" && j("feed");
|
|
185
185
|
}, [e, m, u]);
|
|
@@ -202,27 +202,27 @@ const te = ["product", "representation"], ee = ({
|
|
|
202
202
|
l(() => {
|
|
203
203
|
h || G();
|
|
204
204
|
}, [Et, h]);
|
|
205
|
-
const
|
|
205
|
+
const D = b(null);
|
|
206
206
|
l(() => {
|
|
207
|
-
r || (
|
|
207
|
+
r || (D.current = null);
|
|
208
208
|
}, [r]), l(() => {
|
|
209
209
|
if (!y && (r?.source === "uri" || r?.source === "url") && r?.entities?.length && k) {
|
|
210
210
|
const t = r.entities[0].id;
|
|
211
|
-
if (
|
|
212
|
-
const i = s.find((
|
|
211
|
+
if (D.current === t) return;
|
|
212
|
+
const i = s.find((a) => a.id === t);
|
|
213
213
|
if (!i) return;
|
|
214
|
-
|
|
214
|
+
D.current = t, k(i, r.source);
|
|
215
215
|
}
|
|
216
216
|
}, [s, y, r, k]);
|
|
217
|
-
const X = _t(g), p = f[0], _ = g[p] || {},
|
|
218
|
-
entity:
|
|
217
|
+
const X = _t(g), p = f[0], _ = g[p] || {}, n = s[0] || {}, E = s[s.length - 1], w = f[f.length - 1], [z, bt] = Xt({
|
|
218
|
+
entity: n,
|
|
219
219
|
entityType: e,
|
|
220
220
|
projectName: p,
|
|
221
221
|
isLoading: y
|
|
222
222
|
}), { setEntityUri: Tt, setUri: J } = Vt();
|
|
223
223
|
l(() => {
|
|
224
224
|
if (!E?.parents || !w) return;
|
|
225
|
-
const { folderPath: t, taskName: i, versionName:
|
|
225
|
+
const { folderPath: t, taskName: i, versionName: a, productName: tt } = At(
|
|
226
226
|
E.parents,
|
|
227
227
|
e,
|
|
228
228
|
E.name
|
|
@@ -232,7 +232,7 @@ const te = ["product", "representation"], ee = ({
|
|
|
232
232
|
folderPath: t,
|
|
233
233
|
taskName: i,
|
|
234
234
|
productName: tt,
|
|
235
|
-
versionName:
|
|
235
|
+
versionName: a
|
|
236
236
|
}), () => {
|
|
237
237
|
J("");
|
|
238
238
|
};
|
|
@@ -256,32 +256,32 @@ const te = ["product", "representation"], ee = ({
|
|
|
256
256
|
l(() => {
|
|
257
257
|
const t = (i) => {
|
|
258
258
|
if (i.key === "Escape" && x) {
|
|
259
|
-
const
|
|
260
|
-
if (["INPUT", "TEXTAREA", "SELECT"].includes(
|
|
259
|
+
const a = i.target;
|
|
260
|
+
if (["INPUT", "TEXTAREA", "SELECT"].includes(a.tagName) || a.isContentEditable || h === !1 && (a.closest("#viewer-dialog") || V)) return;
|
|
261
261
|
F();
|
|
262
262
|
}
|
|
263
263
|
};
|
|
264
264
|
return window.addEventListener("keydown", t), () => window.removeEventListener("keydown", t);
|
|
265
265
|
}, [F, h, V]);
|
|
266
266
|
const { requestPipWindow: xt } = Mt(), Y = b(null), Z = b(null), kt = s.length === 1 && e !== "representation", vt = R(() => {
|
|
267
|
-
const t =
|
|
267
|
+
const t = n?.label || n?.name || "", i = n?.parents || [], a = [p];
|
|
268
268
|
switch (e) {
|
|
269
269
|
case "folder":
|
|
270
270
|
case "task":
|
|
271
271
|
case "product":
|
|
272
|
-
|
|
272
|
+
a.push(i.at(-1), t);
|
|
273
273
|
break;
|
|
274
274
|
case "version":
|
|
275
|
-
|
|
275
|
+
a.push(i.at(-2), i.at(-1), t);
|
|
276
276
|
break;
|
|
277
277
|
case "representation":
|
|
278
|
-
|
|
278
|
+
a.push(i.at(-3), i.at(-2), i.at(-1), t);
|
|
279
279
|
break;
|
|
280
280
|
default:
|
|
281
|
-
|
|
281
|
+
a.push(t);
|
|
282
282
|
}
|
|
283
|
-
return
|
|
284
|
-
}, [
|
|
283
|
+
return a.filter(Boolean).join(" - ");
|
|
284
|
+
}, [n, e, p]), It = () => {
|
|
285
285
|
lt({
|
|
286
286
|
entityType: e,
|
|
287
287
|
entities: c,
|
|
@@ -317,7 +317,7 @@ const te = ["product", "representation"], ee = ({
|
|
|
317
317
|
Kt,
|
|
318
318
|
{
|
|
319
319
|
entityType: e,
|
|
320
|
-
entityId:
|
|
320
|
+
entityId: n?.id,
|
|
321
321
|
entityIds: c.map((t) => t.id).filter(Boolean),
|
|
322
322
|
entityLabel: vt,
|
|
323
323
|
projectName: p,
|
|
@@ -334,11 +334,11 @@ const te = ["product", "representation"], ee = ({
|
|
|
334
334
|
};
|
|
335
335
|
}),
|
|
336
336
|
entityListsContext: mt,
|
|
337
|
-
onOpenPip:
|
|
337
|
+
onOpenPip: It,
|
|
338
338
|
onOpenViewer: U,
|
|
339
|
-
productId:
|
|
340
|
-
taskId:
|
|
341
|
-
folderId:
|
|
339
|
+
productId: n?.product?.id,
|
|
340
|
+
taskId: n?.task?.id,
|
|
341
|
+
folderId: n?.folder?.id
|
|
342
342
|
}
|
|
343
343
|
),
|
|
344
344
|
/* @__PURE__ */ o.jsx(
|
|
@@ -352,7 +352,7 @@ const te = ["product", "representation"], ee = ({
|
|
|
352
352
|
}
|
|
353
353
|
),
|
|
354
354
|
x && /* @__PURE__ */ o.jsx(
|
|
355
|
-
|
|
355
|
+
Dt,
|
|
356
356
|
{
|
|
357
357
|
icon: "close",
|
|
358
358
|
variant: "text",
|
|
@@ -376,7 +376,7 @@ const te = ["product", "representation"], ee = ({
|
|
|
376
376
|
isCompact: nt,
|
|
377
377
|
currentTab: m,
|
|
378
378
|
onTabChange: j,
|
|
379
|
-
projectInfo:
|
|
379
|
+
projectInfo: I,
|
|
380
380
|
onOpenViewer: (t) => U?.(t),
|
|
381
381
|
onEntityFocus: at,
|
|
382
382
|
thumbnailInputRef: Y,
|
|
@@ -403,12 +403,13 @@ const te = ["product", "representation"], ee = ({
|
|
|
403
403
|
isSlideOut: h
|
|
404
404
|
}
|
|
405
405
|
),
|
|
406
|
-
m === "subtasks" && e === "task" &&
|
|
406
|
+
m === "subtasks" && e === "task" && n?.id && Q && /* @__PURE__ */ o.jsx(
|
|
407
407
|
$t,
|
|
408
408
|
{
|
|
409
409
|
projectName: p,
|
|
410
|
-
taskId:
|
|
411
|
-
|
|
410
|
+
taskId: n.id,
|
|
411
|
+
folderId: n.folder?.id,
|
|
412
|
+
subtasks: n.task?.subtasks || [],
|
|
412
413
|
SubtasksManager: Q,
|
|
413
414
|
useNavigate: ut,
|
|
414
415
|
onNotFound: () => j("feed")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DetailsPanel.es.js","sources":["../../../../../src/containers/DetailsPanel/DetailsPanel.tsx"],"sourcesContent":["import { Button } from '@ynput/ayon-react-components'\nimport React, { useEffect, useMemo, useRef, useState } from 'react'\nimport useDetailsPanelURLSync from './hooks/useDetailsPanelURLSync'\nimport * as Styled from './DetailsPanel.styled'\n\n// shared\nimport { useGetEntitiesDetailsPanelQuery, detailsPanelEntityTypes } from '@shared/api'\nimport type { Tag, DetailsPanelEntityType, DetailsPanelEntityData } from '@shared/api'\nimport { DetailsPanelDetails } from '@shared/components/DetailsPanelDetails/DetailsPanelDetails'\nimport { EntityPath } from '@shared/components/EntityPath/EntityPath'\nimport { Watchers } from '@shared/components/Watchers/Watchers'\nimport { usePiPWindow } from '@shared/context/pip/PiPProvider'\nimport { extractEntityHierarchyFromParents } from '@shared/util'\nimport { ProjectContextProvider } from '@shared/context/ProjectContext'\nimport { ThumbnailUploadProvider } from '@shared/context/ThumbnailUploaderContext'\nimport {\n useDetailsPanelContext,\n useScopedDetailsPanel,\n setDetailsPanelTabForScope,\n} from '@shared/context/DetailsPanelContext'\nimport { useURIContext } from '@shared/context/UriContext'\nimport type { ProjectModelWithProducts } from '@shared/context/ProjectContext'\nimport type { FeedFilter } from '@shared/context/DetailsPanelContext'\n\nimport DetailsPanelHeader from './components/DetailsPanelHeader/DetailsPanelHeader'\nimport DetailsPanelFiles from './components/DetailsPanelFiles'\nimport {\n DetailsPanelMoreMenu,\n type DetailsPanelEntityListsContext,\n} from './components/DetailsPanelMoreMenu'\nimport useGetEntityPath from './hooks/useGetEntityPath'\nimport getAllProjectStatuses from './helpers/getAllProjectsStatuses'\nimport FeedWrapper from './containers/FeedWrapper'\nimport FeedContextWrapper from './containers/FeedContextWrapper'\nimport mergeProjectInfo from './helpers/mergeProjectInfo'\nimport buildEntityTypeIcons from './helpers/buildEntityTypeIcons'\nimport DetailsPanelSubtasks from './containers/DetailsPanelSubtasks'\n\nexport const entitiesWithoutFeed = ['product', 'representation']\n\ntype User = { avatarUrl: string; name: string; fullName?: string }\n\nexport type DetailsPanelProps = {\n entityType: DetailsPanelEntityType\n entitySubTypes?: string[] // used to get actions before the entity has loaded\n entitiesData?: { id: string; label: string; type: DetailsPanelEntityType }[]\n entities?: { id: string; projectName: string }[]\n tagsOptions?: Tag[]\n disabledStatuses?: string[]\n projectUsers?: User[]\n disabledProjectUsers?: string[]\n activeProjectUsers?: string[]\n projectsInfo?: Record<string, ProjectModelWithProducts>\n projectNames?: string[]\n isSlideOut?: boolean\n style?: React.CSSProperties\n scope: string\n isCompact?: boolean\n onClose?: () => void\n onWatchersUpdate?: (added: any[], removed: any[]) => void\n onOpenViewer?: (entity: any) => void\n onEntityFocus?: (id: string, entityType: DetailsPanelEntityType) => void\n onOpen?: () => void\n onUriOpen?: (entity: DetailsPanelEntityData, source: 'uri' | 'url') => void\n // annotations\n annotations?: any\n removeAnnotation?: (id: string) => void\n exportAnnotationComposite?: (id: string) => Promise<Blob | null>\n entityListId?: string\n guestCategories?: Record<string, string> // only used for guests to find if they have access to any categories\n /** Optional EntityListsContext for the \"Add to list\" sub-menu in the more-menu.\n * Hosts that already mount EntityListsProvider can pass the resolved context here;\n * otherwise wrap the panel with EntityListsContextBoundary. The shape mirrors\n * `EntityListsContextType` from `src/pages/ProjectListsPage/context` — it lives as a\n * structural type in shared/ so the layering rule (shared cannot import src/pages)\n * is preserved. */\n entityListsContext?: DetailsPanelEntityListsContext\n // optional tab state for independent tab management\n}\n\nconst DetailsPanelInner = ({\n entityType,\n entitySubTypes = [],\n // entities is data we already have from kanban\n entitiesData = [],\n // entityIds are used to get the full details data for the entities\n entities = [],\n tagsOptions = [],\n disabledStatuses,\n projectUsers,\n disabledProjectUsers,\n activeProjectUsers,\n projectsInfo = {},\n projectNames = [],\n isSlideOut = false,\n style = {},\n scope,\n isCompact = false,\n onClose,\n onWatchersUpdate,\n onOpenViewer,\n onEntityFocus,\n onOpen,\n onUriOpen, // when the details panel is opened from uri\n // annotations\n annotations,\n removeAnnotation,\n exportAnnotationComposite,\n entityListId,\n guestCategories = {},\n entityListsContext,\n}: // optional tab state for independent tab management\nDetailsPanelProps) => {\n const {\n closeSlideOut,\n openPip,\n user,\n isGuest,\n entities: contextEntities,\n setEntities,\n slideOut,\n useSearchParams,\n SubtasksManager,\n useNavigate,\n } = useDetailsPanelContext()\n const { currentTab, setTab, isFeed } = useScopedDetailsPanel(scope)\n const [_searchParams, setSearchParams] = useSearchParams()\n const hasCalledOnOpen = useRef(false)\n\n // Use context entities if available, otherwise use props\n const activeEntityType = contextEntities?.entityType ?? entityType\n const activeEntities = contextEntities?.entities ?? entities\n const activeEntitySubTypes = contextEntities?.entitySubTypes ?? entitySubTypes\n const activeEntitiesData = contextEntities?.entities ? [] : entitiesData\n const activeProjectNames = contextEntities?.entities\n ? contextEntities.entities.map((e) => e.projectName)\n : projectNames\n\n // Fire onOpen callback once when component mounts and renders\n useEffect(() => {\n if (onOpen && !hasCalledOnOpen.current) {\n hasCalledOnOpen.current = true\n onOpen()\n }\n }, [])\n\n // Force details tab for specific entity types\n useEffect(() => {\n if (entitiesWithoutFeed.includes(activeEntityType) && currentTab !== 'details') {\n setTab('details')\n }\n }, [activeEntityType, currentTab, setTab])\n\n // once component is provided with specific entities, remove context entities to avoid conflicts\n useEffect(() => {\n if (entities.length && contextEntities) {\n setEntities(null)\n }\n }, [entities, contextEntities, setEntities])\n\n // reduce projectsInfo to selected projects and into one\n const projectInfo = useMemo(\n () => mergeProjectInfo(projectsInfo, activeProjectNames),\n [projectsInfo, activeProjectNames],\n )\n\n // build icons for entity types (used by the entity path breadcrumb)\n const entityTypeIcons = useMemo(() => buildEntityTypeIcons(projectInfo), [projectInfo])\n\n // for example when switching from version to task, task doesn't have reps tab\n // if reps tab was selected, set default to feed\n useEffect(() => {\n if (currentTab === 'files') {\n // check entity type is still version\n if (activeEntityType !== 'version') {\n setTab('feed')\n }\n }\n // Reset to feed if subtasks tab is selected but entity is not a task\n if (currentTab === 'subtasks' && activeEntityType !== 'task') {\n setTab('feed')\n }\n }, [activeEntityType, currentTab, scope])\n\n // now we get the full details data for selected entities\n let entitiesToQuery = activeEntities.length\n ? activeEntities.map((entity) => ({ id: entity.id, projectName: entity.projectName }))\n : // @ts-expect-error = not sure what's going on with activeEntitiesData, we should try and remove it\n activeEntitiesData.map((entity) => ({ id: entity.id, projectName: entity.projectName }))\n\n entitiesToQuery = entitiesToQuery.filter((entity) => entity.id)\n\n const {\n data: entityDetailsData = [],\n isFetching: isFetchingEntitiesDetails,\n isError,\n originalArgs,\n } = useGetEntitiesDetailsPanelQuery(\n { entityType: activeEntityType, entities: entitiesToQuery },\n {\n skip: !entitiesToQuery.length || !detailsPanelEntityTypes.includes(activeEntityType),\n },\n )\n\n // the entity changes then we close the slide out\n useEffect(() => {\n if (!isSlideOut) {\n closeSlideOut()\n }\n }, [originalArgs, isSlideOut])\n\n // fire onUriOpen once per context entity — a details refetch must not re-run the jump/filter reset\n const uriOpenFiredForId = useRef<string | null>(null)\n useEffect(() => {\n if (!contextEntities) uriOpenFiredForId.current = null\n }, [contextEntities])\n\n // if the details panel is opened via the uri, run callback\n useEffect(() => {\n if (isFetchingEntitiesDetails) return\n\n if (\n (contextEntities?.source === 'uri' || contextEntities?.source === 'url') &&\n contextEntities?.entities?.length &&\n !!onUriOpen\n ) {\n const targetId = contextEntities.entities[0].id\n if (uriOpenFiredForId.current === targetId) return\n\n const uriEntity = entityDetailsData.find((entity) => entity.id === targetId)\n if (!uriEntity) return\n\n uriOpenFiredForId.current = targetId\n onUriOpen(uriEntity, contextEntities.source)\n }\n }, [entityDetailsData, isFetchingEntitiesDetails, contextEntities, onUriOpen])\n\n // TODO: merge current entities data with fresh details data\n\n const allStatuses = getAllProjectStatuses(projectsInfo)\n\n // get the first project name and info to be used in the feed.\n const firstProject = activeProjectNames[0]\n const firstProjectInfo = projectsInfo[firstProject] || {}\n const firstEntityData = entityDetailsData[0] || {}\n // Use the last entity for URI sync\n const lastEntityData = entityDetailsData[entityDetailsData.length - 1]\n const lastProject = activeProjectNames[activeProjectNames.length - 1]\n\n // build the full entity path for the first entity\n const [entityPathSegments, entityPathVersions] = useGetEntityPath({\n entity: firstEntityData,\n entityType: activeEntityType,\n projectName: firstProject,\n isLoading: isFetchingEntitiesDetails,\n })\n\n const { setEntityUri, setUri } = useURIContext()\n // sync the uri when entity changes\n useEffect(() => {\n if (!lastEntityData?.parents) return\n if (!lastProject) return\n const { folderPath, taskName, versionName, productName } = extractEntityHierarchyFromParents(\n lastEntityData.parents,\n activeEntityType,\n lastEntityData.name,\n )\n\n setEntityUri({\n projectName: lastProject,\n folderPath: folderPath,\n taskName: taskName,\n productName: productName,\n versionName: versionName,\n })\n\n // unmount cleanup: clear uri\n return () => {\n setUri('')\n }\n }, [entityDetailsData, activeProjectNames, activeEntityType])\n\n // sync the details panel url (panel) with entity\n useDetailsPanelURLSync({\n entityData: lastEntityData,\n project: lastProject,\n activeEntityType,\n entitiesToQuery,\n })\n\n const clearSearchUrl = () => {\n // remove URL params when closing\n setSearchParams(\n (prev) => {\n const newParams = new URLSearchParams(prev)\n newParams.delete('project')\n newParams.delete('type')\n newParams.delete('id')\n return newParams\n },\n { replace: true },\n )\n }\n\n const handleClose = () => {\n onClose?.()\n // also remove any entities in context\n setEntities(null)\n // drop the uri so an in-flight resolve can't reopen the panel after close\n setUri('')\n clearSearchUrl()\n closeSlideOut()\n }\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && onClose) {\n // Don't trigger if we're in an input element\n const target = e.target as HTMLElement\n const isInputElement =\n ['INPUT', 'TEXTAREA', 'SELECT'].includes(target.tagName) || target.isContentEditable\n\n if (isInputElement) return\n\n // don't trigger if the viewer is open and panel not in slideout mode\n if (isSlideOut === false && (target.closest('#viewer-dialog') || !!slideOut)) return\n\n handleClose()\n }\n }\n\n window.addEventListener('keydown', handleKeyDown)\n return () => window.removeEventListener('keydown', handleKeyDown)\n }, [handleClose, isSlideOut, slideOut])\n\n const { requestPipWindow } = usePiPWindow()\n\n // Hoisted so ThumbnailUploadProvider (wrapping the toolbar) and EntityPanelUploader\n // (inside DetailsPanelHeader) share the same ref identity — otherwise the toolbar's\n // more-menu, which sits as a sibling above the header, can't reach the inputs.\n const thumbnailInputRef = useRef<HTMLInputElement>(null)\n const versionsInputRef = useRef<HTMLInputElement>(null)\n const canUploadVersion = entityDetailsData.length === 1 && activeEntityType !== 'representation'\n\n const shareEntityLabel = useMemo(() => {\n const name = firstEntityData?.label || firstEntityData?.name || ''\n const parents: string[] = firstEntityData?.parents || []\n const parts: (string | undefined)[] = [firstProject]\n switch (activeEntityType) {\n case 'folder':\n case 'task':\n case 'product':\n parts.push(parents.at(-1), name)\n break\n case 'version':\n parts.push(parents.at(-2), parents.at(-1), name)\n break\n case 'representation':\n parts.push(parents.at(-3), parents.at(-2), parents.at(-1), name)\n break\n default:\n parts.push(name)\n }\n return parts.filter(Boolean).join(' - ')\n }, [firstEntityData, activeEntityType, firstProject])\n\n const handleOpenPip = () => {\n openPip({\n entityType: activeEntityType,\n entities: entitiesToQuery,\n scope: scope,\n })\n requestPipWindow(500, 500)\n }\n\n const isCommentingEnabled = () => {\n // cannot comment on multiple projects\n if (activeProjectNames.length > 1) return false\n if (isGuest) {\n // Guest can only comment in review sessions (for now)\n if (!entityListId) return false\n // Guest must have at least one category set for list\n const guestHasCategory = Object.prototype.hasOwnProperty.call(\n guestCategories,\n user.attrib?.email || '',\n )\n if (!guestHasCategory) return false\n }\n return true\n }\n\n return (\n <ThumbnailUploadProvider\n thumbnailInputRef={thumbnailInputRef}\n versionsInputRef={versionsInputRef}\n canUploadVersion={canUploadVersion}\n >\n <Styled.Panel className=\"details-panel\">\n <Styled.Toolbar>\n {/* TODO FIX PATH */}\n <EntityPath\n segments={entityPathSegments}\n versions={entityPathVersions}\n projectName={firstProject}\n hideProjectName={isSlideOut}\n isLoading={isFetchingEntitiesDetails || !entityPathSegments.length}\n entityType={activeEntityType}\n scope={scope}\n // @ts-ignore\n entityTypeIcons={entityTypeIcons}\n />\n <Styled.RightTools className=\"right-tools\">\n <DetailsPanelMoreMenu\n entityType={activeEntityType}\n entityId={firstEntityData?.id}\n entityIds={entitiesToQuery.map((e) => e.id).filter(Boolean)}\n entityLabel={shareEntityLabel}\n projectName={firstProject}\n selectedEntities={entityDetailsData\n .filter((e) => !!e?.id)\n .map((e) => {\n const type = e.entityType || activeEntityType\n return {\n entityId: e.id,\n entityType: type,\n hasReviewables: !!e.hasReviewables,\n name: e.name,\n label: e.label,\n projectName: e.projectName || firstProject,\n folderId: type === 'task' ? e.folder?.id : undefined,\n }\n })}\n entityListsContext={entityListsContext}\n onOpenPip={handleOpenPip}\n onOpenViewer={onOpenViewer}\n productId={firstEntityData?.product?.id}\n taskId={firstEntityData?.task?.id}\n folderId={firstEntityData?.folder?.id}\n />\n <Watchers\n entities={entitiesToQuery}\n entityType={activeEntityType}\n options={projectUsers || []}\n onWatchersUpdate={onWatchersUpdate && onWatchersUpdate}\n userName={user.name}\n />\n\n {onClose && (\n <Button\n icon=\"close\"\n variant={'text'}\n onClick={handleClose}\n data-shortcut={'Escape'}\n />\n )}\n </Styled.RightTools>\n </Styled.Toolbar>\n\n <DetailsPanelHeader\n entityType={activeEntityType}\n entitySubTypes={activeEntitySubTypes}\n entities={entityDetailsData}\n users={projectUsers}\n disabledAssignees={disabledProjectUsers}\n disabledStatuses={disabledStatuses}\n tagsOptions={tagsOptions}\n isFetching={isFetchingEntitiesDetails}\n isCompact={isCompact}\n currentTab={currentTab}\n onTabChange={setTab}\n projectInfo={projectInfo}\n onOpenViewer={(args) => onOpenViewer?.(args)}\n onEntityFocus={onEntityFocus}\n thumbnailInputRef={thumbnailInputRef}\n versionsInputRef={versionsInputRef}\n />\n\n <ProjectContextProvider projectName={firstProject}>\n {isFeed && !isError && (\n <FeedWrapper\n entityType={activeEntityType}\n entities={entityDetailsData}\n activeUsers={activeProjectUsers || []}\n projectInfo={firstProjectInfo}\n projectName={firstProject}\n disabled={!isCommentingEnabled()}\n scope={scope}\n statuses={allStatuses}\n readOnly={false}\n entityListId={entityListId}\n annotations={annotations}\n removeAnnotation={removeAnnotation}\n exportAnnotationComposite={exportAnnotationComposite}\n isSlideOut={isSlideOut}\n />\n )}\n {currentTab === 'subtasks' &&\n activeEntityType === 'task' &&\n firstEntityData?.id &&\n SubtasksManager && (\n <DetailsPanelSubtasks\n projectName={firstProject}\n taskId={firstEntityData.id}\n subtasks={firstEntityData.task?.subtasks || []}\n SubtasksManager={SubtasksManager}\n useNavigate={useNavigate!}\n onNotFound={() => setTab('feed')} // if subtasks module is not found, switch to feed tab\n />\n )}\n {currentTab === 'files' && (\n <DetailsPanelFiles\n entities={entityDetailsData}\n scope={scope}\n isLoadingVersion={isFetchingEntitiesDetails}\n />\n )}\n {currentTab === 'details' && (\n <FeedContextWrapper\n entityType={activeEntityType}\n entities={entityDetailsData}\n activeUsers={activeProjectUsers || []}\n projectInfo={firstProjectInfo}\n projectName={firstProject}\n disabled={!isCommentingEnabled()}\n scope={scope}\n statuses={allStatuses}\n readOnly={false}\n annotations={annotations}\n removeAnnotation={removeAnnotation}\n exportAnnotationComposite={exportAnnotationComposite}\n >\n <DetailsPanelDetails\n entities={entityDetailsData}\n isLoading={isFetchingEntitiesDetails}\n />\n </FeedContextWrapper>\n )}\n </ProjectContextProvider>\n </Styled.Panel>\n </ThumbnailUploadProvider>\n )\n}\n\n// create a wrapper that checks if the details panel should be open or not based on isOpen prop and entities state\nexport const DetailsPanel = ({\n isOpen,\n entityType,\n ...props\n}: Omit<DetailsPanelProps, 'entityType'> & {\n entityType?: DetailsPanelEntityType\n isOpen: boolean\n}) => {\n const { entities } = useDetailsPanelContext()\n\n if (!isOpen && !entities) return null\n if (!entityType && !entities) return null\n\n return <DetailsPanelInner {...props} entityType={entityType || entities?.entityType} />\n}\n"],"names":["entitiesWithoutFeed","DetailsPanelInner","entityType","entitySubTypes","entitiesData","entities","tagsOptions","disabledStatuses","projectUsers","disabledProjectUsers","activeProjectUsers","projectsInfo","projectNames","isSlideOut","style","scope","isCompact","onClose","onWatchersUpdate","onOpenViewer","onEntityFocus","onOpen","onUriOpen","annotations","removeAnnotation","exportAnnotationComposite","entityListId","guestCategories","entityListsContext","closeSlideOut","openPip","user","isGuest","contextEntities","setEntities","slideOut","useSearchParams","SubtasksManager","useNavigate","useDetailsPanelContext","currentTab","setTab","isFeed","useScopedDetailsPanel","_searchParams","setSearchParams","hasCalledOnOpen","useRef","activeEntityType","activeEntities","activeEntitySubTypes","activeEntitiesData","activeProjectNames","e","useEffect","projectInfo","useMemo","mergeProjectInfo","entityTypeIcons","buildEntityTypeIcons","entitiesToQuery","entity","entityDetailsData","isFetchingEntitiesDetails","isError","originalArgs","useGetEntitiesDetailsPanelQuery","detailsPanelEntityTypes","uriOpenFiredForId","targetId","uriEntity","allStatuses","getAllProjectStatuses","firstProject","firstProjectInfo","firstEntityData","lastEntityData","lastProject","entityPathSegments","entityPathVersions","useGetEntityPath","setEntityUri","setUri","useURIContext","folderPath","taskName","versionName","productName","extractEntityHierarchyFromParents","useDetailsPanelURLSync","clearSearchUrl","prev","newParams","handleClose","handleKeyDown","target","requestPipWindow","usePiPWindow","thumbnailInputRef","versionsInputRef","canUploadVersion","shareEntityLabel","name","parents","parts","handleOpenPip","isCommentingEnabled","jsx","ThumbnailUploadProvider","jsxs","Styled.Panel","Styled.Toolbar","EntityPath","Styled.RightTools","DetailsPanelMoreMenu","type","Watchers","Button","DetailsPanelHeader","args","ProjectContextProvider","FeedWrapper","DetailsPanelSubtasks","DetailsPanelFiles","FeedContextWrapper","DetailsPanelDetails","DetailsPanel","isOpen","props"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DetailsPanel.es.js","sources":["../../../../../src/containers/DetailsPanel/DetailsPanel.tsx"],"sourcesContent":["import { Button } from '@ynput/ayon-react-components'\nimport React, { useEffect, useMemo, useRef, useState } from 'react'\nimport useDetailsPanelURLSync from './hooks/useDetailsPanelURLSync'\nimport * as Styled from './DetailsPanel.styled'\n\n// shared\nimport { useGetEntitiesDetailsPanelQuery, detailsPanelEntityTypes } from '@shared/api'\nimport type { Tag, DetailsPanelEntityType, DetailsPanelEntityData } from '@shared/api'\nimport { DetailsPanelDetails } from '@shared/components/DetailsPanelDetails/DetailsPanelDetails'\nimport { EntityPath } from '@shared/components/EntityPath/EntityPath'\nimport { Watchers } from '@shared/components/Watchers/Watchers'\nimport { usePiPWindow } from '@shared/context/pip/PiPProvider'\nimport { extractEntityHierarchyFromParents } from '@shared/util'\nimport { ProjectContextProvider } from '@shared/context/ProjectContext'\nimport { ThumbnailUploadProvider } from '@shared/context/ThumbnailUploaderContext'\nimport {\n useDetailsPanelContext,\n useScopedDetailsPanel,\n setDetailsPanelTabForScope,\n} from '@shared/context/DetailsPanelContext'\nimport { useURIContext } from '@shared/context/UriContext'\nimport type { ProjectModelWithProducts } from '@shared/context/ProjectContext'\nimport type { FeedFilter } from '@shared/context/DetailsPanelContext'\n\nimport DetailsPanelHeader from './components/DetailsPanelHeader/DetailsPanelHeader'\nimport DetailsPanelFiles from './components/DetailsPanelFiles'\nimport {\n DetailsPanelMoreMenu,\n type DetailsPanelEntityListsContext,\n} from './components/DetailsPanelMoreMenu'\nimport useGetEntityPath from './hooks/useGetEntityPath'\nimport getAllProjectStatuses from './helpers/getAllProjectsStatuses'\nimport FeedWrapper from './containers/FeedWrapper'\nimport FeedContextWrapper from './containers/FeedContextWrapper'\nimport mergeProjectInfo from './helpers/mergeProjectInfo'\nimport buildEntityTypeIcons from './helpers/buildEntityTypeIcons'\nimport DetailsPanelSubtasks from './containers/DetailsPanelSubtasks'\n\nexport const entitiesWithoutFeed = ['product', 'representation']\n\ntype User = { avatarUrl: string; name: string; fullName?: string }\n\nexport type DetailsPanelProps = {\n entityType: DetailsPanelEntityType\n entitySubTypes?: string[] // used to get actions before the entity has loaded\n entitiesData?: { id: string; label: string; type: DetailsPanelEntityType }[]\n entities?: { id: string; projectName: string }[]\n tagsOptions?: Tag[]\n disabledStatuses?: string[]\n projectUsers?: User[]\n disabledProjectUsers?: string[]\n activeProjectUsers?: string[]\n projectsInfo?: Record<string, ProjectModelWithProducts>\n projectNames?: string[]\n isSlideOut?: boolean\n style?: React.CSSProperties\n scope: string\n isCompact?: boolean\n onClose?: () => void\n onWatchersUpdate?: (added: any[], removed: any[]) => void\n onOpenViewer?: (entity: any) => void\n onEntityFocus?: (id: string, entityType: DetailsPanelEntityType) => void\n onOpen?: () => void\n onUriOpen?: (entity: DetailsPanelEntityData, source: 'uri' | 'url') => void\n // annotations\n annotations?: any\n removeAnnotation?: (id: string) => void\n exportAnnotationComposite?: (id: string) => Promise<Blob | null>\n entityListId?: string\n guestCategories?: Record<string, string> // only used for guests to find if they have access to any categories\n /** Optional EntityListsContext for the \"Add to list\" sub-menu in the more-menu.\n * Hosts that already mount EntityListsProvider can pass the resolved context here;\n * otherwise wrap the panel with EntityListsContextBoundary. The shape mirrors\n * `EntityListsContextType` from `src/pages/ProjectListsPage/context` — it lives as a\n * structural type in shared/ so the layering rule (shared cannot import src/pages)\n * is preserved. */\n entityListsContext?: DetailsPanelEntityListsContext\n // optional tab state for independent tab management\n}\n\nconst DetailsPanelInner = ({\n entityType,\n entitySubTypes = [],\n // entities is data we already have from kanban\n entitiesData = [],\n // entityIds are used to get the full details data for the entities\n entities = [],\n tagsOptions = [],\n disabledStatuses,\n projectUsers,\n disabledProjectUsers,\n activeProjectUsers,\n projectsInfo = {},\n projectNames = [],\n isSlideOut = false,\n style = {},\n scope,\n isCompact = false,\n onClose,\n onWatchersUpdate,\n onOpenViewer,\n onEntityFocus,\n onOpen,\n onUriOpen, // when the details panel is opened from uri\n // annotations\n annotations,\n removeAnnotation,\n exportAnnotationComposite,\n entityListId,\n guestCategories = {},\n entityListsContext,\n}: // optional tab state for independent tab management\nDetailsPanelProps) => {\n const {\n closeSlideOut,\n openPip,\n user,\n isGuest,\n entities: contextEntities,\n setEntities,\n slideOut,\n useSearchParams,\n SubtasksManager,\n useNavigate,\n } = useDetailsPanelContext()\n const { currentTab, setTab, isFeed } = useScopedDetailsPanel(scope)\n const [_searchParams, setSearchParams] = useSearchParams()\n const hasCalledOnOpen = useRef(false)\n\n // Use context entities if available, otherwise use props\n const activeEntityType = contextEntities?.entityType ?? entityType\n const activeEntities = contextEntities?.entities ?? entities\n const activeEntitySubTypes = contextEntities?.entitySubTypes ?? entitySubTypes\n const activeEntitiesData = contextEntities?.entities ? [] : entitiesData\n const activeProjectNames = contextEntities?.entities\n ? contextEntities.entities.map((e) => e.projectName)\n : projectNames\n\n // Fire onOpen callback once when component mounts and renders\n useEffect(() => {\n if (onOpen && !hasCalledOnOpen.current) {\n hasCalledOnOpen.current = true\n onOpen()\n }\n }, [])\n\n // Force details tab for specific entity types\n useEffect(() => {\n if (entitiesWithoutFeed.includes(activeEntityType) && currentTab !== 'details') {\n setTab('details')\n }\n }, [activeEntityType, currentTab, setTab])\n\n // once component is provided with specific entities, remove context entities to avoid conflicts\n useEffect(() => {\n if (entities.length && contextEntities) {\n setEntities(null)\n }\n }, [entities, contextEntities, setEntities])\n\n // reduce projectsInfo to selected projects and into one\n const projectInfo = useMemo(\n () => mergeProjectInfo(projectsInfo, activeProjectNames),\n [projectsInfo, activeProjectNames],\n )\n\n // build icons for entity types (used by the entity path breadcrumb)\n const entityTypeIcons = useMemo(() => buildEntityTypeIcons(projectInfo), [projectInfo])\n\n // for example when switching from version to task, task doesn't have reps tab\n // if reps tab was selected, set default to feed\n useEffect(() => {\n if (currentTab === 'files') {\n // check entity type is still version\n if (activeEntityType !== 'version') {\n setTab('feed')\n }\n }\n // Reset to feed if subtasks tab is selected but entity is not a task\n if (currentTab === 'subtasks' && activeEntityType !== 'task') {\n setTab('feed')\n }\n }, [activeEntityType, currentTab, scope])\n\n // now we get the full details data for selected entities\n let entitiesToQuery = activeEntities.length\n ? activeEntities.map((entity) => ({ id: entity.id, projectName: entity.projectName }))\n : // @ts-expect-error = not sure what's going on with activeEntitiesData, we should try and remove it\n activeEntitiesData.map((entity) => ({ id: entity.id, projectName: entity.projectName }))\n\n entitiesToQuery = entitiesToQuery.filter((entity) => entity.id)\n\n const {\n data: entityDetailsData = [],\n isFetching: isFetchingEntitiesDetails,\n isError,\n originalArgs,\n } = useGetEntitiesDetailsPanelQuery(\n { entityType: activeEntityType, entities: entitiesToQuery },\n {\n skip: !entitiesToQuery.length || !detailsPanelEntityTypes.includes(activeEntityType),\n },\n )\n\n // the entity changes then we close the slide out\n useEffect(() => {\n if (!isSlideOut) {\n closeSlideOut()\n }\n }, [originalArgs, isSlideOut])\n\n // fire onUriOpen once per context entity — a details refetch must not re-run the jump/filter reset\n const uriOpenFiredForId = useRef<string | null>(null)\n useEffect(() => {\n if (!contextEntities) uriOpenFiredForId.current = null\n }, [contextEntities])\n\n // if the details panel is opened via the uri, run callback\n useEffect(() => {\n if (isFetchingEntitiesDetails) return\n\n if (\n (contextEntities?.source === 'uri' || contextEntities?.source === 'url') &&\n contextEntities?.entities?.length &&\n !!onUriOpen\n ) {\n const targetId = contextEntities.entities[0].id\n if (uriOpenFiredForId.current === targetId) return\n\n const uriEntity = entityDetailsData.find((entity) => entity.id === targetId)\n if (!uriEntity) return\n\n uriOpenFiredForId.current = targetId\n onUriOpen(uriEntity, contextEntities.source)\n }\n }, [entityDetailsData, isFetchingEntitiesDetails, contextEntities, onUriOpen])\n\n // TODO: merge current entities data with fresh details data\n\n const allStatuses = getAllProjectStatuses(projectsInfo)\n\n // get the first project name and info to be used in the feed.\n const firstProject = activeProjectNames[0]\n const firstProjectInfo = projectsInfo[firstProject] || {}\n const firstEntityData = entityDetailsData[0] || {}\n // Use the last entity for URI sync\n const lastEntityData = entityDetailsData[entityDetailsData.length - 1]\n const lastProject = activeProjectNames[activeProjectNames.length - 1]\n\n // build the full entity path for the first entity\n const [entityPathSegments, entityPathVersions] = useGetEntityPath({\n entity: firstEntityData,\n entityType: activeEntityType,\n projectName: firstProject,\n isLoading: isFetchingEntitiesDetails,\n })\n\n const { setEntityUri, setUri } = useURIContext()\n // sync the uri when entity changes\n useEffect(() => {\n if (!lastEntityData?.parents) return\n if (!lastProject) return\n const { folderPath, taskName, versionName, productName } = extractEntityHierarchyFromParents(\n lastEntityData.parents,\n activeEntityType,\n lastEntityData.name,\n )\n\n setEntityUri({\n projectName: lastProject,\n folderPath: folderPath,\n taskName: taskName,\n productName: productName,\n versionName: versionName,\n })\n\n // unmount cleanup: clear uri\n return () => {\n setUri('')\n }\n }, [entityDetailsData, activeProjectNames, activeEntityType])\n\n // sync the details panel url (panel) with entity\n useDetailsPanelURLSync({\n entityData: lastEntityData,\n project: lastProject,\n activeEntityType,\n entitiesToQuery,\n })\n\n const clearSearchUrl = () => {\n // remove URL params when closing\n setSearchParams(\n (prev) => {\n const newParams = new URLSearchParams(prev)\n newParams.delete('project')\n newParams.delete('type')\n newParams.delete('id')\n return newParams\n },\n { replace: true },\n )\n }\n\n const handleClose = () => {\n onClose?.()\n // also remove any entities in context\n setEntities(null)\n // drop the uri so an in-flight resolve can't reopen the panel after close\n setUri('')\n clearSearchUrl()\n closeSlideOut()\n }\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && onClose) {\n // Don't trigger if we're in an input element\n const target = e.target as HTMLElement\n const isInputElement =\n ['INPUT', 'TEXTAREA', 'SELECT'].includes(target.tagName) || target.isContentEditable\n\n if (isInputElement) return\n\n // don't trigger if the viewer is open and panel not in slideout mode\n if (isSlideOut === false && (target.closest('#viewer-dialog') || !!slideOut)) return\n\n handleClose()\n }\n }\n\n window.addEventListener('keydown', handleKeyDown)\n return () => window.removeEventListener('keydown', handleKeyDown)\n }, [handleClose, isSlideOut, slideOut])\n\n const { requestPipWindow } = usePiPWindow()\n\n // Hoisted so ThumbnailUploadProvider (wrapping the toolbar) and EntityPanelUploader\n // (inside DetailsPanelHeader) share the same ref identity — otherwise the toolbar's\n // more-menu, which sits as a sibling above the header, can't reach the inputs.\n const thumbnailInputRef = useRef<HTMLInputElement>(null)\n const versionsInputRef = useRef<HTMLInputElement>(null)\n const canUploadVersion = entityDetailsData.length === 1 && activeEntityType !== 'representation'\n\n const shareEntityLabel = useMemo(() => {\n const name = firstEntityData?.label || firstEntityData?.name || ''\n const parents: string[] = firstEntityData?.parents || []\n const parts: (string | undefined)[] = [firstProject]\n switch (activeEntityType) {\n case 'folder':\n case 'task':\n case 'product':\n parts.push(parents.at(-1), name)\n break\n case 'version':\n parts.push(parents.at(-2), parents.at(-1), name)\n break\n case 'representation':\n parts.push(parents.at(-3), parents.at(-2), parents.at(-1), name)\n break\n default:\n parts.push(name)\n }\n return parts.filter(Boolean).join(' - ')\n }, [firstEntityData, activeEntityType, firstProject])\n\n const handleOpenPip = () => {\n openPip({\n entityType: activeEntityType,\n entities: entitiesToQuery,\n scope: scope,\n })\n requestPipWindow(500, 500)\n }\n\n const isCommentingEnabled = () => {\n // cannot comment on multiple projects\n if (activeProjectNames.length > 1) return false\n if (isGuest) {\n // Guest can only comment in review sessions (for now)\n if (!entityListId) return false\n // Guest must have at least one category set for list\n const guestHasCategory = Object.prototype.hasOwnProperty.call(\n guestCategories,\n user.attrib?.email || '',\n )\n if (!guestHasCategory) return false\n }\n return true\n }\n\n return (\n <ThumbnailUploadProvider\n thumbnailInputRef={thumbnailInputRef}\n versionsInputRef={versionsInputRef}\n canUploadVersion={canUploadVersion}\n >\n <Styled.Panel className=\"details-panel\">\n <Styled.Toolbar>\n {/* TODO FIX PATH */}\n <EntityPath\n segments={entityPathSegments}\n versions={entityPathVersions}\n projectName={firstProject}\n hideProjectName={isSlideOut}\n isLoading={isFetchingEntitiesDetails || !entityPathSegments.length}\n entityType={activeEntityType}\n scope={scope}\n // @ts-ignore\n entityTypeIcons={entityTypeIcons}\n />\n <Styled.RightTools className=\"right-tools\">\n <DetailsPanelMoreMenu\n entityType={activeEntityType}\n entityId={firstEntityData?.id}\n entityIds={entitiesToQuery.map((e) => e.id).filter(Boolean)}\n entityLabel={shareEntityLabel}\n projectName={firstProject}\n selectedEntities={entityDetailsData\n .filter((e) => !!e?.id)\n .map((e) => {\n const type = e.entityType || activeEntityType\n return {\n entityId: e.id,\n entityType: type,\n hasReviewables: !!e.hasReviewables,\n name: e.name,\n label: e.label,\n projectName: e.projectName || firstProject,\n folderId: type === 'task' ? e.folder?.id : undefined,\n }\n })}\n entityListsContext={entityListsContext}\n onOpenPip={handleOpenPip}\n onOpenViewer={onOpenViewer}\n productId={firstEntityData?.product?.id}\n taskId={firstEntityData?.task?.id}\n folderId={firstEntityData?.folder?.id}\n />\n <Watchers\n entities={entitiesToQuery}\n entityType={activeEntityType}\n options={projectUsers || []}\n onWatchersUpdate={onWatchersUpdate && onWatchersUpdate}\n userName={user.name}\n />\n\n {onClose && (\n <Button\n icon=\"close\"\n variant={'text'}\n onClick={handleClose}\n data-shortcut={'Escape'}\n />\n )}\n </Styled.RightTools>\n </Styled.Toolbar>\n\n <DetailsPanelHeader\n entityType={activeEntityType}\n entitySubTypes={activeEntitySubTypes}\n entities={entityDetailsData}\n users={projectUsers}\n disabledAssignees={disabledProjectUsers}\n disabledStatuses={disabledStatuses}\n tagsOptions={tagsOptions}\n isFetching={isFetchingEntitiesDetails}\n isCompact={isCompact}\n currentTab={currentTab}\n onTabChange={setTab}\n projectInfo={projectInfo}\n onOpenViewer={(args) => onOpenViewer?.(args)}\n onEntityFocus={onEntityFocus}\n thumbnailInputRef={thumbnailInputRef}\n versionsInputRef={versionsInputRef}\n />\n\n <ProjectContextProvider projectName={firstProject}>\n {isFeed && !isError && (\n <FeedWrapper\n entityType={activeEntityType}\n entities={entityDetailsData}\n activeUsers={activeProjectUsers || []}\n projectInfo={firstProjectInfo}\n projectName={firstProject}\n disabled={!isCommentingEnabled()}\n scope={scope}\n statuses={allStatuses}\n readOnly={false}\n entityListId={entityListId}\n annotations={annotations}\n removeAnnotation={removeAnnotation}\n exportAnnotationComposite={exportAnnotationComposite}\n isSlideOut={isSlideOut}\n />\n )}\n {currentTab === 'subtasks' &&\n activeEntityType === 'task' &&\n firstEntityData?.id &&\n SubtasksManager && (\n <DetailsPanelSubtasks\n projectName={firstProject}\n taskId={firstEntityData.id}\n folderId={firstEntityData.folder?.id}\n subtasks={firstEntityData.task?.subtasks || []}\n SubtasksManager={SubtasksManager}\n useNavigate={useNavigate!}\n onNotFound={() => setTab('feed')} // if subtasks module is not found, switch to feed tab\n />\n )}\n {currentTab === 'files' && (\n <DetailsPanelFiles\n entities={entityDetailsData}\n scope={scope}\n isLoadingVersion={isFetchingEntitiesDetails}\n />\n )}\n {currentTab === 'details' && (\n <FeedContextWrapper\n entityType={activeEntityType}\n entities={entityDetailsData}\n activeUsers={activeProjectUsers || []}\n projectInfo={firstProjectInfo}\n projectName={firstProject}\n disabled={!isCommentingEnabled()}\n scope={scope}\n statuses={allStatuses}\n readOnly={false}\n annotations={annotations}\n removeAnnotation={removeAnnotation}\n exportAnnotationComposite={exportAnnotationComposite}\n >\n <DetailsPanelDetails\n entities={entityDetailsData}\n isLoading={isFetchingEntitiesDetails}\n />\n </FeedContextWrapper>\n )}\n </ProjectContextProvider>\n </Styled.Panel>\n </ThumbnailUploadProvider>\n )\n}\n\n// create a wrapper that checks if the details panel should be open or not based on isOpen prop and entities state\nexport const DetailsPanel = ({\n isOpen,\n entityType,\n ...props\n}: Omit<DetailsPanelProps, 'entityType'> & {\n entityType?: DetailsPanelEntityType\n isOpen: boolean\n}) => {\n const { entities } = useDetailsPanelContext()\n\n if (!isOpen && !entities) return null\n if (!entityType && !entities) return null\n\n return <DetailsPanelInner {...props} entityType={entityType || entities?.entityType} />\n}\n"],"names":["entitiesWithoutFeed","DetailsPanelInner","entityType","entitySubTypes","entitiesData","entities","tagsOptions","disabledStatuses","projectUsers","disabledProjectUsers","activeProjectUsers","projectsInfo","projectNames","isSlideOut","style","scope","isCompact","onClose","onWatchersUpdate","onOpenViewer","onEntityFocus","onOpen","onUriOpen","annotations","removeAnnotation","exportAnnotationComposite","entityListId","guestCategories","entityListsContext","closeSlideOut","openPip","user","isGuest","contextEntities","setEntities","slideOut","useSearchParams","SubtasksManager","useNavigate","useDetailsPanelContext","currentTab","setTab","isFeed","useScopedDetailsPanel","_searchParams","setSearchParams","hasCalledOnOpen","useRef","activeEntityType","activeEntities","activeEntitySubTypes","activeEntitiesData","activeProjectNames","e","useEffect","projectInfo","useMemo","mergeProjectInfo","entityTypeIcons","buildEntityTypeIcons","entitiesToQuery","entity","entityDetailsData","isFetchingEntitiesDetails","isError","originalArgs","useGetEntitiesDetailsPanelQuery","detailsPanelEntityTypes","uriOpenFiredForId","targetId","uriEntity","allStatuses","getAllProjectStatuses","firstProject","firstProjectInfo","firstEntityData","lastEntityData","lastProject","entityPathSegments","entityPathVersions","useGetEntityPath","setEntityUri","setUri","useURIContext","folderPath","taskName","versionName","productName","extractEntityHierarchyFromParents","useDetailsPanelURLSync","clearSearchUrl","prev","newParams","handleClose","handleKeyDown","target","requestPipWindow","usePiPWindow","thumbnailInputRef","versionsInputRef","canUploadVersion","shareEntityLabel","name","parents","parts","handleOpenPip","isCommentingEnabled","jsx","ThumbnailUploadProvider","jsxs","Styled.Panel","Styled.Toolbar","EntityPath","Styled.RightTools","DetailsPanelMoreMenu","type","Watchers","Button","DetailsPanelHeader","args","ProjectContextProvider","FeedWrapper","DetailsPanelSubtasks","DetailsPanelFiles","FeedContextWrapper","DetailsPanelDetails","DetailsPanel","isOpen","props"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FeedWrapper.cjs.js","sources":["../../../../../../src/containers/DetailsPanel/containers/FeedWrapper.tsx"],"sourcesContent":["import { FC } from 'react'\n\nimport { Feed } from '@shared/containers/Feed/Feed'\nimport ActivityReferenceTooltip from '@shared/containers/Feed/components/ActivityReferenceTooltip/ActivityReferenceTooltip'\nimport { FeedProvider } from '@shared/containers/Feed/context/FeedContext'\nimport type { Status, QueryFilter } from '@shared/api'\nimport { useDetailsPanelContext } from '@shared/context/DetailsPanelContext'\
|
|
1
|
+
{"version":3,"file":"FeedWrapper.cjs.js","sources":["../../../../../../src/containers/DetailsPanel/containers/FeedWrapper.tsx"],"sourcesContent":["import { FC } from 'react'\n\nimport { Feed } from '@shared/containers/Feed/Feed'\nimport ActivityReferenceTooltip from '@shared/containers/Feed/components/ActivityReferenceTooltip/ActivityReferenceTooltip'\nimport { FeedProvider } from '@shared/containers/Feed/context/FeedContext'\nimport type { Status, QueryFilter } from '@shared/api'\nimport { useDetailsPanelContext } from '@shared/context/DetailsPanelContext'\n\ninterface FeedWrapperProps {\n entities: any[]\n activeUsers: any[]\n projectInfo: any\n projectName: string\n entityType: string\n thumbnailHash?: string // thumbnailHash from entity\n disabled: boolean\n readOnly: boolean\n isSlideOut?: boolean\n statuses: Status[]\n scope: string\n entityListId?: string\n annotations?: any\n removeAnnotation?: (id: string) => void\n exportAnnotationComposite?: (id: string) => Promise<Blob | null>\n}\n\n// forwards any props\nconst FeedWrapper: FC<FeedWrapperProps> = ({\n scope = 'dashboard',\n entities,\n entityType,\n thumbnailHash,\n projectName,\n projectInfo,\n annotations,\n removeAnnotation,\n exportAnnotationComposite,\n ...props\n}) => {\n const annotationsProps = { annotations, removeAnnotation, exportAnnotationComposite }\n\n const { user } = useDetailsPanelContext()\n\n const userName = user.name || ''\n const userFullName = user.attrib?.fullName || ''\n\n return (\n <FeedProvider\n {...{\n scope,\n entities,\n projectName,\n entityType,\n projectInfo,\n userName,\n userFullName,\n }}\n {...annotationsProps}\n {...props}\n >\n <Feed {...props} statuses={props.statuses} />\n <ActivityReferenceTooltip />\n </FeedProvider>\n )\n}\n\nexport default FeedWrapper\n"],"names":["FeedWrapper","scope","entities","entityType","thumbnailHash","projectName","projectInfo","annotations","removeAnnotation","exportAnnotationComposite","props","annotationsProps","user","useDetailsPanelContext","userName","userFullName","jsxs","FeedProvider","jsx","Feed","ActivityReferenceTooltip"],"mappings":"uTA2BMA,EAAoC,CAAC,CACzC,MAAAC,EAAQ,YACR,SAAAC,EACA,WAAAC,EACA,cAAAC,EACA,YAAAC,EACA,YAAAC,EACA,YAAAC,EACA,iBAAAC,EACA,0BAAAC,EACA,GAAGC,CACL,IAAM,CACJ,MAAMC,EAAmB,CAAE,YAAAJ,EAAa,iBAAAC,EAAkB,0BAAAC,CAAA,EAEpD,CAAE,KAAAG,CAAA,EAASC,yBAAA,EAEXC,EAAWF,EAAK,MAAQ,GACxBG,EAAeH,EAAK,QAAQ,UAAY,GAE9C,OACEI,EAAAA,kBAAAA,KAACC,EAAAA,aAAA,CAEG,MAAAhB,EACA,SAAAC,EACA,YAAAG,EACA,WAAAF,EACA,YAAAG,EACA,SAAAQ,EACA,aAAAC,EAED,GAAGJ,EACH,GAAGD,EAEJ,SAAA,CAAAQ,EAAAA,kBAAAA,IAACC,EAAAA,KAAA,CAAM,GAAGT,EAAO,SAAUA,EAAM,SAAU,0BAC1CU,EAAA,CAAA,CAAyB,CAAA,CAAA,CAAA,CAGhC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FeedWrapper.es.js","sources":["../../../../../../src/containers/DetailsPanel/containers/FeedWrapper.tsx"],"sourcesContent":["import { FC } from 'react'\n\nimport { Feed } from '@shared/containers/Feed/Feed'\nimport ActivityReferenceTooltip from '@shared/containers/Feed/components/ActivityReferenceTooltip/ActivityReferenceTooltip'\nimport { FeedProvider } from '@shared/containers/Feed/context/FeedContext'\nimport type { Status, QueryFilter } from '@shared/api'\nimport { useDetailsPanelContext } from '@shared/context/DetailsPanelContext'\
|
|
1
|
+
{"version":3,"file":"FeedWrapper.es.js","sources":["../../../../../../src/containers/DetailsPanel/containers/FeedWrapper.tsx"],"sourcesContent":["import { FC } from 'react'\n\nimport { Feed } from '@shared/containers/Feed/Feed'\nimport ActivityReferenceTooltip from '@shared/containers/Feed/components/ActivityReferenceTooltip/ActivityReferenceTooltip'\nimport { FeedProvider } from '@shared/containers/Feed/context/FeedContext'\nimport type { Status, QueryFilter } from '@shared/api'\nimport { useDetailsPanelContext } from '@shared/context/DetailsPanelContext'\n\ninterface FeedWrapperProps {\n entities: any[]\n activeUsers: any[]\n projectInfo: any\n projectName: string\n entityType: string\n thumbnailHash?: string // thumbnailHash from entity\n disabled: boolean\n readOnly: boolean\n isSlideOut?: boolean\n statuses: Status[]\n scope: string\n entityListId?: string\n annotations?: any\n removeAnnotation?: (id: string) => void\n exportAnnotationComposite?: (id: string) => Promise<Blob | null>\n}\n\n// forwards any props\nconst FeedWrapper: FC<FeedWrapperProps> = ({\n scope = 'dashboard',\n entities,\n entityType,\n thumbnailHash,\n projectName,\n projectInfo,\n annotations,\n removeAnnotation,\n exportAnnotationComposite,\n ...props\n}) => {\n const annotationsProps = { annotations, removeAnnotation, exportAnnotationComposite }\n\n const { user } = useDetailsPanelContext()\n\n const userName = user.name || ''\n const userFullName = user.attrib?.fullName || ''\n\n return (\n <FeedProvider\n {...{\n scope,\n entities,\n projectName,\n entityType,\n projectInfo,\n userName,\n userFullName,\n }}\n {...annotationsProps}\n {...props}\n >\n <Feed {...props} statuses={props.statuses} />\n <ActivityReferenceTooltip />\n </FeedProvider>\n )\n}\n\nexport default FeedWrapper\n"],"names":["FeedWrapper","scope","entities","entityType","thumbnailHash","projectName","projectInfo","annotations","removeAnnotation","exportAnnotationComposite","props","annotationsProps","user","useDetailsPanelContext","userName","userFullName","jsxs","FeedProvider","jsx","Feed","ActivityReferenceTooltip"],"mappings":";;;;;AA2BA,MAAMA,IAAoC,CAAC;AAAA,EACzC,OAAAC,IAAQ;AAAA,EACR,UAAAC;AAAA,EACA,YAAAC;AAAA,EACA,eAAAC;AAAA,EACA,aAAAC;AAAA,EACA,aAAAC;AAAA,EACA,aAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,2BAAAC;AAAA,EACA,GAAGC;AACL,MAAM;AACJ,QAAMC,IAAmB,EAAE,aAAAJ,GAAa,kBAAAC,GAAkB,2BAAAC,EAAA,GAEpD,EAAE,MAAAG,EAAA,IAASC,EAAA,GAEXC,IAAWF,EAAK,QAAQ,IACxBG,IAAeH,EAAK,QAAQ,YAAY;AAE9C,SACEI,gBAAAA,EAAAA;AAAAA,IAACC;AAAA,IAAA;AAAA,MAEG,OAAAhB;AAAA,MACA,UAAAC;AAAA,MACA,aAAAG;AAAA,MACA,YAAAF;AAAA,MACA,aAAAG;AAAA,MACA,UAAAQ;AAAA,MACA,cAAAC;AAAA,MAED,GAAGJ;AAAA,MACH,GAAGD;AAAA,MAEJ,UAAA;AAAA,QAAAQ,gBAAAA,EAAAA,IAACC,GAAA,EAAM,GAAGT,GAAO,UAAUA,EAAM,UAAU;AAAA,8BAC1CU,GAAA,CAAA,CAAyB;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGhC;"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require("../../../api/base/client.cjs.js");require("../../../api/generated/graphql.cjs.js");require("../../../api/generated/graphqlLinks.cjs.js");require("../../../api/generated/access.cjs.js");require("../../../api/generated/actions.cjs.js");require("../../../api/generated/activityFeed.cjs.js");require("../../../api/generated/addons.cjs.js");require("../../../api/generated/anatomy.cjs.js");require("../../../api/generated/attributes.cjs.js");require("../../../api/generated/authentication.cjs.js");require("../../../api/generated/bundles.cjs.js");require("../../../api/generated/configuration.cjs.js");require("../../../api/generated/dataImport.cjs.js");require("../../../api/generated/desktop.cjs.js");require("../../../api/generated/entityLists.cjs.js");require("../../../api/generated/events.cjs.js");require("../../../api/generated/files.cjs.js");require("../../../api/generated/folders.cjs.js");require("../../../api/generated/inbox.cjs.js");require("../../../api/generated/links.cjs.js");require("../../../api/generated/market.cjs.js");require("../../../api/generated/onboarding.cjs.js");require("../../../api/generated/operations.cjs.js");require("../../../api/generated/products.cjs.js");require("../../../api/generated/projectDashboard.cjs.js");require("../../../api/generated/projects.cjs.js");require("../../../api/generated/projectFolders.cjs.js");require("../../../api/generated/reviewables.cjs.js");require("../../../api/generated/services.cjs.js");require("../../../api/generated/system.cjs.js");require("../../../api/generated/tasks.cjs.js");require("../../../api/generated/teams.cjs.js");require("../../../api/generated/thumbnails.cjs.js");require("../../../api/generated/uRIs.cjs.js");require("../../../api/generated/users.cjs.js");require("../../../api/generated/versions.cjs.js");require("../../../api/generated/workfiles.cjs.js");require("../../../api/generated/ynputCloud.cjs.js");require("../../../api/generated/grouping.cjs.js");require("../../../api/generated/views.cjs.js");require("../../../api/queries/actions/getActions.cjs.js");require("../../../api/queries/activities/getActivities.cjs.js");require("../../../api/queries/activities/updateReaction.cjs.js");require("../../../api/queries/activities/getMentions.cjs.js");require("../../../api/queries/activities/getCategories.cjs.js");const s=require("../../../api/queries/activities/util/activitiesHelpers.cjs.js");require("../../../api/queries/addons/getAddons.cjs.js");require("../../../api/queries/addons/updateAddons.cjs.js");require("../../../api/queries/attributes/getAttributes.cjs.js");require("../../../api/queries/attributes/updateAttributes.cjs.js");require("../../../api/queries/authentication/getAuthentication.cjs.js");require("../../../api/queries/bundles/getBundles.cjs.js");require("../../../api/queries/bundles/updateBundles.cjs.js");require("../../../api/queries/cloud/cloud.cjs.js");require("../../../api/queries/columnStats/metricTargets.cjs.js");require("../../../api/queries/columnStats/groupCounts.cjs.js");require("../../../api/queries/config/getConfig.cjs.js");require("../../../api/queries/config/updateConfig.cjs.js");require("../../../api/queries/entities/getEntity.cjs.js");require("../../../api/queries/entities/getEntityPanel.cjs.js");require("../../../api/queries/overview/getOverview.cjs.js");require("../../../api/queries/overview/updateOverview.cjs.js");require("../../../api/queries/versions/getVersionsProducts.cjs.js");require("../../../api/queries/links/getEntityLinks.cjs.js");require("../../../api/queries/entities/updateEntity.cjs.js");require("../../../api/queries/entityLists/getLists.cjs.js");require("../../../api/queries/entityLists/updateLists.cjs.js");require("../../../api/queries/entityLists/getListsAttributes.cjs.js");require("../../../api/queries/entityLists/listItemsColumnStats.cjs.js");require("../../../api/queries/entityLists/updateListsAttributes.cjs.js");require("../../../api/queries/entityLists/listFolders.cjs.js");require("../../../api/queries/folders/getFolders.cjs.js");require("../../../api/queries/folders/getFolderDeleteInfo.cjs.js");require("../../../api/queries/grouping/getGrouping.cjs.js");require("../../../api/queries/links/updateLinks.cjs.js");require("../../../api/queries/links/getLinks.cjs.js");require("../../../api/queries/permissions/getPermissions.cjs.js");require("../../../api/queries/products/createProduct.cjs.js");require("../../../api/queries/products/getFolderProducts.cjs.js");require("../../../api/queries/project/getProject.cjs.js");require("../../../api/queries/project/updateProject.cjs.js");require("../../../api/queries/projectFolders/projectFolders.cjs.js");require("../../../api/queries/review/getReview.cjs.js");require("../../../api/queries/review/updateReview.cjs.js");require("../../../api/queries/share/share.cjs.js");require("../../../api/queries/system/getSystem.cjs.js");require("../../../api/queries/tasks/getTasks.cjs.js");require("../../../api/queries/tasks/updateTasks.cjs.js");require("../../../api/queries/teams/getTeams.cjs.js");require("../../../api/queries/userDashboard/getUserDashboard.cjs.js");require("../../../api/queries/users/getUsers.cjs.js");require("../../../api/queries/users/updateUsers.cjs.js");require("../../../api/queries/users/guests.cjs.js");require("../../../api/queries/versions/updateVersions.cjs.js");require("../../../api/queries/views/getViews.cjs.js");require("../../../api/queries/views/updateViews.cjs.js");require("../../../api/queries/watchers/getWatchers.cjs.js");require("../../../api/queries/uris/getUris.cjs.js");const
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require("../../../api/base/client.cjs.js");require("../../../api/generated/graphql.cjs.js");require("../../../api/generated/graphqlLinks.cjs.js");require("../../../api/generated/access.cjs.js");require("../../../api/generated/actions.cjs.js");require("../../../api/generated/activityFeed.cjs.js");require("../../../api/generated/addons.cjs.js");require("../../../api/generated/anatomy.cjs.js");require("../../../api/generated/attributes.cjs.js");require("../../../api/generated/authentication.cjs.js");require("../../../api/generated/bundles.cjs.js");require("../../../api/generated/configuration.cjs.js");require("../../../api/generated/dataImport.cjs.js");require("../../../api/generated/desktop.cjs.js");require("../../../api/generated/entityLists.cjs.js");require("../../../api/generated/events.cjs.js");require("../../../api/generated/files.cjs.js");require("../../../api/generated/folders.cjs.js");require("../../../api/generated/inbox.cjs.js");require("../../../api/generated/links.cjs.js");require("../../../api/generated/market.cjs.js");require("../../../api/generated/onboarding.cjs.js");require("../../../api/generated/operations.cjs.js");require("../../../api/generated/products.cjs.js");require("../../../api/generated/projectDashboard.cjs.js");require("../../../api/generated/projects.cjs.js");require("../../../api/generated/projectFolders.cjs.js");require("../../../api/generated/reviewables.cjs.js");require("../../../api/generated/services.cjs.js");require("../../../api/generated/system.cjs.js");require("../../../api/generated/tasks.cjs.js");require("../../../api/generated/teams.cjs.js");require("../../../api/generated/thumbnails.cjs.js");require("../../../api/generated/uRIs.cjs.js");require("../../../api/generated/users.cjs.js");require("../../../api/generated/versions.cjs.js");require("../../../api/generated/workfiles.cjs.js");require("../../../api/generated/ynputCloud.cjs.js");require("../../../api/generated/grouping.cjs.js");require("../../../api/generated/views.cjs.js");require("../../../api/queries/actions/getActions.cjs.js");require("../../../api/queries/activities/getActivities.cjs.js");require("../../../api/queries/activities/updateReaction.cjs.js");require("../../../api/queries/activities/getMentions.cjs.js");require("../../../api/queries/activities/getCategories.cjs.js");const s=require("../../../api/queries/activities/util/activitiesHelpers.cjs.js");require("../../../api/queries/addons/getAddons.cjs.js");require("../../../api/queries/addons/updateAddons.cjs.js");require("../../../api/queries/attributes/getAttributes.cjs.js");require("../../../api/queries/attributes/updateAttributes.cjs.js");require("../../../api/queries/authentication/getAuthentication.cjs.js");require("../../../api/queries/bundles/getBundles.cjs.js");require("../../../api/queries/bundles/updateBundles.cjs.js");require("../../../api/queries/cloud/cloud.cjs.js");require("../../../api/queries/columnStats/metricTargets.cjs.js");require("../../../api/queries/columnStats/groupCounts.cjs.js");require("../../../api/queries/config/getConfig.cjs.js");require("../../../api/queries/config/updateConfig.cjs.js");require("../../../api/queries/entities/getEntity.cjs.js");require("../../../api/queries/entities/getEntityPanel.cjs.js");require("../../../api/queries/overview/getOverview.cjs.js");require("../../../api/queries/overview/updateOverview.cjs.js");require("../../../api/queries/versions/getVersionsProducts.cjs.js");require("../../../api/queries/links/getEntityLinks.cjs.js");require("../../../api/queries/entities/updateEntity.cjs.js");require("../../../api/queries/entityLists/getLists.cjs.js");require("../../../api/queries/entityLists/updateLists.cjs.js");require("../../../api/queries/entityLists/getListsAttributes.cjs.js");require("../../../api/queries/entityLists/listItemsColumnStats.cjs.js");require("../../../api/queries/entityLists/updateListsAttributes.cjs.js");require("../../../api/queries/entityLists/listFolders.cjs.js");require("../../../api/queries/folders/getFolders.cjs.js");require("../../../api/queries/folders/getFolderDeleteInfo.cjs.js");require("../../../api/queries/grouping/getGrouping.cjs.js");require("../../../api/queries/links/updateLinks.cjs.js");require("../../../api/queries/links/getLinks.cjs.js");require("../../../api/queries/permissions/getPermissions.cjs.js");require("../../../api/queries/products/createProduct.cjs.js");require("../../../api/queries/products/getFolderProducts.cjs.js");require("../../../api/queries/project/getProject.cjs.js");require("../../../api/queries/project/updateProject.cjs.js");require("../../../api/queries/projectFolders/projectFolders.cjs.js");require("../../../api/queries/review/getReview.cjs.js");require("../../../api/queries/review/updateReview.cjs.js");require("../../../api/queries/share/share.cjs.js");require("../../../api/queries/system/getSystem.cjs.js");require("../../../api/queries/tasks/getTasks.cjs.js");require("../../../api/queries/tasks/updateTasks.cjs.js");require("../../../api/queries/teams/getTeams.cjs.js");require("../../../api/queries/userDashboard/getUserDashboard.cjs.js");require("../../../api/queries/users/getUsers.cjs.js");require("../../../api/queries/users/updateUsers.cjs.js");require("../../../api/queries/users/guests.cjs.js");require("../../../api/queries/versions/updateVersions.cjs.js");require("../../../api/queries/views/getViews.cjs.js");require("../../../api/queries/views/updateViews.cjs.js");require("../../../api/queries/watchers/getWatchers.cjs.js");require("../../../api/queries/uris/getUris.cjs.js");const y=require("../../ProjectTreeTable/utils/expandRelativeDates.cjs.js"),d=new Set(Object.keys(s.filterActivityTypes).filter(e=>e!=="activity")),c={has_attachments:"activity_data.files",origin_type:"activity_data.origin.type"},v=e=>!!e&&"key"in e,_=e=>{const r=c[e.key]??e.key;if(e.key==="has_attachments")return e.value?{key:r,operator:"ne",value:[]}:null;if(e.key==="in_review_session")return e.value?{key:"activity_data.entityList",operator:"notnull"}:null;if(e.key==="category"){const i=Array.isArray(e.value)?e.value:[],t=i.includes("__none__"),u=i.filter(l=>l!=="__none__"),n={operator:"or",conditions:[{key:"activity_data.category",operator:"isnull"},{key:"activity_data.category",operator:"eq",value:""}]},q={key:"activity_data.category",operator:"in",value:u};return t&&u.length?{operator:"or",conditions:[n,q]}:t?n:u.length?q:null}return e.key==="body"&&e.operator==="like"&&typeof e.value=="string"?{...e,key:r,value:`%${e.value}%`}:e.key==="author"?{operator:"or",conditions:[{...e,key:"activity_data.author"},{...e,key:"activity_data.assignee"}]}:{...e,key:r}},a=e=>{if(v(e))return d.has(e.key)?null:_(e);const r=(e.conditions||[]).map(i=>a(i)).filter(i=>i!==null);return r.length===0?null:{operator:e.operator||"and",conditions:r}},o=e=>{if(!e||!e.conditions?.length)return null;const r=y.expandRelativeDates(e),i=a(r);return i||null},k=e=>{const r=o(e);if(r)return JSON.stringify(r)};exports.buildBackendFilter=k;exports.buildBackendFilterObject=o;
|
|
2
2
|
//# sourceMappingURL=buildBackendFilter.cjs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buildBackendFilter.cjs.js","sources":["../../../../../../src/containers/Feed/helpers/buildBackendFilter.ts"],"sourcesContent":["import type { QueryCondition, QueryFilter } from '@shared/api'\nimport { filterActivityTypes } from '@shared/api'\nimport { expandRelativeDates } from '@shared/containers/ProjectTreeTable/utils/expandRelativeDates'\n\n// UI chip keys handled by getFilterActivityTypes → activityTypes arg.\n// Must not leak into the QueryFilter (not in backend whitelist).\nconst UI_ONLY_KEYS = new Set(Object.keys(filterActivityTypes).filter((k) => k !== 'activity'))\n\nconst UI_KEY_TO_BACKEND_KEY: Record<string, string> = {\n has_attachments: 'activity_data.files',\n}\n\nconst isCondition = (c: QueryCondition | QueryFilter): c is QueryCondition => {\n return !!c && 'key' in c\n}\n\nconst translateCondition = (c: QueryCondition): QueryCondition | QueryFilter | null => {\n const mappedKey = UI_KEY_TO_BACKEND_KEY[c.key] ?? c.key\n\n if (c.key === 'has_attachments') {\n return c.value ? { key: mappedKey, operator: 'ne', value: [] } : null\n }\n\n if (c.key === 'in_review_session') {\n return c.value ? { key: 'activity_data.entityList', operator: 'notnull' } : null\n }\n\n if (c.key === 'category') {\n const values = Array.isArray(c.value) ? (c.value as string[]) : []\n const hasNone = values.includes('__none__')\n const named = values.filter((v) => v !== '__none__')\n const nullCond: QueryFilter = {\n operator: 'or',\n conditions: [\n { key: 'activity_data.category', operator: 'isnull' },\n { key: 'activity_data.category', operator: 'eq', value: '' },\n ],\n }\n const namedCond: QueryCondition = {\n key: 'activity_data.category',\n operator: 'in',\n value: named,\n }\n if (hasNone && named.length) return { operator: 'or', conditions: [nullCond, namedCond] }\n if (hasNone) return nullCond\n if (named.length) return namedCond\n return null\n }\n\n if (c.key === 'body' && c.operator === 'like' && typeof c.value === 'string') {\n return { ...c, key: mappedKey, value: `%${c.value}%` }\n }\n\n // \"Author\" UI filter matches actor OR assignee, so picking a user surfaces\n // both their comments/versions AND assignment events involving them.\n if (c.key === 'author') {\n return {\n operator: 'or',\n conditions: [\n { ...c, key: 'activity_data.author' },\n { ...c, key: 'activity_data.assignee' },\n ],\n }\n }\n\n return { ...c, key: mappedKey }\n}\n\nconst translate = (node: QueryCondition | QueryFilter): QueryCondition | QueryFilter | null => {\n if (isCondition(node)) {\n if (UI_ONLY_KEYS.has(node.key)) return null\n return translateCondition(node)\n }\n\n const translated = (node.conditions || [])\n .map((c) => translate(c))\n .filter((c): c is QueryCondition | QueryFilter => c !== null)\n\n if (translated.length === 0) return null\n\n return { operator: node.operator || 'and', conditions: translated }\n}\n\nexport const
|
|
1
|
+
{"version":3,"file":"buildBackendFilter.cjs.js","sources":["../../../../../../src/containers/Feed/helpers/buildBackendFilter.ts"],"sourcesContent":["import type { QueryCondition, QueryFilter } from '@shared/api'\nimport { filterActivityTypes } from '@shared/api'\nimport { expandRelativeDates } from '@shared/containers/ProjectTreeTable/utils/expandRelativeDates'\n\n// UI chip keys handled by getFilterActivityTypes → activityTypes arg.\n// Must not leak into the QueryFilter (not in backend whitelist).\nconst UI_ONLY_KEYS = new Set(Object.keys(filterActivityTypes).filter((k) => k !== 'activity'))\n\nconst UI_KEY_TO_BACKEND_KEY: Record<string, string> = {\n has_attachments: 'activity_data.files',\n // not `entity_type`: on inbox rows that column is always 'user'\n origin_type: 'activity_data.origin.type',\n}\n\nconst isCondition = (c: QueryCondition | QueryFilter): c is QueryCondition => {\n return !!c && 'key' in c\n}\n\nconst translateCondition = (c: QueryCondition): QueryCondition | QueryFilter | null => {\n const mappedKey = UI_KEY_TO_BACKEND_KEY[c.key] ?? c.key\n\n if (c.key === 'has_attachments') {\n return c.value ? { key: mappedKey, operator: 'ne', value: [] } : null\n }\n\n if (c.key === 'in_review_session') {\n return c.value ? { key: 'activity_data.entityList', operator: 'notnull' } : null\n }\n\n if (c.key === 'category') {\n const values = Array.isArray(c.value) ? (c.value as string[]) : []\n const hasNone = values.includes('__none__')\n const named = values.filter((v) => v !== '__none__')\n const nullCond: QueryFilter = {\n operator: 'or',\n conditions: [\n { key: 'activity_data.category', operator: 'isnull' },\n { key: 'activity_data.category', operator: 'eq', value: '' },\n ],\n }\n const namedCond: QueryCondition = {\n key: 'activity_data.category',\n operator: 'in',\n value: named,\n }\n if (hasNone && named.length) return { operator: 'or', conditions: [nullCond, namedCond] }\n if (hasNone) return nullCond\n if (named.length) return namedCond\n return null\n }\n\n if (c.key === 'body' && c.operator === 'like' && typeof c.value === 'string') {\n return { ...c, key: mappedKey, value: `%${c.value}%` }\n }\n\n // \"Author\" UI filter matches actor OR assignee, so picking a user surfaces\n // both their comments/versions AND assignment events involving them.\n if (c.key === 'author') {\n return {\n operator: 'or',\n conditions: [\n { ...c, key: 'activity_data.author' },\n { ...c, key: 'activity_data.assignee' },\n ],\n }\n }\n\n return { ...c, key: mappedKey }\n}\n\nconst translate = (node: QueryCondition | QueryFilter): QueryCondition | QueryFilter | null => {\n if (isCondition(node)) {\n if (UI_ONLY_KEYS.has(node.key)) return null\n return translateCondition(node)\n }\n\n const translated = (node.conditions || [])\n .map((c) => translate(c))\n .filter((c): c is QueryCondition | QueryFilter => c !== null)\n\n if (translated.length === 0) return null\n\n return { operator: node.operator || 'and', conditions: translated }\n}\n\nexport const buildBackendFilterObject = (filter: QueryFilter | undefined): QueryFilter | null => {\n if (!filter || !filter.conditions?.length) return null\n\n const expanded = expandRelativeDates(filter as any) as QueryFilter\n const translated = translate(expanded)\n if (!translated) return null\n\n return translated as QueryFilter\n}\n\nexport const buildBackendFilter = (filter: QueryFilter | undefined): string | undefined => {\n const translated = buildBackendFilterObject(filter)\n if (!translated) return undefined\n\n return JSON.stringify(translated)\n}\n\nexport default buildBackendFilter\n"],"names":["UI_ONLY_KEYS","filterActivityTypes","k","UI_KEY_TO_BACKEND_KEY","isCondition","c","translateCondition","mappedKey","values","hasNone","named","v","nullCond","namedCond","translate","node","translated","buildBackendFilterObject","filter","expanded","expandRelativeDates","buildBackendFilter"],"mappings":"skLAMMA,EAAe,IAAI,IAAI,OAAO,KAAKC,EAAAA,mBAAmB,EAAE,OAAQC,GAAMA,IAAM,UAAU,CAAC,EAEvFC,EAAgD,CACpD,gBAAiB,sBAEjB,YAAa,2BACf,EAEMC,EAAeC,GACZ,CAAC,CAACA,GAAK,QAASA,EAGnBC,EAAsBD,GAA2D,CACrF,MAAME,EAAYJ,EAAsBE,EAAE,GAAG,GAAKA,EAAE,IAEpD,GAAIA,EAAE,MAAQ,kBACZ,OAAOA,EAAE,MAAQ,CAAE,IAAKE,EAAW,SAAU,KAAM,MAAO,CAAA,CAAC,EAAM,KAGnE,GAAIF,EAAE,MAAQ,oBACZ,OAAOA,EAAE,MAAQ,CAAE,IAAK,2BAA4B,SAAU,WAAc,KAG9E,GAAIA,EAAE,MAAQ,WAAY,CACxB,MAAMG,EAAS,MAAM,QAAQH,EAAE,KAAK,EAAKA,EAAE,MAAqB,CAAA,EAC1DI,EAAUD,EAAO,SAAS,UAAU,EACpCE,EAAQF,EAAO,OAAQG,GAAMA,IAAM,UAAU,EAC7CC,EAAwB,CAC5B,SAAU,KACV,WAAY,CACV,CAAE,IAAK,yBAA0B,SAAU,QAAA,EAC3C,CAAE,IAAK,yBAA0B,SAAU,KAAM,MAAO,EAAA,CAAG,CAC7D,EAEIC,EAA4B,CAChC,IAAK,yBACL,SAAU,KACV,MAAOH,CAAA,EAET,OAAID,GAAWC,EAAM,OAAe,CAAE,SAAU,KAAM,WAAY,CAACE,EAAUC,CAAS,CAAA,EAClFJ,EAAgBG,EAChBF,EAAM,OAAeG,EAClB,IACT,CAEA,OAAIR,EAAE,MAAQ,QAAUA,EAAE,WAAa,QAAU,OAAOA,EAAE,OAAU,SAC3D,CAAE,GAAGA,EAAG,IAAKE,EAAW,MAAO,IAAIF,EAAE,KAAK,GAAA,EAK/CA,EAAE,MAAQ,SACL,CACL,SAAU,KACV,WAAY,CACV,CAAE,GAAGA,EAAG,IAAK,sBAAA,EACb,CAAE,GAAGA,EAAG,IAAK,wBAAA,CAAyB,CACxC,EAIG,CAAE,GAAGA,EAAG,IAAKE,CAAA,CACtB,EAEMO,EAAaC,GAA4E,CAC7F,GAAIX,EAAYW,CAAI,EAClB,OAAIf,EAAa,IAAIe,EAAK,GAAG,EAAU,KAChCT,EAAmBS,CAAI,EAGhC,MAAMC,GAAcD,EAAK,YAAc,CAAA,GACpC,IAAKV,GAAMS,EAAUT,CAAC,CAAC,EACvB,OAAQA,GAAyCA,IAAM,IAAI,EAE9D,OAAIW,EAAW,SAAW,EAAU,KAE7B,CAAE,SAAUD,EAAK,UAAY,MAAO,WAAYC,CAAA,CACzD,EAEaC,EAA4BC,GAAwD,CAC/F,GAAI,CAACA,GAAU,CAACA,EAAO,YAAY,OAAQ,OAAO,KAElD,MAAMC,EAAWC,EAAAA,oBAAoBF,CAAa,EAC5CF,EAAaF,EAAUK,CAAQ,EACrC,OAAKH,GAAmB,IAG1B,EAEaK,EAAsBH,GAAwD,CACzF,MAAMF,EAAaC,EAAyBC,CAAM,EAClD,GAAKF,EAEL,OAAO,KAAK,UAAUA,CAAU,CAClC"}
|
|
@@ -43,7 +43,7 @@ import "../../../api/queries/activities/getActivities.es.js";
|
|
|
43
43
|
import "../../../api/queries/activities/updateReaction.es.js";
|
|
44
44
|
import "../../../api/queries/activities/getMentions.es.js";
|
|
45
45
|
import "../../../api/queries/activities/getCategories.es.js";
|
|
46
|
-
import { filterActivityTypes as
|
|
46
|
+
import { filterActivityTypes as l } from "../../../api/queries/activities/util/activitiesHelpers.es.js";
|
|
47
47
|
import "../../../api/queries/addons/getAddons.es.js";
|
|
48
48
|
import "../../../api/queries/addons/updateAddons.es.js";
|
|
49
49
|
import "../../../api/queries/attributes/getAttributes.es.js";
|
|
@@ -96,48 +96,54 @@ import "../../../api/queries/views/getViews.es.js";
|
|
|
96
96
|
import "../../../api/queries/views/updateViews.es.js";
|
|
97
97
|
import "../../../api/queries/watchers/getWatchers.es.js";
|
|
98
98
|
import "../../../api/queries/uris/getUris.es.js";
|
|
99
|
-
import { expandRelativeDates as
|
|
100
|
-
const u = new Set(Object.keys(
|
|
101
|
-
has_attachments: "activity_data.files"
|
|
99
|
+
import { expandRelativeDates as s } from "../../ProjectTreeTable/utils/expandRelativeDates.es.js";
|
|
100
|
+
const u = new Set(Object.keys(l).filter((t) => t !== "activity")), y = {
|
|
101
|
+
has_attachments: "activity_data.files",
|
|
102
|
+
// not `entity_type`: on inbox rows that column is always 'user'
|
|
103
|
+
origin_type: "activity_data.origin.type"
|
|
102
104
|
}, d = (t) => !!t && "key" in t, _ = (t) => {
|
|
103
|
-
const
|
|
105
|
+
const r = y[t.key] ?? t.key;
|
|
104
106
|
if (t.key === "has_attachments")
|
|
105
|
-
return t.value ? { key:
|
|
107
|
+
return t.value ? { key: r, operator: "ne", value: [] } : null;
|
|
106
108
|
if (t.key === "in_review_session")
|
|
107
109
|
return t.value ? { key: "activity_data.entityList", operator: "notnull" } : null;
|
|
108
110
|
if (t.key === "category") {
|
|
109
|
-
const
|
|
111
|
+
const i = Array.isArray(t.value) ? t.value : [], p = i.includes("__none__"), o = i.filter((a) => a !== "__none__"), e = {
|
|
110
112
|
operator: "or",
|
|
111
113
|
conditions: [
|
|
112
114
|
{ key: "activity_data.category", operator: "isnull" },
|
|
113
115
|
{ key: "activity_data.category", operator: "eq", value: "" }
|
|
114
116
|
]
|
|
115
|
-
},
|
|
117
|
+
}, m = {
|
|
116
118
|
key: "activity_data.category",
|
|
117
119
|
operator: "in",
|
|
118
|
-
value:
|
|
120
|
+
value: o
|
|
119
121
|
};
|
|
120
|
-
return p &&
|
|
122
|
+
return p && o.length ? { operator: "or", conditions: [e, m] } : p ? e : o.length ? m : null;
|
|
121
123
|
}
|
|
122
|
-
return t.key === "body" && t.operator === "like" && typeof t.value == "string" ? { ...t, key:
|
|
124
|
+
return t.key === "body" && t.operator === "like" && typeof t.value == "string" ? { ...t, key: r, value: `%${t.value}%` } : t.key === "author" ? {
|
|
123
125
|
operator: "or",
|
|
124
126
|
conditions: [
|
|
125
127
|
{ ...t, key: "activity_data.author" },
|
|
126
128
|
{ ...t, key: "activity_data.assignee" }
|
|
127
129
|
]
|
|
128
|
-
} : { ...t, key:
|
|
130
|
+
} : { ...t, key: r };
|
|
129
131
|
}, n = (t) => {
|
|
130
132
|
if (d(t))
|
|
131
133
|
return u.has(t.key) ? null : _(t);
|
|
132
|
-
const
|
|
133
|
-
return
|
|
134
|
-
},
|
|
135
|
-
if (!t || !t.conditions?.length) return;
|
|
136
|
-
const
|
|
134
|
+
const r = (t.conditions || []).map((i) => n(i)).filter((i) => i !== null);
|
|
135
|
+
return r.length === 0 ? null : { operator: t.operator || "and", conditions: r };
|
|
136
|
+
}, c = (t) => {
|
|
137
|
+
if (!t || !t.conditions?.length) return null;
|
|
138
|
+
const r = s(t), i = n(r);
|
|
139
|
+
return i || null;
|
|
140
|
+
}, nr = (t) => {
|
|
141
|
+
const r = c(t);
|
|
137
142
|
if (r)
|
|
138
143
|
return JSON.stringify(r);
|
|
139
144
|
};
|
|
140
145
|
export {
|
|
141
|
-
|
|
146
|
+
nr as buildBackendFilter,
|
|
147
|
+
c as buildBackendFilterObject
|
|
142
148
|
};
|
|
143
149
|
//# sourceMappingURL=buildBackendFilter.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buildBackendFilter.es.js","sources":["../../../../../../src/containers/Feed/helpers/buildBackendFilter.ts"],"sourcesContent":["import type { QueryCondition, QueryFilter } from '@shared/api'\nimport { filterActivityTypes } from '@shared/api'\nimport { expandRelativeDates } from '@shared/containers/ProjectTreeTable/utils/expandRelativeDates'\n\n// UI chip keys handled by getFilterActivityTypes → activityTypes arg.\n// Must not leak into the QueryFilter (not in backend whitelist).\nconst UI_ONLY_KEYS = new Set(Object.keys(filterActivityTypes).filter((k) => k !== 'activity'))\n\nconst UI_KEY_TO_BACKEND_KEY: Record<string, string> = {\n has_attachments: 'activity_data.files',\n}\n\nconst isCondition = (c: QueryCondition | QueryFilter): c is QueryCondition => {\n return !!c && 'key' in c\n}\n\nconst translateCondition = (c: QueryCondition): QueryCondition | QueryFilter | null => {\n const mappedKey = UI_KEY_TO_BACKEND_KEY[c.key] ?? c.key\n\n if (c.key === 'has_attachments') {\n return c.value ? { key: mappedKey, operator: 'ne', value: [] } : null\n }\n\n if (c.key === 'in_review_session') {\n return c.value ? { key: 'activity_data.entityList', operator: 'notnull' } : null\n }\n\n if (c.key === 'category') {\n const values = Array.isArray(c.value) ? (c.value as string[]) : []\n const hasNone = values.includes('__none__')\n const named = values.filter((v) => v !== '__none__')\n const nullCond: QueryFilter = {\n operator: 'or',\n conditions: [\n { key: 'activity_data.category', operator: 'isnull' },\n { key: 'activity_data.category', operator: 'eq', value: '' },\n ],\n }\n const namedCond: QueryCondition = {\n key: 'activity_data.category',\n operator: 'in',\n value: named,\n }\n if (hasNone && named.length) return { operator: 'or', conditions: [nullCond, namedCond] }\n if (hasNone) return nullCond\n if (named.length) return namedCond\n return null\n }\n\n if (c.key === 'body' && c.operator === 'like' && typeof c.value === 'string') {\n return { ...c, key: mappedKey, value: `%${c.value}%` }\n }\n\n // \"Author\" UI filter matches actor OR assignee, so picking a user surfaces\n // both their comments/versions AND assignment events involving them.\n if (c.key === 'author') {\n return {\n operator: 'or',\n conditions: [\n { ...c, key: 'activity_data.author' },\n { ...c, key: 'activity_data.assignee' },\n ],\n }\n }\n\n return { ...c, key: mappedKey }\n}\n\nconst translate = (node: QueryCondition | QueryFilter): QueryCondition | QueryFilter | null => {\n if (isCondition(node)) {\n if (UI_ONLY_KEYS.has(node.key)) return null\n return translateCondition(node)\n }\n\n const translated = (node.conditions || [])\n .map((c) => translate(c))\n .filter((c): c is QueryCondition | QueryFilter => c !== null)\n\n if (translated.length === 0) return null\n\n return { operator: node.operator || 'and', conditions: translated }\n}\n\nexport const
|
|
1
|
+
{"version":3,"file":"buildBackendFilter.es.js","sources":["../../../../../../src/containers/Feed/helpers/buildBackendFilter.ts"],"sourcesContent":["import type { QueryCondition, QueryFilter } from '@shared/api'\nimport { filterActivityTypes } from '@shared/api'\nimport { expandRelativeDates } from '@shared/containers/ProjectTreeTable/utils/expandRelativeDates'\n\n// UI chip keys handled by getFilterActivityTypes → activityTypes arg.\n// Must not leak into the QueryFilter (not in backend whitelist).\nconst UI_ONLY_KEYS = new Set(Object.keys(filterActivityTypes).filter((k) => k !== 'activity'))\n\nconst UI_KEY_TO_BACKEND_KEY: Record<string, string> = {\n has_attachments: 'activity_data.files',\n // not `entity_type`: on inbox rows that column is always 'user'\n origin_type: 'activity_data.origin.type',\n}\n\nconst isCondition = (c: QueryCondition | QueryFilter): c is QueryCondition => {\n return !!c && 'key' in c\n}\n\nconst translateCondition = (c: QueryCondition): QueryCondition | QueryFilter | null => {\n const mappedKey = UI_KEY_TO_BACKEND_KEY[c.key] ?? c.key\n\n if (c.key === 'has_attachments') {\n return c.value ? { key: mappedKey, operator: 'ne', value: [] } : null\n }\n\n if (c.key === 'in_review_session') {\n return c.value ? { key: 'activity_data.entityList', operator: 'notnull' } : null\n }\n\n if (c.key === 'category') {\n const values = Array.isArray(c.value) ? (c.value as string[]) : []\n const hasNone = values.includes('__none__')\n const named = values.filter((v) => v !== '__none__')\n const nullCond: QueryFilter = {\n operator: 'or',\n conditions: [\n { key: 'activity_data.category', operator: 'isnull' },\n { key: 'activity_data.category', operator: 'eq', value: '' },\n ],\n }\n const namedCond: QueryCondition = {\n key: 'activity_data.category',\n operator: 'in',\n value: named,\n }\n if (hasNone && named.length) return { operator: 'or', conditions: [nullCond, namedCond] }\n if (hasNone) return nullCond\n if (named.length) return namedCond\n return null\n }\n\n if (c.key === 'body' && c.operator === 'like' && typeof c.value === 'string') {\n return { ...c, key: mappedKey, value: `%${c.value}%` }\n }\n\n // \"Author\" UI filter matches actor OR assignee, so picking a user surfaces\n // both their comments/versions AND assignment events involving them.\n if (c.key === 'author') {\n return {\n operator: 'or',\n conditions: [\n { ...c, key: 'activity_data.author' },\n { ...c, key: 'activity_data.assignee' },\n ],\n }\n }\n\n return { ...c, key: mappedKey }\n}\n\nconst translate = (node: QueryCondition | QueryFilter): QueryCondition | QueryFilter | null => {\n if (isCondition(node)) {\n if (UI_ONLY_KEYS.has(node.key)) return null\n return translateCondition(node)\n }\n\n const translated = (node.conditions || [])\n .map((c) => translate(c))\n .filter((c): c is QueryCondition | QueryFilter => c !== null)\n\n if (translated.length === 0) return null\n\n return { operator: node.operator || 'and', conditions: translated }\n}\n\nexport const buildBackendFilterObject = (filter: QueryFilter | undefined): QueryFilter | null => {\n if (!filter || !filter.conditions?.length) return null\n\n const expanded = expandRelativeDates(filter as any) as QueryFilter\n const translated = translate(expanded)\n if (!translated) return null\n\n return translated as QueryFilter\n}\n\nexport const buildBackendFilter = (filter: QueryFilter | undefined): string | undefined => {\n const translated = buildBackendFilterObject(filter)\n if (!translated) return undefined\n\n return JSON.stringify(translated)\n}\n\nexport default buildBackendFilter\n"],"names":["UI_ONLY_KEYS","filterActivityTypes","k","UI_KEY_TO_BACKEND_KEY","isCondition","c","translateCondition","mappedKey","values","hasNone","named","v","nullCond","namedCond","translate","node","translated","buildBackendFilterObject","filter","expanded","expandRelativeDates","buildBackendFilter"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,MAAMA,IAAe,IAAI,IAAI,OAAO,KAAKC,CAAmB,EAAE,OAAO,CAACC,MAAMA,MAAM,UAAU,CAAC,GAEvFC,IAAgD;AAAA,EACpD,iBAAiB;AAAA;AAAA,EAEjB,aAAa;AACf,GAEMC,IAAc,CAACC,MACZ,CAAC,CAACA,KAAK,SAASA,GAGnBC,IAAqB,CAACD,MAA2D;AACrF,QAAME,IAAYJ,EAAsBE,EAAE,GAAG,KAAKA,EAAE;AAEpD,MAAIA,EAAE,QAAQ;AACZ,WAAOA,EAAE,QAAQ,EAAE,KAAKE,GAAW,UAAU,MAAM,OAAO,CAAA,EAAC,IAAM;AAGnE,MAAIF,EAAE,QAAQ;AACZ,WAAOA,EAAE,QAAQ,EAAE,KAAK,4BAA4B,UAAU,cAAc;AAG9E,MAAIA,EAAE,QAAQ,YAAY;AACxB,UAAMG,IAAS,MAAM,QAAQH,EAAE,KAAK,IAAKA,EAAE,QAAqB,CAAA,GAC1DI,IAAUD,EAAO,SAAS,UAAU,GACpCE,IAAQF,EAAO,OAAO,CAACG,MAAMA,MAAM,UAAU,GAC7CC,IAAwB;AAAA,MAC5B,UAAU;AAAA,MACV,YAAY;AAAA,QACV,EAAE,KAAK,0BAA0B,UAAU,SAAA;AAAA,QAC3C,EAAE,KAAK,0BAA0B,UAAU,MAAM,OAAO,GAAA;AAAA,MAAG;AAAA,IAC7D,GAEIC,IAA4B;AAAA,MAChC,KAAK;AAAA,MACL,UAAU;AAAA,MACV,OAAOH;AAAA,IAAA;AAET,WAAID,KAAWC,EAAM,SAAe,EAAE,UAAU,MAAM,YAAY,CAACE,GAAUC,CAAS,EAAA,IAClFJ,IAAgBG,IAChBF,EAAM,SAAeG,IAClB;AAAA,EACT;AAEA,SAAIR,EAAE,QAAQ,UAAUA,EAAE,aAAa,UAAU,OAAOA,EAAE,SAAU,WAC3D,EAAE,GAAGA,GAAG,KAAKE,GAAW,OAAO,IAAIF,EAAE,KAAK,IAAA,IAK/CA,EAAE,QAAQ,WACL;AAAA,IACL,UAAU;AAAA,IACV,YAAY;AAAA,MACV,EAAE,GAAGA,GAAG,KAAK,uBAAA;AAAA,MACb,EAAE,GAAGA,GAAG,KAAK,yBAAA;AAAA,IAAyB;AAAA,EACxC,IAIG,EAAE,GAAGA,GAAG,KAAKE,EAAA;AACtB,GAEMO,IAAY,CAACC,MAA4E;AAC7F,MAAIX,EAAYW,CAAI;AAClB,WAAIf,EAAa,IAAIe,EAAK,GAAG,IAAU,OAChCT,EAAmBS,CAAI;AAGhC,QAAMC,KAAcD,EAAK,cAAc,CAAA,GACpC,IAAI,CAACV,MAAMS,EAAUT,CAAC,CAAC,EACvB,OAAO,CAACA,MAAyCA,MAAM,IAAI;AAE9D,SAAIW,EAAW,WAAW,IAAU,OAE7B,EAAE,UAAUD,EAAK,YAAY,OAAO,YAAYC,EAAA;AACzD,GAEaC,IAA2B,CAACC,MAAwD;AAC/F,MAAI,CAACA,KAAU,CAACA,EAAO,YAAY,OAAQ,QAAO;AAElD,QAAMC,IAAWC,EAAoBF,CAAa,GAC5CF,IAAaF,EAAUK,CAAQ;AACrC,SAAKH,KAAmB;AAG1B,GAEaK,KAAqB,CAACH,MAAwD;AACzF,QAAMF,IAAaC,EAAyBC,CAAM;AAClD,MAAKF;AAEL,WAAO,KAAK,UAAUA,CAAU;AAClC;"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("@ynput/ayon-react-components"),h=require("../../ProjectTreeTable/utils/queryFilterToClientFilter.cjs.js"),y=require("../../ProjectTreeTable/utils/clientFilterToQueryFilter.cjs.js"),d=["comments","versions","updates","checklists","has_attachments","in_review_session"],b=u=>!!u&&"key"in u,
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("@ynput/ayon-react-components"),h=require("../../ProjectTreeTable/utils/queryFilterToClientFilter.cjs.js"),y=require("../../ProjectTreeTable/utils/clientFilterToQueryFilter.cjs.js"),d=["comments","versions","updates","checklists","has_attachments","in_review_session"],b=u=>!!u&&"key"in u,g=(u,i)=>{const t=[],s=[],o=e=>{if(!e)return;if(b(e)){const a=e.key;if(a==="body"){const n=String(e.value??"");n&&s.push({id:n,label:n});return}const l=i.find(n=>n.id===a);if(!l)return;if(d.includes(a)){e.value===!0&&t.push({id:c.buildFilterId(a),label:l.label,icon:l.icon,type:"boolean",singleSelect:!0,values:[{id:"true",label:l.label}]});return}const F=Array.isArray(e.value)?e.value:[e.value];t.push({id:c.buildFilterId(a),label:l.label,type:l.type,icon:l.icon,singleSelect:l.singleSelect,operator:"OR",values:F.map(n=>{const p=l.values?.find(f=>f.id===String(n));return p?{...p}:{id:String(n),label:String(n)}})});return}const r=h.tryMergeDatetimeRange(e,i);if(r){t.push(r);return}e.conditions?.forEach(o)};return u?.conditions?.forEach(o),s.length&&t.push({id:c.SEARCH_FILTER_ID,label:"",values:s}),t},v=u=>{const i=[],t=[];return u.forEach(s=>{const o=c.getFilterFromId(s.id),e=(s.values||[]).map(r=>r.id);if(e.length)if(o===c.SEARCH_FILTER_ID)e.forEach(r=>t.push({key:"body",operator:"like",value:String(r)}));else if(d.includes(o))e.includes("true")&&i.push({key:o,operator:"eq",value:!0});else if(s.type==="datetime"){const r=y.convertDateFilterToQueryFilter(o,s);r&&i.push(r)}else i.push({key:o,operator:"in",value:e.map(String)})}),t.length===1?i.push(t[0]):t.length>1&&i.push({operator:"or",conditions:t}),{operator:"and",conditions:i}};exports.FEED_BOOLEAN_KEYS=d;exports.clientFiltersToFeedFilter=v;exports.feedFilterToClientFilters=g;
|
|
2
2
|
//# sourceMappingURL=feedFilterAdapter.cjs.js.map
|