Merge "SDN-R Sodium compliant mountpoint-registrar"
[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   "config": boolean;
23   "ifFeature"?: string;
24   "when"?: string;
25   "mandatory"?: boolean;
26   "description"?: string;
27   "isList"?: boolean;
28   "default"?: string;
29   "status"?: "current" | "deprecated" | "obsolete",
30   "reference"?: string, // https://tools.ietf.org/html/rfc7950#section-7.21.4
31 }
32
33 // https://tools.ietf.org/html/rfc7950#section-9.8
34 export type ViewElementBinary = ViewElementBase & {
35   "uiType": "binary";
36   "length"?: Expression<YangRange>;  // number of octets
37 }
38
39 // https://tools.ietf.org/html/rfc7950#section-9.7.4
40 export type ViewElementBits = ViewElementBase & {
41   "uiType": "bits";
42   "flags": {
43     [name: string]: number | undefined;    // 0 - 4294967295
44   }
45 }
46
47 // https://tools.ietf.org/html/rfc7950#section-9
48 export type ViewElementString = ViewElementBase & {
49   "uiType": "string";
50   "pattern"?: Expression<RegExp>;
51   "length"?: Expression<YangRange>;
52   "invertMatch"?: true;
53 }
54
55 // https://tools.ietf.org/html/rfc7950#section-9.3
56 export type ViewElementNumber = ViewElementBase & {
57   "uiType": "number";
58   "min": number;
59   "max": number;
60   "range"?: Expression<YangRange>;
61   "units"?: string;
62   "format"?: string;
63   "fDigits"?: number;
64 }
65
66 // https://tools.ietf.org/html/rfc7950#section-9.5
67 export type ViewElementBoolean = ViewElementBase & {
68   "uiType": "boolean";
69   "trueValue"?: string;
70   "falseValue"?: string;
71 }
72
73 // https://tools.ietf.org/html/rfc7950#section-9.6.4
74 export type ViewElementSelection = ViewElementBase & {
75   "uiType": "selection";
76   "multiSelect"?: boolean
77   "options": {
78     "key": string;
79     "value": string;
80     "description"?: string,
81     "status"?: "current" | "deprecated" | "obsolete",
82     "reference"?: string,
83   }[];
84 }
85
86 // is a list if isList is true ;-)
87 export type ViewElementObject = ViewElementBase & {
88   "uiType": "object";
89   "isList"?: false;
90   "viewId": string;
91 }
92
93 // Hint: read only lists do not need a key
94 export type ViewElementList = (ViewElementBase & {
95   "uiType": "object";
96   "isList": true;
97   "viewId": string;
98   "key"?: string;
99 });
100
101 export type ViewElementReference = ViewElementBase & {
102   "uiType": "reference";
103   "referencePath": string;
104   "ref": (currentPath: string) => ViewElement | null;
105 }
106
107 export type ViewElementUnion = ViewElementBase & {
108   "uiType": "union";
109   "elements": ViewElement[];
110 }
111
112 export type ViewElementChoiseCase = { id: string, label: string, description?: string, elements: { [name: string]: ViewElement }  };
113
114 export type ViewElementChoise = ViewElementBase & {
115   "uiType": "choise";
116   "cases": {
117     [name: string]: ViewElementChoiseCase;
118   }
119 }
120
121 // https://tools.ietf.org/html/rfc7950#section-7.14.1
122 export type ViewElementRpc = ViewElementBase & {
123   "uiType": "rpc";
124   "inputViewId"?: string;
125   "outputViewId"?: string;
126 }
127
128 export type ViewElementEmpty = ViewElementBase & {
129   "uiType": "empty";
130 }
131
132 export type ViewElement =
133   | ViewElementEmpty
134   | ViewElementBits
135   | ViewElementBinary
136   | ViewElementString
137   | ViewElementNumber
138   | ViewElementBoolean
139   | ViewElementObject
140   | ViewElementList
141   | ViewElementSelection
142   | ViewElementReference
143   | ViewElementUnion
144   | ViewElementChoise
145   | ViewElementRpc;
146
147 export const isViewElementString = (viewElement: ViewElement): viewElement is ViewElementString => {
148   return viewElement && viewElement.uiType === "string";
149 }
150
151 export const isViewElementNumber = (viewElement: ViewElement): viewElement is ViewElementNumber => {
152   return viewElement && viewElement.uiType === "number";
153 }
154
155 export const isViewElementBoolean = (viewElement: ViewElement): viewElement is ViewElementBoolean => {
156   return viewElement && viewElement.uiType === "boolean";
157 }
158
159 export const isViewElementObject = (viewElement: ViewElement): viewElement is ViewElementObject => {
160   return viewElement && viewElement.uiType === "object" && viewElement.isList === false;
161 }
162
163 export const isViewElementList = (viewElement: ViewElement): viewElement is ViewElementList => {
164   return viewElement && viewElement.uiType === "object" && viewElement.isList === true;
165 }
166
167 export const isViewElementObjectOrList = (viewElement: ViewElement): viewElement is ViewElementObject | ViewElementList => {
168   return viewElement && viewElement.uiType === "object";
169 }
170
171 export const isViewElementSelection = (viewElement: ViewElement): viewElement is ViewElementSelection => {
172   return viewElement && viewElement.uiType === "selection";
173 }
174
175 export const isViewElementReference = (viewElement: ViewElement): viewElement is ViewElementReference => {
176   return viewElement && viewElement.uiType === "reference";
177 }
178
179 export const isViewElementUnion = (viewElement: ViewElement): viewElement is ViewElementUnion => {
180   return viewElement && viewElement.uiType === "union";
181 }
182
183 export const isViewElementChoise = (viewElement: ViewElement): viewElement is ViewElementChoise => {
184   return viewElement && viewElement.uiType === "choise";
185 }
186
187 export const isViewElementRpc = (viewElement: ViewElement): viewElement is ViewElementRpc => {
188   return viewElement && viewElement.uiType === "rpc";
189 }
190
191 export const isViewElementEmpty = (viewElement: ViewElement): viewElement is ViewElementRpc => {
192   return viewElement && viewElement.uiType === "empty";
193 }
194
195 export const ResolveFunction = Symbol("IsResolved");
196
197 export type ViewSpecification = {
198   "id": string;
199   "name"?: string;
200   "title"?: string;
201   "parentView"?: string;
202   "language": string;
203   "ifFeature"?: string;
204   "when"?: string;
205   "uses"?: (string[]) & { [ResolveFunction]?: () => void };
206   "elements": { [name: string]: ViewElement };
207   readonly "canEdit": boolean;
208 }
209
210 export type YangRange = {
211   min: number,
212   max: number,
213 }
214
215 export type Expression<T> =
216   | T
217   | Operator<T>;
218
219 export type Operator<T> = {
220   operation: "AND" | "OR";
221   arguments: Expression<T>[];
222 }