@sankhyalabs/core 1.0.22 → 1.0.23
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/dist/dataunit/DataUnit.d.ts +60 -0
- package/dist/dataunit/DataUnit.js +162 -0
- package/dist/dataunit/DataUnit.js.map +1 -0
- package/dist/dataunit/metadata/DataType.d.ts +9 -0
- package/dist/dataunit/metadata/DataType.js +37 -0
- package/dist/dataunit/metadata/DataType.js.map +1 -0
- package/dist/dataunit/metadata/UnitMetadata.d.ts +49 -0
- package/dist/dataunit/metadata/UnitMetadata.js +26 -0
- package/dist/dataunit/metadata/UnitMetadata.js.map +1 -0
- package/dist/dataunit/state/HistReducer.d.ts +10 -0
- package/dist/dataunit/state/HistReducer.js +28 -0
- package/dist/dataunit/state/HistReducer.js.map +1 -0
- package/dist/dataunit/state/StateManager.d.ts +57 -0
- package/dist/dataunit/state/StateManager.js +109 -0
- package/dist/dataunit/state/StateManager.js.map +1 -0
- package/dist/dataunit/state/action/DataUnitAction.d.ts +26 -0
- package/dist/dataunit/state/action/DataUnitAction.js +32 -0
- package/dist/dataunit/state/action/DataUnitAction.js.map +1 -0
- package/dist/dataunit/state/slice/AddedRecordsSlice.d.ts +10 -0
- package/dist/dataunit/state/slice/AddedRecordsSlice.js +25 -0
- package/dist/dataunit/state/slice/AddedRecordsSlice.js.map +1 -0
- package/dist/dataunit/state/slice/ChangesSlice.d.ts +12 -0
- package/dist/dataunit/state/slice/ChangesSlice.js +73 -0
- package/dist/dataunit/state/slice/ChangesSlice.js.map +1 -0
- package/dist/dataunit/state/slice/CurrentRecordsSlice.d.ts +11 -0
- package/dist/dataunit/state/slice/CurrentRecordsSlice.js +46 -0
- package/dist/dataunit/state/slice/CurrentRecordsSlice.js.map +1 -0
- package/dist/dataunit/state/slice/RecordsSlice.d.ts +10 -0
- package/dist/dataunit/state/slice/RecordsSlice.js +38 -0
- package/dist/dataunit/state/slice/RecordsSlice.js.map +1 -0
- package/dist/dataunit/state/slice/RemovedRecordsSlice.d.ts +9 -0
- package/dist/dataunit/state/slice/RemovedRecordsSlice.js +21 -0
- package/dist/dataunit/state/slice/RemovedRecordsSlice.js.map +1 -0
- package/dist/dataunit/state/slice/SelectionSlice.d.ts +11 -0
- package/dist/dataunit/state/slice/SelectionSlice.js +109 -0
- package/dist/dataunit/state/slice/SelectionSlice.js.map +1 -0
- package/dist/dataunit/state/slice/UnitMetadataSlice.d.ts +11 -0
- package/dist/dataunit/state/slice/UnitMetadataSlice.js +21 -0
- package/dist/dataunit/state/slice/UnitMetadataSlice.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/dataunit/DataUnit.ts +237 -0
- package/src/dataunit/metadata/DataType.ts +38 -0
- package/src/dataunit/metadata/UnitMetadata.ts +55 -0
- package/src/dataunit/state/HistReducer.ts +34 -0
- package/src/dataunit/state/StateManager.ts +153 -0
- package/src/dataunit/state/action/DataUnitAction.ts +48 -0
- package/src/dataunit/state/slice/AddedRecordsSlice.ts +31 -0
- package/src/dataunit/state/slice/ChangesSlice.ts +91 -0
- package/src/dataunit/state/slice/CurrentRecordsSlice.ts +54 -0
- package/src/dataunit/state/slice/RecordsSlice.ts +50 -0
- package/src/dataunit/state/slice/RemovedRecordsSlice.ts +26 -0
- package/src/dataunit/state/slice/SelectionSlice.ts +128 -0
- package/src/dataunit/state/slice/UnitMetadataSlice.ts +30 -0
- package/src/index.ts +3 -1
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { UnitMetadata } from "./metadata/UnitMetadata";
|
|
2
|
+
import { DataUnitAction } from "./state/action/DataUnitAction";
|
|
3
|
+
export default class DataUnit {
|
|
4
|
+
private _name;
|
|
5
|
+
private _observers;
|
|
6
|
+
private _stateManager;
|
|
7
|
+
metadataLoader?: (dataUnit: string) => Promise<UnitMetadata>;
|
|
8
|
+
dataLoader?: (dataUnit: string) => Promise<Array<Record>>;
|
|
9
|
+
saveLoader?: (dataUnit: string, changes: Array<Change>) => Promise<Array<SavedRecord>>;
|
|
10
|
+
constructor(name: string);
|
|
11
|
+
get name(): string;
|
|
12
|
+
private validateAndTypeValue;
|
|
13
|
+
loadMetadata(): void;
|
|
14
|
+
loadData(): void;
|
|
15
|
+
saveData(): void;
|
|
16
|
+
getMetadata(): UnitMetadata;
|
|
17
|
+
addRecord(): void;
|
|
18
|
+
removeSelectedRecords(): void;
|
|
19
|
+
getRecords(): Array<Record> | undefined;
|
|
20
|
+
getFieldValue(fieldName: string): any;
|
|
21
|
+
getSelection(): Array<string>;
|
|
22
|
+
setSelection(selection: Array<string>): void;
|
|
23
|
+
setSelectionByIndex(selection: Array<number>): void;
|
|
24
|
+
nextRecord(): void;
|
|
25
|
+
previousRecord(): void;
|
|
26
|
+
setFieldValue(fieldName: string, newValue: any): void;
|
|
27
|
+
cancelEdition(): void;
|
|
28
|
+
isDirty(): boolean;
|
|
29
|
+
hasNext(): boolean;
|
|
30
|
+
hasPrevious(): boolean;
|
|
31
|
+
canUndo(): boolean;
|
|
32
|
+
canRedo(): boolean;
|
|
33
|
+
undo(): void;
|
|
34
|
+
redo(): void;
|
|
35
|
+
private dispatchAction;
|
|
36
|
+
subscribe(observer: (action: DataUnitAction) => void): void;
|
|
37
|
+
unsubscribe(observer: Function): void;
|
|
38
|
+
}
|
|
39
|
+
export interface Record {
|
|
40
|
+
__record__id__: string;
|
|
41
|
+
__parent__record__id__?: string;
|
|
42
|
+
[key: string]: any;
|
|
43
|
+
}
|
|
44
|
+
export interface SavedRecord extends Record {
|
|
45
|
+
__old__id__?: string;
|
|
46
|
+
}
|
|
47
|
+
export declare enum ChangeOperation {
|
|
48
|
+
INSERT = 0,
|
|
49
|
+
UPDATE = 1,
|
|
50
|
+
DELETE = 2
|
|
51
|
+
}
|
|
52
|
+
export declare class Change {
|
|
53
|
+
record: Record;
|
|
54
|
+
updatingFields: any;
|
|
55
|
+
private _operation;
|
|
56
|
+
constructor(record: Record, updates: any, operation: ChangeOperation);
|
|
57
|
+
isInsert(): boolean;
|
|
58
|
+
isDelete(): boolean;
|
|
59
|
+
isUpdate(): boolean;
|
|
60
|
+
}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { convertType } from "./metadata/DataType";
|
|
2
|
+
import { DataUnitAction, Action } from "./state/action/DataUnitAction";
|
|
3
|
+
import StateManager from "./state/StateManager";
|
|
4
|
+
import { HistReducer, canRedo, canUndo } from "./state/HistReducer";
|
|
5
|
+
import { UnitMetadataReducer, getFieldMetadata, getMetadata } from "./state/slice/UnitMetadataSlice";
|
|
6
|
+
import { RecordsReducer } from "./state/slice/RecordsSlice";
|
|
7
|
+
import { SelectionReducer, getSelection, hasNext, hasPrevious } from "./state/slice/SelectionSlice";
|
|
8
|
+
import { ChangesReducer, isDirty, getChangesToSave } from "./state/slice/ChangesSlice";
|
|
9
|
+
import { RemovedRecordsReducer } from "./state/slice/RemovedRecordsSlice";
|
|
10
|
+
import { AddedRecordsReducer } from "./state/slice/AddedRecordsSlice";
|
|
11
|
+
import { CurrentRecordsReducer, getCurrentRecords, getFieldValue } from "./state/slice/CurrentRecordsSlice";
|
|
12
|
+
export default class DataUnit {
|
|
13
|
+
constructor(name) {
|
|
14
|
+
this._name = name;
|
|
15
|
+
this._stateManager = new StateManager([
|
|
16
|
+
HistReducer,
|
|
17
|
+
UnitMetadataReducer,
|
|
18
|
+
RecordsReducer,
|
|
19
|
+
RemovedRecordsReducer,
|
|
20
|
+
AddedRecordsReducer,
|
|
21
|
+
SelectionReducer,
|
|
22
|
+
ChangesReducer,
|
|
23
|
+
CurrentRecordsReducer
|
|
24
|
+
]);
|
|
25
|
+
this._observers = [];
|
|
26
|
+
}
|
|
27
|
+
get name() {
|
|
28
|
+
return this._name;
|
|
29
|
+
}
|
|
30
|
+
// Métodos privados
|
|
31
|
+
validateAndTypeValue(fieldName, newValue) {
|
|
32
|
+
const fmd = getFieldMetadata(this._stateManager, fieldName);
|
|
33
|
+
if (!fmd) {
|
|
34
|
+
throw new Error(`Campo ${fieldName} não encontrado.`);
|
|
35
|
+
}
|
|
36
|
+
return convertType(fmd.dataType, newValue);
|
|
37
|
+
}
|
|
38
|
+
// Loaders
|
|
39
|
+
loadMetadata() {
|
|
40
|
+
this.dispatchAction(Action.LOADING_METADATA);
|
|
41
|
+
if (this.metadataLoader) {
|
|
42
|
+
this.metadataLoader(this._name).then(metadata => this.dispatchAction(Action.METADATA_LOADED, metadata));
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
loadData() {
|
|
46
|
+
this.dispatchAction(Action.LOADING_DATA);
|
|
47
|
+
if (this.dataLoader) {
|
|
48
|
+
this.dataLoader(this._name).then(records => this.dispatchAction(Action.DATA_LOADED, records));
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
saveData() {
|
|
52
|
+
const changes = getChangesToSave(this._stateManager);
|
|
53
|
+
if (changes.length > 0) {
|
|
54
|
+
this.dispatchAction(Action.SAVING_DATA);
|
|
55
|
+
if (this.saveLoader) {
|
|
56
|
+
this.saveLoader(this._name, changes).then(records => this.dispatchAction(Action.DATA_SAVED, { changes, records }));
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// API
|
|
61
|
+
getMetadata() {
|
|
62
|
+
return getMetadata(this._stateManager);
|
|
63
|
+
}
|
|
64
|
+
addRecord() {
|
|
65
|
+
this.dispatchAction(Action.RECORDS_ADDED, [{}]);
|
|
66
|
+
}
|
|
67
|
+
removeSelectedRecords() {
|
|
68
|
+
const selection = getSelection(this._stateManager);
|
|
69
|
+
if (selection) {
|
|
70
|
+
this.dispatchAction(Action.RECORDS_REMOVED, selection);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
getRecords() {
|
|
74
|
+
const records = getCurrentRecords(this._stateManager);
|
|
75
|
+
return records ? Array.from(records.values()) : undefined;
|
|
76
|
+
}
|
|
77
|
+
getFieldValue(fieldName) {
|
|
78
|
+
return getFieldValue(this._stateManager, fieldName);
|
|
79
|
+
}
|
|
80
|
+
getSelection() {
|
|
81
|
+
return getSelection(this._stateManager);
|
|
82
|
+
}
|
|
83
|
+
setSelection(selection) {
|
|
84
|
+
this.dispatchAction(Action.SELECTION_CHANGED, { type: "id", selection });
|
|
85
|
+
}
|
|
86
|
+
setSelectionByIndex(selection) {
|
|
87
|
+
this.dispatchAction(Action.SELECTION_CHANGED, { type: "index", selection });
|
|
88
|
+
}
|
|
89
|
+
nextRecord() {
|
|
90
|
+
this.dispatchAction(Action.NEXT_SELECTED);
|
|
91
|
+
}
|
|
92
|
+
previousRecord() {
|
|
93
|
+
this.dispatchAction(Action.PREVIOUS_SELECTED);
|
|
94
|
+
}
|
|
95
|
+
setFieldValue(fieldName, newValue) {
|
|
96
|
+
const typedValue = this.validateAndTypeValue(fieldName, newValue);
|
|
97
|
+
const currentValue = this.getFieldValue(fieldName);
|
|
98
|
+
if (currentValue !== typedValue) {
|
|
99
|
+
this.dispatchAction(Action.DATA_CHANGED, { [fieldName]: typedValue });
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
cancelEdition() {
|
|
103
|
+
this.dispatchAction(Action.EDITION_CANCELED);
|
|
104
|
+
}
|
|
105
|
+
isDirty() {
|
|
106
|
+
return isDirty(this._stateManager);
|
|
107
|
+
}
|
|
108
|
+
hasNext() {
|
|
109
|
+
return hasNext(this._stateManager);
|
|
110
|
+
}
|
|
111
|
+
hasPrevious() {
|
|
112
|
+
return hasPrevious(this._stateManager);
|
|
113
|
+
}
|
|
114
|
+
canUndo() {
|
|
115
|
+
return canUndo(this._stateManager);
|
|
116
|
+
}
|
|
117
|
+
canRedo() {
|
|
118
|
+
return canRedo(this._stateManager);
|
|
119
|
+
}
|
|
120
|
+
undo() {
|
|
121
|
+
this.dispatchAction(Action.CHANGE_UNDONE);
|
|
122
|
+
}
|
|
123
|
+
redo() {
|
|
124
|
+
this.dispatchAction(Action.CHANGE_REDONE);
|
|
125
|
+
}
|
|
126
|
+
// Actions / State manager
|
|
127
|
+
dispatchAction(actionType, payload) {
|
|
128
|
+
const action = new DataUnitAction(actionType, payload);
|
|
129
|
+
//interceptor
|
|
130
|
+
this._stateManager.process(action);
|
|
131
|
+
this._observers.forEach(f => f(action));
|
|
132
|
+
}
|
|
133
|
+
subscribe(observer) {
|
|
134
|
+
this._observers.push(observer);
|
|
135
|
+
}
|
|
136
|
+
unsubscribe(observer) {
|
|
137
|
+
this._observers = this._observers.filter(f => f !== observer);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
export var ChangeOperation;
|
|
141
|
+
(function (ChangeOperation) {
|
|
142
|
+
ChangeOperation[ChangeOperation["INSERT"] = 0] = "INSERT";
|
|
143
|
+
ChangeOperation[ChangeOperation["UPDATE"] = 1] = "UPDATE";
|
|
144
|
+
ChangeOperation[ChangeOperation["DELETE"] = 2] = "DELETE";
|
|
145
|
+
})(ChangeOperation || (ChangeOperation = {}));
|
|
146
|
+
export class Change {
|
|
147
|
+
constructor(record, updates, operation) {
|
|
148
|
+
this.record = record;
|
|
149
|
+
this.updatingFields = updates;
|
|
150
|
+
this._operation = operation;
|
|
151
|
+
}
|
|
152
|
+
isInsert() {
|
|
153
|
+
return this._operation === ChangeOperation.INSERT;
|
|
154
|
+
}
|
|
155
|
+
isDelete() {
|
|
156
|
+
return this._operation === ChangeOperation.DELETE;
|
|
157
|
+
}
|
|
158
|
+
isUpdate() {
|
|
159
|
+
return this._operation === ChangeOperation.UPDATE;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=DataUnit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DataUnit.js","sourceRoot":"","sources":["../../src/dataunit/DataUnit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare enum DataType {
|
|
2
|
+
NUMBER = "NUMBER",
|
|
3
|
+
DATE = "DATE",
|
|
4
|
+
TEXT = "TEXT",
|
|
5
|
+
BOOLEAN = "BOOLEAN",
|
|
6
|
+
JSON = "JSON"
|
|
7
|
+
}
|
|
8
|
+
export declare const convertType: (dataType: DataType, value: any) => any;
|
|
9
|
+
export declare const toString: (dataType: DataType, value: any) => string;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export var DataType;
|
|
2
|
+
(function (DataType) {
|
|
3
|
+
DataType["NUMBER"] = "NUMBER";
|
|
4
|
+
DataType["DATE"] = "DATE";
|
|
5
|
+
DataType["TEXT"] = "TEXT";
|
|
6
|
+
DataType["BOOLEAN"] = "BOOLEAN";
|
|
7
|
+
DataType["JSON"] = "JSON";
|
|
8
|
+
})(DataType || (DataType = {}));
|
|
9
|
+
export const convertType = (dataType, value) => {
|
|
10
|
+
if (value === undefined || value === null) {
|
|
11
|
+
return value;
|
|
12
|
+
}
|
|
13
|
+
switch (dataType) {
|
|
14
|
+
case DataType.NUMBER:
|
|
15
|
+
return value === "" || isNaN(value) ? null : Number(value);
|
|
16
|
+
case DataType.JSON:
|
|
17
|
+
return JSON.parse(value);
|
|
18
|
+
case DataType.BOOLEAN:
|
|
19
|
+
return Boolean(value);
|
|
20
|
+
case DataType.DATE:
|
|
21
|
+
return new Date(value.toString());
|
|
22
|
+
default:
|
|
23
|
+
return value;
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
export const toString = (dataType, value) => {
|
|
27
|
+
if (value === undefined || value === null) {
|
|
28
|
+
return value;
|
|
29
|
+
}
|
|
30
|
+
if (dataType === DataType.JSON) {
|
|
31
|
+
return JSON.stringify(value);
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
return value.toString();
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
//# sourceMappingURL=DataType.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DataType.js","sourceRoot":"","sources":["../../../src/dataunit/metadata/DataType.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,QAMX;AAND,WAAY,QAAQ;IAChB,6BAAiB,CAAA;IACjB,yBAAa,CAAA;IACb,yBAAa,CAAA;IACb,+BAAmB,CAAA;IACnB,yBAAa,CAAA;AACjB,CAAC,EANW,QAAQ,KAAR,QAAQ,QAMnB;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,QAAiB,EAAE,KAAU,EAAO,EAAE;IAC9D,IAAG,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAC;QACrC,OAAO,KAAK,CAAC;KAChB;IACD,QAAQ,QAAQ,EAAC;QACb,KAAK,QAAQ,CAAC,MAAM;YAChB,OAAO,KAAK,KAAK,EAAE,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC/D,KAAK,QAAQ,CAAC,IAAI;YACd,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC7B,KAAK,QAAQ,CAAC,OAAO;YACjB,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC;QAC1B,KAAK,QAAQ,CAAC,IAAI;YACd,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAA;QACrC;YACI,OAAO,KAAK,CAAC;KACpB;AACL,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,QAAiB,EAAE,KAAU,EAAU,EAAE;IAE9D,IAAG,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAC;QACrC,OAAO,KAAK,CAAC;KAChB;IAED,IAAG,QAAQ,KAAK,QAAQ,CAAC,IAAI,EAAC;QAC1B,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;KAChC;SAAM;QACH,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;KAC3B;AACL,CAAC,CAAA"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { DataType } from "./DataType";
|
|
2
|
+
export interface UnitMetadata {
|
|
3
|
+
name: string;
|
|
4
|
+
label: string;
|
|
5
|
+
fields: Array<FieldMetadata>;
|
|
6
|
+
}
|
|
7
|
+
export interface FieldMetadata {
|
|
8
|
+
name: string;
|
|
9
|
+
label: string;
|
|
10
|
+
dataType: DataType;
|
|
11
|
+
userInterface?: UserInterface;
|
|
12
|
+
defaultValue?: string;
|
|
13
|
+
readOnly?: boolean;
|
|
14
|
+
required?: boolean;
|
|
15
|
+
properties?: Array<UIProperty>;
|
|
16
|
+
dependencies?: Array<FieldDependency>;
|
|
17
|
+
}
|
|
18
|
+
export interface UIProperty {
|
|
19
|
+
name: string;
|
|
20
|
+
value: string;
|
|
21
|
+
}
|
|
22
|
+
export interface FieldDependency {
|
|
23
|
+
masterFields: Array<string>;
|
|
24
|
+
type: DependencyType;
|
|
25
|
+
expression: string;
|
|
26
|
+
}
|
|
27
|
+
export declare enum DependencyType {
|
|
28
|
+
SEARCHING = "SEARCHING",
|
|
29
|
+
REQUIREMENT = "REQUIREMENT",
|
|
30
|
+
VISIBILITY = "REQUIREMENT"
|
|
31
|
+
}
|
|
32
|
+
export declare enum UserInterface {
|
|
33
|
+
FILE = "FILE",
|
|
34
|
+
IMAGE = "IMAGE",
|
|
35
|
+
DATE = "DATE",
|
|
36
|
+
DATETIME = "DATETIME",
|
|
37
|
+
ELAPSEDTIME = "ELAPSEDTIME",
|
|
38
|
+
CHECKBOX = "CHECKBOX",
|
|
39
|
+
SWITCH = "SWITCH",
|
|
40
|
+
OPTIONSELECTOR = "OPTIONSELECTOR",
|
|
41
|
+
DECIMALNUMBER = "DECIMALNUMBER",
|
|
42
|
+
INTEGERNUMBER = "INTEGERNUMBER",
|
|
43
|
+
SEARCH = "SEARCH",
|
|
44
|
+
SHORTTEXT = "SHORTTEXT",
|
|
45
|
+
PASSWORD = "PASSWORD",
|
|
46
|
+
MASKEDTEXT = "MASKEDTEXT",
|
|
47
|
+
LONGTEXT = "LONGTEXT",
|
|
48
|
+
HTML = "HTML"
|
|
49
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export var DependencyType;
|
|
2
|
+
(function (DependencyType) {
|
|
3
|
+
DependencyType["SEARCHING"] = "SEARCHING";
|
|
4
|
+
DependencyType["REQUIREMENT"] = "REQUIREMENT";
|
|
5
|
+
DependencyType["VISIBILITY"] = "REQUIREMENT";
|
|
6
|
+
})(DependencyType || (DependencyType = {}));
|
|
7
|
+
export var UserInterface;
|
|
8
|
+
(function (UserInterface) {
|
|
9
|
+
UserInterface["FILE"] = "FILE";
|
|
10
|
+
UserInterface["IMAGE"] = "IMAGE";
|
|
11
|
+
UserInterface["DATE"] = "DATE";
|
|
12
|
+
UserInterface["DATETIME"] = "DATETIME";
|
|
13
|
+
UserInterface["ELAPSEDTIME"] = "ELAPSEDTIME";
|
|
14
|
+
UserInterface["CHECKBOX"] = "CHECKBOX";
|
|
15
|
+
UserInterface["SWITCH"] = "SWITCH";
|
|
16
|
+
UserInterface["OPTIONSELECTOR"] = "OPTIONSELECTOR";
|
|
17
|
+
UserInterface["DECIMALNUMBER"] = "DECIMALNUMBER";
|
|
18
|
+
UserInterface["INTEGERNUMBER"] = "INTEGERNUMBER";
|
|
19
|
+
UserInterface["SEARCH"] = "SEARCH";
|
|
20
|
+
UserInterface["SHORTTEXT"] = "SHORTTEXT";
|
|
21
|
+
UserInterface["PASSWORD"] = "PASSWORD";
|
|
22
|
+
UserInterface["MASKEDTEXT"] = "MASKEDTEXT";
|
|
23
|
+
UserInterface["LONGTEXT"] = "LONGTEXT";
|
|
24
|
+
UserInterface["HTML"] = "HTML";
|
|
25
|
+
})(UserInterface || (UserInterface = {}));
|
|
26
|
+
//# sourceMappingURL=UnitMetadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UnitMetadata.js","sourceRoot":"","sources":["../../../src/dataunit/metadata/UnitMetadata.ts"],"names":[],"mappings":"AA+BA,MAAM,CAAN,IAAY,cAIX;AAJD,WAAY,cAAc;IACtB,yCAAuB,CAAA;IACvB,6CAA2B,CAAA;IAC3B,4CAA0B,CAAA;AAC9B,CAAC,EAJW,cAAc,KAAd,cAAc,QAIzB;AAED,MAAM,CAAN,IAAY,aAiBX;AAjBD,WAAY,aAAa;IACrB,8BAAa,CAAA;IACb,gCAAe,CAAA;IACf,8BAAa,CAAA;IACb,sCAAqB,CAAA;IACrB,4CAA2B,CAAA;IAC3B,sCAAqB,CAAA;IACrB,kCAAiB,CAAA;IACjB,kDAAiC,CAAA;IACjC,gDAA+B,CAAA;IAC/B,gDAA+B,CAAA;IAC/B,kCAAiB,CAAA;IACjB,wCAAuB,CAAA;IACvB,sCAAqB,CAAA;IACrB,0CAAyB,CAAA;IACzB,sCAAqB,CAAA;IACrB,8BAAa,CAAA;AACjB,CAAC,EAjBW,aAAa,KAAb,aAAa,QAiBxB"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ActionReducer } from "./StateManager";
|
|
2
|
+
import StateManager, { StateAction } from "./StateManager";
|
|
3
|
+
declare class HistReducerImpl implements ActionReducer {
|
|
4
|
+
sliceName: string;
|
|
5
|
+
reduce(stateManager: StateManager, _currentState: void, action: StateAction): void;
|
|
6
|
+
}
|
|
7
|
+
export declare const HistReducer: HistReducerImpl;
|
|
8
|
+
export declare const canUndo: (stateManager: StateManager) => boolean;
|
|
9
|
+
export declare const canRedo: (stateManager: StateManager) => boolean;
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Action } from "./action/DataUnitAction";
|
|
2
|
+
class HistReducerImpl {
|
|
3
|
+
constructor() {
|
|
4
|
+
this.sliceName = "";
|
|
5
|
+
}
|
|
6
|
+
reduce(stateManager, _currentState, action) {
|
|
7
|
+
switch (action.type) {
|
|
8
|
+
case Action.DATA_SAVED:
|
|
9
|
+
case Action.EDITION_CANCELED:
|
|
10
|
+
stateManager.clearUndo();
|
|
11
|
+
break;
|
|
12
|
+
case Action.CHANGE_UNDONE:
|
|
13
|
+
stateManager.undo();
|
|
14
|
+
break;
|
|
15
|
+
case Action.CHANGE_REDONE:
|
|
16
|
+
stateManager.redo();
|
|
17
|
+
break;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export const HistReducer = new HistReducerImpl();
|
|
22
|
+
export const canUndo = (stateManager) => {
|
|
23
|
+
return stateManager.canUndo();
|
|
24
|
+
};
|
|
25
|
+
export const canRedo = (stateManager) => {
|
|
26
|
+
return stateManager.canRedo();
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=HistReducer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HistReducer.js","sourceRoot":"","sources":["../../../src/dataunit/state/HistReducer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAGjD,MAAM,eAAe;IAArB;QAEW,cAAS,GAAW,EAAE,CAAC;IAiBlC,CAAC;IAfU,MAAM,CAAC,YAA0B,EAAE,aAAmB,EAAE,MAAmB;QAE9E,QAAQ,MAAM,CAAC,IAAI,EAAE;YACjB,KAAK,MAAM,CAAC,UAAU,CAAC;YACvB,KAAK,MAAM,CAAC,gBAAgB;gBACxB,YAAY,CAAC,SAAS,EAAE,CAAC;gBACzB,MAAM;YACV,KAAK,MAAM,CAAC,aAAa;gBACrB,YAAY,CAAC,IAAI,EAAE,CAAC;gBACpB,MAAM;YACV,KAAK,MAAM,CAAC,aAAa;gBACrB,YAAY,CAAC,IAAI,EAAE,CAAC;gBACpB,MAAM;SACb;IACL,CAAC;CACJ;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,eAAe,EAAE,CAAC;AAEjD,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,YAA0B,EAAW,EAAE;IAC3D,OAAO,YAAY,CAAC,OAAO,EAAE,CAAC;AAClC,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,YAA0B,EAAW,EAAE;IAC3D,OAAO,YAAY,CAAC,OAAO,EAAE,CAAC;AAClC,CAAC,CAAA"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Essa classe representa uma interpretação do padrão de projetos Flux.
|
|
3
|
+
* No padrão Flux os dados da aplicação são chamados de "estado" e existem
|
|
4
|
+
* algumas regras para gerenciamento/manipulação desse estado:
|
|
5
|
+
*
|
|
6
|
+
* 1 - O estado é imutável.
|
|
7
|
+
* 2 - Toda modificação de estado é representada por uma "ação".
|
|
8
|
+
* 3 - Quando "ações" acontecem a "store" cria um novo estado e notifica a todos interessados.
|
|
9
|
+
*
|
|
10
|
+
* Nessa interpretação desse design pattern, o StateManager faz o papel da store,
|
|
11
|
+
* notificando os manipuladores de estado (handlers), que são responsáveis por pedaços
|
|
12
|
+
* do estado (slices).
|
|
13
|
+
*
|
|
14
|
+
* O StateManager mantém dois tipos de estados: "Histórico" e "Não Histórico". No estado
|
|
15
|
+
* "Histórico", sempre que uma alteração de estado acontece, o estado anterior é guardado em
|
|
16
|
+
* uma pilha, o que permite que possamos voltar no tempo, desfazendo algumas ações
|
|
17
|
+
*/
|
|
18
|
+
export default class StateManager {
|
|
19
|
+
private _reducers;
|
|
20
|
+
private _past;
|
|
21
|
+
private _future;
|
|
22
|
+
private _present;
|
|
23
|
+
private _nonHist;
|
|
24
|
+
private _histClean;
|
|
25
|
+
constructor(reducers: Array<ActionReducer>);
|
|
26
|
+
process(action: StateAction): void;
|
|
27
|
+
select(sliceName: string, selector: (state: any) => any): any;
|
|
28
|
+
private isHistoric;
|
|
29
|
+
private updateSlice;
|
|
30
|
+
private getSlice;
|
|
31
|
+
canUndo(): boolean;
|
|
32
|
+
canRedo(): boolean;
|
|
33
|
+
undo(): void;
|
|
34
|
+
redo(): void;
|
|
35
|
+
clearUndo(): void;
|
|
36
|
+
persist(): void;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Baseado no padrão Flux, qualquer alteração de estado parte de uma ação.
|
|
40
|
+
* Essa ação pode conter um payload ou não.
|
|
41
|
+
*/
|
|
42
|
+
export interface StateAction {
|
|
43
|
+
/**
|
|
44
|
+
* O tipo da ação representa o que aconteceu. Com base nesse tipo
|
|
45
|
+
* os manipuladores de estado agem criando um novo estado.
|
|
46
|
+
*/
|
|
47
|
+
type: string;
|
|
48
|
+
/**
|
|
49
|
+
* Muitas ações contém informações importantes para compor o novo estado.
|
|
50
|
+
* Isso é chamado de payload.
|
|
51
|
+
*/
|
|
52
|
+
payload?: any;
|
|
53
|
+
}
|
|
54
|
+
export interface ActionReducer {
|
|
55
|
+
sliceName: string;
|
|
56
|
+
reduce(stateManager: StateManager, state: any, action: StateAction): any;
|
|
57
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Essa classe representa uma interpretação do padrão de projetos Flux.
|
|
3
|
+
* No padrão Flux os dados da aplicação são chamados de "estado" e existem
|
|
4
|
+
* algumas regras para gerenciamento/manipulação desse estado:
|
|
5
|
+
*
|
|
6
|
+
* 1 - O estado é imutável.
|
|
7
|
+
* 2 - Toda modificação de estado é representada por uma "ação".
|
|
8
|
+
* 3 - Quando "ações" acontecem a "store" cria um novo estado e notifica a todos interessados.
|
|
9
|
+
*
|
|
10
|
+
* Nessa interpretação desse design pattern, o StateManager faz o papel da store,
|
|
11
|
+
* notificando os manipuladores de estado (handlers), que são responsáveis por pedaços
|
|
12
|
+
* do estado (slices).
|
|
13
|
+
*
|
|
14
|
+
* O StateManager mantém dois tipos de estados: "Histórico" e "Não Histórico". No estado
|
|
15
|
+
* "Histórico", sempre que uma alteração de estado acontece, o estado anterior é guardado em
|
|
16
|
+
* uma pilha, o que permite que possamos voltar no tempo, desfazendo algumas ações
|
|
17
|
+
*/
|
|
18
|
+
export default class StateManager {
|
|
19
|
+
constructor(reducers) {
|
|
20
|
+
this._past = [];
|
|
21
|
+
this._future = [];
|
|
22
|
+
this._present = {};
|
|
23
|
+
this._nonHist = {};
|
|
24
|
+
this._histClean = false;
|
|
25
|
+
this._reducers = reducers;
|
|
26
|
+
}
|
|
27
|
+
process(action) {
|
|
28
|
+
const oldPresent = this._present;
|
|
29
|
+
let hasChange = false;
|
|
30
|
+
let hasHistChange = false;
|
|
31
|
+
this._histClean = false;
|
|
32
|
+
this._reducers.forEach(reducer => {
|
|
33
|
+
const sliceName = reducer.sliceName;
|
|
34
|
+
const isHistoric = this.isHistoric(sliceName);
|
|
35
|
+
const oldSlice = this.getSlice(sliceName, isHistoric);
|
|
36
|
+
const newSlice = reducer.reduce(this, oldSlice, action);
|
|
37
|
+
if (newSlice !== oldSlice) {
|
|
38
|
+
this.updateSlice(sliceName, newSlice, isHistoric);
|
|
39
|
+
hasChange = true;
|
|
40
|
+
hasHistChange || (hasHistChange = isHistoric);
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
if (hasHistChange && !this._histClean) {
|
|
44
|
+
this._past.push(oldPresent);
|
|
45
|
+
this._future = [];
|
|
46
|
+
document.dispatchEvent(new CustomEvent("undoableAction", { detail: this }));
|
|
47
|
+
}
|
|
48
|
+
if (hasChange) {
|
|
49
|
+
console.log(JSON.stringify(this, (_key, value) => {
|
|
50
|
+
if (value instanceof Map) {
|
|
51
|
+
return { dataType: "Map", value: Array.from(value.entries()) };
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
return value;
|
|
55
|
+
}
|
|
56
|
+
}, 3));
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
select(sliceName, selector) {
|
|
60
|
+
const isHistoric = this.isHistoric(sliceName);
|
|
61
|
+
return selector(this.getSlice(sliceName, isHistoric));
|
|
62
|
+
}
|
|
63
|
+
isHistoric(slice) {
|
|
64
|
+
return slice.startsWith("hist::");
|
|
65
|
+
}
|
|
66
|
+
updateSlice(name, slice, isHistoric) {
|
|
67
|
+
if (isHistoric) {
|
|
68
|
+
this._present = Object.assign(Object.assign({}, this._present), { [name]: slice });
|
|
69
|
+
if (slice === undefined) {
|
|
70
|
+
delete this._present[name];
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
this._nonHist = Object.assign(Object.assign({}, this._nonHist), { [name]: slice });
|
|
75
|
+
if (slice === undefined) {
|
|
76
|
+
delete this._nonHist[name];
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
getSlice(name, isHistoric) {
|
|
81
|
+
return isHistoric ? this._present[name] : this._nonHist[name];
|
|
82
|
+
}
|
|
83
|
+
canUndo() {
|
|
84
|
+
return this._past.length > 0;
|
|
85
|
+
}
|
|
86
|
+
canRedo() {
|
|
87
|
+
return this._future.length > 0;
|
|
88
|
+
}
|
|
89
|
+
undo() {
|
|
90
|
+
if (this.canUndo()) {
|
|
91
|
+
this._future.push(this._present);
|
|
92
|
+
this._present = this._past.pop();
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
redo() {
|
|
96
|
+
if (this.canRedo()) {
|
|
97
|
+
this._past.push(this._present);
|
|
98
|
+
this._present = this._future.pop();
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
clearUndo() {
|
|
102
|
+
this._histClean = true;
|
|
103
|
+
this._past = [];
|
|
104
|
+
this._future = [];
|
|
105
|
+
}
|
|
106
|
+
persist() {
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=StateManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StateManager.js","sourceRoot":"","sources":["../../../src/dataunit/state/StateManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { StateAction } from "../StateManager";
|
|
2
|
+
export declare class DataUnitAction implements StateAction {
|
|
3
|
+
private _type;
|
|
4
|
+
private _payload;
|
|
5
|
+
constructor(type: Action, payload?: any);
|
|
6
|
+
get type(): Action;
|
|
7
|
+
get payload(): any;
|
|
8
|
+
}
|
|
9
|
+
export declare enum Action {
|
|
10
|
+
LOADING_METADATA = "loadingMetadata",
|
|
11
|
+
METADATA_LOADED = "metadataLoaded",
|
|
12
|
+
LOADING_DATA = "loadingData",
|
|
13
|
+
DATA_LOADED = "dataLoaded",
|
|
14
|
+
SAVING_DATA = "savingData",
|
|
15
|
+
DATA_SAVED = "dataSaved",
|
|
16
|
+
RECORDS_REMOVED = "recordsRemoved",
|
|
17
|
+
RECORDS_ADDED = "recordsAdded",
|
|
18
|
+
DATA_CHANGED = "dataChanged",
|
|
19
|
+
EDITION_CANCELED = "editionCanceled",
|
|
20
|
+
CHANGE_UNDONE = "changeUndone",
|
|
21
|
+
CHANGE_REDONE = "changeRedone",
|
|
22
|
+
SELECTION_CHANGED = "selectionChanged",
|
|
23
|
+
NEXT_SELECTED = "nextSelected",
|
|
24
|
+
PREVIOUS_SELECTED = "previousSelected",
|
|
25
|
+
STATE_CHANGED = "stateChanged"
|
|
26
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export class DataUnitAction {
|
|
2
|
+
constructor(type, payload) {
|
|
3
|
+
this._type = type;
|
|
4
|
+
this._payload = payload;
|
|
5
|
+
}
|
|
6
|
+
get type() {
|
|
7
|
+
return this._type;
|
|
8
|
+
}
|
|
9
|
+
get payload() {
|
|
10
|
+
return this._payload;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export var Action;
|
|
14
|
+
(function (Action) {
|
|
15
|
+
Action["LOADING_METADATA"] = "loadingMetadata";
|
|
16
|
+
Action["METADATA_LOADED"] = "metadataLoaded";
|
|
17
|
+
Action["LOADING_DATA"] = "loadingData";
|
|
18
|
+
Action["DATA_LOADED"] = "dataLoaded";
|
|
19
|
+
Action["SAVING_DATA"] = "savingData";
|
|
20
|
+
Action["DATA_SAVED"] = "dataSaved";
|
|
21
|
+
Action["RECORDS_REMOVED"] = "recordsRemoved";
|
|
22
|
+
Action["RECORDS_ADDED"] = "recordsAdded";
|
|
23
|
+
Action["DATA_CHANGED"] = "dataChanged";
|
|
24
|
+
Action["EDITION_CANCELED"] = "editionCanceled";
|
|
25
|
+
Action["CHANGE_UNDONE"] = "changeUndone";
|
|
26
|
+
Action["CHANGE_REDONE"] = "changeRedone";
|
|
27
|
+
Action["SELECTION_CHANGED"] = "selectionChanged";
|
|
28
|
+
Action["NEXT_SELECTED"] = "nextSelected";
|
|
29
|
+
Action["PREVIOUS_SELECTED"] = "previousSelected";
|
|
30
|
+
Action["STATE_CHANGED"] = "stateChanged";
|
|
31
|
+
})(Action || (Action = {}));
|
|
32
|
+
//# sourceMappingURL=DataUnitAction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DataUnitAction.js","sourceRoot":"","sources":["../../../../src/dataunit/state/action/DataUnitAction.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,cAAc;IAKvB,YAAY,IAAY,EAAE,OAAY;QAClC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;IAC5B,CAAC;IAED,IAAW,IAAI;QACX,OAAO,IAAI,CAAC,KAAK,CAAC;IACtB,CAAC;IAED,IAAW,OAAO;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;CACJ;AAED,MAAM,CAAN,IAAY,MAyBX;AAzBD,WAAY,MAAM;IAEd,8CAAoC,CAAA;IACpC,4CAAkC,CAAA;IAElC,sCAA4B,CAAA;IAC5B,oCAA0B,CAAA;IAE1B,oCAA0B,CAAA;IAC1B,kCAAwB,CAAA;IAExB,4CAAkC,CAAA;IAClC,wCAA8B,CAAA;IAC9B,sCAA4B,CAAA;IAE5B,8CAAoC,CAAA;IACpC,wCAA8B,CAAA;IAC9B,wCAA8B,CAAA;IAE9B,gDAAsC,CAAA;IACtC,wCAA8B,CAAA;IAC9B,gDAAsC,CAAA;IAEtC,wCAA8B,CAAA;AAElC,CAAC,EAzBW,MAAM,KAAN,MAAM,QAyBjB"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ActionReducer, StateAction } from "../StateManager";
|
|
2
|
+
import StateManager from "../StateManager";
|
|
3
|
+
import { Record } from "../../DataUnit";
|
|
4
|
+
declare class AddedRecordsReducerImpl implements ActionReducer {
|
|
5
|
+
sliceName: string;
|
|
6
|
+
reduce(_stateManager: StateManager, currentState: Array<Record>, action: StateAction): Array<Record> | undefined;
|
|
7
|
+
}
|
|
8
|
+
export declare const AddedRecordsReducer: AddedRecordsReducerImpl;
|
|
9
|
+
export declare const getAddedRecords: (stateManager: StateManager) => Array<Record>;
|
|
10
|
+
export {};
|