82055a761f2bd3c2400a3ff42825fb8d04c60f48
[ccsdk/features.git] / sdnr / wt / odlux / apps / configurationApp / src / actions / configurationActions.ts
1 import { Action } from '../../../../framework/src/flux/action';
2 import { Dispatch } from '../../../../framework/src/flux/store';
3
4 import { CoreModelNetworkElement, LpResponse } from '../models/coreModel';
5 import configurationService, { getValueByName } from '../services/configurationService';
6 import { ViewSpecification } from 'models/uiModels';
7 import { IApplicationStoreState } from '../../../../framework/src/store/applicationStore';
8 import { AddSnackbarNotification } from '../../../../framework/src/actions/snackbarActions';
9
10 export class ConfigurationApplicationBaseAction extends Action { }
11
12 export class UpdateLoading extends ConfigurationApplicationBaseAction {
13   constructor (public loading: boolean) {
14     super();
15
16   }
17 }
18
19 export class UpdateCoreModel extends ConfigurationApplicationBaseAction {
20   constructor (public nodeId?: string, public coreModel?: CoreModelNetworkElement) {
21     super();
22
23   }
24 }
25
26 export class UpdateLp extends ConfigurationApplicationBaseAction {
27   constructor (public lpId?: string, public capability?: string, public conditionalPackage?: string, public viewSpecifications: ViewSpecification[] = []) {
28     super();
29
30   }
31 }
32
33 export class UpdateViewData extends ConfigurationApplicationBaseAction {
34   constructor (public viewId?: string, public indexValues: string = "", public viewData: {} = {}) {
35     super();
36
37   }
38 }
39
40
41 export const updateMountIdAsyncActionCreator = (nodeId: string | undefined) => async (dispatch: Dispatch) => {
42   if (!nodeId) {
43     dispatch(new UpdateCoreModel());
44     return;
45   }
46   dispatch(new UpdateLoading(true));
47   const coreModel = await configurationService.getCoreModelByNodeId(nodeId);
48   dispatch(new UpdateLoading(false));
49
50   return coreModel
51     ? dispatch(new UpdateCoreModel(nodeId, coreModel))
52     : dispatch(new UpdateCoreModel());
53 }
54
55 export const updateLpIdAsyncActionCreator = (lpId: string | undefined) => async (dispatch: Dispatch, getState: () => IApplicationStoreState) => {
56   const { configuration: { coreModel: coreModel, nodeId: nodeId } } = getState();
57   if (! nodeId || !lpId || !coreModel) {
58     dispatch(new UpdateLp());
59     return;
60   }
61
62   // find the lp with its unique uuid
63   let lpData: LpResponse | null = null;
64   for (let ltp of coreModel.ltp) {
65     const lp = ltp.lp.find(pl => pl.uuid === lpId);
66     if (lp) {
67       lpData = lp;
68       break;
69     }
70   }
71
72   // urn:onf:params:xml:ns:yang:microwave-model?module=microwave-model => microwave-model
73   let capability: string | null = lpData && getValueByName("capability", lpData.extension, null);
74   if (capability) {
75     const paramIndex = capability.indexOf('?');
76     if (paramIndex > -1) {
77       capability = capability.slice(paramIndex+1);
78     }
79     const params = capability.split("&").map(p => (p || "=").split("="));
80     const capParam = params.find(p => p[0] === "module") || null;
81     capability = capParam && capParam[1] || null;
82   }
83
84   const revision: string | null = lpData && getValueByName("revision", lpData.extension, null);
85   const conditionalPackage: string | null = lpData && getValueByName("conditional-package", lpData.extension, null);
86
87   dispatch(new UpdateLoading(true));
88   const viewSpecifications = capability && await configurationService.getUIDescriptionByCapability(capability, revision) || [];
89   dispatch(new UpdateLoading(false));
90
91   return coreModel ?
92     dispatch(new UpdateLp(lpId, capability || undefined, conditionalPackage || undefined, viewSpecifications)) :
93     dispatch(new UpdateLp());
94 }
95
96 export const updateViewDataAsyncActionCreator = (viewId: string | undefined, indexValues: string[] = []) => async (dispatch: Dispatch, getState: () => IApplicationStoreState) => {
97   const { configuration: { nodeId, lpId, capability, conditionalPackage, viewSpecifications } } = getState();
98   if (!viewId || !capability || !nodeId || !lpId || !conditionalPackage) {
99     dispatch(new AddSnackbarNotification({ message: `Error invalid parameter !${JSON.stringify({viewId ,capability ,nodeId ,lpId ,conditionalPackage}, null,2)}`, options: { variant: 'error' } }));
100     dispatch(new UpdateViewData());
101     return;
102   }
103
104   const viewSpecification = viewSpecifications.find(desc => desc.id === viewId);
105   if (!viewSpecification) {
106     dispatch(new AddSnackbarNotification({ message: `Error viewId ${viewId} not found !`, options: { variant: 'error' } }));
107     dispatch(new UpdateViewData());
108     return;
109   }
110
111   const url = viewSpecification.url.replace(/\$\$NODEID\$\$/g, nodeId).replace(/\$\$LPUUID\$\$/g, lpId);
112
113   dispatch(new UpdateLoading(true));
114   const data = capability && await configurationService.getViewData(url) || { };
115   dispatch(new UpdateLoading(false));
116
117   let viewData: { [path: string]: {} } = data;
118
119   const pathElements = viewSpecification.dataPath &&
120     viewSpecification.dataPath.replace(
121       /\/\$\$INDEX:(\d+):?([a-z\-]+)?\$\$/ig,
122       (_, indexStr, keyStr) => {
123         const index = +indexStr;
124         return indexValues[index] && '/' + indexValues[index] || '';
125       }).split("/") || [];
126
127   for (let path of pathElements) {
128     if (path === "") {
129       break;
130     }
131     viewData = viewData[path];
132   }
133
134   return viewData ?
135     dispatch(new UpdateViewData(viewId, indexValues.length > 0 ? indexValues.join("/") : "", viewData)) :
136     dispatch(new UpdateViewData());
137 }