@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/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
- type FilterCriterion = Criterion<StringFilterField, StringOperator, string> | Criterion<NumberFilterField, NumberOperator, string | number> | Criterion<DateFilterField, DateOperator, 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>>;
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
- type FilterCriterion = Criterion<StringFilterField, StringOperator, string> | Criterion<NumberFilterField, NumberOperator, string | number> | Criterion<DateFilterField, DateOperator, 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>>;
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
- if (operator === "equals") return value === target;
440
- if (operator === "notEquals") return value !== target;
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
- if (operator === "after") return value.getTime() > target.getTime();
450
- if (operator === "before") return value.getTime() < target.getTime();
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(value, Number(criterion.value), operator);
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.getTime();
502
- const taskEnd = activity.endDate.getTime();
503
- const windowStart = range.start.getTime();
504
- const windowEnd = range.end.getTime();
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 { sourceEndpointIsStart, targetLag, summarySourceId } = anchors;
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(deps, args.autoscheduleFrom) : emptySchedule();
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
- recomputeAndFoldCorrelatives(
11588
+ const correlativeShifts = recomputeCorrelatives(
11506
11589
  adapter,
11507
11590
  newId,
11508
- beforeSnap,
11509
11591
  initialTouched,
11510
11592
  opts
11511
11593
  );
11512
- return { ok: true, newId, parent, newActivity, beforeSnap, initialTouched };
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 recomputeAndFoldCorrelatives(adapter, newId, beforeSnap, initialTouched, opts) {
11608
- if (opts.skipCorrelativeRecompute) return;
11609
- const correlativeShifts = recomputeCorrelativeIds(adapter);
11610
- if (opts.skipBeforeSnap) return;
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: "roots",
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());