@sprucelabs/spruce-calendar-components 22.3.15 → 22.3.18

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.
@@ -1033,6 +1033,87 @@ declare module '@sprucelabs/spruce-core-schemas/build/.spruce/schemas/core.schem
1033
1033
  interface CreateCalendarResponsePayloadEntity extends SchemaEntity<SpruceSchemas.Calendar.v2021_05_19.CreateCalendarResponsePayloadSchema> {
1034
1034
  }
1035
1035
  }
1036
+ namespace SpruceSchemas.Calendar.v2021_05_19 {
1037
+ interface DeleteCalendarEmitTarget {
1038
+ 'organizationId': string;
1039
+ 'calendarId': string;
1040
+ }
1041
+ interface DeleteCalendarEmitTargetSchema extends SpruceSchema.Schema {
1042
+ id: 'deleteCalendarEmitTarget';
1043
+ version: 'v2021_05_19';
1044
+ namespace: 'Calendar';
1045
+ name: '';
1046
+ fields: {
1047
+ /** . */
1048
+ 'organizationId': {
1049
+ type: 'id';
1050
+ isRequired: true;
1051
+ options: undefined;
1052
+ };
1053
+ /** . */
1054
+ 'calendarId': {
1055
+ type: 'id';
1056
+ isRequired: true;
1057
+ options: undefined;
1058
+ };
1059
+ };
1060
+ }
1061
+ interface DeleteCalendarEmitTargetEntity extends SchemaEntity<SpruceSchemas.Calendar.v2021_05_19.DeleteCalendarEmitTargetSchema> {
1062
+ }
1063
+ }
1064
+ namespace SpruceSchemas.Calendar.v2021_05_19 {
1065
+ interface DeleteCalendarEmitTargetAndPayload {
1066
+ /** Source. */
1067
+ 'source'?: SpruceSchemas.SpruceEventUtils.v2021_09_13.EventSource | undefined | null;
1068
+ 'target': SpruceSchemas.Calendar.v2021_05_19.DeleteCalendarEmitTarget;
1069
+ }
1070
+ interface DeleteCalendarEmitTargetAndPayloadSchema extends SpruceSchema.Schema {
1071
+ id: 'deleteCalendarEmitTargetAndPayload';
1072
+ version: 'v2021_05_19';
1073
+ namespace: 'Calendar';
1074
+ name: '';
1075
+ fields: {
1076
+ /** Source. */
1077
+ 'source': {
1078
+ label: 'Source';
1079
+ type: 'schema';
1080
+ options: {
1081
+ schema: SpruceSchemas.SpruceEventUtils.v2021_09_13.EventSourceSchema;
1082
+ };
1083
+ };
1084
+ /** . */
1085
+ 'target': {
1086
+ type: 'schema';
1087
+ isRequired: true;
1088
+ options: {
1089
+ schema: SpruceSchemas.Calendar.v2021_05_19.DeleteCalendarEmitTargetSchema;
1090
+ };
1091
+ };
1092
+ };
1093
+ }
1094
+ interface DeleteCalendarEmitTargetAndPayloadEntity extends SchemaEntity<SpruceSchemas.Calendar.v2021_05_19.DeleteCalendarEmitTargetAndPayloadSchema> {
1095
+ }
1096
+ }
1097
+ namespace SpruceSchemas.Calendar.v2021_05_19 {
1098
+ interface DeleteCalendarResponsePayload {
1099
+ 'totalDeleted'?: number | undefined | null;
1100
+ }
1101
+ interface DeleteCalendarResponsePayloadSchema extends SpruceSchema.Schema {
1102
+ id: 'deleteCalendarResponsePayload';
1103
+ version: 'v2021_05_19';
1104
+ namespace: 'Calendar';
1105
+ name: '';
1106
+ fields: {
1107
+ /** . */
1108
+ 'totalDeleted': {
1109
+ type: 'number';
1110
+ options: undefined;
1111
+ };
1112
+ };
1113
+ }
1114
+ interface DeleteCalendarResponsePayloadEntity extends SchemaEntity<SpruceSchemas.Calendar.v2021_05_19.DeleteCalendarResponsePayloadSchema> {
1115
+ }
1116
+ }
1036
1117
  namespace SpruceSchemas.Calendar.v2021_05_19 {
1037
1118
  interface CreateCalendarEventTypeEmitPayload {
1038
1119
  'name': string;
@@ -1542,87 +1623,6 @@ declare module '@sprucelabs/spruce-core-schemas/build/.spruce/schemas/core.schem
1542
1623
  interface CreateCalendarEventTypeResponsePayloadEntity extends SchemaEntity<SpruceSchemas.Calendar.v2021_05_19.CreateCalendarEventTypeResponsePayloadSchema> {
1543
1624
  }
1544
1625
  }
1545
- namespace SpruceSchemas.Calendar.v2021_05_19 {
1546
- interface DeleteCalendarEmitTarget {
1547
- 'organizationId': string;
1548
- 'calendarId': string;
1549
- }
1550
- interface DeleteCalendarEmitTargetSchema extends SpruceSchema.Schema {
1551
- id: 'deleteCalendarEmitTarget';
1552
- version: 'v2021_05_19';
1553
- namespace: 'Calendar';
1554
- name: '';
1555
- fields: {
1556
- /** . */
1557
- 'organizationId': {
1558
- type: 'id';
1559
- isRequired: true;
1560
- options: undefined;
1561
- };
1562
- /** . */
1563
- 'calendarId': {
1564
- type: 'id';
1565
- isRequired: true;
1566
- options: undefined;
1567
- };
1568
- };
1569
- }
1570
- interface DeleteCalendarEmitTargetEntity extends SchemaEntity<SpruceSchemas.Calendar.v2021_05_19.DeleteCalendarEmitTargetSchema> {
1571
- }
1572
- }
1573
- namespace SpruceSchemas.Calendar.v2021_05_19 {
1574
- interface DeleteCalendarEmitTargetAndPayload {
1575
- /** Source. */
1576
- 'source'?: SpruceSchemas.SpruceEventUtils.v2021_09_13.EventSource | undefined | null;
1577
- 'target': SpruceSchemas.Calendar.v2021_05_19.DeleteCalendarEmitTarget;
1578
- }
1579
- interface DeleteCalendarEmitTargetAndPayloadSchema extends SpruceSchema.Schema {
1580
- id: 'deleteCalendarEmitTargetAndPayload';
1581
- version: 'v2021_05_19';
1582
- namespace: 'Calendar';
1583
- name: '';
1584
- fields: {
1585
- /** Source. */
1586
- 'source': {
1587
- label: 'Source';
1588
- type: 'schema';
1589
- options: {
1590
- schema: SpruceSchemas.SpruceEventUtils.v2021_09_13.EventSourceSchema;
1591
- };
1592
- };
1593
- /** . */
1594
- 'target': {
1595
- type: 'schema';
1596
- isRequired: true;
1597
- options: {
1598
- schema: SpruceSchemas.Calendar.v2021_05_19.DeleteCalendarEmitTargetSchema;
1599
- };
1600
- };
1601
- };
1602
- }
1603
- interface DeleteCalendarEmitTargetAndPayloadEntity extends SchemaEntity<SpruceSchemas.Calendar.v2021_05_19.DeleteCalendarEmitTargetAndPayloadSchema> {
1604
- }
1605
- }
1606
- namespace SpruceSchemas.Calendar.v2021_05_19 {
1607
- interface DeleteCalendarResponsePayload {
1608
- 'totalDeleted'?: number | undefined | null;
1609
- }
1610
- interface DeleteCalendarResponsePayloadSchema extends SpruceSchema.Schema {
1611
- id: 'deleteCalendarResponsePayload';
1612
- version: 'v2021_05_19';
1613
- namespace: 'Calendar';
1614
- name: '';
1615
- fields: {
1616
- /** . */
1617
- 'totalDeleted': {
1618
- type: 'number';
1619
- options: undefined;
1620
- };
1621
- };
1622
- }
1623
- interface DeleteCalendarResponsePayloadEntity extends SchemaEntity<SpruceSchemas.Calendar.v2021_05_19.DeleteCalendarResponsePayloadSchema> {
1624
- }
1625
- }
1626
1626
  namespace SpruceSchemas.Calendar.v2021_05_19 {
1627
1627
  interface DidCancelCalendarEventEmitTarget {
1628
1628
  'locationId': string;
@@ -1033,6 +1033,87 @@ declare module '@sprucelabs/spruce-core-schemas/build/.spruce/schemas/core.schem
1033
1033
  interface CreateCalendarResponsePayloadEntity extends SchemaEntity<SpruceSchemas.Calendar.v2021_05_19.CreateCalendarResponsePayloadSchema> {
1034
1034
  }
1035
1035
  }
1036
+ namespace SpruceSchemas.Calendar.v2021_05_19 {
1037
+ interface DeleteCalendarEmitTarget {
1038
+ 'organizationId': string;
1039
+ 'calendarId': string;
1040
+ }
1041
+ interface DeleteCalendarEmitTargetSchema extends SpruceSchema.Schema {
1042
+ id: 'deleteCalendarEmitTarget';
1043
+ version: 'v2021_05_19';
1044
+ namespace: 'Calendar';
1045
+ name: '';
1046
+ fields: {
1047
+ /** . */
1048
+ 'organizationId': {
1049
+ type: 'id';
1050
+ isRequired: true;
1051
+ options: undefined;
1052
+ };
1053
+ /** . */
1054
+ 'calendarId': {
1055
+ type: 'id';
1056
+ isRequired: true;
1057
+ options: undefined;
1058
+ };
1059
+ };
1060
+ }
1061
+ interface DeleteCalendarEmitTargetEntity extends SchemaEntity<SpruceSchemas.Calendar.v2021_05_19.DeleteCalendarEmitTargetSchema> {
1062
+ }
1063
+ }
1064
+ namespace SpruceSchemas.Calendar.v2021_05_19 {
1065
+ interface DeleteCalendarEmitTargetAndPayload {
1066
+ /** Source. */
1067
+ 'source'?: SpruceSchemas.SpruceEventUtils.v2021_09_13.EventSource | undefined | null;
1068
+ 'target': SpruceSchemas.Calendar.v2021_05_19.DeleteCalendarEmitTarget;
1069
+ }
1070
+ interface DeleteCalendarEmitTargetAndPayloadSchema extends SpruceSchema.Schema {
1071
+ id: 'deleteCalendarEmitTargetAndPayload';
1072
+ version: 'v2021_05_19';
1073
+ namespace: 'Calendar';
1074
+ name: '';
1075
+ fields: {
1076
+ /** Source. */
1077
+ 'source': {
1078
+ label: 'Source';
1079
+ type: 'schema';
1080
+ options: {
1081
+ schema: SpruceSchemas.SpruceEventUtils.v2021_09_13.EventSourceSchema;
1082
+ };
1083
+ };
1084
+ /** . */
1085
+ 'target': {
1086
+ type: 'schema';
1087
+ isRequired: true;
1088
+ options: {
1089
+ schema: SpruceSchemas.Calendar.v2021_05_19.DeleteCalendarEmitTargetSchema;
1090
+ };
1091
+ };
1092
+ };
1093
+ }
1094
+ interface DeleteCalendarEmitTargetAndPayloadEntity extends SchemaEntity<SpruceSchemas.Calendar.v2021_05_19.DeleteCalendarEmitTargetAndPayloadSchema> {
1095
+ }
1096
+ }
1097
+ namespace SpruceSchemas.Calendar.v2021_05_19 {
1098
+ interface DeleteCalendarResponsePayload {
1099
+ 'totalDeleted'?: number | undefined | null;
1100
+ }
1101
+ interface DeleteCalendarResponsePayloadSchema extends SpruceSchema.Schema {
1102
+ id: 'deleteCalendarResponsePayload';
1103
+ version: 'v2021_05_19';
1104
+ namespace: 'Calendar';
1105
+ name: '';
1106
+ fields: {
1107
+ /** . */
1108
+ 'totalDeleted': {
1109
+ type: 'number';
1110
+ options: undefined;
1111
+ };
1112
+ };
1113
+ }
1114
+ interface DeleteCalendarResponsePayloadEntity extends SchemaEntity<SpruceSchemas.Calendar.v2021_05_19.DeleteCalendarResponsePayloadSchema> {
1115
+ }
1116
+ }
1036
1117
  namespace SpruceSchemas.Calendar.v2021_05_19 {
1037
1118
  interface CreateCalendarEventTypeEmitPayload {
1038
1119
  'name': string;
@@ -1542,87 +1623,6 @@ declare module '@sprucelabs/spruce-core-schemas/build/.spruce/schemas/core.schem
1542
1623
  interface CreateCalendarEventTypeResponsePayloadEntity extends SchemaEntity<SpruceSchemas.Calendar.v2021_05_19.CreateCalendarEventTypeResponsePayloadSchema> {
1543
1624
  }
1544
1625
  }
1545
- namespace SpruceSchemas.Calendar.v2021_05_19 {
1546
- interface DeleteCalendarEmitTarget {
1547
- 'organizationId': string;
1548
- 'calendarId': string;
1549
- }
1550
- interface DeleteCalendarEmitTargetSchema extends SpruceSchema.Schema {
1551
- id: 'deleteCalendarEmitTarget';
1552
- version: 'v2021_05_19';
1553
- namespace: 'Calendar';
1554
- name: '';
1555
- fields: {
1556
- /** . */
1557
- 'organizationId': {
1558
- type: 'id';
1559
- isRequired: true;
1560
- options: undefined;
1561
- };
1562
- /** . */
1563
- 'calendarId': {
1564
- type: 'id';
1565
- isRequired: true;
1566
- options: undefined;
1567
- };
1568
- };
1569
- }
1570
- interface DeleteCalendarEmitTargetEntity extends SchemaEntity<SpruceSchemas.Calendar.v2021_05_19.DeleteCalendarEmitTargetSchema> {
1571
- }
1572
- }
1573
- namespace SpruceSchemas.Calendar.v2021_05_19 {
1574
- interface DeleteCalendarEmitTargetAndPayload {
1575
- /** Source. */
1576
- 'source'?: SpruceSchemas.SpruceEventUtils.v2021_09_13.EventSource | undefined | null;
1577
- 'target': SpruceSchemas.Calendar.v2021_05_19.DeleteCalendarEmitTarget;
1578
- }
1579
- interface DeleteCalendarEmitTargetAndPayloadSchema extends SpruceSchema.Schema {
1580
- id: 'deleteCalendarEmitTargetAndPayload';
1581
- version: 'v2021_05_19';
1582
- namespace: 'Calendar';
1583
- name: '';
1584
- fields: {
1585
- /** Source. */
1586
- 'source': {
1587
- label: 'Source';
1588
- type: 'schema';
1589
- options: {
1590
- schema: SpruceSchemas.SpruceEventUtils.v2021_09_13.EventSourceSchema;
1591
- };
1592
- };
1593
- /** . */
1594
- 'target': {
1595
- type: 'schema';
1596
- isRequired: true;
1597
- options: {
1598
- schema: SpruceSchemas.Calendar.v2021_05_19.DeleteCalendarEmitTargetSchema;
1599
- };
1600
- };
1601
- };
1602
- }
1603
- interface DeleteCalendarEmitTargetAndPayloadEntity extends SchemaEntity<SpruceSchemas.Calendar.v2021_05_19.DeleteCalendarEmitTargetAndPayloadSchema> {
1604
- }
1605
- }
1606
- namespace SpruceSchemas.Calendar.v2021_05_19 {
1607
- interface DeleteCalendarResponsePayload {
1608
- 'totalDeleted'?: number | undefined | null;
1609
- }
1610
- interface DeleteCalendarResponsePayloadSchema extends SpruceSchema.Schema {
1611
- id: 'deleteCalendarResponsePayload';
1612
- version: 'v2021_05_19';
1613
- namespace: 'Calendar';
1614
- name: '';
1615
- fields: {
1616
- /** . */
1617
- 'totalDeleted': {
1618
- type: 'number';
1619
- options: undefined;
1620
- };
1621
- };
1622
- }
1623
- interface DeleteCalendarResponsePayloadEntity extends SchemaEntity<SpruceSchemas.Calendar.v2021_05_19.DeleteCalendarResponsePayloadSchema> {
1624
- }
1625
- }
1626
1626
  namespace SpruceSchemas.Calendar.v2021_05_19 {
1627
1627
  interface DidCancelCalendarEventEmitTarget {
1628
1628
  'locationId': string;
@@ -249,6 +249,7 @@ export default class RootSkillViewController extends AbstractSkillViewController
249
249
  }
250
250
  handleDraftEventAdded(event) {
251
251
  return __awaiter(this, void 0, void 0, function* () {
252
+ console.log('handle draft event added');
252
253
  yield this.events.addDraftEvent(event, !event.eventTypeSlug);
253
254
  if (!event.eventTypeSlug) {
254
255
  this.toolBeltVc.open({ shouldStayOpen: true });
@@ -256,9 +257,9 @@ export default class RootSkillViewController extends AbstractSkillViewController
256
257
  }
257
258
  });
258
259
  }
259
- handleEventSwapped(event) {
260
+ handleEventSwapped(draft, event) {
260
261
  return __awaiter(this, void 0, void 0, function* () {
261
- yield this.events.silentlySwapEvent(this.sm.getContext().event.id, event);
262
+ yield this.events.silentlySwapEvent(draft.id, event);
262
263
  });
263
264
  }
264
265
  handleDropEvent(id, updates) {
@@ -12,8 +12,10 @@ export default abstract class AbstractCalendarEventToolBeltState implements Tool
12
12
  private vcs;
13
13
  private pendingContextUpdates;
14
14
  private controlsVc;
15
- private _isLoaded;
15
+ private isLoaded;
16
+ private events;
16
17
  load(sm: CalendarToolBeltStateMachine): Promise<void>;
18
+ getIsLoaded(): boolean;
17
19
  protected loadRemoteCards(): Promise<void>;
18
20
  protected handleClickSave(): Promise<void>;
19
21
  private deselectEvent;
@@ -14,15 +14,20 @@ export default class AbstractCalendarEventToolBeltState {
14
14
  constructor() {
15
15
  this.vcs = [];
16
16
  this.pendingContextUpdates = {};
17
- //@ts-ignore
18
- this._isLoaded = false;
17
+ this.isLoaded = false;
19
18
  }
20
19
  load(sm) {
21
20
  return __awaiter(this, void 0, void 0, function* () {
22
21
  this.sm = sm;
23
22
  this.toolBeltVc = sm.getToolBeltVc();
24
- this._isLoaded = true;
23
+ this.isLoaded = true;
25
24
  this.controlsVc = sm.Controller('calendar.event-controls-card', Object.assign(Object.assign({ onCancel: this.clearPendingContextChanges.bind(this), onSave: this.handleClickSave.bind(this) }, this.buildVcConstructorOptions('controls')), { onCancelEvent: this.sm.getContext().cancelEvent }));
25
+ this.events = sm.getContext().events;
26
+ this.events.setUpdateContextHandler((updates) => __awaiter(this, void 0, void 0, function* () {
27
+ return this.handleUpdateContextFromTool(updates, 'eventManager', {
28
+ shouldPersistContextChangesImmediately: true,
29
+ });
30
+ }));
26
31
  this.toolBeltVc.clearTools();
27
32
  this.toolBeltVc.setStickyTool({
28
33
  card: this.controlsVc.render(),
@@ -33,6 +38,9 @@ export default class AbstractCalendarEventToolBeltState {
33
38
  yield this.sm.on('did-update-context', this.handleDidUpdateContext);
34
39
  });
35
40
  }
41
+ getIsLoaded() {
42
+ return this.isLoaded;
43
+ }
36
44
  loadRemoteCards() {
37
45
  return __awaiter(this, void 0, void 0, function* () {
38
46
  const registrar = new CalendarToolRegistrar(this.sm, (vc) => {
@@ -173,6 +181,7 @@ export default class AbstractCalendarEventToolBeltState {
173
181
  destroy() {
174
182
  return __awaiter(this, void 0, void 0, function* () {
175
183
  yield this.sm.off('did-update-context', this.handleDidUpdateContext);
184
+ this.events.clearUpdateContextHandler();
176
185
  });
177
186
  }
178
187
  }
@@ -3,7 +3,7 @@ import { CalendarEvent } from '@sprucelabs/heartwood-view-controllers';
3
3
  import { RemoteViewControllerFactory } from '@sprucelabs/spruce-heartwood-utils';
4
4
  import { RemoteEventStore } from '../stores/RemoteEventStore';
5
5
  import RemotePreferencesStore from '../stores/RemotePreferencesStore';
6
- import { CalendarToolBeltStateMachine, UpdateEvent, UpdateRepeatingStrategyWithCancel } from '../types/calendar.types';
6
+ import { CalendarToolBeltContext, CalendarToolBeltStateMachine, UpdateCalendarToolBeltContextHandler, UpdateEvent, UpdateRepeatingStrategyWithCancel } from '../types/calendar.types';
7
7
  import CalendarViewController from '../viewControllers/Calendar.vc';
8
8
  export declare class CalendarEventManager {
9
9
  private calendarVc;
@@ -23,6 +23,7 @@ export declare class CalendarEventManager {
23
23
  private calendars;
24
24
  private shouldUpdateContextOnNextSave;
25
25
  private isLoaded;
26
+ protected updateContext?: UpdateCalendarToolBeltContextHandler<CalendarToolBeltContext>;
26
27
  protected get calendarIds(): string[];
27
28
  protected get visibleCalendarIds(): string[];
28
29
  constructor(options: CalendarEventManagerOptions);
@@ -54,8 +55,35 @@ export declare class CalendarEventManager {
54
55
  setCalendarVisibility(calendarId: string, shouldBeVisible: boolean): Promise<void>;
55
56
  setupVcForEventType(vcId: string, typeSlug: string): Promise<void>;
56
57
  private assertValidCalendarId;
57
- private updateEventInContext;
58
+ protected updateEventInContext(updates: Partial<CalendarEvent>): Promise<{
59
+ isBusy: boolean;
60
+ id: string;
61
+ target: import("@sprucelabs/calendar-utils").SpruceSchemas.CalendarUtils.v2021_05_19.CalendarEventTarget;
62
+ calendarId: string;
63
+ eventTypeSlug?: string | null | undefined;
64
+ startDateTimeMs: number;
65
+ isResizeable?: boolean | null | undefined;
66
+ style?: "active" | "blocked" | "draft" | "tentative" | "upcoming" | "unavailable" | "past" | "warn" | "critical" | null | undefined;
67
+ groupId?: string | null | undefined;
68
+ timeBlocks: import("@sprucelabs/calendar-utils").SpruceSchemas.CalendarUtils.v2021_05_19.EventTimeBlock[];
69
+ repeats?: "weekly" | "monthly" | "daily" | null | undefined;
70
+ daysOfWeek?: ("sun" | "mon" | "tue" | "wed" | "thur" | "fri" | "sat")[] | null | undefined;
71
+ daysOfMonth?: ("1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12" | "13" | "14" | "15" | "16" | "17" | "18" | "19" | "20" | "21" | "22" | "23" | "24" | "25" | "26" | "27" | "28" | "29" | "30" | "31")[] | null | undefined;
72
+ repeatsUntil?: number | null | undefined;
73
+ occurrences?: number | null | undefined;
74
+ interval?: number | null | undefined;
75
+ nthOccurrences?: number[] | null | undefined;
76
+ activeUntilDate?: number | null | undefined;
77
+ exclusionDates?: import("@sprucelabs/calendar-utils").SpruceSchemas.CalendarUtils.v2021_05_19.EventExclusionDate[] | null | undefined;
78
+ nthInRepeating?: number | null | undefined;
79
+ totalInRepeating?: number | null | undefined;
80
+ error?: Error | null | undefined;
81
+ isSelected?: boolean | null | undefined;
82
+ controller?: import("@sprucelabs/heartwood-view-controllers").CalendarEventViewController | null | undefined;
83
+ }>;
58
84
  private setEventInContext;
85
+ setUpdateContextHandler(handler: UpdateCalendarToolBeltContextHandler<CalendarToolBeltContext>): void;
86
+ clearUpdateContextHandler(): void;
59
87
  selectEvent(eventId: string): Promise<void>;
60
88
  load(): Promise<void>;
61
89
  getEvent(id: string): CalendarEvent;
@@ -235,14 +235,21 @@ export class CalendarEventManager {
235
235
  });
236
236
  }
237
237
  setEventInContext(newEvent, options) {
238
+ var _a;
238
239
  return __awaiter(this, void 0, void 0, function* () {
239
240
  this.shouldIgnoreNextContextUpdate =
240
241
  (options === null || options === void 0 ? void 0 : options.shouldHandleDidUpdateContext) !== false;
241
- yield this.sm.updateContext({
242
+ yield ((_a = this.updateContext) !== null && _a !== void 0 ? _a : this.sm.updateContext.bind(this.sm))({
242
243
  event: newEvent,
243
244
  });
244
245
  });
245
246
  }
247
+ setUpdateContextHandler(handler) {
248
+ this.updateContext = handler;
249
+ }
250
+ clearUpdateContextHandler() {
251
+ delete this.updateContext;
252
+ }
246
253
  selectEvent(eventId) {
247
254
  return __awaiter(this, void 0, void 0, function* () {
248
255
  const lastSelected = this.calendarVc.getSelectedEvent();
@@ -4,7 +4,7 @@ import { UpdateEvent } from '../types/calendar.types';
4
4
  declare type Calendar = SpruceSchemas.HeartwoodViewControllers.v2021_02_11.Calendar;
5
5
  declare type Event = SpruceSchemas.HeartwoodViewControllers.v2021_02_11.CalendarEvent;
6
6
  declare type DraftAddedHandler = (event: Event) => void | Promise<void>;
7
- declare type EventSwappedHandler = (event: Event) => void | Promise<void>;
7
+ declare type EventSwappedHandler = (draft: Event, saved: Event) => void | Promise<void>;
8
8
  declare type EventDroppedHandler = (id: string, updates: Partial<Event>) => boolean | Promise<boolean>;
9
9
  declare type DraftRemovedHandler = () => void | Promise<void>;
10
10
  declare type ClickEventHandler = (options: ClickEventOptions) => void | Promise<void>;
@@ -28,14 +28,14 @@ export default class CalendarViewController extends CoreCalendarViewController {
28
28
  super(Object.assign(Object.assign({ view: 'day' }, rest), { onDropEvent: (options) => {
29
29
  return this.handleDropEvent(options);
30
30
  } }));
31
- this.activelyPersisting = 0;
31
+ this.activelyPersisting = {};
32
32
  this.isSwapping = false;
33
33
  assertOptions(options, ['onAddDraftEvent']);
34
- const { onAddDraftEvent, onRemoveDraftEvent, onEventSwapped: onDraftEventSaved, } = rest;
34
+ const { onAddDraftEvent, onRemoveDraftEvent, onEventSwapped } = rest;
35
35
  this.sorter = new PeopleSorter();
36
36
  this.draftAddedHandler = onAddDraftEvent;
37
37
  this.draftRemovedHandler = onRemoveDraftEvent;
38
- this.eventSwappedHandler = onDraftEventSaved;
38
+ this.eventSwappedHandler = onEventSwapped;
39
39
  this.dropEventHandler = onDropEvent;
40
40
  this.remoteEventStore = remoteEventStore;
41
41
  this.model.onClick = this.handleClick.bind(this);
@@ -189,9 +189,14 @@ export default class CalendarViewController extends CoreCalendarViewController {
189
189
  const id = event.id;
190
190
  const isBusy = (options === null || options === void 0 ? void 0 : options.isBusy) === true;
191
191
  try {
192
- this.activelyPersisting++;
192
+ if (!this.activelyPersisting[id]) {
193
+ this.activelyPersisting[id] = 1;
194
+ }
195
+ else {
196
+ this.activelyPersisting[id]++;
197
+ }
193
198
  const saved = yield ((_a = this.remoteEventStore) === null || _a === void 0 ? void 0 : _a.persist(Object.assign(Object.assign({}, event), { isBusy })));
194
- this.activelyPersisting--;
199
+ this.activelyPersisting[id]--;
195
200
  if (!saved) {
196
201
  return;
197
202
  }
@@ -203,8 +208,8 @@ export default class CalendarViewController extends CoreCalendarViewController {
203
208
  this.lastSwappedId = id;
204
209
  yield this.swapEvent(event, saved);
205
210
  }
206
- if (this.activelyPersisting === 0) {
207
- yield ((_b = this.eventSwappedHandler) === null || _b === void 0 ? void 0 : _b.call(this, saved));
211
+ if (this.activelyPersisting[id] === 0) {
212
+ yield ((_b = this.eventSwappedHandler) === null || _b === void 0 ? void 0 : _b.call(this, event, saved));
208
213
  }
209
214
  }
210
215
  else {
@@ -220,14 +220,15 @@ class RootSkillViewController extends heartwood_view_controllers_1.AbstractSkill
220
220
  }
221
221
  }
222
222
  async handleDraftEventAdded(event) {
223
+ console.log('handle draft event added');
223
224
  await this.events.addDraftEvent(event, !event.eventTypeSlug);
224
225
  if (!event.eventTypeSlug) {
225
226
  this.toolBeltVc.open({ shouldStayOpen: true });
226
227
  await this.sm.transitionTo(this.toolBeltStates.prerequisites);
227
228
  }
228
229
  }
229
- async handleEventSwapped(event) {
230
- await this.events.silentlySwapEvent(this.sm.getContext().event.id, event);
230
+ async handleEventSwapped(draft, event) {
231
+ await this.events.silentlySwapEvent(draft.id, event);
231
232
  }
232
233
  async handleDropEvent(id, updates) {
233
234
  return this.events.handleDropEvent(id, updates);
@@ -12,8 +12,10 @@ export default abstract class AbstractCalendarEventToolBeltState implements Tool
12
12
  private vcs;
13
13
  private pendingContextUpdates;
14
14
  private controlsVc;
15
- private _isLoaded;
15
+ private isLoaded;
16
+ private events;
16
17
  load(sm: CalendarToolBeltStateMachine): Promise<void>;
18
+ getIsLoaded(): boolean;
17
19
  protected loadRemoteCards(): Promise<void>;
18
20
  protected handleClickSave(): Promise<void>;
19
21
  private deselectEvent;
@@ -10,14 +10,19 @@ class AbstractCalendarEventToolBeltState {
10
10
  constructor() {
11
11
  this.vcs = [];
12
12
  this.pendingContextUpdates = {};
13
- //@ts-ignore
14
- this._isLoaded = false;
13
+ this.isLoaded = false;
15
14
  }
16
15
  async load(sm) {
17
16
  this.sm = sm;
18
17
  this.toolBeltVc = sm.getToolBeltVc();
19
- this._isLoaded = true;
18
+ this.isLoaded = true;
20
19
  this.controlsVc = sm.Controller('calendar.event-controls-card', Object.assign(Object.assign({ onCancel: this.clearPendingContextChanges.bind(this), onSave: this.handleClickSave.bind(this) }, this.buildVcConstructorOptions('controls')), { onCancelEvent: this.sm.getContext().cancelEvent }));
20
+ this.events = sm.getContext().events;
21
+ this.events.setUpdateContextHandler(async (updates) => {
22
+ return this.handleUpdateContextFromTool(updates, 'eventManager', {
23
+ shouldPersistContextChangesImmediately: true,
24
+ });
25
+ });
21
26
  this.toolBeltVc.clearTools();
22
27
  this.toolBeltVc.setStickyTool({
23
28
  card: this.controlsVc.render(),
@@ -27,6 +32,9 @@ class AbstractCalendarEventToolBeltState {
27
32
  this.handleDidUpdateContext = this.handleDidUpdateContext.bind(this);
28
33
  await this.sm.on('did-update-context', this.handleDidUpdateContext);
29
34
  }
35
+ getIsLoaded() {
36
+ return this.isLoaded;
37
+ }
30
38
  async loadRemoteCards() {
31
39
  const registrar = new CalendarToolRegistrar_1.default(this.sm, (vc) => {
32
40
  //@ts-ignore
@@ -148,6 +156,7 @@ class AbstractCalendarEventToolBeltState {
148
156
  }
149
157
  async destroy() {
150
158
  await this.sm.off('did-update-context', this.handleDidUpdateContext);
159
+ this.events.clearUpdateContextHandler();
151
160
  }
152
161
  }
153
162
  exports.default = AbstractCalendarEventToolBeltState;
@@ -3,7 +3,7 @@ import { CalendarEvent } from '@sprucelabs/heartwood-view-controllers';
3
3
  import { RemoteViewControllerFactory } from '@sprucelabs/spruce-heartwood-utils';
4
4
  import { RemoteEventStore } from '../stores/RemoteEventStore';
5
5
  import RemotePreferencesStore from '../stores/RemotePreferencesStore';
6
- import { CalendarToolBeltStateMachine, UpdateEvent, UpdateRepeatingStrategyWithCancel } from '../types/calendar.types';
6
+ import { CalendarToolBeltContext, CalendarToolBeltStateMachine, UpdateCalendarToolBeltContextHandler, UpdateEvent, UpdateRepeatingStrategyWithCancel } from '../types/calendar.types';
7
7
  import CalendarViewController from '../viewControllers/Calendar.vc';
8
8
  export declare class CalendarEventManager {
9
9
  private calendarVc;
@@ -23,6 +23,7 @@ export declare class CalendarEventManager {
23
23
  private calendars;
24
24
  private shouldUpdateContextOnNextSave;
25
25
  private isLoaded;
26
+ protected updateContext?: UpdateCalendarToolBeltContextHandler<CalendarToolBeltContext>;
26
27
  protected get calendarIds(): string[];
27
28
  protected get visibleCalendarIds(): string[];
28
29
  constructor(options: CalendarEventManagerOptions);
@@ -54,8 +55,35 @@ export declare class CalendarEventManager {
54
55
  setCalendarVisibility(calendarId: string, shouldBeVisible: boolean): Promise<void>;
55
56
  setupVcForEventType(vcId: string, typeSlug: string): Promise<void>;
56
57
  private assertValidCalendarId;
57
- private updateEventInContext;
58
+ protected updateEventInContext(updates: Partial<CalendarEvent>): Promise<{
59
+ isBusy: boolean;
60
+ id: string;
61
+ target: import("@sprucelabs/calendar-utils").SpruceSchemas.CalendarUtils.v2021_05_19.CalendarEventTarget;
62
+ calendarId: string;
63
+ eventTypeSlug?: string | null | undefined;
64
+ startDateTimeMs: number;
65
+ isResizeable?: boolean | null | undefined;
66
+ style?: "active" | "blocked" | "draft" | "tentative" | "upcoming" | "unavailable" | "past" | "warn" | "critical" | null | undefined;
67
+ groupId?: string | null | undefined;
68
+ timeBlocks: import("@sprucelabs/calendar-utils").SpruceSchemas.CalendarUtils.v2021_05_19.EventTimeBlock[];
69
+ repeats?: "weekly" | "monthly" | "daily" | null | undefined;
70
+ daysOfWeek?: ("sun" | "mon" | "tue" | "wed" | "thur" | "fri" | "sat")[] | null | undefined;
71
+ daysOfMonth?: ("1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "10" | "11" | "12" | "13" | "14" | "15" | "16" | "17" | "18" | "19" | "20" | "21" | "22" | "23" | "24" | "25" | "26" | "27" | "28" | "29" | "30" | "31")[] | null | undefined;
72
+ repeatsUntil?: number | null | undefined;
73
+ occurrences?: number | null | undefined;
74
+ interval?: number | null | undefined;
75
+ nthOccurrences?: number[] | null | undefined;
76
+ activeUntilDate?: number | null | undefined;
77
+ exclusionDates?: import("@sprucelabs/calendar-utils").SpruceSchemas.CalendarUtils.v2021_05_19.EventExclusionDate[] | null | undefined;
78
+ nthInRepeating?: number | null | undefined;
79
+ totalInRepeating?: number | null | undefined;
80
+ error?: Error | null | undefined;
81
+ isSelected?: boolean | null | undefined;
82
+ controller?: import("@sprucelabs/heartwood-view-controllers").CalendarEventViewController | null | undefined;
83
+ }>;
58
84
  private setEventInContext;
85
+ setUpdateContextHandler(handler: UpdateCalendarToolBeltContextHandler<CalendarToolBeltContext>): void;
86
+ clearUpdateContextHandler(): void;
59
87
  selectEvent(eventId: string): Promise<void>;
60
88
  load(): Promise<void>;
61
89
  getEvent(id: string): CalendarEvent;
@@ -208,12 +208,19 @@ class CalendarEventManager {
208
208
  return updated;
209
209
  }
210
210
  async setEventInContext(newEvent, options) {
211
+ var _a;
211
212
  this.shouldIgnoreNextContextUpdate =
212
213
  (options === null || options === void 0 ? void 0 : options.shouldHandleDidUpdateContext) !== false;
213
- await this.sm.updateContext({
214
+ await ((_a = this.updateContext) !== null && _a !== void 0 ? _a : this.sm.updateContext.bind(this.sm))({
214
215
  event: newEvent,
215
216
  });
216
217
  }
218
+ setUpdateContextHandler(handler) {
219
+ this.updateContext = handler;
220
+ }
221
+ clearUpdateContextHandler() {
222
+ delete this.updateContext;
223
+ }
217
224
  async selectEvent(eventId) {
218
225
  const lastSelected = this.calendarVc.getSelectedEvent();
219
226
  const event = this.calendarVc.getEvent(eventId);
@@ -4,7 +4,7 @@ import { UpdateEvent } from '../types/calendar.types';
4
4
  declare type Calendar = SpruceSchemas.HeartwoodViewControllers.v2021_02_11.Calendar;
5
5
  declare type Event = SpruceSchemas.HeartwoodViewControllers.v2021_02_11.CalendarEvent;
6
6
  declare type DraftAddedHandler = (event: Event) => void | Promise<void>;
7
- declare type EventSwappedHandler = (event: Event) => void | Promise<void>;
7
+ declare type EventSwappedHandler = (draft: Event, saved: Event) => void | Promise<void>;
8
8
  declare type EventDroppedHandler = (id: string, updates: Partial<Event>) => boolean | Promise<boolean>;
9
9
  declare type DraftRemovedHandler = () => void | Promise<void>;
10
10
  declare type ClickEventHandler = (options: ClickEventOptions) => void | Promise<void>;
@@ -24,14 +24,14 @@ class CalendarViewController extends heartwood_view_controllers_1.CalendarViewCo
24
24
  super(Object.assign(Object.assign({ view: 'day' }, rest), { onDropEvent: (options) => {
25
25
  return this.handleDropEvent(options);
26
26
  } }));
27
- this.activelyPersisting = 0;
27
+ this.activelyPersisting = {};
28
28
  this.isSwapping = false;
29
29
  (0, schema_1.assertOptions)(options, ['onAddDraftEvent']);
30
- const { onAddDraftEvent, onRemoveDraftEvent, onEventSwapped: onDraftEventSaved, } = rest;
30
+ const { onAddDraftEvent, onRemoveDraftEvent, onEventSwapped } = rest;
31
31
  this.sorter = new calendar_utils_1.PeopleSorter();
32
32
  this.draftAddedHandler = onAddDraftEvent;
33
33
  this.draftRemovedHandler = onRemoveDraftEvent;
34
- this.eventSwappedHandler = onDraftEventSaved;
34
+ this.eventSwappedHandler = onEventSwapped;
35
35
  this.dropEventHandler = onDropEvent;
36
36
  this.remoteEventStore = remoteEventStore;
37
37
  this.model.onClick = this.handleClick.bind(this);
@@ -166,9 +166,14 @@ class CalendarViewController extends heartwood_view_controllers_1.CalendarViewCo
166
166
  const id = event.id;
167
167
  const isBusy = (options === null || options === void 0 ? void 0 : options.isBusy) === true;
168
168
  try {
169
- this.activelyPersisting++;
169
+ if (!this.activelyPersisting[id]) {
170
+ this.activelyPersisting[id] = 1;
171
+ }
172
+ else {
173
+ this.activelyPersisting[id]++;
174
+ }
170
175
  const saved = await ((_a = this.remoteEventStore) === null || _a === void 0 ? void 0 : _a.persist(Object.assign(Object.assign({}, event), { isBusy })));
171
- this.activelyPersisting--;
176
+ this.activelyPersisting[id]--;
172
177
  if (!saved) {
173
178
  return;
174
179
  }
@@ -180,8 +185,8 @@ class CalendarViewController extends heartwood_view_controllers_1.CalendarViewCo
180
185
  this.lastSwappedId = id;
181
186
  await this.swapEvent(event, saved);
182
187
  }
183
- if (this.activelyPersisting === 0) {
184
- await ((_b = this.eventSwappedHandler) === null || _b === void 0 ? void 0 : _b.call(this, saved));
188
+ if (this.activelyPersisting[id] === 0) {
189
+ await ((_b = this.eventSwappedHandler) === null || _b === void 0 ? void 0 : _b.call(this, event, saved));
185
190
  }
186
191
  }
187
192
  else {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@sprucelabs/spruce-calendar-components",
3
3
  "description": "Calendar components for working with calendars and Sprucebot.",
4
- "version": "22.3.15",
4
+ "version": "22.3.18",
5
5
  "skill": {
6
6
  "namespace": "calendar"
7
7
  },