"use strict"; var Link = ReactRouter.Link; var Layout = React.createClass({ getInitialState: function getInitialState() { if (!this.props.menu) throw "Missing menu layout"; var layout = NF.ui_params.get_layout(this.props.menu); var doc = new xmldom.DOMParser().parseFromString(layout.layout); var layout_el = doc.documentElement; var main_menu_layout = NF.ui_params.get_layout("main_menu"); var doc = new xmldom.DOMParser().parseFromString(main_menu_layout.layout); var main_menu_el = doc.documentElement; return { layout_el: layout_el, main_menu_el: main_menu_el }; }, componentDidMount: function componentDidMount() { console.log("Layout2.componentDidMount"); this.load_user_data(); this.load_company_data(); setTimeout(function () { // XXX Layout.init(); }, 300); }, load_user_data: function load_user_data() { var _this = this; console.log("Layout.load_user_data"); var user_id = parseInt(NF.utils.get_cookie("user_id")); if (!user_id) throw "Missing user_id"; var field_names = ["name", "image"]; NF.rpc.execute("base.user", "read", [[user_id], field_names], {}, function (err, res) { if (err) throw "Error: " + err; var data = res[0]; console.log("user_data", data); _this.setState({ user_data: data }); }); }, load_company_data: function load_company_data() { var _this2 = this; console.log("Layout.load_company_data"); var company_id = parseInt(NF.utils.get_cookie("company_id")); console.log("company_id", company_id); if (!company_id) throw "Missing company_id"; var field_names = ["name"]; rpc.execute("company", "read", [[company_id], field_names], {}, function (err, res) { if (err) throw "Error: " + err; var data = res[0]; console.log("company_data", data); _this2.setState({ company_data: data }); }); }, render: function render() { var _this3 = this; console.log("Layout2.render"); var Link = NF.get_component("link"); return React.createElement( "div", { className: "page-wrapper" }, React.createElement( "div", { className: "page-header navbar navbar-fixed-top" }, React.createElement( "div", { className: "page-header-inner " }, React.createElement( "div", { className: "page-logo" }, React.createElement( "a", { href: "#" }, React.createElement("img", { src: "/static/img/smartb_logo_white_256.png", alt: "logo", className: "logo-default", style: { height: 40, marginTop: 10, marginLeft: 40 } }) ), React.createElement( "div", { className: "menu-toggler sidebar-toggler" }, React.createElement("span", null) ) ), React.createElement( "a", { href: "javascript:;", className: "menu-toggler responsive-toggler", "data-toggle": "collapse", "data-target": ".navbar-collapse" }, React.createElement("span", null) ), React.createElement( "div", { style: { float: "left", marginTop: 20, marginLeft: 20 } }, React.createElement( "a", { href: "#", style: { color: "#ccc", textDecoration: "none" }, onClick: this.select_company }, this.state.company_data ? this.state.company_data.name : React.createElement( "span", null, "\u2026" ), " " ) ), React.createElement( "div", { className: "top-menu" }, React.createElement( "ul", { className: "nav navbar-nav pull-right" }, React.createElement( "li", { className: "dropdown dropdown-user" }, React.createElement( "a", { href: "javascript:;", className: "dropdown-toggle", "data-toggle": "dropdown", "data-hover": "dropdown", "data-close-others": "true", style: { height: 60 } }, React.createElement("img", { alt: true, className: "img-circle", src: this.state.user_data ? this.state.user_data.image || "/static/img/avatar.jpg" : null }), React.createElement( "span", { className: "username username-hide-on-mobile", style: { marginLeft: 5, marginRight: 5 } }, " ", this.state.user_data ? this.state.user_data.name : null, " " ), React.createElement("i", { className: "fa fa-angle-down" }) ), React.createElement( "ul", { className: "dropdown-menu dropdown-menu-default" }, React.createElement( "li", null, React.createElement( "a", { href: "#", onClick: this.show_profile }, React.createElement("i", { className: "icon-user" }), " My Profile " ) ), React.createElement( "li", null, React.createElement( "a", { href: "#", onClick: this.logout }, React.createElement("i", { className: "icon-key" }), " Log Out " ) ) ) ) ) ) ) ), React.createElement( "div", { className: "clearfix" }, " " ), React.createElement( "div", { className: "page-container" }, React.createElement( "div", { className: "page-sidebar-wrapper" }, React.createElement( "div", { className: "page-sidebar navbar-collapse collapse" }, React.createElement( "ul", { className: "page-sidebar-menu page-header-fixed ", "data-keep-expanded": "false", "data-auto-scroll": "true", "data-slide-speed": 200, style: { paddingTop: 10 } }, React.createElement( "li", { className: "sidebar-toggler-wrapper hide" }, React.createElement( "div", { className: "sidebar-toggler" }, React.createElement("span", null) ) ), function () { var menu_layout = NF.ui_params.get_layout("main_menu"); var doc = new xmldom.DOMParser().parseFromString(menu_layout.layout); var menu_el = doc.documentElement; var item_els = xpath.select("child::*", menu_el); return item_els.map(function (el, i) { var main_action = el.getAttribute("action"); var addon = el.getAttribute("addon"); if (addon && !NF.ui_params.check_addon(addon)) return; var label = el.getAttribute("string"); if (!NF.ui_params.check_menu_access(main_action, label)) return; var main_action_vals = NF.actions.expand_action(main_action); var root_action_vals = NF.actions.expand_action(_this3.props.action); var menu_active = main_action_vals.menu == root_action_vals.menu; var menu_layout = NF.ui_params.get_layout(main_action_vals.menu); var doc = new xmldom.DOMParser().parseFromString(menu_layout.layout); var menu_el = doc.documentElement; var menu_item_els = xpath.select("child::*", menu_el); return React.createElement( "li", { key: i, className: "nav-item" + (menu_active ? " active" : "") }, React.createElement( Link, { className: "nav-link nav-toggle" }, function () { var icon = el.getAttribute("icon"); if (icon) { return React.createElement("i", { className: "glyphicon glyphicon-" + icon }); } return React.createElement("i", { className: "icons icon-arrow-right" }); }(), React.createElement( "span", { className: "title" }, NF.t(label) ), function () { if (!menu_active) return; return React.createElement("span", { className: "selected" }); }(), function () { if (menu_item_els.length == 0) return; return React.createElement("span", { className: "arrow" }); }() ), function () { var menu_layout = NF.ui_params.get_layout(main_action_vals.menu); var doc = new xmldom.DOMParser().parseFromString(menu_layout.layout); var menu_el = doc.documentElement; var menu_item_els = xpath.select("child::*", menu_el); if (menu_item_els.length == 0) return; return React.createElement( "ul", { className: "sub-menu" }, menu_item_els.map(function (sub_el, i) { var action = sub_el.getAttribute("action"); var sub_label = sub_el.getAttribute("string"); if (!NF.ui_params.check_menu_access(action, sub_label, label)) return; var url = sub_el.getAttribute("url"); var icon = sub_el.getAttribute("icon"); var menu_sub_item_els = xpath.select("child::*", sub_el); return React.createElement( "li", { key: i, className: "nav-item" }, React.createElement( Link, { to: url ? url : "/action?name=" + action, className: "nav-link nav-toggle", onClick: _this3.onclick_item.bind(_this3, sub_el) }, function () { if (!icon) return; return React.createElement("span", { className: "glyphicon glyphicon-" + icon, style: { marginRight: 5 } }); }(), React.createElement( "span", { className: "title" }, NF.t(sub_label) ), function () { if (menu_sub_item_els.length == 0) return; return React.createElement("span", { className: "arrow" }); }() ), function () { if (menu_sub_item_els.length == 0) return; return React.createElement( "ul", { className: "sub-menu" }, menu_sub_item_els.map(function (sub_sub_el, i) { var sub_sub_label = sub_sub_el.getAttribute("string"); var action = sub_sub_el.getAttribute("action"); if (!NF.ui_params.check_menu_access(action, sub_sub_label, sub_label, label)) return; var url = sub_sub_el.getAttribute("url"); var icon = sub_sub_el.getAttribute("icon"); return React.createElement( "li", { key: i, className: "nav-item" }, React.createElement( Link, { to: url ? url : "/action?name=" + action, className: "nav-link", onClick: _this3.onclick_item.bind(_this3, sub_sub_el) }, function () { if (!icon) return; return React.createElement("span", { className: "glyphicon glyphicon-" + icon, style: { marginRight: 5 } }); }(), React.createElement( "span", { className: "title" }, NF.t(sub_sub_label) ) ) ); }) ); }() ); }) ); }() ); }); }() ) ) ), React.createElement( "div", { className: "page-content-wrapper" }, React.createElement( "div", { className: "page-content" }, this.props.children ) ) ), React.createElement( "div", { className: "page-footer" }, React.createElement( "div", { className: "page-footer-inner" }, "2017 - 2025, SmartB Solutions" ), React.createElement( "div", { className: "scroll-to-top" }, React.createElement("i", { className: "icon-arrow-up" }) ) ) ); }, onclick_item: function onclick_item(el, e) { console.log("onclick_item", el); if (e) { e.preventDefault(); e.stopPropagation(); } var name = el.getAttribute("action"); if (!name) return; var action = { name: name }; var opt_s = el.getAttribute("action_options"); if (opt_s) { var opts = JSON.parse(opt_s); Object.assign(action, opts); } NF.actions.execute(action); }, show_profile: function show_profile(e) { e.preventDefault(); NF.actions.execute({ name: "view_user_pref" }); }, logout: function logout(e) { e.preventDefault(); NF.utils.clear_cookie("user_id"); NF.utils.clear_cookie("token"); NF.utils.clear_cookie("company_id"); window.location.href = "/login"; }, on_search: function on_search(e) { console.log("on_search"); e.preventDefault(); }, select_company: function select_company(e) { e.preventDefault(); NF.actions.execute("select_company"); } }); NF.register_component("layout", Layout);"use strict"; var Component = React.createClass({ getInitialState: function getInitialState() { return { mode: "login" }; }, componentDidMount: function componentDidMount() { var login = NF.utils.get_cookie("login"); if (login) { this.setState({ login: login, remember: true }); } }, render: function render() { var _this = this; return React.createElement( "div", null, React.createElement( "div", { className: "logo" }, React.createElement( "a", { href: "index.html" }, React.createElement("img", { src: "/static/img/smartb_logo_white_256.png", alt: true, style: { height: 80 } }), " " ) ), React.createElement( "div", { className: "content" }, function () { if (_this.state.mode != "login") return; return React.createElement( "form", { className: "login-form", onSubmit: _this.on_submit }, React.createElement( "h3", { className: "form-title" }, "Login to your account" ), function () { if (!_this.state.alert_msg) return; return React.createElement( "div", { className: "alert alert-danger" }, React.createElement( "span", null, _this.state.alert_msg ) ); }(), React.createElement( "div", { className: "form-group" }, React.createElement( "label", { className: "control-label visible-ie8 visible-ie9" }, "Username" ), React.createElement( "div", { className: "input-icon" }, React.createElement("i", { className: "fa fa-user" }), React.createElement("input", { className: "form-control placeholder-no-fix", type: "text", autoComplete: "off", placeholder: "Username", name: "username", value: _this.state.login, onChange: _this.onchange_login }), " " ) ), React.createElement( "div", { className: "form-group" }, React.createElement( "label", { className: "control-label visible-ie8 visible-ie9" }, "Password" ), React.createElement( "div", { className: "input-icon" }, React.createElement("i", { className: "fa fa-lock" }), React.createElement("input", { className: "form-control placeholder-no-fix", type: "password", autoComplete: "off", placeholder: "Password", name: "password", value: _this.state.password, onChange: _this.onchange_password }), " " ) ), React.createElement( "div", { className: "form-actions" }, React.createElement( "label", { className: "rememberme mt-checkbox mt-checkbox-outline" }, React.createElement("input", { type: "checkbox", name: "remember", checked: _this.state.remember, onChange: _this.onchange_remember }), " Remember me", React.createElement("span", null) ), React.createElement( "button", { type: "submit", className: "btn green pull-right" }, " Login " ) ), React.createElement( "div", { className: "forget-password" }, React.createElement( "h4", null, "Forgot your password ?" ), React.createElement( "p", null, " no worries, click", React.createElement( "a", { href: "#", onClick: _this.set_mode.bind(_this, "forgot"), id: "forget-password" }, " here " ), " to reset your password. " ) ) ); }(), function () { if (_this.state.mode != "forgot") return; return React.createElement( "form", { className: "forget-form" }, React.createElement( "h3", null, "Forgot Password ?" ), function () { if (!_this.state.alert_msg) return; return React.createElement( "div", { className: "alert alert-" + _this.state.alert_type }, React.createElement( "span", null, _this.state.alert_msg ) ); }(), React.createElement( "p", null, " Enter your e-mail address below to reset your password. " ), React.createElement( "div", { className: "form-group" }, React.createElement( "div", { className: "input-icon" }, React.createElement("i", { className: "fa fa-envelope" }), React.createElement("input", { className: "form-control placeholder-no-fix", type: "text", autoComplete: "off", placeholder: "Email", name: "email", value: _this.state.email, onChange: _this.onchange_email }), " " ) ), React.createElement( "div", { className: "form-actions" }, React.createElement( "button", { type: "button", id: "back-btn", onClick: _this.set_mode.bind(_this, "login"), className: "btn btn-outline" }, " Back " ), React.createElement( "button", { type: "button", className: "btn green pull-right", onClick: _this.reset_password.bind(_this) }, " Submit " ) ) ); }() ) ); }, onchange_login: function onchange_login(e) { this.setState({ login: e.target.value }); }, onchange_password: function onchange_password(e) { this.setState({ password: e.target.value }); }, onchange_email: function onchange_email(e) { this.setState({ email: e.target.value }); }, onchange_remember: function onchange_remember(e) { this.setState({ remember: !this.state.remember }); }, set_mode: function set_mode(mode, e) { e.preventDefault(); this.setState({ mode: mode, alert_msg: null }); }, on_submit: function on_submit(e) { console.log("Login.on_submit"); e.preventDefault(); this.login(); }, login: function login() { var _this2 = this; console.log("Login.login"); var login = this.state.login; var password = this.state.password; var remember = this.state.remember; NF.utils.clear_cookie("login"); try { if (!login) throw "Missing login"; if (!password) throw "Missing password"; } catch (err) { this.setState({ alert_msg: err, alert_type: "danger" }); return; } NF.rpc.execute("login", "login", [login, password], {}, function (err, data) { if (err) { _this2.setState({ alert_msg: err, alert_type: "danger" }); return; } if (remember) { NF.utils.set_cookie("login", login); } NF.utils.set_cookie("user_id", data.user_id); NF.utils.set_cookie("token", data.token); NF.utils.set_cookie("company_id", data.company_id); var params = new URLSearchParams(window.location.search); var url = params.get("url"); if (url) { window.location.href = url; return; } NF.actions.execute(data.next); }); }, reset_password: function reset_password(e) { var _this3 = this; e.preventDefault(); var email = this.state.email; NF.utils.clear_cookie("email"); try { if (!email) throw "Missing email"; } catch (err) { this.setState({ alert_msg: err, alert_type: "danger" }); return; } NF.rpc.execute("login", "request_reset_password", [email], {}, function (err, data) { if (err) { _this3.setState({ alert_msg: err, alert_type: "danger" }); return; } _this3.setState({ alert_msg: data.alert, alert_type: "success" }); }); } }); NF.register_component("login", Component);"use strict"; var Component = React.createClass({ getInitialState: function getInitialState() { return {}; }, componentDidMount: function componentDidMount() { var url = new URL(window.location.href); var login = url.searchParams.get("login"); var reset_code = url.searchParams.get("reset_code"); this.setState({ login: login, reset_code: reset_code }); }, render: function render() { var _this = this; return React.createElement( "div", null, React.createElement( "div", { className: "logo" }, React.createElement( "a", { href: "index.html" }, React.createElement("img", { src: "/static/img/smartb_logo_white_256.png", alt: true, style: { height: 80 } }), " " ) ), React.createElement( "div", { className: "content" }, function () { return React.createElement( "form", { className: "login-form", onSubmit: _this.reset_password }, React.createElement( "h3", { className: "form-title" }, "Reset Password" ), function () { if (!_this.state.alert_msg) return; return React.createElement( "div", { className: "alert alert-danger" }, React.createElement( "span", null, _this.state.alert_msg ) ); }(), React.createElement( "div", { className: "form-group" }, React.createElement( "label", { className: "control-label visible-ie8 visible-ie9" }, "Email" ), React.createElement( "div", { className: "input-icon" }, React.createElement("i", { className: "fa fa-user" }), React.createElement("input", { className: "form-control placeholder-no-fix", type: "text", autoComplete: "off", placeholder: "Email", name: "email", value: _this.state.login, onChange: _this.onchange_login }), " " ) ), React.createElement( "div", { className: "form-group" }, React.createElement( "label", { className: "control-label visible-ie8 visible-ie9" }, "Reset Code" ), React.createElement( "div", { className: "input-icon" }, React.createElement("i", { className: "fa fa-lock" }), React.createElement("input", { className: "form-control placeholder-no-fix", type: "reset_code", autoComplete: "off", placeholder: "Reset Code", name: "reset_code", value: _this.state.reset_code, onChange: _this.onchange_reset_code }), " " ) ), React.createElement( "div", { className: "form-group" }, React.createElement( "label", { className: "control-label visible-ie8 visible-ie9" }, "New Password" ), React.createElement( "div", { className: "input-icon" }, React.createElement("i", { className: "fa fa-lock" }), React.createElement("input", { className: "form-control placeholder-no-fix", type: "password", autoComplete: "off", placeholder: "Password", name: "password", value: _this.state.password, onChange: _this.onchange_password }), " " ) ), React.createElement( "div", { className: "form-actions", style: { marginBottom: 20 } }, React.createElement( "button", { type: "submit", className: "btn green pull-right" }, " Reset Password " ) ) ); }() ) ); }, onchange_login: function onchange_login(e) { this.setState({ login: e.target.value }); }, onchange_reset_code: function onchange_reset_code(e) { this.setState({ reset_code: e.target.value }); }, onchange_password: function onchange_password(e) { this.setState({ password: e.target.value }); }, onchange_email: function onchange_email(e) { this.setState({ email: e.target.value }); }, reset_password: function reset_password(e) { var _this2 = this; e.preventDefault(); console.log("reset_passwd"); var login = this.state.login; var reset_code = this.state.reset_code; var password = this.state.password; NF.rpc.execute("login", "reset_password", [login, reset_code, password], {}, function (err, data) { if (err) { _this2.setState({ alert_msg: err, alert_type: "danger" }); return; } alert("Password reset successfully."); window.location = "/login"; }); } }); NF.register_component("reset_password", Component);