http://git-wip-us.apache.org/repos/asf/ignite/blob/9dc251cd/modules/web-console/frontend/app/modules/branding/header-logo.pug ---------------------------------------------------------------------- diff --git a/modules/web-console/frontend/app/modules/branding/header-logo.pug b/modules/web-console/frontend/app/modules/branding/header-logo.pug deleted file mode 100644 index f0453d3..0000000 --- a/modules/web-console/frontend/app/modules/branding/header-logo.pug +++ /dev/null @@ -1,18 +0,0 @@ -//- - Licensed to the Apache Software Foundation (ASF) under one or more - contributor license agreements. See the NOTICE file distributed with - this work for additional information regarding copyright ownership. - The ASF licenses this file to You under the Apache License, Version 2.0 - (the "License"); you may not use this file except in compliance with - the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - -a(ui-sref='signin') - img.navbar-brand(ng-src='{{logo.url}}')
http://git-wip-us.apache.org/repos/asf/ignite/blob/9dc251cd/modules/web-console/frontend/app/modules/branding/header-title.directive.js ---------------------------------------------------------------------- diff --git a/modules/web-console/frontend/app/modules/branding/header-title.directive.js b/modules/web-console/frontend/app/modules/branding/header-title.directive.js deleted file mode 100644 index f67439c..0000000 --- a/modules/web-console/frontend/app/modules/branding/header-title.directive.js +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -const template = ` - <h1 - style="margin: 0;font-size: 1.4em;" - >{{::title.text}}</h1> -`; - -/** - * @param {import('./branding.service').default} branding - */ -export default function factory(branding) { - function controller() { - const ctrl = this; - - ctrl.text = branding.headerText; - } - - return { - restrict: 'E', - template, - controller, - controllerAs: 'title', - replace: true - }; -} - -factory.$inject = ['IgniteBranding']; - http://git-wip-us.apache.org/repos/asf/ignite/blob/9dc251cd/modules/web-console/frontend/app/modules/branding/powered-by-apache.directive.js ---------------------------------------------------------------------- diff --git a/modules/web-console/frontend/app/modules/branding/powered-by-apache.directive.js b/modules/web-console/frontend/app/modules/branding/powered-by-apache.directive.js deleted file mode 100644 index 3f8b3de..0000000 --- a/modules/web-console/frontend/app/modules/branding/powered-by-apache.directive.js +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import template from './powered-by-apache.pug'; - -/** - * @param {import('./branding.service').default} branding - */ -export default function factory(branding) { - function controller() { - const ctrl = this; - - ctrl.show = branding.showIgniteLogo; - } - - return { - restrict: 'E', - template, - controller, - controllerAs: 'poweredBy' - }; -} - -factory.$inject = ['IgniteBranding']; - http://git-wip-us.apache.org/repos/asf/ignite/blob/9dc251cd/modules/web-console/frontend/app/modules/branding/powered-by-apache.pug ---------------------------------------------------------------------- diff --git a/modules/web-console/frontend/app/modules/branding/powered-by-apache.pug b/modules/web-console/frontend/app/modules/branding/powered-by-apache.pug deleted file mode 100644 index 6031235..0000000 --- a/modules/web-console/frontend/app/modules/branding/powered-by-apache.pug +++ /dev/null @@ -1,18 +0,0 @@ -//- - Licensed to the Apache Software Foundation (ASF) under one or more - contributor license agreements. See the NOTICE file distributed with - this work for additional information regarding copyright ownership. - The ASF licenses this file to You under the Apache License, Version 2.0 - (the "License"); you may not use this file except in compliance with - the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - -a(ng-if='poweredBy.show' href='//ignite.apache.org' target='_blank') - img(ng-src='/images/pb-ignite.png') http://git-wip-us.apache.org/repos/asf/ignite/blob/9dc251cd/modules/web-console/frontend/app/modules/demo/Demo.module.js ---------------------------------------------------------------------- diff --git a/modules/web-console/frontend/app/modules/demo/Demo.module.js b/modules/web-console/frontend/app/modules/demo/Demo.module.js index 6c14e4a..9416bca 100644 --- a/modules/web-console/frontend/app/modules/demo/Demo.module.js +++ b/modules/web-console/frontend/app/modules/demo/Demo.module.js @@ -71,34 +71,7 @@ function demoInterceptor(Demo) { demoInterceptor.$inject = ['Demo']; -/** - * @param {ng.IScope} $scope - * @param {import('@uirouter/angularjs').StateService} $state - * @param {ng.IWindowService} $window - * @param {ReturnType<typeof import('app/services/Confirm.service').default>} Confirm - */ -function demoController($scope, $state, $window, Confirm) { - const _openTab = (stateName) => $window.open($state.href(stateName), '_blank'); - - $scope.startDemo = () => { - if (!$scope.user.demoCreated) - return _openTab('demo.reset'); - - Confirm.confirm('Would you like to continue with previous demo session?', true, false) - .then((resume) => { - if (resume) - return _openTab('demo.resume'); - - _openTab('demo.reset'); - }); - }; - - $scope.closeDemo = () => { - $window.close(); - }; -} -demoController.$inject = ['$scope', '$state', '$window', 'IgniteConfirm']; function igniteDemoInfoProvider() { const items = DEMO_INFO; @@ -211,6 +184,5 @@ angular .config(config) .provider('Demo', DemoProvider) .factory('demoInterceptor', demoInterceptor) -.controller('demoController', demoController) .provider('igniteDemoInfo', igniteDemoInfoProvider) .service('DemoInfo', DemoInfo); http://git-wip-us.apache.org/repos/asf/ignite/blob/9dc251cd/modules/web-console/frontend/app/modules/navbar/Navbar.provider.js ---------------------------------------------------------------------- diff --git a/modules/web-console/frontend/app/modules/navbar/Navbar.provider.js b/modules/web-console/frontend/app/modules/navbar/Navbar.provider.js deleted file mode 100644 index 9b905d7..0000000 --- a/modules/web-console/frontend/app/modules/navbar/Navbar.provider.js +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -export default function() { - const items = []; - - this.push = function(data) { - items.push(data); - }; - - this.$get = function() { - return items; - }; - - return this; -} http://git-wip-us.apache.org/repos/asf/ignite/blob/9dc251cd/modules/web-console/frontend/app/modules/navbar/navbar.directive.js ---------------------------------------------------------------------- diff --git a/modules/web-console/frontend/app/modules/navbar/navbar.directive.js b/modules/web-console/frontend/app/modules/navbar/navbar.directive.js deleted file mode 100644 index e400cf7..0000000 --- a/modules/web-console/frontend/app/modules/navbar/navbar.directive.js +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -export default function factory(IgniteNavbar) { - function controller() { - const ctrl = this; - - ctrl.items = IgniteNavbar; - } - - return { - restrict: 'A', - controller, - controllerAs: 'navbar' - }; -} - -factory.$inject = ['IgniteNavbar']; http://git-wip-us.apache.org/repos/asf/ignite/blob/9dc251cd/modules/web-console/frontend/app/modules/navbar/navbar.module.js ---------------------------------------------------------------------- diff --git a/modules/web-console/frontend/app/modules/navbar/navbar.module.js b/modules/web-console/frontend/app/modules/navbar/navbar.module.js index 63588c7..e2a4f83 100644 --- a/modules/web-console/frontend/app/modules/navbar/navbar.module.js +++ b/modules/web-console/frontend/app/modules/navbar/navbar.module.js @@ -17,17 +17,10 @@ import angular from 'angular'; -import IgniteNavbar from './Navbar.provider'; import IgniteUserbar from './Userbar.provider'; -import igniteNavbar from './navbar.directive'; -import igniteUserbar from './userbar.directive'; - angular .module('ignite-console.navbar', [ ]) -.provider('IgniteNavbar', IgniteNavbar) -.provider('IgniteUserbar', IgniteUserbar) -.directive('igniteNavbar', igniteNavbar) -.directive('igniteUserbar', igniteUserbar); +.provider('IgniteUserbar', IgniteUserbar); http://git-wip-us.apache.org/repos/asf/ignite/blob/9dc251cd/modules/web-console/frontend/app/modules/navbar/userbar.directive.js ---------------------------------------------------------------------- diff --git a/modules/web-console/frontend/app/modules/navbar/userbar.directive.js b/modules/web-console/frontend/app/modules/navbar/userbar.directive.js deleted file mode 100644 index b636a34..0000000 --- a/modules/web-console/frontend/app/modules/navbar/userbar.directive.js +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @param {ng.IRootScopeService} $root - * @param {unknown} IgniteUserbar - * @param {unknown} AclService - */ -function controller($root, IgniteUserbar, AclService) { - const ctrl = this; - - this.$onInit = () => { - ctrl.items = [ - {text: 'Profile', sref: 'base.settings.profile'}, - {text: 'Getting started', click: 'gettingStarted.tryShow(true)'} - ]; - - const _rebuildSettings = () => { - ctrl.items.splice(2); - - if (AclService.can('admin_page')) - ctrl.items.push({text: 'Admin panel', sref: 'base.settings.admin'}); - - ctrl.items.push(...IgniteUserbar); - - if (AclService.can('logout')) - ctrl.items.push({text: 'Log out', sref: 'logout'}); - }; - - if ($root.user) - _rebuildSettings(null, $root.user); - - $root.$on('user', _rebuildSettings); - }; -} - -controller.$inject = ['$rootScope', 'IgniteUserbar', 'AclService']; - -export default function() { - return { - restrict: 'A', - controller, - controllerAs: 'userbar' - }; -} http://git-wip-us.apache.org/repos/asf/ignite/blob/9dc251cd/modules/web-console/frontend/app/services/store.ts ---------------------------------------------------------------------- diff --git a/modules/web-console/frontend/app/services/store.ts b/modules/web-console/frontend/app/services/store.ts new file mode 100644 index 0000000..19dde69 --- /dev/null +++ b/modules/web-console/frontend/app/services/store.ts @@ -0,0 +1,75 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import {BehaviorSubject} from 'rxjs/BehaviorSubject'; +import {Subject} from 'rxjs/Subject'; +import {scan, tap} from 'rxjs/operators'; +import {merge} from 'rxjs/observable/merge'; + +interface Reducer<State, Actions> { + (state: State, action: Actions): State +} + +export class Store<Actions, State> { + static $inject = ['$injector']; + + actions$: Subject<Actions> + state$: BehaviorSubject<State> + private _reducers: Array<Reducer<State, Actions>> + + constructor(private $injector: ng.auto.IInjectorService) { + this.$injector = $injector; + + this.actions$ = new Subject(); + this.state$ = new BehaviorSubject({}); + this.actions$.pipe( + scan((state, action) => this._reducers.reduce((state, reducer) => reducer(state, action), state), void 0), + tap((state) => this.state$.next(state)) + ).subscribe(); + this._reducers = [(state) => state]; + } + + dispatch(action: Actions) { + this.actions$.next(action); + } + + addReducer<T extends keyof State, U = State[T]>(path: T, reducer: Reducer<U, Actions>): void + addReducer(reducer: Reducer<State, Actions>): void + addReducer(...args) { + if (typeof args[0] === 'string') { + const [path, reducer] = args; + this._reducers = [ + ...this._reducers, + (state = {}, action) => { + const pathState = reducer(state[path], action); + // Don't update root state if child state changes + return state[path] !== pathState ? {...state, [path]: pathState} : state; + } + ]; + } else { + const [reducer] = args; + this._reducers = [...this._reducers, reducer]; + } + } + + addEffects(EffectsClass) { + const instance = this.$injector.instantiate(EffectsClass); + return merge( + ...Object.keys(instance).filter((k) => k.endsWith('Effect$')).map((k) => instance[k]), + ).pipe(tap((a) => this.dispatch(a))).subscribe(); + } +} http://git-wip-us.apache.org/repos/asf/ignite/blob/9dc251cd/modules/web-console/frontend/app/store/actions/ui.ts ---------------------------------------------------------------------- diff --git a/modules/web-console/frontend/app/store/actions/ui.ts b/modules/web-console/frontend/app/store/actions/ui.ts new file mode 100644 index 0000000..25d9ba0 --- /dev/null +++ b/modules/web-console/frontend/app/store/actions/ui.ts @@ -0,0 +1,36 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import {NavigationMenuItem} from '../../types'; + +export const TOGGLE_SIDEBAR: 'TOGGLE_SIDEBAR' = 'TOGGLE_SIDEBAR'; +export const toggleSidebar = () => ({type: TOGGLE_SIDEBAR}); + +export const NAVIGATION_MENU_ITEM: 'NAVIGATION_MENU_ITEM' = 'NAVIGATION_MENU_ITEM'; +export const navigationMenuItem = (menuItem: NavigationMenuItem) => ({type: NAVIGATION_MENU_ITEM, menuItem}); + +export const HIDE_NAVIGATION_MENU_ITEM: 'HIDE_NAVIGATION_MENU_ITEM' = 'HIDE_NAVIGATION_MENU_ITEM'; +export const hideNavigationMenuItem = (label: NavigationMenuItem['label']) => ({type: HIDE_NAVIGATION_MENU_ITEM, label}); + +export const SHOW_NAVIGATION_MENU_ITEM: 'SHOW_NAVIGATION_MENU_ITEM' = 'SHOW_NAVIGATION_MENU_ITEM'; +export const showNavigationMenuItem = (label: NavigationMenuItem['label']) => ({type: SHOW_NAVIGATION_MENU_ITEM, label}); + +export type UIActions = + | ReturnType<typeof toggleSidebar> + | ReturnType<typeof navigationMenuItem> + | ReturnType<typeof hideNavigationMenuItem> + | ReturnType<typeof showNavigationMenuItem>; http://git-wip-us.apache.org/repos/asf/ignite/blob/9dc251cd/modules/web-console/frontend/app/store/actions/user.ts ---------------------------------------------------------------------- diff --git a/modules/web-console/frontend/app/store/actions/user.ts b/modules/web-console/frontend/app/store/actions/user.ts new file mode 100644 index 0000000..34c8d20 --- /dev/null +++ b/modules/web-console/frontend/app/store/actions/user.ts @@ -0,0 +1,24 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import {User} from '../../types'; + +export const USER: 'USER' = 'USER'; +export const user = (user: User) => ({type: USER, user}); + +export type UserActions = + | ReturnType<typeof user>; http://git-wip-us.apache.org/repos/asf/ignite/blob/9dc251cd/modules/web-console/frontend/app/store/effects/ui.ts ---------------------------------------------------------------------- diff --git a/modules/web-console/frontend/app/store/effects/ui.ts b/modules/web-console/frontend/app/store/effects/ui.ts new file mode 100644 index 0000000..2a635d6 --- /dev/null +++ b/modules/web-console/frontend/app/store/effects/ui.ts @@ -0,0 +1,32 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import {AppStore, USER, ofType, hideNavigationMenuItem, showNavigationMenuItem} from '..'; +import {map} from 'rxjs/operators'; + +export class UIEffects { + static $inject = ['Store'] + constructor(private store: AppStore) {} + + toggleQueriesNavItemEffect$ = this.store.actions$.pipe( + ofType(USER), + map((action) => { + const QUERY_LABEL = 'Queries'; + return action.user.becomeUsed ? hideNavigationMenuItem(QUERY_LABEL) : showNavigationMenuItem(QUERY_LABEL); + }) + ) +} http://git-wip-us.apache.org/repos/asf/ignite/blob/9dc251cd/modules/web-console/frontend/app/store/index.ts ---------------------------------------------------------------------- diff --git a/modules/web-console/frontend/app/store/index.ts b/modules/web-console/frontend/app/store/index.ts new file mode 100644 index 0000000..fa4a878 --- /dev/null +++ b/modules/web-console/frontend/app/store/index.ts @@ -0,0 +1,48 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import {Store} from '../services/store'; + +import {UIState, uiReducer} from './reducers/ui'; +import {UIActions} from './actions/ui'; +import {UIEffects} from './effects/ui'; + +import {UserActions} from './actions/user'; + +export * from './actions/ui'; +export * from './reducers/ui'; +export * from './selectors/ui'; + +export * from './actions/user'; + +export {ofType} from './ofType'; + +export type State = { + ui: UIState, +}; + +export type Actions = + | UserActions + | UIActions; + +export type AppStore = Store<Actions, State>; + +register.$inject = ['Store']; +export function register(store: AppStore) { + store.addReducer('ui', uiReducer); + store.addEffects(UIEffects); +} http://git-wip-us.apache.org/repos/asf/ignite/blob/9dc251cd/modules/web-console/frontend/app/store/ofType.ts ---------------------------------------------------------------------- diff --git a/modules/web-console/frontend/app/store/ofType.ts b/modules/web-console/frontend/app/store/ofType.ts new file mode 100644 index 0000000..3d3bd8e --- /dev/null +++ b/modules/web-console/frontend/app/store/ofType.ts @@ -0,0 +1,26 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import {OperatorFunction} from 'rxjs/interfaces'; +import {filter} from 'rxjs/operators'; + +type Action = {type: string}; +export function ofType<T extends string, U extends Action, V extends Extract<U, {type: T}>>(type: T): OperatorFunction<U, V> +export function ofType<U extends Action>(type): OperatorFunction<U, U> { + return filter((action: U): boolean => type === action.type); +} + http://git-wip-us.apache.org/repos/asf/ignite/blob/9dc251cd/modules/web-console/frontend/app/store/reducers/ui.ts ---------------------------------------------------------------------- diff --git a/modules/web-console/frontend/app/store/reducers/ui.ts b/modules/web-console/frontend/app/store/reducers/ui.ts new file mode 100644 index 0000000..6f2859d --- /dev/null +++ b/modules/web-console/frontend/app/store/reducers/ui.ts @@ -0,0 +1,50 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import {NavigationMenu} from '../../types'; +import {UIActions, TOGGLE_SIDEBAR, NAVIGATION_MENU_ITEM, HIDE_NAVIGATION_MENU_ITEM, SHOW_NAVIGATION_MENU_ITEM} from '..'; + +export type UIState = { + sidebarOpened: boolean, + navigationMenu: NavigationMenu +}; + +const defaults: UIState = { + sidebarOpened: false, + navigationMenu: [] +}; + +export function uiReducer(state: UIState = defaults, action: UIActions): UIState { + switch (action.type) { + case TOGGLE_SIDEBAR: + return {...state, sidebarOpened: !state.sidebarOpened}; + case NAVIGATION_MENU_ITEM: + return {...state, navigationMenu: [...state.navigationMenu, action.menuItem]}; + case HIDE_NAVIGATION_MENU_ITEM: + return { + ...state, + navigationMenu: state.navigationMenu.map((i) => i.label === action.label ? {...i, hidden: true} : i) + }; + case SHOW_NAVIGATION_MENU_ITEM: + return { + ...state, + navigationMenu: state.navigationMenu.map((i) => i.label === action.label ? {...i, hidden: false} : i) + }; + default: + return state; + } +} http://git-wip-us.apache.org/repos/asf/ignite/blob/9dc251cd/modules/web-console/frontend/app/store/reduxDebug.ts ---------------------------------------------------------------------- diff --git a/modules/web-console/frontend/app/store/reduxDebug.ts b/modules/web-console/frontend/app/store/reduxDebug.ts new file mode 100644 index 0000000..d7b1474 --- /dev/null +++ b/modules/web-console/frontend/app/store/reduxDebug.ts @@ -0,0 +1,45 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import {reducer, devTools} from '../components/page-configure/reduxDevtoolsIntegration'; +import {AppStore} from '.'; +import {filter, withLatestFrom, tap} from 'rxjs/operators'; + +run.$inject = ['Store']; + +export function run(store: AppStore) { + if (devTools) { + devTools.subscribe((e) => { + if (e.type === 'DISPATCH' && e.state) store.dispatch(e); + }); + + const ignoredActions = new Set([ + ]); + + store.actions$.pipe( + filter((e) => e.type !== 'DISPATCH'), + withLatestFrom(store.state$.skip(1)), + tap(([action, state]) => { + if (ignoredActions.has(action.type)) return; + devTools.send(action, state); + console.log(action); + }) + ).subscribe(); + + store.addReducer(reducer); + } +} http://git-wip-us.apache.org/repos/asf/ignite/blob/9dc251cd/modules/web-console/frontend/app/store/selectors/ui.ts ---------------------------------------------------------------------- diff --git a/modules/web-console/frontend/app/store/selectors/ui.ts b/modules/web-console/frontend/app/store/selectors/ui.ts new file mode 100644 index 0000000..0bd2fa9 --- /dev/null +++ b/modules/web-console/frontend/app/store/selectors/ui.ts @@ -0,0 +1,29 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import {State, AppStore} from '..'; +import {pluck, map} from 'rxjs/operators'; +import {pipe} from 'rxjs'; +import {memoize, orderBy} from 'lodash'; + +const orderMenu = <T extends {order: number}>(menu: Array<T>) => orderBy(menu, 'order'); + +export const selectSidebarOpened = () => pluck<State, State['ui']['sidebarOpened']>('ui', 'sidebarOpened'); +export const selectNavigationMenu = () => pipe( + pluck<State, State['ui']['navigationMenu']>('ui', 'navigationMenu'), + map(orderMenu) +); http://git-wip-us.apache.org/repos/asf/ignite/blob/9dc251cd/modules/web-console/frontend/app/types/index.ts ---------------------------------------------------------------------- diff --git a/modules/web-console/frontend/app/types/index.ts b/modules/web-console/frontend/app/types/index.ts index df6a169..ad40c15 100644 --- a/modules/web-console/frontend/app/types/index.ts +++ b/modules/web-console/frontend/app/types/index.ts @@ -32,3 +32,33 @@ export interface IIgniteNg1StateDeclaration extends Ng1StateDeclaration { tfMetaTags: ITfMetatagsConfig, permission?: string } + +export type User = { + _id: string, + firstName: string, + lastName: string, + email: string, + phone?: string, + company: string, + country: string, + registered: string, + lastLogin: string, + lastActivity: string, + admin: boolean, + token: string, + resetPasswordToken: string, + // Assigned in UI + becomeUsed?: boolean +}; + +export type NavigationMenuItem = { + label: string, + icon: string, + order: number, + hidden?: boolean +} & ( + {sref: string, activeSref: string} | + {href: string} +); + +export type NavigationMenu = Array<NavigationMenuItem>; http://git-wip-us.apache.org/repos/asf/ignite/blob/9dc251cd/modules/web-console/frontend/public/images/icons/cluster.icon.svg ---------------------------------------------------------------------- diff --git a/modules/web-console/frontend/public/images/icons/cluster.icon.svg b/modules/web-console/frontend/public/images/icons/cluster.icon.svg new file mode 100644 index 0000000..7576049 --- /dev/null +++ b/modules/web-console/frontend/public/images/icons/cluster.icon.svg @@ -0,0 +1,10 @@ +<svg version="1.1" viewBox="0 0 20 17" xmlns="http://www.w3.org/2000/svg"> + <g fill="none" fill-rule="evenodd" stroke="currentColor" stroke-width="2"> + <rect x="8.5" y="1" width="3" height="3" rx="1"/> + <rect x="8.5" y="12.25" width="3" height="3" rx="1"/> + <rect x="16" y="12.25" width="3" height="3" rx="1"/> + <rect x="1" y="12.25" width="3" height="3" rx="1"/> + <path d="M10 5v2.5l7.656.05v4.206" stroke-linecap="square" stroke-linejoin="round"/> + <path d="M10.156 5v6.756V7.5L2.5 7.55v4.206" stroke-linecap="round" stroke-linejoin="round"/> + </g> +</svg> http://git-wip-us.apache.org/repos/asf/ignite/blob/9dc251cd/modules/web-console/frontend/public/images/icons/connectedClusters.icon.svg ---------------------------------------------------------------------- diff --git a/modules/web-console/frontend/public/images/icons/connectedClusters.icon.svg b/modules/web-console/frontend/public/images/icons/connectedClusters.icon.svg deleted file mode 100644 index f405317..0000000 --- a/modules/web-console/frontend/public/images/icons/connectedClusters.icon.svg +++ /dev/null @@ -1 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 13"><g fill="none" fill-rule="evenodd"><path fill="currentColor" d="M6 0h4v4H6zm0 9h4v4H6zm6 0h4v4h-4zM0 9h4v4H0z"/><path stroke="currentColor" stroke-linecap="square" d="M8 4v2l6.125.04v3.365"/><path stroke="currentColor" stroke-linecap="square" d="M8.125 4v5.405V6L2 6.04v3.365"/></g></svg> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ignite/blob/9dc251cd/modules/web-console/frontend/public/images/icons/downloadAgent.icon.svg ---------------------------------------------------------------------- diff --git a/modules/web-console/frontend/public/images/icons/downloadAgent.icon.svg b/modules/web-console/frontend/public/images/icons/downloadAgent.icon.svg new file mode 100644 index 0000000..afb51ee --- /dev/null +++ b/modules/web-console/frontend/public/images/icons/downloadAgent.icon.svg @@ -0,0 +1,16 @@ +<svg version="1.1" viewBox="0 0 20 18" xmlns="http://www.w3.org/2000/svg"> + <g fill="none" fill-rule="evenodd"> + <g transform="translate(-263 -1597)" fill="currentColor"> + <g transform="translate(235 1485)"> + <g transform="translate(28 112)"> + <path d="m-8.7041e-14 9.0435v7.1788c0 0.97787 0.81811 1.7778 1.8182 1.7778h16.364c0.99966 0 1.8178-0.79991 1.8178-1.7778v-7.1788h-20zm1.7103 0h16.472v7.1876h-16.364l-0.10794-7.1876z"/> + <g stroke="currentColor" stroke-width=".5"> + <polygon points="14.7 8.635 14.131 8.0659 10.757 11.44 10.757 5 9.9435 5 9.9435 11.44 6.5692 8.0659 6 8.635 10.35 12.985"/> + <polygon points="10.757 3.719 10.757 3 9.9435 3 9.9435 3.719"/> + <polygon points="10.757 1.719 10.757 1 9.9435 1 9.9435 1.719"/> + </g> + </g> + </g> + </g> + </g> +</svg> http://git-wip-us.apache.org/repos/asf/ignite/blob/9dc251cd/modules/web-console/frontend/public/images/icons/index.js ---------------------------------------------------------------------- diff --git a/modules/web-console/frontend/public/images/icons/index.js b/modules/web-console/frontend/public/images/icons/index.js index 0951d32..2e41085 100644 --- a/modules/web-console/frontend/public/images/icons/index.js +++ b/modules/web-console/frontend/public/images/icons/index.js @@ -21,7 +21,6 @@ export {default as check} from './check.icon.svg'; export {default as checkmark} from './checkmark.icon.svg'; export {default as clock} from './clock.icon.svg'; export {default as collapse} from './collapse.icon.svg'; -export {default as connectedClusters} from './connectedClusters.icon.svg'; export {default as copy} from './copy.icon.svg'; export {default as cross} from './cross.icon.svg'; export {default as csv} from './csv.icon.svg'; @@ -43,3 +42,7 @@ export {default as refresh} from './refresh.icon.svg'; export {default as search} from './search.icon.svg'; export {default as sort} from './sort.icon.svg'; export {default as structure} from './structure.icon.svg'; +export {default as cluster} from './cluster.icon.svg'; +export {default as sql} from './sql.icon.svg'; +export {default as menu} from './menu.icon.svg'; +export {default as downloadAgent} from './downloadAgent.icon.svg'; http://git-wip-us.apache.org/repos/asf/ignite/blob/9dc251cd/modules/web-console/frontend/public/images/icons/menu.icon.svg ---------------------------------------------------------------------- diff --git a/modules/web-console/frontend/public/images/icons/menu.icon.svg b/modules/web-console/frontend/public/images/icons/menu.icon.svg new file mode 100644 index 0000000..392d42e --- /dev/null +++ b/modules/web-console/frontend/public/images/icons/menu.icon.svg @@ -0,0 +1,7 @@ +<svg width="16" height="16" version="1.1" viewBox="0 0 4.2333332 4.2333332" xmlns="http://www.w3.org/2000/svg"> + <g transform="translate(0 -292.77)" fill="currentColor"> + <rect y="295.95" width="4.2333" height=".52917" style="paint-order:markers fill stroke"/> + <rect x="1.1126e-7" y="294.62" width="4.2333" height=".52917" style="paint-order:markers fill stroke"/> + <rect y="293.3" width="4.2333" height=".52917" style="paint-order:markers fill stroke"/> + </g> +</svg> http://git-wip-us.apache.org/repos/asf/ignite/blob/9dc251cd/modules/web-console/frontend/public/images/icons/sql.icon.svg ---------------------------------------------------------------------- diff --git a/modules/web-console/frontend/public/images/icons/sql.icon.svg b/modules/web-console/frontend/public/images/icons/sql.icon.svg new file mode 100644 index 0000000..bd54eee --- /dev/null +++ b/modules/web-console/frontend/public/images/icons/sql.icon.svg @@ -0,0 +1,3 @@ +<svg version="1.1" viewBox="0 0 20 16" xmlns="http://www.w3.org/2000/svg"> + <path d="M6.454 9.208c0-.2-.07-.353-.211-.46-.141-.107-.395-.22-.762-.338a5.4 5.4 0 0 1-.871-.351c-.583-.315-.875-.74-.875-1.273 0-.278.079-.525.235-.743a1.53 1.53 0 0 1 .673-.51c.293-.121.622-.183.986-.183.367 0 .694.067.98.2.287.133.51.32.669.562.158.242.238.517.238.825H6.458c0-.235-.074-.417-.222-.548-.148-.13-.357-.196-.625-.196-.258 0-.46.055-.603.164a.517.517 0 0 0-.215.432c0 .167.084.307.252.42.169.113.416.219.743.317.602.181 1.04.406 1.315.674.275.268.413.602.413 1.001 0 .445-.168.793-.505 1.046-.336.253-.788.38-1.357.38-.395 0-.755-.073-1.08-.218a1.708 1.708 0 0 1-.742-.594 1.522 1.522 0 0 1-.255-.875h1.061c0 .567.339.85 1.016.85.251 0 .448-.05.589-.153a.5.5 0 0 0 .211-.429zm5.988-1.103c0 .48-.077.896-.233 1.25-.155.354-.37.637-.645.851l.854.67-.674.596-1.093-.878a2.314 2.314 0 0 1-.388.032c-.426 0-.805-.102-1.14-.307a2.038 2.038 0 0 1-.775-.876c-.183-.38-.276-.816-.279-1.31v-.254c0-.506.091-.95.274-1.335.182-.384.44-.68.772-.885a2.124 2.124 0 0 1 1.14-.309c.429 0 .809.103 1.142.309.332.206.59.5.772.885.182.385.273.828.273 1.331v.23zm-1.072-.233c0-.538-.096-.948-.289-1.227-.193-.28-.468-.42-.825-.42-.355 0-.63.138-.822.414-.193.277-.29.682-.293 1.215v.25c0 .525.097.932.29 1.22.192.29.47.435.832.435.355 0 .628-.14.818-.418.19-.279.287-.685.29-1.219v-.25zm2.906 1.834h2.246v.85h-3.304V5.42h1.058v4.285zM18.182 0H1.818C.818 0 0 .8 0 1.778v12.444C0 15.2.818 16 1.818 16h16.364c1 0 1.818-.8 1.818-1.778V1.778C20 .8 19.182 0 18.182 0zM1.818 1.769h16.364V14.23H1.818V1.77z" fill="currentColor" fill-rule="evenodd"/> +</svg> http://git-wip-us.apache.org/repos/asf/ignite/blob/9dc251cd/modules/web-console/frontend/public/stylesheets/style.scss ---------------------------------------------------------------------- diff --git a/modules/web-console/frontend/public/stylesheets/style.scss b/modules/web-console/frontend/public/stylesheets/style.scss index ce14e45..3f601be 100644 --- a/modules/web-console/frontend/public/stylesheets/style.scss +++ b/modules/web-console/frontend/public/stylesheets/style.scss @@ -255,17 +255,70 @@ body { flex-direction: column; } -body > .wrapper, - // Nested ui-view, like on password reset state -body > .wrapper > ui-view { - display: flex; - flex-direction: column; +:root { + --page-side-padding: 30px; +} + +.wrapper { + --header-height: 62px; + min-height: 100vh; + display: grid; + grid-template-columns: auto 1fr; + grid-template-rows: auto var(--header-height) 1fr; + grid-template-areas: 'notifications notifications' 'header header' 'sidebar content'; + + permanent-notifications { + grid-area: notifications; + } + + web-console-header { + grid-area: header; + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 10; + transform: translateZ(1px); + } + + web-console-sidebar { + grid-area: sidebar; + transform: translateZ(1px); + } + + &>.content { + grid-area: content; + padding-left: var(--page-side-padding); + padding-right: var(--page-side-padding); + padding-bottom: var(--page-side-padding); + display: flex; + flex-direction: column; + + &>ui-view { + display: flex; + flex-direction: column; + flex: 1; + } + } + + &.wrapper-public { + grid-template-columns: 1fr; + grid-template-rows: auto var(--header-height) 1fr auto; + grid-template-areas: 'notifications' 'header' 'content' 'footer'; + } +} + +.public-page { + margin-left: auto; + margin-right: auto; flex: 1 0 auto; + width: 100%; + max-width: 530px; - .body-container { - flex: 1 0 auto; - padding-bottom: 30px; + .public-page__title { + font-size: 38px; + font-weight: 300; + margin: 30px 0 30px; } } @@ -374,7 +427,6 @@ i.btn { h1, h2, h3 { - user-select: none; font-weight: normal; /* Makes the vertical size of the text the same for all fonts. */ line-height: 1; @@ -2004,10 +2056,6 @@ html, body { position: absolute !important; } -.demo-mode { - padding-top: 30px; -} - // Fix for injecting svg icon into BS btn .btn--with-icon { display: flex; http://git-wip-us.apache.org/repos/asf/ignite/blob/9dc251cd/modules/web-console/frontend/views/base.pug ---------------------------------------------------------------------- diff --git a/modules/web-console/frontend/views/base.pug b/modules/web-console/frontend/views/base.pug index 967d469..b14cdac 100644 --- a/modules/web-console/frontend/views/base.pug +++ b/modules/web-console/frontend/views/base.pug @@ -14,13 +14,10 @@ See the License for the specific language governing permissions and limitations under the License. +permanent-notifications web-console-header - web-console-header-left - include ./includes/header-left - web-console-header-right - include ./includes/header-right + web-console-header-content -.container--responsive.body-container.flex-full-height - div(ui-view='').flex-full-height +web-console-sidebar -web-console-footer +ui-view.content \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ignite/blob/9dc251cd/modules/web-console/frontend/views/includes/header-left.pug ---------------------------------------------------------------------- diff --git a/modules/web-console/frontend/views/includes/header-left.pug b/modules/web-console/frontend/views/includes/header-left.pug deleted file mode 100644 index 03e0616..0000000 --- a/modules/web-console/frontend/views/includes/header-left.pug +++ /dev/null @@ -1,42 +0,0 @@ -//- - Licensed to the Apache Software Foundation (ASF) under one or more - contributor license agreements. See the NOTICE file distributed with - this work for additional information regarding copyright ownership. - The ASF licenses this file to You under the Apache License, Version 2.0 - (the "License"); you may not use this file except in compliance with - the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - -a.wch-nav-item( - ui-sref='base.configuration.overview' - ui-sref-active='{active: "base.configuration"}' -) - | Configure - -.wch-nav-item(ng-if='!$root.user.becomeUsed') - a(ui-sref='base.sql.tabs.notebooks-list' ui-sref-active='active') - | Queries - -.wch-additional-nav-items(ignite-navbar) - .wch-nav-item(ng-repeat='item in navbar.items') - div(ng-if='$root.user.becomeUsed ? item.canBecomed : item.children' ng-click='$event.stopPropagation()' - ng-class='{active: $state.includes(item.sref)}' - bs-dropdown='item.children' - data-placement='bottom-left' - data-trigger='hover focus' - data-container='self' - aria-haspopup='true' - aria-expanded='false' - ) - span {{::item.text}} - span.caret - - a(ng-if='$root.user.becomeUsed ? item.canBecomed : !item.children' ui-sref='{{item.sref}}' ui-sref-active='active') - | {{::item.text}} http://git-wip-us.apache.org/repos/asf/ignite/blob/9dc251cd/modules/web-console/frontend/views/includes/header-right.pug ---------------------------------------------------------------------- diff --git a/modules/web-console/frontend/views/includes/header-right.pug b/modules/web-console/frontend/views/includes/header-right.pug deleted file mode 100644 index d2d89aa..0000000 --- a/modules/web-console/frontend/views/includes/header-right.pug +++ /dev/null @@ -1,35 +0,0 @@ -//- - Licensed to the Apache Software Foundation (ASF) under one or more - contributor license agreements. See the NOTICE file distributed with - this work for additional information regarding copyright ownership. - The ASF licenses this file to You under the Apache License, Version 2.0 - (the "License"); you may not use this file except in compliance with - the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - -.wch-demo-toggle(ng-if='!$root.user.becomeUsed' ng-controller='demoController') - button.btn-ignite.btn-ignite--success( - ng-if='!IgniteDemoMode' - ng-click='startDemo()' - ) Start Demo - -web-console-header-extension - -.wch-nav-item(ignite-userbar) - .user-name-wrapper( - ng-class='{active: $state.includes("base.settings")}' - ng-click='$event.stopPropagation()' - bs-dropdown='userbar.items' - data-placement='bottom-right' - data-trigger='hover focus' - data-container='self' - ) - span {{$root.user.firstName}} {{$root.user.lastName}} - span.caret http://git-wip-us.apache.org/repos/asf/ignite/blob/9dc251cd/modules/web-console/frontend/views/public.pug ---------------------------------------------------------------------- diff --git a/modules/web-console/frontend/views/public.pug b/modules/web-console/frontend/views/public.pug new file mode 100644 index 0000000..934ac56 --- /dev/null +++ b/modules/web-console/frontend/views/public.pug @@ -0,0 +1,20 @@ +//- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +web-console-header(hide-menu-button='true') + .web-console-header-content__title Management console for Apache Ignite +.content(ui-view='page') +web-console-footer.web-console-footer__page-bottom \ No newline at end of file
