@outbuild-company/schedule-core 1.9.3 → 1.10.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/cdn/schedule-core.global.js +1 -1
- package/dist/cdn/schedule-core.global.js.map +1 -1
- package/dist/index.cjs +126 -33
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +10 -3
- package/dist/index.d.ts +10 -3
- package/dist/index.js +126 -33
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.cts
CHANGED
|
@@ -282,9 +282,9 @@ type StringOperator = 'includes' | 'notIncludes' | 'is' | 'isNot';
|
|
|
282
282
|
type NumberOperator = 'equals' | 'notEquals' | 'greaterThan' | 'lessThan' | 'greaterOrEqual' | 'lessOrEqual';
|
|
283
283
|
type DateOperator = 'after' | 'before';
|
|
284
284
|
type MembershipOperator = 'someOf' | 'notSomeOf';
|
|
285
|
-
type FilterOperator = StringOperator | NumberOperator | DateOperator | MembershipOperator;
|
|
285
|
+
type FilterOperator = StringOperator | NumberOperator | DateOperator | 'between' | MembershipOperator;
|
|
286
286
|
type StringFilterField = 'name' | 'description' | 'customId';
|
|
287
|
-
type NumberFilterField = 'correlativeId' | 'uniqueCorrelativeId' | 'progress' | 'durationDays' | 'calendarDuration' | 'cost' | 'usedCost' | 'realCost' | 'workHours' | 'realWorkHours' | 'ponderator' | 'freeSlackDays' | 'totalSlackDays' | 'expectedProgressBaseline' | 'baselineDurationDays' | 'baselineCost' | 'baselineWorkHours';
|
|
287
|
+
type NumberFilterField = 'correlativeId' | 'uniqueCorrelativeId' | 'progress' | 'durationDays' | 'calendarDuration' | 'cost' | 'usedCost' | 'realCost' | 'workHours' | 'realWorkHours' | 'ponderator' | 'freeSlackDays' | 'totalSlackDays' | 'expectedProgressBaseline' | 'baselineDurationDays' | 'baselineCost' | 'baselineWorkHours' | 'expectedProgress';
|
|
288
288
|
type DateFilterField = 'startDate' | 'endDate' | 'constraintDate' | 'baselineStartDate' | 'baselineEndDate' | 'earlyStart' | 'earlyFinish' | 'lateStart' | 'lateFinish';
|
|
289
289
|
type IdArrayFilterField = 'responsableIds' | 'tagIds';
|
|
290
290
|
type EnumFilterField = 'status' | 'constraintType';
|
|
@@ -298,7 +298,13 @@ interface Criterion<Field extends FilterField, Operator, Value> {
|
|
|
298
298
|
readonly operator: Operator;
|
|
299
299
|
readonly value: Value;
|
|
300
300
|
}
|
|
301
|
-
|
|
301
|
+
interface BetweenCriterion<Field extends FilterField, Value> {
|
|
302
|
+
readonly field: Field;
|
|
303
|
+
readonly operator: 'between';
|
|
304
|
+
readonly value: Value;
|
|
305
|
+
readonly valueTo: Value;
|
|
306
|
+
}
|
|
307
|
+
type FilterCriterion = Criterion<StringFilterField, StringOperator, string> | Criterion<NumberFilterField, NumberOperator, string | number> | BetweenCriterion<NumberFilterField, string | number> | Criterion<DateFilterField, DateOperator, string | number | Date> | BetweenCriterion<DateFilterField, string | number | Date> | Criterion<IdArrayFilterField, MembershipOperator, ReadonlyArray<string | number>> | Criterion<EnumFilterField, MembershipOperator, ReadonlyArray<string>> | Criterion<ReferenceFilterField, MembershipOperator, ReadonlyArray<string | number>> | Criterion<BooleanFilterField, MembershipOperator, ReadonlyArray<boolean>>;
|
|
302
308
|
interface FilterDateRange {
|
|
303
309
|
readonly start: Date;
|
|
304
310
|
readonly end: Date;
|
|
@@ -837,6 +843,7 @@ declare class ScheduleCore {
|
|
|
837
843
|
getChildrenIds(parentId: ActivityId | '0'): ReadonlyArray<ActivityId>;
|
|
838
844
|
getSelectedActivityIds(): string[];
|
|
839
845
|
getHiddenActivityIds(): string[];
|
|
846
|
+
getVisibleActivityIds(): string[];
|
|
840
847
|
getActiveFilter(): Readonly<FilterState> | null;
|
|
841
848
|
getActiveOrder(): Readonly<OrderState> | null;
|
|
842
849
|
getVisualOrderIds(): ReadonlyArray<ActivityId>;
|
package/dist/index.d.ts
CHANGED
|
@@ -282,9 +282,9 @@ type StringOperator = 'includes' | 'notIncludes' | 'is' | 'isNot';
|
|
|
282
282
|
type NumberOperator = 'equals' | 'notEquals' | 'greaterThan' | 'lessThan' | 'greaterOrEqual' | 'lessOrEqual';
|
|
283
283
|
type DateOperator = 'after' | 'before';
|
|
284
284
|
type MembershipOperator = 'someOf' | 'notSomeOf';
|
|
285
|
-
type FilterOperator = StringOperator | NumberOperator | DateOperator | MembershipOperator;
|
|
285
|
+
type FilterOperator = StringOperator | NumberOperator | DateOperator | 'between' | MembershipOperator;
|
|
286
286
|
type StringFilterField = 'name' | 'description' | 'customId';
|
|
287
|
-
type NumberFilterField = 'correlativeId' | 'uniqueCorrelativeId' | 'progress' | 'durationDays' | 'calendarDuration' | 'cost' | 'usedCost' | 'realCost' | 'workHours' | 'realWorkHours' | 'ponderator' | 'freeSlackDays' | 'totalSlackDays' | 'expectedProgressBaseline' | 'baselineDurationDays' | 'baselineCost' | 'baselineWorkHours';
|
|
287
|
+
type NumberFilterField = 'correlativeId' | 'uniqueCorrelativeId' | 'progress' | 'durationDays' | 'calendarDuration' | 'cost' | 'usedCost' | 'realCost' | 'workHours' | 'realWorkHours' | 'ponderator' | 'freeSlackDays' | 'totalSlackDays' | 'expectedProgressBaseline' | 'baselineDurationDays' | 'baselineCost' | 'baselineWorkHours' | 'expectedProgress';
|
|
288
288
|
type DateFilterField = 'startDate' | 'endDate' | 'constraintDate' | 'baselineStartDate' | 'baselineEndDate' | 'earlyStart' | 'earlyFinish' | 'lateStart' | 'lateFinish';
|
|
289
289
|
type IdArrayFilterField = 'responsableIds' | 'tagIds';
|
|
290
290
|
type EnumFilterField = 'status' | 'constraintType';
|
|
@@ -298,7 +298,13 @@ interface Criterion<Field extends FilterField, Operator, Value> {
|
|
|
298
298
|
readonly operator: Operator;
|
|
299
299
|
readonly value: Value;
|
|
300
300
|
}
|
|
301
|
-
|
|
301
|
+
interface BetweenCriterion<Field extends FilterField, Value> {
|
|
302
|
+
readonly field: Field;
|
|
303
|
+
readonly operator: 'between';
|
|
304
|
+
readonly value: Value;
|
|
305
|
+
readonly valueTo: Value;
|
|
306
|
+
}
|
|
307
|
+
type FilterCriterion = Criterion<StringFilterField, StringOperator, string> | Criterion<NumberFilterField, NumberOperator, string | number> | BetweenCriterion<NumberFilterField, string | number> | Criterion<DateFilterField, DateOperator, string | number | Date> | BetweenCriterion<DateFilterField, string | number | Date> | Criterion<IdArrayFilterField, MembershipOperator, ReadonlyArray<string | number>> | Criterion<EnumFilterField, MembershipOperator, ReadonlyArray<string>> | Criterion<ReferenceFilterField, MembershipOperator, ReadonlyArray<string | number>> | Criterion<BooleanFilterField, MembershipOperator, ReadonlyArray<boolean>>;
|
|
302
308
|
interface FilterDateRange {
|
|
303
309
|
readonly start: Date;
|
|
304
310
|
readonly end: Date;
|
|
@@ -837,6 +843,7 @@ declare class ScheduleCore {
|
|
|
837
843
|
getChildrenIds(parentId: ActivityId | '0'): ReadonlyArray<ActivityId>;
|
|
838
844
|
getSelectedActivityIds(): string[];
|
|
839
845
|
getHiddenActivityIds(): string[];
|
|
846
|
+
getVisibleActivityIds(): string[];
|
|
840
847
|
getActiveFilter(): Readonly<FilterState> | null;
|
|
841
848
|
getActiveOrder(): Readonly<OrderState> | null;
|
|
842
849
|
getVisualOrderIds(): ReadonlyArray<ActivityId>;
|
package/dist/index.js
CHANGED
|
@@ -336,8 +336,13 @@ var FIELD_REGISTRY = {
|
|
|
336
336
|
},
|
|
337
337
|
expectedProgressBaseline: {
|
|
338
338
|
valueKind: "number",
|
|
339
|
+
equalityPrecision: 2,
|
|
339
340
|
extract: (activity) => activity.expectedProgressBaseline
|
|
340
341
|
},
|
|
342
|
+
expectedProgress: {
|
|
343
|
+
valueKind: "number",
|
|
344
|
+
extract: (activity) => activity.expectedProgress
|
|
345
|
+
},
|
|
341
346
|
baselineDurationDays: {
|
|
342
347
|
valueKind: "number",
|
|
343
348
|
extract: (activity) => activity.baselineSnapshot?.durationDays ?? null
|
|
@@ -420,6 +425,9 @@ function toTargetDate(value) {
|
|
|
420
425
|
}
|
|
421
426
|
return new Date(Number.NaN);
|
|
422
427
|
}
|
|
428
|
+
function utcDayMs(date2) {
|
|
429
|
+
return Date.UTC(date2.getUTCFullYear(), date2.getUTCMonth(), date2.getUTCDate());
|
|
430
|
+
}
|
|
423
431
|
function matchString(value, target, operator) {
|
|
424
432
|
const isAbsent = value === null;
|
|
425
433
|
if (operator === "includes") {
|
|
@@ -432,24 +440,35 @@ function matchString(value, target, operator) {
|
|
|
432
440
|
if (operator === "isNot") return isAbsent || String(value) !== target;
|
|
433
441
|
return false;
|
|
434
442
|
}
|
|
435
|
-
function matchNumber(value, target, operator) {
|
|
443
|
+
function matchNumber(value, target, operator, equalityPrecision) {
|
|
436
444
|
if (value === null || typeof value !== "number") {
|
|
437
445
|
return operator === "notEquals";
|
|
438
446
|
}
|
|
439
|
-
|
|
440
|
-
if (operator === "
|
|
447
|
+
const equalityValue = equalityPrecision === void 0 ? value : Number(value.toFixed(equalityPrecision));
|
|
448
|
+
if (operator === "equals") return equalityValue === target;
|
|
449
|
+
if (operator === "notEquals") return equalityValue !== target;
|
|
441
450
|
if (operator === "greaterThan") return value > target;
|
|
442
451
|
if (operator === "lessThan") return value < target;
|
|
443
452
|
if (operator === "greaterOrEqual") return value >= target;
|
|
444
453
|
if (operator === "lessOrEqual") return value <= target;
|
|
445
454
|
return false;
|
|
446
455
|
}
|
|
456
|
+
function matchNumberBetween(value, minimum, maximum) {
|
|
457
|
+
return typeof value === "number" && value >= minimum && value <= maximum;
|
|
458
|
+
}
|
|
447
459
|
function matchDate(value, target, operator) {
|
|
448
460
|
if (!(value instanceof Date)) return false;
|
|
449
|
-
|
|
450
|
-
|
|
461
|
+
const valueDay = utcDayMs(value);
|
|
462
|
+
const targetDay = utcDayMs(target);
|
|
463
|
+
if (operator === "after") return valueDay > targetDay;
|
|
464
|
+
if (operator === "before") return valueDay < targetDay;
|
|
451
465
|
return false;
|
|
452
466
|
}
|
|
467
|
+
function matchDateBetween(value, minimum, maximum) {
|
|
468
|
+
if (!(value instanceof Date)) return false;
|
|
469
|
+
const day = utcDayMs(value);
|
|
470
|
+
return day >= utcDayMs(minimum) && day <= utcDayMs(maximum);
|
|
471
|
+
}
|
|
453
472
|
function matchIdArray(value, allowed, operator) {
|
|
454
473
|
const ids = Array.isArray(value) ? value : [];
|
|
455
474
|
const intersects = ids.some((id) => allowed.has(String(id)));
|
|
@@ -472,11 +491,33 @@ function matchCriterion(activity, criterion, context) {
|
|
|
472
491
|
if (descriptor === null) return false;
|
|
473
492
|
const value = descriptor.extract(activity, context);
|
|
474
493
|
const { operator } = criterion;
|
|
494
|
+
if (operator === "between") {
|
|
495
|
+
if (descriptor.valueKind === "number") {
|
|
496
|
+
return matchNumberBetween(
|
|
497
|
+
value,
|
|
498
|
+
Number(criterion.value),
|
|
499
|
+
Number(criterion.valueTo)
|
|
500
|
+
);
|
|
501
|
+
}
|
|
502
|
+
if (descriptor.valueKind === "date") {
|
|
503
|
+
return matchDateBetween(
|
|
504
|
+
value,
|
|
505
|
+
toTargetDate(criterion.value),
|
|
506
|
+
toTargetDate(criterion.valueTo)
|
|
507
|
+
);
|
|
508
|
+
}
|
|
509
|
+
return false;
|
|
510
|
+
}
|
|
475
511
|
if (descriptor.valueKind === "string") {
|
|
476
512
|
return matchString(value, String(criterion.value), operator);
|
|
477
513
|
}
|
|
478
514
|
if (descriptor.valueKind === "number") {
|
|
479
|
-
return matchNumber(
|
|
515
|
+
return matchNumber(
|
|
516
|
+
value,
|
|
517
|
+
Number(criterion.value),
|
|
518
|
+
operator,
|
|
519
|
+
descriptor.equalityPrecision
|
|
520
|
+
);
|
|
480
521
|
}
|
|
481
522
|
if (descriptor.valueKind === "date") {
|
|
482
523
|
return matchDate(value, toTargetDate(criterion.value), operator);
|
|
@@ -498,10 +539,10 @@ function matchesCriteria(activity, filter, context) {
|
|
|
498
539
|
);
|
|
499
540
|
}
|
|
500
541
|
function overlapsRange(activity, range) {
|
|
501
|
-
const taskStart = activity.startDate
|
|
502
|
-
const taskEnd = activity.endDate
|
|
503
|
-
const windowStart = range.start
|
|
504
|
-
const windowEnd = range.end
|
|
542
|
+
const taskStart = utcDayMs(activity.startDate);
|
|
543
|
+
const taskEnd = utcDayMs(activity.endDate);
|
|
544
|
+
const windowStart = utcDayMs(range.start);
|
|
545
|
+
const windowEnd = utcDayMs(range.end);
|
|
505
546
|
const fullyInside = taskStart >= windowStart && taskEnd <= windowEnd;
|
|
506
547
|
const startsInside = taskStart >= windowStart && taskStart <= windowEnd;
|
|
507
548
|
const windowStartsInside = windowStart >= taskStart && windowStart <= taskEnd;
|
|
@@ -651,9 +692,10 @@ var OPERATORS_BY_KIND = {
|
|
|
651
692
|
"greaterThan",
|
|
652
693
|
"lessThan",
|
|
653
694
|
"greaterOrEqual",
|
|
654
|
-
"lessOrEqual"
|
|
695
|
+
"lessOrEqual",
|
|
696
|
+
"between"
|
|
655
697
|
]),
|
|
656
|
-
date: /* @__PURE__ */ new Set(["after", "before"]),
|
|
698
|
+
date: /* @__PURE__ */ new Set(["after", "before", "between"]),
|
|
657
699
|
"id-array": /* @__PURE__ */ new Set(["someOf", "notSomeOf"]),
|
|
658
700
|
enum: /* @__PURE__ */ new Set(["someOf", "notSomeOf"]),
|
|
659
701
|
boolean: /* @__PURE__ */ new Set(["someOf", "notSomeOf"]),
|
|
@@ -684,6 +726,9 @@ function normalizeCriterion(criterion) {
|
|
|
684
726
|
if (!OPERATORS_BY_KIND[descriptor.valueKind].has(criterion.operator)) {
|
|
685
727
|
return { ok: false, reason: "unknown_operator" };
|
|
686
728
|
}
|
|
729
|
+
if (criterion.operator === "between") {
|
|
730
|
+
return normalizeBetweenCriterion(criterion, descriptor.valueKind);
|
|
731
|
+
}
|
|
687
732
|
if (descriptor.valueKind === "number") {
|
|
688
733
|
const value = normalizeNumberValue(criterion.value);
|
|
689
734
|
return value === null ? { ok: false, reason: "invalid_value" } : {
|
|
@@ -724,6 +769,31 @@ function normalizeCriterion(criterion) {
|
|
|
724
769
|
}
|
|
725
770
|
return { ok: true, criterion };
|
|
726
771
|
}
|
|
772
|
+
function normalizeBetweenCriterion(criterion, valueKind) {
|
|
773
|
+
if (valueKind === "number") {
|
|
774
|
+
const value = normalizeNumberValue(criterion.value);
|
|
775
|
+
const valueTo = normalizeNumberValue(criterion.valueTo);
|
|
776
|
+
if (value === null || valueTo === null || value > valueTo) {
|
|
777
|
+
return { ok: false, reason: "invalid_value" };
|
|
778
|
+
}
|
|
779
|
+
return {
|
|
780
|
+
ok: true,
|
|
781
|
+
criterion: { ...criterion, value, valueTo }
|
|
782
|
+
};
|
|
783
|
+
}
|
|
784
|
+
if (valueKind === "date") {
|
|
785
|
+
const value = normalizeDateValue(criterion.value);
|
|
786
|
+
const valueTo = normalizeDateValue(criterion.valueTo);
|
|
787
|
+
if (value === null || valueTo === null || value.getTime() > valueTo.getTime()) {
|
|
788
|
+
return { ok: false, reason: "invalid_value" };
|
|
789
|
+
}
|
|
790
|
+
return {
|
|
791
|
+
ok: true,
|
|
792
|
+
criterion: { ...criterion, value, valueTo }
|
|
793
|
+
};
|
|
794
|
+
}
|
|
795
|
+
return { ok: false, reason: "unknown_operator" };
|
|
796
|
+
}
|
|
727
797
|
function validateValueForKind(criterion, valueKind) {
|
|
728
798
|
const { value } = criterion;
|
|
729
799
|
if (valueKind === "boolean") {
|
|
@@ -1621,13 +1691,19 @@ function resolveExpansionAnchors(originalLink, adapter) {
|
|
|
1621
1691
|
userLag: originalLink.lag ?? 0,
|
|
1622
1692
|
sourceEndpointIsStart,
|
|
1623
1693
|
targetLag: targetEndpointIsFinish ? -endpointSpanHours(target, targetBounds, adapter) : 0,
|
|
1624
|
-
summarySourceId: originalLink.type === LINK_TYPE.START_TO_START && sourceBounds ? originalLink.source : void 0
|
|
1694
|
+
summarySourceId: originalLink.type === LINK_TYPE.START_TO_START && sourceBounds ? originalLink.source : void 0,
|
|
1695
|
+
finishAnchoredSummaryTargetId: targetEndpointIsFinish && targetBounds ? originalLink.target : void 0
|
|
1625
1696
|
};
|
|
1626
1697
|
}
|
|
1627
1698
|
function pushOffsetPreservingLinks(expanded, sourceIds, leafIds, originalLink, adapter, virtualIdCounter, linksByActivity) {
|
|
1628
1699
|
const anchors = resolveExpansionAnchors(originalLink, adapter);
|
|
1629
1700
|
const { source, sourceBounds, targetStart, userLag } = anchors;
|
|
1630
|
-
const {
|
|
1701
|
+
const {
|
|
1702
|
+
sourceEndpointIsStart,
|
|
1703
|
+
targetLag,
|
|
1704
|
+
summarySourceId,
|
|
1705
|
+
finishAnchoredSummaryTargetId
|
|
1706
|
+
} = anchors;
|
|
1631
1707
|
let counter = virtualIdCounter;
|
|
1632
1708
|
for (const srcId of sourceIds) {
|
|
1633
1709
|
const sourceLag = sourceEndpointIsStart ? sourceLagForLeaf(srcId, source, sourceBounds, adapter) : 0;
|
|
@@ -1650,7 +1726,7 @@ function pushOffsetPreservingLinks(expanded, sourceIds, leafIds, originalLink, a
|
|
|
1650
1726
|
targetLag,
|
|
1651
1727
|
userLag + offTarget,
|
|
1652
1728
|
summarySourceId,
|
|
1653
|
-
offTarget !== 0 && targetLag === 0 ? originalLink.target : void 0
|
|
1729
|
+
finishAnchoredSummaryTargetId ?? (offTarget !== 0 && targetLag === 0 ? originalLink.target : void 0)
|
|
1654
1730
|
)
|
|
1655
1731
|
);
|
|
1656
1732
|
counter += 1;
|
|
@@ -2098,7 +2174,7 @@ async function asapPass(orderedIds, links, adapter, options, isCurrent, plans) {
|
|
|
2098
2174
|
if (!maxStart || result.successorStart > maxStart) {
|
|
2099
2175
|
maxStart = result.successorStart;
|
|
2100
2176
|
drivingLinkId = String(link.id);
|
|
2101
|
-
drivingOffsetIsStale = link._summaryTargetId !== void 0 && !predecessorMovedThisRun;
|
|
2177
|
+
drivingOffsetIsStale = link._summaryTargetId !== void 0 && !predecessorMovedThisRun && (link._targetLag === 0 || options.preventSummaryTargetPullback === true);
|
|
2102
2178
|
}
|
|
2103
2179
|
}
|
|
2104
2180
|
const staleOffsetWouldPullBack = maxStart !== null && drivingOffsetIsStale && maxStart < activity.startDate;
|
|
@@ -9961,7 +10037,11 @@ async function runPostMutation(deps, args) {
|
|
|
9961
10037
|
if (passes.has(DERIVED_PASS.AUTOSCHEDULE)) {
|
|
9962
10038
|
await refreshMutatedParentBounds(deps.adapter, args);
|
|
9963
10039
|
}
|
|
9964
|
-
const schedule = passes.has(DERIVED_PASS.AUTOSCHEDULE) ? await runAutoschedule(
|
|
10040
|
+
const schedule = passes.has(DERIVED_PASS.AUTOSCHEDULE) ? await runAutoschedule(
|
|
10041
|
+
deps,
|
|
10042
|
+
args.autoscheduleFrom,
|
|
10043
|
+
args.preventSummaryTargetPullback
|
|
10044
|
+
) : emptySchedule();
|
|
9965
10045
|
await rollUpParentBounds(
|
|
9966
10046
|
deps.adapter,
|
|
9967
10047
|
args,
|
|
@@ -10032,8 +10112,11 @@ function collectFieldProgressInvalidations(adapter, beforeById, dirtySeeds, affe
|
|
|
10032
10112
|
}
|
|
10033
10113
|
}
|
|
10034
10114
|
}
|
|
10035
|
-
async function runAutoschedule(deps, autoscheduleFrom) {
|
|
10115
|
+
async function runAutoschedule(deps, autoscheduleFrom, preventSummaryTargetPullback = false) {
|
|
10036
10116
|
const options = autoscheduleFrom === "roots" ? {} : { triggerId: autoscheduleFrom };
|
|
10117
|
+
if (preventSummaryTargetPullback) {
|
|
10118
|
+
options.preventSummaryTargetPullback = true;
|
|
10119
|
+
}
|
|
10037
10120
|
const result = await deps.scheduler.schedule(options);
|
|
10038
10121
|
const outcome = captureScheduledRows(deps.adapter, result.updatedIds);
|
|
10039
10122
|
applyResults(deps.adapter, result);
|
|
@@ -11502,14 +11585,21 @@ async function createActivityCore(action, deps, opts = {}) {
|
|
|
11502
11585
|
recomputeUsedCostCascadeForActivity(newId, adapter);
|
|
11503
11586
|
recomputeCostCascadeForActivity(newId, adapter);
|
|
11504
11587
|
}
|
|
11505
|
-
|
|
11588
|
+
const correlativeShifts = recomputeCorrelatives(
|
|
11506
11589
|
adapter,
|
|
11507
11590
|
newId,
|
|
11508
|
-
beforeSnap,
|
|
11509
11591
|
initialTouched,
|
|
11510
11592
|
opts
|
|
11511
11593
|
);
|
|
11512
|
-
return {
|
|
11594
|
+
return {
|
|
11595
|
+
ok: true,
|
|
11596
|
+
newId,
|
|
11597
|
+
parent,
|
|
11598
|
+
newActivity,
|
|
11599
|
+
beforeSnap,
|
|
11600
|
+
initialTouched,
|
|
11601
|
+
correlativeShifts
|
|
11602
|
+
};
|
|
11513
11603
|
}
|
|
11514
11604
|
function validateCreateTarget(action, adapter) {
|
|
11515
11605
|
const isRoot = isRootParent(action.parentId);
|
|
@@ -11604,20 +11694,16 @@ function applyParentMutations(action, newId, parent, adapter, parentWasLeaf) {
|
|
|
11604
11694
|
);
|
|
11605
11695
|
}
|
|
11606
11696
|
}
|
|
11607
|
-
function
|
|
11608
|
-
if (opts.skipCorrelativeRecompute) return;
|
|
11609
|
-
const
|
|
11610
|
-
|
|
11611
|
-
foldCorrelativeShifts(
|
|
11612
|
-
adapter,
|
|
11613
|
-
correlativeShifts,
|
|
11614
|
-
/* @__PURE__ */ new Set([String(newId)]),
|
|
11615
|
-
beforeSnap,
|
|
11616
|
-
initialTouched
|
|
11697
|
+
function recomputeCorrelatives(adapter, newId, initialTouched, opts) {
|
|
11698
|
+
if (opts.skipCorrelativeRecompute) return [];
|
|
11699
|
+
const shifts = recomputeCorrelativeIds(adapter).filter(
|
|
11700
|
+
(shift) => shift.activityId !== String(newId)
|
|
11617
11701
|
);
|
|
11702
|
+
for (const shift of shifts) initialTouched.add(shift.activityId);
|
|
11703
|
+
return shifts;
|
|
11618
11704
|
}
|
|
11619
11705
|
async function buildCreateChangeSet(adapter, action, coreResult, scheduledIds, hoursPerDay) {
|
|
11620
|
-
const { newId, newActivity, beforeSnap, initialTouched } = coreResult;
|
|
11706
|
+
const { newId, newActivity, beforeSnap, initialTouched, correlativeShifts } = coreResult;
|
|
11621
11707
|
const trackingEvent = {
|
|
11622
11708
|
name: DISPATCH_TRACK_EVENT.ACTIVITY_CREATION,
|
|
11623
11709
|
properties: {
|
|
@@ -11634,6 +11720,7 @@ async function buildCreateChangeSet(adapter, action, coreResult, scheduledIds, h
|
|
|
11634
11720
|
beforeSnap,
|
|
11635
11721
|
touchedIds: initialTouched,
|
|
11636
11722
|
scheduledIds,
|
|
11723
|
+
correlativeShifts,
|
|
11637
11724
|
trackingEvents: [trackingEvent]});
|
|
11638
11725
|
}
|
|
11639
11726
|
async function dispatchActivityCreate(action, options, deps) {
|
|
@@ -11662,8 +11749,9 @@ async function dispatchActivityCreate(action, options, deps) {
|
|
|
11662
11749
|
},
|
|
11663
11750
|
{
|
|
11664
11751
|
action,
|
|
11665
|
-
autoscheduleFrom:
|
|
11752
|
+
autoscheduleFrom: newId,
|
|
11666
11753
|
recomputeParentsFrom: [newId],
|
|
11754
|
+
preventSummaryTargetPullback: true,
|
|
11667
11755
|
now: deps.now,
|
|
11668
11756
|
options
|
|
11669
11757
|
}
|
|
@@ -21350,6 +21438,11 @@ var ScheduleCore = class _ScheduleCore {
|
|
|
21350
21438
|
this.assertReady();
|
|
21351
21439
|
return this.coreRuntime.state.hiddenIds().map(String);
|
|
21352
21440
|
}
|
|
21441
|
+
getVisibleActivityIds() {
|
|
21442
|
+
this.assertReady();
|
|
21443
|
+
const hiddenIds = new Set(this.coreRuntime.state.hiddenIds().map(String));
|
|
21444
|
+
return this.coreRuntime.state.getAllIds().map(String).filter((activityId) => !hiddenIds.has(activityId));
|
|
21445
|
+
}
|
|
21353
21446
|
getActiveFilter() {
|
|
21354
21447
|
this.assertReady();
|
|
21355
21448
|
return cloneDomainValue(this.coreRuntime.state.getActiveFilter());
|