import type { Board } from '~/types/schema' export function diffBoards(cur: Board, imp: Board) { const res: any = { tasks: {}, stages: {}, categories: {}, layout: { changed: false } } const idSet = (arr: any[]) => new Set(arr.map((x) => x.uuid)) const curTasks = idSet(cur.tasks) const impTasks = idSet(imp.tasks) res.tasks.added = imp.tasks.filter((t) => !curTasks.has(t.uuid)).map((t) => t.uuid) res.tasks.removed = cur.tasks.filter((t) => !impTasks.has(t.uuid)).map((t) => t.uuid) res.tasks.modified = [] as any[] cur.tasks.forEach((t) => { if (!impTasks.has(t.uuid)) return const it = imp.tasks.find((x) => x.uuid === t.uuid)! const fields: string[] = [] if ((t.title || '') !== (it.title || '')) fields.push('title') if ((t.description || '') !== (it.description || '')) fields.push('description') if ((t.category || '') !== (it.category || '')) fields.push('category') if (JSON.stringify(t.steps || []) !== JSON.stringify(it.steps || [])) fields.push('steps') if (fields.length) res.tasks.modified.push({ id: t.uuid, fields }) }) const curCats = idSet(cur.categories) const impCats = idSet(imp.categories) res.categories.added = imp.categories.filter((c) => !curCats.has(c.uuid)).map((c) => c.uuid) res.categories.removed = cur.categories.filter((c) => !impCats.has(c.uuid)).map((c) => c.uuid) res.categories.modified = [] as any[] cur.categories.forEach((c) => { if (!impCats.has(c.uuid)) return const ic = imp.categories.find((x) => x.uuid === c.uuid)! const fields: string[] = [] if ((c.title || '') !== (ic.title || '')) fields.push('title') if ((c.color || '') !== (ic.color || '')) fields.push('color') if (fields.length) res.categories.modified.push({ id: c.uuid, fields }) }) const curStages = idSet(cur.stages) const impStages = idSet(imp.stages) res.stages.added = imp.stages.filter((s) => !curStages.has(s.uuid)).map((s) => s.uuid) res.stages.removed = cur.stages.filter((s) => !impStages.has(s.uuid)).map((s) => s.uuid) res.stages.modified = [] as any[] const arrDiff = (a: string[], b: string[]) => ({ added: b.filter((x) => !new Set(a).has(x)), removed: a.filter((x) => !new Set(b).has(x)), changedOrder: JSON.stringify(a) !== JSON.stringify(b) }) cur.stages.forEach((s) => { if (!impStages.has(s.uuid)) return const is = imp.stages.find((x) => x.uuid === s.uuid)! const fields: string[] = [] if ((s.title || '') !== (is.title || '')) fields.push('title') const d = arrDiff(s.tasks || [], is.tasks || []) if (d.added.length || d.removed.length || d.changedOrder) fields.push('tasks') if (fields.length) res.stages.modified.push({ id: s.uuid, fields }) }) res.layout.changed = JSON.stringify(cur.layout || {}) !== JSON.stringify(imp.layout || {}) return res }