update odlux for notification change
[ccsdk/features.git] / sdnr / wt / odlux / apps / configurationApp / src / models / uiModels.ts
1 /**
2  * ============LICENSE_START========================================================================
3  * ONAP : ccsdk feature sdnr wt odlux
4  * =================================================================================================
5  * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved.
6  * =================================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
8  * in compliance with the License. You may obtain a copy of the License at
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software distributed under the License
13  * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
14  * or implied. See the License for the specific language governing permissions and limitations under
15  * the License.
16  * ============LICENSE_END==========================================================================
17  */
18
19 export type ViewElementBase = {
20   "id": string;
21   "label": string;
22   "module": string;
23   "path": string;
24   "config": boolean;
25   "ifFeature"?: string;
26   "when"?: string;
27   "mandatory"?: boolean;
28   "description"?: string;
29   "isList"?: boolean;
30   "default"?: string;
31   "status"?: "current" | "deprecated" | "obsolete",
32   "reference"?: string, // https://tools.ietf.org/html/rfc7950#section-7.21.4
33 }
34
35 // https://tools.ietf.org/html/rfc7950#section-9.8
36 export type ViewElementBinary = ViewElementBase & {
37   "uiType": "binary";
38   "length"?: Expression<YangRange>;  // number of octets
39 }
40
41 // https://tools.ietf.org/html/rfc7950#section-9.7.4
42 export type ViewElementBits = ViewElementBase & {
43   "uiType": "bits";
44   "flags": {
45     [name: string]: number | undefined;    // 0 - 4294967295
46   }
47 }
48
49 // https://tools.ietf.org/html/rfc7950#section-9
50 export type ViewElementString = ViewElementBase & {
51   "uiType": "string";
52   "pattern"?: Expression<RegExp>;
53   "length"?: Expression<YangRange>;
54   "invertMatch"?: true;
55 }
56
57 // special case derived from 
58 export type ViewElementDate = ViewElementBase & {
59   "uiType": "date";
60   "pattern"?: Expression<RegExp>;
61   "length"?: Expression<YangRange>;
62   "invertMatch"?: true;
63 }
64
65 // https://tools.ietf.org/html/rfc7950#section-9.3
66 export type ViewElementNumber = ViewElementBase & {
67   "uiType": "number";
68   "min": number;
69   "max": number;
70   "range"?: Expression<YangRange>;
71   "units"?: string;
72   "format"?: string;
73   "fDigits"?: number;
74 }
75
76 // https://tools.ietf.org/html/rfc7950#section-9.5
77 export type ViewElementBoolean = ViewElementBase & {
78   "uiType": "boolean";
79   "trueValue"?: string;
80   "falseValue"?: string;
81 }
82
83 // https://tools.ietf.org/html/rfc7950#section-9.6.4
84 export type ViewElementSelection = ViewElementBase & {
85   "uiType": "selection";
86   "multiSelect"?: boolean
87   "options": {
88     "key": string;
89     "value": string;
90     "description"?: string,
91     "status"?: "current" | "deprecated" | "obsolete",
92     "reference"?: string,
93   }[];
94 }
95
96 // is a list if isList is true ;-)
97 export type ViewElementObject = ViewElementBase & {
98   "uiType": "object";
99   "isList"?: false;
100   "viewId": string;
101 }
102
103 // Hint: read only lists do not need a key
104 export type ViewElementList = (ViewElementBase & {
105   "uiType": "object";
106   "isList": true;
107   "viewId": string;
108   "key"?: string;
109 });
110
111 export type ViewElementReference = ViewElementBase & {
112   "uiType": "reference";
113   "referencePath": string;
114   "ref": (currentPath: string) => [ViewElement , string] | undefined;
115 }
116
117 export type ViewElementUnion = ViewElementBase & {
118   "uiType": "union";
119   "elements": ViewElement[];
120 }
121
122 export type ViewElementChoiseCase = { id: string, label: string, description?: string, elements: { [name: string]: ViewElement }  };
123
124 export type ViewElementChoise = ViewElementBase & {
125   "uiType": "choise";
126   "cases": {
127     [name: string]: ViewElementChoiseCase;
128   }
129 }
130
131 // https://tools.ietf.org/html/rfc7950#section-7.14.1
132 export type ViewElementRpc = ViewElementBase & {
133   "uiType": "rpc";
134   "inputViewId"?: string;
135   "outputViewId"?: string;
136 }
137
138 export type ViewElementEmpty = ViewElementBase & {
139   "uiType": "empty";
140 }
141
142 export type ViewElement =
143   | ViewElementEmpty
144   | ViewElementBits
145   | ViewElementBinary
146   | ViewElementString
147   | ViewElementDate
148   | ViewElementNumber
149   | ViewElementBoolean
150   | ViewElementObject
151   | ViewElementList
152   | ViewElementSelection
153   | ViewElementReference
154   | ViewElementUnion
155   | ViewElementChoise
156   | ViewElementRpc;
157
158 export const isViewElementString = (viewElement: ViewElement): viewElement is ViewElementString => {
159   return viewElement && (viewElement.uiType === "string" || viewElement.uiType === "date");
160 }
161
162 export const isViewElementDate = (viewElement: ViewElement): viewElement is ViewElementDate => {
163   return viewElement && (viewElement.uiType === "date");
164 }
165
166 export const isViewElementNumber = (viewElement: ViewElement): viewElement is ViewElementNumber => {
167   return viewElement && viewElement.uiType === "number";
168 }
169
170 export const isViewElementBoolean = (viewElement: ViewElement): viewElement is ViewElementBoolean => {
171   return viewElement && viewElement.uiType === "boolean";
172 }
173
174 export const isViewElementObject = (viewElement: ViewElement): viewElement is ViewElementObject => {
175   return viewElement && viewElement.uiType === "object" && viewElement.isList === false;
176 }
177
178 export const isViewElementList = (viewElement: ViewElement): viewElement is ViewElementList => {
179   return viewElement && viewElement.uiType === "object" && viewElement.isList === true;
180 }
181
182 export const isViewElementObjectOrList = (viewElement: ViewElement): viewElement is ViewElementObject | ViewElementList => {
183   return viewElement && viewElement.uiType === "object";
184 }
185
186 export const isViewElementSelection = (viewElement: ViewElement): viewElement is ViewElementSelection => {
187   return viewElement && viewElement.uiType === "selection";
188 }
189
190 export const isViewElementReference = (viewElement: ViewElement): viewElement is ViewElementReference => {
191   return viewElement && viewElement.uiType === "reference";
192 }
193
194 export const isViewElementUnion = (viewElement: ViewElement): viewElement is ViewElementUnion => {
195   return viewElement && viewElement.uiType === "union";
196 }
197
198 export const isViewElementChoise = (viewElement: ViewElement): viewElement is ViewElementChoise => {
199   return viewElement && viewElement.uiType === "choise";
200 }
201
202 export const isViewElementRpc = (viewElement: ViewElement): viewElement is ViewElementRpc => {
203   return viewElement && viewElement.uiType === "rpc";
204 }
205
206 export const isViewElementEmpty = (viewElement: ViewElement): viewElement is ViewElementRpc => {
207   return viewElement && viewElement.uiType === "empty";
208 }
209
210 export const ResolveFunction = Symbol("IsResolved");
211
212 export type ViewSpecification = {
213   "id": string;
214   "ns"?: string;
215   "name"?: string;
216   "title"?: string;
217   "parentView"?: string;
218   "language": string;
219   "ifFeature"?: string;
220   "when"?: string;
221   "uses"?: (string[]) & { [ResolveFunction]?: (parent: string) => void };
222   "elements": { [name: string]: ViewElement };
223   "config": boolean;
224   readonly "canEdit": boolean;
225 }
226
227 export type YangRange = {
228   min: number,
229   max: number,
230 }
231
232 export type Expression<T> =
233   | T
234   | Operator<T>;
235
236 export type Operator<T> = {
237   operation: "AND" | "OR";
238   arguments: Expression<T>[];
239 }