1 import { Action } from '../../../../framework/src/flux/action';
2 import { Dispatch } from '../../../../framework/src/flux/store';
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';
10 export class ConfigurationApplicationBaseAction extends Action { }
12 export class UpdateLoading extends ConfigurationApplicationBaseAction {
13 constructor (public loading: boolean) {
19 export class UpdateCoreModel extends ConfigurationApplicationBaseAction {
20 constructor (public nodeId?: string, public coreModel?: CoreModelNetworkElement) {
26 export class UpdateLp extends ConfigurationApplicationBaseAction {
27 constructor (public lpId?: string, public capability?: string, public conditionalPackage?: string, public viewSpecifications: ViewSpecification[] = []) {
33 export class UpdateViewData extends ConfigurationApplicationBaseAction {
34 constructor (public viewId?: string, public indexValues: string = "", public viewData: {} = {}) {
41 export const updateMountIdAsyncActionCreator = (nodeId: string | undefined) => async (dispatch: Dispatch) => {
43 dispatch(new UpdateCoreModel());
46 dispatch(new UpdateLoading(true));
47 const coreModel = await configurationService.getCoreModelByNodeId(nodeId);
48 dispatch(new UpdateLoading(false));
51 ? dispatch(new UpdateCoreModel(nodeId, coreModel))
52 : dispatch(new UpdateCoreModel());
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());
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);
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);
75 const paramIndex = capability.indexOf('?');
76 if (paramIndex > -1) {
77 capability = capability.slice(paramIndex+1);
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;
84 const revision: string | null = lpData && getValueByName("revision", lpData.extension, null);
85 const conditionalPackage: string | null = lpData && getValueByName("conditional-package", lpData.extension, null);
87 dispatch(new UpdateLoading(true));
88 const viewSpecifications = capability && await configurationService.getUIDescriptionByCapability(capability, revision) || [];
89 dispatch(new UpdateLoading(false));
92 dispatch(new UpdateLp(lpId, capability || undefined, conditionalPackage || undefined, viewSpecifications)) :
93 dispatch(new UpdateLp());
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());
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());
111 const url = viewSpecification.url.replace(/\$\$NODEID\$\$/g, nodeId).replace(/\$\$LPUUID\$\$/g, lpId);
113 dispatch(new UpdateLoading(true));
114 const data = capability && await configurationService.getViewData(url) || { };
115 dispatch(new UpdateLoading(false));
117 let viewData: { [path: string]: {} } = data;
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] || '';
127 for (let path of pathElements) {
131 viewData = viewData[path];
135 dispatch(new UpdateViewData(viewId, indexValues.length > 0 ? indexValues.join("/") : "", viewData)) :
136 dispatch(new UpdateViewData());