@sprucelabs/spruce-calendar-components 20.11.1 → 21.0.4

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.
Files changed (75) hide show
  1. package/build/.spruce/errors/errors.types.d.ts +122 -0
  2. package/build/.spruce/errors/errors.types.js +4 -0
  3. package/build/.spruce/errors/options.types.d.ts +28 -0
  4. package/build/.spruce/errors/options.types.js +2 -0
  5. package/build/constants.d.ts +5 -0
  6. package/build/constants.js +9 -0
  7. package/build/errors/SpruceError.d.ts +5 -0
  8. package/build/errors/SpruceError.js +45 -0
  9. package/build/esm/.spruce/errors/errors.types.d.ts +122 -0
  10. package/build/esm/.spruce/errors/errors.types.js +3 -0
  11. package/build/esm/.spruce/errors/options.types.d.ts +28 -0
  12. package/build/esm/.spruce/errors/options.types.js +1 -0
  13. package/build/esm/constants.d.ts +5 -0
  14. package/build/esm/constants.js +6 -0
  15. package/build/esm/errors/SpruceError.d.ts +5 -0
  16. package/build/esm/errors/SpruceError.js +39 -0
  17. package/build/esm/index-module.d.ts +30 -0
  18. package/build/esm/index-module.js +7 -0
  19. package/build/esm/skillViewControllers/Root.svc.d.ts +73 -0
  20. package/build/esm/skillViewControllers/Root.svc.js +404 -0
  21. package/build/esm/stores/RemotePreferencesStore.d.ts +26 -0
  22. package/build/esm/stores/RemotePreferencesStore.js +85 -0
  23. package/build/esm/toolBelt/CalendarToolTestFactory.d.ts +5 -0
  24. package/build/esm/toolBelt/CalendarToolTestFactory.js +28 -0
  25. package/build/esm/toolBelt/states/PrerequisitesToolBeltState.d.ts +37 -0
  26. package/build/esm/toolBelt/states/PrerequisitesToolBeltState.js +190 -0
  27. package/build/esm/toolBelt/states/RootToolBeltState.d.ts +37 -0
  28. package/build/esm/toolBelt/states/RootToolBeltState.js +122 -0
  29. package/build/esm/toolBelt/states/makeEventTyped.d.ts +2 -0
  30. package/build/esm/toolBelt/states/makeEventTyped.js +8 -0
  31. package/build/esm/types/calendar.types.d.ts +10 -0
  32. package/build/esm/utilities/CalendarEventManager.d.ts +72 -0
  33. package/build/esm/utilities/CalendarEventManager.js +321 -0
  34. package/build/esm/utilities/CalendarPeopleManager.d.ts +56 -0
  35. package/build/esm/utilities/CalendarPeopleManager.js +182 -0
  36. package/build/esm/utilities/calendarShiftGenerator.d.ts +8 -0
  37. package/build/esm/utilities/calendarShiftGenerator.js +24 -0
  38. package/build/esm/viewControllers/CalendarSelectTool.vc.d.ts +28 -0
  39. package/build/esm/viewControllers/CalendarSelectTool.vc.js +103 -0
  40. package/build/esm/viewControllers/DateSelectCard.vc.d.ts +29 -0
  41. package/build/esm/viewControllers/DateSelectCard.vc.js +77 -0
  42. package/build/esm/viewControllers/PersonSelectTool.vc.d.ts +36 -0
  43. package/build/esm/viewControllers/PersonSelectTool.vc.js +156 -0
  44. package/build/esm/viewControllers/SelectUpdateRepeatingStrategyCard.vc.d.ts +18 -0
  45. package/build/esm/viewControllers/SelectUpdateRepeatingStrategyCard.vc.js +85 -0
  46. package/build/index-module.d.ts +30 -0
  47. package/build/index-module.js +32 -0
  48. package/build/skillViewControllers/Root.svc.d.ts +73 -0
  49. package/build/skillViewControllers/Root.svc.js +359 -0
  50. package/build/stores/RemotePreferencesStore.d.ts +26 -0
  51. package/build/stores/RemotePreferencesStore.js +67 -0
  52. package/build/toolBelt/CalendarToolTestFactory.d.ts +5 -0
  53. package/build/toolBelt/CalendarToolTestFactory.js +34 -0
  54. package/build/toolBelt/states/PrerequisitesToolBeltState.d.ts +37 -0
  55. package/build/toolBelt/states/PrerequisitesToolBeltState.js +172 -0
  56. package/build/toolBelt/states/RootToolBeltState.d.ts +37 -0
  57. package/build/toolBelt/states/RootToolBeltState.js +113 -0
  58. package/build/toolBelt/states/makeEventTyped.d.ts +2 -0
  59. package/build/toolBelt/states/makeEventTyped.js +14 -0
  60. package/build/types/calendar.types.d.ts +10 -0
  61. package/build/utilities/CalendarEventManager.d.ts +72 -0
  62. package/build/utilities/CalendarEventManager.js +279 -0
  63. package/build/utilities/CalendarPeopleManager.d.ts +56 -0
  64. package/build/utilities/CalendarPeopleManager.js +163 -0
  65. package/build/utilities/calendarShiftGenerator.d.ts +8 -0
  66. package/build/utilities/calendarShiftGenerator.js +26 -0
  67. package/build/viewControllers/CalendarSelectTool.vc.d.ts +28 -0
  68. package/build/viewControllers/CalendarSelectTool.vc.js +93 -0
  69. package/build/viewControllers/DateSelectCard.vc.d.ts +29 -0
  70. package/build/viewControllers/DateSelectCard.vc.js +69 -0
  71. package/build/viewControllers/PersonSelectTool.vc.d.ts +36 -0
  72. package/build/viewControllers/PersonSelectTool.vc.js +140 -0
  73. package/build/viewControllers/SelectUpdateRepeatingStrategyCard.vc.d.ts +18 -0
  74. package/build/viewControllers/SelectUpdateRepeatingStrategyCard.vc.js +88 -0
  75. package/package.json +99 -26
@@ -0,0 +1,359 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const heartwood_view_controllers_1 = require("@sprucelabs/heartwood-view-controllers");
7
+ const spruce_heartwood_utils_1 = require("@sprucelabs/spruce-heartwood-utils");
8
+ const RemoteEventStore_1 = __importDefault(require("../stores/RemoteEventStore"));
9
+ const RemotePreferencesStore_1 = __importDefault(require("../stores/RemotePreferencesStore"));
10
+ const PrerequisitesToolBeltState_1 = require("../toolBelt/states/PrerequisitesToolBeltState");
11
+ const RootToolBeltState_1 = require("../toolBelt/states/RootToolBeltState");
12
+ const CalendarEventManager_1 = require("../utilities/CalendarEventManager");
13
+ const CalendarPeopleManager_1 = __importDefault(require("../utilities/CalendarPeopleManager"));
14
+ class RootSkillViewController extends heartwood_view_controllers_1.AbstractSkillViewController {
15
+ constructor(options) {
16
+ super(options);
17
+ this.getScope = () => ['employed', 'location'];
18
+ this.toolBeltVc = this.ToolBeltVc();
19
+ this.calendarVc = this.CalendarVc();
20
+ this.sm = this.ToolBeltStateMachine();
21
+ this.remoteVc = spruce_heartwood_utils_1.RemoteViewControllerFactory.Factory({
22
+ connectToApi: this.connectToApi.bind(this),
23
+ vcFactory: this.getVcFactory(),
24
+ });
25
+ this.remoteEventStore = new RemoteEventStore_1.default({
26
+ connectToApi: this.connectToApi.bind(this),
27
+ });
28
+ this.preferences = new RemotePreferencesStore_1.default({
29
+ connectToApi: this.connectToApi.bind(this),
30
+ });
31
+ this.people = new CalendarPeopleManager_1.default({
32
+ connectToApi: this.connectToApi.bind(this),
33
+ preferences: this.preferences,
34
+ calendarVc: this.calendarVc,
35
+ getVisibleEvents: this.getVisibleEvents.bind(this),
36
+ });
37
+ this.events = new CalendarEventManager_1.CalendarEventManager({
38
+ calendarVc: this.calendarVc,
39
+ events: this.remoteEventStore,
40
+ remoteVc: this.remoteVc,
41
+ dates: this.dates,
42
+ sm: this.sm,
43
+ preferences: this.preferences,
44
+ askForUpdateStrategy: this.askForUpdateStrategy.bind(this),
45
+ });
46
+ this.createToolBeltStates();
47
+ }
48
+ createToolBeltStates() {
49
+ this.toolBeltStates = {
50
+ root: new RootToolBeltState_1.RootToolBeltState({
51
+ people: this.people,
52
+ events: this.events,
53
+ }),
54
+ prerequisites: new PrerequisitesToolBeltState_1.PrerequisitesToolBeltState({
55
+ onSelectCalendar: this.handleSelectCalendar.bind(this),
56
+ onSelectEventType: this.handleSelectEventType.bind(this),
57
+ }),
58
+ };
59
+ }
60
+ ToolBeltStateMachine() {
61
+ const sm = new heartwood_view_controllers_1.ToolBeltStateMachine({
62
+ toolBeltVc: this.toolBeltVc,
63
+ vcFactory: this.getVcFactory(),
64
+ connectToApi: this.connectToApi.bind(this),
65
+ context: {
66
+ calendarVc: this.calendarVc,
67
+ cancelEvent: (eventId) => this.handleCancelEvent(eventId),
68
+ },
69
+ });
70
+ return sm;
71
+ }
72
+ async handleCancelEvent(eventId) {
73
+ const confirm = await this.confirm({
74
+ title: 'Cancel?',
75
+ message: `You wanna cancel this?`,
76
+ });
77
+ if (confirm) {
78
+ await this.events.removeEvent(eventId);
79
+ }
80
+ }
81
+ async askForUpdateStrategy(cleaned) {
82
+ let strategy;
83
+ const dlg = this.renderInDialog(Object.assign({ shouldShowCloseButton: false }, this.Controller('calendar.select-update-repeating-strategy-card', {
84
+ event: cleaned,
85
+ onSelectStrategy: async (s) => {
86
+ strategy = s;
87
+ await dlg.hide();
88
+ },
89
+ }).render()));
90
+ await dlg.wait();
91
+ return strategy;
92
+ }
93
+ async handleSelectEventType(type) {
94
+ var _a, _b;
95
+ this.selectingTypePromise = new Promise((resolve) => {
96
+ this.selectingTypeResolve = resolve;
97
+ });
98
+ if (type.viewControllerId) {
99
+ try {
100
+ await this.events.setupVcForEventType(type.viewControllerId, type.slug);
101
+ await this.transitionToStateFromDraftEvent();
102
+ }
103
+ catch (err) {
104
+ (_a = this.selectingTypeResolve) === null || _a === void 0 ? void 0 : _a.call(this);
105
+ console.error(err);
106
+ await this.alert({
107
+ message: `I could not load what I need to add your ${type.name}! I've let the humans know and they are on the case!`,
108
+ });
109
+ await this.restoreDraftAfterStateLoadError();
110
+ return;
111
+ }
112
+ }
113
+ (_b = this.selectingTypeResolve) === null || _b === void 0 ? void 0 : _b.call(this);
114
+ }
115
+ async restoreDraftAfterStateLoadError() {
116
+ await this.waitUntilDoneSaving();
117
+ await this.sm.waitForContextUpdate();
118
+ void this.transitionTo(this.toolBeltStates.prerequisites);
119
+ await this.events.restoreEventToDraftOnStateLoadError();
120
+ }
121
+ async transitionToStateFromDraftEvent() {
122
+ const { event } = this.sm.getContext();
123
+ await this.transitionToolBeltForEvent(event.id);
124
+ }
125
+ async transitionToolBeltForEvent(eventId) {
126
+ var _a;
127
+ const vc = this.calendarVc.getEventVc(eventId);
128
+ const state = (_a = vc.getToolBeltState) === null || _a === void 0 ? void 0 : _a.call(vc);
129
+ if (state) {
130
+ await this.transitionTo(state);
131
+ }
132
+ }
133
+ async transitionTo(state) {
134
+ await this.sm.transitionTo(state);
135
+ }
136
+ async waitUntilDoneSaving() {
137
+ var _a;
138
+ await Promise.all([
139
+ (_a = this.remoteEventStore) === null || _a === void 0 ? void 0 : _a.waitForPendingSaves(),
140
+ this.selectingTypePromise,
141
+ this.transitionPromise,
142
+ this.loadEventsPromise,
143
+ this.sm.waitForContextUpdate(),
144
+ ]);
145
+ }
146
+ handleSelectCalendar(calendar) {
147
+ var _a;
148
+ (_a = this.remoteEventStore) === null || _a === void 0 ? void 0 : _a.setCalendarId(calendar.id);
149
+ }
150
+ getToolBeltStateMachine() {
151
+ return this.sm;
152
+ }
153
+ getToolBeltStateId() {
154
+ return this.sm.getStateId();
155
+ }
156
+ CalendarVc() {
157
+ return this.Controller('calendar.calendar', {
158
+ onClickEvent: this.handleClickEvent.bind(this),
159
+ onAddDraftEvent: this.handleDraftEventAdded.bind(this),
160
+ onRemoveDraftEvent: this.handleDraftEventRemoved.bind(this),
161
+ onEventSwapped: this.handleEventSwapped.bind(this),
162
+ onDropEvent: this.handleDropEvent.bind(this),
163
+ onChangeStartDate: this.handleChangeDate.bind(this),
164
+ onDeselectEvent: this.handleDeselectEvent.bind(this),
165
+ });
166
+ }
167
+ async handleChangeDate() {
168
+ this.makeDateSelectMatchSelectedDateFromCalendar();
169
+ await this.loadEvents();
170
+ }
171
+ makeDateSelectMatchSelectedDateFromCalendar() {
172
+ const date = this.getStartDate();
173
+ this.setSelectedDateInDateSelectVc(date);
174
+ }
175
+ setSelectedDateInDateSelectVc(date) {
176
+ const { year, month, day } = this.dates.splitDate(date);
177
+ this.toolBeltStates.root.setSelectedDate(year, month, day);
178
+ }
179
+ getStartDate() {
180
+ var _a;
181
+ return (_a = this.calendarVc.getStartDate()) !== null && _a !== void 0 ? _a : this.dates.date();
182
+ }
183
+ async handleDeselectEvent() {
184
+ if (this.calendarVc.getIsSwappingEvent()) {
185
+ return;
186
+ }
187
+ await this.resetToRootState();
188
+ }
189
+ async resetToRootState() {
190
+ await this.events.reset();
191
+ this.makeDateSelectMatchSelectedDateFromCalendar();
192
+ this.transitionPromise = this.sm.transitionTo(this.toolBeltStates.root);
193
+ this.toolBeltVc.close();
194
+ await this.transitionPromise;
195
+ }
196
+ ToolBeltVc() {
197
+ return this.Controller('toolBelt', {
198
+ shouldRenderAllToolsAtOnce: true,
199
+ });
200
+ }
201
+ async handleClickEvent(options) {
202
+ var _a, _b;
203
+ const { event } = options;
204
+ await this.events.selectEvent(event.id);
205
+ this.toolBeltVc.open({ shouldStayOpen: true });
206
+ try {
207
+ if (!event.eventTypeSlug) {
208
+ await this.transitionTo(this.toolBeltStates.prerequisites);
209
+ }
210
+ else {
211
+ await this.transitionToolBeltForEvent(event.id);
212
+ }
213
+ }
214
+ catch (err) {
215
+ console.error((_a = err.stack) !== null && _a !== void 0 ? _a : err.message);
216
+ this.calendarVc.deselectEvent();
217
+ await this.alert({
218
+ message: (_b = err.message) !== null && _b !== void 0 ? _b : 'Shoot! I could not load that for you! Refresh and try again!!',
219
+ });
220
+ }
221
+ }
222
+ async handleDraftEventAdded(event) {
223
+ if (!event.eventTypeSlug) {
224
+ await this.events.addDraftEvent(event);
225
+ this.toolBeltVc.open({ shouldStayOpen: true });
226
+ await this.sm.transitionTo(this.toolBeltStates.prerequisites);
227
+ }
228
+ }
229
+ async handleEventSwapped(event) {
230
+ await this.events.silentlySwapEvent(this.sm.getContext().event.id, event);
231
+ }
232
+ async handleDropEvent(id, updates) {
233
+ return this.events.handleDropEvent(id, updates);
234
+ }
235
+ async handleDraftEventRemoved() { }
236
+ getPersonSelectVc() {
237
+ return this.toolBeltStates.root.getPersonSelectCardVc();
238
+ }
239
+ renderToolBelt() {
240
+ return this.toolBeltVc.render();
241
+ }
242
+ getCalendarSelectVc() {
243
+ return this.toolBeltStates.root.getCalendarSelectCardVc();
244
+ }
245
+ getCalendarVc() {
246
+ return this.calendarVc;
247
+ }
248
+ async load(options) {
249
+ var _a;
250
+ await this.sm.updateContext(Object.assign(Object.assign({}, options), { people: this.people, events: this.events }));
251
+ this.client = await this.connectToApi();
252
+ const { scope, locale, args, router } = options;
253
+ await locale.on('did-change-timezones', () => {
254
+ return this.syncOffsetWithLocale(locale);
255
+ });
256
+ const [location] = await Promise.all([
257
+ scope.getCurrentLocation(),
258
+ this.loadLoggedInPerson(),
259
+ ]);
260
+ this.organizationId = location === null || location === void 0 ? void 0 : location.organizationId;
261
+ this.locationId = location === null || location === void 0 ? void 0 : location.id;
262
+ try {
263
+ await this.preferences.load(this.organizationId);
264
+ await this.people.on('did-update', this.syncPeopleOnCalendar.bind(this));
265
+ await this.people.load({
266
+ loggedInPerson: this.person,
267
+ locationId: this.locationId,
268
+ organizationId: this.organizationId,
269
+ });
270
+ await this.remoteEventStore.load({
271
+ locationId: this.locationId,
272
+ organizationId: this.organizationId,
273
+ });
274
+ await this.events.load();
275
+ }
276
+ catch (err) {
277
+ await this.alert({
278
+ message: (_a = err.message) !== null && _a !== void 0 ? _a : 'Something catastrophic happened! We gotta get out of there!',
279
+ });
280
+ await router.redirect('heartwood.root');
281
+ }
282
+ const { startDate = this.dates.date() } = args;
283
+ await this.calendarVc.renderOnce(() => {
284
+ this.syncOffsetWithLocale(locale);
285
+ this.calendarVc.setStartDate(startDate);
286
+ });
287
+ await this.transitionToRoot();
288
+ this.setSelectedDateInDateSelectVc(startDate);
289
+ await this.waitUntilDoneSaving();
290
+ }
291
+ syncPeopleOnCalendar() {
292
+ const visiblePeople = this.people.getVisiblePeople();
293
+ this.calendarVc.setPeople(visiblePeople);
294
+ }
295
+ syncOffsetWithLocale(locale) {
296
+ const offset = locale.getTimezoneOffsetMinutes();
297
+ this.calendarVc.setTimezoneOffsetMs(offset * 60 * 1000);
298
+ }
299
+ async loadEvents() {
300
+ this.loadEventsPromise = this._loadEvents();
301
+ await this.loadEventsPromise;
302
+ }
303
+ async _loadEvents() {
304
+ var _a;
305
+ try {
306
+ if (this.events.getCalendars().length > 0) {
307
+ const date = this.getStartDate();
308
+ const startDate = this.dates.getStartOfDay(date);
309
+ const endDate = this.dates.getEndOfDay(date);
310
+ await this.events.loadEvents(startDate, endDate, this.people.getTeam().map((t) => t.id));
311
+ await this.people.emit('did-update');
312
+ }
313
+ }
314
+ catch (err) {
315
+ console.error((_a = err.stack) !== null && _a !== void 0 ? _a : err.message);
316
+ void this.alert({
317
+ message: err.message,
318
+ });
319
+ }
320
+ }
321
+ async transitionToRoot() {
322
+ await this.sm.transitionTo(this.toolBeltStates.root);
323
+ }
324
+ async loadLoggedInPerson() {
325
+ const [{ auth }] = await this.client.emitAndFlattenResponses('whoami::v2020_12_25');
326
+ this.person = auth.person;
327
+ }
328
+ getVisibleEvents() {
329
+ const end = this.dates.getEndOfDay(this.calendarVc.getStartDate());
330
+ const start = this.dates.getStartOfDay(this.calendarVc.getStartDate());
331
+ const events = this.events
332
+ .getAllEvents()
333
+ .filter((e) => e.startDateTimeMs <= end && e.startDateTimeMs >= start);
334
+ return events;
335
+ }
336
+ render() {
337
+ return {
338
+ isFullScreen: true,
339
+ layouts: [
340
+ {
341
+ cards: [
342
+ {
343
+ body: {
344
+ sections: [
345
+ {
346
+ shouldBePadded: false,
347
+ calendar: this.calendarVc.render(),
348
+ },
349
+ ],
350
+ },
351
+ },
352
+ ],
353
+ },
354
+ ],
355
+ };
356
+ }
357
+ }
358
+ exports.default = RootSkillViewController;
359
+ RootSkillViewController.id = 'root';
@@ -0,0 +1,26 @@
1
+ import { MercuryClient } from '@sprucelabs/mercury-client';
2
+ import { PersonMode } from '../viewControllers/PersonSelectTool.vc';
3
+ export default class RemotePreferencesStore {
4
+ protected isLoaded: boolean;
5
+ protected client: MercuryClient;
6
+ private organizationId;
7
+ private visiblePeopleMode?;
8
+ protected visibleCalendarIds?: string[];
9
+ private visiblePeopleIds?;
10
+ private connectToApi;
11
+ constructor(options: RemotePreferencesStoreOptions);
12
+ load(organizationId: string): Promise<void>;
13
+ protected loadPreferences(): Promise<void>;
14
+ setVisibleCalendarIds(ids: string[]): Promise<void>;
15
+ protected save(): Promise<void>;
16
+ getVisibleCalendarIds(): string[] | undefined;
17
+ setVisiblePeopleMode(mode: VisiblePeopleMode): Promise<void>;
18
+ setVisiblePeopleIds(peopleIds: string[]): Promise<void>;
19
+ getVisiblePeopleIds(): string[] | undefined;
20
+ getVisiblePeopleMode(): PersonMode | null | undefined;
21
+ getIsLoaded(): boolean;
22
+ }
23
+ export declare type VisiblePeopleMode = 'custom' | 'me' | 'working';
24
+ export interface RemotePreferencesStoreOptions {
25
+ connectToApi: () => Promise<MercuryClient>;
26
+ }
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const schema_1 = require("@sprucelabs/schema");
4
+ class RemotePreferencesStore {
5
+ constructor(options) {
6
+ this.isLoaded = false;
7
+ const { connectToApi } = (0, schema_1.assertOptions)(options, ['connectToApi']);
8
+ this.connectToApi = connectToApi;
9
+ }
10
+ async load(organizationId) {
11
+ (0, schema_1.assertOptions)({ organizationId }, ['organizationId']);
12
+ this.organizationId = organizationId;
13
+ this.isLoaded = true;
14
+ this.client = await this.connectToApi();
15
+ await this.loadPreferences();
16
+ }
17
+ async loadPreferences() {
18
+ const [{ selectedCalendarIds, visiblePeopleMode, visiblePeopleIds }] = await this.client.emitAndFlattenResponses('calendar.get-preferences::v2021_05_19', {
19
+ target: {
20
+ organizationId: this.organizationId,
21
+ },
22
+ });
23
+ this.visibleCalendarIds = selectedCalendarIds !== null && selectedCalendarIds !== void 0 ? selectedCalendarIds : undefined;
24
+ this.visiblePeopleMode = visiblePeopleMode !== null && visiblePeopleMode !== void 0 ? visiblePeopleMode : undefined;
25
+ this.visiblePeopleIds = visiblePeopleIds !== null && visiblePeopleIds !== void 0 ? visiblePeopleIds : undefined;
26
+ }
27
+ async setVisibleCalendarIds(ids) {
28
+ this.visibleCalendarIds = ids;
29
+ await this.save();
30
+ }
31
+ async save() {
32
+ await this.client.emit('calendar.update-preferences::v2021_05_19', {
33
+ target: {
34
+ organizationId: this.organizationId,
35
+ },
36
+ payload: {
37
+ selectedCalendarIds: this.visibleCalendarIds,
38
+ visiblePeopleMode: this.visiblePeopleMode,
39
+ visiblePeopleIds: this.visiblePeopleIds,
40
+ },
41
+ });
42
+ }
43
+ getVisibleCalendarIds() {
44
+ if (!this.isLoaded) {
45
+ throw new Error(`You have to load the preferences store before getting selected calendar ids.`);
46
+ }
47
+ return this.visibleCalendarIds;
48
+ }
49
+ async setVisiblePeopleMode(mode) {
50
+ this.visiblePeopleMode = mode;
51
+ await this.save();
52
+ }
53
+ async setVisiblePeopleIds(peopleIds) {
54
+ this.visiblePeopleIds = peopleIds;
55
+ await this.save();
56
+ }
57
+ getVisiblePeopleIds() {
58
+ return this.visiblePeopleIds;
59
+ }
60
+ getVisiblePeopleMode() {
61
+ return this.visiblePeopleMode;
62
+ }
63
+ getIsLoaded() {
64
+ return this.isLoaded;
65
+ }
66
+ }
67
+ exports.default = RemotePreferencesStore;
@@ -0,0 +1,5 @@
1
+ import { ViewControllerId } from '@sprucelabs/heartwood-view-controllers';
2
+ import { CalendarTool, CalendarToolBeltStateMachine, CalendarToolOptions } from '../types/calendar.types';
3
+ export default class CalendarToolTestFactory {
4
+ static Tool(stateMachine: CalendarToolBeltStateMachine, vcId: ViewControllerId, options?: Partial<CalendarToolOptions>): CalendarTool;
5
+ }
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const schema_1 = require("@sprucelabs/schema");
7
+ const test_1 = require("@sprucelabs/test");
8
+ const cloneDeep_1 = __importDefault(require("lodash/cloneDeep"));
9
+ class CalendarToolTestFactory {
10
+ static Tool(stateMachine, vcId, options) {
11
+ (0, schema_1.assertOptions)({ stateMachine, vcId }, ['stateMachine', 'vcId']);
12
+ const vc = stateMachine.Controller(vcId, Object.assign({ getContext: () => stateMachine.getContext(), updateContext: (context) => {
13
+ return stateMachine.updateContext(context);
14
+ }, getPersonFromEvent: () => {
15
+ throw new schema_1.SchemaError({
16
+ code: 'MISSING_PARAMETERS',
17
+ parameters: ['getPersonFromEvent'],
18
+ friendlyMessage: `You need to pass 'getPersonFromEvent: () => login.getPerson()' or similar to CalendarToolTestFactory.Tool(....)`,
19
+ });
20
+ }, getHasPendingContextChanges: () => {
21
+ throw new schema_1.SchemaError({
22
+ code: 'MISSING_PARAMETERS',
23
+ parameters: ['getHasPendingContextChanges'],
24
+ friendlyMessage: `You need to pass 'getHasPendingContextChanges: () => boolean' or similar to CalendarToolTestFactory.Tool(....)`,
25
+ });
26
+ } }, (0, cloneDeep_1.default)(options !== null && options !== void 0 ? options : {})));
27
+ void stateMachine.on('did-update-context', () => {
28
+ return vc.handleUpdateContext(stateMachine.getContext());
29
+ });
30
+ test_1.assert.isFunction(vc.handleUpdateContext, `You need to make sure your card view controller implements the CalendarTool interface!`);
31
+ return vc;
32
+ }
33
+ }
34
+ exports.default = CalendarToolTestFactory;
@@ -0,0 +1,37 @@
1
+ import { CardViewController, SpruceSchemas, ToolBeltState } from '@sprucelabs/heartwood-view-controllers';
2
+ import { CalendarToolBeltStateMachine } from '../../types/calendar.types';
3
+ declare type Calendar = SpruceSchemas.Calendar.v2021_05_19.Calendar;
4
+ declare type EventType = SpruceSchemas.Calendar.v2021_05_19.CalendarEventType;
5
+ declare type SelectCalendarHandler = (calendar: Calendar) => Promise<void> | void;
6
+ declare type SelectTypeHandler = (type: EventType) => Promise<void> | void;
7
+ export interface PrerequisitesToolBeltStateOptions {
8
+ onSelectCalendar?: SelectCalendarHandler;
9
+ onSelectEventType?: SelectTypeHandler;
10
+ }
11
+ export declare class PrerequisitesToolBeltState implements ToolBeltState {
12
+ readonly id = "prerequisites";
13
+ private calendarSelectCardVc?;
14
+ private typeSelectCardVc?;
15
+ private toolBeltVc;
16
+ private sm;
17
+ private calendars?;
18
+ private selectCalendarHandler?;
19
+ private selectEventTypeHandler?;
20
+ private calendar?;
21
+ constructor(options?: PrerequisitesToolBeltStateOptions);
22
+ load(stateMachine: CalendarToolBeltStateMachine): Promise<void>;
23
+ destroy(): void;
24
+ private setupCalendarSelectCard;
25
+ private handleSelectCalendar;
26
+ private setupTypeSelectCard;
27
+ private renderTypeButtonsSection;
28
+ private handleSelectType;
29
+ private updateEventInContext;
30
+ private TypeSelectCardVc;
31
+ getCalendarSelectCardVc(): CardViewController | undefined;
32
+ getTypeSelectCardVc(): CardViewController | undefined;
33
+ private SelectCalendarCardVc;
34
+ private listCalendars;
35
+ private connectToApi;
36
+ }
37
+ export {};