@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.
- package/.github/workflows/CI.yml +8 -0
- package/coverage/clover.xml +449 -379
- package/coverage/coverage-final.json +20 -19
- package/coverage/lcov-report/index.html +43 -43
- package/coverage/lcov-report/src/__tests__/helpers/index.html +1 -1
- package/coverage/lcov-report/src/__tests__/helpers/main.ts.html +2 -2
- package/coverage/lcov-report/src/async/arrays.ts.html +1 -1
- package/coverage/lcov-report/src/async/index.html +1 -1
- package/coverage/lcov-report/src/dates/calc.ts.html +1 -1
- package/coverage/lcov-report/src/dates/convert.ts.html +1 -1
- package/coverage/lcov-report/src/dates/datex.ts.html +1 -1
- package/coverage/lcov-report/src/dates/format.ts.html +1 -1
- package/coverage/lcov-report/src/dates/index.html +1 -1
- package/coverage/lcov-report/src/dates/index.ts.html +1 -1
- package/coverage/lcov-report/src/dates/parse.ts.html +1 -1
- package/coverage/lcov-report/src/dates/period.ts.html +1 -1
- package/coverage/lcov-report/src/dates/shift.ts.html +1 -1
- package/coverage/lcov-report/src/dates/types.ts.html +1 -1
- package/coverage/lcov-report/src/dates/yearDate.ts.html +1 -1
- package/coverage/lcov-report/src/enumHelper.ts.html +1 -1
- package/coverage/lcov-report/src/event.ts.html +3 -3
- package/coverage/lcov-report/src/index.html +21 -21
- package/coverage/lcov-report/src/lazy.light.ts.html +3 -3
- package/coverage/lcov-report/src/logger/batch.ts.html +107 -0
- package/coverage/lcov-report/src/logger/console.ts.html +10 -25
- package/coverage/lcov-report/src/logger/index.html +54 -39
- package/coverage/lcov-report/src/logger/index.ts.html +88 -61
- package/coverage/lcov-report/src/logger/named.ts.html +31 -31
- package/coverage/lcov-report/src/logger/proxy.ts.html +13 -13
- package/coverage/lcov-report/src/math/arrays.ts.html +293 -32
- package/coverage/lcov-report/src/math/calc.ts.html +11 -11
- package/coverage/lcov-report/src/math/distribution.ts.html +2 -2
- package/coverage/lcov-report/src/math/index.html +11 -11
- package/coverage/lcov-report/src/math/index.ts.html +6 -6
- package/coverage/lcov-report/src/transitionObserver.ts.html +5 -5
- package/coverage/lcov-report/src/types.ts.html +33 -18
- package/coverage/lcov-report/src/validation/ValidationErrors.ts.html +1 -1
- package/coverage/lcov-report/src/validation/creditCard.ts.html +1 -1
- package/coverage/lcov-report/src/validation/helpers.ts.html +1 -1
- package/coverage/lcov-report/src/validation/index.html +1 -1
- package/coverage/lcov-report/src/validation/index.ts.html +1 -1
- package/coverage/lcov-report/src/validation/types.ts.html +1 -1
- package/coverage/lcov-report/src/validation/validators.ts.html +1 -1
- package/coverage/lcov-report/src/validation/wrappers.ts.html +1 -1
- package/coverage/lcov-report/src/viewModels/FlagModel.ts.html +21 -18
- package/coverage/lcov-report/src/viewModels/MultiSelectModel.ts.html +124 -94
- package/coverage/lcov-report/src/viewModels/NumberModel.ts.html +19 -10
- package/coverage/lcov-report/src/viewModels/SelectModel.ts.html +19 -10
- package/coverage/lcov-report/src/viewModels/Validatable.ts.html +45 -21
- package/coverage/lcov-report/src/viewModels/index.html +54 -54
- package/coverage/lcov-report/src/viewModels/wrappers.ts.html +3 -15
- package/coverage/lcov.info +915 -762
- package/lib/event.d.ts.map +1 -1
- package/lib/event.js +1 -1
- package/lib/event.js.map +1 -1
- package/lib/logger/batch.d.ts +3 -0
- package/lib/logger/batch.d.ts.map +1 -0
- package/lib/logger/batch.js +12 -0
- package/lib/logger/batch.js.map +1 -0
- package/lib/logger/console.d.ts +0 -1
- package/lib/logger/console.d.ts.map +1 -1
- package/lib/logger/console.js +0 -3
- package/lib/logger/console.js.map +1 -1
- package/lib/logger/file.d.ts +15 -0
- package/lib/logger/file.d.ts.map +1 -0
- package/lib/logger/file.js +43 -0
- package/lib/logger/file.js.map +1 -0
- package/lib/logger/index.d.ts +7 -6
- package/lib/logger/index.d.ts.map +1 -1
- package/lib/logger/index.js +34 -21
- package/lib/logger/index.js.map +1 -1
- package/lib/logger/named.js +3 -3
- package/lib/logger/named.js.map +1 -1
- package/lib/logger/proxy.d.ts +1 -1
- package/lib/logger/proxy.d.ts.map +1 -1
- package/lib/logger/proxy.js +2 -2
- package/lib/logger/proxy.js.map +1 -1
- package/lib/math/arrays.d.ts +16 -0
- package/lib/math/arrays.d.ts.map +1 -1
- package/lib/math/arrays.js +77 -1
- package/lib/math/arrays.js.map +1 -1
- package/lib/transitionObserver.d.ts.map +1 -1
- package/lib/transitionObserver.js +2 -2
- package/lib/transitionObserver.js.map +1 -1
- package/lib/types.d.ts +4 -0
- package/lib/types.d.ts.map +1 -1
- package/lib/types.js +6 -2
- package/lib/types.js.map +1 -1
- package/lib/viewModels/FlagModel.d.ts +4 -4
- package/lib/viewModels/FlagModel.d.ts.map +1 -1
- package/lib/viewModels/FlagModel.js +1 -0
- package/lib/viewModels/FlagModel.js.map +1 -1
- package/lib/viewModels/MultiSelectModel.d.ts +8 -2
- package/lib/viewModels/MultiSelectModel.d.ts.map +1 -1
- package/lib/viewModels/MultiSelectModel.js +13 -2
- package/lib/viewModels/MultiSelectModel.js.map +1 -1
- package/lib/viewModels/NumberModel.d.ts +4 -2
- package/lib/viewModels/NumberModel.d.ts.map +1 -1
- package/lib/viewModels/NumberModel.js +1 -0
- package/lib/viewModels/NumberModel.js.map +1 -1
- package/lib/viewModels/PromptModal.d.ts.map +1 -1
- package/lib/viewModels/PromptModal.js +1 -1
- package/lib/viewModels/PromptModal.js.map +1 -1
- package/lib/viewModels/SelectModel.d.ts +4 -2
- package/lib/viewModels/SelectModel.d.ts.map +1 -1
- package/lib/viewModels/SelectModel.js +1 -0
- package/lib/viewModels/SelectModel.js.map +1 -1
- package/lib/viewModels/TextModel.d.ts +4 -3
- package/lib/viewModels/TextModel.d.ts.map +1 -1
- package/lib/viewModels/TextModel.js +5 -5
- package/lib/viewModels/TextModel.js.map +1 -1
- package/lib/viewModels/Validatable.d.ts +2 -1
- package/lib/viewModels/Validatable.d.ts.map +1 -1
- package/lib/viewModels/Validatable.js +7 -0
- package/lib/viewModels/Validatable.js.map +1 -1
- package/lib/viewModels/ValuesCollector.d.ts +1 -3
- package/lib/viewModels/ValuesCollector.d.ts.map +1 -1
- package/lib/viewModels/ValuesCollector.js.map +1 -1
- package/lib/viewModels/index.d.ts +1 -0
- package/lib/viewModels/index.d.ts.map +1 -1
- package/lib/viewModels/index.js +1 -0
- package/lib/viewModels/index.js.map +1 -1
- package/lib/viewModels/types.d.ts +16 -0
- package/lib/viewModels/types.d.ts.map +1 -0
- package/lib/viewModels/types.js +3 -0
- package/lib/viewModels/types.js.map +1 -0
- package/lib/viewModels/wrappers.d.ts +1 -4
- package/lib/viewModels/wrappers.d.ts.map +1 -1
- package/lib/viewModels/wrappers.js.map +1 -1
- package/package.json +1 -1
- package/src/event.ts +2 -2
- package/src/logger/__tests__/{index.test.ts → logger.test.ts} +97 -41
- package/src/logger/batch.ts +9 -0
- package/src/logger/console.ts +0 -5
- package/src/logger/file.ts +46 -0
- package/src/logger/index.ts +37 -28
- package/src/logger/named.ts +3 -3
- package/src/logger/proxy.ts +2 -2
- package/src/math/__tests__/arrays.test.ts +53 -0
- package/src/math/arrays.ts +87 -0
- package/src/transitionObserver.ts +2 -2
- package/src/types.ts +6 -1
- package/src/viewModels/FlagModel.ts +5 -4
- package/src/viewModels/MultiSelectModel.ts +14 -4
- package/src/viewModels/NumberModel.ts +5 -2
- package/src/viewModels/PromptModal.ts +1 -1
- package/src/viewModels/SelectModel.ts +5 -2
- package/src/viewModels/TextModel.ts +5 -4
- package/src/viewModels/Validatable.ts +8 -0
- package/src/viewModels/ValuesCollector.ts +1 -4
- package/src/viewModels/__tests__/multiSelect.test.ts +127 -12
- package/src/viewModels/index.ts +1 -0
- package/src/viewModels/types.ts +19 -0
- 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 './
|
|
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.
|
|
59
|
+
isValueSelected(value: string) { return this.selectedValues.includes(value); }
|
|
58
60
|
|
|
59
|
-
get
|
|
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 {
|
|
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.
|
|
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 './
|
|
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 {
|
|
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,23 +1,138 @@
|
|
|
1
|
-
import {
|
|
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('
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
16
|
-
|
|
17
|
-
|
|
37
|
+
initialSelected.forEach(index => {
|
|
38
|
+
expect(vm.isIndexSelected(index)).toBe(initialSelected.includes(index));
|
|
39
|
+
});
|
|
18
40
|
|
|
19
|
-
|
|
20
|
-
|
|
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
|
});
|
package/src/viewModels/index.ts
CHANGED
|
@@ -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 './
|
|
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;
|