@miso.ai/client-sdk-ui 1.11.5 → 1.11.6-beta.1

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 (117) hide show
  1. package/dist/cjs/actor/data.js +5 -7
  2. package/dist/cjs/actor/feedback.js +1 -2
  3. package/dist/cjs/actor/filters.js +20 -21
  4. package/dist/cjs/actor/hub.js +34 -8
  5. package/dist/cjs/actor/index.js +1 -2
  6. package/dist/cjs/actor/interactions.js +5 -7
  7. package/dist/cjs/actor/sessions.js +1 -2
  8. package/dist/cjs/actor/tracker.js +9 -12
  9. package/dist/cjs/actor/view.js +11 -20
  10. package/dist/cjs/actor/views.js +16 -21
  11. package/dist/cjs/affiliation/index.js +1 -2
  12. package/dist/cjs/combo/ask/elements.js +3 -4
  13. package/dist/cjs/combo/ask/index.js +1 -2
  14. package/dist/cjs/combo/ask/options.js +2 -6
  15. package/dist/cjs/defaults/ask/controls.js +1 -2
  16. package/dist/cjs/defaults/ask/index.js +1 -2
  17. package/dist/cjs/defaults/ask/templates.js +3 -6
  18. package/dist/cjs/defaults/common/templates.js +30 -41
  19. package/dist/cjs/defaults/hybrid-search/answer-box.js +9 -11
  20. package/dist/cjs/defaults/hybrid-search/controls.js +1 -2
  21. package/dist/cjs/defaults/hybrid-search/index.js +1 -2
  22. package/dist/cjs/defaults/hybrid-search/templates.js +2 -4
  23. package/dist/cjs/defaults/index.js +1 -2
  24. package/dist/cjs/element/container/miso-explore.js +7 -7
  25. package/dist/cjs/element/container/miso-hybrid-search.js +3 -3
  26. package/dist/cjs/element/container/miso-recommendation.js +3 -38
  27. package/dist/cjs/element/container/miso-search.js +3 -3
  28. package/dist/cjs/element/container/miso-unit.js +52 -0
  29. package/dist/cjs/element/index.js +1 -2
  30. package/dist/cjs/element/role/miso-component.js +3 -4
  31. package/dist/cjs/element/utils.js +6 -9
  32. package/dist/cjs/layout/affiliation/affiliation.js +4 -6
  33. package/dist/cjs/layout/banner/banner.js +1 -2
  34. package/dist/cjs/layout/button/more-button.js +1 -2
  35. package/dist/cjs/layout/container/container.js +7 -12
  36. package/dist/cjs/layout/error/error.js +1 -2
  37. package/dist/cjs/layout/input/facets.js +28 -41
  38. package/dist/cjs/layout/input/option-list.js +1 -2
  39. package/dist/cjs/layout/input/search-box.js +31 -40
  40. package/dist/cjs/layout/input/select.js +1 -2
  41. package/dist/cjs/layout/list/cards.js +1 -2
  42. package/dist/cjs/layout/list/carousel.js +1 -2
  43. package/dist/cjs/layout/list/collection.js +12 -16
  44. package/dist/cjs/layout/list/gallery.js +18 -26
  45. package/dist/cjs/layout/list/list.js +1 -2
  46. package/dist/cjs/layout/mixin/swipeable.js +3 -4
  47. package/dist/cjs/layout/mixin/trackable.js +3 -6
  48. package/dist/cjs/layout/progressive.js +1 -2
  49. package/dist/cjs/layout/radio/feedback.js +6 -8
  50. package/dist/cjs/layout/radio/radio.js +5 -6
  51. package/dist/cjs/layout/raf.js +6 -10
  52. package/dist/cjs/layout/template.js +7 -10
  53. package/dist/cjs/layout/templates.js +51 -71
  54. package/dist/cjs/layout/text/text.js +6 -8
  55. package/dist/cjs/layout/text/typewriter/index.js +14 -18
  56. package/dist/cjs/layout/text/typewriter/plaintext.js +8 -10
  57. package/dist/cjs/layout/text/typewriter/utils.js +12 -15
  58. package/dist/cjs/plugin.js +13 -3
  59. package/dist/cjs/source.js +6 -7
  60. package/dist/cjs/util/dom.js +1 -2
  61. package/dist/cjs/util/proxy.js +3 -4
  62. package/dist/cjs/util/trackers.js +1 -3
  63. package/dist/cjs/util/viewables.js +1 -2
  64. package/dist/cjs/version.js +1 -1
  65. package/dist/cjs/workflow/answer-based.js +17 -24
  66. package/dist/cjs/workflow/ask.js +1 -2
  67. package/dist/cjs/workflow/asks.js +4 -6
  68. package/dist/cjs/workflow/autocomplete.js +3 -4
  69. package/dist/cjs/workflow/base.js +56 -54
  70. package/dist/cjs/workflow/explore.js +18 -22
  71. package/dist/cjs/workflow/explores.js +18 -0
  72. package/dist/cjs/workflow/hybrid-search-answer.js +4 -3
  73. package/dist/cjs/workflow/index.js +3 -3
  74. package/dist/cjs/workflow/options/api.js +2 -6
  75. package/dist/cjs/workflow/options/auto-query.js +2 -4
  76. package/dist/cjs/workflow/options/configurable.js +2 -6
  77. package/dist/cjs/workflow/options/data-processor.js +1 -4
  78. package/dist/cjs/workflow/options/filters.js +1 -4
  79. package/dist/cjs/workflow/options/interactions.js +1 -4
  80. package/dist/cjs/workflow/options/layouts.js +2 -6
  81. package/dist/cjs/workflow/options/options.js +5 -8
  82. package/dist/cjs/workflow/options/pagination.js +1 -4
  83. package/dist/cjs/workflow/options/roles.js +1 -3
  84. package/dist/cjs/workflow/options/trackers.js +6 -16
  85. package/dist/cjs/workflow/processors.js +16 -22
  86. package/dist/cjs/workflow/recommendation.js +9 -52
  87. package/dist/cjs/workflow/recommendations.js +3 -23
  88. package/dist/cjs/workflow/search-based.js +12 -8
  89. package/dist/cjs/workflow/search.js +1 -5
  90. package/dist/cjs/workflow/unit.js +58 -0
  91. package/dist/cjs/workflow/units.js +37 -0
  92. package/dist/cjs/workflow/use-link.js +3 -6
  93. package/package.json +2 -2
  94. package/src/actor/filters.js +4 -2
  95. package/src/actor/hub.js +26 -5
  96. package/src/element/container/miso-explore.js +8 -8
  97. package/src/element/container/miso-hybrid-search.js +4 -4
  98. package/src/element/container/miso-recommendation.js +3 -45
  99. package/src/element/container/miso-search.js +4 -4
  100. package/src/element/container/miso-unit.js +55 -0
  101. package/src/layout/input/search-box.js +1 -1
  102. package/src/layout/radio/radio.js +1 -0
  103. package/src/layout/templates.js +3 -2
  104. package/src/plugin.js +15 -2
  105. package/src/version.js +1 -1
  106. package/src/workflow/autocomplete.js +1 -0
  107. package/src/workflow/base.js +33 -23
  108. package/src/workflow/explore.js +13 -12
  109. package/src/workflow/explores.js +14 -0
  110. package/src/workflow/hybrid-search-answer.js +1 -1
  111. package/src/workflow/index.js +1 -1
  112. package/src/workflow/processors.js +2 -2
  113. package/src/workflow/recommendation.js +9 -47
  114. package/src/workflow/recommendations.js +3 -23
  115. package/src/workflow/search-based.js +4 -0
  116. package/src/workflow/unit.js +52 -0
  117. package/src/workflow/units.js +37 -0
@@ -107,6 +107,7 @@ export default class Autocomplete extends Workflow {
107
107
  }
108
108
 
109
109
  _updateCompletions(data) {
110
+ // TODO: session is different
110
111
  this._superworkflow.updateCompletions(data);
111
112
  }
112
113
 
@@ -6,24 +6,6 @@ import { ContainerLayout, ErrorLayout } from '../layout/index.js';
6
6
  import { WorkflowOptions, mergeApiOptions, makeConfigurable } from './options/index.js';
7
7
  import { getRevision, writeDataStatus, writeMisoIdToMeta, buildBaseInteraction, writeAffiliationInfoToInteraction, mergeInteraction } from './processors.js';
8
8
 
9
- // TODO: just bury this into hub
10
- function injectLogger(hub, callback) {
11
- const { update, trigger } = hub;
12
- hub.update = (name, state, options) => {
13
- const result = update.call(hub, name, state, options);
14
- if (!options || !options.silent) {
15
- callback('update', name, state, options);
16
- }
17
- return result;
18
- }
19
- hub.trigger = (...args) => {
20
- const result = trigger.apply(hub, args);
21
- callback('trigger', ...args);
22
- return result;
23
- }
24
- return hub;
25
- }
26
-
27
9
  const DEFAULT_API_OPTIONS = Object.freeze({});
28
10
 
29
11
  const DEFAULT_LAYOUTS = Object.freeze({
@@ -62,9 +44,14 @@ export default class Workflow extends Component {
62
44
  this._extensions = plugin._getExtensions(client);
63
45
  this._defaults = defaults;
64
46
  this._options = options || new WorkflowOptions(context && context._options, defaults);
65
- this._hub = injectLogger(new Hub(), (...args) => this._log(...args));
47
+ this._hub = new Hub({
48
+ onUpdate: event => this._onHubUpdate(event),
49
+ onEmit: event => this._onHubEmit(event),
50
+ });
66
51
  this._sessionContext = new WeakMap();
67
52
 
53
+ client._events.emit('workflow', this);
54
+
68
55
  this._initProperties(args);
69
56
  this._initActors(args);
70
57
  this._initSubscriptions(args);
@@ -108,8 +95,25 @@ export default class Workflow extends Component {
108
95
  return context;
109
96
  }
110
97
 
98
+ // hub //
99
+ _onHubUpdate(event) {
100
+ this._runCallbacks(this._client.meta.parent._hubUpdateCallbacks, event);
101
+ }
102
+
103
+ _onHubEmit(event) {
104
+ this._runCallbacks(this._client.meta.parent._hubEmitCallbacks, event);
105
+ this._emitAsWorkflowEvent(event);
106
+ }
107
+
108
+ _emitAsWorkflowEvent({ action: _action, name, state, silent }) {
109
+ if (!silent) {
110
+ this._emit(name, { _action, ...state });
111
+ }
112
+ }
113
+
111
114
  // properties //
112
115
  get uuid() {
116
+ // TODO: review this
113
117
  return this.session && this.session.uuid;
114
118
  }
115
119
 
@@ -319,14 +323,20 @@ export default class Workflow extends Component {
319
323
  }
320
324
 
321
325
  // helper //
322
- _log(action, name, data) {
323
- this._emit(name, { _action: action, ...data });
326
+ _runCallbacks(callbacks, event) {
327
+ for (const callback of callbacks) {
328
+ try {
329
+ callback({ workflow: this, ...event });
330
+ } catch(e) {
331
+ this._error(e);
332
+ }
333
+ }
324
334
  }
325
335
 
326
336
  _emit(name, data) {
327
- this._events.emit(name, data);
337
+ this._events.emit(name, { _event: name, ...data });
328
338
  if (this._context) {
329
- this._context._events.emit(name, { workflow: this, ...data });
339
+ this._context._events.emit(name, { workflow: this, _event: name, ...data });
330
340
  }
331
341
  }
332
342
 
@@ -1,5 +1,5 @@
1
1
  import { API } from '@miso.ai/commons';
2
- import Workflow from './base.js';
2
+ import UnitWorkflow from './unit.js';
3
3
  import { fields } from '../actor/index.js';
4
4
  import { ROLE, EVENT_TYPE } from '../constants.js';
5
5
  import { ListLayout, SearchBoxLayout } from '../layout/index.js';
@@ -7,19 +7,19 @@ import { mergeRolesOptions, DEFAULT_TRACKER_OPTIONS } from './options/index.js';
7
7
  import { enableUseLink, UseLinkMixin } from './use-link.js';
8
8
 
9
9
  const DEFAULT_API_OPTIONS = Object.freeze({
10
- ...Workflow.DEFAULT_API_OPTIONS,
10
+ ...UnitWorkflow.DEFAULT_API_OPTIONS,
11
11
  group: API.GROUP.ASK,
12
12
  name: API.NAME.RELATED_QUESTIONS,
13
13
  });
14
14
 
15
15
  const DEFAULT_LAYOUTS = Object.freeze({
16
- ...Workflow.DEFAULT_LAYOUTS,
16
+ ...UnitWorkflow.DEFAULT_LAYOUTS,
17
17
  [ROLE.RELATED_QUESTIONS]: [ListLayout.type, { itemType: 'question', link: { rel: 'noopener nofollow' } }],
18
18
  [ROLE.QUERY]: [SearchBoxLayout.type, { placeholder: 'Ask a question' }],
19
19
  });
20
20
 
21
21
  const DEFAULT_TRACKERS = Object.freeze({
22
- ...Workflow.DEFAULT_TRACKERS,
22
+ ...UnitWorkflow.DEFAULT_TRACKERS,
23
23
  [ROLE.RELATED_QUESTIONS]: DEFAULT_TRACKER_OPTIONS,
24
24
  [ROLE.CONTAINER]: {
25
25
  ...DEFAULT_TRACKER_OPTIONS,
@@ -33,26 +33,26 @@ const DEFAULT_TRACKERS = Object.freeze({
33
33
  });
34
34
 
35
35
  const DEFAULT_OPTIONS = Object.freeze({
36
- ...Workflow.DEFAULT_OPTIONS,
36
+ ...UnitWorkflow.DEFAULT_OPTIONS,
37
37
  api: DEFAULT_API_OPTIONS,
38
38
  layouts: DEFAULT_LAYOUTS,
39
39
  trackers: DEFAULT_TRACKERS,
40
40
  });
41
41
 
42
- const ROLES_OPTIONS = mergeRolesOptions(Workflow.ROLES_OPTIONS, {
42
+ const ROLES_OPTIONS = mergeRolesOptions(UnitWorkflow.ROLES_OPTIONS, {
43
43
  main: ROLE.RELATED_QUESTIONS,
44
44
  members: Object.keys(DEFAULT_LAYOUTS),
45
45
  });
46
46
 
47
- export default class Explore extends Workflow {
47
+ export default class Explore extends UnitWorkflow {
48
48
 
49
- constructor(plugin, client) {
49
+ constructor(context, id) {
50
50
  super({
51
51
  name: 'explore',
52
- plugin,
53
- client,
52
+ context,
54
53
  roles: ROLES_OPTIONS,
55
54
  defaults: DEFAULT_OPTIONS,
55
+ id,
56
56
  });
57
57
  }
58
58
 
@@ -79,12 +79,13 @@ export default class Explore extends Workflow {
79
79
  });
80
80
  }
81
81
 
82
- useApi(options) {
82
+ useApi(...args) {
83
+ const options = (typeof args[0] === 'object' ? args[0] : args[1]) || {};
83
84
  const { product_id } = options;
84
85
  if (product_id) {
85
86
  this._productId = product_id;
86
87
  }
87
- return super.useApi(options);
88
+ return super.useApi(...args);
88
89
  }
89
90
 
90
91
  useLink(fn, options) {
@@ -0,0 +1,14 @@
1
+ import UnitWorkflowContext from './units.js';
2
+ import Explore from './explore.js';
3
+
4
+ export default class Explores extends UnitWorkflowContext {
5
+
6
+ constructor(plugin, client) {
7
+ super('explores', plugin, client);
8
+ }
9
+
10
+ _create(unitId) {
11
+ return new Explore(this, unitId);
12
+ }
13
+
14
+ }
@@ -36,7 +36,7 @@ export default class HybridSearchAnswer extends AnswerBasedWorkflow {
36
36
  super.restart();
37
37
  // cascade restart to the sibling
38
38
  const results = this._superworkflow._results;
39
- results._views.filters.reset();
39
+ results._views.filters.reset({ silent: true });
40
40
  results.restart();
41
41
  this._resultsSession = results.session; // keep track of the session
42
42
  }
@@ -1,5 +1,5 @@
1
1
  export { default as Asks } from './asks.js';
2
2
  export { default as HybridSearch } from './hybrid-search.js';
3
- export { default as Explore } from './explore.js';
4
3
  export { default as Search } from './search.js';
5
4
  export { default as Recommendations } from './recommendations.js';
5
+ export { default as Explores } from './explores.js';
@@ -175,10 +175,10 @@ export function concatItemsFromMoreResponse(oldData, newData, { role = ROLE.PROD
175
175
  // use old values of facet_counts and total, for they are affected by product_id exclusion
176
176
  return {
177
177
  ...newData,
178
- facet_counts,
179
- total,
180
178
  value: {
181
179
  ...newData.value,
180
+ facet_counts,
181
+ total,
182
182
  [role]: [...oldProducts, ...newProducts],
183
183
  },
184
184
  }
@@ -1,43 +1,42 @@
1
- import { defineValues, API } from '@miso.ai/commons';
2
- import Workflow from './base.js';
1
+ import { API } from '@miso.ai/commons';
2
+ import UnitWorkflow from './unit.js';
3
3
  import { ListLayout } from '../layout/index.js';
4
4
  import { ROLE } from '../constants.js';
5
5
  import { mergeRolesOptions, DEFAULT_TRACKER_OPTIONS } from './options/index.js';
6
- import { mergeInteraction } from './processors.js';
7
6
 
8
7
  const DEFAULT_API_OPTIONS = Object.freeze({
9
- ...Workflow.DEFAULT_API_OPTIONS,
8
+ ...UnitWorkflow.DEFAULT_API_OPTIONS,
10
9
  group: API.GROUP.RECOMMENDATION,
11
10
  name: API.NAME.USER_TO_PRODUCTS,
12
11
  payload: {
13
- ...Workflow.DEFAULT_API_OPTIONS.payload,
12
+ ...UnitWorkflow.DEFAULT_API_OPTIONS.payload,
14
13
  fl: ['*'],
15
14
  },
16
15
  });
17
16
 
18
17
  const DEFAULT_LAYOUTS = Object.freeze({
19
- ...Workflow.DEFAULT_LAYOUTS,
18
+ ...UnitWorkflow.DEFAULT_LAYOUTS,
20
19
  [ROLE.PRODUCTS]: ListLayout.type,
21
20
  });
22
21
 
23
22
  const DEFAULT_TRACKERS = Object.freeze({
24
- ...Workflow.DEFAULT_TRACKERS,
23
+ ...UnitWorkflow.DEFAULT_TRACKERS,
25
24
  [ROLE.PRODUCTS]: DEFAULT_TRACKER_OPTIONS,
26
25
  });
27
26
 
28
27
  const DEFAULT_OPTIONS = Object.freeze({
29
- ...Workflow.DEFAULT_OPTIONS,
28
+ ...UnitWorkflow.DEFAULT_OPTIONS,
30
29
  api: DEFAULT_API_OPTIONS,
31
30
  layouts: DEFAULT_LAYOUTS,
32
31
  trackers: DEFAULT_TRACKERS,
33
32
  });
34
33
 
35
- const ROLES_OPTIONS = mergeRolesOptions(Workflow.ROLES_OPTIONS, {
34
+ const ROLES_OPTIONS = mergeRolesOptions(UnitWorkflow.ROLES_OPTIONS, {
36
35
  main: ROLE.PRODUCTS,
37
36
  members: Object.keys(DEFAULT_LAYOUTS),
38
37
  });
39
38
 
40
- export default class Recommendation extends Workflow {
39
+ export default class Recommendation extends UnitWorkflow {
41
40
 
42
41
  constructor(context, id) {
43
42
  super({
@@ -49,17 +48,6 @@ export default class Recommendation extends Workflow {
49
48
  });
50
49
  }
51
50
 
52
- _initProperties(args) {
53
- super._initProperties(args);
54
- const { id } = args;
55
- defineValues(this, { id });
56
- }
57
-
58
- _initSession(args) {
59
- this._context._members.set(args.id, this);
60
- super._initSession(args);
61
- }
62
-
63
51
  // lifecycle //
64
52
  start() {
65
53
  // in recommendation workflow, start() triggers query
@@ -72,30 +60,4 @@ export default class Recommendation extends Workflow {
72
60
  return this;
73
61
  }
74
62
 
75
- // interactions //
76
- _defaultProcessInteraction(payload, args) {
77
- payload = super._defaultProcessInteraction(payload, args);
78
- payload = this._writeUnitIdToInteraction(payload, args);
79
- return payload;
80
- }
81
-
82
- _writeUnitIdToInteraction(payload) {
83
- const unit_id = this.id;
84
- const unit_instance_uuid = this.uuid;
85
- return mergeInteraction(payload, {
86
- context: {
87
- custom_context: {
88
- unit_id,
89
- unit_instance_uuid,
90
- },
91
- },
92
- });
93
- }
94
-
95
- // destroy //
96
- _destroy(options) {
97
- this._context._members.delete(this.id);
98
- super._destroy(options);
99
- }
100
-
101
63
  }
@@ -1,34 +1,14 @@
1
- import { DEFAULT_UNIT_ID } from '../constants.js';
2
- import WorkflowContext from './context.js';
1
+ import UnitWorkflowContext from './units.js';
3
2
  import Recommendation from './recommendation.js';
4
3
 
5
- export default class Recommendations extends WorkflowContext {
4
+ export default class Recommendations extends UnitWorkflowContext {
6
5
 
7
6
  constructor(plugin, client) {
8
7
  super('recommendations', plugin, client);
9
- this._members = new Map();
10
8
  }
11
9
 
12
- workflows() {
13
- return [...this._members.values()];
14
- }
15
-
16
- create(unitId = DEFAULT_UNIT_ID) {
17
- if (this._members.has(unitId)) {
18
- throw new Error(`Unit already exists: ${unitId}`);
19
- }
10
+ _create(unitId) {
20
11
  return new Recommendation(this, unitId);
21
12
  }
22
13
 
23
- has(unitId = DEFAULT_UNIT_ID) {
24
- return this._members.has(unitId);
25
- }
26
-
27
- get(unitId = DEFAULT_UNIT_ID) {
28
- if (typeof unitId !== 'string') {
29
- throw new Error(`Required unit ID to be a string: ${unitId}`);
30
- }
31
- return this._members.get(unitId) || new Recommendation(this, unitId);
32
- }
33
-
34
14
  }
@@ -102,6 +102,9 @@ export default class SearchBasedWorkflow extends Workflow {
102
102
  // keep track of the query args for refine and more calls
103
103
  this._queryArgs = args;
104
104
 
105
+ // reset filters view
106
+ this._views.filters.reset({ silent: true });
107
+
105
108
  // start a new session
106
109
  this.restart();
107
110
 
@@ -126,6 +129,7 @@ export default class SearchBasedWorkflow extends Workflow {
126
129
  this._request({ payload });
127
130
  }
128
131
 
132
+ // TODO: expose API
129
133
  _more() {
130
134
  // if still loading, complain
131
135
  if (this.status !== STATUS.READY) {
@@ -0,0 +1,52 @@
1
+ import { defineValues } from '@miso.ai/commons';
2
+ import Workflow from './base.js';
3
+ import { mergeInteraction } from './processors.js';
4
+
5
+ export default class UnitWorkflow extends Workflow {
6
+
7
+ _initProperties(args) {
8
+ super._initProperties(args);
9
+ const { id } = args;
10
+ defineValues(this, { id });
11
+ }
12
+
13
+ _initSession(args) {
14
+ this._context._members.set(args.id, this);
15
+ super._initSession(args);
16
+ }
17
+
18
+ // interactions //
19
+ _defaultProcessInteraction(payload, args) {
20
+ payload = super._defaultProcessInteraction(payload, args);
21
+ payload = this._writeUnitIdToInteraction(payload, args);
22
+ return payload;
23
+ }
24
+
25
+ _writeUnitIdToInteraction(payload) {
26
+ const unit_id = this.id;
27
+ const unit_instance_uuid = this.uuid;
28
+ return mergeInteraction(payload, {
29
+ context: {
30
+ custom_context: {
31
+ unit_id,
32
+ unit_instance_uuid,
33
+ },
34
+ },
35
+ });
36
+ }
37
+
38
+ // destroy //
39
+ _destroy(options) {
40
+ this._context._members.delete(this.id);
41
+ super._destroy(options);
42
+ }
43
+
44
+ }
45
+
46
+ Object.assign(UnitWorkflow, {
47
+ DEFAULT_API_OPTIONS: Workflow.DEFAULT_API_OPTIONS,
48
+ DEFAULT_LAYOUTS: Workflow.DEFAULT_LAYOUTS,
49
+ DEFAULT_TRACKERS: Workflow.DEFAULT_TRACKERS,
50
+ DEFAULT_OPTIONS: Workflow.DEFAULT_OPTIONS,
51
+ ROLES_OPTIONS: Workflow.ROLES_OPTIONS,
52
+ });
@@ -0,0 +1,37 @@
1
+ import { DEFAULT_UNIT_ID } from '../constants.js';
2
+ import WorkflowContext from './context.js';
3
+
4
+ export default class UnitWorkflowContext extends WorkflowContext {
5
+
6
+ constructor(name, plugin, client) {
7
+ super(name, plugin, client);
8
+ this._members = new Map();
9
+ }
10
+
11
+ workflows() {
12
+ return [...this._members.values()];
13
+ }
14
+
15
+ create(unitId = DEFAULT_UNIT_ID) {
16
+ if (this._members.has(unitId)) {
17
+ throw new Error(`Unit already exists: ${unitId}`);
18
+ }
19
+ return this._create(unitId);
20
+ }
21
+
22
+ has(unitId = DEFAULT_UNIT_ID) {
23
+ return this._members.has(unitId);
24
+ }
25
+
26
+ get(unitId = DEFAULT_UNIT_ID) {
27
+ if (typeof unitId !== 'string') {
28
+ throw new Error(`Required unit ID to be a string: ${unitId}`);
29
+ }
30
+ return this._members.get(unitId) || this._create(unitId);
31
+ }
32
+
33
+ _create(unitId) {
34
+ throw new Error('Not implemented');
35
+ }
36
+
37
+ }