@zajno/common 1.3.1 → 1.3.5

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 (154) hide show
  1. package/.github/workflows/CI.yml +8 -0
  2. package/coverage/clover.xml +449 -379
  3. package/coverage/coverage-final.json +20 -19
  4. package/coverage/lcov-report/index.html +43 -43
  5. package/coverage/lcov-report/src/__tests__/helpers/index.html +1 -1
  6. package/coverage/lcov-report/src/__tests__/helpers/main.ts.html +2 -2
  7. package/coverage/lcov-report/src/async/arrays.ts.html +1 -1
  8. package/coverage/lcov-report/src/async/index.html +1 -1
  9. package/coverage/lcov-report/src/dates/calc.ts.html +1 -1
  10. package/coverage/lcov-report/src/dates/convert.ts.html +1 -1
  11. package/coverage/lcov-report/src/dates/datex.ts.html +1 -1
  12. package/coverage/lcov-report/src/dates/format.ts.html +1 -1
  13. package/coverage/lcov-report/src/dates/index.html +1 -1
  14. package/coverage/lcov-report/src/dates/index.ts.html +1 -1
  15. package/coverage/lcov-report/src/dates/parse.ts.html +1 -1
  16. package/coverage/lcov-report/src/dates/period.ts.html +1 -1
  17. package/coverage/lcov-report/src/dates/shift.ts.html +1 -1
  18. package/coverage/lcov-report/src/dates/types.ts.html +1 -1
  19. package/coverage/lcov-report/src/dates/yearDate.ts.html +1 -1
  20. package/coverage/lcov-report/src/enumHelper.ts.html +1 -1
  21. package/coverage/lcov-report/src/event.ts.html +3 -3
  22. package/coverage/lcov-report/src/index.html +21 -21
  23. package/coverage/lcov-report/src/lazy.light.ts.html +3 -3
  24. package/coverage/lcov-report/src/logger/batch.ts.html +107 -0
  25. package/coverage/lcov-report/src/logger/console.ts.html +10 -25
  26. package/coverage/lcov-report/src/logger/index.html +54 -39
  27. package/coverage/lcov-report/src/logger/index.ts.html +88 -61
  28. package/coverage/lcov-report/src/logger/named.ts.html +31 -31
  29. package/coverage/lcov-report/src/logger/proxy.ts.html +13 -13
  30. package/coverage/lcov-report/src/math/arrays.ts.html +293 -32
  31. package/coverage/lcov-report/src/math/calc.ts.html +11 -11
  32. package/coverage/lcov-report/src/math/distribution.ts.html +2 -2
  33. package/coverage/lcov-report/src/math/index.html +11 -11
  34. package/coverage/lcov-report/src/math/index.ts.html +6 -6
  35. package/coverage/lcov-report/src/transitionObserver.ts.html +5 -5
  36. package/coverage/lcov-report/src/types.ts.html +33 -18
  37. package/coverage/lcov-report/src/validation/ValidationErrors.ts.html +1 -1
  38. package/coverage/lcov-report/src/validation/creditCard.ts.html +1 -1
  39. package/coverage/lcov-report/src/validation/helpers.ts.html +1 -1
  40. package/coverage/lcov-report/src/validation/index.html +1 -1
  41. package/coverage/lcov-report/src/validation/index.ts.html +1 -1
  42. package/coverage/lcov-report/src/validation/types.ts.html +1 -1
  43. package/coverage/lcov-report/src/validation/validators.ts.html +1 -1
  44. package/coverage/lcov-report/src/validation/wrappers.ts.html +1 -1
  45. package/coverage/lcov-report/src/viewModels/FlagModel.ts.html +21 -18
  46. package/coverage/lcov-report/src/viewModels/MultiSelectModel.ts.html +124 -94
  47. package/coverage/lcov-report/src/viewModels/NumberModel.ts.html +19 -10
  48. package/coverage/lcov-report/src/viewModels/SelectModel.ts.html +19 -10
  49. package/coverage/lcov-report/src/viewModels/Validatable.ts.html +45 -21
  50. package/coverage/lcov-report/src/viewModels/index.html +54 -54
  51. package/coverage/lcov-report/src/viewModels/wrappers.ts.html +3 -15
  52. package/coverage/lcov.info +915 -762
  53. package/lib/event.d.ts.map +1 -1
  54. package/lib/event.js +1 -1
  55. package/lib/event.js.map +1 -1
  56. package/lib/logger/batch.d.ts +3 -0
  57. package/lib/logger/batch.d.ts.map +1 -0
  58. package/lib/logger/batch.js +12 -0
  59. package/lib/logger/batch.js.map +1 -0
  60. package/lib/logger/console.d.ts +0 -1
  61. package/lib/logger/console.d.ts.map +1 -1
  62. package/lib/logger/console.js +0 -3
  63. package/lib/logger/console.js.map +1 -1
  64. package/lib/logger/file.d.ts +15 -0
  65. package/lib/logger/file.d.ts.map +1 -0
  66. package/lib/logger/file.js +43 -0
  67. package/lib/logger/file.js.map +1 -0
  68. package/lib/logger/index.d.ts +7 -6
  69. package/lib/logger/index.d.ts.map +1 -1
  70. package/lib/logger/index.js +34 -21
  71. package/lib/logger/index.js.map +1 -1
  72. package/lib/logger/named.js +3 -3
  73. package/lib/logger/named.js.map +1 -1
  74. package/lib/logger/proxy.d.ts +1 -1
  75. package/lib/logger/proxy.d.ts.map +1 -1
  76. package/lib/logger/proxy.js +2 -2
  77. package/lib/logger/proxy.js.map +1 -1
  78. package/lib/math/arrays.d.ts +16 -0
  79. package/lib/math/arrays.d.ts.map +1 -1
  80. package/lib/math/arrays.js +77 -1
  81. package/lib/math/arrays.js.map +1 -1
  82. package/lib/transitionObserver.d.ts.map +1 -1
  83. package/lib/transitionObserver.js +2 -2
  84. package/lib/transitionObserver.js.map +1 -1
  85. package/lib/types.d.ts +4 -0
  86. package/lib/types.d.ts.map +1 -1
  87. package/lib/types.js +6 -2
  88. package/lib/types.js.map +1 -1
  89. package/lib/viewModels/FlagModel.d.ts +4 -4
  90. package/lib/viewModels/FlagModel.d.ts.map +1 -1
  91. package/lib/viewModels/FlagModel.js +1 -0
  92. package/lib/viewModels/FlagModel.js.map +1 -1
  93. package/lib/viewModels/MultiSelectModel.d.ts +8 -2
  94. package/lib/viewModels/MultiSelectModel.d.ts.map +1 -1
  95. package/lib/viewModels/MultiSelectModel.js +13 -2
  96. package/lib/viewModels/MultiSelectModel.js.map +1 -1
  97. package/lib/viewModels/NumberModel.d.ts +4 -2
  98. package/lib/viewModels/NumberModel.d.ts.map +1 -1
  99. package/lib/viewModels/NumberModel.js +1 -0
  100. package/lib/viewModels/NumberModel.js.map +1 -1
  101. package/lib/viewModels/PromptModal.d.ts.map +1 -1
  102. package/lib/viewModels/PromptModal.js +1 -1
  103. package/lib/viewModels/PromptModal.js.map +1 -1
  104. package/lib/viewModels/SelectModel.d.ts +4 -2
  105. package/lib/viewModels/SelectModel.d.ts.map +1 -1
  106. package/lib/viewModels/SelectModel.js +1 -0
  107. package/lib/viewModels/SelectModel.js.map +1 -1
  108. package/lib/viewModels/TextModel.d.ts +4 -3
  109. package/lib/viewModels/TextModel.d.ts.map +1 -1
  110. package/lib/viewModels/TextModel.js +5 -5
  111. package/lib/viewModels/TextModel.js.map +1 -1
  112. package/lib/viewModels/Validatable.d.ts +2 -1
  113. package/lib/viewModels/Validatable.d.ts.map +1 -1
  114. package/lib/viewModels/Validatable.js +7 -0
  115. package/lib/viewModels/Validatable.js.map +1 -1
  116. package/lib/viewModels/ValuesCollector.d.ts +1 -3
  117. package/lib/viewModels/ValuesCollector.d.ts.map +1 -1
  118. package/lib/viewModels/ValuesCollector.js.map +1 -1
  119. package/lib/viewModels/index.d.ts +1 -0
  120. package/lib/viewModels/index.d.ts.map +1 -1
  121. package/lib/viewModels/index.js +1 -0
  122. package/lib/viewModels/index.js.map +1 -1
  123. package/lib/viewModels/types.d.ts +16 -0
  124. package/lib/viewModels/types.d.ts.map +1 -0
  125. package/lib/viewModels/types.js +3 -0
  126. package/lib/viewModels/types.js.map +1 -0
  127. package/lib/viewModels/wrappers.d.ts +1 -4
  128. package/lib/viewModels/wrappers.d.ts.map +1 -1
  129. package/lib/viewModels/wrappers.js.map +1 -1
  130. package/package.json +1 -1
  131. package/src/event.ts +2 -2
  132. package/src/logger/__tests__/{index.test.ts → logger.test.ts} +97 -41
  133. package/src/logger/batch.ts +9 -0
  134. package/src/logger/console.ts +0 -5
  135. package/src/logger/file.ts +46 -0
  136. package/src/logger/index.ts +37 -28
  137. package/src/logger/named.ts +3 -3
  138. package/src/logger/proxy.ts +2 -2
  139. package/src/math/__tests__/arrays.test.ts +53 -0
  140. package/src/math/arrays.ts +87 -0
  141. package/src/transitionObserver.ts +2 -2
  142. package/src/types.ts +6 -1
  143. package/src/viewModels/FlagModel.ts +5 -4
  144. package/src/viewModels/MultiSelectModel.ts +14 -4
  145. package/src/viewModels/NumberModel.ts +5 -2
  146. package/src/viewModels/PromptModal.ts +1 -1
  147. package/src/viewModels/SelectModel.ts +5 -2
  148. package/src/viewModels/TextModel.ts +5 -4
  149. package/src/viewModels/Validatable.ts +8 -0
  150. package/src/viewModels/ValuesCollector.ts +1 -4
  151. package/src/viewModels/__tests__/multiSelect.test.ts +127 -12
  152. package/src/viewModels/index.ts +1 -0
  153. package/src/viewModels/types.ts +19 -0
  154. package/src/viewModels/wrappers.ts +1 -5
@@ -2,10 +2,12 @@ import { createLazy } from '../lazy.light';
2
2
  import { action, computed, makeObservable, observable, reaction } from 'mobx';
3
3
  import { FlagModel, ILabeledFlagModel } from './FlagModel';
4
4
  import { ValidatableModel } from './Validatable';
5
- import { IValueModel } from './ValuesCollector';
5
+ import { IValueModel } from './types';
6
6
  import { withLabel } from './wrappers';
7
+ import { ICountableModel, IResetableModel } from 'viewModels';
8
+ import { arraysCompareDistinct } from '../math';
7
9
 
8
- export class MultiSelect<T = any> extends ValidatableModel<ReadonlyArray<T>> implements IValueModel<readonly string[]> {
10
+ export class MultiSelect<T = any> extends ValidatableModel<ReadonlyArray<T>> implements IValueModel<readonly string[]>, IResetableModel, ICountableModel {
9
11
 
10
12
  @observable
11
13
  private readonly _indexes = new Set<number>();
@@ -54,9 +56,14 @@ export class MultiSelect<T = any> extends ValidatableModel<ReadonlyArray<T>> imp
54
56
  set value(v: readonly string[]) { this.selectValues(v); }
55
57
 
56
58
  isIndexSelected(index: number) { return this._indexes.has(index); }
57
- isValueSelected(value: string) { return this.values.includes(value); }
59
+ isValueSelected(value: string) { return this.selectedValues.includes(value); }
58
60
 
59
- get isEmpty() { return this._indexes.size === 0; }
61
+ get count() { return this._items.length; }
62
+ get selectedCount() { return this._indexes.size; }
63
+ get isEmpty() { return this.selectedCount === 0; }
64
+
65
+ @computed
66
+ get isDefault() { return arraysCompareDistinct(this.selectedIndexes, this._initial)?.diff === 0; }
60
67
 
61
68
  protected get valueToValidate() { return this.selectedItems; }
62
69
 
@@ -114,6 +121,9 @@ export class MultiSelect<T = any> extends ValidatableModel<ReadonlyArray<T>> imp
114
121
  }
115
122
  };
116
123
 
124
+ selectIndex = (index: number) => this.setIndexSelected(index, true);
125
+ deSelectIndex = (index: number) => this.setIndexSelected(index, false);
126
+
117
127
  reset = () => {
118
128
  super.reset();
119
129
  this.setInitialIndexes();
@@ -1,7 +1,8 @@
1
1
  import { action, makeObservable, observable } from 'mobx';
2
- import { IValueModel } from './ValuesCollector';
2
+ import { IResetableModel } from 'viewModels';
3
+ import { IValueModel } from './types';
3
4
 
4
- export interface INumberModel {
5
+ export interface INumberModel extends IResetableModel {
5
6
  value: number;
6
7
  }
7
8
 
@@ -21,6 +22,8 @@ export class NumberModel implements INumberModel, IValueModel<number> {
21
22
  get value() { return this._value; }
22
23
  set value(v: number) { this._value = v; }
23
24
 
25
+ get isDefault() { return this._value === this._initial; }
26
+
24
27
  @action
25
28
  reset = () => {
26
29
  this._value = this._initial;
@@ -61,5 +61,5 @@ export class PromptModalViewModel extends ModalActionModel<PromptModalAction> {
61
61
  get rejectColor() { return this.currentAction.rejectColor; }
62
62
 
63
63
  onConfirm = () => this.runAction(this.currentAction.onConfirm, true, this.currentAction.awaitActions);
64
- onReject = () => this.runAction(this.currentAction.onConfirm, true, this.currentAction.awaitActions);
64
+ onReject = () => this.runAction(this.currentAction.onReject, true, this.currentAction.awaitActions);
65
65
  }
@@ -2,10 +2,11 @@ import { createLazy } from '../lazy.light';
2
2
  import { observable, computed, makeObservable, reaction } from 'mobx';
3
3
  import { FlagModel, ILabeledFlagModel } from './FlagModel';
4
4
  import { ValidatableModel } from './Validatable';
5
- import { IValueModel } from './ValuesCollector';
5
+ import { IValueModel } from './types';
6
6
  import { withLabel } from './wrappers';
7
+ import { IResetableModel } from 'viewModels';
7
8
 
8
- export class Select<T = any> extends ValidatableModel<T> implements IValueModel<string> {
9
+ export class Select<T = any> extends ValidatableModel<T> implements IValueModel<string>, IResetableModel {
9
10
  @observable
10
11
  private _index: number = undefined;
11
12
 
@@ -67,6 +68,8 @@ export class Select<T = any> extends ValidatableModel<T> implements IValueModel<
67
68
  }
68
69
  }
69
70
 
71
+ get isDefault() { return this._index === this._initialIndex; }
72
+
70
73
  get index() {
71
74
  return this._index;
72
75
  }
@@ -1,8 +1,9 @@
1
1
  import { observable, computed, makeObservable, reaction } from 'mobx';
2
2
  import { Getter } from '../types';
3
+ import { IValueModel } from './types';
3
4
  import logger from '../logger';
4
5
  import { ValidatableModel, ValidationConfig } from './Validatable';
5
- import { IValueModel } from './ValuesCollector';
6
+ import { IResetableModel } from 'viewModels';
6
7
 
7
8
  export type TextInputConfig = {
8
9
  name?: Getter<string>;
@@ -39,7 +40,7 @@ export class Text {
39
40
  get value() { return this._value; }
40
41
  }
41
42
 
42
- export class TextInputVM extends ValidatableModel implements IValueModel<string> {
43
+ export class TextInputVM extends ValidatableModel implements IValueModel<string>, IResetableModel {
43
44
  @observable
44
45
  private _value = '';
45
46
 
@@ -103,10 +104,10 @@ export class TextInputVM extends ValidatableModel implements IValueModel<string>
103
104
  this.validate();
104
105
  }
105
106
 
106
- reset() {
107
+ reset = () => {
107
108
  this._value = '';
108
109
  this._focused = false;
109
110
  super.reset();
110
- }
111
+ };
111
112
 
112
113
  }
@@ -38,6 +38,14 @@ export abstract class ValidatableModel<T = string> {
38
38
  return this;
39
39
  }
40
40
 
41
+ public async testValidate(value: T) {
42
+ if (this._validator) {
43
+ const res = await this._validator(value);
44
+ return res;
45
+ }
46
+ return null;
47
+ }
48
+
41
49
  async validate() {
42
50
  if (!this._validator) {
43
51
  return true;
@@ -1,7 +1,4 @@
1
-
2
- export interface IValueModel<TValue> {
3
- value: TValue;
4
- }
1
+ import { IValueModel } from './types';
5
2
 
6
3
  export interface IValueCollector<TSource, TValue> {
7
4
  getValue(source: TSource): TValue;
@@ -1,23 +1,138 @@
1
- import { MultiSelect } from '../MultiSelectModel';
1
+ import { reaction, toJS } from 'mobx';
2
+ import { arrayRepeat } from '../../math';
3
+ import { MultiSelect, MultiSelectString } from '../MultiSelectModel';
4
+
5
+ type SetType<T> = { items: T[], selected: number[], accessor: (item: T) => string };
2
6
 
3
7
  describe('MultiSelectModel', () => {
4
- it('consistent', () => {
8
+ it('creates', () => {
5
9
  expect(() => new MultiSelect(null, null).values).toThrow();
6
10
  expect(() => new MultiSelect([1], null).values).toThrow();
11
+ });
12
+
13
+ const sets: SetType<any>[] = [
14
+ { items: [1, 2, 3], selected: [1], accessor: i => `_${i}_` },
15
+ { items: [1, 2, 3], selected: [], accessor: i => `_${i}_` },
16
+ { items: ['a', 'b', 'c'], selected: [2], accessor: i => i },
17
+ ];
18
+
19
+ describe('consistent', () => {
20
+ sets.forEach((set, setIndex) => {
21
+ it(`variant ${setIndex + 1}`, () => {
22
+ const items = set.items; // [1, 2, 3];
23
+ const accessor = set.accessor; // (i: number) => `_${i}_`;
24
+ const initialSelected = set.selected; // [1];
25
+ const values = items.map(accessor);
26
+ const selectedValues = initialSelected.map(i => accessor(items[i]));
7
27
 
8
- const items = [1, 2, 3];
9
- const accessor = (i: number) => `_${i}_`;
10
- const values = items.map(accessor);
11
- const initialSelected = [1];
28
+ const vm = new MultiSelect(items, accessor, ...initialSelected);
12
29
 
13
- const vm = new MultiSelect(items, accessor, ...initialSelected);
30
+ expect(vm.items).toStrictEqual(items);
31
+ expect(vm.values).toStrictEqual(values);
32
+ expect(vm.count).toBe(items.length);
33
+ expect(vm.selectedCount).toBe(initialSelected.length);
34
+ expect(vm.selectedIndexes).toStrictEqual(initialSelected);
35
+ expect(vm.selectedValues).toStrictEqual(selectedValues);
14
36
 
15
- expect(vm.items).toStrictEqual(items);
16
- expect(vm.values).toStrictEqual(values);
17
- expect(vm.selectedIndexes).toStrictEqual(initialSelected);
37
+ initialSelected.forEach(index => {
38
+ expect(vm.isIndexSelected(index)).toBe(initialSelected.includes(index));
39
+ });
18
40
 
19
- initialSelected.forEach(index => {
20
- expect(vm.isIndexSelected(index)).toBe(initialSelected.includes(index));
41
+ values.forEach((value) => {
42
+ expect(vm.isValueSelected(value)).toBe(selectedValues.includes(value));
43
+ });
44
+ });
21
45
  });
46
+
47
+ });
48
+
49
+ it('reacts', () => {
50
+ const vm = new MultiSelectString(['a', 'b', 'c']);
51
+
52
+ expect(vm.count).toBe(3);
53
+ expect(vm.selectedCount).toBe(0);
54
+ expect(vm.selectedIndexes).toHaveLength(0);
55
+
56
+ const mocks = arrayRepeat(() => jest.fn().mockImplementation(null), 5);
57
+ const [
58
+ onSelectedIndexes,
59
+ onSelectedItems,
60
+ onSelectedValues,
61
+ onIsIndexSelected,
62
+ onIsValueSelected,
63
+ ] = mocks;
64
+
65
+ const wrapMock = mock => ((a: any) => mock(toJS(a)));
66
+
67
+ const expectEmptyCalls = () => {
68
+ expect(onSelectedIndexes).toHaveBeenCalledWith([]);
69
+ expect(onSelectedItems).toHaveBeenCalledWith([]);
70
+ expect(onSelectedValues).toHaveBeenCalledWith([]);
71
+ mocks.forEach(m => m.mockClear());
72
+ };
73
+
74
+ reaction(() => vm.selectedIndexes, wrapMock(onSelectedIndexes));
75
+ reaction(() => vm.selectedItems, wrapMock(onSelectedItems));
76
+ reaction(() => vm.selectedValues, wrapMock(onSelectedValues));
77
+
78
+ // initially – 'false', so expect only when 'true' should be passed
79
+ reaction(() => vm.isIndexSelected(0), wrapMock(onIsIndexSelected));
80
+ reaction(() => vm.isValueSelected('a'), wrapMock(onIsValueSelected));
81
+
82
+ vm.selectIndex(1);
83
+
84
+ expect(onSelectedIndexes).toHaveBeenCalledWith([1]);
85
+ expect(onSelectedItems).toHaveBeenCalledWith(['b']);
86
+ expect(onSelectedValues).toHaveBeenCalledWith(['b']);
87
+ expect(onIsIndexSelected).not.toHaveBeenCalled();
88
+ expect(onIsValueSelected).not.toHaveBeenCalled();
89
+ mocks.forEach(m => m.mockClear());
90
+
91
+ vm.deSelectIndex(1);
92
+ expect(onIsIndexSelected).not.toHaveBeenCalled();
93
+ expect(onIsValueSelected).not.toHaveBeenCalled();
94
+ expectEmptyCalls();
95
+
96
+ vm.selectItem('c');
97
+
98
+ expect(onSelectedIndexes).toHaveBeenCalledWith([2]);
99
+ expect(onSelectedItems).toHaveBeenCalledWith(['c']);
100
+ expect(onSelectedValues).toHaveBeenCalledWith(['c']);
101
+ expect(onIsIndexSelected).not.toHaveBeenCalled();
102
+ expect(onIsValueSelected).not.toHaveBeenCalled();
103
+ mocks.forEach(m => m.mockClear());
104
+
105
+ vm.deSelectItem('c');
106
+ expect(onIsIndexSelected).not.toHaveBeenCalled();
107
+ expect(onIsValueSelected).not.toHaveBeenCalled();
108
+ expectEmptyCalls();
109
+
110
+ vm.selectValue('a');
111
+
112
+ expect(onSelectedIndexes).toHaveBeenCalledWith([0]);
113
+ expect(onSelectedItems).toHaveBeenCalledWith(['a']);
114
+ expect(onSelectedValues).toHaveBeenCalledWith(['a']);
115
+ expect(onIsIndexSelected).toHaveBeenCalledWith(true);
116
+ expect(onIsValueSelected).toHaveBeenCalledWith(true);
117
+ mocks.forEach(m => m.mockClear());
118
+
119
+ vm.deSelectValue('a');
120
+ expect(onIsIndexSelected).toHaveBeenCalledWith(false);
121
+ expect(onIsValueSelected).toHaveBeenCalledWith(false);
122
+ expectEmptyCalls();
123
+
124
+ vm.selectItems(['a', 'b']);
125
+
126
+ expect(onSelectedIndexes).toHaveBeenCalledWith([0, 1]);
127
+ expect(onSelectedItems).toHaveBeenCalledWith(['a', 'b']);
128
+ expect(onSelectedValues).toHaveBeenCalledWith(['a', 'b']);
129
+ expect(onIsIndexSelected).toHaveBeenCalledWith(true);
130
+ expect(onIsValueSelected).toHaveBeenCalledWith(true);
131
+ mocks.forEach(m => m.mockClear());
132
+
133
+ vm.reset();
134
+ expect(onIsIndexSelected).toHaveBeenCalledWith(false);
135
+ expect(onIsValueSelected).toHaveBeenCalledWith(false);
136
+ expectEmptyCalls();
22
137
  });
23
138
  });
@@ -1,3 +1,4 @@
1
+ export * from './types';
1
2
  export * from './Validatable';
2
3
  export * from './TextModel';
3
4
  export * from './FlagModel';
@@ -0,0 +1,19 @@
1
+
2
+ export interface IValueModel<TValue> {
3
+ value: TValue;
4
+ }
5
+
6
+ export interface ILabel<T> {
7
+ readonly label: T;
8
+ }
9
+
10
+ export interface IResetableModel {
11
+ readonly reset: () => void;
12
+ readonly isDefault?: boolean;
13
+ }
14
+
15
+ export interface ICountableModel {
16
+ readonly count: number;
17
+ readonly selectedCount?: number;
18
+ readonly isEmpty: boolean;
19
+ }
@@ -1,9 +1,5 @@
1
1
  import { Getter } from '../types';
2
- import { IValueModel } from './ValuesCollector';
3
-
4
- export interface ILabel<T> {
5
- readonly label: T;
6
- }
2
+ import { ILabel, IValueModel } from './types';
7
3
 
8
4
  export function withLabel<T, TModel extends IValueModel<T>, TLabel = string>(model: TModel, label: Getter<TLabel>) {
9
5
  const _label = label;