SDN-R add updated featureaggregator
[ccsdk/features.git] / sdnr / wt / odlux / apps / configurationApp / src / models / uiModels.ts
1 export type ViewElementBase = {
2   "id": string;
3   "label": string;
4   "config": boolean;
5   "ifFeature"?: string;
6   "when"?: string;
7   "mandatory"?: boolean;
8   "description"?: string;
9   "isList"?: boolean;
10   "default"?: string;
11   "status"?: "current" | "deprecated" | "obsolete",
12   "reference"?: string, // https://tools.ietf.org/html/rfc7950#section-7.21.4
13 }
14
15 // https://tools.ietf.org/html/rfc7950#section-9.8
16 export type ViewElementBinary = ViewElementBase & {
17   "uiType": "binary";
18   "length"?: number;  // number of octets
19 }
20
21 // https://tools.ietf.org/html/rfc7950#section-9.7.4
22 export type ViewElementBits = ViewElementBase & {
23   "uiType": "bits";
24   "flags": {
25     [name: string]: number | undefined;    // 0 - 4294967295
26   }
27 }
28
29 // https://tools.ietf.org/html/rfc7950#section-9
30 export type ViewElementString = ViewElementBase & {
31   "uiType": "string";
32   "pattern"?: string[];
33   "length"?: string;
34   "invertMatch"?: true;
35 }
36
37 // https://tools.ietf.org/html/rfc7950#section-9.3
38 export type ViewElementNumber = ViewElementBase & {
39   "uiType": "number";
40   "min"?: number;
41   "max"?: number;
42   "units"?: string;
43   "format"?: string;
44   "fDigits"?: number;
45 }
46
47 // https://tools.ietf.org/html/rfc7950#section-9.5
48 export type ViewElementBoolean = ViewElementBase & {
49   "uiType": "boolean";
50   "trueValue"?: string;
51   "falseValue"?: string;
52 }
53
54 // https://tools.ietf.org/html/rfc7950#section-9.6.4
55 export type ViewElementSelection = ViewElementBase & {
56   "uiType": "selection";
57   "multiSelect"?: boolean
58   "options": {
59     "key": string;
60     "value": string;
61     "description"?: string,
62     "status"?: "current" | "deprecated" | "obsolete",
63     "reference"?: string,
64   }[];
65 }
66
67 // is a list if isList is true ;-)
68 export type ViewElementObject = ViewElementBase & {
69   "uiType": "object";
70   "isList"?: false;
71   "viewId": string;
72 }
73
74 // Hint: read only lists do not need a key
75 export type ViewElementList = (ViewElementBase & {
76   "uiType": "object";
77   "isList": true;
78   "viewId": string;
79   "key"?: string;
80 });
81
82 export type ViewElementReference = ViewElementBase & {
83   "uiType": "reference";
84   "referencePath": string;
85   "ref": (currentPath: string) => ViewElement | null;
86 }
87
88 export type ViewElement =
89   | ViewElementBits
90   | ViewElementBinary
91   | ViewElementString
92   | ViewElementNumber
93   | ViewElementBoolean
94   | ViewElementObject
95   | ViewElementList
96   | ViewElementSelection
97   | ViewElementReference;
98
99 export const isViewElementString = (viewElement: ViewElement): viewElement is ViewElementString => {
100   return viewElement && viewElement.uiType === "string";
101 }
102
103 export const isViewElementNumber = (viewElement: ViewElement): viewElement is ViewElementNumber => {
104   return viewElement && viewElement.uiType === "number" ;
105 }
106
107 export const isViewElementBoolean = (viewElement: ViewElement): viewElement is ViewElementBoolean => {
108   return viewElement && viewElement.uiType === "boolean";
109 }
110
111 export const isViewElementObject = (viewElement: ViewElement): viewElement is ViewElementObject => {
112   return viewElement && viewElement.uiType === "object" && viewElement.isList === false;
113 }
114
115 export const isViewElementList = (viewElement: ViewElement): viewElement is ViewElementList => {
116   return viewElement && viewElement.uiType === "object" && viewElement.isList === true;
117 }
118
119 export const isViewElementObjectOrList = (viewElement: ViewElement): viewElement is ViewElementObject | ViewElementList => {
120   return viewElement && viewElement.uiType === "object";
121 }
122
123 export const isViewElementSelection = (viewElement: ViewElement): viewElement is ViewElementSelection => {
124   return viewElement && viewElement.uiType === "selection";
125 }
126
127 export const isViewElementReference = (viewElement: ViewElement): viewElement is ViewElementReference => {
128   return viewElement && viewElement.uiType === "reference";
129 }
130
131 export type ViewSpecification = {
132   "id": string;
133   "name": string;
134   "title"?: string;
135   "parentView"?: string;
136   "language": string;
137   "ifFeature"?: string;
138   "when"?: string;
139   "uses"?: string[];
140   "elements": { [name: string]: ViewElement };
141   readonly "canEdit": boolean;
142 }