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