diff options
Diffstat (limited to 'sdnr/wt/odlux/apps/configurationApp')
6 files changed, 53 insertions, 19 deletions
diff --git a/sdnr/wt/odlux/apps/configurationApp/policies.json b/sdnr/wt/odlux/apps/configurationApp/policies.json new file mode 100644 index 000000000..cd9e9fc15 --- /dev/null +++ b/sdnr/wt/odlux/apps/configurationApp/policies.json @@ -0,0 +1,12 @@ +[ + { + "path": "/**/operations/cluster-admin**", + "actions": { + "get": true, + "post": true, + "put": true, + "patch": true, + "delete": true + } + } +]
\ No newline at end of file diff --git a/sdnr/wt/odlux/apps/configurationApp/src/actions/deviceActions.ts b/sdnr/wt/odlux/apps/configurationApp/src/actions/deviceActions.ts index e528effab..d6283852c 100644 --- a/sdnr/wt/odlux/apps/configurationApp/src/actions/deviceActions.ts +++ b/sdnr/wt/odlux/apps/configurationApp/src/actions/deviceActions.ts @@ -35,7 +35,7 @@ export class UpdateDeviceDescription extends Action { } export class UpdatViewDescription extends Action { - constructor (public vPath: string, public viewData: any, public displaySpecification: DisplaySpecification = { displayMode: DisplayModeType.doNotDisplay } ) { + constructor (public vPath: string, public viewData: any, public displaySpecification: DisplaySpecification = { displayMode: DisplayModeType.doNotDisplay }) { super(); } } @@ -437,7 +437,7 @@ export const updateViewActionAsyncCreator = (vPath: string) => async (dispatch: } }); } - + // create display specification const ds: DisplaySpecification = viewElement! && viewElement!.uiType === "rpc" ? { @@ -449,6 +449,7 @@ export const updateViewActionAsyncCreator = (vPath: string) => async (dispatch: displayMode: extractList ? DisplayModeType.displayAsList : DisplayModeType.displayAsObject, viewSpecification: resolveViewDescription(defaultNS, vPath, viewSpecification), keyProperty: isViewElementList(viewElement!) && viewElement.key || undefined, + apidocPath: isViewElementList(viewElement!) && `/apidoc/explorer/index.html?urls.primaryName=$$$standard$$$#/mounted%20${nodeId}%20${viewElement!.module || 'MODULE_NOT_DEFINED'}/$$$action$$$_${dataPath.replace(/^\//,'').replace(/[\/=\-\:]/g,'_')}_${viewElement! != null ? `${viewElement.id.replace(/[\/=\-\:]/g,'_')}_` : '' }` || undefined, }; // update display specification diff --git a/sdnr/wt/odlux/apps/configurationApp/src/handlers/viewDescriptionHandler.ts b/sdnr/wt/odlux/apps/configurationApp/src/handlers/viewDescriptionHandler.ts index 69710b9e9..ea2036415 100644 --- a/sdnr/wt/odlux/apps/configurationApp/src/handlers/viewDescriptionHandler.ts +++ b/sdnr/wt/odlux/apps/configurationApp/src/handlers/viewDescriptionHandler.ts @@ -33,7 +33,8 @@ export type DisplaySpecification = { } | { displayMode: DisplayModeType.displayAsObject | DisplayModeType.displayAsList ; viewSpecification: ViewSpecification; - keyProperty: string | undefined; + keyProperty?: string; + apidocPath?: string; } | { displayMode: DisplayModeType.displayAsRPC; inputViewSpecification?: ViewSpecification; diff --git a/sdnr/wt/odlux/apps/configurationApp/src/index.html b/sdnr/wt/odlux/apps/configurationApp/src/index.html index 759b7b535..78fff78c5 100644 --- a/sdnr/wt/odlux/apps/configurationApp/src/index.html +++ b/sdnr/wt/odlux/apps/configurationApp/src/index.html @@ -19,6 +19,7 @@ connectApp.register(); configurationApp.register(); maintenanceApp.register(); + app("./app.tsx").configureApplication({ authentication:"oauth", enablePolicy: true,}); app("./app.tsx").runApplication(); }); </script> diff --git a/sdnr/wt/odlux/apps/configurationApp/src/views/configurationApplication.tsx b/sdnr/wt/odlux/apps/configurationApp/src/views/configurationApplication.tsx index 45b3081c2..dbaa77874 100644 --- a/sdnr/wt/odlux/apps/configurationApp/src/views/configurationApplication.tsx +++ b/sdnr/wt/odlux/apps/configurationApp/src/views/configurationApplication.tsx @@ -33,6 +33,7 @@ import { ViewSpecification, isViewElementString, isViewElementNumber, isViewElem import Fab from '@material-ui/core/Fab'; import AddIcon from '@material-ui/icons/Add'; +import PostAdd from '@material-ui/icons/PostAdd'; import ArrowBack from '@material-ui/icons/ArrowBack'; import RemoveIcon from '@material-ui/icons/RemoveCircleOutline'; import SaveIcon from '@material-ui/icons/Save'; @@ -545,8 +546,11 @@ class ConfigurationApplicationComponent extends React.Component<ConfigurationApp ); }; - private renderUIViewList(listSpecification: ViewSpecification, listKeyProperty: string, listData: { [key: string]: any }[]) { + private renderUIViewList(listSpecification: ViewSpecification, listKeyProperty: string, apiDocPath: string, listData: { [key: string]: any }[]) { const listElements = listSpecification.elements; + const apiDocPathCreate = apiDocPath ? `${location.origin}${apiDocPath + .replace("$$$standard$$$","topology-netconfnode%20resources%20-%20RestConf%20RFC%208040") + .replace("$$$action$$$","put")}_${listKeyProperty.replace(/[\/=\-\:]/g,'_')}_` : undefined; const navigate = (path: string) => { this.props.history.push(`${this.props.match.url}${path}`); @@ -558,6 +562,12 @@ class ConfigurationApplicationComponent extends React.Component<ConfigurationApp } }; + const addWithApiDocElementAction = { + icon: PostAdd, tooltip: 'Add', onClick: () => { + window.open(apiDocPathCreate, '_blank'); + } + }; + const { classes, removeElement } = this.props; const DeleteIconWithConfirmation: React.FC<{ rowData: { [key: string]: any }, onReload: () => void }> = (props) => { @@ -580,7 +590,7 @@ class ConfigurationApplicationComponent extends React.Component<ConfigurationApp } return ( - <SelectElementTable stickyHeader idProperty={listKeyProperty} rows={listData} customActionButtons={[addNewElementAction]} columns={ + <SelectElementTable stickyHeader idProperty={listKeyProperty} rows={listData} customActionButtons={apiDocPathCreate ? [addNewElementAction, addWithApiDocElementAction] : [addNewElementAction]} columns={ Object.keys(listElements).reduce<ColumnModel<{ [key: string]: any }>[]>((acc, cur) => { const elm = listElements[cur]; if (elm.uiType !== "object" && listData.every(entry => entry[elm.label] != null)) { @@ -790,7 +800,7 @@ class ConfigurationApplicationComponent extends React.Component<ConfigurationApp {ds.displayMode === DisplayModeType.doNotDisplay ? null : ds.displayMode === DisplayModeType.displayAsList && viewData instanceof Array - ? this.renderUIViewList(ds.viewSpecification, ds.keyProperty!, viewData) + ? this.renderUIViewList(ds.viewSpecification, ds.keyProperty!, ds.apidocPath!, viewData) : ds.displayMode === DisplayModeType.displayAsRPC ? this.renderUIViewRPC(ds.inputViewSpecification, viewData!, outputData, undefined, true, false) : this.renderUIViewSelector(ds.viewSpecification, viewData!, ds.keyProperty, editMode, isNew) diff --git a/sdnr/wt/odlux/apps/configurationApp/webpack.config.js b/sdnr/wt/odlux/apps/configurationApp/webpack.config.js index 6349305ac..e3f3b6f19 100644 --- a/sdnr/wt/odlux/apps/configurationApp/webpack.config.js +++ b/sdnr/wt/odlux/apps/configurationApp/webpack.config.js @@ -11,6 +11,8 @@ const webpack = require("webpack"); const CopyWebpackPlugin = require("copy-webpack-plugin"); const TerserPlugin = require('terser-webpack-plugin'); +const policies = require('./policies.json'); + // const __dirname = (path => path.replace(/^([a-z]\:)/, c => c.toUpperCase()))(process.__dirname()); module.exports = (env) => { @@ -128,47 +130,54 @@ module.exports = (env) => { stats: { colors: true }, + before: function(app, server, compiler) { + app.get('/oauth/policies',(_, res) => res.json(policies)); + }, proxy: { "/about": { - // target: "http://10.20.6.29:48181", - target: "http://localhost:8181", + target: "http://localhost:18181", secure: false }, "/yang-schema/": { - target: "http://localhost:8181", + target: "http://localhost:18181", secure: false }, - "/oauth2/": { - // target: "https://10.20.35.188:30205", - target: "http://localhost:8181", + "/oauth/": { + target: "http://localhost:18181", secure: false }, "/database/": { - target: "http://localhost:8181", + target: "http://localhost:18181", secure: false }, "/restconf/": { - target: "http://localhost:8181", + target: "http://localhost:18181", secure: false }, "/rests/": { - target: "http://localhost:8181", + target: "http://localhost:18181", secure: false }, "/help/": { - target: "http://localhost:8181", + target: "http://localhost:18181", secure: false }, "/about/": { - target: "http://localhost:8181", + target: "http://localhost:18181", secure: false }, "/tree/": { - target: "http://localhost:8181", + target: "http://localhost:18181", secure: false }, "/websocket": { - target: "http://localhost:8181", + target: "http://localhost:18181", + ws: true, + changeOrigin: true, + secure: false + }, + "/apidoc": { + target: "http://localhost:18181", ws: true, changeOrigin: true, secure: false |