@ynput/ayon-frontend-shared 0.3.55 → 0.3.56

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (131) hide show
  1. package/dist/_virtual/index.cjs22.js +1 -1
  2. package/dist/_virtual/index.cjs23.js +1 -1
  3. package/dist/_virtual/index.cjs24.js +1 -1
  4. package/dist/_virtual/index.cjs5.js +1 -1
  5. package/dist/_virtual/index.cjs6.js +1 -1
  6. package/dist/_virtual/index.cjs8.js +1 -1
  7. package/dist/_virtual/index.es15.js +2 -2
  8. package/dist/_virtual/index.es22.js +3 -3
  9. package/dist/_virtual/index.es23.js +5 -5
  10. package/dist/_virtual/index.es24.js +5 -5
  11. package/dist/_virtual/index.es5.js +4 -4
  12. package/dist/_virtual/index.es6.js +5 -2
  13. package/dist/_virtual/index.es6.js.map +1 -1
  14. package/dist/_virtual/index.es8.js +2 -5
  15. package/dist/_virtual/index.es8.js.map +1 -1
  16. package/dist/_virtual/index.es9.js +2 -2
  17. package/dist/api.cjs.js +1 -1
  18. package/dist/api.es.js +193 -192
  19. package/dist/node_modules/match-sorter/dist/match-sorter.esm.cjs.js +1 -1
  20. package/dist/node_modules/match-sorter/dist/match-sorter.esm.es.js +1 -1
  21. package/dist/node_modules/rehype/node_modules/unified/lib/index.cjs.js +1 -1
  22. package/dist/node_modules/rehype/node_modules/unified/lib/index.es.js +2 -2
  23. package/dist/node_modules/rehype/node_modules/vfile/lib/index.cjs.js +1 -1
  24. package/dist/node_modules/rehype/node_modules/vfile/lib/index.es.js +1 -1
  25. package/dist/node_modules/rehype-parse/lib/index.cjs.js +1 -1
  26. package/dist/node_modules/rehype-parse/lib/index.es.js +1 -1
  27. package/dist/node_modules/remove-accents/index.cjs.js +1 -1
  28. package/dist/node_modules/remove-accents/index.cjs.js.map +1 -1
  29. package/dist/node_modules/remove-accents/index.es.js +1 -1
  30. package/dist/shared/node_modules/@module-federation/error-codes/dist/index.cjs.js +1 -1
  31. package/dist/shared/node_modules/@module-federation/error-codes/dist/index.es.js +1 -1
  32. package/dist/shared/node_modules/@module-federation/runtime-core/dist/index.cjs.js +1 -1
  33. package/dist/shared/node_modules/@module-federation/runtime-core/dist/index.es.js +1 -1
  34. package/dist/shared/node_modules/@module-federation/runtime-core/dist/utils/semver/utils.cjs.js +1 -1
  35. package/dist/shared/node_modules/@module-federation/runtime-core/dist/utils/semver/utils.es.js +1 -1
  36. package/dist/shared/node_modules/@module-federation/sdk/dist/utils.cjs.js +1 -1
  37. package/dist/shared/node_modules/@module-federation/sdk/dist/utils.es.js +1 -1
  38. package/dist/shared/node_modules/prop-types/index.cjs.js +1 -1
  39. package/dist/shared/node_modules/prop-types/index.cjs.js.map +1 -1
  40. package/dist/shared/node_modules/prop-types/index.es.js +1 -1
  41. package/dist/shared/node_modules/react-is/index.cjs.js +1 -1
  42. package/dist/shared/node_modules/react-is/index.es.js +1 -1
  43. package/dist/shared/node_modules/react-transition-group/esm/CSSTransition.cjs.js +1 -1
  44. package/dist/shared/node_modules/react-transition-group/esm/CSSTransition.es.js +1 -1
  45. package/dist/shared/node_modules/react-transition-group/esm/Transition.cjs.js +1 -1
  46. package/dist/shared/node_modules/react-transition-group/esm/Transition.es.js +1 -1
  47. package/dist/shared/node_modules/react-transition-group/esm/utils/PropTypes.cjs.js +1 -1
  48. package/dist/shared/node_modules/react-transition-group/esm/utils/PropTypes.es.js +1 -1
  49. package/dist/shared/src/api/generated/graphql.cjs.js +4 -0
  50. package/dist/shared/src/api/generated/graphql.cjs.js.map +1 -1
  51. package/dist/shared/src/api/generated/graphql.es.js +4 -0
  52. package/dist/shared/src/api/generated/graphql.es.js.map +1 -1
  53. package/dist/shared/src/api/generated/graphqlLinks.cjs.js.map +1 -1
  54. package/dist/shared/src/api/generated/graphqlLinks.es.js.map +1 -1
  55. package/dist/shared/src/api/queries/entities/transformDetailsPanelData.cjs.js +1 -1
  56. package/dist/shared/src/api/queries/entities/transformDetailsPanelData.cjs.js.map +1 -1
  57. package/dist/shared/src/api/queries/entities/transformDetailsPanelData.es.js +17 -16
  58. package/dist/shared/src/api/queries/entities/transformDetailsPanelData.es.js.map +1 -1
  59. package/dist/shared/src/api/queries/entityLists/getLists.cjs.js +1 -1
  60. package/dist/shared/src/api/queries/entityLists/getLists.cjs.js.map +1 -1
  61. package/dist/shared/src/api/queries/entityLists/getLists.es.js +47 -47
  62. package/dist/shared/src/api/queries/entityLists/getLists.es.js.map +1 -1
  63. package/dist/shared/src/api/queries/folders/getFolders.cjs.js +1 -1
  64. package/dist/shared/src/api/queries/folders/getFolders.cjs.js.map +1 -1
  65. package/dist/shared/src/api/queries/folders/getFolders.es.js +20 -22
  66. package/dist/shared/src/api/queries/folders/getFolders.es.js.map +1 -1
  67. package/dist/shared/src/api/queries/overview/getOverview.cjs.js +1 -1
  68. package/dist/shared/src/api/queries/overview/getOverview.cjs.js.map +1 -1
  69. package/dist/shared/src/api/queries/overview/getOverview.es.js +92 -89
  70. package/dist/shared/src/api/queries/overview/getOverview.es.js.map +1 -1
  71. package/dist/shared/src/api/queries/project/getProject.cjs.js +1 -1
  72. package/dist/shared/src/api/queries/project/getProject.cjs.js.map +1 -1
  73. package/dist/shared/src/api/queries/project/getProject.es.js +1 -1
  74. package/dist/shared/src/api/queries/project/getProject.es.js.map +1 -1
  75. package/dist/shared/src/api/queries/users/getUsers.cjs.js +1 -1
  76. package/dist/shared/src/api/queries/users/getUsers.cjs.js.map +1 -1
  77. package/dist/shared/src/api/queries/users/getUsers.es.js +1 -1
  78. package/dist/shared/src/api/queries/users/getUsers.es.js.map +1 -1
  79. package/dist/shared/src/api/queries/versions/getVersionsProducts.cjs.js +1 -1
  80. package/dist/shared/src/api/queries/versions/getVersionsProducts.cjs.js.map +1 -1
  81. package/dist/shared/src/api/queries/versions/getVersionsProducts.es.js +23 -23
  82. package/dist/shared/src/api/queries/versions/getVersionsProducts.es.js.map +1 -1
  83. package/dist/shared/src/api/queries/versions/getVersionsProductsUtils.cjs.js +1 -1
  84. package/dist/shared/src/api/queries/versions/getVersionsProductsUtils.cjs.js.map +1 -1
  85. package/dist/shared/src/api/queries/versions/getVersionsProductsUtils.es.js +13 -13
  86. package/dist/shared/src/api/queries/versions/getVersionsProductsUtils.es.js.map +1 -1
  87. package/dist/shared/src/components/DetailsPanelAttributes/components/RenderFieldWidget.cjs.js +3 -3
  88. package/dist/shared/src/components/DetailsPanelAttributes/components/RenderFieldWidget.cjs.js.map +1 -1
  89. package/dist/shared/src/components/DetailsPanelAttributes/components/RenderFieldWidget.es.js +51 -50
  90. package/dist/shared/src/components/DetailsPanelAttributes/components/RenderFieldWidget.es.js.map +1 -1
  91. package/dist/shared/src/containers/ListTable/ListTableWidgets.cjs.js +1 -1
  92. package/dist/shared/src/containers/ListTable/ListTableWidgets.cjs.js.map +1 -1
  93. package/dist/shared/src/containers/ListTable/ListTableWidgets.es.js +62 -58
  94. package/dist/shared/src/containers/ListTable/ListTableWidgets.es.js.map +1 -1
  95. package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.cjs.js +1 -1
  96. package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.cjs.js.map +1 -1
  97. package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.es.js +21 -20
  98. package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.es.js.map +1 -1
  99. package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildGroupByTableData.cjs.js +1 -1
  100. package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildGroupByTableData.cjs.js.map +1 -1
  101. package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildGroupByTableData.es.js +25 -24
  102. package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildGroupByTableData.es.js.map +1 -1
  103. package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildProjectDataTable.cjs.js +1 -1
  104. package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildProjectDataTable.cjs.js.map +1 -1
  105. package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildProjectDataTable.es.js +20 -19
  106. package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildProjectDataTable.es.js.map +1 -1
  107. package/dist/shared/src/containers/ProjectTreeTable/hooks/useUpdateTableData.cjs.js +1 -1
  108. package/dist/shared/src/containers/ProjectTreeTable/hooks/useUpdateTableData.cjs.js.map +1 -1
  109. package/dist/shared/src/containers/ProjectTreeTable/hooks/useUpdateTableData.es.js +152 -133
  110. package/dist/shared/src/containers/ProjectTreeTable/hooks/useUpdateTableData.es.js.map +1 -1
  111. package/dist/shared/src/containers/ProjectTreeTable/widgets/CellWidget.cjs.js +2 -2
  112. package/dist/shared/src/containers/ProjectTreeTable/widgets/CellWidget.cjs.js.map +1 -1
  113. package/dist/shared/src/containers/ProjectTreeTable/widgets/CellWidget.es.js +75 -73
  114. package/dist/shared/src/containers/ProjectTreeTable/widgets/CellWidget.es.js.map +1 -1
  115. package/dist/shared/src/containers/ProjectTreeTable/widgets/DateWidget.cjs.js +1 -1
  116. package/dist/shared/src/containers/ProjectTreeTable/widgets/DateWidget.cjs.js.map +1 -1
  117. package/dist/shared/src/containers/ProjectTreeTable/widgets/DateWidget.es.js +21 -19
  118. package/dist/shared/src/containers/ProjectTreeTable/widgets/DateWidget.es.js.map +1 -1
  119. package/dist/shared/src/containers/ProjectTreeTable/widgets/DateWidgetInput.cjs.js +2 -2
  120. package/dist/shared/src/containers/ProjectTreeTable/widgets/DateWidgetInput.cjs.js.map +1 -1
  121. package/dist/shared/src/containers/ProjectTreeTable/widgets/DateWidgetInput.es.js +58 -43
  122. package/dist/shared/src/containers/ProjectTreeTable/widgets/DateWidgetInput.es.js.map +1 -1
  123. package/dist/types/api/generated/graphql.d.ts +5 -0
  124. package/dist/types/api/generated/graphqlLinks.d.ts +1 -0
  125. package/dist/types/api/queries/entities/transformDetailsPanelData.d.ts +1 -0
  126. package/dist/types/api/queries/overview/getOverview.d.ts +2 -1
  127. package/dist/types/containers/ProjectTreeTable/types/table.d.ts +3 -1
  128. package/dist/types/containers/ProjectTreeTable/widgets/CellWidget.d.ts +1 -0
  129. package/dist/types/containers/ProjectTreeTable/widgets/DateWidget.d.ts +1 -0
  130. package/dist/types/containers/ProjectTreeTable/widgets/DateWidgetInput.d.ts +1 -0
  131. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
- import { useGetEntityTypeData as P } from "./useGetEntityTypeData.es.js";
2
- import { useCallback as x } from "react";
1
+ import { useGetEntityTypeData as S } from "./useGetEntityTypeData.es.js";
2
+ import { useCallback as D } from "react";
3
3
  import "@ynput/ayon-react-components";
4
4
  import "../../../components/SearchFilter/filterDates.es.js";
5
5
  import "date-fns";
@@ -153,7 +153,7 @@ import "../../../context/AddonContext.es.js";
153
153
  import "../../../context/MenuContext.es.js";
154
154
  import "../../../context/WebsocketContext.es.js";
155
155
  import "../../../context/GlobalContext.es.js";
156
- import { useProjectContext as S } from "../../../context/ProjectContext.es.js";
156
+ import { useProjectContext as E } from "../../../context/ProjectContext.es.js";
157
157
  import "../../../context/ProjectFoldersContextInstance.es.js";
158
158
  import "../../../context/EntityUpdatesContextInstance.es.js";
159
159
  import "../../ContextMenu/ContextMenuContext.es.js";
@@ -301,9 +301,9 @@ import "../../../components/Menu/Menu.styled.es.js";
301
301
  import "../../../components/Menu/MenuItem.es.js";
302
302
  import "../../../components/ReviewablesSelector/ReviewablesSelector.es.js";
303
303
  import "../../../components/ColumnHeaderMenuUI.es.js";
304
- import { linksToTableData as E } from "../utils/linksToTableData.es.js";
304
+ import { linksToTableData as P } from "../utils/linksToTableData.es.js";
305
305
  const O = "next-page", c = "_ungrouped", _ = "__", A = (t) => t ? Array.isArray(t) ? [...new Set(t.map((p) => p.toString()))] : [t.toString()] : [], N = (t, p, a, e, m) => {
306
- const u = e?.get(p), s = a?.find((g) => g.value === p), f = s ? {
306
+ const u = e?.get(p), s = a?.find((f) => f.value === p), g = s ? {
307
307
  value: s.value,
308
308
  label: s.label || s.value,
309
309
  color: s.color,
@@ -311,8 +311,8 @@ const O = "next-page", c = "_ungrouped", _ = "__", A = (t) => t ? Array.isArray(
311
311
  count: s.count,
312
312
  img: t === "assignees" ? `/api/users/${s.value}/avatar` : void 0
313
313
  } : { value: p, label: p };
314
- return u ? (f.count = u.count, f.percentage = u.percentage) : e && m && (f.count = 0, f.percentage = void 0), f;
315
- }, T = "_GROUP_", D = (t) => `${T}${t}`, Gm = (t) => t.startsWith(T) ? t.slice(T.length) : null, Rm = (t) => t.startsWith(T), W = (t, p, a = []) => {
314
+ return u ? (g.count = u.count, g.percentage = u.percentage) : e && m && (g.count = 0, g.percentage = void 0), g;
315
+ }, T = "_GROUP_", x = (t) => `${T}${t}`, Gm = (t) => t.startsWith(T) ? t.slice(T.length) : null, Rm = (t) => t.startsWith(T), W = (t, p, a = []) => {
316
316
  const e = t.id.replace("attrib.", "");
317
317
  return e === "status" ? p?.statuses?.map((m) => m.name) || [] : e === "taskType" ? p?.taskTypes?.map((m) => m.name) || [] : e === "folderType" ? p?.folderTypes?.map((m) => m.name) || [] : t.id.startsWith("attrib.") ? a.find((m) => m.name === e)?.data.enum?.map((m) => m.value.toString()) || [] : [];
318
318
  }, $ = (t, p, a, e, m) => {
@@ -335,13 +335,14 @@ const O = "next-page", c = "_ungrouped", _ = "__", A = (t) => t ? Array.isArray(
335
335
  subRows: [],
336
336
  subType: t.taskType || null,
337
337
  attrib: t.attrib,
338
+ midnightExclusiveFields: t.data?.schedulerSyncData?.allDay ? ["attrib_endDate"] : void 0,
338
339
  ownAttrib: t.ownAttrib,
339
340
  parents: t.parents || [],
340
341
  folder: t.parents?.[t.parents.length - 1] || void 0,
341
342
  createdAt: t.createdAt,
342
343
  updatedAt: t.updatedAt,
343
344
  hasReviewables: t.hasReviewables || !1,
344
- links: E(t.links, a, {
345
+ links: P(t.links, a, {
345
346
  folderTypes: e?.folderTypes || [],
346
347
  productTypes: Object.values(e.productTypes) || [],
347
348
  taskTypes: e?.taskTypes || []
@@ -358,11 +359,11 @@ const O = "next-page", c = "_ungrouped", _ = "__", A = (t) => t ? Array.isArray(
358
359
  groupRowFunc: u,
359
360
  // for versions etc
360
361
  groupCounts: s,
361
- groupCountsComplete: f
362
+ groupCountsComplete: g
362
363
  }) => {
363
- const g = S(), I = P({ projectInfo: g }), b = x(
364
+ const f = E(), I = S({ projectInfo: f }), b = D(
364
365
  (n, l) => {
365
- const v = u ? u(n) : $(n, l, p, g, I);
366
+ const v = u ? u(n) : $(n, l, p, f, I);
366
367
  return {
367
368
  ...v,
368
369
  id: n.id + _ + l,
@@ -370,18 +371,18 @@ const O = "next-page", c = "_ungrouped", _ = "__", A = (t) => t ? Array.isArray(
370
371
  subRows: v.subRows || []
371
372
  };
372
373
  },
373
- [u, I, p, g]
374
+ [u, I, p, f]
374
375
  );
375
- return x(
376
+ return D(
376
377
  (n) => {
377
378
  const l = /* @__PURE__ */ new Map();
378
379
  for (const o of a) {
379
- const i = o.value?.toString(), r = D(i), d = N(
380
+ const i = o.value?.toString(), r = x(i), d = N(
380
381
  n.id,
381
382
  i,
382
383
  a,
383
384
  s,
384
- f
385
+ g
385
386
  );
386
387
  l.set(i, {
387
388
  id: r,
@@ -393,7 +394,7 @@ const O = "next-page", c = "_ungrouped", _ = "__", A = (t) => t ? Array.isArray(
393
394
  links: {}
394
395
  });
395
396
  }
396
- const v = D(c), G = () => {
397
+ const v = x(c), G = () => {
397
398
  let o = l.get(c);
398
399
  if (!o) {
399
400
  const i = s?.get(c);
@@ -434,8 +435,8 @@ const O = "next-page", c = "_ungrouped", _ = "__", A = (t) => t ? Array.isArray(
434
435
  if ("groups" in o && Array.isArray(o.groups)) {
435
436
  for (const r of o.groups)
436
437
  if (r.hasNextPage && l.has(r.value)) {
437
- const y = l.get(r.value);
438
- y && y.subRows?.push({
438
+ const w = l.get(r.value);
439
+ w && w.subRows?.push({
439
440
  id: `${r.value}-next-page`,
440
441
  name: "Load more tasks...",
441
442
  entityType: O,
@@ -447,15 +448,15 @@ const O = "next-page", c = "_ungrouped", _ = "__", A = (t) => t ? Array.isArray(
447
448
  }
448
449
  }
449
450
  }
450
- const R = Array.from(l.values()), h = W(n, g, e), w = n.desc ? -1 : 1;
451
+ const R = Array.from(l.values()), h = W(n, f, e), y = n.desc ? -1 : 1;
451
452
  R.sort((o, i) => {
452
453
  if (o.group?.value === c) return 1;
453
454
  if (i.group?.value === c) return -1;
454
455
  if (h.length) {
455
456
  const r = h.indexOf(o.group?.value || ""), d = h.indexOf(i.group?.value || "");
456
- return r !== -1 && d !== -1 ? (r - d) * w : r !== -1 ? -1 : d !== -1 ? 1 : (o.group?.label?.localeCompare(i.group?.label || "") || 0) * w;
457
+ return r !== -1 && d !== -1 ? (r - d) * y : r !== -1 ? -1 : d !== -1 ? 1 : (o.group?.label?.localeCompare(i.group?.label || "") || 0) * y;
457
458
  } else
458
- return (o.group?.label?.localeCompare(i.group?.label || "") || 0) * w;
459
+ return (o.group?.label?.localeCompare(i.group?.label || "") || 0) * y;
459
460
  });
460
461
  const U = R.filter(
461
462
  (o) => (o.group?.count ?? 0) > 0 || (o.subRows?.length ?? 0) > 0 || o.group?.value === c
@@ -469,9 +470,9 @@ const O = "next-page", c = "_ungrouped", _ = "__", A = (t) => t ? Array.isArray(
469
470
  e,
470
471
  m,
471
472
  s,
472
- f,
473
+ g,
473
474
  b,
474
- g
475
+ f
475
476
  ]
476
477
  );
477
478
  };
@@ -480,7 +481,7 @@ export {
480
481
  O as NEXT_PAGE_ID,
481
482
  _ as ROW_ID_SEPARATOR,
482
483
  c as UNGROUPED_VALUE,
483
- D as buildGroupId,
484
+ x as buildGroupId,
484
485
  hm as default,
485
486
  Rm as isGroupId,
486
487
  Gm as parseGroupId
@@ -1 +1 @@
1
- {"version":3,"file":"useBuildGroupByTableData.es.js","sources":["../../../../../../src/containers/ProjectTreeTable/hooks/useBuildGroupByTableData.ts"],"sourcesContent":["// based on the groupBy field we take a flat list of items and group them\n// each group is a root node with subItems as the grouped items\n// any leftover items that do not match the groupBy field are added as a separate group (\"Ungrouped\")\n\nimport type { GroupCountsMap } from '@shared/api'\nimport { EntityGroup } from '@shared/api'\nimport { TableGroupBy } from '../context'\nimport { EditorTaskNode, EntitiesMap, EntityMap, ProjectTableAttribute, TableRow } from '../types'\nimport { useGetEntityTypeData } from './useGetEntityTypeData'\nimport { useCallback } from 'react'\nimport { linksToTableData } from '../utils'\nimport { ProjectModelWithProducts, useProjectContext } from '@shared/context'\n\nexport type GroupByEntityType = 'task' | 'folder' | 'version' | 'product'\n\nexport type GroupData = {\n value: string\n label: string\n color?: string\n icon?: string\n img?: string\n count?: number\n percentage?: number\n}\n\nexport const NEXT_PAGE_ID = 'next-page'\nexport const UNGROUPED_VALUE = '_ungrouped'\nexport const ROW_ID_SEPARATOR = '__'\n\nconst valueToStringArray = (value?: any): string[] =>\n value\n ? Array.isArray(value)\n ? [...new Set(value.map((v) => v.toString()))] // dedup so an entity can't land in the same group twice (keeps row.id unique)\n : [value.toString()]\n : []\n\n// get group label, color and icon; overlay the filter-aware count + percentage\n// from groupCounts when available (falls back to the grouping endpoint count)\nconst getGroupData = (\n groupById: string,\n groupValue: string,\n groups?: EntityGroup[],\n groupCounts?: GroupCountsMap,\n groupCountsComplete?: boolean,\n): GroupData => {\n const stat = groupCounts?.get(groupValue)\n const group = groups?.find((g) => g.value === groupValue)\n\n const base: GroupData = group\n ? {\n value: group.value,\n label: group.label || group.value,\n color: group.color,\n icon: group.icon,\n count: group.count,\n img: groupById === 'assignees' ? `/api/users/${group.value}/avatar` : undefined,\n }\n : { value: groupValue, label: groupValue }\n\n if (stat) {\n base.count = stat.count\n base.percentage = stat.percentage\n } else if (groupCounts && groupCountsComplete) {\n // stats are authoritative: a named group absent from them truly has 0 matches\n base.count = 0\n base.percentage = undefined\n }\n return base\n}\n\nexport const GROUP_BY_ID = '_GROUP_'\nexport const buildGroupId = (value: string) => `${GROUP_BY_ID}${value}`\nexport const parseGroupId = (groupId: string): string | null => {\n if (!groupId.startsWith(GROUP_BY_ID)) return null\n return groupId.slice(GROUP_BY_ID.length) // +1 for the underscore\n}\nexport const isGroupId = (id: string): boolean => id.startsWith(GROUP_BY_ID)\n\ntype BuildGroupByTableProps = {\n entities: EntitiesMap\n entityType: string\n groups?: EntityGroup[]\n attribFields: ProjectTableAttribute[]\n showEmpty?: boolean\n groupRowFunc?: (node: any) => TableRow\n groupCounts?: GroupCountsMap\n groupCountsComplete?: boolean\n}\n\n// get sorting ids based on the groupBy field\nconst getSortingIds = (\n groupBy: TableGroupBy,\n project?: ProjectModelWithProducts,\n attribFields: ProjectTableAttribute[] = [],\n): string[] => {\n const attributeId = groupBy.id.replace('attrib.', '')\n\n // for status, taskType, folderType use project data order\n if (attributeId === 'status') {\n return project?.statuses?.map((s) => s.name) || []\n } else if (attributeId === 'taskType') {\n return project?.taskTypes?.map((t) => t.name) || []\n } else if (attributeId === 'folderType') {\n return project?.folderTypes?.map((f) => f.name) || []\n } else if (groupBy.id.startsWith('attrib.')) {\n // for other enum attributes, use the enum values order\n return (\n attribFields\n .find((field) => field.name === attributeId)\n ?.data.enum?.map((e) => e.value.toString()) || []\n )\n } else return []\n}\n\nconst defaultEntityToGroupRow = (\n task: EditorTaskNode,\n group: string | undefined,\n entityType: string,\n project: ProjectModelWithProducts,\n getEntityTypeData: ReturnType<typeof useGetEntityTypeData>,\n): TableRow & { subRows: TableRow[] } => {\n const typeData = getEntityTypeData(entityType, task.taskType)\n return {\n id: task.id + ROW_ID_SEPARATOR + group, // unique id for the task in the folder\n entityId: task.id,\n entityType: entityType,\n parentId: task.folderId,\n folderId: task.folderId,\n name: task.name || '',\n label: task.label || task.name || '',\n icon: typeData?.icon || null,\n color: typeData?.color || null,\n status: task.status,\n assignees: task.assignees,\n tags: task.tags,\n img: null,\n subRows: [],\n subType: task.taskType || null,\n attrib: task.attrib,\n ownAttrib: task.ownAttrib,\n parents: task.parents || [],\n folder: task.parents?.[task.parents.length - 1] || undefined,\n createdAt: task.createdAt,\n updatedAt: task.updatedAt,\n hasReviewables: task.hasReviewables || false,\n links: linksToTableData(task.links, entityType, {\n folderTypes: project?.folderTypes || [],\n productTypes: Object.values(project.productTypes) || [],\n taskTypes: project?.taskTypes || [],\n }),\n subtasks: task.subtasks || [],\n latestComments: task.latestComments || [],\n }\n}\n\nconst useBuildGroupByTableData = ({\n entities,\n entityType,\n groups = [],\n attribFields,\n showEmpty,\n groupRowFunc, // for versions etc\n groupCounts,\n groupCountsComplete,\n}: BuildGroupByTableProps) => {\n const project = useProjectContext()\n const getEntityTypeData = useGetEntityTypeData({ projectInfo: project })\n\n const entityToGroupRow = useCallback(\n (task: EditorTaskNode, group?: string): TableRow & { subRows: TableRow[] } => {\n // Use provided groupRowFunc or fall back to default\n const baseRow = groupRowFunc\n ? groupRowFunc(task)\n : defaultEntityToGroupRow(task, group, entityType, project, getEntityTypeData)\n\n // Ensure group-specific fields are set\n return {\n ...baseRow,\n id: task.id + ROW_ID_SEPARATOR + group, // unique id for the task in the group\n subRows: baseRow.subRows || [],\n }\n },\n [groupRowFunc, getEntityTypeData, entityType, project],\n )\n\n return useCallback(\n (groupBy: TableGroupBy): TableRow[] => {\n const groupsMap = new Map<string, TableRow>()\n\n for (const group of groups) {\n const groupValue = group.value?.toString() as string\n const groupId = buildGroupId(groupValue)\n const groupData = getGroupData(\n groupBy.id,\n groupValue,\n groups,\n groupCounts,\n groupCountsComplete,\n )\n groupsMap.set(groupValue, {\n id: groupId,\n name: groupValue,\n entityType: 'group',\n subRows: [],\n label: groupData.label,\n group: groupData,\n links: {},\n })\n }\n\n const ungroupedId = buildGroupId(UNGROUPED_VALUE)\n // gets the \"Ungrouped\" group, creating it if it doesn't exist\n const getUnGroupedGroup = () => {\n let ungroupedGroup = groupsMap.get(UNGROUPED_VALUE)\n if (!ungroupedGroup) {\n const stat = groupCounts?.get(UNGROUPED_VALUE)\n ungroupedGroup = {\n id: ungroupedId,\n name: 'Ungrouped',\n entityType: 'group',\n subRows: [],\n label: 'Ungrouped',\n group: {\n value: UNGROUPED_VALUE,\n label: 'Ungrouped',\n count: stat?.count,\n percentage: stat?.percentage,\n },\n links: {},\n }\n // create ungrouped group if it doesn't exist\n groupsMap.set(UNGROUPED_VALUE, ungroupedGroup)\n }\n return ungroupedGroup\n }\n\n const canHaveUngrouped =\n groupBy.id === 'tags' || groupBy.id === 'assignees' || groupBy.id.startsWith('attrib.')\n if (canHaveUngrouped) getUnGroupedGroup()\n\n for (const [, entity] of entities) {\n // if the entity is not of the specified type, skip it\n if (entity.entityType !== entityType) continue\n // add entities to specific group\n let groupValues: string[] = []\n if (groupBy.id.startsWith('attrib.')) {\n // for attribute based grouping, get the value of the attribute\n const attributeId = groupBy.id.split('.')[1]\n groupValues = valueToStringArray(entity.attrib?.[attributeId])\n } else if (groupBy.id === 'folderType' && 'folder' in entity) {\n // folderType is nested under folder for task entities (from TaskPropsFragment)\n groupValues = valueToStringArray(\n (entity as EditorTaskNode & { folder?: { folderType?: string } }).folder?.folderType,\n )\n } else {\n groupValues = valueToStringArray(entity[groupBy.id as keyof EntityMap])\n }\n\n // if there are no values, add to \"Ungrouped\" group\n if (groupValues.length === 0) {\n const ungroupedGroup = getUnGroupedGroup()\n ungroupedGroup.subRows?.push(entityToGroupRow(entity as EditorTaskNode, UNGROUPED_VALUE))\n }\n // for each group value, find it's group and add the entity to it\n // if we can't find the group, add it to \"Ungrouped\"\n for (const groupValue of groupValues) {\n const groupRow = groupsMap.get(groupValue)\n if (groupRow) {\n groupRow.subRows?.push(entityToGroupRow(entity as EditorTaskNode, groupValue))\n } else {\n const ungroupedGroup = getUnGroupedGroup()\n ungroupedGroup.subRows?.push(\n entityToGroupRow(entity as EditorTaskNode, UNGROUPED_VALUE),\n )\n }\n }\n\n // for groups metadata on entity, check if there is a next page\n if ('groups' in entity && Array.isArray(entity.groups)) {\n for (const group of entity.groups) {\n const hasNextPageGroup = group.hasNextPage\n if (hasNextPageGroup && groupsMap.has(group.value)) {\n // add a next page row to the group\n const groupRow = groupsMap.get(group.value)\n if (groupRow) {\n groupRow.subRows?.push({\n id: `${group.value}-next-page`,\n name: `Load more tasks...`,\n entityType: NEXT_PAGE_ID,\n subRows: [],\n label: `Next page for ${group.value}`,\n group: { value: group.value, label: group.value },\n links: {},\n })\n }\n }\n }\n }\n }\n\n const groupsList = Array.from(groupsMap.values())\n\n const attribSortingIds = getSortingIds(groupBy, project, attribFields)\n\n // sort the groups by their label\n // if the group is an attribute with enum values, sort by the enum values\n const sortDirection = groupBy.desc ? -1 : 1\n groupsList.sort((a, b) => {\n if (a.group?.value === UNGROUPED_VALUE) return 1 // \"Ungrouped\" should always be last\n if (b.group?.value === UNGROUPED_VALUE) return -1 // \"Ungrouped\" should always be last\n if (attribSortingIds.length) {\n // sort by index of the enum value\n const indexA = attribSortingIds.indexOf(a.group?.value || '')\n const indexB = attribSortingIds.indexOf(b.group?.value || '')\n if (indexA !== -1 && indexB !== -1) {\n return (indexA - indexB) * sortDirection\n }\n if (indexA !== -1) return -1 // a is in the enum, b is not\n if (indexB !== -1) return 1 // b is in the enum, a is not\n // if both are not in the enum, sort by label\n return (a.group?.label?.localeCompare(b.group?.label || '') || 0) * sortDirection\n } else {\n // for other groupings, sort by the group label\n return (a.group?.label?.localeCompare(b.group?.label || '') || 0) * sortDirection\n }\n })\n\n // filter out empty groups — Ungrouped has no server count, keep it reachable\n const nonEmptyGroups = groupsList.filter(\n (group) =>\n (group.group?.count ?? 0) > 0 ||\n (group.subRows?.length ?? 0) > 0 ||\n group.group?.value === UNGROUPED_VALUE,\n )\n\n return showEmpty ? groupsList : nonEmptyGroups\n },\n [\n entities,\n entityType,\n groups,\n attribFields,\n showEmpty,\n groupCounts,\n groupCountsComplete,\n entityToGroupRow,\n project,\n ],\n )\n}\n\nexport default useBuildGroupByTableData\n"],"names":["NEXT_PAGE_ID","UNGROUPED_VALUE","ROW_ID_SEPARATOR","valueToStringArray","value","v","getGroupData","groupById","groupValue","groups","groupCounts","groupCountsComplete","stat","group","base","GROUP_BY_ID","buildGroupId","parseGroupId","groupId","isGroupId","id","getSortingIds","groupBy","project","attribFields","attributeId","s","t","f","field","e","defaultEntityToGroupRow","task","entityType","getEntityTypeData","typeData","linksToTableData","useBuildGroupByTableData","entities","showEmpty","groupRowFunc","useProjectContext","useGetEntityTypeData","entityToGroupRow","useCallback","baseRow","groupsMap","groupData","ungroupedId","getUnGroupedGroup","ungroupedGroup","entity","groupValues","groupRow","groupsList","attribSortingIds","sortDirection","a","b","indexA","indexB","nonEmptyGroups"],"mappings":"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"}
1
+ {"version":3,"file":"useBuildGroupByTableData.es.js","sources":["../../../../../../src/containers/ProjectTreeTable/hooks/useBuildGroupByTableData.ts"],"sourcesContent":["// based on the groupBy field we take a flat list of items and group them\n// each group is a root node with subItems as the grouped items\n// any leftover items that do not match the groupBy field are added as a separate group (\"Ungrouped\")\n\nimport type { GroupCountsMap } from '@shared/api'\nimport { EntityGroup } from '@shared/api'\nimport { TableGroupBy } from '../context'\nimport { EditorTaskNode, EntitiesMap, EntityMap, ProjectTableAttribute, TableRow } from '../types'\nimport { useGetEntityTypeData } from './useGetEntityTypeData'\nimport { useCallback } from 'react'\nimport { linksToTableData } from '../utils'\nimport { ProjectModelWithProducts, useProjectContext } from '@shared/context'\n\nexport type GroupByEntityType = 'task' | 'folder' | 'version' | 'product'\n\nexport type GroupData = {\n value: string\n label: string\n color?: string\n icon?: string\n img?: string\n count?: number\n percentage?: number\n}\n\nexport const NEXT_PAGE_ID = 'next-page'\nexport const UNGROUPED_VALUE = '_ungrouped'\nexport const ROW_ID_SEPARATOR = '__'\n\nconst valueToStringArray = (value?: any): string[] =>\n value\n ? Array.isArray(value)\n ? [...new Set(value.map((v) => v.toString()))] // dedup so an entity can't land in the same group twice (keeps row.id unique)\n : [value.toString()]\n : []\n\n// get group label, color and icon; overlay the filter-aware count + percentage\n// from groupCounts when available (falls back to the grouping endpoint count)\nconst getGroupData = (\n groupById: string,\n groupValue: string,\n groups?: EntityGroup[],\n groupCounts?: GroupCountsMap,\n groupCountsComplete?: boolean,\n): GroupData => {\n const stat = groupCounts?.get(groupValue)\n const group = groups?.find((g) => g.value === groupValue)\n\n const base: GroupData = group\n ? {\n value: group.value,\n label: group.label || group.value,\n color: group.color,\n icon: group.icon,\n count: group.count,\n img: groupById === 'assignees' ? `/api/users/${group.value}/avatar` : undefined,\n }\n : { value: groupValue, label: groupValue }\n\n if (stat) {\n base.count = stat.count\n base.percentage = stat.percentage\n } else if (groupCounts && groupCountsComplete) {\n // stats are authoritative: a named group absent from them truly has 0 matches\n base.count = 0\n base.percentage = undefined\n }\n return base\n}\n\nexport const GROUP_BY_ID = '_GROUP_'\nexport const buildGroupId = (value: string) => `${GROUP_BY_ID}${value}`\nexport const parseGroupId = (groupId: string): string | null => {\n if (!groupId.startsWith(GROUP_BY_ID)) return null\n return groupId.slice(GROUP_BY_ID.length) // +1 for the underscore\n}\nexport const isGroupId = (id: string): boolean => id.startsWith(GROUP_BY_ID)\n\ntype BuildGroupByTableProps = {\n entities: EntitiesMap\n entityType: string\n groups?: EntityGroup[]\n attribFields: ProjectTableAttribute[]\n showEmpty?: boolean\n groupRowFunc?: (node: any) => TableRow\n groupCounts?: GroupCountsMap\n groupCountsComplete?: boolean\n}\n\n// get sorting ids based on the groupBy field\nconst getSortingIds = (\n groupBy: TableGroupBy,\n project?: ProjectModelWithProducts,\n attribFields: ProjectTableAttribute[] = [],\n): string[] => {\n const attributeId = groupBy.id.replace('attrib.', '')\n\n // for status, taskType, folderType use project data order\n if (attributeId === 'status') {\n return project?.statuses?.map((s) => s.name) || []\n } else if (attributeId === 'taskType') {\n return project?.taskTypes?.map((t) => t.name) || []\n } else if (attributeId === 'folderType') {\n return project?.folderTypes?.map((f) => f.name) || []\n } else if (groupBy.id.startsWith('attrib.')) {\n // for other enum attributes, use the enum values order\n return (\n attribFields\n .find((field) => field.name === attributeId)\n ?.data.enum?.map((e) => e.value.toString()) || []\n )\n } else return []\n}\n\nconst defaultEntityToGroupRow = (\n task: EditorTaskNode,\n group: string | undefined,\n entityType: string,\n project: ProjectModelWithProducts,\n getEntityTypeData: ReturnType<typeof useGetEntityTypeData>,\n): TableRow & { subRows: TableRow[] } => {\n const typeData = getEntityTypeData(entityType, task.taskType)\n return {\n id: task.id + ROW_ID_SEPARATOR + group, // unique id for the task in the folder\n entityId: task.id,\n entityType: entityType,\n parentId: task.folderId,\n folderId: task.folderId,\n name: task.name || '',\n label: task.label || task.name || '',\n icon: typeData?.icon || null,\n color: typeData?.color || null,\n status: task.status,\n assignees: task.assignees,\n tags: task.tags,\n img: null,\n subRows: [],\n subType: task.taskType || null,\n attrib: task.attrib,\n midnightExclusiveFields: task.data?.schedulerSyncData?.allDay ? ['attrib_endDate'] : undefined,\n ownAttrib: task.ownAttrib,\n parents: task.parents || [],\n folder: task.parents?.[task.parents.length - 1] || undefined,\n createdAt: task.createdAt,\n updatedAt: task.updatedAt,\n hasReviewables: task.hasReviewables || false,\n links: linksToTableData(task.links, entityType, {\n folderTypes: project?.folderTypes || [],\n productTypes: Object.values(project.productTypes) || [],\n taskTypes: project?.taskTypes || [],\n }),\n subtasks: task.subtasks || [],\n latestComments: task.latestComments || [],\n }\n}\n\nconst useBuildGroupByTableData = ({\n entities,\n entityType,\n groups = [],\n attribFields,\n showEmpty,\n groupRowFunc, // for versions etc\n groupCounts,\n groupCountsComplete,\n}: BuildGroupByTableProps) => {\n const project = useProjectContext()\n const getEntityTypeData = useGetEntityTypeData({ projectInfo: project })\n\n const entityToGroupRow = useCallback(\n (task: EditorTaskNode, group?: string): TableRow & { subRows: TableRow[] } => {\n // Use provided groupRowFunc or fall back to default\n const baseRow = groupRowFunc\n ? groupRowFunc(task)\n : defaultEntityToGroupRow(task, group, entityType, project, getEntityTypeData)\n\n // Ensure group-specific fields are set\n return {\n ...baseRow,\n id: task.id + ROW_ID_SEPARATOR + group, // unique id for the task in the group\n subRows: baseRow.subRows || [],\n }\n },\n [groupRowFunc, getEntityTypeData, entityType, project],\n )\n\n return useCallback(\n (groupBy: TableGroupBy): TableRow[] => {\n const groupsMap = new Map<string, TableRow>()\n\n for (const group of groups) {\n const groupValue = group.value?.toString() as string\n const groupId = buildGroupId(groupValue)\n const groupData = getGroupData(\n groupBy.id,\n groupValue,\n groups,\n groupCounts,\n groupCountsComplete,\n )\n groupsMap.set(groupValue, {\n id: groupId,\n name: groupValue,\n entityType: 'group',\n subRows: [],\n label: groupData.label,\n group: groupData,\n links: {},\n })\n }\n\n const ungroupedId = buildGroupId(UNGROUPED_VALUE)\n // gets the \"Ungrouped\" group, creating it if it doesn't exist\n const getUnGroupedGroup = () => {\n let ungroupedGroup = groupsMap.get(UNGROUPED_VALUE)\n if (!ungroupedGroup) {\n const stat = groupCounts?.get(UNGROUPED_VALUE)\n ungroupedGroup = {\n id: ungroupedId,\n name: 'Ungrouped',\n entityType: 'group',\n subRows: [],\n label: 'Ungrouped',\n group: {\n value: UNGROUPED_VALUE,\n label: 'Ungrouped',\n count: stat?.count,\n percentage: stat?.percentage,\n },\n links: {},\n }\n // create ungrouped group if it doesn't exist\n groupsMap.set(UNGROUPED_VALUE, ungroupedGroup)\n }\n return ungroupedGroup\n }\n\n const canHaveUngrouped =\n groupBy.id === 'tags' || groupBy.id === 'assignees' || groupBy.id.startsWith('attrib.')\n if (canHaveUngrouped) getUnGroupedGroup()\n\n for (const [, entity] of entities) {\n // if the entity is not of the specified type, skip it\n if (entity.entityType !== entityType) continue\n // add entities to specific group\n let groupValues: string[] = []\n if (groupBy.id.startsWith('attrib.')) {\n // for attribute based grouping, get the value of the attribute\n const attributeId = groupBy.id.split('.')[1]\n groupValues = valueToStringArray(entity.attrib?.[attributeId])\n } else if (groupBy.id === 'folderType' && 'folder' in entity) {\n // folderType is nested under folder for task entities (from TaskPropsFragment)\n groupValues = valueToStringArray(\n (entity as EditorTaskNode & { folder?: { folderType?: string } }).folder?.folderType,\n )\n } else {\n groupValues = valueToStringArray(entity[groupBy.id as keyof EntityMap])\n }\n\n // if there are no values, add to \"Ungrouped\" group\n if (groupValues.length === 0) {\n const ungroupedGroup = getUnGroupedGroup()\n ungroupedGroup.subRows?.push(entityToGroupRow(entity as EditorTaskNode, UNGROUPED_VALUE))\n }\n // for each group value, find it's group and add the entity to it\n // if we can't find the group, add it to \"Ungrouped\"\n for (const groupValue of groupValues) {\n const groupRow = groupsMap.get(groupValue)\n if (groupRow) {\n groupRow.subRows?.push(entityToGroupRow(entity as EditorTaskNode, groupValue))\n } else {\n const ungroupedGroup = getUnGroupedGroup()\n ungroupedGroup.subRows?.push(\n entityToGroupRow(entity as EditorTaskNode, UNGROUPED_VALUE),\n )\n }\n }\n\n // for groups metadata on entity, check if there is a next page\n if ('groups' in entity && Array.isArray(entity.groups)) {\n for (const group of entity.groups) {\n const hasNextPageGroup = group.hasNextPage\n if (hasNextPageGroup && groupsMap.has(group.value)) {\n // add a next page row to the group\n const groupRow = groupsMap.get(group.value)\n if (groupRow) {\n groupRow.subRows?.push({\n id: `${group.value}-next-page`,\n name: `Load more tasks...`,\n entityType: NEXT_PAGE_ID,\n subRows: [],\n label: `Next page for ${group.value}`,\n group: { value: group.value, label: group.value },\n links: {},\n })\n }\n }\n }\n }\n }\n\n const groupsList = Array.from(groupsMap.values())\n\n const attribSortingIds = getSortingIds(groupBy, project, attribFields)\n\n // sort the groups by their label\n // if the group is an attribute with enum values, sort by the enum values\n const sortDirection = groupBy.desc ? -1 : 1\n groupsList.sort((a, b) => {\n if (a.group?.value === UNGROUPED_VALUE) return 1 // \"Ungrouped\" should always be last\n if (b.group?.value === UNGROUPED_VALUE) return -1 // \"Ungrouped\" should always be last\n if (attribSortingIds.length) {\n // sort by index of the enum value\n const indexA = attribSortingIds.indexOf(a.group?.value || '')\n const indexB = attribSortingIds.indexOf(b.group?.value || '')\n if (indexA !== -1 && indexB !== -1) {\n return (indexA - indexB) * sortDirection\n }\n if (indexA !== -1) return -1 // a is in the enum, b is not\n if (indexB !== -1) return 1 // b is in the enum, a is not\n // if both are not in the enum, sort by label\n return (a.group?.label?.localeCompare(b.group?.label || '') || 0) * sortDirection\n } else {\n // for other groupings, sort by the group label\n return (a.group?.label?.localeCompare(b.group?.label || '') || 0) * sortDirection\n }\n })\n\n // filter out empty groups — Ungrouped has no server count, keep it reachable\n const nonEmptyGroups = groupsList.filter(\n (group) =>\n (group.group?.count ?? 0) > 0 ||\n (group.subRows?.length ?? 0) > 0 ||\n group.group?.value === UNGROUPED_VALUE,\n )\n\n return showEmpty ? groupsList : nonEmptyGroups\n },\n [\n entities,\n entityType,\n groups,\n attribFields,\n showEmpty,\n groupCounts,\n groupCountsComplete,\n entityToGroupRow,\n project,\n ],\n )\n}\n\nexport default useBuildGroupByTableData\n"],"names":["NEXT_PAGE_ID","UNGROUPED_VALUE","ROW_ID_SEPARATOR","valueToStringArray","value","v","getGroupData","groupById","groupValue","groups","groupCounts","groupCountsComplete","stat","group","g","base","GROUP_BY_ID","buildGroupId","parseGroupId","groupId","isGroupId","id","getSortingIds","groupBy","project","attribFields","attributeId","s","t","f","field","e","defaultEntityToGroupRow","task","entityType","getEntityTypeData","typeData","linksToTableData","useBuildGroupByTableData","entities","showEmpty","groupRowFunc","useProjectContext","useGetEntityTypeData","entityToGroupRow","useCallback","baseRow","groupsMap","groupData","ungroupedId","getUnGroupedGroup","ungroupedGroup","entity","groupValues","groupRow","groupsList","attribSortingIds","sortDirection","a","b","indexA","indexB","nonEmptyGroups"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyBO,MAAMA,IAAe,aACfC,IAAkB,cAClBC,IAAmB,MAE1BC,IAAqB,CAACC,MAC1BA,IACI,MAAM,QAAQA,CAAK,IACjB,CAAC,GAAG,IAAI,IAAIA,EAAM,IAAI,CAACC,MAAMA,EAAE,SAAA,CAAU,CAAC,CAAC,IAC3C,CAACD,EAAM,SAAA,CAAU,IACnB,CAAA,GAIAE,IAAe,CACnBC,GACAC,GACAC,GACAC,GACAC,MACc;AACd,QAAMC,IAAOF,GAAa,IAAIF,CAAU,GAClCK,IAAQJ,GAAQ,KAAK,CAACK,MAAMA,EAAE,UAAUN,CAAU,GAElDO,IAAkBF,IACpB;AAAA,IACE,OAAOA,EAAM;AAAA,IACb,OAAOA,EAAM,SAASA,EAAM;AAAA,IAC5B,OAAOA,EAAM;AAAA,IACb,MAAMA,EAAM;AAAA,IACZ,OAAOA,EAAM;AAAA,IACb,KAAKN,MAAc,cAAc,cAAcM,EAAM,KAAK,YAAY;AAAA,EAAA,IAExE,EAAE,OAAOL,GAAY,OAAOA,EAAA;AAEhC,SAAII,KACFG,EAAK,QAAQH,EAAK,OAClBG,EAAK,aAAaH,EAAK,cACdF,KAAeC,MAExBI,EAAK,QAAQ,GACbA,EAAK,aAAa,SAEbA;AACT,GAEaC,IAAc,WACdC,IAAe,CAACb,MAAkB,GAAGY,CAAW,GAAGZ,CAAK,IACxDc,KAAe,CAACC,MACtBA,EAAQ,WAAWH,CAAW,IAC5BG,EAAQ,MAAMH,EAAY,MAAM,IADM,MAGlCI,KAAY,CAACC,MAAwBA,EAAG,WAAWL,CAAW,GAcrEM,IAAgB,CACpBC,GACAC,GACAC,IAAwC,CAAA,MAC3B;AACb,QAAMC,IAAcH,EAAQ,GAAG,QAAQ,WAAW,EAAE;AAGpD,SAAIG,MAAgB,WACXF,GAAS,UAAU,IAAI,CAACG,MAAMA,EAAE,IAAI,KAAK,CAAA,IACvCD,MAAgB,aAClBF,GAAS,WAAW,IAAI,CAACI,MAAMA,EAAE,IAAI,KAAK,CAAA,IACxCF,MAAgB,eAClBF,GAAS,aAAa,IAAI,CAACK,MAAMA,EAAE,IAAI,KAAK,CAAA,IAC1CN,EAAQ,GAAG,WAAW,SAAS,IAGtCE,EACG,KAAK,CAACK,MAAUA,EAAM,SAASJ,CAAW,GACzC,KAAK,MAAM,IAAI,CAACK,MAAMA,EAAE,MAAM,SAAA,CAAU,KAAK,CAAA,IAEvC,CAAA;AAChB,GAEMC,IAA0B,CAC9BC,GACApB,GACAqB,GACAV,GACAW,MACuC;AACvC,QAAMC,IAAWD,EAAkBD,GAAYD,EAAK,QAAQ;AAC5D,SAAO;AAAA,IACL,IAAIA,EAAK,KAAK/B,IAAmBW;AAAA;AAAA,IACjC,UAAUoB,EAAK;AAAA,IACf,YAAAC;AAAA,IACA,UAAUD,EAAK;AAAA,IACf,UAAUA,EAAK;AAAA,IACf,MAAMA,EAAK,QAAQ;AAAA,IACnB,OAAOA,EAAK,SAASA,EAAK,QAAQ;AAAA,IAClC,MAAMG,GAAU,QAAQ;AAAA,IACxB,OAAOA,GAAU,SAAS;AAAA,IAC1B,QAAQH,EAAK;AAAA,IACb,WAAWA,EAAK;AAAA,IAChB,MAAMA,EAAK;AAAA,IACX,KAAK;AAAA,IACL,SAAS,CAAA;AAAA,IACT,SAASA,EAAK,YAAY;AAAA,IAC1B,QAAQA,EAAK;AAAA,IACb,yBAAyBA,EAAK,MAAM,mBAAmB,SAAS,CAAC,gBAAgB,IAAI;AAAA,IACrF,WAAWA,EAAK;AAAA,IAChB,SAASA,EAAK,WAAW,CAAA;AAAA,IACzB,QAAQA,EAAK,UAAUA,EAAK,QAAQ,SAAS,CAAC,KAAK;AAAA,IACnD,WAAWA,EAAK;AAAA,IAChB,WAAWA,EAAK;AAAA,IAChB,gBAAgBA,EAAK,kBAAkB;AAAA,IACvC,OAAOI,EAAiBJ,EAAK,OAAOC,GAAY;AAAA,MAC9C,aAAaV,GAAS,eAAe,CAAA;AAAA,MACrC,cAAc,OAAO,OAAOA,EAAQ,YAAY,KAAK,CAAA;AAAA,MACrD,WAAWA,GAAS,aAAa,CAAA;AAAA,IAAC,CACnC;AAAA,IACD,UAAUS,EAAK,YAAY,CAAA;AAAA,IAC3B,gBAAgBA,EAAK,kBAAkB,CAAA;AAAA,EAAC;AAE5C,GAEMK,KAA2B,CAAC;AAAA,EAChC,UAAAC;AAAA,EACA,YAAAL;AAAA,EACA,QAAAzB,IAAS,CAAA;AAAA,EACT,cAAAgB;AAAA,EACA,WAAAe;AAAA,EACA,cAAAC;AAAA;AAAA,EACA,aAAA/B;AAAA,EACA,qBAAAC;AACF,MAA8B;AAC5B,QAAMa,IAAUkB,EAAA,GACVP,IAAoBQ,EAAqB,EAAE,aAAanB,GAAS,GAEjEoB,IAAmBC;AAAA,IACvB,CAACZ,GAAsBpB,MAAuD;AAE5E,YAAMiC,IAAUL,IACZA,EAAaR,CAAI,IACjBD,EAAwBC,GAAMpB,GAAOqB,GAAYV,GAASW,CAAiB;AAG/E,aAAO;AAAA,QACL,GAAGW;AAAA,QACH,IAAIb,EAAK,KAAK/B,IAAmBW;AAAA;AAAA,QACjC,SAASiC,EAAQ,WAAW,CAAA;AAAA,MAAC;AAAA,IAEjC;AAAA,IACA,CAACL,GAAcN,GAAmBD,GAAYV,CAAO;AAAA,EAAA;AAGvD,SAAOqB;AAAA,IACL,CAACtB,MAAsC;AACrC,YAAMwB,wBAAgB,IAAA;AAEtB,iBAAWlC,KAASJ,GAAQ;AAC1B,cAAMD,IAAaK,EAAM,OAAO,SAAA,GAC1BM,IAAUF,EAAaT,CAAU,GACjCwC,IAAY1C;AAAA,UAChBiB,EAAQ;AAAA,UACRf;AAAA,UACAC;AAAA,UACAC;AAAA,UACAC;AAAA,QAAA;AAEF,QAAAoC,EAAU,IAAIvC,GAAY;AAAA,UACxB,IAAIW;AAAA,UACJ,MAAMX;AAAA,UACN,YAAY;AAAA,UACZ,SAAS,CAAA;AAAA,UACT,OAAOwC,EAAU;AAAA,UACjB,OAAOA;AAAA,UACP,OAAO,CAAA;AAAA,QAAC,CACT;AAAA,MACH;AAEA,YAAMC,IAAchC,EAAahB,CAAe,GAE1CiD,IAAoB,MAAM;AAC9B,YAAIC,IAAiBJ,EAAU,IAAI9C,CAAe;AAClD,YAAI,CAACkD,GAAgB;AACnB,gBAAMvC,IAAOF,GAAa,IAAIT,CAAe;AAC7C,UAAAkD,IAAiB;AAAA,YACf,IAAIF;AAAA,YACJ,MAAM;AAAA,YACN,YAAY;AAAA,YACZ,SAAS,CAAA;AAAA,YACT,OAAO;AAAA,YACP,OAAO;AAAA,cACL,OAAOhD;AAAA,cACP,OAAO;AAAA,cACP,OAAOW,GAAM;AAAA,cACb,YAAYA,GAAM;AAAA,YAAA;AAAA,YAEpB,OAAO,CAAA;AAAA,UAAC,GAGVmC,EAAU,IAAI9C,GAAiBkD,CAAc;AAAA,QAC/C;AACA,eAAOA;AAAA,MACT;AAIA,OADE5B,EAAQ,OAAO,UAAUA,EAAQ,OAAO,eAAeA,EAAQ,GAAG,WAAW,SAAS,MAClE2B,EAAA;AAEtB,iBAAW,CAAA,EAAGE,CAAM,KAAKb,GAAU;AAEjC,YAAIa,EAAO,eAAelB,EAAY;AAEtC,YAAImB,IAAwB,CAAA;AAC5B,YAAI9B,EAAQ,GAAG,WAAW,SAAS,GAAG;AAEpC,gBAAMG,IAAcH,EAAQ,GAAG,MAAM,GAAG,EAAE,CAAC;AAC3C,UAAA8B,IAAclD,EAAmBiD,EAAO,SAAS1B,CAAW,CAAC;AAAA,QAC/D,MAAA,CAAWH,EAAQ,OAAO,gBAAgB,YAAY6B,IAEpDC,IAAclD;AAAA,UACXiD,EAAiE,QAAQ;AAAA,QAAA,IAG5EC,IAAclD,EAAmBiD,EAAO7B,EAAQ,EAAqB,CAAC;AAIxE,QAAI8B,EAAY,WAAW,KACFH,EAAA,EACR,SAAS,KAAKN,EAAiBQ,GAA0BnD,CAAe,CAAC;AAI1F,mBAAWO,KAAc6C,GAAa;AACpC,gBAAMC,IAAWP,EAAU,IAAIvC,CAAU;AACzC,UAAI8C,IACFA,EAAS,SAAS,KAAKV,EAAiBQ,GAA0B5C,CAAU,CAAC,IAEtD0C,EAAA,EACR,SAAS;AAAA,YACtBN,EAAiBQ,GAA0BnD,CAAe;AAAA,UAAA;AAAA,QAGhE;AAGA,YAAI,YAAYmD,KAAU,MAAM,QAAQA,EAAO,MAAM;AACnD,qBAAWvC,KAASuC,EAAO;AAEzB,gBADyBvC,EAAM,eACPkC,EAAU,IAAIlC,EAAM,KAAK,GAAG;AAElD,oBAAMyC,IAAWP,EAAU,IAAIlC,EAAM,KAAK;AAC1C,cAAIyC,KACFA,EAAS,SAAS,KAAK;AAAA,gBACrB,IAAI,GAAGzC,EAAM,KAAK;AAAA,gBAClB,MAAM;AAAA,gBACN,YAAYb;AAAA,gBACZ,SAAS,CAAA;AAAA,gBACT,OAAO,iBAAiBa,EAAM,KAAK;AAAA,gBACnC,OAAO,EAAE,OAAOA,EAAM,OAAO,OAAOA,EAAM,MAAA;AAAA,gBAC1C,OAAO,CAAA;AAAA,cAAC,CACT;AAAA,YAEL;AAAA;AAAA,MAGN;AAEA,YAAM0C,IAAa,MAAM,KAAKR,EAAU,QAAQ,GAE1CS,IAAmBlC,EAAcC,GAASC,GAASC,CAAY,GAI/DgC,IAAgBlC,EAAQ,OAAO,KAAK;AAC1C,MAAAgC,EAAW,KAAK,CAACG,GAAGC,MAAM;AACxB,YAAID,EAAE,OAAO,UAAUzD,EAAiB,QAAO;AAC/C,YAAI0D,EAAE,OAAO,UAAU1D,EAAiB,QAAO;AAC/C,YAAIuD,EAAiB,QAAQ;AAE3B,gBAAMI,IAASJ,EAAiB,QAAQE,EAAE,OAAO,SAAS,EAAE,GACtDG,IAASL,EAAiB,QAAQG,EAAE,OAAO,SAAS,EAAE;AAC5D,iBAAIC,MAAW,MAAMC,MAAW,MACtBD,IAASC,KAAUJ,IAEzBG,MAAW,KAAW,KACtBC,MAAW,KAAW,KAElBH,EAAE,OAAO,OAAO,cAAcC,EAAE,OAAO,SAAS,EAAE,KAAK,KAAKF;AAAA,QACtE;AAEE,kBAAQC,EAAE,OAAO,OAAO,cAAcC,EAAE,OAAO,SAAS,EAAE,KAAK,KAAKF;AAAA,MAExE,CAAC;AAGD,YAAMK,IAAiBP,EAAW;AAAA,QAChC,CAAC1C,OACEA,EAAM,OAAO,SAAS,KAAK,MAC3BA,EAAM,SAAS,UAAU,KAAK,KAC/BA,EAAM,OAAO,UAAUZ;AAAA,MAAA;AAG3B,aAAOuC,IAAYe,IAAaO;AAAA,IAClC;AAAA,IACA;AAAA,MACEvB;AAAA,MACAL;AAAA,MACAzB;AAAA,MACAgB;AAAA,MACAe;AAAA,MACA9B;AAAA,MACAC;AAAA,MACAiC;AAAA,MACApB;AAAA,IAAA;AAAA,EACF;AAEJ;"}
@@ -1,2 +1,2 @@
1
- "use strict";const w=require("react"),I=require("../utils/loadingUtils.cjs.js"),_=require("./useGetEntityTypeData.cjs.js");require("@ynput/ayon-react-components");require("../../../components/SearchFilter/filterDates.cjs.js");require("date-fns");require("react-toastify");require("lodash");require("uuid");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");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");require("../../../util/pubsub.cjs.js");require("../../../../../_virtual/jsx-runtime.cjs.js");require("clsx");require("../../Feed/components/ActivityCheckbox/ActivityCheckbox.styled.cjs.js");require("../../../components/AddonLoadingScreen/AddonLoadingScreen.cjs.js");require("../../../../../node_modules/match-sorter/dist/match-sorter.esm.cjs.js");require("../../../components/AccessSearchInput/AccessSearchInput.styled.cjs.js");require("../../../components/AccessUser/AccessUser.cjs.js");require("../../../components/AttributeEditor/AttributeEditor.cjs.js");require("../../../components/AttributeEditor/attributeTypeMap.cjs.js");require("../../../components/Badge/Badge.cjs.js");require("../../../components/Chips/Chips.cjs.js");require("react-dom");require("../../../components/DateRangePicker/DateRangePicker.styled.cjs.js");require("../../../components/LinksManager/CellEditingDialog.cjs.js");require("../../../components/DeleteEntitiesConfirm/DeleteConfirmContent.cjs.js");require("../../../components/DeleteEntitiesConfirm/DeleteEntitiesConfirmDialog.styled.cjs.js");require("../../../../../_virtual/index.cjs.js");require("../../../../../node_modules/refractor/lib/common.cjs.js");require("../../../../../node_modules/refractor/lib/all.cjs.js");;/* empty css */require("../../../components/DetailsPanelAttributes/DetailsPanelAttributesEditor.cjs.js");require("../../../components/DetailsPanelDetails/DetailsPanelDetails.cjs.js");require("react-quill-ayon");require("../../../components/DetailsPanelDetails/BorderedSection.cjs.js");require("../../../components/QuillListStyles/QuillListStyles.cjs.js");require("../../../components/DetailsPanelDetails/DescriptionSection.styles.cjs.js");require("react-markdown");require("remark-gfm");require("rehype-raw");require("../../Feed/components/CommentInput/quillToMarkdown.cjs.js");require("../../../components/DetailsPanelDetails/hooks/useMentionSystem.cjs.js");require("../../Feed/components/CommentInput/modules/index.cjs.js");require("../../../context/RemoteModulesContext.cjs.js");require("../../../../../_virtual/runtime.cjs.js");require("../../../../../_virtual/semver.cjs.js");require("../../../context/PowerpackContextInstance.cjs.js");require("../../../context/UriContext.cjs.js");require("../../../context/DetailsPanelContextInstance.cjs.js");require("../../../context/SubtasksModulesContextInstance.cjs.js");require("../../../context/ThumbnailUploaderContext.cjs.js");require("../../../context/SettingsPanelContext.cjs.js");require("../../../context/pip/PiPProvider.cjs.js");require("../../../context/pip/PiPWrapper.cjs.js");require("../../../context/AddonProjectContext.cjs.js");require("../../../context/AddonContext.cjs.js");require("../../../context/MenuContext.cjs.js");require("../../../context/WebsocketContext.cjs.js");require("../../../context/GlobalContext.cjs.js");const U=require("../../../context/ProjectContext.cjs.js");require("../../../context/ProjectFoldersContextInstance.cjs.js");require("../../../context/EntityUpdatesContextInstance.cjs.js");require("../../ContextMenu/ContextMenuContext.cjs.js");;/* empty css */require("../../Feed/context/FeedContext.cjs.js");require("../../Feed/components/Tooltips/UserTooltipItem.cjs.js");require("../../Feed/components/Tooltips/UserTooltip/UserTooltip.styled.cjs.js");require("../../Feed/components/Tooltips/TeamTooltip/TeamTooltip.styled.cjs.js");require("../../Feed/components/Tooltips/EntityTooltip/EntityTooltip.styled.cjs.js");require("../../Feed/components/FileUploadPreview/FileUploadPreview.styled.cjs.js");require("../../Feed/components/FileUploadPreview/Mimes/TextMime.cjs.js");require("remark-emoji");require("remark-directive");require("remark-directive-rehype");require("../../Feed/components/CommentInput/CommentInput.cjs.js");require("../../Feed/components/ReactionContainer/Reactions.styled.cjs.js");require("../../Feed/components/FilesGrid/FilesGrid.styled.cjs.js");require("../../Feed/components/FileUploadCard/FileUploadCard.styled.cjs.js");require("../../Feed/components/ActivityComment/ActivityComment.styled.cjs.js");require("../../Feed/components/ActivityStatus/ActivityStatus.cjs.js");require("../../Feed/components/ActivityHeader/ActivityHeader.styled.cjs.js");require("../../Feed/components/ActivityReference/ActivityReference.styled.cjs.js");require("../../Feed/components/ActivityDate.cjs.js");require("../../Feed/components/ActivityVersionReview/ActivityVersionReview.styled.cjs.js");require("../../Feed/components/ActivityCategorySelect/ActivityCategorySelect.cjs.js");require("../../Feed/components/ActivityCategorySelect/CategoryDropdownItem.cjs.js");require("../../Feed/components/ActivityCategorySelect/CategoryTag.cjs.js");require("../../Feed/components/ActivityFieldChange/ActivityFieldChange.styled.cjs.js");require("../../Feed/components/ActivityFieldChange/FieldValue.cjs.js");require("../../Feed/components/ActivityAssigneeChange/ActivityAssigneeChange.styled.cjs.js");require("../../Feed/components/ActivityVersions/ActivityVersions.styled.cjs.js");require("../../Feed/components/ActivityGroup/ActivityGroup.styled.cjs.js");require("../../Feed/Feed.styled.cjs.js");require("../../../components/EmptyPlaceholder/EmptyPlaceholder.cjs.js");require("../../../components/EmptyPlaceholder/EmptyPlaceholderFlex.styled.cjs.js");require("../../Feed/components/FeedSearchFilter.cjs.js");require("@tanstack/react-virtual");require("@tanstack/react-table");require("../widgets/CollapsedWidget.cjs.js");require("../widgets/DateWidget.cjs.js");require("../widgets/EnumWidget.cjs.js");require("../widgets/EnumCellValue.cjs.js");require("../widgets/TextWidget.cjs.js");require("../widgets/MarkdownWidget.cjs.js");require("../widgets/BooleanWidget.cjs.js");require("../widgets/CellWidget.cjs.js");require("../widgets/EntityNameWidget.cjs.js");require("../widgets/GroupHeaderWidget.cjs.js");require("../widgets/ThumbnailWidget.cjs.js");require("../widgets/LinksWidget.cjs.js");require("../../../components/LinksManager/LinksManager.styled.cjs.js");require("../context/ColumnSettingsContext.cjs.js");require("../context/ProjectTableContextInstance.cjs.js");require("../widgets/EmptyWidget.cjs.js");require("../widgets/ErrorWidget.cjs.js");require("../ProjectTreeTable.styled.cjs.js");require("../components/SelectionCell.cjs.js");require("../components/RowSelectionHeader.cjs.js");require("../widgets/LoadMoreWidget.cjs.js");require("../components/HeaderActionButton.cjs.js");require("../context/ProjectTableQueriesContext.cjs.js");require("../context/ClipboardContext.cjs.js");require("../context/SelectionCellsContext.cjs.js");require("../context/ProjectDataContextInstance.cjs.js");require("../context/CellEditingContext.cjs.js");require("../../NewEntity/components/NewEntity.cjs.js");require("../../Slicer/components/Slicer.cjs.js");require("../../Slicer/context/SlicerContextInstance.cjs.js");require("../../Slicer/components/SlicerDropdownFallback.cjs.js");require("../../Slicer/hooks/useTableDataBySlice.cjs.js");require("react-redux");require("../../NewEntity/context/NewEntityContextInstance.cjs.js");require("../../NewEntity/components/NewEntityForm.cjs.js");require("@dnd-kit/core");require("@dnd-kit/sortable");require("../components/TableFooterRow.cjs.js");require("../context/SelectedRowsContext.cjs.js");require("../context/DetailsPanelEntityContext.cjs.js");require("../../DetailsPanel/DetailsPanel.styled.cjs.js");require("../../DetailsPanel/components/DetailsPanelTabs/DetailsPanelTabs.styled.cjs.js");require("../../DetailsPanel/components/DetailsPanelHeader/LinkedTaskRow.styled.cjs.js");require("../../DetailsPanel/components/DetailsPanelHeader/DetailsPanelHeader.styled.cjs.js");require("../../../components/PlayableIcon/PlayableIcon.cjs.js");require("../../DetailsPanel/components/DetailsPanelFiles/DetailsPanelFiles.cjs.js");require("../../DetailsPanel/components/DetailsPanelMoreMenu/components/ShareDialog.cjs.js");require("../../DetailsPanel/components/TabHeaderAndFilters/TabHeaderAndFilters.styled.cjs.js");require("../../DetailsPanel/components/SubtasksSearchFilter/SubtasksSearchFilter.cjs.js");require("../../DetailsPanel/components/DetailsPanelSlideOut/DetailsPanelSlideOut.styled.cjs.js");require("../../DetailsPanel/components/DetailsPanelFloating/DetailsPanelFloating.styled.cjs.js");require("../../Actions/Actions.styled.cjs.js");require("../../Actions/ActionsDropdown/ActionsDropdown.cjs.js");require("../../Actions/ActionIcon.cjs.js");require("../../Views/ViewsMenu/ViewsMenu.cjs.js");require("../../Views/context/ViewsContextInstance.cjs.js");require("../../Views/Views.styled.cjs.js");require("../../Views/ViewsMenuContainer/ViewsMenuContainer.cjs.js");require("../../EntityPickerDialog/EntityPickerDialog.cjs.js");require("../../ListTable/ListTableRow.cjs.js");require("../../ListTable/ListTable.styled.cjs.js");require("../../../context/DeleteEntitiesContext.cjs.js");require("custom-protocol-check");require("../components/GroupSettingsFallback.cjs.js");require("../../../components/DetailsPanelDetails/DetailsSection.cjs.js");require("../../../components/DetailsPanelDetails/FieldLabel.cjs.js");require("../../../components/DoneCheckbox/DoneCheckbox.cjs.js");require("../../../components/EarlyPreview/EarlyPreview.cjs.js");require("../../../components/InfoMessage/InfoMessage.cjs.js");require("../../../components/EnumEditor/EnumEditor.styled.cjs.js");require("../../../components/EntityPanelUploader/EntityPanelUploader.styled.cjs.js");require("axios");require("../../../components/ReviewablesList/ReviewablesList.styled.cjs.js");require("../../../components/ReviewablesList/ReviewablesUpload.styled.cjs.js");require("../../../components/EntityPath/EntityPath.styled.cjs.js");require("../../../components/EntityPath/SegmentProvider.cjs.js");require("../../../components/FeaturedVersionOrder/FeaturedVersionOrder.cjs.js");require("../../../components/Feedback/FeedbackContextInstance.cjs.js");require("../../../components/Feedback/SupportBubble.cjs.js");require("../../../components/FileThumbnail/FileThumbnail.cjs.js");require("../../../components/LegacyBadge/LegacyBadge.cjs.js");require("../../../components/Powerpack/PowerpackButton.cjs.js");require("../../../components/Powerpack/FreeTrialLink.cjs.js");require("../../../components/Powerpack/PowerpackDialog.styled.cjs.js");require("../../../components/Powerpack/CTAButton.cjs.js");require("../../../components/Powerpack/RequiredAddonVersion.cjs.js");require("../../../components/ProjectTableSettings/ProjectTableSettings.cjs.js");require("../../../components/SizeSlider/SizeSlider.cjs.js");require("react-router-dom");require("../../../components/ReviewableCard/ReviewableCard.cjs.js");require("../../../components/ReviewableProgressCard/ReviewableProgressCard.styled.cjs.js");require("../../../components/SearchFilter/CustomDateRangeDialog.cjs.js");require("../../../components/SettingsPanel/SettingsPanel.cjs.js");require("../../../components/SettingsPanel/SettingsPanelItemTemplate.cjs.js");require("../../../components/ShareOptionIcon/ShareOptionIcon.cjs.js");require("../../../components/SimpleFormDialog/SimpleFormDialog.cjs.js");require("../../../components/StyledLink/StyledLink.cjs.js");require("../../../components/SyncButton/SyncButton.cjs.js");require("../../../components/TableGridSwitch/TableGridSwitch.cjs.js");require("../../../components/Thumbnail/Thumbnail.styled.cjs.js");require("../../../components/Thumbnail/StackedThumbnails.cjs.js");require("../../../components/ThumbnailSimple/ThumbnailSimple.cjs.js");require("../../../components/VersionUploader/components/UploadVersionDialog.cjs.js");require("../../../components/VersionUploader/context/VersionUploadContextInstance.cjs.js");require("../../../components/Watchers/Watchers.cjs.js");require("../../../components/Menu/Menu.styled.cjs.js");require("../../../components/Menu/MenuItem.cjs.js");require("../../../components/ReviewablesSelector/ReviewablesSelector.cjs.js");require("../../../components/ColumnHeaderMenuUI.cjs.js");const P=require("../utils/linksToTableData.cjs.js"),H=100;function V({foldersMap:a,tasksMap:p,rows:m,tasksByFolderMap:b,expanded:R,showHierarchy:y,isFlatFolderView:j=!1,showEmptyFolders:O=!1,loadingTasks:c={},isLoadingMore:A=!1,selectedFolders:E=[]}){const g=U.useProjectContext(),v=_.useGetEntityTypeData({projectInfo:g}),N=w.useMemo(()=>JSON.stringify(R),[R]),f=w.useMemo(()=>new Set(Object.entries(R).filter(([u,q])=>q).map(([u])=>u)),[N]),{childToParentMap:S,parentToChildrenMap:x}=w.useMemo(()=>{const u=new Map,q=new Map;for(const i of a.values()){if(!i?.id)continue;const s=i.parentId;if(s){u.set(i.id,s);let r=q.get(s);r||(r=new Set,q.set(s,r)),r.add(i.id)}}return{childToParentMap:u,parentToChildrenMap:q}},[a]),D=w.useMemo(()=>{const u=new Set,q=[];for(const i of a.values())i?.id&&(!i.parentId||!a.has(i.parentId))&&(u.add(i.id),q.push(i.id));for(;q.length>0;){const i=q.shift();if(!f.has(i))continue;const r=x.get(i);if(r)for(const e of r)u.has(e)||(u.add(e),q.push(e))}return u},[a,x,f]);return w.useMemo(()=>{const u=(r,e)=>{const t=v("task",r.taskType),n=P.linksToTableData(r.links,"task",g.anatomy);return{id:r.id,entityType:"task",parentId:e||r.folderId,folderId:r.folderId,name:r.name||"",label:r.label||r.name||"",icon:t?.icon||null,color:t?.color||null,status:r.status,assignees:r.assignees,tags:r.tags,img:null,subRows:[],subType:r.taskType||null,attrib:r.attrib,ownAttrib:r.ownAttrib,parents:r.parents||[],path:r.parents.join("/")||null,folder:r.parents[r.parents.length-1]||void 0,updatedAt:r.updatedAt,createdAt:r.createdAt,thumbnailHash:r.thumbnailHash,hasReviewables:r.hasReviewables||!1,links:n,subtasks:r.subtasks||[],latestComments:r.latestComments||[]}},q=()=>{const r=[];for(const e of E){if(a.has(e))continue;const t=b.get(e)||[];for(const n of t){const l=p.get(n);l&&r.push(u(l))}}return r};if(j){const r=[];for(const e of a.values()){if(!e?.id)continue;const t=e.hasTasks??b.has(e.id);if(!O&&!t)continue;const n=v("folder",e.folderType),l=P.linksToTableData(e.links,"folder",g.anatomy),C={id:e.id,entityType:"folder",parentId:void 0,folderId:e.id,name:e.name||"",label:e.label||e.name||"",icon:n?.icon||null,color:n?.color||null,img:null,subRows:[],status:e.status,tags:e.tags||[],subType:e.folderType||null,ownAttrib:e.ownAttrib||[],path:e.path,folder:e.parents[e.parents.length-1]||void 0,attrib:e.attrib||{},childOnlyMatch:e.childOnlyMatch||!1,updatedAt:e.updatedAt,createdAt:e.createdAt,thumbnailHash:e.thumbnailHash,hasReviewables:e.hasReviewables||!1,hasVersions:e.hasVersions||!1,links:l};if(f.has(e.id)){const d=(b.get(e.id)||[]).flatMap(o=>p.get(o)||[]);if(d.length||c[e.id]){const o=d.map(h=>u(h,e.id));if(c[e.id]){const h=c[e.id];h>0&&o.push(...I.generateLoadingRows(h,{parentId:e.id}))}C.subRows=o}}r.push(C)}return r.push(...q()),r}if(!y){const r=[];for(const e of p.values())e.id&&r.push(u(e));for(const e of m||[])r.push(e);if(A){const e=H;{const t=I.generateLoadingRows(e,{type:"task"});r.push(...t)}}return r}const i=new Map,s=[];for(const r of D){const e=a.get(r);if(!e)continue;const t=P.linksToTableData(e.links,"folder",g.anatomy),n=v("folder",e.folderType),l={id:r,entityType:"folder",parentId:e.parentId||void 0,folderId:r||null,name:e.name||"",label:e.label||e.name||"",icon:n?.icon||null,color:n?.color||null,img:null,subRows:[],status:e.status,tags:e.tags||[],subType:e.folderType||null,ownAttrib:e.ownAttrib||[],path:e.path,folder:e.parents[e.parents.length-1]||void 0,attrib:e.attrib||{},childOnlyMatch:e.childOnlyMatch||!1,updatedAt:e.updatedAt,createdAt:e.createdAt,thumbnailHash:e.thumbnailHash,hasReviewables:e.hasReviewables||!1,hasVersions:e.hasVersions||!1,links:t};if(i.set(r,l),(!e.parentId||!a.has(e.parentId))&&s.push(l),f.has(r)){const T=(b.get(r)||[]).flatMap(d=>p.get(d)||[]);if(T.length||c[r]){const d=new Array(T.length);for(let o=0;o<T.length;o++)d[o]=u(T[o],r);if(c[r]){const o=c[r];if(o>0){const h=I.generateLoadingRows(o,{parentId:r});d.push(...h)}}l.subRows=d}}}for(const r of D){const e=S.get(r);if(!e||!f.has(e))continue;const t=i.get(r),n=i.get(e);!t||!n||n.subRows?.push(t)}if(s.push(...q()),y&&A){const r=H;s.push(...I.generateLoadingRows(r,{type:"task"}))}for(const r of m||[])s.push(r);return s},[a,p,b,m,D,S,f,y,j,O,c,A,E])}module.exports=V;
1
+ "use strict";const w=require("react"),I=require("../utils/loadingUtils.cjs.js"),N=require("./useGetEntityTypeData.cjs.js");require("@ynput/ayon-react-components");require("../../../components/SearchFilter/filterDates.cjs.js");require("date-fns");require("react-toastify");require("lodash");require("uuid");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");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");require("../../../util/pubsub.cjs.js");require("../../../../../_virtual/jsx-runtime.cjs.js");require("clsx");require("../../Feed/components/ActivityCheckbox/ActivityCheckbox.styled.cjs.js");require("../../../components/AddonLoadingScreen/AddonLoadingScreen.cjs.js");require("../../../../../node_modules/match-sorter/dist/match-sorter.esm.cjs.js");require("../../../components/AccessSearchInput/AccessSearchInput.styled.cjs.js");require("../../../components/AccessUser/AccessUser.cjs.js");require("../../../components/AttributeEditor/AttributeEditor.cjs.js");require("../../../components/AttributeEditor/attributeTypeMap.cjs.js");require("../../../components/Badge/Badge.cjs.js");require("../../../components/Chips/Chips.cjs.js");require("react-dom");require("../../../components/DateRangePicker/DateRangePicker.styled.cjs.js");require("../../../components/LinksManager/CellEditingDialog.cjs.js");require("../../../components/DeleteEntitiesConfirm/DeleteConfirmContent.cjs.js");require("../../../components/DeleteEntitiesConfirm/DeleteEntitiesConfirmDialog.styled.cjs.js");require("../../../../../_virtual/index.cjs.js");require("../../../../../node_modules/refractor/lib/common.cjs.js");require("../../../../../node_modules/refractor/lib/all.cjs.js");;/* empty css */require("../../../components/DetailsPanelAttributes/DetailsPanelAttributesEditor.cjs.js");require("../../../components/DetailsPanelDetails/DetailsPanelDetails.cjs.js");require("react-quill-ayon");require("../../../components/DetailsPanelDetails/BorderedSection.cjs.js");require("../../../components/QuillListStyles/QuillListStyles.cjs.js");require("../../../components/DetailsPanelDetails/DescriptionSection.styles.cjs.js");require("react-markdown");require("remark-gfm");require("rehype-raw");require("../../Feed/components/CommentInput/quillToMarkdown.cjs.js");require("../../../components/DetailsPanelDetails/hooks/useMentionSystem.cjs.js");require("../../Feed/components/CommentInput/modules/index.cjs.js");require("../../../context/RemoteModulesContext.cjs.js");require("../../../../../_virtual/runtime.cjs.js");require("../../../../../_virtual/semver.cjs.js");require("../../../context/PowerpackContextInstance.cjs.js");require("../../../context/UriContext.cjs.js");require("../../../context/DetailsPanelContextInstance.cjs.js");require("../../../context/SubtasksModulesContextInstance.cjs.js");require("../../../context/ThumbnailUploaderContext.cjs.js");require("../../../context/SettingsPanelContext.cjs.js");require("../../../context/pip/PiPProvider.cjs.js");require("../../../context/pip/PiPWrapper.cjs.js");require("../../../context/AddonProjectContext.cjs.js");require("../../../context/AddonContext.cjs.js");require("../../../context/MenuContext.cjs.js");require("../../../context/WebsocketContext.cjs.js");require("../../../context/GlobalContext.cjs.js");const U=require("../../../context/ProjectContext.cjs.js");require("../../../context/ProjectFoldersContextInstance.cjs.js");require("../../../context/EntityUpdatesContextInstance.cjs.js");require("../../ContextMenu/ContextMenuContext.cjs.js");;/* empty css */require("../../Feed/context/FeedContext.cjs.js");require("../../Feed/components/Tooltips/UserTooltipItem.cjs.js");require("../../Feed/components/Tooltips/UserTooltip/UserTooltip.styled.cjs.js");require("../../Feed/components/Tooltips/TeamTooltip/TeamTooltip.styled.cjs.js");require("../../Feed/components/Tooltips/EntityTooltip/EntityTooltip.styled.cjs.js");require("../../Feed/components/FileUploadPreview/FileUploadPreview.styled.cjs.js");require("../../Feed/components/FileUploadPreview/Mimes/TextMime.cjs.js");require("remark-emoji");require("remark-directive");require("remark-directive-rehype");require("../../Feed/components/CommentInput/CommentInput.cjs.js");require("../../Feed/components/ReactionContainer/Reactions.styled.cjs.js");require("../../Feed/components/FilesGrid/FilesGrid.styled.cjs.js");require("../../Feed/components/FileUploadCard/FileUploadCard.styled.cjs.js");require("../../Feed/components/ActivityComment/ActivityComment.styled.cjs.js");require("../../Feed/components/ActivityStatus/ActivityStatus.cjs.js");require("../../Feed/components/ActivityHeader/ActivityHeader.styled.cjs.js");require("../../Feed/components/ActivityReference/ActivityReference.styled.cjs.js");require("../../Feed/components/ActivityDate.cjs.js");require("../../Feed/components/ActivityVersionReview/ActivityVersionReview.styled.cjs.js");require("../../Feed/components/ActivityCategorySelect/ActivityCategorySelect.cjs.js");require("../../Feed/components/ActivityCategorySelect/CategoryDropdownItem.cjs.js");require("../../Feed/components/ActivityCategorySelect/CategoryTag.cjs.js");require("../../Feed/components/ActivityFieldChange/ActivityFieldChange.styled.cjs.js");require("../../Feed/components/ActivityFieldChange/FieldValue.cjs.js");require("../../Feed/components/ActivityAssigneeChange/ActivityAssigneeChange.styled.cjs.js");require("../../Feed/components/ActivityVersions/ActivityVersions.styled.cjs.js");require("../../Feed/components/ActivityGroup/ActivityGroup.styled.cjs.js");require("../../Feed/Feed.styled.cjs.js");require("../../../components/EmptyPlaceholder/EmptyPlaceholder.cjs.js");require("../../../components/EmptyPlaceholder/EmptyPlaceholderFlex.styled.cjs.js");require("../../Feed/components/FeedSearchFilter.cjs.js");require("@tanstack/react-virtual");require("@tanstack/react-table");require("../widgets/CollapsedWidget.cjs.js");require("../widgets/DateWidget.cjs.js");require("../widgets/EnumWidget.cjs.js");require("../widgets/EnumCellValue.cjs.js");require("../widgets/TextWidget.cjs.js");require("../widgets/MarkdownWidget.cjs.js");require("../widgets/BooleanWidget.cjs.js");require("../widgets/CellWidget.cjs.js");require("../widgets/EntityNameWidget.cjs.js");require("../widgets/GroupHeaderWidget.cjs.js");require("../widgets/ThumbnailWidget.cjs.js");require("../widgets/LinksWidget.cjs.js");require("../../../components/LinksManager/LinksManager.styled.cjs.js");require("../context/ColumnSettingsContext.cjs.js");require("../context/ProjectTableContextInstance.cjs.js");require("../widgets/EmptyWidget.cjs.js");require("../widgets/ErrorWidget.cjs.js");require("../ProjectTreeTable.styled.cjs.js");require("../components/SelectionCell.cjs.js");require("../components/RowSelectionHeader.cjs.js");require("../widgets/LoadMoreWidget.cjs.js");require("../components/HeaderActionButton.cjs.js");require("../context/ProjectTableQueriesContext.cjs.js");require("../context/ClipboardContext.cjs.js");require("../context/SelectionCellsContext.cjs.js");require("../context/ProjectDataContextInstance.cjs.js");require("../context/CellEditingContext.cjs.js");require("../../NewEntity/components/NewEntity.cjs.js");require("../../Slicer/components/Slicer.cjs.js");require("../../Slicer/context/SlicerContextInstance.cjs.js");require("../../Slicer/components/SlicerDropdownFallback.cjs.js");require("../../Slicer/hooks/useTableDataBySlice.cjs.js");require("react-redux");require("../../NewEntity/context/NewEntityContextInstance.cjs.js");require("../../NewEntity/components/NewEntityForm.cjs.js");require("@dnd-kit/core");require("@dnd-kit/sortable");require("../components/TableFooterRow.cjs.js");require("../context/SelectedRowsContext.cjs.js");require("../context/DetailsPanelEntityContext.cjs.js");require("../../DetailsPanel/DetailsPanel.styled.cjs.js");require("../../DetailsPanel/components/DetailsPanelTabs/DetailsPanelTabs.styled.cjs.js");require("../../DetailsPanel/components/DetailsPanelHeader/LinkedTaskRow.styled.cjs.js");require("../../DetailsPanel/components/DetailsPanelHeader/DetailsPanelHeader.styled.cjs.js");require("../../../components/PlayableIcon/PlayableIcon.cjs.js");require("../../DetailsPanel/components/DetailsPanelFiles/DetailsPanelFiles.cjs.js");require("../../DetailsPanel/components/DetailsPanelMoreMenu/components/ShareDialog.cjs.js");require("../../DetailsPanel/components/TabHeaderAndFilters/TabHeaderAndFilters.styled.cjs.js");require("../../DetailsPanel/components/SubtasksSearchFilter/SubtasksSearchFilter.cjs.js");require("../../DetailsPanel/components/DetailsPanelSlideOut/DetailsPanelSlideOut.styled.cjs.js");require("../../DetailsPanel/components/DetailsPanelFloating/DetailsPanelFloating.styled.cjs.js");require("../../Actions/Actions.styled.cjs.js");require("../../Actions/ActionsDropdown/ActionsDropdown.cjs.js");require("../../Actions/ActionIcon.cjs.js");require("../../Views/ViewsMenu/ViewsMenu.cjs.js");require("../../Views/context/ViewsContextInstance.cjs.js");require("../../Views/Views.styled.cjs.js");require("../../Views/ViewsMenuContainer/ViewsMenuContainer.cjs.js");require("../../EntityPickerDialog/EntityPickerDialog.cjs.js");require("../../ListTable/ListTableRow.cjs.js");require("../../ListTable/ListTable.styled.cjs.js");require("../../../context/DeleteEntitiesContext.cjs.js");require("custom-protocol-check");require("../components/GroupSettingsFallback.cjs.js");require("../../../components/DetailsPanelDetails/DetailsSection.cjs.js");require("../../../components/DetailsPanelDetails/FieldLabel.cjs.js");require("../../../components/DoneCheckbox/DoneCheckbox.cjs.js");require("../../../components/EarlyPreview/EarlyPreview.cjs.js");require("../../../components/InfoMessage/InfoMessage.cjs.js");require("../../../components/EnumEditor/EnumEditor.styled.cjs.js");require("../../../components/EntityPanelUploader/EntityPanelUploader.styled.cjs.js");require("axios");require("../../../components/ReviewablesList/ReviewablesList.styled.cjs.js");require("../../../components/ReviewablesList/ReviewablesUpload.styled.cjs.js");require("../../../components/EntityPath/EntityPath.styled.cjs.js");require("../../../components/EntityPath/SegmentProvider.cjs.js");require("../../../components/FeaturedVersionOrder/FeaturedVersionOrder.cjs.js");require("../../../components/Feedback/FeedbackContextInstance.cjs.js");require("../../../components/Feedback/SupportBubble.cjs.js");require("../../../components/FileThumbnail/FileThumbnail.cjs.js");require("../../../components/LegacyBadge/LegacyBadge.cjs.js");require("../../../components/Powerpack/PowerpackButton.cjs.js");require("../../../components/Powerpack/FreeTrialLink.cjs.js");require("../../../components/Powerpack/PowerpackDialog.styled.cjs.js");require("../../../components/Powerpack/CTAButton.cjs.js");require("../../../components/Powerpack/RequiredAddonVersion.cjs.js");require("../../../components/ProjectTableSettings/ProjectTableSettings.cjs.js");require("../../../components/SizeSlider/SizeSlider.cjs.js");require("react-router-dom");require("../../../components/ReviewableCard/ReviewableCard.cjs.js");require("../../../components/ReviewableProgressCard/ReviewableProgressCard.styled.cjs.js");require("../../../components/SearchFilter/CustomDateRangeDialog.cjs.js");require("../../../components/SettingsPanel/SettingsPanel.cjs.js");require("../../../components/SettingsPanel/SettingsPanelItemTemplate.cjs.js");require("../../../components/ShareOptionIcon/ShareOptionIcon.cjs.js");require("../../../components/SimpleFormDialog/SimpleFormDialog.cjs.js");require("../../../components/StyledLink/StyledLink.cjs.js");require("../../../components/SyncButton/SyncButton.cjs.js");require("../../../components/TableGridSwitch/TableGridSwitch.cjs.js");require("../../../components/Thumbnail/Thumbnail.styled.cjs.js");require("../../../components/Thumbnail/StackedThumbnails.cjs.js");require("../../../components/ThumbnailSimple/ThumbnailSimple.cjs.js");require("../../../components/VersionUploader/components/UploadVersionDialog.cjs.js");require("../../../components/VersionUploader/context/VersionUploadContextInstance.cjs.js");require("../../../components/Watchers/Watchers.cjs.js");require("../../../components/Menu/Menu.styled.cjs.js");require("../../../components/Menu/MenuItem.cjs.js");require("../../../components/ReviewablesSelector/ReviewablesSelector.cjs.js");require("../../../components/ColumnHeaderMenuUI.cjs.js");const P=require("../utils/linksToTableData.cjs.js"),_=100;function V({foldersMap:a,tasksMap:p,rows:m,tasksByFolderMap:b,expanded:y,showHierarchy:R,isFlatFolderView:j=!1,showEmptyFolders:E=!1,loadingTasks:c={},isLoadingMore:A=!1,selectedFolders:O=[]}){const g=U.useProjectContext(),v=N.useGetEntityTypeData({projectInfo:g}),H=w.useMemo(()=>JSON.stringify(y),[y]),f=w.useMemo(()=>new Set(Object.entries(y).filter(([u,q])=>q).map(([u])=>u)),[H]),{childToParentMap:S,parentToChildrenMap:x}=w.useMemo(()=>{const u=new Map,q=new Map;for(const i of a.values()){if(!i?.id)continue;const s=i.parentId;if(s){u.set(i.id,s);let r=q.get(s);r||(r=new Set,q.set(s,r)),r.add(i.id)}}return{childToParentMap:u,parentToChildrenMap:q}},[a]),D=w.useMemo(()=>{const u=new Set,q=[];for(const i of a.values())i?.id&&(!i.parentId||!a.has(i.parentId))&&(u.add(i.id),q.push(i.id));for(;q.length>0;){const i=q.shift();if(!f.has(i))continue;const r=x.get(i);if(r)for(const e of r)u.has(e)||(u.add(e),q.push(e))}return u},[a,x,f]);return w.useMemo(()=>{const u=(r,e)=>{const t=v("task",r.taskType),n=P.linksToTableData(r.links,"task",g.anatomy);return{id:r.id,entityType:"task",parentId:e||r.folderId,folderId:r.folderId,name:r.name||"",label:r.label||r.name||"",icon:t?.icon||null,color:t?.color||null,status:r.status,assignees:r.assignees,tags:r.tags,img:null,subRows:[],subType:r.taskType||null,attrib:r.attrib,midnightExclusiveFields:r.data?.schedulerSyncData?.allDay?["attrib_endDate"]:void 0,ownAttrib:r.ownAttrib,parents:r.parents||[],path:r.parents.join("/")||null,folder:r.parents[r.parents.length-1]||void 0,updatedAt:r.updatedAt,createdAt:r.createdAt,thumbnailHash:r.thumbnailHash,hasReviewables:r.hasReviewables||!1,links:n,subtasks:r.subtasks||[],latestComments:r.latestComments||[]}},q=()=>{const r=[];for(const e of O){if(a.has(e))continue;const t=b.get(e)||[];for(const n of t){const l=p.get(n);l&&r.push(u(l))}}return r};if(j){const r=[];for(const e of a.values()){if(!e?.id)continue;const t=e.hasTasks??b.has(e.id);if(!E&&!t)continue;const n=v("folder",e.folderType),l=P.linksToTableData(e.links,"folder",g.anatomy),C={id:e.id,entityType:"folder",parentId:void 0,folderId:e.id,name:e.name||"",label:e.label||e.name||"",icon:n?.icon||null,color:n?.color||null,img:null,subRows:[],status:e.status,tags:e.tags||[],subType:e.folderType||null,ownAttrib:e.ownAttrib||[],path:e.path,folder:e.parents[e.parents.length-1]||void 0,attrib:e.attrib||{},childOnlyMatch:e.childOnlyMatch||!1,updatedAt:e.updatedAt,createdAt:e.createdAt,thumbnailHash:e.thumbnailHash,hasReviewables:e.hasReviewables||!1,hasVersions:e.hasVersions||!1,links:l};if(f.has(e.id)){const d=(b.get(e.id)||[]).flatMap(o=>p.get(o)||[]);if(d.length||c[e.id]){const o=d.map(h=>u(h,e.id));if(c[e.id]){const h=c[e.id];h>0&&o.push(...I.generateLoadingRows(h,{parentId:e.id}))}C.subRows=o}}r.push(C)}return r.push(...q()),r}if(!R){const r=[];for(const e of p.values())e.id&&r.push(u(e));for(const e of m||[])r.push(e);if(A){const e=_;{const t=I.generateLoadingRows(e,{type:"task"});r.push(...t)}}return r}const i=new Map,s=[];for(const r of D){const e=a.get(r);if(!e)continue;const t=P.linksToTableData(e.links,"folder",g.anatomy),n=v("folder",e.folderType),l={id:r,entityType:"folder",parentId:e.parentId||void 0,folderId:r||null,name:e.name||"",label:e.label||e.name||"",icon:n?.icon||null,color:n?.color||null,img:null,subRows:[],status:e.status,tags:e.tags||[],subType:e.folderType||null,ownAttrib:e.ownAttrib||[],path:e.path,folder:e.parents[e.parents.length-1]||void 0,attrib:e.attrib||{},childOnlyMatch:e.childOnlyMatch||!1,updatedAt:e.updatedAt,createdAt:e.createdAt,thumbnailHash:e.thumbnailHash,hasReviewables:e.hasReviewables||!1,hasVersions:e.hasVersions||!1,links:t};if(i.set(r,l),(!e.parentId||!a.has(e.parentId))&&s.push(l),f.has(r)){const T=(b.get(r)||[]).flatMap(d=>p.get(d)||[]);if(T.length||c[r]){const d=new Array(T.length);for(let o=0;o<T.length;o++)d[o]=u(T[o],r);if(c[r]){const o=c[r];if(o>0){const h=I.generateLoadingRows(o,{parentId:r});d.push(...h)}}l.subRows=d}}}for(const r of D){const e=S.get(r);if(!e||!f.has(e))continue;const t=i.get(r),n=i.get(e);!t||!n||n.subRows?.push(t)}if(s.push(...q()),R&&A){const r=_;s.push(...I.generateLoadingRows(r,{type:"task"}))}for(const r of m||[])s.push(r);return s},[a,p,b,m,D,S,f,R,j,E,c,A,O])}module.exports=V;
2
2
  //# sourceMappingURL=useBuildProjectDataTable.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useBuildProjectDataTable.cjs.js","sources":["../../../../../../src/containers/ProjectTreeTable/hooks/useBuildProjectDataTable.ts"],"sourcesContent":["import { useMemo } from 'react'\nimport {\n EditorTaskNode,\n FolderNodeMap,\n TableRow,\n TaskNodeMap,\n TasksByFolderMap,\n} from '../types/table'\nimport { ExpandedState } from '@tanstack/react-table'\nimport { generateLoadingRows } from '../utils/loadingUtils'\nconst TASKS_INFINITE_QUERY_COUNT = 100\nimport { LoadingTasks } from '../types'\nimport { useGetEntityTypeData } from './useGetEntityTypeData'\nimport { TableGroupBy } from '../context'\nimport { linksToTableData } from '../utils'\nimport { useProjectContext } from '@shared/context'\n\ntype Params = {\n foldersMap: FolderNodeMap\n tasksMap: TaskNodeMap\n tasksByFolderMap: TasksByFolderMap\n rows?: TableRow[]\n expanded: ExpandedState\n showHierarchy: boolean\n isFlatFolderView?: boolean\n showEmptyFolders?: boolean\n loadingTasks?: LoadingTasks\n isLoadingMore?: boolean\n groupBy?: TableGroupBy\n selectedFolders?: string[]\n}\n\nexport default function useBuildProjectDataTable({\n foldersMap,\n tasksMap,\n rows,\n tasksByFolderMap,\n expanded,\n showHierarchy,\n isFlatFolderView = false,\n showEmptyFolders = false,\n loadingTasks = {},\n isLoadingMore = false,\n selectedFolders = [],\n}: Params): TableRow[] {\n const project = useProjectContext()\n const getEntityTypeData = useGetEntityTypeData({ projectInfo: project })\n\n // Convert expanded object to a stable string for memoization comparison\n const expandedKey = useMemo(() => JSON.stringify(expanded), [expanded])\n\n // Memoize expandedFolderIds set for efficient lookups\n const expandedFolderIds = useMemo(() => {\n return new Set(\n Object.entries(expanded)\n .filter(([_, isExpanded]) => isExpanded)\n .map(([id]) => id),\n )\n }, [expandedKey])\n\n // Memoize relationship maps to avoid rebuilding them on every render\n const { childToParentMap, parentToChildrenMap } = useMemo(() => {\n const childToParent = new Map<string, string>()\n const parentToChildren = new Map<string, Set<string>>()\n\n // Construct relationship maps in a single pass\n for (const folder of foldersMap.values()) {\n if (!folder?.id) continue\n\n const parentId = folder.parentId\n if (parentId) {\n childToParent.set(folder.id, parentId)\n\n let children = parentToChildren.get(parentId)\n if (!children) {\n children = new Set<string>()\n parentToChildren.set(parentId, children)\n }\n children.add(folder.id)\n }\n }\n\n return { childToParentMap: childToParent, parentToChildrenMap: parentToChildren }\n }, [foldersMap])\n\n // Memoize visible folders calculation\n const visibleFolders = useMemo(() => {\n const visible = new Set<string>()\n\n // Start with root folders and folders with non-existent parents\n const queue: string[] = []\n for (const folder of foldersMap.values()) {\n if (!folder?.id) continue\n\n // Include folders with no parent OR with a parent that doesn't exist\n if (!folder.parentId || !foldersMap.has(folder.parentId)) {\n visible.add(folder.id)\n queue.push(folder.id)\n }\n }\n\n // Process queue to identify visible folders (BFS)\n while (queue.length > 0) {\n const folderId = queue.shift()!\n const isParentExpanded = expandedFolderIds.has(folderId)\n\n if (!isParentExpanded) continue\n\n // Add children of expanded folders to visible set\n const childrenIds = parentToChildrenMap.get(folderId)\n if (childrenIds) {\n for (const childId of childrenIds) {\n if (!visible.has(childId)) {\n visible.add(childId)\n queue.push(childId)\n }\n }\n }\n }\n\n return visible\n }, [foldersMap, parentToChildrenMap, expandedFolderIds])\n\n // Final memoized result - build the table tree\n return useMemo(() => {\n // Helper function to create a task row\n const createTaskRow = (task: EditorTaskNode, parentId?: string): TableRow => {\n const typeData = getEntityTypeData('task', task.taskType)\n\n const links = linksToTableData(task.links, 'task', project.anatomy)\n\n return {\n id: task.id,\n entityType: 'task',\n parentId: parentId || task.folderId,\n folderId: task.folderId,\n name: task.name || '',\n label: task.label || task.name || '',\n icon: typeData?.icon || null,\n color: typeData?.color || null,\n status: task.status,\n assignees: task.assignees,\n tags: task.tags,\n img: null,\n subRows: [],\n subType: task.taskType || null,\n attrib: task.attrib,\n ownAttrib: task.ownAttrib,\n parents: task.parents || [],\n path: task.parents.join('/') || null, // todo: probably remove this and just use parents\n folder: task.parents[task.parents.length - 1] || undefined,\n updatedAt: task.updatedAt,\n createdAt: task.createdAt,\n thumbnailHash: task.thumbnailHash,\n hasReviewables: task.hasReviewables || false,\n links: links,\n subtasks: task.subtasks || [],\n latestComments: task.latestComments || [],\n }\n }\n\n const createRootTaskRows = (): TableRow[] => {\n const rootTaskRows: TableRow[] = []\n for (const folderId of selectedFolders) {\n if (foldersMap.has(folderId)) continue\n const folderTaskIds = tasksByFolderMap.get(folderId) || []\n for (const taskId of folderTaskIds) {\n const task = tasksMap.get(taskId)\n if (task) rootTaskRows.push(createTaskRow(task))\n }\n }\n return rootTaskRows\n }\n\n // Flat folder view: all folders at root level, each expandable to show tasks\n if (isFlatFolderView) {\n const flatFolderRows: TableRow[] = []\n\n for (const folder of foldersMap.values()) {\n if (!folder?.id) continue\n\n // Use the folder's hasTasks flag (from REST data) to filter before tasks are loaded\n const hasTasks = folder.hasTasks ?? tasksByFolderMap.has(folder.id)\n // Skip folders without tasks when showEmptyFolders is off\n if (!showEmptyFolders && !hasTasks) continue\n\n const folderTypeData = getEntityTypeData('folder', folder.folderType)\n const links = linksToTableData(folder.links, 'folder', project.anatomy)\n\n const row: TableRow = {\n id: folder.id,\n entityType: 'folder',\n parentId: undefined, // flat — no parent nesting\n folderId: folder.id,\n name: folder.name || '',\n label: folder.label || folder.name || '',\n icon: folderTypeData?.icon || null,\n color: folderTypeData?.color || null,\n img: null,\n subRows: [],\n status: folder.status,\n tags: folder.tags || [],\n subType: folder.folderType || null,\n ownAttrib: folder.ownAttrib || [],\n path: folder.path,\n folder: folder.parents[folder.parents.length - 1] || undefined,\n attrib: folder.attrib || {},\n childOnlyMatch: folder.childOnlyMatch || false,\n updatedAt: folder.updatedAt,\n createdAt: folder.createdAt,\n thumbnailHash: folder.thumbnailHash,\n hasReviewables: folder.hasReviewables || false,\n hasVersions: folder.hasVersions || false,\n links: links,\n }\n\n // If folder is expanded, attach task subRows\n if (expandedFolderIds.has(folder.id)) {\n const folderTaskIds = tasksByFolderMap.get(folder.id) || []\n const folderTasks = folderTaskIds.flatMap((taskId) => tasksMap.get(taskId) || [])\n\n if (folderTasks.length || loadingTasks[folder.id]) {\n const taskRows = folderTasks.map((task) => createTaskRow(task, folder.id))\n\n if (loadingTasks[folder.id]) {\n const count = loadingTasks[folder.id]\n if (count > 0) {\n taskRows.push(...generateLoadingRows(count, { parentId: folder.id }))\n }\n }\n\n row.subRows = taskRows\n }\n }\n\n flatFolderRows.push(row)\n }\n\n flatFolderRows.push(...createRootTaskRows())\n\n return flatFolderRows\n }\n\n // If showHierarchy is false, create a flat list of task rows\n if (!showHierarchy) {\n const flatRows: TableRow[] = []\n\n // Loop through all tasks\n for (const task of tasksMap.values()) {\n if (!task.id) continue\n flatRows.push(createTaskRow(task))\n }\n\n // Loop through all extra rows\n for (const row of rows || []) {\n flatRows.push(row)\n }\n\n // if we are loading more tasks, add loading rows\n if (isLoadingMore) {\n // number of tasks we loading with the infinite query\n const count = TASKS_INFINITE_QUERY_COUNT\n if (count > 0) {\n const loadingTaskRows = generateLoadingRows(count, {\n type: 'task',\n })\n\n flatRows.push(...loadingTaskRows)\n }\n }\n\n return flatRows\n }\n\n // Use Map for O(1) lookups\n const rowsById = new Map<string, TableRow>()\n const rootRows: TableRow[] = []\n\n // Create minimal rows for only visible folders\n for (const folderId of visibleFolders) {\n const folder = foldersMap.get(folderId)\n if (!folder) continue\n\n const links = linksToTableData(folder.links, 'folder', project.anatomy)\n\n const folderTypeData = getEntityTypeData('folder', folder.folderType)\n\n // Create row with minimal required properties\n const row: TableRow = {\n id: folderId,\n entityType: 'folder',\n parentId: folder.parentId || undefined,\n folderId: folderId || null, // root folders have no folderId\n name: folder.name || '',\n label: folder.label || folder.name || '',\n icon: folderTypeData?.icon || null,\n color: folderTypeData?.color || null,\n img: null,\n subRows: [],\n status: folder.status,\n tags: folder.tags || [],\n subType: folder.folderType || null,\n ownAttrib: folder.ownAttrib || [],\n path: folder.path,\n folder: folder.parents[folder.parents.length - 1] || undefined,\n attrib: folder.attrib || {},\n childOnlyMatch: folder.childOnlyMatch || false,\n updatedAt: folder.updatedAt,\n createdAt: folder.createdAt,\n thumbnailHash: folder.thumbnailHash,\n hasReviewables: folder.hasReviewables || false,\n hasVersions: folder.hasVersions || false,\n links: links,\n }\n\n rowsById.set(folderId, row)\n\n // Add root rows directly to the rootRows array\n if (!folder.parentId || !foldersMap.has(folder.parentId)) {\n rootRows.push(row)\n }\n\n // Process tasks immediately if folder is expanded\n if (expandedFolderIds.has(folderId)) {\n // because tasksByFolderMap is a map of tasks by folder ID\n // we can directly get the tasks for the current folder\n const folderTaskIds = tasksByFolderMap.get(folderId) || []\n const folderTasks = folderTaskIds.flatMap((taskId) => tasksMap.get(taskId) || [])\n\n if (folderTasks.length || loadingTasks[folderId]) {\n // Use array literal with known length for better performance\n const taskRows = new Array<TableRow>(folderTasks.length)\n\n // Direct array assignment is faster than push operations\n for (let i = 0; i < folderTasks.length; i++) {\n taskRows[i] = createTaskRow(folderTasks[i], folderId)\n }\n\n // Add loading rows if applicable\n if (loadingTasks[folderId]) {\n const count = loadingTasks[folderId]\n if (count > 0) {\n const loadingTaskRows = generateLoadingRows(count, { parentId: folderId })\n\n taskRows.push(...loadingTaskRows)\n }\n }\n\n row.subRows = taskRows\n }\n }\n }\n\n // Build the folder hierarchy efficiently\n for (const folderId of visibleFolders) {\n const parentId = childToParentMap.get(folderId)\n if (!parentId || !expandedFolderIds.has(parentId)) continue\n\n const childRow = rowsById.get(folderId)\n const parentRow = rowsById.get(parentId)\n\n if (!childRow || !parentRow) continue\n\n // Add folder to its parent's subRows\n parentRow.subRows?.push(childRow)\n }\n\n rootRows.push(...createRootTaskRows())\n\n // if we are loading more tasks, add loading rows at the root level\n // this happens when in hierarchy mode but with a slicer selection that causes paginated tasks\n if (showHierarchy && isLoadingMore) {\n const count = TASKS_INFINITE_QUERY_COUNT\n if (count > 0) {\n rootRows.push(...generateLoadingRows(count, { type: 'task' }))\n }\n }\n\n // Add any extra rows to the root rows\n for (const row of rows || []) {\n rootRows.push(row)\n }\n\n return rootRows\n }, [\n foldersMap,\n tasksMap,\n tasksByFolderMap,\n rows,\n visibleFolders,\n childToParentMap,\n expandedFolderIds,\n showHierarchy,\n isFlatFolderView,\n showEmptyFolders,\n loadingTasks,\n isLoadingMore,\n selectedFolders,\n ])\n}\n"],"names":["TASKS_INFINITE_QUERY_COUNT","useBuildProjectDataTable","foldersMap","tasksMap","rows","tasksByFolderMap","expanded","showHierarchy","isFlatFolderView","showEmptyFolders","loadingTasks","isLoadingMore","selectedFolders","project","useProjectContext","getEntityTypeData","useGetEntityTypeData","expandedKey","useMemo","expandedFolderIds","_","isExpanded","id","childToParentMap","parentToChildrenMap","childToParent","parentToChildren","folder","parentId","children","visibleFolders","visible","queue","folderId","childrenIds","childId","createTaskRow","task","typeData","links","linksToTableData","createRootTaskRows","rootTaskRows","folderTaskIds","taskId","flatFolderRows","hasTasks","folderTypeData","row","folderTasks","taskRows","count","generateLoadingRows","flatRows","loadingTaskRows","rowsById","rootRows","i","childRow","parentRow"],"mappings":"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"}
1
+ {"version":3,"file":"useBuildProjectDataTable.cjs.js","sources":["../../../../../../src/containers/ProjectTreeTable/hooks/useBuildProjectDataTable.ts"],"sourcesContent":["import { useMemo } from 'react'\nimport {\n EditorTaskNode,\n FolderNodeMap,\n TableRow,\n TaskNodeMap,\n TasksByFolderMap,\n} from '../types/table'\nimport { ExpandedState } from '@tanstack/react-table'\nimport { generateLoadingRows } from '../utils/loadingUtils'\nconst TASKS_INFINITE_QUERY_COUNT = 100\nimport { LoadingTasks } from '../types'\nimport { useGetEntityTypeData } from './useGetEntityTypeData'\nimport { TableGroupBy } from '../context'\nimport { linksToTableData } from '../utils'\nimport { useProjectContext } from '@shared/context'\n\ntype Params = {\n foldersMap: FolderNodeMap\n tasksMap: TaskNodeMap\n tasksByFolderMap: TasksByFolderMap\n rows?: TableRow[]\n expanded: ExpandedState\n showHierarchy: boolean\n isFlatFolderView?: boolean\n showEmptyFolders?: boolean\n loadingTasks?: LoadingTasks\n isLoadingMore?: boolean\n groupBy?: TableGroupBy\n selectedFolders?: string[]\n}\n\nexport default function useBuildProjectDataTable({\n foldersMap,\n tasksMap,\n rows,\n tasksByFolderMap,\n expanded,\n showHierarchy,\n isFlatFolderView = false,\n showEmptyFolders = false,\n loadingTasks = {},\n isLoadingMore = false,\n selectedFolders = [],\n}: Params): TableRow[] {\n const project = useProjectContext()\n const getEntityTypeData = useGetEntityTypeData({ projectInfo: project })\n\n // Convert expanded object to a stable string for memoization comparison\n const expandedKey = useMemo(() => JSON.stringify(expanded), [expanded])\n\n // Memoize expandedFolderIds set for efficient lookups\n const expandedFolderIds = useMemo(() => {\n return new Set(\n Object.entries(expanded)\n .filter(([_, isExpanded]) => isExpanded)\n .map(([id]) => id),\n )\n }, [expandedKey])\n\n // Memoize relationship maps to avoid rebuilding them on every render\n const { childToParentMap, parentToChildrenMap } = useMemo(() => {\n const childToParent = new Map<string, string>()\n const parentToChildren = new Map<string, Set<string>>()\n\n // Construct relationship maps in a single pass\n for (const folder of foldersMap.values()) {\n if (!folder?.id) continue\n\n const parentId = folder.parentId\n if (parentId) {\n childToParent.set(folder.id, parentId)\n\n let children = parentToChildren.get(parentId)\n if (!children) {\n children = new Set<string>()\n parentToChildren.set(parentId, children)\n }\n children.add(folder.id)\n }\n }\n\n return { childToParentMap: childToParent, parentToChildrenMap: parentToChildren }\n }, [foldersMap])\n\n // Memoize visible folders calculation\n const visibleFolders = useMemo(() => {\n const visible = new Set<string>()\n\n // Start with root folders and folders with non-existent parents\n const queue: string[] = []\n for (const folder of foldersMap.values()) {\n if (!folder?.id) continue\n\n // Include folders with no parent OR with a parent that doesn't exist\n if (!folder.parentId || !foldersMap.has(folder.parentId)) {\n visible.add(folder.id)\n queue.push(folder.id)\n }\n }\n\n // Process queue to identify visible folders (BFS)\n while (queue.length > 0) {\n const folderId = queue.shift()!\n const isParentExpanded = expandedFolderIds.has(folderId)\n\n if (!isParentExpanded) continue\n\n // Add children of expanded folders to visible set\n const childrenIds = parentToChildrenMap.get(folderId)\n if (childrenIds) {\n for (const childId of childrenIds) {\n if (!visible.has(childId)) {\n visible.add(childId)\n queue.push(childId)\n }\n }\n }\n }\n\n return visible\n }, [foldersMap, parentToChildrenMap, expandedFolderIds])\n\n // Final memoized result - build the table tree\n return useMemo(() => {\n // Helper function to create a task row\n const createTaskRow = (task: EditorTaskNode, parentId?: string): TableRow => {\n const typeData = getEntityTypeData('task', task.taskType)\n\n const links = linksToTableData(task.links, 'task', project.anatomy)\n\n return {\n id: task.id,\n entityType: 'task',\n parentId: parentId || task.folderId,\n folderId: task.folderId,\n name: task.name || '',\n label: task.label || task.name || '',\n icon: typeData?.icon || null,\n color: typeData?.color || null,\n status: task.status,\n assignees: task.assignees,\n tags: task.tags,\n img: null,\n subRows: [],\n subType: task.taskType || null,\n attrib: task.attrib,\n midnightExclusiveFields: task.data?.schedulerSyncData?.allDay\n ? ['attrib_endDate']\n : undefined,\n ownAttrib: task.ownAttrib,\n parents: task.parents || [],\n path: task.parents.join('/') || null, // todo: probably remove this and just use parents\n folder: task.parents[task.parents.length - 1] || undefined,\n updatedAt: task.updatedAt,\n createdAt: task.createdAt,\n thumbnailHash: task.thumbnailHash,\n hasReviewables: task.hasReviewables || false,\n links: links,\n subtasks: task.subtasks || [],\n latestComments: task.latestComments || [],\n }\n }\n\n const createRootTaskRows = (): TableRow[] => {\n const rootTaskRows: TableRow[] = []\n for (const folderId of selectedFolders) {\n if (foldersMap.has(folderId)) continue\n const folderTaskIds = tasksByFolderMap.get(folderId) || []\n for (const taskId of folderTaskIds) {\n const task = tasksMap.get(taskId)\n if (task) rootTaskRows.push(createTaskRow(task))\n }\n }\n return rootTaskRows\n }\n\n // Flat folder view: all folders at root level, each expandable to show tasks\n if (isFlatFolderView) {\n const flatFolderRows: TableRow[] = []\n\n for (const folder of foldersMap.values()) {\n if (!folder?.id) continue\n\n // Use the folder's hasTasks flag (from REST data) to filter before tasks are loaded\n const hasTasks = folder.hasTasks ?? tasksByFolderMap.has(folder.id)\n // Skip folders without tasks when showEmptyFolders is off\n if (!showEmptyFolders && !hasTasks) continue\n\n const folderTypeData = getEntityTypeData('folder', folder.folderType)\n const links = linksToTableData(folder.links, 'folder', project.anatomy)\n\n const row: TableRow = {\n id: folder.id,\n entityType: 'folder',\n parentId: undefined, // flat — no parent nesting\n folderId: folder.id,\n name: folder.name || '',\n label: folder.label || folder.name || '',\n icon: folderTypeData?.icon || null,\n color: folderTypeData?.color || null,\n img: null,\n subRows: [],\n status: folder.status,\n tags: folder.tags || [],\n subType: folder.folderType || null,\n ownAttrib: folder.ownAttrib || [],\n path: folder.path,\n folder: folder.parents[folder.parents.length - 1] || undefined,\n attrib: folder.attrib || {},\n childOnlyMatch: folder.childOnlyMatch || false,\n updatedAt: folder.updatedAt,\n createdAt: folder.createdAt,\n thumbnailHash: folder.thumbnailHash,\n hasReviewables: folder.hasReviewables || false,\n hasVersions: folder.hasVersions || false,\n links: links,\n }\n\n // If folder is expanded, attach task subRows\n if (expandedFolderIds.has(folder.id)) {\n const folderTaskIds = tasksByFolderMap.get(folder.id) || []\n const folderTasks = folderTaskIds.flatMap((taskId) => tasksMap.get(taskId) || [])\n\n if (folderTasks.length || loadingTasks[folder.id]) {\n const taskRows = folderTasks.map((task) => createTaskRow(task, folder.id))\n\n if (loadingTasks[folder.id]) {\n const count = loadingTasks[folder.id]\n if (count > 0) {\n taskRows.push(...generateLoadingRows(count, { parentId: folder.id }))\n }\n }\n\n row.subRows = taskRows\n }\n }\n\n flatFolderRows.push(row)\n }\n\n flatFolderRows.push(...createRootTaskRows())\n\n return flatFolderRows\n }\n\n // If showHierarchy is false, create a flat list of task rows\n if (!showHierarchy) {\n const flatRows: TableRow[] = []\n\n // Loop through all tasks\n for (const task of tasksMap.values()) {\n if (!task.id) continue\n flatRows.push(createTaskRow(task))\n }\n\n // Loop through all extra rows\n for (const row of rows || []) {\n flatRows.push(row)\n }\n\n // if we are loading more tasks, add loading rows\n if (isLoadingMore) {\n // number of tasks we loading with the infinite query\n const count = TASKS_INFINITE_QUERY_COUNT\n if (count > 0) {\n const loadingTaskRows = generateLoadingRows(count, {\n type: 'task',\n })\n\n flatRows.push(...loadingTaskRows)\n }\n }\n\n return flatRows\n }\n\n // Use Map for O(1) lookups\n const rowsById = new Map<string, TableRow>()\n const rootRows: TableRow[] = []\n\n // Create minimal rows for only visible folders\n for (const folderId of visibleFolders) {\n const folder = foldersMap.get(folderId)\n if (!folder) continue\n\n const links = linksToTableData(folder.links, 'folder', project.anatomy)\n\n const folderTypeData = getEntityTypeData('folder', folder.folderType)\n\n // Create row with minimal required properties\n const row: TableRow = {\n id: folderId,\n entityType: 'folder',\n parentId: folder.parentId || undefined,\n folderId: folderId || null, // root folders have no folderId\n name: folder.name || '',\n label: folder.label || folder.name || '',\n icon: folderTypeData?.icon || null,\n color: folderTypeData?.color || null,\n img: null,\n subRows: [],\n status: folder.status,\n tags: folder.tags || [],\n subType: folder.folderType || null,\n ownAttrib: folder.ownAttrib || [],\n path: folder.path,\n folder: folder.parents[folder.parents.length - 1] || undefined,\n attrib: folder.attrib || {},\n childOnlyMatch: folder.childOnlyMatch || false,\n updatedAt: folder.updatedAt,\n createdAt: folder.createdAt,\n thumbnailHash: folder.thumbnailHash,\n hasReviewables: folder.hasReviewables || false,\n hasVersions: folder.hasVersions || false,\n links: links,\n }\n\n rowsById.set(folderId, row)\n\n // Add root rows directly to the rootRows array\n if (!folder.parentId || !foldersMap.has(folder.parentId)) {\n rootRows.push(row)\n }\n\n // Process tasks immediately if folder is expanded\n if (expandedFolderIds.has(folderId)) {\n // because tasksByFolderMap is a map of tasks by folder ID\n // we can directly get the tasks for the current folder\n const folderTaskIds = tasksByFolderMap.get(folderId) || []\n const folderTasks = folderTaskIds.flatMap((taskId) => tasksMap.get(taskId) || [])\n\n if (folderTasks.length || loadingTasks[folderId]) {\n // Use array literal with known length for better performance\n const taskRows = new Array<TableRow>(folderTasks.length)\n\n // Direct array assignment is faster than push operations\n for (let i = 0; i < folderTasks.length; i++) {\n taskRows[i] = createTaskRow(folderTasks[i], folderId)\n }\n\n // Add loading rows if applicable\n if (loadingTasks[folderId]) {\n const count = loadingTasks[folderId]\n if (count > 0) {\n const loadingTaskRows = generateLoadingRows(count, { parentId: folderId })\n\n taskRows.push(...loadingTaskRows)\n }\n }\n\n row.subRows = taskRows\n }\n }\n }\n\n // Build the folder hierarchy efficiently\n for (const folderId of visibleFolders) {\n const parentId = childToParentMap.get(folderId)\n if (!parentId || !expandedFolderIds.has(parentId)) continue\n\n const childRow = rowsById.get(folderId)\n const parentRow = rowsById.get(parentId)\n\n if (!childRow || !parentRow) continue\n\n // Add folder to its parent's subRows\n parentRow.subRows?.push(childRow)\n }\n\n rootRows.push(...createRootTaskRows())\n\n // if we are loading more tasks, add loading rows at the root level\n // this happens when in hierarchy mode but with a slicer selection that causes paginated tasks\n if (showHierarchy && isLoadingMore) {\n const count = TASKS_INFINITE_QUERY_COUNT\n if (count > 0) {\n rootRows.push(...generateLoadingRows(count, { type: 'task' }))\n }\n }\n\n // Add any extra rows to the root rows\n for (const row of rows || []) {\n rootRows.push(row)\n }\n\n return rootRows\n }, [\n foldersMap,\n tasksMap,\n tasksByFolderMap,\n rows,\n visibleFolders,\n childToParentMap,\n expandedFolderIds,\n showHierarchy,\n isFlatFolderView,\n showEmptyFolders,\n loadingTasks,\n isLoadingMore,\n selectedFolders,\n ])\n}\n"],"names":["TASKS_INFINITE_QUERY_COUNT","useBuildProjectDataTable","foldersMap","tasksMap","rows","tasksByFolderMap","expanded","showHierarchy","isFlatFolderView","showEmptyFolders","loadingTasks","isLoadingMore","selectedFolders","project","useProjectContext","getEntityTypeData","useGetEntityTypeData","expandedKey","useMemo","expandedFolderIds","_","isExpanded","id","childToParentMap","parentToChildrenMap","childToParent","parentToChildren","folder","parentId","children","visibleFolders","visible","queue","folderId","childrenIds","childId","createTaskRow","task","typeData","links","linksToTableData","createRootTaskRows","rootTaskRows","folderTaskIds","taskId","flatFolderRows","hasTasks","folderTypeData","row","folderTasks","taskRows","count","generateLoadingRows","flatRows","loadingTaskRows","rowsById","rootRows","i","childRow","parentRow"],"mappings":"+9iBAUMA,EAA6B,IAsBnC,SAAwBC,EAAyB,CAC/C,WAAAC,EACA,SAAAC,EACA,KAAAC,EACA,iBAAAC,EACA,SAAAC,EACA,cAAAC,EACA,iBAAAC,EAAmB,GACnB,iBAAAC,EAAmB,GACnB,aAAAC,EAAe,CAAA,EACf,cAAAC,EAAgB,GAChB,gBAAAC,EAAkB,CAAA,CACpB,EAAuB,CACrB,MAAMC,EAAUC,EAAAA,kBAAA,EACVC,EAAoBC,EAAAA,qBAAqB,CAAE,YAAaH,EAAS,EAGjEI,EAAcC,EAAAA,QAAQ,IAAM,KAAK,UAAUZ,CAAQ,EAAG,CAACA,CAAQ,CAAC,EAGhEa,EAAoBD,EAAAA,QAAQ,IACzB,IAAI,IACT,OAAO,QAAQZ,CAAQ,EACpB,OAAO,CAAC,CAACc,EAAGC,CAAU,IAAMA,CAAU,EACtC,IAAI,CAAC,CAACC,CAAE,IAAMA,CAAE,CAAA,EAEpB,CAACL,CAAW,CAAC,EAGV,CAAE,iBAAAM,EAAkB,oBAAAC,CAAA,EAAwBN,EAAAA,QAAQ,IAAM,CAC9D,MAAMO,MAAoB,IACpBC,MAAuB,IAG7B,UAAWC,KAAUzB,EAAW,SAAU,CACxC,GAAI,CAACyB,GAAQ,GAAI,SAEjB,MAAMC,EAAWD,EAAO,SACxB,GAAIC,EAAU,CACZH,EAAc,IAAIE,EAAO,GAAIC,CAAQ,EAErC,IAAIC,EAAWH,EAAiB,IAAIE,CAAQ,EACvCC,IACHA,MAAe,IACfH,EAAiB,IAAIE,EAAUC,CAAQ,GAEzCA,EAAS,IAAIF,EAAO,EAAE,CACxB,CACF,CAEA,MAAO,CAAE,iBAAkBF,EAAe,oBAAqBC,CAAA,CACjE,EAAG,CAACxB,CAAU,CAAC,EAGT4B,EAAiBZ,EAAAA,QAAQ,IAAM,CACnC,MAAMa,MAAc,IAGdC,EAAkB,CAAA,EACxB,UAAWL,KAAUzB,EAAW,SACzByB,GAAQ,KAGT,CAACA,EAAO,UAAY,CAACzB,EAAW,IAAIyB,EAAO,QAAQ,KACrDI,EAAQ,IAAIJ,EAAO,EAAE,EACrBK,EAAM,KAAKL,EAAO,EAAE,GAKxB,KAAOK,EAAM,OAAS,GAAG,CACvB,MAAMC,EAAWD,EAAM,MAAA,EAGvB,GAAI,CAFqBb,EAAkB,IAAIc,CAAQ,EAEhC,SAGvB,MAAMC,EAAcV,EAAoB,IAAIS,CAAQ,EACpD,GAAIC,EACF,UAAWC,KAAWD,EACfH,EAAQ,IAAII,CAAO,IACtBJ,EAAQ,IAAII,CAAO,EACnBH,EAAM,KAAKG,CAAO,EAI1B,CAEA,OAAOJ,CACT,EAAG,CAAC7B,EAAYsB,EAAqBL,CAAiB,CAAC,EAGvD,OAAOD,EAAAA,QAAQ,IAAM,CAEnB,MAAMkB,EAAgB,CAACC,EAAsBT,IAAgC,CAC3E,MAAMU,EAAWvB,EAAkB,OAAQsB,EAAK,QAAQ,EAElDE,EAAQC,EAAAA,iBAAiBH,EAAK,MAAO,OAAQxB,EAAQ,OAAO,EAElE,MAAO,CACL,GAAIwB,EAAK,GACT,WAAY,OACZ,SAAUT,GAAYS,EAAK,SAC3B,SAAUA,EAAK,SACf,KAAMA,EAAK,MAAQ,GACnB,MAAOA,EAAK,OAASA,EAAK,MAAQ,GAClC,KAAMC,GAAU,MAAQ,KACxB,MAAOA,GAAU,OAAS,KAC1B,OAAQD,EAAK,OACb,UAAWA,EAAK,UAChB,KAAMA,EAAK,KACX,IAAK,KACL,QAAS,CAAA,EACT,QAASA,EAAK,UAAY,KAC1B,OAAQA,EAAK,OACb,wBAAyBA,EAAK,MAAM,mBAAmB,OACnD,CAAC,gBAAgB,EACjB,OACJ,UAAWA,EAAK,UAChB,QAASA,EAAK,SAAW,CAAA,EACzB,KAAMA,EAAK,QAAQ,KAAK,GAAG,GAAK,KAChC,OAAQA,EAAK,QAAQA,EAAK,QAAQ,OAAS,CAAC,GAAK,OACjD,UAAWA,EAAK,UAChB,UAAWA,EAAK,UAChB,cAAeA,EAAK,cACpB,eAAgBA,EAAK,gBAAkB,GACvC,MAAAE,EACA,SAAUF,EAAK,UAAY,CAAA,EAC3B,eAAgBA,EAAK,gBAAkB,CAAA,CAAC,CAE5C,EAEMI,EAAqB,IAAkB,CAC3C,MAAMC,EAA2B,CAAA,EACjC,UAAWT,KAAYrB,EAAiB,CACtC,GAAIV,EAAW,IAAI+B,CAAQ,EAAG,SAC9B,MAAMU,EAAgBtC,EAAiB,IAAI4B,CAAQ,GAAK,CAAA,EACxD,UAAWW,KAAUD,EAAe,CAClC,MAAMN,EAAOlC,EAAS,IAAIyC,CAAM,EAC5BP,GAAMK,EAAa,KAAKN,EAAcC,CAAI,CAAC,CACjD,CACF,CACA,OAAOK,CACT,EAGA,GAAIlC,EAAkB,CACpB,MAAMqC,EAA6B,CAAA,EAEnC,UAAWlB,KAAUzB,EAAW,SAAU,CACxC,GAAI,CAACyB,GAAQ,GAAI,SAGjB,MAAMmB,EAAWnB,EAAO,UAAYtB,EAAiB,IAAIsB,EAAO,EAAE,EAElE,GAAI,CAAClB,GAAoB,CAACqC,EAAU,SAEpC,MAAMC,EAAiBhC,EAAkB,SAAUY,EAAO,UAAU,EAC9DY,EAAQC,EAAAA,iBAAiBb,EAAO,MAAO,SAAUd,EAAQ,OAAO,EAEhEmC,EAAgB,CACpB,GAAIrB,EAAO,GACX,WAAY,SACZ,SAAU,OACV,SAAUA,EAAO,GACjB,KAAMA,EAAO,MAAQ,GACrB,MAAOA,EAAO,OAASA,EAAO,MAAQ,GACtC,KAAMoB,GAAgB,MAAQ,KAC9B,MAAOA,GAAgB,OAAS,KAChC,IAAK,KACL,QAAS,CAAA,EACT,OAAQpB,EAAO,OACf,KAAMA,EAAO,MAAQ,CAAA,EACrB,QAASA,EAAO,YAAc,KAC9B,UAAWA,EAAO,WAAa,CAAA,EAC/B,KAAMA,EAAO,KACb,OAAQA,EAAO,QAAQA,EAAO,QAAQ,OAAS,CAAC,GAAK,OACrD,OAAQA,EAAO,QAAU,CAAA,EACzB,eAAgBA,EAAO,gBAAkB,GACzC,UAAWA,EAAO,UAClB,UAAWA,EAAO,UAClB,cAAeA,EAAO,cACtB,eAAgBA,EAAO,gBAAkB,GACzC,YAAaA,EAAO,aAAe,GACnC,MAAAY,CAAA,EAIF,GAAIpB,EAAkB,IAAIQ,EAAO,EAAE,EAAG,CAEpC,MAAMsB,GADgB5C,EAAiB,IAAIsB,EAAO,EAAE,GAAK,CAAA,GACvB,QAASiB,GAAWzC,EAAS,IAAIyC,CAAM,GAAK,EAAE,EAEhF,GAAIK,EAAY,QAAUvC,EAAaiB,EAAO,EAAE,EAAG,CACjD,MAAMuB,EAAWD,EAAY,IAAKZ,GAASD,EAAcC,EAAMV,EAAO,EAAE,CAAC,EAEzE,GAAIjB,EAAaiB,EAAO,EAAE,EAAG,CAC3B,MAAMwB,EAAQzC,EAAaiB,EAAO,EAAE,EAChCwB,EAAQ,GACVD,EAAS,KAAK,GAAGE,sBAAoBD,EAAO,CAAE,SAAUxB,EAAO,EAAA,CAAI,CAAC,CAExE,CAEAqB,EAAI,QAAUE,CAChB,CACF,CAEAL,EAAe,KAAKG,CAAG,CACzB,CAEA,OAAAH,EAAe,KAAK,GAAGJ,GAAoB,EAEpCI,CACT,CAGA,GAAI,CAACtC,EAAe,CAClB,MAAM8C,EAAuB,CAAA,EAG7B,UAAWhB,KAAQlC,EAAS,SACrBkC,EAAK,IACVgB,EAAS,KAAKjB,EAAcC,CAAI,CAAC,EAInC,UAAWW,KAAO5C,GAAQ,GACxBiD,EAAS,KAAKL,CAAG,EAInB,GAAIrC,EAAe,CAEjB,MAAMwC,EAAQnD,EACC,CACb,MAAMsD,EAAkBF,EAAAA,oBAAoBD,EAAO,CACjD,KAAM,MAAA,CACP,EAEDE,EAAS,KAAK,GAAGC,CAAe,CAClC,CACF,CAEA,OAAOD,CACT,CAGA,MAAME,MAAe,IACfC,EAAuB,CAAA,EAG7B,UAAWvB,KAAYH,EAAgB,CACrC,MAAMH,EAASzB,EAAW,IAAI+B,CAAQ,EACtC,GAAI,CAACN,EAAQ,SAEb,MAAMY,EAAQC,EAAAA,iBAAiBb,EAAO,MAAO,SAAUd,EAAQ,OAAO,EAEhEkC,EAAiBhC,EAAkB,SAAUY,EAAO,UAAU,EAG9DqB,EAAgB,CACpB,GAAIf,EACJ,WAAY,SACZ,SAAUN,EAAO,UAAY,OAC7B,SAAUM,GAAY,KACtB,KAAMN,EAAO,MAAQ,GACrB,MAAOA,EAAO,OAASA,EAAO,MAAQ,GACtC,KAAMoB,GAAgB,MAAQ,KAC9B,MAAOA,GAAgB,OAAS,KAChC,IAAK,KACL,QAAS,CAAA,EACT,OAAQpB,EAAO,OACf,KAAMA,EAAO,MAAQ,CAAA,EACrB,QAASA,EAAO,YAAc,KAC9B,UAAWA,EAAO,WAAa,CAAA,EAC/B,KAAMA,EAAO,KACb,OAAQA,EAAO,QAAQA,EAAO,QAAQ,OAAS,CAAC,GAAK,OACrD,OAAQA,EAAO,QAAU,CAAA,EACzB,eAAgBA,EAAO,gBAAkB,GACzC,UAAWA,EAAO,UAClB,UAAWA,EAAO,UAClB,cAAeA,EAAO,cACtB,eAAgBA,EAAO,gBAAkB,GACzC,YAAaA,EAAO,aAAe,GACnC,MAAAY,CAAA,EAWF,GARAgB,EAAS,IAAItB,EAAUe,CAAG,GAGtB,CAACrB,EAAO,UAAY,CAACzB,EAAW,IAAIyB,EAAO,QAAQ,IACrD6B,EAAS,KAAKR,CAAG,EAIf7B,EAAkB,IAAIc,CAAQ,EAAG,CAInC,MAAMgB,GADgB5C,EAAiB,IAAI4B,CAAQ,GAAK,CAAA,GACtB,QAASW,GAAWzC,EAAS,IAAIyC,CAAM,GAAK,EAAE,EAEhF,GAAIK,EAAY,QAAUvC,EAAauB,CAAQ,EAAG,CAEhD,MAAMiB,EAAW,IAAI,MAAgBD,EAAY,MAAM,EAGvD,QAASQ,EAAI,EAAGA,EAAIR,EAAY,OAAQQ,IACtCP,EAASO,CAAC,EAAIrB,EAAca,EAAYQ,CAAC,EAAGxB,CAAQ,EAItD,GAAIvB,EAAauB,CAAQ,EAAG,CAC1B,MAAMkB,EAAQzC,EAAauB,CAAQ,EACnC,GAAIkB,EAAQ,EAAG,CACb,MAAMG,EAAkBF,EAAAA,oBAAoBD,EAAO,CAAE,SAAUlB,EAAU,EAEzEiB,EAAS,KAAK,GAAGI,CAAe,CAClC,CACF,CAEAN,EAAI,QAAUE,CAChB,CACF,CACF,CAGA,UAAWjB,KAAYH,EAAgB,CACrC,MAAMF,EAAWL,EAAiB,IAAIU,CAAQ,EAC9C,GAAI,CAACL,GAAY,CAACT,EAAkB,IAAIS,CAAQ,EAAG,SAEnD,MAAM8B,EAAWH,EAAS,IAAItB,CAAQ,EAChC0B,EAAYJ,EAAS,IAAI3B,CAAQ,EAEnC,CAAC8B,GAAY,CAACC,GAGlBA,EAAU,SAAS,KAAKD,CAAQ,CAClC,CAMA,GAJAF,EAAS,KAAK,GAAGf,GAAoB,EAIjClC,GAAiBI,EAAe,CAClC,MAAMwC,EAAQnD,EAEZwD,EAAS,KAAK,GAAGJ,EAAAA,oBAAoBD,EAAO,CAAE,KAAM,MAAA,CAAQ,CAAC,CAEjE,CAGA,UAAWH,KAAO5C,GAAQ,GACxBoD,EAAS,KAAKR,CAAG,EAGnB,OAAOQ,CACT,EAAG,CACDtD,EACAC,EACAE,EACAD,EACA0B,EACAP,EACAJ,EACAZ,EACAC,EACAC,EACAC,EACAC,EACAC,CAAA,CACD,CACH"}