You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
openNG/src/client/index.jsx

142 lines
3.7 KiB
JavaScript

'use strict';
const unhandledRejection = require("unhandled-rejection");
unhandledRejection().on("unhandledRejection", (error) => {
throw error;
});
const reactHotLoader = require("react-hot-loader");
reactHotLoader.setConfig({
pureSFC: true
});
const Promise = require("bluebird");
const documentReadyPromise = require("document-ready-promise");
const React = require("react");
const ReactDOM = require("react-dom");
const createReactClass = require("create-react-class");
const immutable = require("immutable");
const defaultValue = require("default-value");
const WindowManager = require("./components/window-manager");
const ViewManager = require("./components/view-manager");
const NotificationArea = require("./components/notification-area");
const createWindowStore = require("./stores/windows");
const createNotificationStore = require("./stores/notifications");
const router = require("./router");
// const Form = require("./components/view-manager/form");
/*
{
id: 1,
title: "Foo",
width: 400,
height: 300,
initialX: 20,
initialY: 20,
contents: <ViewManager.ViewManager router={router} initialPath="/" onAction={this.onAction} />
}, {
id: 2,
title: "Bar",
width: 500,
height: 350,
initialX: 200,
initialY: 80,
contents: <ViewManager.ViewManager router={router} initialPath="/node/create" onAction={this.onAction} />
}
*/
/* NOTE: This wrapper exists due to pureSFC use: https://github.com/gaearon/react-hot-loader/issues/1088#issuecomment-434912466 */
let AppWrapper = reactHotLoader.hot(module)(createReactClass({
displayName: "AppWrapper",
render: function () {
return <App />;
}
}));
let App = createReactClass({
displayName: "App",
getInitialState: function () {
return {
// windows: immutable.List([{
// id: 1,
// title: "Foo",
// width: 400,
// height: 300,
// initialX: 20,
// initialY: 20,
// contents: <ViewManager.ViewManager router={router} initialPath="/" onAction={this.onAction} />
// }]),
windows: createWindowStore({
onUpdated: () => {
this.forceUpdate();
}
}),
notifications: createNotificationStore({
onUpdated: () => {
this.forceUpdate();
}
})
};
},
componentDidMount: function () {
this.onAction({
type: "open",
path: "/tasks",
options: {
sidebar: "right",
height: 380
}
});
},
onAction: function (action) {
if (action.type === "open") {
this.state.windows.add({
title: "New",
initialWidth: defaultValue(action.options.width, 300),
initialHeight: defaultValue(action.options.height, 220),
initialX: defaultValue(action.options.x, 20),
initialY: defaultValue(action.options.y, 100),
resizable: defaultValue(action.options.resizable, true),
sidebar: action.options.sidebar,
contents: <ViewManager.ViewManager router={router} initialPath={action.path} onAction={this.onAction} />
});
} else if (action.type === "notify") {
this.state.notifications.add({
title: action.options.title,
message: action.message,
type: action.options.type,
timeout: defaultValue(action.options.timeout, 5000),
controls: action.options.controls
});
} else {
console.warn(`Unhandled action of type: ${action.type}`);
}
},
render: function () {
return (
<div className="app">
<WindowManager store={this.state.windows}>
<div id="mainToolbar">
<ViewManager.ViewManager router={router} initialPath="/static/header-menu" onAction={this.onAction} />
</div>
<NotificationArea store={this.state.notifications} />
</WindowManager>
</div>
);
}
});
Promise.try(() => {
return documentReadyPromise();
}).then(() => {
ReactDOM.render(<AppWrapper />, document.getElementById("app"));
});