@ynput/ayon-frontend-shared 0.3.10 → 0.3.11

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 (21) hide show
  1. package/dist/api.cjs.js +1 -1
  2. package/dist/api.es.js +123 -122
  3. package/dist/shared/src/api/queries/tasks/updateTasks.cjs.js +1 -1
  4. package/dist/shared/src/api/queries/tasks/updateTasks.cjs.js.map +1 -1
  5. package/dist/shared/src/api/queries/tasks/updateTasks.es.js +40 -22
  6. package/dist/shared/src/api/queries/tasks/updateTasks.es.js.map +1 -1
  7. package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.cjs.js +1 -1
  8. package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.cjs.js.map +1 -1
  9. package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.es.js +93 -93
  10. package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.es.js.map +1 -1
  11. package/dist/shared/src/containers/ProjectTreeTable/context/ClipboardContext.cjs.js +4 -4
  12. package/dist/shared/src/containers/ProjectTreeTable/context/ClipboardContext.cjs.js.map +1 -1
  13. package/dist/shared/src/containers/ProjectTreeTable/context/ClipboardContext.es.js +226 -226
  14. package/dist/shared/src/containers/ProjectTreeTable/context/ClipboardContext.es.js.map +1 -1
  15. package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildGroupByTableData.cjs.js +1 -1
  16. package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildGroupByTableData.cjs.js.map +1 -1
  17. package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildGroupByTableData.es.js +25 -24
  18. package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildGroupByTableData.es.js.map +1 -1
  19. package/dist/types/api/queries/entityLists/types.d.ts +1 -0
  20. package/dist/types/api/queries/tasks/updateTasks.d.ts +7 -0
  21. package/package.json +1 -1
@@ -261,13 +261,13 @@ import "../ProjectTreeTable.styled.es.js";
261
261
  import "../widgets/LoadMoreWidget.es.js";
262
262
  import "../context/ColumnSettingsContext.es.js";
263
263
  import { linksToTableData as E } from "../utils/linksToTableData.es.js";
264
- const P = "next-page", v = "_ungrouped", A = "__", h = (t) => t ? Array.isArray(t) ? t.map((p) => p.toString()) : [t.toString()] : [], U = (t, p, n) => {
265
- if (!n)
264
+ const P = "next-page", v = "_ungrouped", A = "__", h = (t) => t ? Array.isArray(t) ? t.map((p) => p.toString()) : [t.toString()] : [], U = (t, p, s) => {
265
+ if (!s)
266
266
  return {
267
267
  value: p,
268
268
  label: p
269
269
  };
270
- const r = n.find((m) => m.value === p);
270
+ const r = s.find((m) => m.value === p);
271
271
  return r ? {
272
272
  value: r.value,
273
273
  label: r.label || r.value,
@@ -279,16 +279,16 @@ const P = "next-page", v = "_ungrouped", A = "__", h = (t) => t ? Array.isArray(
279
279
  value: p,
280
280
  label: p
281
281
  };
282
- }, c = "_GROUP_", O = (t) => `${c}${t}`, Pp = (t) => t.startsWith(c) ? t.slice(c.length) : null, Up = (t) => t.startsWith(c), S = (t, p, n = []) => {
282
+ }, c = "_GROUP_", O = (t) => `${c}${t}`, Pp = (t) => t.startsWith(c) ? t.slice(c.length) : null, Up = (t) => t.startsWith(c), S = (t, p, s = []) => {
283
283
  const r = t.id.replace("attrib.", "");
284
- return r === "status" ? p?.statuses?.map((m) => m.name) || [] : r === "taskType" ? p?.taskTypes?.map((m) => m.name) || [] : r === "folderType" ? p?.folderTypes?.map((m) => m.name) || [] : t.id.startsWith("attrib.") ? n.find((m) => m.name === r)?.data.enum?.map((m) => m.value.toString()) || [] : [];
285
- }, N = (t, p, n, r, m) => {
286
- const d = m(n, t.taskType);
284
+ return r === "status" ? p?.statuses?.map((m) => m.name) || [] : r === "taskType" ? p?.taskTypes?.map((m) => m.name) || [] : r === "folderType" ? p?.folderTypes?.map((m) => m.name) || [] : t.id.startsWith("attrib.") ? s.find((m) => m.name === r)?.data.enum?.map((m) => m.value.toString()) || [] : [];
285
+ }, N = (t, p, s, r, m) => {
286
+ const d = m(s, t.taskType);
287
287
  return {
288
288
  id: t.id + A + p,
289
289
  // unique id for the task in the folder
290
290
  entityId: t.id,
291
- entityType: n,
291
+ entityType: s,
292
292
  parentId: t.folderId,
293
293
  name: t.name || "",
294
294
  label: t.label || t.name || "",
@@ -304,27 +304,28 @@ const P = "next-page", v = "_ungrouped", A = "__", h = (t) => t ? Array.isArray(
304
304
  ownAttrib: t.ownAttrib,
305
305
  parents: t.parents || [],
306
306
  updatedAt: t.updatedAt,
307
- links: E(t.links, n, {
307
+ links: E(t.links, s, {
308
308
  folderTypes: r?.folderTypes || [],
309
309
  productTypes: Object.values(r.productTypes) || [],
310
310
  taskTypes: r?.taskTypes || []
311
- })
311
+ }),
312
+ subtasks: t.subtasks || []
312
313
  };
313
314
  }, Op = ({
314
315
  entities: t,
315
316
  entityType: p,
316
- groups: n = [],
317
+ groups: s = [],
317
318
  attribFields: r,
318
319
  showEmpty: m,
319
320
  groupRowFunc: d
320
321
  // for versions etc
321
322
  }) => {
322
323
  const g = _(), R = D({ projectInfo: g }), f = x(
323
- (a, s) => {
324
- const l = d ? d(a) : N(a, s, p, g, R);
324
+ (a, n) => {
325
+ const l = d ? d(a) : N(a, n, p, g, R);
325
326
  return {
326
327
  ...l,
327
- id: a.id + A + s,
328
+ id: a.id + A + n,
328
329
  // unique id for the task in the group
329
330
  subRows: l.subRows || []
330
331
  };
@@ -332,10 +333,10 @@ const P = "next-page", v = "_ungrouped", A = "__", h = (t) => t ? Array.isArray(
332
333
  [d, R, p, g]
333
334
  );
334
335
  return (a) => {
335
- const s = /* @__PURE__ */ new Map();
336
- for (const e of n) {
337
- const i = e.value?.toString(), u = O(i), o = U(a.id, i, n);
338
- s.set(i, {
336
+ const n = /* @__PURE__ */ new Map();
337
+ for (const e of s) {
338
+ const i = e.value?.toString(), u = O(i), o = U(a.id, i, s);
339
+ n.set(i, {
339
340
  id: u,
340
341
  name: i,
341
342
  entityType: "group",
@@ -346,7 +347,7 @@ const P = "next-page", v = "_ungrouped", A = "__", h = (t) => t ? Array.isArray(
346
347
  });
347
348
  }
348
349
  const l = c + "." + v, w = () => {
349
- let e = s.get(l);
350
+ let e = n.get(l);
350
351
  return e || (e = {
351
352
  id: l,
352
353
  name: "Ungrouped",
@@ -355,7 +356,7 @@ const P = "next-page", v = "_ungrouped", A = "__", h = (t) => t ? Array.isArray(
355
356
  label: "Ungrouped",
356
357
  group: { value: l, label: "Ungrouped" },
357
358
  links: {}
358
- }, s.set(l, e)), e;
359
+ }, n.set(l, e)), e;
359
360
  };
360
361
  for (const [e, i] of t) {
361
362
  if (i.entityType !== p) continue;
@@ -367,13 +368,13 @@ const P = "next-page", v = "_ungrouped", A = "__", h = (t) => t ? Array.isArray(
367
368
  u = h(i[a.id]);
368
369
  u.length === 0 && w().subRows?.push(f(i, v));
369
370
  for (const o of u) {
370
- const T = s.get(o);
371
+ const T = n.get(o);
371
372
  T ? T.subRows?.push(f(i, o)) : w().subRows?.push(f(i, v));
372
373
  }
373
374
  if ("groups" in i && Array.isArray(i.groups)) {
374
375
  for (const o of i.groups)
375
- if (o.hasNextPage && s.has(o.value)) {
376
- const G = s.get(o.value);
376
+ if (o.hasNextPage && n.has(o.value)) {
377
+ const G = n.get(o.value);
377
378
  G && G.subRows?.push({
378
379
  id: `${o.value}-next-page`,
379
380
  name: "Load more tasks...",
@@ -386,7 +387,7 @@ const P = "next-page", v = "_ungrouped", A = "__", h = (t) => t ? Array.isArray(
386
387
  }
387
388
  }
388
389
  }
389
- const b = Array.from(s.values()), y = S(a, g, r);
390
+ const b = Array.from(n.values()), y = S(a, g, r);
390
391
  b.sort((e, i) => {
391
392
  if (e.group?.value === l) return 1;
392
393
  if (i.group?.value === l) return -1;
@@ -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 { 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'\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}\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 ? (Array.isArray(value) ? value.map((v) => v.toString()) : [value.toString()]) : []\n\n// get group label, color and icon\nconst getGroupData = (groupById: string, groupValue: string, groups?: EntityGroup[]): GroupData => {\n if (!groups)\n return {\n value: groupValue,\n label: groupValue,\n }\n\n const group = groups.find((g) => g.value === groupValue)\n if (!group) {\n return {\n value: groupValue,\n label: groupValue,\n }\n } else {\n return {\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 }\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}\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 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 updatedAt: task.updatedAt,\n links: linksToTableData(task.links, entityType, {\n folderTypes: project?.folderTypes || [],\n productTypes: Object.values(project.productTypes) || [],\n taskTypes: project?.taskTypes || [],\n }),\n }\n}\n\nconst useBuildGroupByTableData = ({\n entities,\n entityType,\n groups = [],\n attribFields,\n showEmpty,\n groupRowFunc, // for versions etc\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 const buildGroupByTableData = (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(groupBy.id, groupValue, groups)\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 = GROUP_BY_ID + '.' + UNGROUPED_VALUE // unique id for ungrouped group\n // gets the \"Ungrouped\" group, creating it if it doesn't exist\n const getUnGroupedGroup = () => {\n let ungroupedGroup = groupsMap.get(ungroupedId)\n if (!ungroupedGroup) {\n ungroupedGroup = {\n id: ungroupedId,\n name: 'Ungrouped',\n entityType: 'group',\n subRows: [],\n label: 'Ungrouped',\n group: { value: ungroupedId, label: 'Ungrouped' },\n links: {},\n }\n // create ungrouped group if it doesn't exist\n groupsMap.set(ungroupedId, ungroupedGroup)\n }\n return ungroupedGroup\n }\n\n for (const [id, 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 {\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(entityToGroupRow(entity as EditorTaskNode, UNGROUPED_VALUE))\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 groupsList.sort((a, b) => {\n if (a.group?.value === ungroupedId) return 1 // \"Ungrouped\" should be last\n if (b.group?.value === ungroupedId) return -1 // \"Ungrouped\" should 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\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\n } else {\n // for other groupings, sort by the group label\n return a.group?.label?.localeCompare(b.group?.label || '') || 0\n }\n })\n\n // filter out empty groups\n const nonEmptyGroups = groupsList.filter((group) => group.group?.count && group.group.count > 0)\n\n return showEmpty ? groupsList : nonEmptyGroups\n }\n\n return buildGroupByTableData\n}\n\nexport default useBuildGroupByTableData\n"],"names":["NEXT_PAGE_ID","UNGROUPED_VALUE","ROW_ID_SEPARATOR","valueToStringArray","value","v","getGroupData","groupById","groupValue","groups","group","g","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","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 { 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'\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}\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 ? (Array.isArray(value) ? value.map((v) => v.toString()) : [value.toString()]) : []\n\n// get group label, color and icon\nconst getGroupData = (groupById: string, groupValue: string, groups?: EntityGroup[]): GroupData => {\n if (!groups)\n return {\n value: groupValue,\n label: groupValue,\n }\n\n const group = groups.find((g) => g.value === groupValue)\n if (!group) {\n return {\n value: groupValue,\n label: groupValue,\n }\n } else {\n return {\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 }\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}\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 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 updatedAt: task.updatedAt,\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 }\n}\n\nconst useBuildGroupByTableData = ({\n entities,\n entityType,\n groups = [],\n attribFields,\n showEmpty,\n groupRowFunc, // for versions etc\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 const buildGroupByTableData = (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(groupBy.id, groupValue, groups)\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 = GROUP_BY_ID + '.' + UNGROUPED_VALUE // unique id for ungrouped group\n // gets the \"Ungrouped\" group, creating it if it doesn't exist\n const getUnGroupedGroup = () => {\n let ungroupedGroup = groupsMap.get(ungroupedId)\n if (!ungroupedGroup) {\n ungroupedGroup = {\n id: ungroupedId,\n name: 'Ungrouped',\n entityType: 'group',\n subRows: [],\n label: 'Ungrouped',\n group: { value: ungroupedId, label: 'Ungrouped' },\n links: {},\n }\n // create ungrouped group if it doesn't exist\n groupsMap.set(ungroupedId, ungroupedGroup)\n }\n return ungroupedGroup\n }\n\n for (const [id, 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 {\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(entityToGroupRow(entity as EditorTaskNode, UNGROUPED_VALUE))\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 groupsList.sort((a, b) => {\n if (a.group?.value === ungroupedId) return 1 // \"Ungrouped\" should be last\n if (b.group?.value === ungroupedId) return -1 // \"Ungrouped\" should 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\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\n } else {\n // for other groupings, sort by the group label\n return a.group?.label?.localeCompare(b.group?.label || '') || 0\n }\n })\n\n // filter out empty groups\n const nonEmptyGroups = groupsList.filter((group) => group.group?.count && group.group.count > 0)\n\n return showEmpty ? groupsList : nonEmptyGroups\n }\n\n return buildGroupByTableData\n}\n\nexport default useBuildGroupByTableData\n"],"names":["NEXT_PAGE_ID","UNGROUPED_VALUE","ROW_ID_SEPARATOR","valueToStringArray","value","v","getGroupData","groupById","groupValue","groups","group","g","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","a","b","indexA","indexB","nonEmptyGroups"],"mappings":"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"}
@@ -37,6 +37,7 @@ type ItemNodeData = {
37
37
  label?: string;
38
38
  ownAttrib: string[];
39
39
  parents?: string[];
40
+ subtasks?: string[];
40
41
  folder?: {
41
42
  folderType: string;
42
43
  };
@@ -1,4 +1,11 @@
1
1
  import { SubTaskNode } from '../..';
2
+ /**
3
+ * Patches list items caches that contain the specified task with updated subtasks
4
+ */
5
+ export declare const patchListItemsWithTask: (taskId: string, subtasks: SubTaskNode[], { state, dispatch }: {
6
+ state: any;
7
+ dispatch: any;
8
+ }, patches: any[]) => void;
2
9
  export declare const useUpdateSubtasksMutation: <R extends Record<string, any> = ({
3
10
  requestId?: undefined;
4
11
  status: import("@reduxjs/toolkit/query").QueryStatus.uninitialized;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ynput/ayon-frontend-shared",
3
- "version": "0.3.10",
3
+ "version": "0.3.11",
4
4
  "description": "Shared React components for AYON frontend",
5
5
  "main": "dist/index.cjs.js",
6
6
  "module": "dist/index.es.js",