@genesislcap/foundation-forms 14.4.0 → 14.6.0
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/dts/filters/filters.d.ts +98 -0
- package/dist/dts/filters/filters.d.ts.map +1 -0
- package/dist/dts/filters/filters.styles.d.ts +2 -0
- package/dist/dts/filters/filters.styles.d.ts.map +1 -0
- package/dist/dts/filters/filters.template.d.ts +3 -0
- package/dist/dts/filters/filters.template.d.ts.map +1 -0
- package/dist/dts/filters/index.d.ts +2 -0
- package/dist/dts/filters/index.d.ts.map +1 -0
- package/dist/dts/index.d.ts +1 -0
- package/dist/dts/index.d.ts.map +1 -1
- package/dist/dts/jsonforms/renderers/ControlWrapperRenderer.d.ts.map +1 -1
- package/dist/dts/jsonforms/renderers/FilterDateControlRenderer.d.ts +3 -0
- package/dist/dts/jsonforms/renderers/FilterDateControlRenderer.d.ts.map +1 -0
- package/dist/dts/jsonforms/renderers/FilterNumberControlRenderer.d.ts +3 -0
- package/dist/dts/jsonforms/renderers/FilterNumberControlRenderer.d.ts.map +1 -0
- package/dist/dts/utils/filters.d.ts +13 -0
- package/dist/dts/utils/filters.d.ts.map +1 -0
- package/dist/dts/utils/index.d.ts +1 -0
- package/dist/dts/utils/index.d.ts.map +1 -1
- package/dist/esm/filters/filters.js +144 -0
- package/dist/esm/filters/filters.styles.js +62 -0
- package/dist/esm/filters/filters.template.js +40 -0
- package/dist/esm/filters/index.js +1 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/jsonforms/renderers/ControlWrapperRenderer.js +1 -0
- package/dist/esm/jsonforms/renderers/FilterDateControlRenderer.js +67 -0
- package/dist/esm/jsonforms/renderers/FilterNumberControlRenderer.js +60 -0
- package/dist/esm/utils/filters.js +84 -0
- package/dist/esm/utils/index.js +1 -0
- package/dist/foundation-forms.api.json +363 -0
- package/dist/foundation-forms.d.ts +109 -0
- package/docs/api/foundation-forms.createexpressions.md +13 -0
- package/docs/api/foundation-forms.filters.clearfiltersdata.md +18 -0
- package/docs/api/foundation-forms.filters.data.md +13 -0
- package/docs/api/foundation-forms.filters.disconnectedcallback.md +18 -0
- package/docs/api/foundation-forms.filters.jsonschema.md +18 -0
- package/docs/api/foundation-forms.filters.md +37 -0
- package/docs/api/foundation-forms.filters.renderers.md +13 -0
- package/docs/api/foundation-forms.filters.resourcename.md +13 -0
- package/docs/api/foundation-forms.filters.uischema.md +50 -0
- package/docs/api/foundation-forms.filters.value.md +13 -0
- package/docs/api/foundation-forms.filters.valuechanged.md +18 -0
- package/docs/api/foundation-forms.filtersrenderers.md +12 -0
- package/docs/api/foundation-forms.md +3 -0
- package/docs/api-report.md +40 -0
- package/package.json +6 -5
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { UISchemaElement } from '@jsonforms/core';
|
|
2
|
+
import { FoundationElement } from '@microsoft/fast-foundation';
|
|
3
|
+
import { JSONSchema7 } from 'json-schema';
|
|
4
|
+
import { RendererEntry } from '../types';
|
|
5
|
+
/** @internal */
|
|
6
|
+
export declare const filtersLogger: import("@genesislcap/foundation-utils").Logger;
|
|
7
|
+
/** @public */
|
|
8
|
+
export declare const filtersRenderers: any[];
|
|
9
|
+
/**
|
|
10
|
+
* Foundation filters component for automatically generated filters based on json schema
|
|
11
|
+
* obtained from the api, supplied initial data or supplied JSON schema.
|
|
12
|
+
* Allowing customisable filters elements using UI schema and set of custom renderers
|
|
13
|
+
* @beta
|
|
14
|
+
*/
|
|
15
|
+
export declare class Filters extends FoundationElement {
|
|
16
|
+
/**
|
|
17
|
+
* Name of the backend resource which will provide metadata
|
|
18
|
+
* used to generate filters
|
|
19
|
+
* @public
|
|
20
|
+
*/
|
|
21
|
+
resourceName: string;
|
|
22
|
+
private resourceNameChanged;
|
|
23
|
+
clearFiltersData(): void;
|
|
24
|
+
/**
|
|
25
|
+
* UI schema used to define configuration of the layout and elements in the filters
|
|
26
|
+
* Check {@link UiSchemaElement} for possible options
|
|
27
|
+
*
|
|
28
|
+
* @remarks
|
|
29
|
+
* If not provided will be autogenerated based on json schema or initial data
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* Here's a simple example:
|
|
33
|
+
* ```
|
|
34
|
+
* const sampleUISchema = {
|
|
35
|
+
* type: 'VerticalLayout',
|
|
36
|
+
* elements: [
|
|
37
|
+
* {
|
|
38
|
+
* type: 'Control',
|
|
39
|
+
* scope: '#/properties/QUANTITY',
|
|
40
|
+
* label: 'Quantity',
|
|
41
|
+
* },
|
|
42
|
+
* {
|
|
43
|
+
* type: 'Control',
|
|
44
|
+
* scope: '#/properties/INSTRUMENT_ID',
|
|
45
|
+
* options: {
|
|
46
|
+
* allOptionsResourceName: 'INSTRUMENT',
|
|
47
|
+
* valueField: 'INSTRUMENT_ID',
|
|
48
|
+
* labelField: 'INSTRUMENT_ID',
|
|
49
|
+
* },
|
|
50
|
+
* label: 'Instrument',
|
|
51
|
+
* },
|
|
52
|
+
* {
|
|
53
|
+
* type: 'Control',
|
|
54
|
+
* scope: '#/properties/SIDE',
|
|
55
|
+
* label: 'Side',
|
|
56
|
+
* },
|
|
57
|
+
* ],
|
|
58
|
+
* };
|
|
59
|
+
* ```
|
|
60
|
+
* @public
|
|
61
|
+
*/
|
|
62
|
+
uischema: UISchemaElement;
|
|
63
|
+
/**
|
|
64
|
+
* Allows to provide set of renderers used by the filters. If not provided it will default to text-field inputs
|
|
65
|
+
* @public
|
|
66
|
+
*/
|
|
67
|
+
renderers: RendererEntry[];
|
|
68
|
+
/**
|
|
69
|
+
* Alternatively to providing {@link Form.resourceName} you can hardcode the JSON schema on the client.
|
|
70
|
+
* @public
|
|
71
|
+
* @remarks
|
|
72
|
+
* Use this when you want to avoid fetching metadata from the server but
|
|
73
|
+
* be aware that it could get out of sync if metadata changes on the server
|
|
74
|
+
*/
|
|
75
|
+
jsonSchema: JSONSchema7;
|
|
76
|
+
private connect;
|
|
77
|
+
/**
|
|
78
|
+
* Initial data for the filters
|
|
79
|
+
* @public
|
|
80
|
+
*/
|
|
81
|
+
data: any;
|
|
82
|
+
/**
|
|
83
|
+
* Created criteria based on the given data that can be used to filter the data
|
|
84
|
+
* @public
|
|
85
|
+
*/
|
|
86
|
+
value: string;
|
|
87
|
+
valueChanged(): void;
|
|
88
|
+
/**
|
|
89
|
+
* @internal
|
|
90
|
+
*/
|
|
91
|
+
searchFilters(): void;
|
|
92
|
+
/**
|
|
93
|
+
* @internal
|
|
94
|
+
*/
|
|
95
|
+
onChange(event: CustomEvent): void;
|
|
96
|
+
disconnectedCallback(): void;
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=filters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filters.d.ts","sourceRoot":"","sources":["../../../src/filters/filters.ts"],"names":[],"mappings":"AAGA,OAAO,EAKL,eAAe,EAChB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAY1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAKzC,gBAAgB;AAChB,eAAO,MAAM,aAAa,gDAAqC,CAAC;AAchE,cAAc;AACd,eAAO,MAAM,gBAAgB,OAY5B,CAAC;AACF;;;;;GAKG;AAEH,qBAKa,OAAQ,SAAQ,iBAAiB;IAC5C;;;;OAIG;IACG,YAAY,EAAE,MAAM,CAAC;YACb,mBAAmB;IAW1B,gBAAgB;IAIvB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAqCG;IACS,QAAQ,EAAE,eAAe,CAAC;IACtC;;;OAGG;IACS,SAAS,EAAE,aAAa,EAAE,CAAoB;IAC1D;;;;;;OAMG;IACS,UAAU,EAAE,WAAW,CAAC;IAE3B,OAAO,CAAC,OAAO,CAAW;IACnC;;;OAGG;IACS,IAAI,EAAE,GAAG,CAAM;IAC3B;;;OAGG;IACS,KAAK,EAAE,MAAM,CAAC;IAC1B,YAAY;IAIZ;;OAEG;IACH,aAAa;IAqBb;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,WAAW;IAO3B,oBAAoB;CAKrB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filters.styles.d.ts","sourceRoot":"","sources":["../../../src/filters/filters.styles.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,uBAAuB,iDA2DnC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filters.template.d.ts","sourceRoot":"","sources":["../../../src/filters/filters.template.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMzC,eAAO,MAAM,yBAAyB,8DAgCrC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/filters/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC"}
|
package/dist/dts/index.d.ts
CHANGED
package/dist/dts/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ControlWrapperRenderer.d.ts","sourceRoot":"","sources":["../../../../src/jsonforms/renderers/ControlWrapperRenderer.ts"],"names":[],"mappings":"AACA,OAAO,EAML,WAAW,EAEZ,MAAM,yBAAyB,CAAC;AAEjC,eAAO,MAAM,8BAA8B,0DA4B1C,CAAC;
|
|
1
|
+
{"version":3,"file":"ControlWrapperRenderer.d.ts","sourceRoot":"","sources":["../../../../src/jsonforms/renderers/ControlWrapperRenderer.ts"],"names":[],"mappings":"AACA,OAAO,EAML,WAAW,EAEZ,MAAM,yBAAyB,CAAC;AAEjC,eAAO,MAAM,8BAA8B,0DA4B1C,CAAC;AA2BF,qBAKa,cAAe,SAAQ,WAAW;IACjC,OAAO,MAAC;IACR,OAAO,MAAC;IAEpB,IACI,eAAe,YAOlB;IAED,IACI,aAAa,WAMhB;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FilterDateControlRenderer.d.ts","sourceRoot":"","sources":["../../../../src/jsonforms/renderers/FilterDateControlRenderer.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,2BAA2B,0DAmDvC,CAAC;AAEF,eAAO,MAAM,8BAA8B,EAAE,GAI5C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FilterNumberControlRenderer.d.ts","sourceRoot":"","sources":["../../../../src/jsonforms/renderers/FilterNumberControlRenderer.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,mCAAmC,0DAsD/C,CAAC;AAEF,eAAO,MAAM,gCAAgC,EAAE,GAI9C,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Expression } from '@genesislcap/foundation-criteria';
|
|
2
|
+
type Expressions = {
|
|
3
|
+
options: Expression[];
|
|
4
|
+
numberOptions: Expression[];
|
|
5
|
+
dateOptions: Expression[];
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Creates a expressions/criteria from given payload
|
|
9
|
+
* @public
|
|
10
|
+
*/
|
|
11
|
+
export declare const createExpressions: (payload: any) => Expressions;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=filters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filters.d.ts","sourceRoot":"","sources":["../../../src/utils/filters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAkC,MAAM,kCAAkC,CAAC;AAM9F,KAAK,WAAW,GAAG;IACjB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,aAAa,EAAE,UAAU,EAAE,CAAC;IAC5B,WAAW,EAAE,UAAU,EAAE,CAAC;CAC3B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,YAAa,GAAG,gBAyC7C,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { __awaiter, __decorate } from "tslib";
|
|
2
|
+
import { Connect } from '@genesislcap/foundation-comms';
|
|
3
|
+
import { CriteriaBuilder, Join } from '@genesislcap/foundation-criteria';
|
|
4
|
+
import { createLogger } from '@genesislcap/foundation-utils';
|
|
5
|
+
import { isControl, isStringControl, mapStateToControlProps, rankWith, } from '@jsonforms/core';
|
|
6
|
+
import { attr, customElement, observable } from '@microsoft/fast-element';
|
|
7
|
+
import { FoundationElement } from '@microsoft/fast-foundation';
|
|
8
|
+
import { BooleanControlEntry } from '../jsonforms/renderers/BooleanControlRenderer';
|
|
9
|
+
import { ConnectedMultiselectControlRendererEntry } from '../jsonforms/renderers/ConnectedMultiselectControlRenderer';
|
|
10
|
+
import { ConnectedSelectControlRendererEntry } from '../jsonforms/renderers/ConnectedSelectControlRenderer';
|
|
11
|
+
import { EnumControlRendererEntry } from '../jsonforms/renderers/EnumControlRenderer';
|
|
12
|
+
import { FilterDateControlRendererEntry } from '../jsonforms/renderers/FilterDateControlRenderer';
|
|
13
|
+
import { FilterNumberControlRendererEntry } from '../jsonforms/renderers/FilterNumberControlRenderer';
|
|
14
|
+
import { InvisibleControlEntry } from '../jsonforms/renderers/InvisibleControlRenderer';
|
|
15
|
+
import { LayoutRendererEntry } from '../jsonforms/renderers/LayoutRenderer';
|
|
16
|
+
import { LayoutVertical2ColumnsEntry } from '../jsonforms/renderers/LayoutVertical2ColumnsRenderer';
|
|
17
|
+
import { StringControlRendererTemplate } from '../jsonforms/renderers/StringControlRenderer';
|
|
18
|
+
import { createExpressions } from '../utils/filters';
|
|
19
|
+
import { foundationFiltersStyles as styles } from './filters.styles';
|
|
20
|
+
import { foundationFiltersTemplate as template } from './filters.template';
|
|
21
|
+
/** @internal */
|
|
22
|
+
export const filtersLogger = createLogger('foundation-filters');
|
|
23
|
+
const stringEntry = {
|
|
24
|
+
renderer: StringControlRendererTemplate,
|
|
25
|
+
tester: rankWith(2, isStringControl),
|
|
26
|
+
mapper: mapStateToControlProps,
|
|
27
|
+
};
|
|
28
|
+
const fallbackEntry = {
|
|
29
|
+
renderer: StringControlRendererTemplate,
|
|
30
|
+
tester: rankWith(1, isControl),
|
|
31
|
+
mapper: mapStateToControlProps,
|
|
32
|
+
};
|
|
33
|
+
/** @public */
|
|
34
|
+
export const filtersRenderers = [
|
|
35
|
+
fallbackEntry,
|
|
36
|
+
stringEntry,
|
|
37
|
+
BooleanControlEntry,
|
|
38
|
+
LayoutVertical2ColumnsEntry,
|
|
39
|
+
LayoutRendererEntry,
|
|
40
|
+
FilterNumberControlRendererEntry,
|
|
41
|
+
ConnectedMultiselectControlRendererEntry,
|
|
42
|
+
EnumControlRendererEntry,
|
|
43
|
+
ConnectedSelectControlRendererEntry,
|
|
44
|
+
FilterDateControlRendererEntry,
|
|
45
|
+
InvisibleControlEntry,
|
|
46
|
+
];
|
|
47
|
+
/**
|
|
48
|
+
* Foundation filters component for automatically generated filters based on json schema
|
|
49
|
+
* obtained from the api, supplied initial data or supplied JSON schema.
|
|
50
|
+
* Allowing customisable filters elements using UI schema and set of custom renderers
|
|
51
|
+
* @beta
|
|
52
|
+
*/
|
|
53
|
+
let Filters = class Filters extends FoundationElement {
|
|
54
|
+
constructor() {
|
|
55
|
+
super(...arguments);
|
|
56
|
+
/**
|
|
57
|
+
* Allows to provide set of renderers used by the filters. If not provided it will default to text-field inputs
|
|
58
|
+
* @public
|
|
59
|
+
*/
|
|
60
|
+
this.renderers = filtersRenderers;
|
|
61
|
+
/**
|
|
62
|
+
* Initial data for the filters
|
|
63
|
+
* @public
|
|
64
|
+
*/
|
|
65
|
+
this.data = {};
|
|
66
|
+
}
|
|
67
|
+
resourceNameChanged() {
|
|
68
|
+
var _a, _b, _c;
|
|
69
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
70
|
+
this.jsonSchema = undefined;
|
|
71
|
+
if (this.resourceName) {
|
|
72
|
+
const jsonSchemaResponse = yield this.connect.getJSONSchema(this.resourceName);
|
|
73
|
+
this.jsonSchema = (_b = (_a = jsonSchemaResponse === null || jsonSchemaResponse === void 0 ? void 0 : jsonSchemaResponse.OUTBOUND) === null || _a === void 0 ? void 0 : _a.$defs) === null || _b === void 0 ? void 0 : _b['global.genesis.message.core.dataserver.QueryRow'];
|
|
74
|
+
(_c = this.jsonSchema) === null || _c === void 0 ? true : delete _c.properties['DETAILS'];
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
clearFiltersData() {
|
|
79
|
+
this.data = {};
|
|
80
|
+
}
|
|
81
|
+
valueChanged() {
|
|
82
|
+
this.dispatchEvent(new Event('change', { bubbles: true, composed: true }));
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* @internal
|
|
86
|
+
*/
|
|
87
|
+
searchFilters() {
|
|
88
|
+
this.value = '';
|
|
89
|
+
const payload = Object.assign({}, this.data);
|
|
90
|
+
const expressions = createExpressions(payload);
|
|
91
|
+
const criteriaBuilder = new CriteriaBuilder();
|
|
92
|
+
filtersLogger.debug({ payload });
|
|
93
|
+
if (expressions.dateOptions.length > 0 ||
|
|
94
|
+
expressions.numberOptions.length > 0 ||
|
|
95
|
+
expressions.options.length > 0) {
|
|
96
|
+
for (const [key, value] of Object.entries(expressions)) {
|
|
97
|
+
value.length > 0 ? criteriaBuilder.withExpression(value, { join: Join.And() }) : '';
|
|
98
|
+
}
|
|
99
|
+
this.value = criteriaBuilder.build();
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* @internal
|
|
104
|
+
*/
|
|
105
|
+
onChange(event) {
|
|
106
|
+
filtersLogger.debug({ event });
|
|
107
|
+
if (event.detail) {
|
|
108
|
+
this.data = event.detail.data;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
disconnectedCallback() {
|
|
112
|
+
super.disconnectedCallback();
|
|
113
|
+
this.data = {};
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
__decorate([
|
|
117
|
+
attr
|
|
118
|
+
], Filters.prototype, "resourceName", void 0);
|
|
119
|
+
__decorate([
|
|
120
|
+
observable
|
|
121
|
+
], Filters.prototype, "uischema", void 0);
|
|
122
|
+
__decorate([
|
|
123
|
+
observable
|
|
124
|
+
], Filters.prototype, "renderers", void 0);
|
|
125
|
+
__decorate([
|
|
126
|
+
observable
|
|
127
|
+
], Filters.prototype, "jsonSchema", void 0);
|
|
128
|
+
__decorate([
|
|
129
|
+
Connect
|
|
130
|
+
], Filters.prototype, "connect", void 0);
|
|
131
|
+
__decorate([
|
|
132
|
+
observable
|
|
133
|
+
], Filters.prototype, "data", void 0);
|
|
134
|
+
__decorate([
|
|
135
|
+
observable
|
|
136
|
+
], Filters.prototype, "value", void 0);
|
|
137
|
+
Filters = __decorate([
|
|
138
|
+
customElement({
|
|
139
|
+
name: 'foundation-filters',
|
|
140
|
+
template,
|
|
141
|
+
styles,
|
|
142
|
+
})
|
|
143
|
+
], Filters);
|
|
144
|
+
export { Filters };
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { controlCornerRadius, designUnit, strokeWidth } from '@microsoft/fast-components';
|
|
2
|
+
import { css } from '@microsoft/fast-element';
|
|
3
|
+
import { forcedColorsStylesheetBehavior } from '@microsoft/fast-foundation';
|
|
4
|
+
import { SystemColors } from '@microsoft/fast-web-utilities';
|
|
5
|
+
export const foundationFiltersStyles = css `
|
|
6
|
+
:host {
|
|
7
|
+
display: flex;
|
|
8
|
+
height: 100%;
|
|
9
|
+
width: 100%;
|
|
10
|
+
border: calc(${strokeWidth} * 1px) solid transparent;
|
|
11
|
+
margin: 0;
|
|
12
|
+
border-radius: calc(${controlCornerRadius} * 1px);
|
|
13
|
+
min-width: 64px;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
.header {
|
|
17
|
+
padding: calc(var(--design-unit) * 4px);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
.header h2 {
|
|
21
|
+
margin: 0;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
.container {
|
|
25
|
+
width: 100%;
|
|
26
|
+
display: flex;
|
|
27
|
+
flex-direction: column;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
.container-forms {
|
|
31
|
+
overflow: hidden;
|
|
32
|
+
overflow-y: scroll;
|
|
33
|
+
display: flex;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
.container-forms json-forms {
|
|
37
|
+
width: 100%;
|
|
38
|
+
padding: 0 15px;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
.label {
|
|
42
|
+
font-size: calc(${designUnit} * 1px + 0.7vmin);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
.actions {
|
|
46
|
+
display: flex;
|
|
47
|
+
flex-direction: row;
|
|
48
|
+
align-items: flex-start;
|
|
49
|
+
justify-content: flex-end;
|
|
50
|
+
padding: calc(${designUnit} * 4px);
|
|
51
|
+
gap: calc(${designUnit} * 2px);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
.action-button {
|
|
55
|
+
width: 70px;
|
|
56
|
+
}
|
|
57
|
+
`.withBehaviors(forcedColorsStylesheetBehavior(css `
|
|
58
|
+
:host {
|
|
59
|
+
background: ${SystemColors.Canvas};
|
|
60
|
+
border-color: ${SystemColors.CanvasText};
|
|
61
|
+
}
|
|
62
|
+
`));
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { html } from '@microsoft/fast-element';
|
|
2
|
+
import { JSONForms } from '../jsonforms/json-forms';
|
|
3
|
+
import { ControlWrapper } from '../jsonforms/renderers/ControlWrapperRenderer';
|
|
4
|
+
import { DispatchRenderer } from '../jsonforms/renderers/dispatch-renderer';
|
|
5
|
+
JSONForms;
|
|
6
|
+
ControlWrapper;
|
|
7
|
+
DispatchRenderer;
|
|
8
|
+
export const foundationFiltersTemplate = html `
|
|
9
|
+
<template>
|
|
10
|
+
<div class="container" part="container">
|
|
11
|
+
<div class="container-forms" part="container-forms">
|
|
12
|
+
<json-forms
|
|
13
|
+
:renderers=${(x) => x.renderers}
|
|
14
|
+
:uischema=${(x) => x.uischema}
|
|
15
|
+
:schema=${(x) => x.jsonSchema}
|
|
16
|
+
:data=${(x) => x.data}
|
|
17
|
+
@data-change=${(x, c) => x.onChange(c.event)}
|
|
18
|
+
></json-forms>
|
|
19
|
+
</div>
|
|
20
|
+
<div class="actions">
|
|
21
|
+
<fast-button
|
|
22
|
+
@click="${(x) => x.clearFiltersData()}"
|
|
23
|
+
class="action-button"
|
|
24
|
+
appearance="neutral"
|
|
25
|
+
data-test-id="clear-filters-button"
|
|
26
|
+
>
|
|
27
|
+
Clear
|
|
28
|
+
</fast-button>
|
|
29
|
+
<fast-button
|
|
30
|
+
@click="${(x) => x.searchFilters()}"
|
|
31
|
+
data-test-id="search-filters-button"
|
|
32
|
+
class="action-button"
|
|
33
|
+
appearance="accent"
|
|
34
|
+
>
|
|
35
|
+
Search
|
|
36
|
+
</fast-button>
|
|
37
|
+
</div>
|
|
38
|
+
</div>
|
|
39
|
+
</template>
|
|
40
|
+
`;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './filters';
|
package/dist/esm/index.js
CHANGED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { mapStateToControlProps, rankWith } from '@jsonforms/core';
|
|
2
|
+
import { html } from '@microsoft/fast-element';
|
|
3
|
+
import { isDate } from '../testers/isDate';
|
|
4
|
+
import { DATE_CONTROL_RANK } from './RenderersRanks';
|
|
5
|
+
export const DateControlRendererTemplate = html `
|
|
6
|
+
<template>
|
|
7
|
+
<control-wrapper :control=${(x) => x.control} ?submitted=${(x) => x.submitted}>
|
|
8
|
+
<zero-text-field
|
|
9
|
+
:value=${(x) => {
|
|
10
|
+
var _a, _b;
|
|
11
|
+
return ((_a = x.control.data) === null || _a === void 0 ? void 0 : _a.min) === undefined || ((_b = x.control.data) === null || _b === void 0 ? void 0 : _b.min) === null
|
|
12
|
+
? ''
|
|
13
|
+
: new Intl.DateTimeFormat('fr-CA', {
|
|
14
|
+
year: 'numeric',
|
|
15
|
+
month: '2-digit',
|
|
16
|
+
day: '2-digit',
|
|
17
|
+
}).format(x.control.data.min);
|
|
18
|
+
}}
|
|
19
|
+
@change="${(x, c) => {
|
|
20
|
+
var _a, _b;
|
|
21
|
+
const value = c.event.target.control.valueAsNumber;
|
|
22
|
+
return x.control.handleChange(x.control.path, {
|
|
23
|
+
min: value ? value : undefined,
|
|
24
|
+
max: ((_a = x.control.data) === null || _a === void 0 ? void 0 : _a.max) < value ? undefined : (_b = x.control.data) === null || _b === void 0 ? void 0 : _b.max,
|
|
25
|
+
type: 'date',
|
|
26
|
+
});
|
|
27
|
+
}}"
|
|
28
|
+
id=${(x) => `min-${x.control.path}`}
|
|
29
|
+
type="date"
|
|
30
|
+
data-test-id=${(x) => `min-${x.control.path}`}
|
|
31
|
+
@blur=${(x) => x.onBlur()}
|
|
32
|
+
style="width: 100%"
|
|
33
|
+
></zero-text-field>
|
|
34
|
+
<zero-text-field
|
|
35
|
+
:value=${(x) => {
|
|
36
|
+
var _a, _b;
|
|
37
|
+
return ((_a = x.control.data) === null || _a === void 0 ? void 0 : _a.max) === undefined || ((_b = x.control.data) === null || _b === void 0 ? void 0 : _b.max) === null
|
|
38
|
+
? ''
|
|
39
|
+
: new Intl.DateTimeFormat('fr-CA', {
|
|
40
|
+
year: 'numeric',
|
|
41
|
+
month: '2-digit',
|
|
42
|
+
day: '2-digit',
|
|
43
|
+
}).format(x.control.data.max);
|
|
44
|
+
}}
|
|
45
|
+
@change="${(x, c) => {
|
|
46
|
+
var _a, _b;
|
|
47
|
+
const value = c.event.target.control.valueAsNumber;
|
|
48
|
+
return x.control.handleChange(x.control.path, {
|
|
49
|
+
min: ((_a = x.control.data) === null || _a === void 0 ? void 0 : _a.min) > value ? undefined : (_b = x.control.data) === null || _b === void 0 ? void 0 : _b.min,
|
|
50
|
+
max: value ? value : undefined,
|
|
51
|
+
type: 'date',
|
|
52
|
+
});
|
|
53
|
+
}}"
|
|
54
|
+
id=${(x) => `max-${x.control.path}`}
|
|
55
|
+
type="date"
|
|
56
|
+
data-test-id=${(x) => `max-${x.control.path}`}
|
|
57
|
+
@blur=${(x) => x.onBlur()}
|
|
58
|
+
style="width: 100%"
|
|
59
|
+
></zero-text-field>
|
|
60
|
+
</control-wrapper>
|
|
61
|
+
</template>
|
|
62
|
+
`;
|
|
63
|
+
export const FilterDateControlRendererEntry = {
|
|
64
|
+
renderer: DateControlRendererTemplate,
|
|
65
|
+
tester: rankWith(DATE_CONTROL_RANK, isDate),
|
|
66
|
+
mapper: mapStateToControlProps, // TODO: change mapper to handle dates instead of doing it in the template
|
|
67
|
+
};
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { mapStateToControlProps, rankWith } from '@jsonforms/core';
|
|
2
|
+
import { html } from '@microsoft/fast-element';
|
|
3
|
+
import { isOneOfNumber } from '../testers/isOneOfNumber';
|
|
4
|
+
import { NUMBER_CONTROL_RANK } from './RenderersRanks';
|
|
5
|
+
export const FilterNumberControlRendererTemplate = html `
|
|
6
|
+
<template>
|
|
7
|
+
<control-wrapper :control=${(x) => x.control} ?submitted=${(x) => x.submitted}>
|
|
8
|
+
<zero-text-field
|
|
9
|
+
:value=${(x) => { var _a; return (((_a = x.control.data) === null || _a === void 0 ? void 0 : _a.min) === undefined ? '' : x.control.data.min); }}
|
|
10
|
+
@change=${(x, c) => {
|
|
11
|
+
var _a, _b;
|
|
12
|
+
const value = parseFloat(c.event.target.value);
|
|
13
|
+
return x.control.handleChange(x.control.path, !isNaN(value)
|
|
14
|
+
? {
|
|
15
|
+
min: value,
|
|
16
|
+
max: ((_a = x.control.data) === null || _a === void 0 ? void 0 : _a.max) < value ? undefined : (_b = x.control.data) === null || _b === void 0 ? void 0 : _b.max,
|
|
17
|
+
type: 'number',
|
|
18
|
+
}
|
|
19
|
+
: Object.assign(Object.assign({}, x.control.data), { min: undefined }));
|
|
20
|
+
}}
|
|
21
|
+
placeholder="Min"
|
|
22
|
+
id=${(x) => `min-${x.control.path}`}
|
|
23
|
+
data-test-id=${(x) => `min-${x.control.path}`}
|
|
24
|
+
@blur=${(x) => x.onBlur()}
|
|
25
|
+
style="width: 100%"
|
|
26
|
+
></zero-text-field>
|
|
27
|
+
<span
|
|
28
|
+
style="
|
|
29
|
+
font-size: xx-large;
|
|
30
|
+
color: rgb(135, 155, 166);"
|
|
31
|
+
>
|
|
32
|
+
-
|
|
33
|
+
</span>
|
|
34
|
+
<zero-text-field
|
|
35
|
+
:value=${(x) => { var _a; return (((_a = x.control.data) === null || _a === void 0 ? void 0 : _a.max) === undefined ? '' : x.control.data.max); }}
|
|
36
|
+
@change=${(x, c) => {
|
|
37
|
+
var _a, _b;
|
|
38
|
+
const value = parseFloat(c.event.target.value);
|
|
39
|
+
return x.control.handleChange(x.control.path, !isNaN(value)
|
|
40
|
+
? {
|
|
41
|
+
min: ((_a = x.control.data) === null || _a === void 0 ? void 0 : _a.min) > value ? undefined : (_b = x.control.data) === null || _b === void 0 ? void 0 : _b.min,
|
|
42
|
+
max: value,
|
|
43
|
+
type: 'number',
|
|
44
|
+
}
|
|
45
|
+
: Object.assign(Object.assign({}, x.control.data), { max: undefined }));
|
|
46
|
+
}}
|
|
47
|
+
placeholder="Max"
|
|
48
|
+
id=${(x) => `max-${x.control.path}`}
|
|
49
|
+
data-test-id=${(x) => `max-${x.control.path}`}
|
|
50
|
+
@blur=${(x) => x.onBlur()}
|
|
51
|
+
style="width: 100%"
|
|
52
|
+
></zero-text-field>
|
|
53
|
+
</control-wrapper>
|
|
54
|
+
</template>
|
|
55
|
+
`;
|
|
56
|
+
export const FilterNumberControlRendererEntry = {
|
|
57
|
+
renderer: FilterNumberControlRendererTemplate,
|
|
58
|
+
tester: rankWith(NUMBER_CONTROL_RANK, isOneOfNumber),
|
|
59
|
+
mapper: mapStateToControlProps,
|
|
60
|
+
};
|