@outbuild-company/schedule-core 1.36.0 → 1.38.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.js CHANGED
@@ -8223,25 +8223,39 @@ function getVisibleBaseline(activity) {
8223
8223
  return points.find((point) => point.isVisibleVersion) ?? null;
8224
8224
  }
8225
8225
 
8226
- // src/columns/baseline-variance/compute.ts
8226
+ // src/columns/baseline-variance/baseline-variance-days.ts
8227
8227
  var VARIANCE_DECIMAL_SCALE = 100;
8228
8228
  var roundToVariancePrecision = (days) => Math.round(days * VARIANCE_DECIMAL_SCALE) / VARIANCE_DECIMAL_SCALE;
8229
- function varianceDaysForBaselineEnd(activity, baselineEnd, calendars, hoursPerDay) {
8230
- if (hoursPerDay <= 0) return null;
8231
- const activityEnd = activity.endDate;
8232
- if (!baselineEnd || !activityEnd) return null;
8233
- const finishesLate = activityEnd.getTime() > baselineEnd.getTime();
8234
- const finishesEarly = baselineEnd.getTime() > activityEnd.getTime();
8229
+ function baselineVarianceDays(input) {
8230
+ const { endDate, baselineEnd, calendar, hoursPerDay } = input;
8231
+ const hasUsableHoursPerDay = Number.isFinite(hoursPerDay) && hoursPerDay > 0;
8232
+ if (!hasUsableHoursPerDay) return null;
8233
+ if (!baselineEnd || !endDate) return null;
8234
+ const hasValidDates = Number.isFinite(endDate.getTime()) && Number.isFinite(baselineEnd.getTime());
8235
+ if (!hasValidDates) return null;
8236
+ const finishesLate = endDate.getTime() > baselineEnd.getTime();
8237
+ const finishesEarly = baselineEnd.getTime() > endDate.getTime();
8235
8238
  if (!finishesLate && !finishesEarly) return 0;
8236
- const durationHours = calendars.calculateDuration({
8237
- startDate: finishesLate ? baselineEnd : activityEnd,
8238
- endDate: finishesLate ? activityEnd : baselineEnd,
8239
- task: activity
8240
- });
8239
+ const durationHours = calendar.calculateDuration(
8240
+ finishesLate ? baselineEnd : endDate,
8241
+ finishesLate ? endDate : baselineEnd
8242
+ );
8241
8243
  const magnitude = roundToVariancePrecision(durationHours / hoursPerDay);
8242
8244
  if (magnitude === 0) return 0;
8243
8245
  return finishesLate ? magnitude : -magnitude;
8244
8246
  }
8247
+
8248
+ // src/columns/baseline-variance/compute.ts
8249
+ function varianceDaysForBaselineEnd(activity, baselineEnd, calendars, hoursPerDay) {
8250
+ return baselineVarianceDays({
8251
+ endDate: activity.endDate,
8252
+ baselineEnd,
8253
+ calendar: {
8254
+ calculateDuration: (startDate, endDate) => calendars.calculateDuration({ startDate, endDate, task: activity })
8255
+ },
8256
+ hoursPerDay
8257
+ });
8258
+ }
8245
8259
  function computeBaselineVarianceDays(activity, calendars, hoursPerDay) {
8246
8260
  return varianceDaysForBaselineEnd(
8247
8261
  activity,
@@ -14122,6 +14136,14 @@ var PASTE_PLACEMENT = {
14122
14136
  END: "end"
14123
14137
  };
14124
14138
 
14139
+ // src/dispatch/confirmations.ts
14140
+ var LOOKAHEAD_CONFIRMATION_KIND = {
14141
+ HAS_LOOKAHEAD_TASKS: "has_lookahead_tasks"
14142
+ };
14143
+ var CUSTOM_ID_CONFIRMATION_KIND = {
14144
+ PASTE_CONFLICTS: "custom_id_paste_conflicts"
14145
+ };
14146
+
14125
14147
  // src/activity-copy-paste/paste.ts
14126
14148
  function childIdsInCorrelativeOrder(parentId, adapter) {
14127
14149
  return collectChildrenSnapshots(parentId, adapter).sort(compareActivitiesInVisualOrder).map((activity) => activity.id);
@@ -14177,6 +14199,59 @@ var invariantFailure = () => ({
14177
14199
  ok: false,
14178
14200
  reason: REJECTION_REASON.ACTIVITY_PASTE_INVARIANT_FAILED
14179
14201
  });
14202
+ function customIdHolders(adapter) {
14203
+ const holders = /* @__PURE__ */ new Map();
14204
+ adapter.forEachActivity((activity, activityId) => {
14205
+ if (activity.customId !== null) {
14206
+ holders.set(activity.customId, String(activityId));
14207
+ }
14208
+ });
14209
+ return holders;
14210
+ }
14211
+ function conflictingCustomIds(clipboard, deps) {
14212
+ const holders = customIdHolders(deps.adapter);
14213
+ const copiedCustomIds = /* @__PURE__ */ new Set();
14214
+ const conflicts = /* @__PURE__ */ new Set();
14215
+ for (const copied of clipboard.activities) {
14216
+ const customId = copied.overrides.customId;
14217
+ if (typeof customId !== "string" || customId.length === 0) continue;
14218
+ const isHeldByAnotherActivity = deps.customIdTracker.isCustomIdInUse(customId) && holders.get(customId) !== String(copied.originalId);
14219
+ if (isHeldByAnotherActivity || copiedCustomIds.has(customId)) {
14220
+ conflicts.add(customId);
14221
+ }
14222
+ copiedCustomIds.add(customId);
14223
+ }
14224
+ return [...conflicts];
14225
+ }
14226
+ function reserveFreeCopiedCustomIds(clipboard, deps) {
14227
+ const reserved = /* @__PURE__ */ new Set();
14228
+ for (const copied of clipboard.activities) {
14229
+ const customId = copied.overrides.customId;
14230
+ const isFreeCopiedCustomId = typeof customId === "string" && customId.length > 0 && !deps.customIdTracker.isCustomIdInUse(customId);
14231
+ if (!isFreeCopiedCustomId) continue;
14232
+ deps.customIdTracker.registerCustomId(customId);
14233
+ reserved.add(customId);
14234
+ }
14235
+ return reserved;
14236
+ }
14237
+ function releaseReservedCustomId(customId, reserved, deps) {
14238
+ if (typeof customId !== "string" || !reserved.has(customId)) return;
14239
+ deps.customIdTracker.releaseCustomId(customId);
14240
+ reserved.delete(customId);
14241
+ }
14242
+ function customIdConflictRejection(clipboard, options, deps) {
14243
+ if (options.regenerateConflictingCustomIds === true) return null;
14244
+ const customIds = conflictingCustomIds(clipboard, deps);
14245
+ if (customIds.length === 0) return null;
14246
+ return {
14247
+ ok: false,
14248
+ reason: REJECTION_REASON.CONFIRMATION_REQUIRED,
14249
+ confirmation: {
14250
+ kind: CUSTOM_ID_CONFIRMATION_KIND.PASTE_CONFLICTS,
14251
+ customIds
14252
+ }
14253
+ };
14254
+ }
14180
14255
  async function dispatchActivityPasteCopied(action, options, deps) {
14181
14256
  const clipboard = deps.activityClipboard.value;
14182
14257
  if (clipboard === null) {
@@ -14184,6 +14259,8 @@ async function dispatchActivityPasteCopied(action, options, deps) {
14184
14259
  }
14185
14260
  const destination = resolvePasteDestination(action.destination, deps.adapter);
14186
14261
  if (!destination.ok) return destination;
14262
+ const conflictRejection = customIdConflictRejection(clipboard, options, deps);
14263
+ if (conflictRejection !== null) return conflictRejection;
14187
14264
  const createOptions = createOptionsFor(action.destination, destination);
14188
14265
  const beforeSnapshot = await snapshotActivities(
14189
14266
  deps.adapter,
@@ -14193,7 +14270,9 @@ async function dispatchActivityPasteCopied(action, options, deps) {
14193
14270
  const originalToNew = /* @__PURE__ */ new Map();
14194
14271
  const createdIds = [];
14195
14272
  let previousRootId;
14273
+ const reservedCustomIds = reserveFreeCopiedCustomIds(clipboard, deps);
14196
14274
  for (const copied of clipboard.activities) {
14275
+ releaseReservedCustomId(copied.overrides.customId, reservedCustomIds, deps);
14197
14276
  const mappedParent = originalToNew.get(copied.originalParentId);
14198
14277
  const afterSiblingId = mappedParent === void 0 ? previousRootId ?? destination.afterSiblingId : void 0;
14199
14278
  const beforeSiblingId = mappedParent === void 0 && afterSiblingId === void 0 ? destination.beforeSiblingId : void 0;
@@ -14286,11 +14365,6 @@ async function dispatchActivityPasteCopied(action, options, deps) {
14286
14365
  };
14287
14366
  }
14288
14367
 
14289
- // src/dispatch/confirmations.ts
14290
- var LOOKAHEAD_CONFIRMATION_KIND = {
14291
- HAS_LOOKAHEAD_TASKS: "has_lookahead_tasks"
14292
- };
14293
-
14294
14368
  // src/dispatch/shared/hierarchy-cycle-guard.ts
14295
14369
  function reparentClosesEffectiveCycle(adapter, reparented) {
14296
14370
  return !validateReparenting(adapter, { reparented }).ok;
@@ -21030,7 +21104,7 @@ var ACTIVITY_COPY_FIELDS = [
21030
21104
 
21031
21105
  // src/activity-copy-paste/copy.ts
21032
21106
  function copyOverrides(activity) {
21033
- const overrides = {};
21107
+ const overrides = { customId: activity.customId };
21034
21108
  for (const field of ACTIVITY_COPY_FIELDS) {
21035
21109
  Object.assign(overrides, { [field]: cloneDomainValue(activity[field]) });
21036
21110
  }
@@ -38113,6 +38187,6 @@ var CREATION_KIND = {
38113
38187
  ROOT: "root"
38114
38188
  };
38115
38189
 
38116
- export { ACTIVITY_BATCH_ACTION_KIND, ACTIVITY_BATCH_MODE, ACTIVITY_DATE_EDGE, ACTIVITY_FIELD, ACTIVITY_PONDERATOR_CRITERION, ACTIVITY_PROGRESS_ORIGIN, ACTIVITY_TYPE, BASELINE_ROLE, CALENDAR_UNIT, CHANGE_SET_SOURCE_KIND, COLUMN, COMPLETED_PROGRESS, CONFIRMATION_KIND, CONSTRAINT_TYPE, CONSTRAINT_TYPE_TO_LABEL, CONSTRAINT_WARNING_KIND, CREATION_KIND, P6_PROPERTY_CONTRACT as DATA_DATE_PROPERTY_CONTRACT, DATE_GESTURE_KIND, DEFAULT_HOURS_PER_DAY, DISPATCH_ACTION_KIND, DISPATCH_ACTION_KINDS, DISPATCH_LINK_OPERATION_KIND, DISPATCH_TRACK_EVENT, P6CapabilityError as DataDateCapabilityError, EDIT_ALERT_KEY, EDIT_DENIAL_REASON, ENTITY_CHANGE_KIND, FILTER_FIELD, FILTER_LOGIC, FILTER_OPERATOR, FILTER_REJECTION_REASON, FILTER_VALUE_KIND, FLAT_WBS_DEPTH, GROUP_ID_PREFIX, GROUP_ID_SEPARATOR, LINK_BATCH_OPERATION_KIND, LINK_CODE, LINK_CODE_TO_TYPE, LINK_REJECTION_REASON, LINK_RELATIONSHIP, LINK_TYPE, LINK_TYPE_CODE, LOOKAHEAD_CONFIRMATION_KIND, LookaheadActualTransitionError, MINIMUM_GROUP_DEPTH, MINIMUM_GROUP_LEVEL, NEW_ACTIVITY_DEFAULTS, NOT_STARTED_PROGRESS, ORDER_DIRECTION, ORDER_MODE, PASTE_PLACEMENT, PERSISTENCE_REBASE_CONFLICT_KIND, PERSISTENCE_REBASE_ENTITY, REJECTION_REASON, RESTORABLE_ACTIVITY_FIELDS, ROOT_PARENT_ID, SCHEDULE_CORE_STATUS, SCHEDULE_EFFECT_KIND, SIR_AUTO_REJECT_REASON, STATUS, STATUS_CRITERIA, STRUCTURE_ACTIVITY_FIELDS, ScheduleCore, UNASSIGNED_GROUP_LABEL, UNASSIGNED_VALUE_ID, VIEW_ATTRIBUTE_KIND, VISUAL_ROW_KIND, WORK_TIME_DIRECTION, activityBackendRow, allowedSecondaryConstraintTypes, appendGroupRowId, buildGroupRowId, checkNoUpdatedLinks, computeExpectedProgress, createCalendarReader, createLookaheadDerivedFields, createOutbuildP6ScheduleSettings as createOutbuildDataDateScheduleSettings, createSchedule, p6InputFromDto as dataDateInputFromDto, decodeWireValue, encodeWireValue, expectedProgressFromBaseline, formatUtcAsP6WallDate, getActiveBaseline, getUnsavedActivities, hostScheduleInput, isRestorableActivityField, isRevertibleActivityField, isRootParent, isViewAttributeCriterion, isViewAttributeOrderRule, linkBackendRow, loadTimeWork, mapP6ScheduleOptions as mapDataDateScheduleOptions, movedToAnotherUtcDay, normalizeParentKey, parseFromBackend, parseP6DayAsCalendarStart, parseP6WallDateAsUtc, planLookaheadProgressActuals, prepareLookaheadProgressActuals, prepareLookaheadProgressActualsForPersistence, rescheduledOnLoad, resolveExpectedFinishDateSelection, resolveLookaheadActualDateSelection, serializeP6Activity as serializeDataDateActivity, serializeP6Settings as serializeDataDateSettings, serializeP6State as serializeDataDateState, willRunCriticalPath, yieldToBrowser };
38190
+ export { ACTIVITY_BATCH_ACTION_KIND, ACTIVITY_BATCH_MODE, ACTIVITY_DATE_EDGE, ACTIVITY_FIELD, ACTIVITY_PONDERATOR_CRITERION, ACTIVITY_PROGRESS_ORIGIN, ACTIVITY_TYPE, BASELINE_ROLE, CALENDAR_UNIT, CHANGE_SET_SOURCE_KIND, COLUMN, COMPLETED_PROGRESS, CONFIRMATION_KIND, CONSTRAINT_TYPE, CONSTRAINT_TYPE_TO_LABEL, CONSTRAINT_WARNING_KIND, CREATION_KIND, CUSTOM_ID_CONFIRMATION_KIND, P6_PROPERTY_CONTRACT as DATA_DATE_PROPERTY_CONTRACT, DATE_GESTURE_KIND, DEFAULT_HOURS_PER_DAY, DISPATCH_ACTION_KIND, DISPATCH_ACTION_KINDS, DISPATCH_LINK_OPERATION_KIND, DISPATCH_TRACK_EVENT, P6CapabilityError as DataDateCapabilityError, EDIT_ALERT_KEY, EDIT_DENIAL_REASON, ENTITY_CHANGE_KIND, FILTER_FIELD, FILTER_LOGIC, FILTER_OPERATOR, FILTER_REJECTION_REASON, FILTER_VALUE_KIND, FLAT_WBS_DEPTH, GROUP_ID_PREFIX, GROUP_ID_SEPARATOR, LINK_BATCH_OPERATION_KIND, LINK_CODE, LINK_CODE_TO_TYPE, LINK_REJECTION_REASON, LINK_RELATIONSHIP, LINK_TYPE, LINK_TYPE_CODE, LOOKAHEAD_CONFIRMATION_KIND, LookaheadActualTransitionError, MINIMUM_GROUP_DEPTH, MINIMUM_GROUP_LEVEL, NEW_ACTIVITY_DEFAULTS, NOT_STARTED_PROGRESS, ORDER_DIRECTION, ORDER_MODE, PASTE_PLACEMENT, PERSISTENCE_REBASE_CONFLICT_KIND, PERSISTENCE_REBASE_ENTITY, REJECTION_REASON, RESTORABLE_ACTIVITY_FIELDS, ROOT_PARENT_ID, SCHEDULE_CORE_STATUS, SCHEDULE_EFFECT_KIND, SIR_AUTO_REJECT_REASON, STATUS, STATUS_CRITERIA, STRUCTURE_ACTIVITY_FIELDS, ScheduleCore, UNASSIGNED_GROUP_LABEL, UNASSIGNED_VALUE_ID, VIEW_ATTRIBUTE_KIND, VISUAL_ROW_KIND, WORK_TIME_DIRECTION, activityBackendRow, allowedSecondaryConstraintTypes, appendGroupRowId, baselineVarianceDays, buildGroupRowId, checkNoUpdatedLinks, computeExpectedProgress, createCalendarReader, createLookaheadDerivedFields, createOutbuildP6ScheduleSettings as createOutbuildDataDateScheduleSettings, createSchedule, p6InputFromDto as dataDateInputFromDto, decodeWireValue, encodeWireValue, expectedProgressFromBaseline, formatUtcAsP6WallDate, getActiveBaseline, getUnsavedActivities, getVisibleBaseline, hostScheduleInput, isRestorableActivityField, isRevertibleActivityField, isRootParent, isViewAttributeCriterion, isViewAttributeOrderRule, linkBackendRow, loadTimeWork, mapP6ScheduleOptions as mapDataDateScheduleOptions, movedToAnotherUtcDay, normalizeParentKey, parseFromBackend, parseP6DayAsCalendarStart, parseP6WallDateAsUtc, planLookaheadProgressActuals, prepareLookaheadProgressActuals, prepareLookaheadProgressActualsForPersistence, rescheduledOnLoad, resolveExpectedFinishDateSelection, resolveLookaheadActualDateSelection, serializeP6Activity as serializeDataDateActivity, serializeP6Settings as serializeDataDateSettings, serializeP6State as serializeDataDateState, willRunCriticalPath, yieldToBrowser };
38117
38191
  //# sourceMappingURL=index.js.map
38118
38192
  //# sourceMappingURL=index.js.map