@sankhyalabs/core 6.1.0-dev.4 → 6.1.0-rc.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.
- package/.docs/classes/Change.md +11 -11
- package/.docs/classes/ColumnFilterManager.md +6 -6
- package/.docs/classes/DataUnit.md +157 -157
- package/.docs/classes/DataUnitLoaderUtils.md +6 -6
- package/.docs/classes/SelectionInfo.md +16 -16
- package/.docs/enumerations/ChangeOperation.md +4 -4
- package/.docs/enumerations/SelectionMode.md +2 -2
- package/.docs/functions/defaultDataLoader.md +1 -1
- package/.docs/interfaces/DUActionInterceptor.md +1 -1
- package/.docs/interfaces/PageRequest.md +3 -3
- package/.docs/interfaces/PaginationInfoBuilderParams.md +3 -3
- package/.docs/interfaces/QuickFilter.md +3 -3
- package/.docs/interfaces/Record.md +4 -4
- package/.docs/interfaces/SavedRecord.md +5 -5
- package/.docs/interfaces/WaitingChange.md +3 -3
- package/.docs/type-aliases/DataUnitEventOptions.md +1 -1
- package/dist/dataunit/DataUnit.d.ts +129 -9
- package/dist/dataunit/DataUnit.js +177 -87
- package/dist/dataunit/DataUnit.js.map +1 -1
- package/dist/dataunit/DataUnitHelper.d.ts +1 -2
- package/dist/dataunit/DataUnitHelper.js.map +1 -1
- package/dist/dataunit/formatting/PrettyFormatter.js +3 -5
- package/dist/dataunit/formatting/PrettyFormatter.js.map +1 -1
- package/dist/dataunit/loader/utils/dataUnitLoaderUtils.d.ts +1 -2
- package/dist/dataunit/loader/utils/dataUnitLoaderUtils.js.map +1 -1
- package/dist/dataunit/loading/LoadDataRequest.d.ts +1 -1
- package/dist/dataunit/loading/LoadDataResponse.d.ts +1 -1
- package/dist/dataunit/sorting/FieldComparator.d.ts +1 -1
- package/dist/dataunit/state/slice/AddedRecordsSlice.d.ts +1 -1
- package/dist/dataunit/state/slice/ChangesSlice.d.ts +1 -2
- package/dist/dataunit/state/slice/ChangesSlice.js +1 -2
- package/dist/dataunit/state/slice/ChangesSlice.js.map +1 -1
- package/dist/dataunit/state/slice/LoadingControlSlice.js.map +1 -1
- package/dist/dataunit/state/slice/RecordsSlice.d.ts +1 -1
- package/dist/dataunit/state/slice/RecordsSlice.js +1 -1
- package/dist/dataunit/state/slice/RecordsSlice.js.map +1 -1
- package/dist/dataunit/state/slice/SelectionSlice.d.ts +1 -2
- package/dist/dataunit/state/slice/SelectionSlice.js +1 -2
- package/dist/dataunit/state/slice/SelectionSlice.js.map +1 -1
- package/dist/dataunit/state/slice/SnapshotSlice.d.ts +1 -1
- package/dist/dataunit/state/slice/WaitingChangesSlice.d.ts +1 -1
- package/dist/index.d.ts +1 -4
- package/dist/index.js +1 -4
- package/dist/index.js.map +1 -1
- package/dist/utils/ColumnFilterManager.d.ts +1 -2
- package/dist/utils/ColumnFilterManager.js.map +1 -1
- package/dist/utils/SortingUtils.d.ts +1 -1
- package/package.json +1 -2
- package/reports/test-report.xml +557 -758
- package/src/dataunit/DataUnit.ts +397 -242
- package/src/dataunit/DataUnitHelper.ts +1 -2
- package/src/dataunit/formatting/PrettyFormatter.ts +5 -4
- package/src/dataunit/loader/utils/dataUnitLoaderUtils.ts +1 -2
- package/src/dataunit/loading/LoadDataRequest.ts +1 -1
- package/src/dataunit/loading/LoadDataResponse.ts +1 -1
- package/src/dataunit/sorting/FieldComparator.ts +1 -1
- package/src/dataunit/state/slice/AddedRecordsSlice.ts +1 -1
- package/src/dataunit/state/slice/ChangesSlice.ts +1 -2
- package/src/dataunit/state/slice/LoadingControlSlice.ts +2 -1
- package/src/dataunit/state/slice/RecordsSlice.ts +2 -3
- package/src/dataunit/state/slice/SelectionSlice.ts +1 -2
- package/src/dataunit/state/slice/SnapshotSlice.ts +1 -1
- package/src/dataunit/state/slice/WaitingChangesSlice.ts +1 -1
- package/src/dataunit/state/slice/test/RecordsSlice.spec.ts +1 -1
- package/src/dataunit/test/DataUnit.spec.ts +44 -0
- package/src/index.ts +1 -4
- package/src/utils/ColumnFilterManager.ts +1 -2
- package/src/utils/SortingUtils.ts +1 -1
- package/test/dataunit/formatting/PrettyFormatter.spec.ts +1 -1
- package/test/dataunit/loader/dataUnitInMemoryLoader.spec.ts +1 -2
- package/test/dataunit/loader/utils/dataUnitLoaderUtils.spec.ts +1 -1
- package/test/util/ColumnFilterManager.spec.ts +1 -2
- package/tsconfig.json +0 -1
- package/dist/dataunit/Changes.d.ts +0 -52
- package/dist/dataunit/Changes.js +0 -64
- package/dist/dataunit/Changes.js.map +0 -1
- package/dist/dataunit/SelectionInfo.d.ts +0 -16
- package/dist/dataunit/SelectionInfo.js +0 -39
- package/dist/dataunit/SelectionInfo.js.map +0 -1
- package/dist/dataunit/interfaces/dataUnit.d.ts +0 -61
- package/dist/dataunit/interfaces/dataUnit.js +0 -13
- package/dist/dataunit/interfaces/dataUnit.js.map +0 -1
- package/src/dataunit/Changes.ts +0 -77
- package/src/dataunit/SelectionInfo.ts +0 -55
- package/src/dataunit/interfaces/dataUnit.ts +0 -71
- package/test/dataunit/AccessParentsDataUnit.spec.ts +0 -69
- package/test/dataunit/Actions.spec.ts +0 -74
- package/test/dataunit/Change.spec.ts +0 -66
- package/test/dataunit/FieldManager.spec.ts +0 -286
- package/test/dataunit/FilterSortsLockersAndObservers.spec.ts +0 -339
- package/test/dataunit/InfoManager.spec.ts +0 -254
- package/test/dataunit/LoadDataAndMetadata.spec.ts +0 -269
- package/test/dataunit/RecodsSelection.spec.ts +0 -229
- package/test/dataunit/RecordsManager.spec.ts +0 -323
- package/test/dataunit/SavingData.spec.ts +0 -206
- package/test/dataunit/SelectionInfo.spec.ts +0 -143
- package/test/dataunit/loader/utils/createDataUnitMock.ts +0 -34
- package/test/dataunit/resources/metadata.ts +0 -39
- package/test/dataunit/resources/records.ts +0 -29
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import { Record, SelectionMode } from "./interfaces/dataUnit.js";
|
|
2
|
-
import { Filter, Sort } from "./metadata/UnitMetadata.js";
|
|
3
|
-
|
|
4
|
-
export class SelectionInfo {
|
|
5
|
-
|
|
6
|
-
public mode: SelectionMode;
|
|
7
|
-
public filters?: Array<Filter>;
|
|
8
|
-
public sort?: Array<Sort>;
|
|
9
|
-
public getAllRecords?: () => Array<Record>;
|
|
10
|
-
private _records: Array<Record>;
|
|
11
|
-
private _total?: number;
|
|
12
|
-
|
|
13
|
-
constructor(records: Array<Record>, mode: SelectionMode = SelectionMode.SOME_RECORDS, total?: number, filters?: Array<Filter>, sort?: Array<Sort>) {
|
|
14
|
-
this._records = records;
|
|
15
|
-
this._total = total;
|
|
16
|
-
this.mode = mode;
|
|
17
|
-
this.filters = filters;
|
|
18
|
-
this.sort = sort;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
public get records(): Array<Record> {
|
|
22
|
-
if (this.isAllRecords()) {
|
|
23
|
-
if (this.getAllRecords != undefined) {
|
|
24
|
-
return this.getAllRecords();
|
|
25
|
-
}
|
|
26
|
-
throw new Error("Erro interno: Impossível retornar os registros selecionados numa seleção virtual.");
|
|
27
|
-
}
|
|
28
|
-
return this._records;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
public get recordIds(): Array<string> | undefined {
|
|
32
|
-
|
|
33
|
-
const records = this.records;
|
|
34
|
-
|
|
35
|
-
if (records == undefined) {
|
|
36
|
-
return undefined;
|
|
37
|
-
}
|
|
38
|
-
return records.map(record => record.__record__id__);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
public get length(): number {
|
|
42
|
-
if (this.isAllRecords()) {
|
|
43
|
-
return this._total || 0;
|
|
44
|
-
}
|
|
45
|
-
return this.records == undefined ? 0 : (this.records as Array<Record>).length;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
public isAllRecords(): boolean {
|
|
49
|
-
return this.mode === SelectionMode.ALL_RECORDS;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
public isEmpty(): boolean {
|
|
53
|
-
return this.length === 0;
|
|
54
|
-
}
|
|
55
|
-
}
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
import { Filter } from "../metadata/UnitMetadata.js";
|
|
2
|
-
import { DataUnitAction, ExecutionContext } from "../state/action/DataUnitAction.js";
|
|
3
|
-
|
|
4
|
-
export interface LoadDataParams {
|
|
5
|
-
quickFilter?: QuickFilter;
|
|
6
|
-
executionCtx?: ExecutionContext;
|
|
7
|
-
checkLastFilter?: boolean;
|
|
8
|
-
source?: string;
|
|
9
|
-
selectFirstRecord?: boolean;
|
|
10
|
-
keepSelection?: boolean
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export interface DUActionInterceptor {
|
|
14
|
-
interceptAction(action: DataUnitAction): DataUnitAction | Promise<DataUnitAction>;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export interface Record {
|
|
18
|
-
__record__id__: string;
|
|
19
|
-
__record__label__?: string;
|
|
20
|
-
__parent__record__id__?: string;
|
|
21
|
-
__owner__dataunit__name__?: string;
|
|
22
|
-
[key: string]: any;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export interface SavedRecord extends Record {
|
|
26
|
-
__old__id__?: string;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export enum ChangeOperation {
|
|
30
|
-
INSERT = "INSERT",
|
|
31
|
-
COPY = "COPY",
|
|
32
|
-
UPDATE = "UPDATE",
|
|
33
|
-
DELETE = "DELETE",
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export interface WaitingChange {
|
|
37
|
-
waitmessage: string;
|
|
38
|
-
blocking: boolean;
|
|
39
|
-
promise?: Promise<any>;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
export interface PageRequest {
|
|
43
|
-
limit: number;
|
|
44
|
-
offset: number;
|
|
45
|
-
quickFilter?: QuickFilter;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
export interface QuickFilter {
|
|
49
|
-
term: string;
|
|
50
|
-
fields?: Array<string>;
|
|
51
|
-
filter?: Filter;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
export interface PageResponse {
|
|
55
|
-
limit: number;
|
|
56
|
-
offset: number;
|
|
57
|
-
total: number;
|
|
58
|
-
hasMore: boolean;
|
|
59
|
-
records: Array<Record>;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
export enum SelectionMode {
|
|
63
|
-
ALL_RECORDS = "ALL_RECORDS",
|
|
64
|
-
SOME_RECORDS = "SOME_RECORDS"
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
export type DataUnitEventOptions = { [key: string]: any };
|
|
68
|
-
|
|
69
|
-
export type HideFieldOptions = {
|
|
70
|
-
visibleOnConfig: boolean
|
|
71
|
-
};
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
import DataUnit from "../../src/dataunit/DataUnit";
|
|
2
|
-
import { createDataUnitMock } from "./loader/utils/createDataUnitMock";
|
|
3
|
-
import { metadata } from "./resources/metadata";
|
|
4
|
-
|
|
5
|
-
describe('Access parent dataUnits', () => {
|
|
6
|
-
let dataUnit: DataUnit;
|
|
7
|
-
let metadataLoaderMock = jest.fn();
|
|
8
|
-
|
|
9
|
-
beforeEach(() => {
|
|
10
|
-
jest.clearAllMocks();
|
|
11
|
-
window.requestAnimationFrame = (functionCallback: Function) => functionCallback();
|
|
12
|
-
({ dataUnit, metadataLoaderMock } = createDataUnitMock());
|
|
13
|
-
});
|
|
14
|
-
|
|
15
|
-
describe('getChildInfo', () => {
|
|
16
|
-
beforeEach(async () => {
|
|
17
|
-
await dataUnit.loadMetadata();
|
|
18
|
-
await dataUnit.loadData();
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
it('should return metadata children data', () => {
|
|
22
|
-
const name = dataUnit.getChildInfo('child');
|
|
23
|
-
expect(name).toStrictEqual(metadata.children![0]);
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
it('should return undefined when dont has metadata', async () => {
|
|
27
|
-
metadataLoaderMock.mockResolvedValue(undefined);
|
|
28
|
-
await dataUnit.loadMetadata();
|
|
29
|
-
const name = dataUnit.getChildInfo('child');
|
|
30
|
-
expect(name).toBeUndefined();
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
it('should return undefined when dont has metadata children data', async () => {
|
|
34
|
-
metadataLoaderMock.mockResolvedValue({ ...metadata, children: undefined });
|
|
35
|
-
await dataUnit.loadMetadata();
|
|
36
|
-
const name = dataUnit.getChildInfo('child');
|
|
37
|
-
expect(name).toBeUndefined();
|
|
38
|
-
});
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
describe('getParentDataUnit', () => {
|
|
42
|
-
it('should return parent dataUnit', () => {
|
|
43
|
-
const childDataUnit = new DataUnit('child', dataUnit);
|
|
44
|
-
const parentDataUnit = childDataUnit.getParentDataUnit();
|
|
45
|
-
expect(parentDataUnit).toStrictEqual(dataUnit);
|
|
46
|
-
});
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
describe('isParentDirty', () => {
|
|
50
|
-
it('should return true when parent is dirty', async () => {
|
|
51
|
-
dataUnit.selectFirst();
|
|
52
|
-
await dataUnit.setFieldValue('column_name_1', 'new_value');
|
|
53
|
-
const childDataUnit = new DataUnit('child', dataUnit);
|
|
54
|
-
const parentIsDirty = childDataUnit.isParentDirty();
|
|
55
|
-
expect(parentIsDirty).toBeTruthy();
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
it('should return false when parent is not dirty', () => {
|
|
59
|
-
const childDataUnit = new DataUnit('child', dataUnit);
|
|
60
|
-
const parentIsDirty = childDataUnit.isParentDirty();
|
|
61
|
-
expect(parentIsDirty).toBeFalsy();
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
it('should return false when dont has parent', () => {
|
|
65
|
-
const parentIsDirty = dataUnit.isParentDirty();
|
|
66
|
-
expect(parentIsDirty).toBeFalsy();
|
|
67
|
-
});
|
|
68
|
-
});
|
|
69
|
-
});
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
import DataUnit from "../../src/dataunit/DataUnit";
|
|
2
|
-
import { Action, DataUnitAction } from "../../src/dataunit/state/action/DataUnitAction";
|
|
3
|
-
import { createDataUnitMock } from "./loader/utils/createDataUnitMock";
|
|
4
|
-
import { recordsTest } from "./resources/records";
|
|
5
|
-
|
|
6
|
-
describe('Actions', () => {
|
|
7
|
-
let dataUnit: DataUnit;
|
|
8
|
-
|
|
9
|
-
beforeEach(() => {
|
|
10
|
-
jest.clearAllMocks();
|
|
11
|
-
window.requestAnimationFrame = (functionCallback: Function) => functionCallback();
|
|
12
|
-
({ dataUnit } = createDataUnitMock());
|
|
13
|
-
});
|
|
14
|
-
|
|
15
|
-
describe('savingCanceled', () => {
|
|
16
|
-
it('should emit event savingCanceled', async () => {
|
|
17
|
-
const savingCanceled = jest.fn();
|
|
18
|
-
const observer = async (action: DataUnitAction) => {
|
|
19
|
-
if (action.type === Action.SAVING_CANCELED) {
|
|
20
|
-
savingCanceled();
|
|
21
|
-
}
|
|
22
|
-
return;
|
|
23
|
-
}
|
|
24
|
-
dataUnit.subscribe(observer);
|
|
25
|
-
dataUnit.selectFirst();
|
|
26
|
-
await dataUnit.setFieldValue('column_name_1', 'new_value');
|
|
27
|
-
dataUnit.savingCanceled([{ name: 'column_name_1', message: 'cancel_saving' }], 'test_1');
|
|
28
|
-
expect(savingCanceled).toHaveBeenCalled();
|
|
29
|
-
});
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
describe('clearInvalid', () => {
|
|
33
|
-
beforeEach(async () => {
|
|
34
|
-
await dataUnit.loadMetadata();
|
|
35
|
-
await dataUnit.loadData();
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
it('should emit event savingCanceled', async () => {
|
|
39
|
-
const invalidateClean = jest.fn();
|
|
40
|
-
const observer = async (action: DataUnitAction) => {
|
|
41
|
-
if (action.type === Action.INVALIDATE_CLEAN) {
|
|
42
|
-
invalidateClean();
|
|
43
|
-
}
|
|
44
|
-
return;
|
|
45
|
-
}
|
|
46
|
-
dataUnit.subscribe(observer);
|
|
47
|
-
dataUnit.selectFirst();
|
|
48
|
-
await dataUnit.setFieldValue('column_name_1', 'new_value');
|
|
49
|
-
dataUnit.clearInvalid('test_1', 'column_name_1');
|
|
50
|
-
expect(invalidateClean).toHaveBeenCalled();
|
|
51
|
-
});
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
describe('redo', () => {
|
|
55
|
-
beforeEach(async () => {
|
|
56
|
-
await dataUnit.loadMetadata();
|
|
57
|
-
await dataUnit.loadData();
|
|
58
|
-
const saveLoaderMock = jest.fn().mockResolvedValue(recordsTest);
|
|
59
|
-
dataUnit.saveLoader = saveLoaderMock;
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
it('should return true when field value changes can redo', async () => {
|
|
64
|
-
dataUnit.selectFirst();
|
|
65
|
-
await dataUnit.setFieldValue('column_name_1', 'new_value');
|
|
66
|
-
dataUnit.undo();
|
|
67
|
-
let fieldValue = dataUnit.getFieldValue('column_name_1');
|
|
68
|
-
expect(fieldValue).toBe('column_value_1');
|
|
69
|
-
dataUnit.redo();
|
|
70
|
-
fieldValue = dataUnit.getFieldValue('column_name_1');
|
|
71
|
-
expect(fieldValue).toBe('new_value');
|
|
72
|
-
});
|
|
73
|
-
});
|
|
74
|
-
});
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
import { Change } from "../../src/dataunit/Changes";
|
|
2
|
-
import { ChangeOperation } from "../../src/dataunit/interfaces/dataUnit";
|
|
3
|
-
|
|
4
|
-
describe('Change', () => {
|
|
5
|
-
let change: Change;
|
|
6
|
-
beforeEach(() => {
|
|
7
|
-
change = new Change(
|
|
8
|
-
'test',
|
|
9
|
-
{ __record__id__: 'test_1' },
|
|
10
|
-
undefined,
|
|
11
|
-
ChangeOperation.COPY,
|
|
12
|
-
'source_id',
|
|
13
|
-
);
|
|
14
|
-
});
|
|
15
|
-
|
|
16
|
-
it('should return operation', () => {
|
|
17
|
-
const response = change.operation;
|
|
18
|
-
expect(response).toBe('COPY');
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
it('should return false when operation is not insert', () => {
|
|
22
|
-
const response = change.isInsert();
|
|
23
|
-
expect(response).toBeFalsy();
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
it('should return true when operation is insert', () => {
|
|
27
|
-
change = new Change(
|
|
28
|
-
'test',
|
|
29
|
-
{ __record__id__: 'test_1' },
|
|
30
|
-
undefined,
|
|
31
|
-
ChangeOperation.INSERT,
|
|
32
|
-
'source_id',
|
|
33
|
-
);
|
|
34
|
-
const response = change.isInsert();
|
|
35
|
-
expect(response).toBeTruthy();
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
it('should return true when operation is copy', () => {
|
|
39
|
-
const response = change.isCopy();
|
|
40
|
-
expect(response).toBeTruthy();
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
it('should return true when operation is delete', () => {
|
|
44
|
-
change = new Change(
|
|
45
|
-
'test',
|
|
46
|
-
{ __record__id__: 'test_1' },
|
|
47
|
-
undefined,
|
|
48
|
-
ChangeOperation.DELETE,
|
|
49
|
-
'source_id',
|
|
50
|
-
);
|
|
51
|
-
const response = change.isDelete();
|
|
52
|
-
expect(response).toBeTruthy();
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
it('should return true when operation is update', () => {
|
|
56
|
-
change = new Change(
|
|
57
|
-
'test',
|
|
58
|
-
{ __record__id__: 'test_1' },
|
|
59
|
-
undefined,
|
|
60
|
-
ChangeOperation.UPDATE,
|
|
61
|
-
'source_id',
|
|
62
|
-
);
|
|
63
|
-
const response = change.isUpdate();
|
|
64
|
-
expect(response).toBeTruthy();
|
|
65
|
-
});
|
|
66
|
-
});
|
|
@@ -1,286 +0,0 @@
|
|
|
1
|
-
import DataUnit from "../../src/dataunit/DataUnit";
|
|
2
|
-
import { DUActionInterceptor } from "../../src/dataunit/interfaces/dataUnit";
|
|
3
|
-
import { DataType } from "../../src/dataunit/metadata/DataType";
|
|
4
|
-
import { FieldDescriptor } from "../../src/dataunit/metadata/UnitMetadata";
|
|
5
|
-
import { Action } from "../../src/dataunit/state/action/DataUnitAction";
|
|
6
|
-
import { createDataUnitMock } from "./loader/utils/createDataUnitMock";
|
|
7
|
-
|
|
8
|
-
describe('Field manager', () => {
|
|
9
|
-
let dataUnit: DataUnit;
|
|
10
|
-
|
|
11
|
-
beforeEach(() => {
|
|
12
|
-
jest.clearAllMocks();
|
|
13
|
-
window.requestAnimationFrame = (functionCallback: Function) => functionCallback();
|
|
14
|
-
({ dataUnit } = createDataUnitMock());
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
describe('setFieldValue', () => {
|
|
18
|
-
beforeEach(async () => {
|
|
19
|
-
await dataUnit.loadData();
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
it('should not create a new record when suppressCreateNewRecord is true', async () => {
|
|
23
|
-
await dataUnit.setFieldValue('column_name_1', 'new_value_1', undefined, { suppressCreateNewRecord: true });
|
|
24
|
-
const hasNewRecord = dataUnit.hasNewRecord();
|
|
25
|
-
expect(hasNewRecord).toBeFalsy();
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
it('should resolve promise with false when value is the same', async () => {
|
|
29
|
-
dataUnit.selectFirst();
|
|
30
|
-
const response = await dataUnit.setFieldValue('column_name_1', 'column_value_1');
|
|
31
|
-
expect(response).toBeFalsy();
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
it('should handle with promise values', async () => {
|
|
35
|
-
const dataChanged = jest.fn();
|
|
36
|
-
const interceptors: DUActionInterceptor = {
|
|
37
|
-
interceptAction: (action) => {
|
|
38
|
-
if (action.type === Action.DATA_CHANGED) {
|
|
39
|
-
dataChanged();
|
|
40
|
-
}
|
|
41
|
-
return action;
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
dataUnit.addInterceptor(interceptors);
|
|
45
|
-
dataUnit.selectFirst();
|
|
46
|
-
const promiseValue = new Promise((resolve) => resolve('promise_value'));
|
|
47
|
-
const response = await dataUnit.setFieldValue('column_name_1', promiseValue);
|
|
48
|
-
|
|
49
|
-
expect(response).toBeTruthy();
|
|
50
|
-
expect(dataChanged).toHaveBeenCalled();
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
it('should return false when value is the same', async () => {
|
|
54
|
-
dataUnit["areEquivalentValues"] = () => false;
|
|
55
|
-
dataUnit.selectFirst();
|
|
56
|
-
const response = await dataUnit.setFieldValue('column_name_1', 'column_value_1');
|
|
57
|
-
expect(response).toBeFalsy();
|
|
58
|
-
});
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
describe('disableField', () => {
|
|
62
|
-
beforeEach(async () => {
|
|
63
|
-
await dataUnit.loadMetadata();
|
|
64
|
-
await dataUnit.loadData();
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
it('should set readOnly to true', async () => {
|
|
68
|
-
dataUnit.disableField('column_name_1');
|
|
69
|
-
const field = dataUnit.getField('column_name_1');
|
|
70
|
-
expect(field?.readOnly).toBeTruthy();
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
it('should set readOnly to true when readonly is undefined', async () => {
|
|
74
|
-
dataUnit.disableField('column_name_2');
|
|
75
|
-
const field = dataUnit.getField('column_name_2');
|
|
76
|
-
expect(field?.readOnly).toBeTruthy();
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
it('should not set readOnly when field metadata not exist', async () => {
|
|
80
|
-
dataUnit.disableField('column_none');
|
|
81
|
-
const field = dataUnit.getField('column_none');
|
|
82
|
-
expect(field).toBeUndefined();
|
|
83
|
-
});
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
describe('enableField', () => {
|
|
87
|
-
beforeEach(async () => {
|
|
88
|
-
await dataUnit.loadMetadata();
|
|
89
|
-
await dataUnit.loadData();
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
it('should set readOnly to false', async () => {
|
|
93
|
-
dataUnit.enableField('column_name_1');
|
|
94
|
-
const field = dataUnit.getField('column_name_1');
|
|
95
|
-
expect(field?.readOnly).toBeFalsy();
|
|
96
|
-
});
|
|
97
|
-
|
|
98
|
-
it('should set readOnly to false when readonly is undefined', async () => {
|
|
99
|
-
dataUnit.enableField('column_name_2');
|
|
100
|
-
const field = dataUnit.getField('column_name_2');
|
|
101
|
-
expect(field?.readOnly).toBeFalsy();
|
|
102
|
-
});
|
|
103
|
-
|
|
104
|
-
it('should not set readOnly when field metadata not exist', async () => {
|
|
105
|
-
dataUnit.enableField('column_none');
|
|
106
|
-
const field = dataUnit.getField('column_none');
|
|
107
|
-
expect(field).toBeUndefined();
|
|
108
|
-
});
|
|
109
|
-
});
|
|
110
|
-
|
|
111
|
-
describe('hideField', () => {
|
|
112
|
-
beforeEach(async () => {
|
|
113
|
-
await dataUnit.loadMetadata();
|
|
114
|
-
await dataUnit.loadData();
|
|
115
|
-
});
|
|
116
|
-
|
|
117
|
-
it('should set visible to false', async () => {
|
|
118
|
-
dataUnit.hideField('column_name_1', { visibleOnConfig: true });
|
|
119
|
-
const field = dataUnit.getField('column_name_1');
|
|
120
|
-
expect(field?.visible).toBeFalsy();
|
|
121
|
-
expect(field?.properties?.visibleOnConfig).toBeTruthy();
|
|
122
|
-
});
|
|
123
|
-
|
|
124
|
-
it('should set visible to false when visible is undefined', async () => {
|
|
125
|
-
dataUnit.hideField('column_name_2', { visibleOnConfig: true });
|
|
126
|
-
const field = dataUnit.getField('column_name_2');
|
|
127
|
-
expect(field?.visible).toBeFalsy();
|
|
128
|
-
});
|
|
129
|
-
|
|
130
|
-
it('should handle with options undefined', async () => {
|
|
131
|
-
dataUnit.hideField('column_name_3', undefined);
|
|
132
|
-
const field = dataUnit.getField('column_name_3');
|
|
133
|
-
|
|
134
|
-
expect(field?.visible).toBeFalsy();
|
|
135
|
-
expect(field?.properties?.visibleOnConfig).toBeUndefined();
|
|
136
|
-
expect(field?.properties).toBeUndefined();
|
|
137
|
-
});
|
|
138
|
-
|
|
139
|
-
it('should not set visible when field metadata not exist', async () => {
|
|
140
|
-
dataUnit.hideField('column_none', { visibleOnConfig: true });
|
|
141
|
-
const field = dataUnit.getField('column_none');
|
|
142
|
-
expect(field).toBeUndefined();
|
|
143
|
-
});
|
|
144
|
-
});
|
|
145
|
-
|
|
146
|
-
describe('showField', () => {
|
|
147
|
-
beforeEach(async () => {
|
|
148
|
-
await dataUnit.loadMetadata();
|
|
149
|
-
await dataUnit.loadData();
|
|
150
|
-
});
|
|
151
|
-
|
|
152
|
-
it('should set visible to true', async () => {
|
|
153
|
-
dataUnit.showField('column_name_3');
|
|
154
|
-
const field = dataUnit.getField('column_name_3');
|
|
155
|
-
expect(field?.visible).toBeTruthy();
|
|
156
|
-
});
|
|
157
|
-
|
|
158
|
-
it('should set visible to true when visible is undefined', async () => {
|
|
159
|
-
dataUnit.showField('column_name_2');
|
|
160
|
-
const field = dataUnit.getField('column_name_2');
|
|
161
|
-
expect(field?.visible).toBeTruthy();
|
|
162
|
-
});
|
|
163
|
-
|
|
164
|
-
it('should not set visible when field metadata not exist', async () => {
|
|
165
|
-
dataUnit.showField('column_none');
|
|
166
|
-
const field = dataUnit.getField('column_none');
|
|
167
|
-
expect(field).toBeUndefined();
|
|
168
|
-
});
|
|
169
|
-
});
|
|
170
|
-
|
|
171
|
-
describe('addField', () => {
|
|
172
|
-
beforeEach(async () => {
|
|
173
|
-
await dataUnit.loadMetadata();
|
|
174
|
-
await dataUnit.loadData();
|
|
175
|
-
});
|
|
176
|
-
|
|
177
|
-
it('should add field standAlone to metadata', async () => {
|
|
178
|
-
const field: FieldDescriptor = {
|
|
179
|
-
name: 'new_field',
|
|
180
|
-
label: 'New field',
|
|
181
|
-
dataType: DataType.TEXT,
|
|
182
|
-
}
|
|
183
|
-
dataUnit.addField(field);
|
|
184
|
-
expect(dataUnit.metadata.fields).toStrictEqual(expect.arrayContaining([{ ...field, standAlone: true }]));
|
|
185
|
-
});
|
|
186
|
-
});
|
|
187
|
-
|
|
188
|
-
describe('valueFromString', () => {
|
|
189
|
-
beforeEach(async () => {
|
|
190
|
-
await dataUnit.loadMetadata();
|
|
191
|
-
await dataUnit.loadData();
|
|
192
|
-
});
|
|
193
|
-
|
|
194
|
-
it('should return number type', async () => {
|
|
195
|
-
const response = dataUnit.valueFromString('column_name_2', '100');
|
|
196
|
-
expect(response).toEqual(100);
|
|
197
|
-
});
|
|
198
|
-
|
|
199
|
-
it('should return boolean type', async () => {
|
|
200
|
-
const response = dataUnit.valueFromString('column_name_3', 'true');
|
|
201
|
-
expect(response).toEqual(true);
|
|
202
|
-
});
|
|
203
|
-
|
|
204
|
-
it('should return value without any format when not has a metadata to field', async () => {
|
|
205
|
-
const response = dataUnit.valueFromString('column_none', 'true');
|
|
206
|
-
expect(response).toEqual('true');
|
|
207
|
-
});
|
|
208
|
-
});
|
|
209
|
-
|
|
210
|
-
describe('valueToString', () => {
|
|
211
|
-
beforeEach(async () => {
|
|
212
|
-
await dataUnit.loadMetadata();
|
|
213
|
-
await dataUnit.loadData();
|
|
214
|
-
});
|
|
215
|
-
|
|
216
|
-
it('should return string from the number type', async () => {
|
|
217
|
-
const response = dataUnit.valueToString('column_name_2', 100);
|
|
218
|
-
expect(response).toEqual('100');
|
|
219
|
-
});
|
|
220
|
-
|
|
221
|
-
it('should return string from the boolean type', async () => {
|
|
222
|
-
const response = dataUnit.valueToString('column_name_3', true);
|
|
223
|
-
expect(response).toEqual('true');
|
|
224
|
-
});
|
|
225
|
-
|
|
226
|
-
it('should return string value when not has a metadata to field', async () => {
|
|
227
|
-
const response = dataUnit.valueToString('column_none', true);
|
|
228
|
-
expect(response).toEqual('true');
|
|
229
|
-
});
|
|
230
|
-
});
|
|
231
|
-
|
|
232
|
-
describe('getFormattedValue', () => {
|
|
233
|
-
beforeEach(async () => {
|
|
234
|
-
await dataUnit.loadMetadata();
|
|
235
|
-
await dataUnit.loadData();
|
|
236
|
-
});
|
|
237
|
-
|
|
238
|
-
it('should return string with number format from the number type', async () => {
|
|
239
|
-
const response = dataUnit.getFormattedValue('column_name_2', 100);
|
|
240
|
-
expect(response).toEqual('100,00');
|
|
241
|
-
});
|
|
242
|
-
|
|
243
|
-
it('should return string from the boolean type', async () => {
|
|
244
|
-
const response = dataUnit.getFormattedValue('column_name_3', true);
|
|
245
|
-
expect(response).toEqual('Sim');
|
|
246
|
-
});
|
|
247
|
-
|
|
248
|
-
it('should return empty string when value is undefined and not has any record selected', async () => {
|
|
249
|
-
const response = dataUnit.getFormattedValue('column_name_1');
|
|
250
|
-
expect(response).toEqual('');
|
|
251
|
-
});
|
|
252
|
-
|
|
253
|
-
it('should return value in string when value is undefined and has a record selected', async () => {
|
|
254
|
-
dataUnit.selectFirst();
|
|
255
|
-
const response = dataUnit.getFormattedValue('column_name_1');
|
|
256
|
-
expect(response).toEqual('column_value_1');
|
|
257
|
-
});
|
|
258
|
-
|
|
259
|
-
it('should return value in string formated when receive a string', async () => {
|
|
260
|
-
const response = dataUnit.getFormattedValue('column_name_2', '123');
|
|
261
|
-
expect(response).toEqual('123,00');
|
|
262
|
-
});
|
|
263
|
-
|
|
264
|
-
it('should return value in string with any formated when dont has a metadata field', async () => {
|
|
265
|
-
const response = dataUnit.getFormattedValue('column_none', '123');
|
|
266
|
-
expect(response).toEqual('123');
|
|
267
|
-
});
|
|
268
|
-
|
|
269
|
-
it('should return string value when not has a metadata to field', async () => {
|
|
270
|
-
const response = dataUnit.getFormattedValue('column_none', true);
|
|
271
|
-
expect(response).toEqual('true');
|
|
272
|
-
});
|
|
273
|
-
});
|
|
274
|
-
|
|
275
|
-
describe('addSourceFieldValue', () => {
|
|
276
|
-
beforeEach(async () => {
|
|
277
|
-
await dataUnit.loadMetadata();
|
|
278
|
-
});
|
|
279
|
-
|
|
280
|
-
it('should return string with number format from the number type', async () => {
|
|
281
|
-
dataUnit.addSourceFieldValue('column_name_1', 'column_name_2');
|
|
282
|
-
const response = dataUnit.getSourceFieldValue('column_name_1');
|
|
283
|
-
expect(response).toEqual('column_name_2');
|
|
284
|
-
});
|
|
285
|
-
});
|
|
286
|
-
});
|