@ynput/ayon-frontend-shared 0.3.7 → 0.3.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/dist/components.cjs.js +1 -1
  2. package/dist/components.es.js +109 -106
  3. package/dist/components.es.js.map +1 -1
  4. package/dist/shared/src/components/LinksManager/CellEditingDialog.cjs.js +2 -2
  5. package/dist/shared/src/components/LinksManager/CellEditingDialog.cjs.js.map +1 -1
  6. package/dist/shared/src/components/LinksManager/CellEditingDialog.es.js +22 -21
  7. package/dist/shared/src/components/LinksManager/CellEditingDialog.es.js.map +1 -1
  8. package/dist/shared/src/components/SubtasksManager/SubtasksManagerWrapper.cjs.js +1 -1
  9. package/dist/shared/src/components/SubtasksManager/SubtasksManagerWrapper.cjs.js.map +1 -1
  10. package/dist/shared/src/components/SubtasksManager/SubtasksManagerWrapper.es.js +3 -12
  11. package/dist/shared/src/components/SubtasksManager/SubtasksManagerWrapper.es.js.map +1 -1
  12. package/dist/shared/src/containers/DetailsPanel/DetailsPanel.cjs.js +1 -1
  13. package/dist/shared/src/containers/DetailsPanel/DetailsPanel.cjs.js.map +1 -1
  14. package/dist/shared/src/containers/DetailsPanel/DetailsPanel.es.js +67 -65
  15. package/dist/shared/src/containers/DetailsPanel/DetailsPanel.es.js.map +1 -1
  16. package/dist/shared/src/containers/DetailsPanel/containers/DetailsPanelSubtasks.cjs.js.map +1 -1
  17. package/dist/shared/src/containers/DetailsPanel/containers/DetailsPanelSubtasks.es.js.map +1 -1
  18. package/dist/shared/src/containers/ProjectTreeTable/context/CellEditingProvider.cjs.js +1 -1
  19. package/dist/shared/src/containers/ProjectTreeTable/context/CellEditingProvider.cjs.js.map +1 -1
  20. package/dist/shared/src/containers/ProjectTreeTable/context/CellEditingProvider.es.js +87 -81
  21. package/dist/shared/src/containers/ProjectTreeTable/context/CellEditingProvider.es.js.map +1 -1
  22. package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableContext.cjs.js.map +1 -1
  23. package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableContext.es.js.map +1 -1
  24. package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableProvider.cjs.js +1 -1
  25. package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableProvider.cjs.js.map +1 -1
  26. package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableProvider.es.js +118 -109
  27. package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableProvider.es.js.map +1 -1
  28. package/dist/shared/src/containers/ProjectTreeTable/widgets/SubtasksWidget.cjs.js +1 -1
  29. package/dist/shared/src/containers/ProjectTreeTable/widgets/SubtasksWidget.cjs.js.map +1 -1
  30. package/dist/shared/src/containers/ProjectTreeTable/widgets/SubtasksWidget.es.js +17 -16
  31. package/dist/shared/src/containers/ProjectTreeTable/widgets/SubtasksWidget.es.js.map +1 -1
  32. package/dist/types/components/LinksManager/CellEditingDialog.d.ts +1 -0
  33. package/dist/types/components/LinksManager/index.d.ts +1 -0
  34. package/dist/types/components/SubtasksManager/SubtasksManagerWrapper.d.ts +2 -2
  35. package/dist/types/containers/ProjectTreeTable/context/ProjectTableContext.d.ts +5 -0
  36. package/dist/types/containers/ProjectTreeTable/context/ProjectTableProvider.d.ts +6 -1
  37. package/package.json +1 -1
@@ -1,8 +1,8 @@
1
1
  import { j as o } from "../../../../_virtual/jsx-runtime.es.js";
2
2
  import { Button as z } from "@ynput/ayon-react-components";
3
- import { useRef as Tt, useEffect as s, useMemo as J } from "react";
4
- import xt from "./hooks/useDetailsPanelURLSync.es.js";
5
- import { Panel as Nt, Toolbar as bt, RightTools as Dt } from "./DetailsPanel.styled.es.js";
3
+ import { useRef as xt, useEffect as s, useMemo as J } from "react";
4
+ import Nt from "./hooks/useDetailsPanelURLSync.es.js";
5
+ import { Panel as bt, Toolbar as Dt, RightTools as kt } from "./DetailsPanel.styled.es.js";
6
6
  import "../../api/base/client.es.js";
7
7
  import "../../api/generated/graphql.es.js";
8
8
  import "../../api/generated/graphqlLinks.es.js";
@@ -56,8 +56,8 @@ import "../../api/queries/cloud/cloud.es.js";
56
56
  import "../../api/queries/config/getConfig.es.js";
57
57
  import "../../api/queries/config/updateConfig.es.js";
58
58
  import "../../api/queries/entities/getEntity.es.js";
59
- import { useGetEntitiesDetailsPanelQuery as kt } from "../../api/queries/entities/getEntityPanel.es.js";
60
- import { detailsPanelEntityTypes as vt } from "../../api/queries/entities/transformDetailsPanelData.es.js";
59
+ import { useGetEntitiesDetailsPanelQuery as vt } from "../../api/queries/entities/getEntityPanel.es.js";
60
+ import { detailsPanelEntityTypes as wt } from "../../api/queries/entities/transformDetailsPanelData.es.js";
61
61
  import "../../api/queries/entities/updateEntity.es.js";
62
62
  import "../../api/queries/entityLists/getLists.es.js";
63
63
  import "../../api/queries/entityLists/updateLists.es.js";
@@ -108,7 +108,7 @@ import "../../components/DateRangePicker/DateRangePicker.styled.es.js";
108
108
  import "../../components/LinksManager/CellEditingDialog.es.js";
109
109
  import "react-toastify";
110
110
  import "../../components/DetailsPanelAttributes/DetailsPanelAttributesEditor.es.js";
111
- import { DetailsPanelDetails as wt } from "../../components/DetailsPanelDetails/DetailsPanelDetails.es.js";
111
+ import { DetailsPanelDetails as Ct } from "../../components/DetailsPanelDetails/DetailsPanelDetails.es.js";
112
112
  import "../../components/DetailsPanelDetails/DetailsSection.es.js";
113
113
  import "../../components/DetailsPanelDetails/FieldLabel.es.js";
114
114
  import "../../components/DoneCheckbox/DoneCheckbox.es.js";
@@ -121,11 +121,11 @@ import "../Feed/context/FeedContext.es.js";
121
121
  import "../Feed/components/Tooltips/UserTooltip/UserTooltip.styled.es.js";
122
122
  import "../Feed/components/Tooltips/EntityTooltip/EntityTooltip.styled.es.js";
123
123
  import "../../context/RemoteModulesContext.es.js";
124
- import { useDetailsPanelContext as Y, useScopedDetailsPanel as Ct } from "../../context/DetailsPanelContext.es.js";
124
+ import { useDetailsPanelContext as Y, useScopedDetailsPanel as St } from "../../context/DetailsPanelContext.es.js";
125
125
  import "../../context/SubtasksModulesContext.es.js";
126
126
  import "../../context/ThumbnailUploaderContext.es.js";
127
127
  import "../../context/SettingsPanelContext.es.js";
128
- import { usePiPWindow as St } from "../../context/pip/PiPProvider.es.js";
128
+ import { usePiPWindow as Ft } from "../../context/pip/PiPProvider.es.js";
129
129
  import "../../context/pip/PiPWrapper.es.js";
130
130
  import "../../context/AddonProjectContext.es.js";
131
131
  import "../../context/AddonContext.es.js";
@@ -134,9 +134,9 @@ import "../../context/MoveEntityContext.es.js";
134
134
  import "../../context/MenuContext.es.js";
135
135
  import "../../context/WebsocketContext.es.js";
136
136
  import "../../context/GlobalContext.es.js";
137
- import { ProjectContextProvider as Ft } from "../../context/ProjectContext.es.js";
137
+ import { ProjectContextProvider as It } from "../../context/ProjectContext.es.js";
138
138
  import "../../context/ProjectFoldersContext.es.js";
139
- import { useURIContext as It } from "../../context/UriContext.es.js";
139
+ import { useURIContext as Lt } from "../../context/UriContext.es.js";
140
140
  import "../Feed/components/FileUploadPreview/FileUploadPreview.styled.es.js";
141
141
  import "../Feed/components/FileUploadPreview/Mimes/TextMime.es.js";
142
142
  import "react-markdown";
@@ -153,7 +153,7 @@ import "../Feed/components/ActivityComment/ActivityComment.styled.es.js";
153
153
  import "../Feed/components/ActivityCheckbox/ActivityCheckbox.styled.es.js";
154
154
  import "../Feed/components/ActivityReference/ActivityReference.styled.es.js";
155
155
  import "uuid";
156
- import { extractEntityHierarchyFromParents as Lt } from "../../util/extractEntityHierarchyFromParents.es.js";
156
+ import { extractEntityHierarchyFromParents as Rt } from "../../util/extractEntityHierarchyFromParents.es.js";
157
157
  import "../../util/pubsub.es.js";
158
158
  import "react-router-dom";
159
159
  import "../Feed/components/ActivityStatus/ActivityStatus.es.js";
@@ -211,14 +211,14 @@ import "../SimpleTable/SimpleTableRowTemplate.es.js";
211
211
  import "../Slicer/hooks/useTableDataBySlice.es.js";
212
212
  import "../Slicer/components/SlicerSearch.es.js";
213
213
  import "../Slicer/context/SlicerContext.es.js";
214
- import Rt from "./components/DetailsPanelHeader/DetailsPanelHeader.es.js";
215
- import Ut from "./components/DetailsPanelFiles/DetailsPanelFiles.es.js";
216
- import Wt from "./hooks/useGetEntityPath.es.js";
217
- import Ht from "./helpers/getAllProjectsStatuses.es.js";
218
- import At from "./containers/FeedWrapper.es.js";
219
- import Gt from "./containers/FeedContextWrapper.es.js";
220
- import Ot from "./helpers/mergeProjectInfo.es.js";
221
- import Vt from "./containers/DetailsPanelSubtasks.es.js";
214
+ import Ut from "./components/DetailsPanelHeader/DetailsPanelHeader.es.js";
215
+ import Wt from "./components/DetailsPanelFiles/DetailsPanelFiles.es.js";
216
+ import Ht from "./hooks/useGetEntityPath.es.js";
217
+ import At from "./helpers/getAllProjectsStatuses.es.js";
218
+ import Gt from "./containers/FeedWrapper.es.js";
219
+ import Ot from "./containers/FeedContextWrapper.es.js";
220
+ import Vt from "./helpers/mergeProjectInfo.es.js";
221
+ import _t from "./containers/DetailsPanelSubtasks.es.js";
222
222
  import "./components/DetailsPanelHeader/DetailsPanelHeader.styled.es.js";
223
223
  import "./components/DetailsPanelSlideOut/DetailsPanelSlideOut.styled.es.js";
224
224
  import "./components/DetailsPanelFloating/DetailsPanelFloating.styled.es.js";
@@ -233,7 +233,7 @@ import "../../components/EntityPanelUploader/EntityPanelUploader.styled.es.js";
233
233
  import "axios";
234
234
  import "../../components/ReviewablesList/ReviewablesList.styled.es.js";
235
235
  import "../../components/ReviewablesList/ReviewablesUpload.styled.es.js";
236
- import { EntityPath as _t } from "../../components/EntityPath/EntityPath.es.js";
236
+ import { EntityPath as Mt } from "../../components/EntityPath/EntityPath.es.js";
237
237
  import "../../components/FeaturedVersionOrder/FeaturedVersionOrder.es.js";
238
238
  import "../../components/Feedback/FeedbackContext.es.js";
239
239
  import "../../components/Feedback/SupportBubble.es.js";
@@ -261,10 +261,10 @@ import "../../components/Thumbnail/StackedThumbnails.es.js";
261
261
  import "../../components/ThumbnailSimple/ThumbnailSimple.es.js";
262
262
  import "../../components/VersionUploader/components/UploadVersionDialog.es.js";
263
263
  import "../../components/VersionUploader/context/VersionUploadContext.es.js";
264
- import { Watchers as Mt } from "../../components/Watchers/Watchers.es.js";
264
+ import { Watchers as Qt } from "../../components/Watchers/Watchers.es.js";
265
265
  import "../../components/Menu/Menu.styled.es.js";
266
266
  import "../../components/Menu/MenuItem.es.js";
267
- const Qt = ["product", "representation"], qt = ({
267
+ const qt = ["product", "representation"], Bt = ({
268
268
  entityType: x,
269
269
  entitySubTypes: P = [],
270
270
  // entities is data we already have from kanban
@@ -279,7 +279,7 @@ const Qt = ["product", "representation"], qt = ({
279
279
  projectsInfo: j = {},
280
280
  projectNames: it = [],
281
281
  isSlideOut: f = !1,
282
- style: Bt = {},
282
+ style: Kt = {},
283
283
  scope: a,
284
284
  isCompact: rt = !1,
285
285
  onClose: b,
@@ -305,17 +305,18 @@ const Qt = ["product", "representation"], qt = ({
305
305
  setEntities: D,
306
306
  slideOut: G,
307
307
  useSearchParams: nt,
308
- SubtasksManager: O
309
- } = Y(), { currentTab: p, setTab: y, isFeed: at } = Ct(a), [Kt, ct] = nt(), V = Tt(!1), r = e?.entityType ?? x, _ = e?.entities ?? n, lt = e?.entitySubTypes ?? P, ut = e?.entities ? [] : N, c = e?.entities ? e.entities.map((t) => t.projectName) : it;
308
+ SubtasksManager: O,
309
+ useNavigate: at
310
+ } = Y(), { currentTab: p, setTab: y, isFeed: ct } = St(a), [Xt, lt] = nt(), V = xt(!1), r = e?.entityType ?? x, _ = e?.entities ?? n, ut = e?.entitySubTypes ?? P, dt = e?.entities ? [] : N, c = e?.entities ? e.entities.map((t) => t.projectName) : it;
310
311
  s(() => {
311
312
  F && !V.current && (V.current = !0, F());
312
313
  }, []), s(() => {
313
- Qt.includes(r) && p !== "details" && y("details");
314
+ qt.includes(r) && p !== "details" && y("details");
314
315
  }, [r, p, y]), s(() => {
315
316
  n.length && e && D(null);
316
317
  }, [n, e, D]);
317
318
  const g = J(
318
- () => Ot(j, c),
319
+ () => Vt(j, c),
319
320
  [j, c]
320
321
  ), M = J(
321
322
  () => ({
@@ -330,23 +331,23 @@ const Qt = ["product", "representation"], qt = ({
330
331
  }, [r, p, a]);
331
332
  let l = _.length ? _.map((t) => ({ id: t.id, projectName: t.projectName })) : (
332
333
  // @ts-expect-error = not sure what's going on with activeEntitiesData, we should try and remove it
333
- ut.map((t) => ({ id: t.id, projectName: t.projectName }))
334
+ dt.map((t) => ({ id: t.id, projectName: t.projectName }))
334
335
  );
335
336
  l = l.filter((t) => t.id);
336
337
  const {
337
338
  data: m = [],
338
339
  isFetching: u,
339
- isError: dt,
340
- originalArgs: ft
341
- } = kt(
340
+ isError: ft,
341
+ originalArgs: yt
342
+ } = vt(
342
343
  { entityType: r, entities: l },
343
344
  {
344
- skip: !l.length || !vt.includes(r)
345
+ skip: !l.length || !wt.includes(r)
345
346
  }
346
347
  );
347
348
  s(() => {
348
349
  f || H();
349
- }, [ft, f]), s(() => {
350
+ }, [yt, f]), s(() => {
350
351
  if (!u && e?.source && ["uri", "url"].includes(e.source) && e?.entities?.length && I) {
351
352
  const t = m.find(
352
353
  (i) => i.id === e.entities[0].id
@@ -355,36 +356,36 @@ const Qt = ["product", "representation"], qt = ({
355
356
  I(t);
356
357
  }
357
358
  }, [m, u]);
358
- const Q = Ht(j), d = c[0], q = j[d] || {}, E = m[0] || {}, T = m[m.length - 1], k = c[c.length - 1], [B, yt] = Wt({
359
+ const Q = At(j), d = c[0], q = j[d] || {}, E = m[0] || {}, T = m[m.length - 1], k = c[c.length - 1], [B, ht] = Ht({
359
360
  entity: E,
360
361
  entityType: r,
361
362
  projectName: d,
362
363
  isLoading: u
363
- }), { setEntityUri: ht, setUri: Pt } = It();
364
+ }), { setEntityUri: Pt, setUri: jt } = Lt();
364
365
  s(() => {
365
366
  if (!T?.parents || !k) return;
366
- const { folderPath: t, taskName: i, versionName: h, productName: X } = Lt(
367
+ const { folderPath: t, taskName: i, versionName: h, productName: X } = Rt(
367
368
  T.parents,
368
369
  r,
369
370
  T.name
370
371
  );
371
- return ht({
372
+ return Pt({
372
373
  projectName: k,
373
374
  folderPath: t,
374
375
  taskName: i,
375
376
  productName: X,
376
377
  versionName: h
377
378
  }), () => {
378
- Pt("");
379
+ jt("");
379
380
  };
380
- }, [m, c, r]), xt({
381
+ }, [m, c, r]), Nt({
381
382
  entityData: T,
382
383
  project: k,
383
384
  activeEntityType: r,
384
385
  entitiesToQuery: l
385
386
  });
386
- const jt = () => {
387
- ct(
387
+ const gt = () => {
388
+ lt(
388
389
  (t) => {
389
390
  const i = new URLSearchParams(t);
390
391
  return i.delete("project"), i.delete("type"), i.delete("id"), i;
@@ -392,7 +393,7 @@ const Qt = ["product", "representation"], qt = ({
392
393
  { replace: !0 }
393
394
  );
394
395
  }, v = () => {
395
- b?.(), D(null), jt(), H();
396
+ b?.(), D(null), gt(), H();
396
397
  };
397
398
  s(() => {
398
399
  const t = (i) => {
@@ -404,23 +405,23 @@ const Qt = ["product", "representation"], qt = ({
404
405
  };
405
406
  return window.addEventListener("keydown", t), () => window.removeEventListener("keydown", t);
406
407
  }, [v, f, G]);
407
- const { requestPipWindow: gt } = St(), Et = () => {
408
+ const { requestPipWindow: Et } = Ft(), Tt = () => {
408
409
  pt({
409
410
  entityType: r,
410
411
  entities: l,
411
412
  scope: a
412
- }), gt(500, 500);
413
+ }), Et(500, 500);
413
414
  }, K = () => !(c.length > 1 || st && (!W || !Object.prototype.hasOwnProperty.call(
414
415
  mt,
415
416
  A.attrib?.email || ""
416
417
  )));
417
- return /* @__PURE__ */ o.jsx(o.Fragment, { children: /* @__PURE__ */ o.jsxs(Nt, { className: "details-panel", children: [
418
- /* @__PURE__ */ o.jsxs(bt, { children: [
418
+ return /* @__PURE__ */ o.jsx(o.Fragment, { children: /* @__PURE__ */ o.jsxs(bt, { className: "details-panel", children: [
419
+ /* @__PURE__ */ o.jsxs(Dt, { children: [
419
420
  /* @__PURE__ */ o.jsx(
420
- _t,
421
+ Mt,
421
422
  {
422
423
  segments: B,
423
- versions: yt,
424
+ versions: ht,
424
425
  projectName: d,
425
426
  hideProjectName: f,
426
427
  isLoading: u || !B.length,
@@ -429,9 +430,9 @@ const Qt = ["product", "representation"], qt = ({
429
430
  entityTypeIcons: M
430
431
  }
431
432
  ),
432
- /* @__PURE__ */ o.jsxs(Dt, { className: "right-tools", children: [
433
+ /* @__PURE__ */ o.jsxs(kt, { className: "right-tools", children: [
433
434
  /* @__PURE__ */ o.jsx(
434
- Mt,
435
+ Qt,
435
436
  {
436
437
  entities: l,
437
438
  entityType: r,
@@ -446,7 +447,7 @@ const Qt = ["product", "representation"], qt = ({
446
447
  icon: "picture_in_picture",
447
448
  variant: "text",
448
449
  "data-tooltip": "Picture in Picture",
449
- onClick: Et
450
+ onClick: Tt
450
451
  }
451
452
  ),
452
453
  b && /* @__PURE__ */ o.jsx(
@@ -461,10 +462,10 @@ const Qt = ["product", "representation"], qt = ({
461
462
  ] })
462
463
  ] }),
463
464
  /* @__PURE__ */ o.jsx(
464
- Rt,
465
+ Ut,
465
466
  {
466
467
  entityType: r,
467
- entitySubTypes: lt,
468
+ entitySubTypes: ut,
468
469
  entities: m,
469
470
  users: w,
470
471
  disabledAssignees: tt,
@@ -479,9 +480,9 @@ const Qt = ["product", "representation"], qt = ({
479
480
  onEntityFocus: et
480
481
  }
481
482
  ),
482
- /* @__PURE__ */ o.jsxs(Ft, { projectName: d, children: [
483
- at && !dt && /* @__PURE__ */ o.jsx(
484
- At,
483
+ /* @__PURE__ */ o.jsxs(It, { projectName: d, children: [
484
+ ct && !ft && /* @__PURE__ */ o.jsx(
485
+ Gt,
485
486
  {
486
487
  entityType: r,
487
488
  entities: m,
@@ -500,16 +501,17 @@ const Qt = ["product", "representation"], qt = ({
500
501
  }
501
502
  ),
502
503
  p === "subtasks" && r === "task" && E?.id && O && /* @__PURE__ */ o.jsx(
503
- Vt,
504
+ _t,
504
505
  {
505
506
  projectName: d,
506
507
  taskId: E.id,
507
508
  subtasks: E.task?.subtasks || [],
508
- SubtasksManager: O
509
+ SubtasksManager: O,
510
+ useNavigate: at
509
511
  }
510
512
  ),
511
513
  p === "files" && /* @__PURE__ */ o.jsx(
512
- Ut,
514
+ Wt,
513
515
  {
514
516
  entities: m,
515
517
  scope: a,
@@ -517,7 +519,7 @@ const Qt = ["product", "representation"], qt = ({
517
519
  }
518
520
  ),
519
521
  p === "details" && /* @__PURE__ */ o.jsx(
520
- Gt,
522
+ Ot,
521
523
  {
522
524
  entityType: r,
523
525
  entities: m,
@@ -532,7 +534,7 @@ const Qt = ["product", "representation"], qt = ({
532
534
  removeAnnotation: R,
533
535
  exportAnnotationComposite: U,
534
536
  children: /* @__PURE__ */ o.jsx(
535
- wt,
537
+ Ct,
536
538
  {
537
539
  entities: m,
538
540
  isLoading: u
@@ -542,16 +544,16 @@ const Qt = ["product", "representation"], qt = ({
542
544
  )
543
545
  ] })
544
546
  ] }) });
545
- }, qm = ({
547
+ }, Bm = ({
546
548
  isOpen: x,
547
549
  entityType: P,
548
550
  ...N
549
551
  }) => {
550
552
  const { entities: n } = Y();
551
- return !x && !n || !P && !n ? null : /* @__PURE__ */ o.jsx(qt, { ...N, entityType: P || n?.entityType });
553
+ return !x && !n || !P && !n ? null : /* @__PURE__ */ o.jsx(Bt, { ...N, entityType: P || n?.entityType });
552
554
  };
553
555
  export {
554
- qm as DetailsPanel,
555
- Qt as entitiesWithoutFeed
556
+ Bm as DetailsPanel,
557
+ qt as entitiesWithoutFeed
556
558
  };
557
559
  //# sourceMappingURL=DetailsPanel.es.js.map
@@ -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, EntityPath, Watchers } from '@shared/components'\nimport { usePiPWindow } from '@shared/context/pip/PiPProvider'\nimport { extractEntityHierarchyFromParents } from '@shared/util'\nimport {\n ProjectContextProvider,\n ProjectModelWithProducts,\n useDetailsPanelContext,\n useScopedDetailsPanel,\n useURIContext,\n FeedFilter,\n} from '@shared/context'\n\nimport DetailsPanelHeader from './components/DetailsPanelHeader/DetailsPanelHeader'\nimport DetailsPanelFiles from './components/DetailsPanelFiles'\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 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) => 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 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}: // 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 } = 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\n const entityTypeIcons = useMemo(\n () => ({\n task: projectInfo.taskTypes\n .filter((task) => !!task.icon)\n .reduce((acc, task) => ({ ...acc, [task.name]: task.icon }), {}),\n folder: projectInfo.folderTypes\n .filter((folder) => !!folder.icon)\n .reduce((acc, folder) => ({ ...acc, [folder.name]: folder.icon }), {}),\n product: projectInfo.productTypes\n .filter((product) => !!product.icon)\n .reduce((acc, product) => ({ ...acc, [product.name]: product.icon }), {}),\n }),\n [projectInfo],\n )\n\n // check if tab needs to be updated when entity type changes\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 // if the details panel is opened vair the uri, run callback\n useEffect(() => {\n if (isFetchingEntitiesDetails) return\n\n if (\n contextEntities?.source &&\n ['uri', 'url'].includes(contextEntities.source) &&\n contextEntities?.entities?.length &&\n !!onUriOpen\n ) {\n const uriEntity = entityDetailsData.find(\n (entity) => entity.id === contextEntities.entities[0].id,\n )\n if (!uriEntity) return\n\n onUriOpen(uriEntity)\n }\n }, [entityDetailsData, isFetchingEntitiesDetails])\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 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 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 <>\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 <Watchers\n entities={entitiesToQuery}\n entityType={activeEntityType}\n options={projectUsers || []}\n onWatchersUpdate={onWatchersUpdate && onWatchersUpdate}\n userName={user.name}\n />\n <Button\n icon=\"picture_in_picture\"\n variant={'text'}\n data-tooltip=\"Picture in Picture\"\n onClick={handleOpenPip}\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 entityTypeIcons={entityTypeIcons}\n onOpenViewer={(args) => onOpenViewer?.(args)}\n onEntityFocus={onEntityFocus}\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 />\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 </>\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 // @ts-expect-error - entityType could be undefined but we check for entities above\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","closeSlideOut","openPip","user","isGuest","contextEntities","setEntities","slideOut","useSearchParams","SubtasksManager","useDetailsPanelContext","currentTab","setTab","isFeed","useScopedDetailsPanel","_searchParams","setSearchParams","hasCalledOnOpen","useRef","activeEntityType","activeEntities","activeEntitySubTypes","activeEntitiesData","activeProjectNames","e","useEffect","projectInfo","useMemo","mergeProjectInfo","entityTypeIcons","task","acc","folder","product","entitiesToQuery","entity","entityDetailsData","isFetchingEntitiesDetails","isError","originalArgs","useGetEntitiesDetailsPanelQuery","detailsPanelEntityTypes","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","handleOpenPip","isCommentingEnabled","jsxs","Styled.Panel","Styled.Toolbar","jsx","EntityPath","Styled.RightTools","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, EntityPath, Watchers } from '@shared/components'\nimport { usePiPWindow } from '@shared/context/pip/PiPProvider'\nimport { extractEntityHierarchyFromParents } from '@shared/util'\nimport {\n ProjectContextProvider,\n ProjectModelWithProducts,\n useDetailsPanelContext,\n useScopedDetailsPanel,\n useURIContext,\n FeedFilter,\n} from '@shared/context'\n\nimport DetailsPanelHeader from './components/DetailsPanelHeader/DetailsPanelHeader'\nimport DetailsPanelFiles from './components/DetailsPanelFiles'\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 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) => 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 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}: // 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\n const entityTypeIcons = useMemo(\n () => ({\n task: projectInfo.taskTypes\n .filter((task) => !!task.icon)\n .reduce((acc, task) => ({ ...acc, [task.name]: task.icon }), {}),\n folder: projectInfo.folderTypes\n .filter((folder) => !!folder.icon)\n .reduce((acc, folder) => ({ ...acc, [folder.name]: folder.icon }), {}),\n product: projectInfo.productTypes\n .filter((product) => !!product.icon)\n .reduce((acc, product) => ({ ...acc, [product.name]: product.icon }), {}),\n }),\n [projectInfo],\n )\n\n // check if tab needs to be updated when entity type changes\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 // if the details panel is opened vair the uri, run callback\n useEffect(() => {\n if (isFetchingEntitiesDetails) return\n\n if (\n contextEntities?.source &&\n ['uri', 'url'].includes(contextEntities.source) &&\n contextEntities?.entities?.length &&\n !!onUriOpen\n ) {\n const uriEntity = entityDetailsData.find(\n (entity) => entity.id === contextEntities.entities[0].id,\n )\n if (!uriEntity) return\n\n onUriOpen(uriEntity)\n }\n }, [entityDetailsData, isFetchingEntitiesDetails])\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 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 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 <>\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 <Watchers\n entities={entitiesToQuery}\n entityType={activeEntityType}\n options={projectUsers || []}\n onWatchersUpdate={onWatchersUpdate && onWatchersUpdate}\n userName={user.name}\n />\n <Button\n icon=\"picture_in_picture\"\n variant={'text'}\n data-tooltip=\"Picture in Picture\"\n onClick={handleOpenPip}\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 entityTypeIcons={entityTypeIcons}\n onOpenViewer={(args) => onOpenViewer?.(args)}\n onEntityFocus={onEntityFocus}\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 />\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 </>\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 // @ts-expect-error - entityType could be undefined but we check for entities above\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","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","task","acc","folder","product","entitiesToQuery","entity","entityDetailsData","isFetchingEntitiesDetails","isError","originalArgs","useGetEntitiesDetailsPanelQuery","detailsPanelEntityTypes","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","handleOpenPip","isCommentingEnabled","jsxs","Styled.Panel","Styled.Toolbar","jsx","EntityPath","Styled.RightTools","Watchers","Button","DetailsPanelHeader","args","ProjectContextProvider","FeedWrapper","DetailsPanelSubtasks","DetailsPanelFiles","FeedContextWrapper","DetailsPanelDetails","DetailsPanel","isOpen","props"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"DetailsPanelSubtasks.cjs.js","sources":["../../../../../../src/containers/DetailsPanel/containers/DetailsPanelSubtasks.tsx"],"sourcesContent":["import { SubtasksManagerWrapper, SubtasksManagerWrapperProps } from '@shared/components'\nimport { FC, useMemo, useState } from 'react'\nimport TabHeaderAndFilters, {\n FilterItem,\n} from '../components/TabHeaderAndFilters/TabHeaderAndFilters'\nimport { useLocalStorage } from '@shared/hooks'\nimport { QueryFilter, useGetUsersQuery } from '@shared/api'\n\ninterface DetailsPanelSubtasksProps extends SubtasksManagerWrapperProps {}\n\nconst DetailsPanelSubtasks: FC<DetailsPanelSubtasksProps> = ({ ...props }) => {\n const [subtasksFilters, setSubtasksFilters] = useState<QueryFilter>({})\n const [selectedSubtaskIds, setSelectedSubtaskIds] = useState<string[]>([])\n\n const { data: users = [] } = useGetUsersQuery({})\n\n const filters = useMemo<FilterItem<string>[]>(\n () => [\n {\n id: 'search',\n icon: 'search',\n tooltip: 'Search',\n type: 'search',\n placeholder: 'Search subtasks...',\n },\n {\n id: 'assignees',\n icon: 'person',\n tooltip: 'Assignees',\n type: 'enum',\n options: users.map((u: any) => ({\n label: u.attrib?.fullName || u.name,\n value: u.name,\n icon: `/api/users/${u.name}/avatar`,\n })),\n operator: 'includesany',\n },\n {\n id: 'done',\n icon: 'check_circle',\n tooltip: 'Done',\n type: 'boolean',\n },\n ],\n [users],\n )\n\n return (\n <>\n <TabHeaderAndFilters\n label={`Subtasks (${props.subtasks?.length || 0})`}\n filters={filters}\n currentFilter={subtasksFilters}\n onFilterChange={setSubtasksFilters}\n />\n <SubtasksManagerWrapper\n {...props}\n style={{ padding: 8, height: 'unset' }}\n title={null}\n selectedSubtaskIds={selectedSubtaskIds}\n onSelectSubtasks={setSelectedSubtaskIds}\n filters={subtasksFilters}\n actionsPortalClassName=\"panel-header-filters\"\n />\n </>\n )\n}\n\nexport default DetailsPanelSubtasks\n"],"names":["DetailsPanelSubtasks","props","subtasksFilters","setSubtasksFilters","useState","selectedSubtaskIds","setSelectedSubtaskIds","users","useGetUsersQuery","filters","useMemo","u","jsxs","Fragment","jsx","TabHeaderAndFilters","SubtasksManagerWrapper"],"mappings":"qieAUA,MAAMA,EAAsD,CAAC,CAAE,GAAGC,KAAY,CAC5E,KAAM,CAACC,EAAiBC,CAAkB,EAAIC,EAAAA,SAAsB,CAAA,CAAE,EAChE,CAACC,EAAoBC,CAAqB,EAAIF,EAAAA,SAAmB,CAAA,CAAE,EAEnE,CAAE,KAAMG,EAAQ,CAAA,GAAOC,EAAAA,iBAAiB,CAAA,CAAE,EAE1CC,EAAUC,EAAAA,QACd,IAAM,CACJ,CACE,GAAI,SACJ,KAAM,SACN,QAAS,SACT,KAAM,SACN,YAAa,oBAAA,EAEf,CACE,GAAI,YACJ,KAAM,SACN,QAAS,YACT,KAAM,OACN,QAASH,EAAM,IAAKI,IAAY,CAC9B,MAAOA,EAAE,QAAQ,UAAYA,EAAE,KAC/B,MAAOA,EAAE,KACT,KAAM,cAAcA,EAAE,IAAI,SAAA,EAC1B,EACF,SAAU,aAAA,EAEZ,CACE,GAAI,OACJ,KAAM,eACN,QAAS,OACT,KAAM,SAAA,CACR,EAEF,CAACJ,CAAK,CAAA,EAGR,OACEK,EAAAA,kBAAAA,KAAAC,6BAAA,CACE,SAAA,CAAAC,EAAAA,kBAAAA,IAACC,EAAA,CACC,MAAO,aAAad,EAAM,UAAU,QAAU,CAAC,IAC/C,QAAAQ,EACA,cAAeP,EACf,eAAgBC,CAAA,CAAA,EAElBW,EAAAA,kBAAAA,IAACE,EAAAA,uBAAA,CACE,GAAGf,EACJ,MAAO,CAAE,QAAS,EAAG,OAAQ,OAAA,EAC7B,MAAO,KACP,mBAAAI,EACA,iBAAkBC,EAClB,QAASJ,EACT,uBAAuB,sBAAA,CAAA,CACzB,EACF,CAEJ"}
1
+ {"version":3,"file":"DetailsPanelSubtasks.cjs.js","sources":["../../../../../../src/containers/DetailsPanel/containers/DetailsPanelSubtasks.tsx"],"sourcesContent":["import { SubtasksManagerWrapper, SubtasksManagerWrapperProps } from '@shared/components'\nimport { FC, useMemo, useState } from 'react'\nimport TabHeaderAndFilters, {\n FilterItem,\n} from '../components/TabHeaderAndFilters/TabHeaderAndFilters'\nimport { QueryFilter, useGetUsersQuery } from '@shared/api'\n\ninterface DetailsPanelSubtasksProps extends SubtasksManagerWrapperProps {}\n\nconst DetailsPanelSubtasks: FC<DetailsPanelSubtasksProps> = ({ ...props }) => {\n const [subtasksFilters, setSubtasksFilters] = useState<QueryFilter>({})\n const [selectedSubtaskIds, setSelectedSubtaskIds] = useState<string[]>([])\n\n const { data: users = [] } = useGetUsersQuery({})\n\n const filters = useMemo<FilterItem<string>[]>(\n () => [\n {\n id: 'search',\n icon: 'search',\n tooltip: 'Search',\n type: 'search',\n placeholder: 'Search subtasks...',\n },\n {\n id: 'assignees',\n icon: 'person',\n tooltip: 'Assignees',\n type: 'enum',\n options: users.map((u: any) => ({\n label: u.attrib?.fullName || u.name,\n value: u.name,\n icon: `/api/users/${u.name}/avatar`,\n })),\n operator: 'includesany',\n },\n {\n id: 'done',\n icon: 'check_circle',\n tooltip: 'Done',\n type: 'boolean',\n },\n ],\n [users],\n )\n\n return (\n <>\n <TabHeaderAndFilters\n label={`Subtasks (${props.subtasks?.length || 0})`}\n filters={filters}\n currentFilter={subtasksFilters}\n onFilterChange={setSubtasksFilters}\n />\n <SubtasksManagerWrapper\n {...props}\n style={{ padding: 8, height: 'unset' }}\n title={null}\n selectedSubtaskIds={selectedSubtaskIds}\n onSelectSubtasks={setSelectedSubtaskIds}\n filters={subtasksFilters}\n actionsPortalClassName=\"panel-header-filters\"\n />\n </>\n )\n}\n\nexport default DetailsPanelSubtasks\n"],"names":["DetailsPanelSubtasks","props","subtasksFilters","setSubtasksFilters","useState","selectedSubtaskIds","setSelectedSubtaskIds","users","useGetUsersQuery","filters","useMemo","u","jsxs","Fragment","jsx","TabHeaderAndFilters","SubtasksManagerWrapper"],"mappings":"qieASA,MAAMA,EAAsD,CAAC,CAAE,GAAGC,KAAY,CAC5E,KAAM,CAACC,EAAiBC,CAAkB,EAAIC,EAAAA,SAAsB,CAAA,CAAE,EAChE,CAACC,EAAoBC,CAAqB,EAAIF,EAAAA,SAAmB,CAAA,CAAE,EAEnE,CAAE,KAAMG,EAAQ,CAAA,GAAOC,EAAAA,iBAAiB,CAAA,CAAE,EAE1CC,EAAUC,EAAAA,QACd,IAAM,CACJ,CACE,GAAI,SACJ,KAAM,SACN,QAAS,SACT,KAAM,SACN,YAAa,oBAAA,EAEf,CACE,GAAI,YACJ,KAAM,SACN,QAAS,YACT,KAAM,OACN,QAASH,EAAM,IAAKI,IAAY,CAC9B,MAAOA,EAAE,QAAQ,UAAYA,EAAE,KAC/B,MAAOA,EAAE,KACT,KAAM,cAAcA,EAAE,IAAI,SAAA,EAC1B,EACF,SAAU,aAAA,EAEZ,CACE,GAAI,OACJ,KAAM,eACN,QAAS,OACT,KAAM,SAAA,CACR,EAEF,CAACJ,CAAK,CAAA,EAGR,OACEK,EAAAA,kBAAAA,KAAAC,6BAAA,CACE,SAAA,CAAAC,EAAAA,kBAAAA,IAACC,EAAA,CACC,MAAO,aAAad,EAAM,UAAU,QAAU,CAAC,IAC/C,QAAAQ,EACA,cAAeP,EACf,eAAgBC,CAAA,CAAA,EAElBW,EAAAA,kBAAAA,IAACE,EAAAA,uBAAA,CACE,GAAGf,EACJ,MAAO,CAAE,QAAS,EAAG,OAAQ,OAAA,EAC7B,MAAO,KACP,mBAAAI,EACA,iBAAkBC,EAClB,QAASJ,EACT,uBAAuB,sBAAA,CAAA,CACzB,EACF,CAEJ"}
@@ -1 +1 @@
1
- {"version":3,"file":"DetailsPanelSubtasks.es.js","sources":["../../../../../../src/containers/DetailsPanel/containers/DetailsPanelSubtasks.tsx"],"sourcesContent":["import { SubtasksManagerWrapper, SubtasksManagerWrapperProps } from '@shared/components'\nimport { FC, useMemo, useState } from 'react'\nimport TabHeaderAndFilters, {\n FilterItem,\n} from '../components/TabHeaderAndFilters/TabHeaderAndFilters'\nimport { useLocalStorage } from '@shared/hooks'\nimport { QueryFilter, useGetUsersQuery } from '@shared/api'\n\ninterface DetailsPanelSubtasksProps extends SubtasksManagerWrapperProps {}\n\nconst DetailsPanelSubtasks: FC<DetailsPanelSubtasksProps> = ({ ...props }) => {\n const [subtasksFilters, setSubtasksFilters] = useState<QueryFilter>({})\n const [selectedSubtaskIds, setSelectedSubtaskIds] = useState<string[]>([])\n\n const { data: users = [] } = useGetUsersQuery({})\n\n const filters = useMemo<FilterItem<string>[]>(\n () => [\n {\n id: 'search',\n icon: 'search',\n tooltip: 'Search',\n type: 'search',\n placeholder: 'Search subtasks...',\n },\n {\n id: 'assignees',\n icon: 'person',\n tooltip: 'Assignees',\n type: 'enum',\n options: users.map((u: any) => ({\n label: u.attrib?.fullName || u.name,\n value: u.name,\n icon: `/api/users/${u.name}/avatar`,\n })),\n operator: 'includesany',\n },\n {\n id: 'done',\n icon: 'check_circle',\n tooltip: 'Done',\n type: 'boolean',\n },\n ],\n [users],\n )\n\n return (\n <>\n <TabHeaderAndFilters\n label={`Subtasks (${props.subtasks?.length || 0})`}\n filters={filters}\n currentFilter={subtasksFilters}\n onFilterChange={setSubtasksFilters}\n />\n <SubtasksManagerWrapper\n {...props}\n style={{ padding: 8, height: 'unset' }}\n title={null}\n selectedSubtaskIds={selectedSubtaskIds}\n onSelectSubtasks={setSelectedSubtaskIds}\n filters={subtasksFilters}\n actionsPortalClassName=\"panel-header-filters\"\n />\n </>\n )\n}\n\nexport default DetailsPanelSubtasks\n"],"names":["DetailsPanelSubtasks","props","subtasksFilters","setSubtasksFilters","useState","selectedSubtaskIds","setSelectedSubtaskIds","users","useGetUsersQuery","filters","useMemo","u","jsxs","Fragment","jsx","TabHeaderAndFilters","SubtasksManagerWrapper"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAUA,MAAMA,KAAsD,CAAC,EAAE,GAAGC,QAAY;AAC5E,QAAM,CAACC,GAAiBC,CAAkB,IAAIC,EAAsB,CAAA,CAAE,GAChE,CAACC,GAAoBC,CAAqB,IAAIF,EAAmB,CAAA,CAAE,GAEnE,EAAE,MAAMG,IAAQ,CAAA,MAAOC,EAAiB,CAAA,CAAE,GAE1CC,IAAUC;AAAA,IACd,MAAM;AAAA,MACJ;AAAA,QACE,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,MAAM;AAAA,QACN,aAAa;AAAA,MAAA;AAAA,MAEf;AAAA,QACE,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,MAAM;AAAA,QACN,SAASH,EAAM,IAAI,CAACI,OAAY;AAAA,UAC9B,OAAOA,EAAE,QAAQ,YAAYA,EAAE;AAAA,UAC/B,OAAOA,EAAE;AAAA,UACT,MAAM,cAAcA,EAAE,IAAI;AAAA,QAAA,EAC1B;AAAA,QACF,UAAU;AAAA,MAAA;AAAA,MAEZ;AAAA,QACE,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,CAACJ,CAAK;AAAA,EAAA;AAGR,SACEK,gBAAAA,EAAAA,KAAAC,YAAA,EACE,UAAA;AAAA,IAAAC,gBAAAA,EAAAA;AAAAA,MAACC;AAAA,MAAA;AAAA,QACC,OAAO,aAAad,EAAM,UAAU,UAAU,CAAC;AAAA,QAC/C,SAAAQ;AAAA,QACA,eAAeP;AAAA,QACf,gBAAgBC;AAAA,MAAA;AAAA,IAAA;AAAA,IAElBW,gBAAAA,EAAAA;AAAAA,MAACE;AAAA,MAAA;AAAA,QACE,GAAGf;AAAA,QACJ,OAAO,EAAE,SAAS,GAAG,QAAQ,QAAA;AAAA,QAC7B,OAAO;AAAA,QACP,oBAAAI;AAAA,QACA,kBAAkBC;AAAA,QAClB,SAASJ;AAAA,QACT,wBAAuB;AAAA,MAAA;AAAA,IAAA;AAAA,EACzB,GACF;AAEJ;"}
1
+ {"version":3,"file":"DetailsPanelSubtasks.es.js","sources":["../../../../../../src/containers/DetailsPanel/containers/DetailsPanelSubtasks.tsx"],"sourcesContent":["import { SubtasksManagerWrapper, SubtasksManagerWrapperProps } from '@shared/components'\nimport { FC, useMemo, useState } from 'react'\nimport TabHeaderAndFilters, {\n FilterItem,\n} from '../components/TabHeaderAndFilters/TabHeaderAndFilters'\nimport { QueryFilter, useGetUsersQuery } from '@shared/api'\n\ninterface DetailsPanelSubtasksProps extends SubtasksManagerWrapperProps {}\n\nconst DetailsPanelSubtasks: FC<DetailsPanelSubtasksProps> = ({ ...props }) => {\n const [subtasksFilters, setSubtasksFilters] = useState<QueryFilter>({})\n const [selectedSubtaskIds, setSelectedSubtaskIds] = useState<string[]>([])\n\n const { data: users = [] } = useGetUsersQuery({})\n\n const filters = useMemo<FilterItem<string>[]>(\n () => [\n {\n id: 'search',\n icon: 'search',\n tooltip: 'Search',\n type: 'search',\n placeholder: 'Search subtasks...',\n },\n {\n id: 'assignees',\n icon: 'person',\n tooltip: 'Assignees',\n type: 'enum',\n options: users.map((u: any) => ({\n label: u.attrib?.fullName || u.name,\n value: u.name,\n icon: `/api/users/${u.name}/avatar`,\n })),\n operator: 'includesany',\n },\n {\n id: 'done',\n icon: 'check_circle',\n tooltip: 'Done',\n type: 'boolean',\n },\n ],\n [users],\n )\n\n return (\n <>\n <TabHeaderAndFilters\n label={`Subtasks (${props.subtasks?.length || 0})`}\n filters={filters}\n currentFilter={subtasksFilters}\n onFilterChange={setSubtasksFilters}\n />\n <SubtasksManagerWrapper\n {...props}\n style={{ padding: 8, height: 'unset' }}\n title={null}\n selectedSubtaskIds={selectedSubtaskIds}\n onSelectSubtasks={setSelectedSubtaskIds}\n filters={subtasksFilters}\n actionsPortalClassName=\"panel-header-filters\"\n />\n </>\n )\n}\n\nexport default DetailsPanelSubtasks\n"],"names":["DetailsPanelSubtasks","props","subtasksFilters","setSubtasksFilters","useState","selectedSubtaskIds","setSelectedSubtaskIds","users","useGetUsersQuery","filters","useMemo","u","jsxs","Fragment","jsx","TabHeaderAndFilters","SubtasksManagerWrapper"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASA,MAAMA,KAAsD,CAAC,EAAE,GAAGC,QAAY;AAC5E,QAAM,CAACC,GAAiBC,CAAkB,IAAIC,EAAsB,CAAA,CAAE,GAChE,CAACC,GAAoBC,CAAqB,IAAIF,EAAmB,CAAA,CAAE,GAEnE,EAAE,MAAMG,IAAQ,CAAA,MAAOC,EAAiB,CAAA,CAAE,GAE1CC,IAAUC;AAAA,IACd,MAAM;AAAA,MACJ;AAAA,QACE,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,MAAM;AAAA,QACN,aAAa;AAAA,MAAA;AAAA,MAEf;AAAA,QACE,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,MAAM;AAAA,QACN,SAASH,EAAM,IAAI,CAACI,OAAY;AAAA,UAC9B,OAAOA,EAAE,QAAQ,YAAYA,EAAE;AAAA,UAC/B,OAAOA,EAAE;AAAA,UACT,MAAM,cAAcA,EAAE,IAAI;AAAA,QAAA,EAC1B;AAAA,QACF,UAAU;AAAA,MAAA;AAAA,MAEZ;AAAA,QACE,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,CAACJ,CAAK;AAAA,EAAA;AAGR,SACEK,gBAAAA,EAAAA,KAAAC,YAAA,EACE,UAAA;AAAA,IAAAC,gBAAAA,EAAAA;AAAAA,MAACC;AAAA,MAAA;AAAA,QACC,OAAO,aAAad,EAAM,UAAU,UAAU,CAAC;AAAA,QAC/C,SAAAQ;AAAA,QACA,eAAeP;AAAA,QACf,gBAAgBC;AAAA,MAAA;AAAA,IAAA;AAAA,IAElBW,gBAAAA,EAAAA;AAAAA,MAACE;AAAA,MAAA;AAAA,QACE,GAAGf;AAAA,QACJ,OAAO,EAAE,SAAS,GAAG,QAAQ,QAAA;AAAA,QAC7B,OAAO;AAAA,QACP,oBAAAI;AAAA,QACA,kBAAkBC;AAAA,QAClB,SAASJ;AAAA,QACT,wBAAuB;AAAA,MAAA;AAAA,IAAA;AAAA,EACzB,GACF;AAEJ;"}