@gisce/ooui 2.21.0 → 2.22.0-alpha.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/dist/Field.d.ts +5 -5
- package/dist/Field.d.ts.map +1 -1
- package/dist/Form.d.ts +5 -0
- package/dist/Form.d.ts.map +1 -1
- package/dist/Tree.d.ts +5 -0
- package/dist/Tree.d.ts.map +1 -1
- package/dist/Widget.d.ts +5 -0
- package/dist/Widget.d.ts.map +1 -1
- package/dist/helpers/nodeParser.d.ts.map +1 -1
- package/dist/ooui.es.js +350 -321
- package/dist/ooui.es.js.map +1 -1
- package/package.json +1 -1
- package/src/Field.ts +23 -10
- package/src/Form.ts +13 -0
- package/src/Tree.ts +13 -1
- package/src/Widget.ts +13 -13
- package/src/helpers/nodeParser.ts +7 -1
- package/src/spec/Field.spec.ts +35 -0
- package/src/spec/Form.spec.ts +50 -0
- package/src/spec/Tree.spec.ts +19 -0
- package/src/spec/nodeParser.spec.ts +53 -0
package/package.json
CHANGED
package/src/Field.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import Widget from "./Widget";
|
|
2
2
|
import { replaceEntities, isTrue } from "./helpers/attributeParser";
|
|
3
|
+
import { parseBoolAttribute } from "./helpers/nodeParser";
|
|
3
4
|
|
|
4
5
|
class Field extends Widget {
|
|
5
6
|
/**
|
|
@@ -117,12 +118,25 @@ class Field extends Widget {
|
|
|
117
118
|
this._selectionValues = value;
|
|
118
119
|
}
|
|
119
120
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
121
|
+
_autoRefresh?: boolean = false;
|
|
122
|
+
get autoRefresh(): boolean {
|
|
123
|
+
return this._autoRefresh ?? false;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
set autoRefresh(value: boolean) {
|
|
127
|
+
this._autoRefresh = value;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
get readOnly(): boolean | undefined {
|
|
131
|
+
if (this.autoRefresh) {
|
|
132
|
+
return true;
|
|
133
|
+
} else {
|
|
134
|
+
return super.readOnly;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
set readOnly(value: boolean | undefined) {
|
|
139
|
+
super.readOnly = value;
|
|
126
140
|
}
|
|
127
141
|
|
|
128
142
|
constructor(props: any) {
|
|
@@ -136,10 +150,6 @@ class Field extends Widget {
|
|
|
136
150
|
this._id = props.name;
|
|
137
151
|
}
|
|
138
152
|
|
|
139
|
-
if (props.type) {
|
|
140
|
-
this._fieldType = props.fieldsWidgetType;
|
|
141
|
-
}
|
|
142
|
-
|
|
143
153
|
if (props.activated) {
|
|
144
154
|
this._activated = props.activated;
|
|
145
155
|
}
|
|
@@ -180,6 +190,9 @@ class Field extends Widget {
|
|
|
180
190
|
if (props.help_inline) {
|
|
181
191
|
this.tooltipInline = isTrue(props.help_inline);
|
|
182
192
|
}
|
|
193
|
+
if (props.autorefresh) {
|
|
194
|
+
this.autoRefresh = parseBoolAttribute(props.autorefresh);
|
|
195
|
+
}
|
|
183
196
|
}
|
|
184
197
|
}
|
|
185
198
|
|
package/src/Form.ts
CHANGED
|
@@ -120,6 +120,14 @@ class Form {
|
|
|
120
120
|
this._invisibleFields = value;
|
|
121
121
|
}
|
|
122
122
|
|
|
123
|
+
/**
|
|
124
|
+
* List of autorefreshable fields
|
|
125
|
+
*/
|
|
126
|
+
_autorefreshableFields: string[] = [];
|
|
127
|
+
get autorefreshableFields(): string[] {
|
|
128
|
+
return this._autorefreshableFields;
|
|
129
|
+
}
|
|
130
|
+
|
|
123
131
|
/**
|
|
124
132
|
* Context for each field in the form
|
|
125
133
|
*/
|
|
@@ -166,6 +174,11 @@ class Form {
|
|
|
166
174
|
this._contextForFields[unknownWidget._id] = widget._context;
|
|
167
175
|
}
|
|
168
176
|
});
|
|
177
|
+
|
|
178
|
+
// Also we store all the autorefreshables fields in a list
|
|
179
|
+
this._autorefreshableFields = allWidgets
|
|
180
|
+
.filter((widget) => widget instanceof Field && widget.autoRefresh)
|
|
181
|
+
.map((field) => (field as Field)._id);
|
|
169
182
|
}
|
|
170
183
|
|
|
171
184
|
parseNode({
|
package/src/Tree.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import WidgetFactory from "./WidgetFactory";
|
|
2
2
|
import Widget from "./Widget";
|
|
3
3
|
import { replaceEntities } from "./helpers/attributeParser";
|
|
4
|
-
import { ParsedNode } from "./helpers/nodeParser";
|
|
4
|
+
import { parseBoolAttribute, ParsedNode } from "./helpers/nodeParser";
|
|
5
5
|
import * as txml from "txml";
|
|
6
6
|
import { parseContext } from "./helpers/contextParser";
|
|
7
7
|
|
|
@@ -67,6 +67,14 @@ class Tree {
|
|
|
67
67
|
this._contextForFields = value;
|
|
68
68
|
}
|
|
69
69
|
|
|
70
|
+
/**
|
|
71
|
+
* List of autorefreshable fields
|
|
72
|
+
*/
|
|
73
|
+
_autorefreshableFields: string[] = [];
|
|
74
|
+
get autorefreshableFields(): string[] {
|
|
75
|
+
return this._autorefreshableFields;
|
|
76
|
+
}
|
|
77
|
+
|
|
70
78
|
/**
|
|
71
79
|
* Is infinite
|
|
72
80
|
*/
|
|
@@ -145,6 +153,10 @@ class Tree {
|
|
|
145
153
|
const widget = widgetFactory.createWidget(widgetType, mergedAttrs);
|
|
146
154
|
this._columns.push(widget);
|
|
147
155
|
}
|
|
156
|
+
|
|
157
|
+
if (parseBoolAttribute(mergedAttrs.autorefresh)) {
|
|
158
|
+
this._autorefreshableFields.push(name);
|
|
159
|
+
}
|
|
148
160
|
}
|
|
149
161
|
});
|
|
150
162
|
}
|
package/src/Widget.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { replaceEntities } from "./helpers/attributeParser";
|
|
2
|
+
import { parseBoolAttribute } from "./helpers/nodeParser";
|
|
2
3
|
|
|
3
4
|
abstract class Widget {
|
|
4
5
|
/**
|
|
@@ -115,6 +116,14 @@ abstract class Widget {
|
|
|
115
116
|
this._isFunction = value;
|
|
116
117
|
}
|
|
117
118
|
|
|
119
|
+
/**
|
|
120
|
+
* Base type of the field
|
|
121
|
+
*/
|
|
122
|
+
_fieldType: string = "";
|
|
123
|
+
get fieldType(): string {
|
|
124
|
+
return this._fieldType;
|
|
125
|
+
}
|
|
126
|
+
|
|
118
127
|
constructor(props?: any) {
|
|
119
128
|
this._colspan = Widget._defaultColspan;
|
|
120
129
|
this._invisible = false;
|
|
@@ -124,19 +133,7 @@ abstract class Widget {
|
|
|
124
133
|
this._colspan = +props.colspan;
|
|
125
134
|
}
|
|
126
135
|
if (props.readonly !== undefined) {
|
|
127
|
-
|
|
128
|
-
props.readonly === "1" ||
|
|
129
|
-
props.readonly === 1 ||
|
|
130
|
-
props.readonly === true
|
|
131
|
-
) {
|
|
132
|
-
this._readOnly = true;
|
|
133
|
-
} else if (
|
|
134
|
-
props.readonly === "0" ||
|
|
135
|
-
props.readonly === 0 ||
|
|
136
|
-
props.readonly === false
|
|
137
|
-
) {
|
|
138
|
-
this._readOnly = false;
|
|
139
|
-
}
|
|
136
|
+
this._readOnly = parseBoolAttribute(props.readonly);
|
|
140
137
|
}
|
|
141
138
|
if (props.invisible) {
|
|
142
139
|
if (
|
|
@@ -160,6 +157,9 @@ abstract class Widget {
|
|
|
160
157
|
this._domain = replaceEntities(props.domain);
|
|
161
158
|
}
|
|
162
159
|
}
|
|
160
|
+
if (props.type) {
|
|
161
|
+
this._fieldType = props.fieldsWidgetType;
|
|
162
|
+
}
|
|
163
163
|
if (props.widget_props) {
|
|
164
164
|
if (typeof props.widget_props === "string") {
|
|
165
165
|
try {
|
|
@@ -5,7 +5,13 @@ type ParsedNode = {
|
|
|
5
5
|
};
|
|
6
6
|
|
|
7
7
|
const parseBoolAttribute = (attr: any): boolean => {
|
|
8
|
-
if (
|
|
8
|
+
if (
|
|
9
|
+
attr === 1 ||
|
|
10
|
+
attr === "1" ||
|
|
11
|
+
attr === true ||
|
|
12
|
+
attr === "True" ||
|
|
13
|
+
attr === "true"
|
|
14
|
+
) {
|
|
9
15
|
return true;
|
|
10
16
|
} else {
|
|
11
17
|
return false;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import Field from "../Field";
|
|
3
|
+
|
|
4
|
+
describe("Field", () => {
|
|
5
|
+
describe("with the autoRefresh property", () => {
|
|
6
|
+
it("should be false as default", () => {
|
|
7
|
+
const props = {};
|
|
8
|
+
const field = new Field(props);
|
|
9
|
+
expect(field.autoRefresh).toBe(false);
|
|
10
|
+
});
|
|
11
|
+
it("should work with text", () => {
|
|
12
|
+
const props = {
|
|
13
|
+
autorefresh: "1",
|
|
14
|
+
};
|
|
15
|
+
const field = new Field(props);
|
|
16
|
+
expect(field.autoRefresh).toBe(true);
|
|
17
|
+
});
|
|
18
|
+
describe("if autorefresh is not a valid boold", () => {
|
|
19
|
+
it("should return false", () => {
|
|
20
|
+
const props = {
|
|
21
|
+
autorefresh: "abc",
|
|
22
|
+
};
|
|
23
|
+
const field = new Field(props);
|
|
24
|
+
expect(field.autoRefresh).toBe(false);
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
it("should return true for readOnly if autoRefresh is set", () => {
|
|
28
|
+
const props = {
|
|
29
|
+
autorefresh: true,
|
|
30
|
+
};
|
|
31
|
+
const field = new Field(props);
|
|
32
|
+
expect(field.readOnly).toBe(true);
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
});
|
package/src/spec/Form.spec.ts
CHANGED
|
@@ -6015,4 +6015,54 @@ describe("A Form", () => {
|
|
|
6015
6015
|
expect(field_char?.type).toBe("arrow_steps");
|
|
6016
6016
|
expect(field_char?.id).toBe("field_char");
|
|
6017
6017
|
});
|
|
6018
|
+
it("a field with autorefresh evaluated in attrs should be present in form autorefreshable fields property", () => {
|
|
6019
|
+
const fields = {
|
|
6020
|
+
field_char: {
|
|
6021
|
+
string: "Etapa",
|
|
6022
|
+
type: "char",
|
|
6023
|
+
},
|
|
6024
|
+
state: {
|
|
6025
|
+
readonly: true,
|
|
6026
|
+
required: true,
|
|
6027
|
+
selection: [
|
|
6028
|
+
["esborrany", "Borrador"],
|
|
6029
|
+
["validar", "Validar"],
|
|
6030
|
+
["pendent", "Pendiente"],
|
|
6031
|
+
["activa", "Activa"],
|
|
6032
|
+
["cancelada", "Cancelada"],
|
|
6033
|
+
["contracte", "Activación Contrato"],
|
|
6034
|
+
["novapolissa", "Creación nuevo contrato"],
|
|
6035
|
+
["modcontractual", "Modificación Contractual"],
|
|
6036
|
+
["impagament", "Impago"],
|
|
6037
|
+
["tall", "Corte"],
|
|
6038
|
+
["running", "En ejecución"],
|
|
6039
|
+
["baixa", "Baja"],
|
|
6040
|
+
["facturacio", "Facturación"],
|
|
6041
|
+
],
|
|
6042
|
+
string: "Estado",
|
|
6043
|
+
type: "selection",
|
|
6044
|
+
views: {},
|
|
6045
|
+
},
|
|
6046
|
+
};
|
|
6047
|
+
|
|
6048
|
+
const xmlViewForm = `<?xml version="1.0"?>
|
|
6049
|
+
<form string="Form1">
|
|
6050
|
+
<field name="field_char" widget="arrow_steps" colspan="4" nolabel="1" attrs="{'autorefresh':[('state', '=', 'running')]}" />
|
|
6051
|
+
</form>`;
|
|
6052
|
+
|
|
6053
|
+
const form = new Form(fields);
|
|
6054
|
+
form.parse(xmlViewForm, {
|
|
6055
|
+
values: {
|
|
6056
|
+
field_char: "test",
|
|
6057
|
+
state: "running",
|
|
6058
|
+
},
|
|
6059
|
+
});
|
|
6060
|
+
|
|
6061
|
+
const field_char = form.findById("field_char") as Field;
|
|
6062
|
+
expect(field_char).toBeDefined();
|
|
6063
|
+
expect(field_char?.autoRefresh).toBeTruthy();
|
|
6064
|
+
expect(field_char?.readOnly).toBeTruthy();
|
|
6065
|
+
expect(form.autorefreshableFields.length).toBe(1);
|
|
6066
|
+
expect(form.autorefreshableFields[0]).toBe("field_char");
|
|
6067
|
+
});
|
|
6018
6068
|
});
|
package/src/spec/Tree.spec.ts
CHANGED
|
@@ -377,4 +377,23 @@ describe("A Tree", () => {
|
|
|
377
377
|
const nameWidget = tree.findById("name") as Char;
|
|
378
378
|
expect(nameWidget.isFunction).toBeTruthy();
|
|
379
379
|
});
|
|
380
|
+
it("Should parse autorefreshable fields", () => {
|
|
381
|
+
const tree = new Tree({
|
|
382
|
+
name: {
|
|
383
|
+
required: true,
|
|
384
|
+
select: true,
|
|
385
|
+
size: 128,
|
|
386
|
+
string: "Potència contractada (kW)",
|
|
387
|
+
type: "char",
|
|
388
|
+
views: {},
|
|
389
|
+
},
|
|
390
|
+
});
|
|
391
|
+
tree.parse(
|
|
392
|
+
`<tree string="Partners" colors="red:type=='updated'"><field name="name" sum="Potència contractada (kW)" autorefresh="1"/></tree>`,
|
|
393
|
+
);
|
|
394
|
+
|
|
395
|
+
const nameWidget = tree.findById("name") as Char;
|
|
396
|
+
expect(nameWidget.autoRefresh).toBeTruthy();
|
|
397
|
+
expect(tree._autorefreshableFields.length).toBe(1);
|
|
398
|
+
});
|
|
380
399
|
});
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { parseBoolAttribute } from "../helpers/nodeParser";
|
|
3
|
+
|
|
4
|
+
describe("parseBoolAttribute", () => {
|
|
5
|
+
it("returns true for numeric 1", () => {
|
|
6
|
+
expect(parseBoolAttribute(1)).toBe(true);
|
|
7
|
+
});
|
|
8
|
+
|
|
9
|
+
it('returns true for string "1"', () => {
|
|
10
|
+
expect(parseBoolAttribute("1")).toBe(true);
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
it("returns true for boolean true", () => {
|
|
14
|
+
expect(parseBoolAttribute(true)).toBe(true);
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it('returns true for string "True"', () => {
|
|
18
|
+
expect(parseBoolAttribute("True")).toBe(true);
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
it('returns true for string "true"', () => {
|
|
22
|
+
expect(parseBoolAttribute("true")).toBe(true);
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
it("returns false for numeric 0", () => {
|
|
26
|
+
expect(parseBoolAttribute(0)).toBe(false);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it('returns false for string "0"', () => {
|
|
30
|
+
expect(parseBoolAttribute("0")).toBe(false);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it("returns false for boolean false", () => {
|
|
34
|
+
expect(parseBoolAttribute(false)).toBe(false);
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
it('returns false for string "False"', () => {
|
|
38
|
+
expect(parseBoolAttribute("False")).toBe(false);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it("returns false for null", () => {
|
|
42
|
+
expect(parseBoolAttribute(null)).toBe(false);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it("returns false for undefined", () => {
|
|
46
|
+
expect(parseBoolAttribute(undefined)).toBe(false);
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
it("returns false for non-boolean strings", () => {
|
|
50
|
+
expect(parseBoolAttribute("yes")).toBe(false);
|
|
51
|
+
expect(parseBoolAttribute("no")).toBe(false);
|
|
52
|
+
});
|
|
53
|
+
});
|