/* * * Copyright 2016 RIFT.IO Inc * * Licensed 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 React from 'react'; import './admin.scss'; import SkyquakeComponent from 'widgets/skyquake_container/skyquakeComponent.jsx'; import AppHeader from 'widgets/header/header.jsx'; import AdminStore from './AdminStore' import ModelStore from './store/ModelStore' import ModelExplorer from './components/ModelExplorer' import 'style/layout.scss'; class Element { constructor(explorerModel) { this.explorerModel = explorerModel; this.node = explorerModel.dataModel.path.split('/').pop().split(':').pop(); this.dataModel = explorerModel.dataModel; if (this.dataModel.data && this.dataModel.schema[this.node].type === 'list' && !Array.isArray(this.dataModel.data)) { this.dataModel.data = [this.dataModel.data]; } } get name() { return this.dataModel.path.split(':').pop() } get type() { return this.dataModel.schema[this.node].type } get value() { return this.dataModel.data } get schema() { return this.dataModel.schema[this.node] } getItemInfo(item) { return ModelExplorer.getItemInfo(this.dataModel.schema[this.node].key, item); } // explore model methods getElement = path => path.length > 1 ? this.explorerModel.getElement(path.slice(1)) : this; } class Admin extends React.Component { constructor(props) { super(props) this.adminStore = props.flux.stores['AdminStore'] || props.flux.createStore(AdminStore, 'AdminStore'); this.adminStore.listen(this.updateAdminState); this.state = { explorerModels: {}, ...this.adminStore.getState() }; } componentDidMount() { const storeList = this.state.modelList ? this.state.modelList.map((path, index) => { const store = this.props.flux.stores[path] || this.props.flux.createStore(ModelStore, path, path); store.listen(this.updateModelState); store.get(); return store; }) : []; this.setState({ storeList }); } componentWillUnmount() { this.adminStore.unlisten(this.updateSchema); this.state.storeList.forEach((store) => store.unlisten(this.updateModelState)); } updateModelState = model => { const explorerModels = Object.assign({}, this.state.explorerModels); explorerModels[model.path] = new Element(ModelExplorer.getExplorerModel(model)); this.setState({ explorerModels }); } updateAdminState = admin => { // if storeList has changed then handle that } updateModel = (path, operation, data) => { const store = this.props.flux.stores[path[1]] || this.props.flux.createStore(ModelStore, path[1]); store[operation](path.slice(2), data); return operation === 'delete'; // close column? } adminExplorerModel = new class { constructor(admin) { this.admin = admin; } getElement(path) { if (path.length > 2) { return this.admin.state.explorerModels[path[1]].getElement(path.slice(1)) } else if (path.length > 1) { return this.admin.state.explorerModels[path[1]] } else { const data = Object.values(this.admin.state.explorerModels); const properties = data.length ? data.map(e => ({ name: e.dataModel.path, type: ((e.dataModel.schema && e.dataModel.schema[e.node].type) || 'loading') })) : []; const schema = { name: "Configuration", type: 'container', properties } return { schema, value: data, type: schema.type, name: schema.name } } } }(this); render() { const { flux } = this.props; const { storeList } = this.state; const modelList = storeList && storeList.map(store => store.getState()) return (
) } } export default SkyquakeComponent(Admin);