@outbuild-company/schedule-core 1.22.0 → 1.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -342,6 +342,7 @@ var LINK_REJECTION_REASON = {
342
342
  // src/dispatch/action-kinds.ts
343
343
  var DISPATCH_ACTION_KIND = {
344
344
  ACTIVITY_CLIPBOARD_CLEAR: "activity-clipboard-clear",
345
+ ACTIVITY_CLIPBOARD_IMPORT: "activity-clipboard-import",
345
346
  ACTIVITY_COPY: "activity-copy",
346
347
  CALENDAR_RECONCILE: "calendar-reconcile",
347
348
  ACTIVITY_PASTE_COPIED: "activity-paste-copied",
@@ -524,6 +525,7 @@ function createActivitiesApi(engine) {
524
525
  hasChildren: (parentId) => engine.hasChild(parentId),
525
526
  indentTargetParentIds: (ids) => engine.getIndentTargetParentIds(ids),
526
527
  isCustomIdInUse: (customId, currentCustomId) => engine.isCustomIdInUse(customId, currentCustomId ?? null),
528
+ clipboard: () => engine.getActivityClipboardView(),
527
529
  create: (input, options) => engine.dispatch(
528
530
  { ...input, kind: DISPATCH_ACTION_KIND.ACTIVITY_CREATE },
529
531
  options
@@ -606,6 +608,12 @@ function createActivitiesApi(engine) {
606
608
  ...context,
607
609
  kind: DISPATCH_ACTION_KIND.ACTIVITY_CLIPBOARD_CLEAR
608
610
  }),
611
+ importClipboard: (snapshot, references, context = {}) => engine.dispatch({
612
+ ...context,
613
+ kind: DISPATCH_ACTION_KIND.ACTIVITY_CLIPBOARD_IMPORT,
614
+ snapshot,
615
+ ...references === void 0 ? {} : { references }
616
+ }),
609
617
  lookaheadSync: (input) => engine.dispatch({
610
618
  ...input,
611
619
  kind: DISPATCH_ACTION_KIND.ACTIVITY_LOOKAHEAD_SYNC
@@ -948,6 +956,7 @@ var REJECTION_REASON = {
948
956
  ACTIVITY_IDS_EMPTY: "activity_ids_empty",
949
957
  NO_ACTIVITY_SELECTION: "no_activity_selection",
950
958
  CLIPBOARD_EMPTY: "clipboard_empty",
959
+ CLIPBOARD_SNAPSHOT_INVALID: "clipboard_snapshot_invalid",
951
960
  ACTIVITY_PASTE_INVARIANT_FAILED: "activity_paste_invariant_failed",
952
961
  SOLE_SCHEDULE_ROOT: "sole_schedule_root",
953
962
  ANCHOR_SIBLING_CONFLICT: "anchor_sibling_conflict",
@@ -11744,6 +11753,7 @@ var NON_SCHEDULING_INLINE_COLUMNS = /* @__PURE__ */ new Set([
11744
11753
  ]);
11745
11754
  var NON_SCHEDULING_KINDS = /* @__PURE__ */ new Set([
11746
11755
  DISPATCH_ACTION_KIND.ACTIVITY_CLIPBOARD_CLEAR,
11756
+ DISPATCH_ACTION_KIND.ACTIVITY_CLIPBOARD_IMPORT,
11747
11757
  DISPATCH_ACTION_KIND.ACTIVITY_COPY,
11748
11758
  DISPATCH_ACTION_KIND.CELL_CLIPBOARD_CLEAR,
11749
11759
  DISPATCH_ACTION_KIND.CELL_COPY,
@@ -11764,6 +11774,7 @@ var NON_SCHEDULING_KINDS = /* @__PURE__ */ new Set([
11764
11774
  ]);
11765
11775
  var PURE_VIEW_STATE_KINDS = /* @__PURE__ */ new Set([
11766
11776
  DISPATCH_ACTION_KIND.ACTIVITY_CLIPBOARD_CLEAR,
11777
+ DISPATCH_ACTION_KIND.ACTIVITY_CLIPBOARD_IMPORT,
11767
11778
  DISPATCH_ACTION_KIND.ACTIVITY_COPY,
11768
11779
  DISPATCH_ACTION_KIND.CELL_CLIPBOARD_CLEAR,
11769
11780
  DISPATCH_ACTION_KIND.CELL_COPY,
@@ -18381,8 +18392,7 @@ function dispatchActivityCopy(action, deps) {
18381
18392
  if (!selection.ok) return selection;
18382
18393
  return { ...selection, changes: { ...selection.changes, source: action } };
18383
18394
  }
18384
- function dispatchActivityClipboardClear(action, clipboard) {
18385
- clipboard.value = null;
18395
+ function clipboardOnlyResult(action) {
18386
18396
  return {
18387
18397
  ok: true,
18388
18398
  changes: {
@@ -18394,6 +18404,57 @@ function dispatchActivityClipboardClear(action, clipboard) {
18394
18404
  }
18395
18405
  };
18396
18406
  }
18407
+ function dispatchActivityClipboardClear(action, clipboard) {
18408
+ clipboard.value = null;
18409
+ return clipboardOnlyResult(action);
18410
+ }
18411
+ function keepKnownIds(ids, known) {
18412
+ if (ids === void 0 || known === void 0) return ids;
18413
+ const knownSet = new Set(known);
18414
+ return ids.filter((id) => knownSet.has(id));
18415
+ }
18416
+ function localizeOverrides(overrides, deps, references) {
18417
+ const localized = cloneDomainValue(overrides);
18418
+ const hasUnknownCalendar = localized.calendarId != null && !deps.calendars.has(localized.calendarId);
18419
+ if (hasUnknownCalendar) delete localized.calendarId;
18420
+ const hasUnknownSubcontract = references?.subcontractIds !== void 0 && localized.subcontractId != null && !references.subcontractIds.includes(localized.subcontractId);
18421
+ if (hasUnknownSubcontract) localized.subcontractId = null;
18422
+ const responsableIds = keepKnownIds(
18423
+ localized.responsableIds,
18424
+ references?.responsableIds
18425
+ );
18426
+ if (responsableIds !== void 0)
18427
+ localized.responsableIds = [...responsableIds];
18428
+ const tagIds = keepKnownIds(localized.tagIds, references?.tagIds);
18429
+ if (tagIds !== void 0) localized.tagIds = [...tagIds];
18430
+ return localized;
18431
+ }
18432
+ function hasDanglingLink(snapshot) {
18433
+ const copiedIds = new Set(
18434
+ snapshot.activities.map((entry) => String(entry.originalId))
18435
+ );
18436
+ return snapshot.links.some(
18437
+ (link) => !copiedIds.has(String(link.source)) || !copiedIds.has(String(link.target))
18438
+ );
18439
+ }
18440
+ function dispatchActivityClipboardImport(action, deps) {
18441
+ const { snapshot, references } = action;
18442
+ if (snapshot.activities.length === 0) {
18443
+ return { ok: false, reason: REJECTION_REASON.CLIPBOARD_EMPTY };
18444
+ }
18445
+ if (hasDanglingLink(snapshot)) {
18446
+ return { ok: false, reason: REJECTION_REASON.CLIPBOARD_SNAPSHOT_INVALID };
18447
+ }
18448
+ deps.clipboard.value = {
18449
+ activities: snapshot.activities.map((entry) => ({
18450
+ originalId: entry.originalId,
18451
+ originalParentId: entry.originalParentId,
18452
+ overrides: localizeOverrides(entry.overrides, deps, references)
18453
+ })),
18454
+ links: snapshot.links.map((link) => cloneDomainValue(link))
18455
+ };
18456
+ return clipboardOnlyResult(action);
18457
+ }
18397
18458
 
18398
18459
  // src/activity-copy-paste/paste.ts
18399
18460
  function resolveDestination(afterSiblingId, adapter) {
@@ -18999,6 +19060,12 @@ async function performDispatch(action, options, deps) {
18999
19060
  if (action.kind === DISPATCH_ACTION_KIND.ACTIVITY_CLIPBOARD_CLEAR) {
19000
19061
  return dispatchActivityClipboardClear(action, deps.activityClipboard);
19001
19062
  }
19063
+ if (action.kind === DISPATCH_ACTION_KIND.ACTIVITY_CLIPBOARD_IMPORT) {
19064
+ return dispatchActivityClipboardImport(action, {
19065
+ clipboard: deps.activityClipboard,
19066
+ calendars: deps.calendars
19067
+ });
19068
+ }
19002
19069
  if (action.kind === DISPATCH_ACTION_KIND.ACTIVITY_PASTE_COPIED) {
19003
19070
  return dispatchActivityPasteCopied(action, options, deps);
19004
19071
  }
@@ -23415,7 +23482,7 @@ function getDispatchHistoryPolicy(action) {
23415
23482
  if (action.kind === DISPATCH_ACTION_KIND.PERSISTENCE_ACKNOWLEDGE) {
23416
23483
  return DISPATCH_HISTORY_POLICY.CHECKPOINT_ON_SUCCESS;
23417
23484
  }
23418
- if (action.kind === DISPATCH_ACTION_KIND.SIR_SYNC || action.kind === DISPATCH_ACTION_KIND.CALENDAR_RECONCILE || action.kind === DISPATCH_ACTION_KIND.ACTIVITY_LOOKAHEAD_SYNC || action.kind === DISPATCH_ACTION_KIND.BASELINE_APPLY || action.kind === DISPATCH_ACTION_KIND.PONDERATOR_CRITERION_SET || action.kind === DISPATCH_ACTION_KIND.STATUS_CRITERIA_SET || action.kind === DISPATCH_ACTION_KIND.ACTIVITY_CLIPBOARD_CLEAR || action.kind === DISPATCH_ACTION_KIND.ACTIVITY_COPY || action.kind === DISPATCH_ACTION_KIND.SELECTION_TOGGLE || action.kind === DISPATCH_ACTION_KIND.SELECTION_REPLACE || action.kind === DISPATCH_ACTION_KIND.VISIBILITY_SET || action.kind === DISPATCH_ACTION_KIND.FILTER_SET || action.kind === DISPATCH_ACTION_KIND.SORT_SET || action.kind === DISPATCH_ACTION_KIND.VIEW_ATTRIBUTES_SET || action.kind === DISPATCH_ACTION_KIND.GROUP_SET || action.kind === DISPATCH_ACTION_KIND.WBS_DEPTH_SET) {
23485
+ if (action.kind === DISPATCH_ACTION_KIND.SIR_SYNC || action.kind === DISPATCH_ACTION_KIND.CALENDAR_RECONCILE || action.kind === DISPATCH_ACTION_KIND.ACTIVITY_LOOKAHEAD_SYNC || action.kind === DISPATCH_ACTION_KIND.BASELINE_APPLY || action.kind === DISPATCH_ACTION_KIND.PONDERATOR_CRITERION_SET || action.kind === DISPATCH_ACTION_KIND.STATUS_CRITERIA_SET || action.kind === DISPATCH_ACTION_KIND.ACTIVITY_CLIPBOARD_CLEAR || action.kind === DISPATCH_ACTION_KIND.ACTIVITY_CLIPBOARD_IMPORT || action.kind === DISPATCH_ACTION_KIND.ACTIVITY_COPY || action.kind === DISPATCH_ACTION_KIND.SELECTION_TOGGLE || action.kind === DISPATCH_ACTION_KIND.SELECTION_REPLACE || action.kind === DISPATCH_ACTION_KIND.VISIBILITY_SET || action.kind === DISPATCH_ACTION_KIND.FILTER_SET || action.kind === DISPATCH_ACTION_KIND.SORT_SET || action.kind === DISPATCH_ACTION_KIND.VIEW_ATTRIBUTES_SET || action.kind === DISPATCH_ACTION_KIND.GROUP_SET || action.kind === DISPATCH_ACTION_KIND.WBS_DEPTH_SET) {
23419
23486
  return DISPATCH_HISTORY_POLICY.SKIP;
23420
23487
  }
23421
23488
  return DISPATCH_HISTORY_POLICY.RECORD;
@@ -31171,6 +31238,18 @@ var ScheduleCore = class _ScheduleCore {
31171
31238
  this.assertReady();
31172
31239
  return readSelectedActivityIds(this.coreRuntime.state);
31173
31240
  }
31241
+ /**
31242
+ * Reads the core-owned activity clipboard as a portable snapshot.
31243
+ *
31244
+ * The snapshot can be imported into another `ScheduleCore` through the
31245
+ * `activity-clipboard-import` command, which is how a copy survives the
31246
+ * replacement of the schedule instance.
31247
+ * @returns A defensive copy, or `null` when nothing has been copied.
31248
+ */
31249
+ getActivityClipboardView() {
31250
+ this.assertReady();
31251
+ return cloneDomainValue(this._activityClipboard.value);
31252
+ }
31174
31253
  /** @returns A defensive snapshot of explicitly hidden activity IDs. */
31175
31254
  getHiddenActivityIds() {
31176
31255
  this.assertReady();