SDN-R add updated odlux
[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 ViewElementChoise = ViewElementBase & {
113   "uiType": "choise";
114   "cases": { [name: string]: { id: string, label: string, description?: string, elements: { [name: string]: ViewElement } } };
115 }
116
117 export type ViewElement =
118   | ViewElementBits
119   | ViewElementBinary
120   | ViewElementString
121   | ViewElementNumber
122   | ViewElementBoolean
123   | ViewElementObject
124   | ViewElementList
125   | ViewElementSelection
126   | ViewElementReference
127   | ViewElementUnion
128   | ViewElementChoise;
129
130 export const isViewElementString = (viewElement: ViewElement): viewElement is ViewElementString => {
131   return viewElement && viewElement.uiType === "string";
132 }
133
134 export const isViewElementNumber = (viewElement: ViewElement): viewElement is ViewElementNumber => {
135   return viewElement && viewElement.uiType === "number";
136 }
137
138 export const isViewElementBoolean = (viewElement: ViewElement): viewElement is ViewElementBoolean => {
139   return viewElement && viewElement.uiType === "boolean";
140 }
141
142 export const isViewElementObject = (viewElement: ViewElement): viewElement is ViewElementObject => {
143   return viewElement && viewElement.uiType === "object" && viewElement.isList === false;
144 }
145
146 export const isViewElementList = (viewElement: ViewElement): viewElement is ViewElementList => {
147   return viewElement && viewElement.uiType === "object" && viewElement.isList === true;
148 }
149
150 export const isViewElementObjectOrList = (viewElement: ViewElement): viewElement is ViewElementObject | ViewElementList => {
151   return viewElement && viewElement.uiType === "object";
152 }
153
154 export const isViewElementSelection = (viewElement: ViewElement): viewElement is ViewElementSelection => {
155   return viewElement && viewElement.uiType === "selection";
156 }
157
158 export const isViewElementReference = (viewElement: ViewElement): viewElement is ViewElementReference => {
159   return viewElement && viewElement.uiType === "reference";
160 }
161
162 export const isViewElementUnion = (viewElement: ViewElement): viewElement is ViewElementUnion => {
163   return viewElement && viewElement.uiType === "union";
164 }
165
166 export const isViewElementChoise = (viewElement: ViewElement): viewElement is ViewElementChoise => {
167   return viewElement && viewElement.uiType === "choise";
168 }
169
170
171 export type ViewSpecification = {
172   "id": string;
173   "name": string;
174   "title"?: string;
175   "parentView"?: string;
176   "language": string;
177   "ifFeature"?: string;
178   "when"?: string;
179   "uses"?: string[];
180   "elements": { [name: string]: ViewElement };
181   readonly "canEdit": boolean;
182 }
183
184 export type YangRange = {
185   min: number,
186   max: number,
187 }
188
189 export type Expression<T> =
190   | T
191   | Operator<T>;
192
193 export type Operator<T> = {
194   operation: "AND" | "OR";
195   arguments: Expression<T>[];
196 }