update odlux for notification change
[ccsdk/features.git] / sdnr / wt / odlux / apps / configurationApp / src / models / uiModels.ts
index 69a807a..29484d8 100644 (file)
  * the License.
  * ============LICENSE_END==========================================================================
  */
-export interface AccessFlags {
-  "read": boolean,
-  "write": boolean,
-  "create": boolean
-}
 
-export interface ViewElementBase {
+export type ViewElementBase = {
   "id": string;
   "label": string;
-  "viewId": string;
-  "leafrefPath": string;
-  "accessFlags": AccessFlags;
-  "description": string;
+  "module": string;
+  "path": string;
+  "config": boolean;
+  "ifFeature"?: string;
+  "when"?: string;
+  "mandatory"?: boolean;
+  "description"?: string;
+  "isList"?: boolean;
+  "default"?: string;
+  "status"?: "current" | "deprecated" | "obsolete",
+  "reference"?: string, // https://tools.ietf.org/html/rfc7950#section-7.21.4
+}
+
+// https://tools.ietf.org/html/rfc7950#section-9.8
+export type ViewElementBinary = ViewElementBase & {
+  "uiType": "binary";
+  "length"?: Expression<YangRange>;  // number of octets
 }
 
-export interface ViewElementString extends ViewElementBase {
+// https://tools.ietf.org/html/rfc7950#section-9.7.4
+export type ViewElementBits = ViewElementBase & {
+  "uiType": "bits";
+  "flags": {
+    [name: string]: number | undefined;    // 0 - 4294967295
+  }
+}
+
+// https://tools.ietf.org/html/rfc7950#section-9
+export type ViewElementString = ViewElementBase & {
   "uiType": "string";
+  "pattern"?: Expression<RegExp>;
+  "length"?: Expression<YangRange>;
+  "invertMatch"?: true;
+}
+
+// special case derived from 
+export type ViewElementDate = ViewElementBase & {
+  "uiType": "date";
+  "pattern"?: Expression<RegExp>;
+  "length"?: Expression<YangRange>;
+  "invertMatch"?: true;
 }
 
-export interface ViewElementNumber extends ViewElementBase {
+// https://tools.ietf.org/html/rfc7950#section-9.3
+export type ViewElementNumber = ViewElementBase & {
   "uiType": "number";
-  "min"?: number;
-  "max"?: number;
-  "unit"?: string;
+  "min": number;
+  "max": number;
+  "range"?: Expression<YangRange>;
+  "units"?: string;
   "format"?: string;
+  "fDigits"?: number;
 }
 
-export interface ViewElementBoolean extends ViewElementBase {
+// https://tools.ietf.org/html/rfc7950#section-9.5
+export type ViewElementBoolean = ViewElementBase & {
   "uiType": "boolean";
   "trueValue"?: string;
   "falseValue"?: string;
 }
 
-export interface ViewElementObject extends ViewElementBase {
+// https://tools.ietf.org/html/rfc7950#section-9.6.4
+export type ViewElementSelection = ViewElementBase & {
+  "uiType": "selection";
+  "multiSelect"?: boolean
+  "options": {
+    "key": string;
+    "value": string;
+    "description"?: string,
+    "status"?: "current" | "deprecated" | "obsolete",
+    "reference"?: string,
+  }[];
+}
+
+// is a list if isList is true ;-)
+export type ViewElementObject = ViewElementBase & {
   "uiType": "object";
+  "isList"?: false;
   "viewId": string;
 }
 
-export interface ViewElementSelection extends ViewElementBase {
-  "uiType": "selection";
-  "multiSelect"?: boolean
-  "options": {
-    "key": string,
-    "value": string,
-    "description": string
-  }[],
+// Hint: read only lists do not need a key
+export type ViewElementList = (ViewElementBase & {
+  "uiType": "object";
+  "isList": true;
+  "viewId": string;
+  "key"?: string;
+});
+
+export type ViewElementReference = ViewElementBase & {
+  "uiType": "reference";
+  "referencePath": string;
+  "ref": (currentPath: string) => [ViewElement , string] | undefined;
 }
 
-export interface ViewElementList extends ViewElementBase {
-  "uiType": "list",
-  "listType": "object" | "string" | "number",
-  "viewId": string,
+export type ViewElementUnion = ViewElementBase & {
+  "uiType": "union";
+  "elements": ViewElement[];
+}
+
+export type ViewElementChoiseCase = { id: string, label: string, description?: string, elements: { [name: string]: ViewElement }  };
+
+export type ViewElementChoise = ViewElementBase & {
+  "uiType": "choise";
+  "cases": {
+    [name: string]: ViewElementChoiseCase;
+  }
+}
+
+// https://tools.ietf.org/html/rfc7950#section-7.14.1
+export type ViewElementRpc = ViewElementBase & {
+  "uiType": "rpc";
+  "inputViewId"?: string;
+  "outputViewId"?: string;
+}
+
+export type ViewElementEmpty = ViewElementBase & {
+  "uiType": "empty";
 }
 
 export type ViewElement =
+  | ViewElementEmpty
+  | ViewElementBits
+  | ViewElementBinary
   | ViewElementString
+  | ViewElementDate
   | ViewElementNumber
   | ViewElementBoolean
   | ViewElementObject
+  | ViewElementList
   | ViewElementSelection
-  | ViewElementList;
+  | ViewElementReference
+  | ViewElementUnion
+  | ViewElementChoise
+  | ViewElementRpc;
+
+export const isViewElementString = (viewElement: ViewElement): viewElement is ViewElementString => {
+  return viewElement && (viewElement.uiType === "string" || viewElement.uiType === "date");
+}
+
+export const isViewElementDate = (viewElement: ViewElement): viewElement is ViewElementDate => {
+  return viewElement && (viewElement.uiType === "date");
+}
+
+export const isViewElementNumber = (viewElement: ViewElement): viewElement is ViewElementNumber => {
+  return viewElement && viewElement.uiType === "number";
+}
+
+export const isViewElementBoolean = (viewElement: ViewElement): viewElement is ViewElementBoolean => {
+  return viewElement && viewElement.uiType === "boolean";
+}
+
+export const isViewElementObject = (viewElement: ViewElement): viewElement is ViewElementObject => {
+  return viewElement && viewElement.uiType === "object" && viewElement.isList === false;
+}
+
+export const isViewElementList = (viewElement: ViewElement): viewElement is ViewElementList => {
+  return viewElement && viewElement.uiType === "object" && viewElement.isList === true;
+}
+
+export const isViewElementObjectOrList = (viewElement: ViewElement): viewElement is ViewElementObject | ViewElementList => {
+  return viewElement && viewElement.uiType === "object";
+}
+
+export const isViewElementSelection = (viewElement: ViewElement): viewElement is ViewElementSelection => {
+  return viewElement && viewElement.uiType === "selection";
+}
+
+export const isViewElementReference = (viewElement: ViewElement): viewElement is ViewElementReference => {
+  return viewElement && viewElement.uiType === "reference";
+}
 
-export interface ViewSpecification {
+export const isViewElementUnion = (viewElement: ViewElement): viewElement is ViewElementUnion => {
+  return viewElement && viewElement.uiType === "union";
+}
+
+export const isViewElementChoise = (viewElement: ViewElement): viewElement is ViewElementChoise => {
+  return viewElement && viewElement.uiType === "choise";
+}
+
+export const isViewElementRpc = (viewElement: ViewElement): viewElement is ViewElementRpc => {
+  return viewElement && viewElement.uiType === "rpc";
+}
+
+export const isViewElementEmpty = (viewElement: ViewElement): viewElement is ViewElementRpc => {
+  return viewElement && viewElement.uiType === "empty";
+}
+
+export const ResolveFunction = Symbol("IsResolved");
+
+export type ViewSpecification = {
   "id": string;
-  "parentView": string;
-  "name": string;
-  "language": string;
+  "ns"?: string;
+  "name"?: string;
   "title"?: string;
-  "url": string;
-  "dataPath": string;
-  "elements": ViewElement[];
+  "parentView"?: string;
+  "language": string;
+  "ifFeature"?: string;
+  "when"?: string;
+  "uses"?: (string[]) & { [ResolveFunction]?: (parent: string) => void };
+  "elements": { [name: string]: ViewElement };
+  "config": boolean;
+  readonly "canEdit": boolean;
 }
 
+export type YangRange = {
+  min: number,
+  max: number,
+}
+
+export type Expression<T> =
+  | T
+  | Operator<T>;
+
+export type Operator<T> = {
+  operation: "AND" | "OR";
+  arguments: Expression<T>[];
+}
\ No newline at end of file