diff --git a/sophal/css/application.css b/sophal/css/application.css new file mode 100644 index 0000000..c5d4f09 --- /dev/null +++ b/sophal/css/application.css @@ -0,0 +1,71 @@ +/** + * Axelor Business Solutions + * + * Copyright (C) 2005-2019 Axelor (). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +/** + * Master CSS file. + */ + +@import url("../lib/open-sans/css/open-sans.css"); +@import url("../lib/jquery.ui/css/smoothness/jquery-ui.css"); +@import url("../lib/jquery.timepicker/jquery-ui-timepicker-addon.css"); + +@import url("../lib/bootstrap/css/bootstrap.css"); +@import url("../lib/bootstrap/css/bootstrap-responsive.css"); +@import url("../lib/font-awesome/css/font-awesome.css"); + +@import url("../lib/slickgrid/slick.grid.css"); +@import url("../lib/slickgrid/plugins/slick.headermenu.css"); + +@import url("../lib/jquery.treetable/css/jquery.treetable.css"); +@import url("../lib/jquery.treetable/css/jquery.treetable.theme.default.css"); + +@import url("../lib/fullcalendar/fullcalendar.css"); +@import url("../lib/fullcalendar/fullcalendar.print.css") print; + +@import url("../lib/dhtmlxGantt/dhtmlxgantt.css"); + +@import url("../lib/handsontable/handsontable.full.css"); + +@import url("../lib/d3/nv/nv.d3.css"); + +@import url("../lib/codemirror/codemirror.min.css"); +@import url("../lib/wysiwyg/wysiwyg-editor.css"); +@import url("wysiwyg.css"); + +@import url("main.css"); + +@import url("tabs.css"); +@import url("navtree.css"); +@import url("slickgrid.css"); + +@import url("view.form.css"); +@import url("view.form.panels.css"); +@import url("view.form.checkbox.css"); +@import url("view.popup.css"); +@import url("view.tree.css"); +@import url("view.portal.css"); +@import url("view.calendar.css"); +@import url("view.gantt.css"); +@import url("view.kanban.css"); +@import url("view.mail.css"); +@import url("view.dms.css"); + +@import url("view.form.hilite.css"); + +@import url("colors.css"); + +@import url("print.css") print; diff --git a/sophal/css/application.login.css b/sophal/css/application.login.css new file mode 100644 index 0000000..ab14d70 --- /dev/null +++ b/sophal/css/application.login.css @@ -0,0 +1,27 @@ +/** + * Axelor Business Solutions + * + * Copyright (C) 2005-2019 Axelor (). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +/** + * Login CSS file. + */ +@import url("../lib/bootstrap/css/bootstrap.css"); +@import url("../lib/bootstrap/css/bootstrap-responsive.css"); +@import url("../lib/font-awesome/css/font-awesome.css"); + +@import url("view.form.checkbox.css"); +@import url("colors.css"); +@import url("login.css"); diff --git a/sophal/css/blue-max/theme.css b/sophal/css/blue-max/theme.css new file mode 100644 index 0000000..c88f26e --- /dev/null +++ b/sophal/css/blue-max/theme.css @@ -0,0 +1,478 @@ +/** + * Axelor Business Solutions + * + * Copyright (C) 2005-2019 Axelor (). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +@import url('../blue-simple/theme.css'); + +[data-name="menu-admin"] .nav-icon { + background-color: #E03997; +} + +.panel, .dashlet { + border: 1px solid #2185D0; +} +.panel .panel-header, +.dashlet .dashlet-header { + padding: 5px 10px 7px !important; + border-top-color: #2185D0; + border-bottom-color: #2185D0; + background-color: #2185D0; +} +.dashlet .dashlet-body { + border-top-color: #2185D0; +} +.report-box .report-tags { + top: 6px; + right: 6px; +} + +.panel .panel-title, .dashlet .dashlet-title, +.dashboard .dashlet-pager, .dashboard .dashlet-buttons > a, .dashboard .dashlet-pager > a { + color: #F9FAFB; +} +.dashboard .dashlet-pager > a.disabled { + color: #F9FAFB; + opacity: .65; +} + +.panel-red .panel, +.panel-red .dashlet { + border-color: #DB2828; +} +.panel-red .panel .panel-header, +.panel-red .dashlet .dashlet-header { + border-top-color: #DB2828; + border-bottom-color: #DB2828; + background-color: #DB2828; +} +.panel-red .dashlet .dashlet-body { + border-top-color: #DB2828; +} +.panel-red.panel { + border-color: #DB2828 !important; +} +.panel-red.panel .panel-header { + border-top-color: #DB2828 !important; + border-bottom-color: #DB2828 !important; + background-color: #DB2828 !important; +} +.panel-red.dashlet { + border-color: #DB2828 !important; +} +.panel-red.dashlet .dashlet-header { + border-top-color: #DB2828 !important; + border-bottom-color: #DB2828 !important; + background-color: #DB2828 !important; +} +.panel-red.dashlet .dashlet-body { + border-top-color: #DB2828 !important; +} +.panel-orange .panel, +.panel-orange .dashlet { + border-color: #F2711C; +} +.panel-orange .panel .panel-header, +.panel-orange .dashlet .dashlet-header { + border-top-color: #F2711C; + border-bottom-color: #F2711C; + background-color: #F2711C; +} +.panel-orange .dashlet .dashlet-body { + border-top-color: #F2711C; +} +.panel-orange.panel { + border-color: #F2711C !important; +} +.panel-orange.panel .panel-header { + border-top-color: #F2711C !important; + border-bottom-color: #F2711C !important; + background-color: #F2711C !important; +} +.panel-orange.dashlet { + border-color: #F2711C !important; +} +.panel-orange.dashlet .dashlet-header { + border-top-color: #F2711C !important; + border-bottom-color: #F2711C !important; + background-color: #F2711C !important; +} +.panel-orange.dashlet .dashlet-body { + border-top-color: #F2711C !important; +} +.panel-yellow .panel, +.panel-yellow .dashlet { + border-color: #FBBD08; +} +.panel-yellow .panel .panel-header, +.panel-yellow .dashlet .dashlet-header { + border-top-color: #FBBD08; + border-bottom-color: #FBBD08; + background-color: #FBBD08; +} +.panel-yellow .dashlet .dashlet-body { + border-top-color: #FBBD08; +} +.panel-yellow.panel { + border-color: #FBBD08 !important; +} +.panel-yellow.panel .panel-header { + border-top-color: #FBBD08 !important; + border-bottom-color: #FBBD08 !important; + background-color: #FBBD08 !important; +} +.panel-yellow.dashlet { + border-color: #FBBD08 !important; +} +.panel-yellow.dashlet .dashlet-header { + border-top-color: #FBBD08 !important; + border-bottom-color: #FBBD08 !important; + background-color: #FBBD08 !important; +} +.panel-yellow.dashlet .dashlet-body { + border-top-color: #FBBD08 !important; +} +.panel-olive .panel, +.panel-olive .dashlet { + border-color: #B5CC18; +} +.panel-olive .panel .panel-header, +.panel-olive .dashlet .dashlet-header { + border-top-color: #B5CC18; + border-bottom-color: #B5CC18; + background-color: #B5CC18; +} +.panel-olive .dashlet .dashlet-body { + border-top-color: #B5CC18; +} +.panel-olive.panel { + border-color: #B5CC18 !important; +} +.panel-olive.panel .panel-header { + border-top-color: #B5CC18 !important; + border-bottom-color: #B5CC18 !important; + background-color: #B5CC18 !important; +} +.panel-olive.dashlet { + border-color: #B5CC18 !important; +} +.panel-olive.dashlet .dashlet-header { + border-top-color: #B5CC18 !important; + border-bottom-color: #B5CC18 !important; + background-color: #B5CC18 !important; +} +.panel-olive.dashlet .dashlet-body { + border-top-color: #B5CC18 !important; +} +.panel-green .panel, +.panel-green .dashlet { + border-color: #21BA45; +} +.panel-green .panel .panel-header, +.panel-green .dashlet .dashlet-header { + border-top-color: #21BA45; + border-bottom-color: #21BA45; + background-color: #21BA45; +} +.panel-green .dashlet .dashlet-body { + border-top-color: #21BA45; +} +.panel-green.panel { + border-color: #21BA45 !important; +} +.panel-green.panel .panel-header { + border-top-color: #21BA45 !important; + border-bottom-color: #21BA45 !important; + background-color: #21BA45 !important; +} +.panel-green.dashlet { + border-color: #21BA45 !important; +} +.panel-green.dashlet .dashlet-header { + border-top-color: #21BA45 !important; + border-bottom-color: #21BA45 !important; + background-color: #21BA45 !important; +} +.panel-green.dashlet .dashlet-body { + border-top-color: #21BA45 !important; +} +.panel-teal .panel, +.panel-teal .dashlet { + border-color: #00B5AD; +} +.panel-teal .panel .panel-header, +.panel-teal .dashlet .dashlet-header { + border-top-color: #00B5AD; + border-bottom-color: #00B5AD; + background-color: #00B5AD; +} +.panel-teal .dashlet .dashlet-body { + border-top-color: #00B5AD; +} +.panel-teal.panel { + border-color: #00B5AD !important; +} +.panel-teal.panel .panel-header { + border-top-color: #00B5AD !important; + border-bottom-color: #00B5AD !important; + background-color: #00B5AD !important; +} +.panel-teal.dashlet { + border-color: #00B5AD !important; +} +.panel-teal.dashlet .dashlet-header { + border-top-color: #00B5AD !important; + border-bottom-color: #00B5AD !important; + background-color: #00B5AD !important; +} +.panel-teal.dashlet .dashlet-body { + border-top-color: #00B5AD !important; +} +.panel-blue .panel, +.panel-blue .dashlet { + border-color: #2185D0; +} +.panel-blue .panel .panel-header, +.panel-blue .dashlet .dashlet-header { + border-top-color: #2185D0; + border-bottom-color: #2185D0; + background-color: #2185D0; +} +.panel-blue .dashlet .dashlet-body { + border-top-color: #2185D0; +} +.panel-blue.panel { + border-color: #2185D0 !important; +} +.panel-blue.panel .panel-header { + border-top-color: #2185D0 !important; + border-bottom-color: #2185D0 !important; + background-color: #2185D0 !important; +} +.panel-blue.dashlet { + border-color: #2185D0 !important; +} +.panel-blue.dashlet .dashlet-header { + border-top-color: #2185D0 !important; + border-bottom-color: #2185D0 !important; + background-color: #2185D0 !important; +} +.panel-blue.dashlet .dashlet-body { + border-top-color: #2185D0 !important; +} +.panel-violet .panel, +.panel-violet .dashlet { + border-color: #6435C9; +} +.panel-violet .panel .panel-header, +.panel-violet .dashlet .dashlet-header { + border-top-color: #6435C9; + border-bottom-color: #6435C9; + background-color: #6435C9; +} +.panel-violet .dashlet .dashlet-body { + border-top-color: #6435C9; +} +.panel-violet.panel { + border-color: #6435C9 !important; +} +.panel-violet.panel .panel-header { + border-top-color: #6435C9 !important; + border-bottom-color: #6435C9 !important; + background-color: #6435C9 !important; +} +.panel-violet.dashlet { + border-color: #6435C9 !important; +} +.panel-violet.dashlet .dashlet-header { + border-top-color: #6435C9 !important; + border-bottom-color: #6435C9 !important; + background-color: #6435C9 !important; +} +.panel-violet.dashlet .dashlet-body { + border-top-color: #6435C9 !important; +} +.panel-purple .panel, +.panel-purple .dashlet { + border-color: #A333C8; +} +.panel-purple .panel .panel-header, +.panel-purple .dashlet .dashlet-header { + border-top-color: #A333C8; + border-bottom-color: #A333C8; + background-color: #A333C8; +} +.panel-purple .dashlet .dashlet-body { + border-top-color: #A333C8; +} +.panel-purple.panel { + border-color: #A333C8 !important; +} +.panel-purple.panel .panel-header { + border-top-color: #A333C8 !important; + border-bottom-color: #A333C8 !important; + background-color: #A333C8 !important; +} +.panel-purple.dashlet { + border-color: #A333C8 !important; +} +.panel-purple.dashlet .dashlet-header { + border-top-color: #A333C8 !important; + border-bottom-color: #A333C8 !important; + background-color: #A333C8 !important; +} +.panel-purple.dashlet .dashlet-body { + border-top-color: #A333C8 !important; +} +.panel-pink .panel, +.panel-pink .dashlet { + border-color: #E03997; +} +.panel-pink .panel .panel-header, +.panel-pink .dashlet .dashlet-header { + border-top-color: #E03997; + border-bottom-color: #E03997; + background-color: #E03997; +} +.panel-pink .dashlet .dashlet-body { + border-top-color: #E03997; +} +.panel-pink.panel { + border-color: #E03997 !important; +} +.panel-pink.panel .panel-header { + border-top-color: #E03997 !important; + border-bottom-color: #E03997 !important; + background-color: #E03997 !important; +} +.panel-pink.dashlet { + border-color: #E03997 !important; +} +.panel-pink.dashlet .dashlet-header { + border-top-color: #E03997 !important; + border-bottom-color: #E03997 !important; + background-color: #E03997 !important; +} +.panel-pink.dashlet .dashlet-body { + border-top-color: #E03997 !important; +} +.panel-brown .panel, +.panel-brown .dashlet { + border-color: #A5673F; +} +.panel-brown .panel .panel-header, +.panel-brown .dashlet .dashlet-header { + border-top-color: #A5673F; + border-bottom-color: #A5673F; + background-color: #A5673F; +} +.panel-brown .dashlet .dashlet-body { + border-top-color: #A5673F; +} +.panel-brown.panel { + border-color: #A5673F !important; +} +.panel-brown.panel .panel-header { + border-top-color: #A5673F !important; + border-bottom-color: #A5673F !important; + background-color: #A5673F !important; +} +.panel-brown.dashlet { + border-color: #A5673F !important; +} +.panel-brown.dashlet .dashlet-header { + border-top-color: #A5673F !important; + border-bottom-color: #A5673F !important; + background-color: #A5673F !important; +} +.panel-brown.dashlet .dashlet-body { + border-top-color: #A5673F !important; +} +.panel-grey .panel, +.panel-grey .dashlet { + border-color: #767676; +} +.panel-grey .panel .panel-header, +.panel-grey .dashlet .dashlet-header { + border-top-color: #767676; + border-bottom-color: #767676; + background-color: #767676; +} +.panel-grey .dashlet .dashlet-body { + border-top-color: #767676; +} +.panel-grey.panel { + border-color: #767676 !important; +} +.panel-grey.panel .panel-header { + border-top-color: #767676 !important; + border-bottom-color: #767676 !important; + background-color: #767676 !important; +} +.panel-grey.dashlet { + border-color: #767676 !important; +} +.panel-grey.dashlet .dashlet-header { + border-top-color: #767676 !important; + border-bottom-color: #767676 !important; + background-color: #767676 !important; +} +.panel-grey.dashlet .dashlet-body { + border-top-color: #767676 !important; +} +.panel-black .panel, +.panel-black .dashlet { + border-color: #1B1C1D; +} +.panel-black .panel .panel-header, +.panel-black .dashlet .dashlet-header { + border-top-color: #1B1C1D; + border-bottom-color: #1B1C1D; + background-color: #1B1C1D; +} +.panel-black .dashlet .dashlet-body { + border-top-color: #1B1C1D; +} +.panel-black.panel { + border-color: #1B1C1D !important; +} +.panel-black.panel .panel-header { + border-top-color: #1B1C1D !important; + border-bottom-color: #1B1C1D !important; + background-color: #1B1C1D !important; +} +.panel-black.dashlet { + border-color: #1B1C1D !important; +} +.panel-black.dashlet .dashlet-header { + border-top-color: #1B1C1D !important; + border-bottom-color: #1B1C1D !important; + background-color: #1B1C1D !important; +} +.panel-black.dashlet .dashlet-body { + border-top-color: #1B1C1D !important; +} +.file-item .file-item { + display: block !important; + } + .file-item button.btn.ng-hide:first-child{ + display: block !important; + pointer-events: none; + + } + + button.btn.ng-hide .fa-arrow-circle-up:before{ + content: "\f0c6" !important; + } \ No newline at end of file diff --git a/sophal/css/blue-simple/theme.css b/sophal/css/blue-simple/theme.css new file mode 100644 index 0000000..4ab3b7a --- /dev/null +++ b/sophal/css/blue-simple/theme.css @@ -0,0 +1,111 @@ +/** + * Axelor Business Solutions + * + * Copyright (C) 2005-2019 Axelor (). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +header .navbar .nav > li > a:focus, +header .navbar .nav > li > a:hover, +header .navbar .nav > li.dropdown.open > a.dropdown-toggle { + color: #2185D0; +} + +header .navbar .nav .dropdown-menu > li > a:hover, +header .navbar .nav .dropdown-menu > li > a:focus, +header .navbar .nav .dropdown-submenu:hover > a, +header .navbar .nav .dropdown-submenu:focus > a { + background-color: #2185D0; +} + +header .navbar .nav > li > a:focus, +header .navbar .nav > li > a:hover, +header .navbar .nav > li.dropdown.open > a.dropdown-toggle { + color: #2185D0; +} + +textarea:focus, input[type="text"]:focus, +input[type="password"]:focus, +input[type="datetime"]:focus, +input[type="datetime-local"]:focus, +input[type="date"]:focus, +input[type="month"]:focus, +input[type="time"]:focus, +input[type="week"]:focus, +input[type="number"]:focus, +input[type="email"]:focus, +input[type="url"]:focus, +input[type="search"]:focus, +input[type="tel"]:focus, +input[type="color"]:focus, +.uneditable-input:focus { + border-color: #2185D0; +} + +.ui-datepicker .ui-slider-handle.ui-state-focus, +.ui-datepicker .ui-slider-handle.ui-state-hover, +.ui-datepicker .ui-state-highlight { + border-color: #2185D0 !important; +} + +.ui-datepicker .ui-state-active, +.ui-datepicker .ui-slider-handle.ui-state-hover { + background-color: #2185D0 !important; +} + +/* navs */ +.nav-tree > li.open { + border-left-color: #2185D0; +} + +.nav-tabs > li.active > a, +.nav-tabs > li.active > a:hover, +.nav-tabs > li.active > a:focus { + border-top-color: #2185D0 !important; +} + +/* selects */ +.tag-select:focus, +.tag-select.focus { + border-color: #2185D0; +} + +.nav-select li.active a.nav-label, +.nav-select li.active a.nav-label:after { + background: #2185D0; +} + +/* boxes */ +.ibox input:focus + .box:before { + border-color: #2185D0; +} +.ibox:hover .box:before, +.ibox:hover input:focus + .box:before { + border-color: #2185D0; +} +.ibox input:checked + .box:before { + border-color: #2185D0; + background-color: #2185D0; +} +.ibox:hover input:disabled:checked + .box:before { + border-color: 1px solid #2185D0; +} +.iswitch { + background-color: #2185D0; +} + +/* panels */ +.panel .panel-header, +.dashlet .dashlet-header { + border-top-width: 2px; +} diff --git a/sophal/css/colors.css b/sophal/css/colors.css new file mode 100644 index 0000000..e81b2b3 --- /dev/null +++ b/sophal/css/colors.css @@ -0,0 +1,356 @@ +/** + * Axelor Business Solutions + * + * Copyright (C) 2005-2019 Axelor (). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +header { + font-weight: 600; +} + +header .navbar-inner { + background-color: #fff; + box-shadow: none !important; +} + +header .navbar .nav .dropdown-menu { + border: 1px solid #d3d3d3; + border-top: 1px solid #e7e7e7; +} + +header .navbar .nav .dropdown-submenu > .dropdown-menu { + margin-left: 0; + border-top: 1px solid #d3d3d3; +} + +header .navbar .nav .dropdown-menu > li > a { + padding: 6px 25px 6px 20px; + line-height: 20px; +} + +header .navbar .nav .dropdown-submenu > a:after { + margin-right: -15px; +} + +header .navbar .nav .dropdown-submenu:hover > a:after { + border-left-color: #fff; +} + +header .navbar .nav .fa-bars, +header .navbar .dropdown-toggle .caret { + color: #3ad08f; +} + +.navbar .nav li.dropdown.open > .dropdown-toggle, +.navbar .nav li.dropdown.active > .dropdown-toggle, +.navbar .nav li.dropdown.open.active > .dropdown-toggle { + color: #107a4a; +} + +header .navbar .nav > li > a:focus, +header .navbar .nav > li > a:hover { + color: #3ad08f; +} + +header .navbar .nav .fa-bars:hover, +header .navbar .nav .fa-bars:focus { + color: #107a4a; +} + +header .dropdown-menu > li > a:hover, +header .dropdown-menu > li > a:focus, +header .dropdown-submenu:hover > a, +header .dropdown-submenu:focus > a { + color: #fff; + background-color: #3ad08f; +} + +.slick-header-menuitem:hover { + color: #fff; + background-color: #5377b1; + background-image: none; +} +.ui-datepicker .ui-state-active, +.ui-datepicker .ui-slider-handle.ui-state-hover { + color: #fff !important; + background-color: #0275d8 !important; + background-image: none !important; +} +.ui-datepicker .ui-slider-handle.ui-state-focus, +.ui-datepicker .ui-slider-handle.ui-state-hover, +.ui-datepicker .ui-state-highlight { + border: 1px solid #0275d8 !important +} +.ui-menu .ui-menu-item a.ui-state-focus { + color: #262626; + text-decoration: none; + border-color: #f5f5f5; + background-color: #f5f5f5; + background-image: none; +} + +.sidebar { + background-color: #2f4050; +} + +.view-tabs { + background-color: #f3f3f4; +} + +.nav-tabs-wrap { + height: 38px; + background-color: #fff; + border-bottom: 1px solid #e7e7e7; +} + +.nav-tabs-wrap.empty { + display: none; +} + +.nav-tabs > li { + margin-right: -1px; + margin-bottom: -1px; +} + +.nav-tabs > li > a { + color: #555; + background-color: #fff; + padding-top: 6px; + padding-bottom: 6px; +} + +.nav-tabs > li.active > a { + color: #333; +} + +.nav-tabs > li > a, +.nav-tabs > li.active > a { + margin: 0; + border-radius: 0; + border: 1px solid #e7e7e7; +} + +.nav-tabs > li > a:hover, +.nav-tabs > li > a:focus, +.nav-tabs > li:hover > a { + color: #333; + border: 1px solid #e7e7e7; + background-color: #fff; +} + +.nav-tabs > li.active > a, +.nav-tabs > li.active > a:hover, +.nav-tabs > li.active > a:focus { + border: 1px solid #e7e7e7; + border-top: 3px solid #0275d8; + border-bottom: 1px solid transparent; + background-color: #fff; + padding-top: 4px; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} + +.nav-tabs-main > li:not(.active) > a { + border-top-color: #e7e7e7 !important; +} + +.nav-tabs-main > li:not(.active) > a > i.fa { + opacity: 0.55; +} + +.nav-tabs-strip { + height: 32px; + background-color: #f3f3f4; +} + +.nav-tabs-strip .nav-tabs { + padding: 0 8px; + border-bottom-color: #e7e7e7; +} + +.nav-tabs-overflow .nav-tabs { + padding: 0; +} + +.nav-tabs-scroll-l, +.nav-tabs-scroll-r { + bottom: 6px; + margin-top: 0; + padding-top: 8px; + background-color: #f3f3f4; + border-bottom: 1px solid #e7e7e7; +} + +.nav-tabs-scroll-l a, +.nav-tabs-scroll-r a { + width: 100%; + padding-left: 3px; +} + +table.form-layout .tabbable-tabs .tab-content { + border-color: #e7e7e7; +} + +.bordered, +.bordered-box { + border-color: #e7e7e7; +} + +.view-container .form-view > div[ui-view-form].has-width { + background-color: #f3f3f4; +} + +/** remove corners */ +.btn, +.ui-menu, +.dropdown-menu, +.slick-header-menu, +[class*="ui-corner"] { + border-radius: 0 !important; +} +.portlet, +.portlet-header .navbar-inner, +.portlet-body, +.portlet-content { + border-radius: 0 !important; +} +input, button, textarea, select, fieldset, pre { + border-radius: 0 !important; +} +.tag-select, +.tag-select .label { + border-radius: 0; +} +.tag-select .picker-icons > i.fa { + padding-top: 3px; +} +.tag-select .label { + background-color: #0275d8; +} + +.select-item .picker-icons i.fa-times { + font-size: 12px; + color: #ccc; +} + +.select-item .picker-icons i.fa-times:hover { + color: #333; +} + +.m2o-editor-controls i.fa, +.picker-icons i.fa { + color: #ccc; +} +.m2o-editor-controls i.fa:hover, +.picker-icons i.fa:hover { + color: #333; +} + +.progress, +.progress .bar { + border-radius: 0 !important; + box-shadow: none; +} + +.nvd3.nv-noData { + font-weight: 400; + fill: #333333; +} + +/* jquery fixes */ +.ui-widget-header a { + color: #0088cc; +} +.ui-dialog .ui-dialog-titlebar a { + color: #222; +} + +/* == v5 == */ + +.record-toolbar button, +.record-toolbar .btn { + border: 0; +} + +.record-toolbar .button-menu.open a.btn, +.record-toolbar .button-menu a.btn:hover { + background-color: #eee; +} + +.tag-select { + border-top-width: 0; + border-left-width: 0; + border-right-width: 0; + padding-left: 0; +} +.tag-select > .picker-icons { + right: 0; +} + +.nav-tabs-main > li.active > a.bg-red { border-top-color: #DB2828 !important; } +.nav-tabs-main > li.active > a.bg-orange { border-top-color: #F2711C !important; } +.nav-tabs-main > li.active > a.bg-yellow { border-top-color: #FBBD08 !important; } +.nav-tabs-main > li.active > a.bg-olive { border-top-color: #B5CC18 !important; } +.nav-tabs-main > li.active > a.bg-green { border-top-color: #21BA45 !important; } +.nav-tabs-main > li.active > a.bg-teal { border-top-color: #00B5AD !important; } +.nav-tabs-main > li.active > a.bg-blue { border-top-color: #2185D0 !important; } +.nav-tabs-main > li.active > a.bg-violet { border-top-color: #6435C9 !important; } +.nav-tabs-main > li.active > a.bg-purple { border-top-color: #A333C8 !important; } +.nav-tabs-main > li.active > a.bg-pink { border-top-color: #E03997 !important; } +.nav-tabs-main > li.active > a.bg-brown { border-top-color: #A5673F !important; } +.nav-tabs-main > li.active > a.bg-grey { border-top-color: #767676 !important; } +.nav-tabs-main > li.active > a.bg-black { border-top-color: #1B1C1D !important; } +.nav-tabs-main > li.active > a.bg-white { border-top-color: #F9FAFB !important; } + +.panel .panel-related .panel-header, +.panel-tabs .panel-related .panel-header, +.panel .dashboard .dashlet-header, +.panel-tabs .dashboard .dashlet-header, +.panel .one2many-item > .navbar .navbar-inner, +.panel-tabs .one2many-item > .navbar .navbar-inner, +.panel .many2many-item > .navbar .navbar-inner, +.panel-tabs .many2many-item > .navbar .navbar-inner { + border: 0; + padding: 8px 2px; +} + +.panel .one2many-item > .slickgrid, +.panel-tabs .one2many-item > .slickgrid, +.panel .many2many-item > .slickgrid, +.panel-tabs .many2many-item > .slickgrid { + top: 34px; +} + +.panel .panel-related, +.panel-tabs .panel-related, +.panel .form-item .dashlet, +.panel-tabs .form-item .dashlet { + border: 0; + box-shadow: none; +} + +.panel .panel-related .panel-body .slickgrid, +.panel-tabs .panel-related .panel-body .slickgrid, +.panel .form-item .dashlet .dashlet-body .portlet-grid .slickgrid, +.panel-tabs .form-item .dashlet .dashlet-body .portlet-grid .slickgrid { + border: 1px solid #ddd; + height: calc(100% - 2px); +} + +.panel-related .panel-header .icons-bar > a, +.one2many-item .navbar .icons-bar > a, +.many2many-item .navbar .icons-bar > a { + margin-left: 16px; +} +/* == v5 == */ diff --git a/sophal/css/core.css b/sophal/css/core.css new file mode 100644 index 0000000..9ec6396 --- /dev/null +++ b/sophal/css/core.css @@ -0,0 +1,592 @@ +/** + * Axelor Business Solutions + * + * Copyright (C) 2019 Axelor (). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +/** + ********************************************* View content (default background image) ************************************************************** + */ +.view-container .form-view > div[ui-view-form].has-width { + background: url(../public/img/background.gif); +} +.view-container .form-view > div[ui-view-form].has-width > form{ + width: 95%; +} + +/************************************ Table Layout ******************************************************************************/ + +table.form-layout td.form-label > label{ + float:left; + text-align: left; +} + +table.form-layout td.form-item .separator-item > span { + font-weight: bold; +} + + +/************************************** Header Layout **************************************************************************/ + +header .navbar-inverse .navbar-inner { + background-image: linear-gradient(to bottom, #646060, #262626); + background-image: -moz-linear-gradient(to bottom, #646060, #262626); + background-image: linear-gradient(to bottom, #646060, #262626); + border-bottom: 1px solid #262626; + + filter: none; /*IE*/ +} + + +header .container-fluid { + padding-right: 20px; + padding-left: 30px; +} +.dropdown-menu > li > a{ +/* color: white !important; */ + color: white; + white-space: normal; +} + +.navbar .navbar-inner .container-fluid * > img{ + padding-right: 5px; +} + +header .navbar-inverse .dropdown-menu{ + margin-right: -6px !important; + margin-left: -4px !important; +} + +.container > img{ + padding-top: 5px; +} + +.calendar-view .record-pager > span{ + margin-right: 10px; + margin-top: 2px !important; +} + +header .navbar-inverse .dropdown-menu .divider{ + border-bottom: 1px solid white !important; + border-top: 1px solid white !important; +} + +.dropdown-toggle { + margin-left: -4px; + margin-right: -5px; +} + + +.pull-right li:nth-child(2) a:before{ + content:"\f015"; + padding:5px; + font-family:FontAwesome; + font-size:20px; +} +.pull-right li:nth-child(4) a.dropdown-toggle:before{ + content:"\f05a"; + padding:5px; + font-family:FontAwesome; + font-size:20px; +} +.pull-right li:nth-child(6) a.dropdown-toggle:before{ + content:"\f007"; + padding:5px 5px 8px 2px; + font-family:FontAwesome; + font-size:18px; +} +.pull-right li:nth-child(4) img,.pull-right li:nth-child(2) img,.pull-right li:nth-child(6) img{ + display:none; +} + + .navbar .nav > li > .dropdown-menu.pull-right{ + right: 1px; +} + + .pull-right li:nth-child(6) .dropdown-menu{ + right:1px !important; +} + +header .navbar-inverse .dropdown-menu > li > a:hover{ + background-color: #E0DFDF !important; + color : #333333 !important; + font-style: none; +} + + +header .navbar-inverse .dropdown-menu, +header .navbar-inverse .dropdown-submenu:hover > a, +header .navbar-inverse .dropdown-submenu:focus > a { + background-color: #646060 !important; + border :none; + margin-left: 5px !important; +} +.dropdown-submenu > .dropdown-menu{ + left : 97%; +} +.navbar .nav > li > a { + margin-left: 5px; +} +.navbar-inverse .nav li.dropdown.open > .dropdown-toggle, +.navbar-inverse .nav li.dropdown.active > .dropdown-toggle, +.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle { + background-color: #646060; + color: white !important; +} + +/************************************************* Menu Layout **************************************************************************/ + + +header .navbar-inverse .dropdown-menu > li > a{ + color: white; +} + +.splitter-vertical{ + background-image: linear-gradient(to left, #646060, #262626); + background-image: linear-gradient(to left, #646060, #262626); + background-image: llinear-gradient(to left, #646060, #262626); + padding-right: -5px; + width:5px !important; + height: auto; +/* left: 210px !important; */ +} + +.splitter-vertical:before{ + content: ".\a.\a.\a.\a.\a.\a."; + color: white !important; + position: absolute; + top: 50%; + line-height: 5px; + left: 0px; + font-size: 18px; +} + + +.filter-menu { + margin-left: 8px; + background: #f1f1f1; + top: 40px !important; + border-radius : 6px !important; +} +.filter-menu:before { +/* content: "\f0d8"; */ + font-family: FontAwesome; + position: absolute; + top: -12px; + left: 50.8%; + color: #f1f1f1; + font-size: 20px; +} +.filter-menu form{ + border-top: 1px solid #dddddd; +} + +.nav-list > .active * > .icon-caret-down:before, +.nav-list > .active * > .icon-caret-right:before{ + color: white !important; +} +.splitter-footer{ + margin-bottom: 5px; + padding-top: 3px; +} +.nav-list > .active * > .icon-caret-down:before{ + color: white !important; +} + +.input-append input, .input-append select, .input-append .uneditable-input{ + padding-bottom : 7px; +} + +.record-pager-text{ + margin-top: 6px; + margin-right: 12px; +} + +.stackbar .navbar, +.stackbar .navbar * { + color: white; +} +.nav > li > a > img{ + margin-bottom: 3px; +} +.navbar .navbar-inner .container-fluid * > img{ + float:left !important; +} +.ui-dialog .ui-dialog-titlebar { + border : none; + border-bottom: 1px solid #B2C3D6; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + background: none; + padding: 9px 15px; + font-size: 24.5px; + line-height: 30px; + color: black !important; +} + +.ui-dialog .ui-dialog-buttonpane { + text-align: left; + border : none; + border-top: 1px solid #B2C3D6;left: 210px + background-image: none; + margin: .5em 0 0 0; + padding: .3em 1em .5em .4em; +} + +.nav-tabs > li > a, .nav-pills > li > a { + padding-right: 12px; + padding-left: 12px; + margin-right: 0px; + line-height: 14px; +} + +.navbar .brand{ + text-shadow: none; + font-weight: normal; +} +.stackbar .navbar * > .icon-plus:before, +.stackbar .navbar * > .icon-refresh:before, +.stackbar .navbar * > .icon-pencil:before, +.stackbar .navbar * > .icon-minus:before, +.stackbar .navbar * > .icon-search:before, +.navbar .nav li.dropdown > .dropdown-toggle .caret, +.nav-tabs .inactive:hover > .icon-remove:before, +.nav-tabs-wrap .nav-tabs .active > .icon-remove:before, +.icon-step-backward:before, +.icon-step-forward:before, +.icon-chevron-down:before, +.icon-chevron-up:before{ + color: white !important ; +} + +/* .icon-remove:before{ */ +/* color: white; */ +/* } */ +.nav-tabs-strip .nav-tabs { + height: 30px; +} + +.nav-tabs-strip { + height: 30px; +} + + + +.nav-tabs-strip > .nav.nav-tabs.nav-tabs-scrollable.nav-tabs-closable > .ng-scope.active, +.nav-tabs-strip > .nav.nav-tabs.nav-tabs-scrollable.nav-tabs-closable > .ng-scope.inactive { + height: 30px; +} + +.nav-tabs-strip > .nav.nav-tabs.nav-tabs-scrollable.nav-tabs-closable > .ng-scope.active > a, +.nav-tabs-strip > .nav.nav-tabs.nav-tabs-scrollable.nav-tabs-closable > .ng-scope.inactive > a { + height: 13px; + margin:1px; +} + +.nav-tabs-closable li > i { + top: 3px; + right: 3px; +} + +/** + **************************************** Button Layout *************************************************************************** + */ +a.button-item.img-button { + width: 100% !important; +} + +.navbar .container{ + padding-right: 10px; +} +.navbar .btn, .navbar .btn-group{ + margin-right: -2px; + margin-bottom: 2px; +} +a.button-item.img-button img { + height: 64px; +} + +.icon-table:before{ + content: "\f0ca"; +} +.icon-edit:before{ + content: "\f0f6"; +} + +.btn-group * > .icon-eye-open:before{ + content: "\f02b"; +} + .icon-eye-open:before{ + content: "\f06e"; +} +.btn-group * > .icon-remove:before { + content: "\f014"; +/* color : black; */ +} +.btn-group * >.icon-file:before { + content: "\f067"; +} +/* .open > .dropdown-menu > li > a > .icon-off:before, .open > .dropdown-menu > li > a > .icon-cog:before{ */ +/* color:white !important; */ +/* } */ + +.btn-group > .btn > img{ + padding-right: 7px; +} +.btn-group > .btn + .btn{ + margin-left: 1px; + margin-right: -2px; + margin-top: 0px; + +} +.record-pager.pull-right > span, .record-pager.pull-left > .btn-group{ + margin-top: 2px; +} +.btn-text{ + margin-left: 4px; +} +.record-toolbar .dropdown a.dropdown-toggle{ + margin-top: 4px; + padding: 4px 8px 5px; +} +.btn-group{ + margin-top:2px !important; +} +.pull-right { + margin-top: 2px; +} +/** + ******************************************************* SN ********************************************************* + */ + .sn-buttons { + height: 30px !important; + width: 50px !important; + border: none !important; + display: inline-block; +} + +.sn-buttons img { + height: 25px; +} + +.sn-comment-icons { + top: -3px; +} + + +/** + * Trail + */ +.trail-form { + background-color: #fff; + border-style: solid; + border-width: 1px; + border-color: #a2a2a2; +} + +.trail-form.trail-child { + margin-left: 60px; + width: 592px !important; + background-color: #eee; + border-style: none; +} + +.trail-expand-button { + bottom: 1px !important; + right: 1px; +} +.nav-tabs-closable{ + height: 38px !important; +} + +.nav-tabs-closable* > a > img{ + height: 35px !important; +} +.trail-form-message td.form-item * { + min-width: auto !important; + min-height: auto !important; + height: auto !important; + width: auto !important; + float: left; +} + +.trail-form-content { + color: #333333; +} + +.trail-form-content > .html-display-text { + padding-top: 0px !important; +} + +.trail-form-footer { + color: #909090; + font-size: 11px; + line-height: 26px; +} + +.trail-form-footer label { + font-size: 11px !important; +} + +/*********************************************************** Navigation Tab And Container **********************************************************/ + +.view-container { + margin-top: 0px; +} +.navigation-tabs.ng-pristine.ng-valid > img{ + height: 32px; +} + +.navigation-tabs{ + top: 8px; + left : -1px; + margin-left: 0px; +} + +.btn-group > .btn:last-child, +.btn-group > .dropdown-toggle { + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; +} +.btn-group > .btn.large:first-child , +.btn-group > .btn:first-child{ + margin-left: 0; + border-top-left-radius: 6px; + border-bottom-left-radius: 6px; +} + +.record-toolbar .view-switcher { + margin-left: 10px; +} + +.record-toolbar .dropdown a.dropdown-toggle { + margin-left: 3px; + margin-right: -15px; +} + +.record-toolbar .menu-bar { + margin-left: 10px; + height: 37px; + padding-bottom: 3px; +} +/* .record-toolbar .button-item{ */ +/* line-height: 19px !important; */ +/* } */ +input.search-query{ + margin-bottom: 5px !important; + margin-top: 4px; + padding-bottom: 6px; +} + +.navbar .nav li.dropdown > .dropdown-toggle .caret, +.navbar .nav li.dropdown > .dropdown-toggle:hover .caret, +.navbar .nav li.dropdown > .dropdown-toggle:focus .caret{ + border-top-color: white; + border-bottom-color: white; +} + +.pull-right > .btn{ + margin-bottom: 4px !important; + padding: 5px 12px 5px 15px; + border-radius: 6px; +} + +table.form-layout td.form-label label.required:after { + color: red; + content: " *"; + font-weight: bold; + font-size: 18px; + vertical-align: middle !important; +} + +table.form-layout td.form-label label.required{ + color: #333333; +} + +.form-item .form-item-container.ng-invalid > textarea, +.form-item .form-item-container.ng-invalid > .picker-input input, +.form-item .form-item-container.ng-invalid > .ui-spinner input, +.form-item .form-item-container.ng-invalid > input, +.form-item .form-item-container.ng-invalid > .tag-select, +.form-item .input-append.ng-invalid > input, +.form-item .picker-input.ng-invalid > input{ + border-color: red; +} +span[required] > input:focus,span[required] > div > input:focus,span[required]>span>input:focus{ + border-color:grey ; + box-shadow: 0px 0px 5px red !important; + +} +.view-content{ + top : 32px; +} +.view-container .form-view > div:last-child{ + top: 44px; +} +.nav-tabs-menu, .nav-tabs-scroll-l, +.nav-tabs-scroll-r, .nav-tabs { + border-bottom: 0; +} +.grid-view > .slickgrid{ + top : 42px; +} +.nav-list > li > a, .nav-list .nav-header{ + text-shadow: none; +} + + +/*************************** Grid Icon changes... *********************************************************/ +.slick-cell > a{ + color:inherit; + font-size: 16px; +} +.slick-cell > a:hover, .slick-cell > a:focus{ + color:white; + text-decoration: none; +} +.slick-cell.edit-icon i:hover, .slick-cell.edit-icon i:focus{ + color:white; +} +.record-toolbar .button-item > i { + font-size: 16px; + line-height: 20px; + padding-right : 5px; +} + +.slick-cell .picker-input > .picker-icons > i[class^=icon] { + color: #222222; +} +/************************ Toolbar menu item ******************************************************/ + +.record-toolbar .menu-bar a.disabled{ + opacity: 0.50; + cursor: default; +} +.record-pager.pull-left > span{ + padding : 8px; +} +.splitter-panel{ +/* top : 2px; */ +} + +hr { + margin: 18px 0; + border: 0; + margin-top: -1px !important; +} + +sidebar ng-scope splitter-panel{ + + width : 210px !important; +} \ No newline at end of file diff --git a/sophal/css/custom.css b/sophal/css/custom.css new file mode 100644 index 0000000..2cdf600 --- /dev/null +++ b/sophal/css/custom.css @@ -0,0 +1,690 @@ +/** + * Axelor Business Solutions + * + * Copyright (C) 2019 Axelor (). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +.font-italic{ + font-style:italic; +} + +.font-normal{ + font-weight:normal !important; +} + +.font-bold{ + font-weight:bold !important; +} + +.font-10px{ + font-size:10px; +} + +.font-11px{ + font-size:11px; +} + +.font-12px{ + font-size:12px; +} + +.font-13px{ + font-size:13px; +} + +.font-14px{ + font-size:14px; +} + +.font-15px{ + font-size:15px; +} + +.font-16px{ + font-size:16px; +} + +.font-18px{ + font-size:18px; +} + +.font-20px{ + font-size:20px !important; +} + +.font-22px{ + font-size:22px; +} + +.font-24px{ + font-size:24px; +} + +.font-verdana{ + font-family:Verdana; +} + +.font-times{ + font-family: Times New Roman; +} + +.font-arial{ + font-family: Arial; +} +.font-courier{ + font-family: Courier; +} +.font-sans-serif{ + font-family: sans-sarif; +} +.font-georgia{ + font-family: Aeorgia; +} +.font-trebuchet{ + font-family: Trebuchet; +} +.font-lucida-console{ + font-family: Lucida Console; +} +.font-tahoma{ + font-family: Tahoma; +} +.font-impact{ + font-family: Impact; +} + +.font-black{ + color: black !important; +} + +.font-blue{ + color: blue !important; +} + +.font-grey{ + color: grey !important; +} + +.font-green{ + color: green !important; +} + +.font-lime{ + color: lime !important; +} + +.font-maroon{ + color: maroon !important; +} + +.font-navy{ + color: navy !important; +} + +.font-olive{ + color: olive !important; +} + +.font-orange{ + color: orange !important; +} + +.font-purple{ + color: purple !important; +} + +.font-red{ + color: red !important; +} + +.font-silver{ + color: silver !important; +} + +.font-white{ + color: white !important; +} + +.font-yellow{ + color: yellow !important; +} + +.text-overline{ + text-decoration:overline; +} + +.text-line-through{ + text-decoration: line-through; +} + +.text-underline{ + text-decoration: underline; +} + +.text-left{ + text-align:left; +} + +.text-right{ + text-align:right; +} + +.text-center{ + text-align: center; +} + +.text-justify{ + text-align:justify; +} + +.text-upper{ + text-transform:uppercase; + +} +.text-lower{ + text-transform:lowercase; +} + +.text-capital{ + text-transform:capitalize; +} + +.text-direction-ltr{ + direction:ltr; +} + +.text-direction-rtl{ + direction:rtl; +} + + + +.button-yellow, .button-yellow:hover, .button-yellow:focus{ + border : 1px solid #FFCC00; + color : #333333; + background-image: -webkit-linear-gradient(bottom, #FFCC00, #FFE680); + background-image: -moz-linear-gradient(bottom, #FFCC00, #FFE680); + background-image: linear-gradient(bottom, #FFCC00, #FFE680); + background-color: #FFCC00; + + +} +.button-blue, .button-blue:hover, .button-blue:focus{ + border : 1px solid #3366CC; + color :white; + background-image: -webkit-linear-gradient(bottom, #3366CC, #85A3E0); + background-image: -moz-linear-gradient(bottom, #3366CC, #99B2E6); + background-image: linear-gradient(bottom, #3366CC, #99B2E6); + background-color: #3366CC; +} +.button-black, .button-black:focus, .button-black:hover{ + border : 1px solid #00000; + color :white; + background-image: -webkit-linear-gradient(bottom, #000000, #808080); + background-image: -moz-linear-gradient(bottom, #000000, #808080); + background-image: linear-gradient(bottom, #000000, #808080); + background-color: #000000; +} + +.button-purple, .button-purple:hover, .button-purple:focus{ + border : 1px solid #B280B2; + color :white !important; + background-image: -webkit-linear-gradient(bottom, #660066, #B280B2); + background-image: -moz-linear-gradient(bottom, #660066, #B280B2); + background-image: linear-gradient(bottom, #660066, #B280B2); + background-color: #660066; +} + +.button-green, .button-green:focus, .button-green:hover{ + border : 1px solid #80CC80; + color :white !important; + background-image: -webkit-linear-gradient(bottom, #009900, #80CC80); + background-image: -moz-linear-gradient(bottom, #009900, #80CC80); + background-image: linear-gradient(bottom, #009900, #80CC80); + background-color: #009900; +} + +.button-red, .button-red:focus, .button-red:hover{ + border : 1px solid #FF8080; + color :white !important; + background-image: -webkit-linear-gradient(bottom, #FF0000, #FF8080); + background-image: -moz-linear-gradient(bottom, #FF0000, #FF8080); + background-image: linear-gradient(bottom, #FF0000, #FF8080); + background-color: #FF0000; + +} + +.button-brown, .button-brown:focus, .button-brown:hover{ + border : 1px solid #B29980; + color :white; + background-image: -webkit-linear-gradient(bottom, #663300, #B29980); + background-image: -moz-linear-gradient(bottom, #663300, #B29980); + background-image: linear-gradient(bottom, #663300, #B29980); + background-color: #663300; +} + +.button-grey, .button-grey:focus, .button-grey:hover{ + border : 1px solid #B2B2B2; + color : white !important; + background-image: -webkit-linear-gradient(bottom, grey, #B2B2B2); + background-image: -moz-linear-gradient(bottom, grey, #B29980); + background-image: linear-gradient(bottom, grey, #B29980); + background-color: grey; +} +.button-pink, .button-pink:focus, .button-pink:hover{ + border : 1px solid #E680B2; + color : white !important; + background-image: -webkit-linear-gradient(bottom, #CC0066, #E680B2); + background-image: -moz-linear-gradient(bottom, #CC0066, #E680B2); + background-image: linear-gradient(bottom, #CC0066, #E680B2); + background-color: #CC0066; +} + +.border-solid{ + border-style: solid !important; +} + +.border-dotted{ + border-style: dotted !important; +} +.border-dashed{ + border-style: dashed !important; +} +.border-double{ + border-style: double !important; +} +.border-inset{ + border-style: inset !important; +} +.border-outset{ + border-style: outset !important; +} +.border-hidden{ + border-style: hidden !important; +} +.border-red{ + border-color: red !important; +} +.border-black{ + border-color: black !important; +} +.border-blue{ + border-color: blue !important; +} +.border-grey{ + border-color: grey !important; +} +.border-green{ + border-color: green !important; +} +.border-white{ + border-color: white !important; +} +.border-yellow{ + border-color: yellow !important; +} +.border-navy{ + border-color: navy !important; +} + +.border-top{ + border-top: 1px solid; +} + +.border-bottom{ + border-bottom: 1px solid; +} + +.border-left{ + border-left: 1px solid; +} + +.border-right{ + border-right: 1px solid; +} + +.group-bg-green{ + background-color: green !important; +} +.group-bg-gray{ + background-color: gray !important; +} +.group-bg-blue{ + background-color: blue !important; +} +.group-bg-white{ + background-color: white !important; +} +.group-bg-red{ + background-color: red !important; +} +.group-bg-yellow{ + background-color: yellow !important; +} +.group-bg-olive{ + background-color: olive !important; +} + +.group-title-green span.ng-binding{ + color: green !important; +} +.group-title-gray span.ng-binding{ + color: gray !important; +} +.group-title-blue span.ng-binding{ + color: blue !important; +} +.group-title-white span.ng-binding{ + color: white !important; +} +.group-title-red span.ng-binding{ + color: red !important; +} +.group-title-yellow span.ng-binding{ + color: yellow !important; +} +.group-title-olive span.ng-binding{ + color: olive !important; +} + +.group-border-1px{ + border : 1px solid; +} +.group-border-2px{ + border: 2px solid; +} +.group-border-3px{ + border: 3px solid; +} +.group-border-4px{ + border: 4px solid; +} +.group-border-5px{ + border: 5px solid; +} + + + + +.separator-bg-red{ + color : white; + background : red; + padding-top: 4px; + padding-left: 5px; + border-bottom: 2px solid red; +} +.separator-bg-yellow{ + color : white; + background : yellow; + padding-top: 4px; + padding-left: 5px; + border-bottom: 2px solid yellow; +} +} +.separator-bg-green{ + color : white; + background : green; + padding-top: 4px; + padding-left: 5px; + border-bottom: 2px solid green; +} +.separator-bg-blue{ + color : white; + background : blue; + padding-top: 4px; + padding-left: 5px; + border-bottom: 1px solid blue; +} +.separator-bg-white{ + color : #333333 !important; + padding-top: 5px; + padding-left: 5px; + border-bottom: 2px solid #333333; +} + +.separator-bg{ + color : white; + background : #80B2B2; + padding-top: 5px; + padding-left: 5px; + border-bottom: 2px solid #80B2B2; +} +.separator-bg-theme{ + color : white; + background : #006666; + padding-top: 5px; + padding-left: 5px; + border-bottom: 2px solid #006666; +} + +.separator-bg-grey{ + color : white; + background : grey; + padding-top: 5px; + padding-left: 5px; + border-bottom: 2px solid grey; +} +.separator-bg-purple{ + color : white; + background : purple; + padding-top: 5px; + padding-left: 5px; + border-bottom: 2px solid purple; +} +.separator-bg-black{ + color : white; + background : #333333; + padding-top: 5px; + padding-left: 5px; + border-bottom: 2px solid #333333; +} +.separator-bg-pink{ + color : white; + background : #CC0066; + padding-top: 5px; + padding-left: 5px; + border-bottom: 2px solid #CC0066; +} +.separator-bg-brown{ + color : white; + background : #663300; + padding-top: 5px; + padding-left: 5px; + border-bottom: 2px solid #663300; +} +.rounded-corner{ + border-radius : 5px !important; +} +.separator-1px{ + border-bottom: 1px solid !important; +} +.separator-2px{ + border-bottom: 2px solid !important; +} +.separator-3px{ + border-bottom: 3px solid !important; +} +.separator-4px{ + border-bottom: 4px solid !important; +} +.separator-5px{ + border-bottom: 5px solid !important; +} + +.separator-1px-dotted{ + border-bottom: 1px dotted !important; +} +.separator-2px-dotted{ + border-bottom: 2px dotted !important; +} +.separator-3px-dotted{ + border-bottom: 3px dotted !important; +} +.separator-4px-dotted{ + border-bottom: 4px dotted !important; +} +.separator-5px-dotted{ + border-bottom: 5px dotted !important; +} + +.separator-1px-dashed{ + border-bottom: 1px dashed !important; +} +.separator-2px-dashed{ + border-bottom: 2px dashed !important; +} +.separator-3px-dashed{ + border-bottom: 3px dashed !important; +} +.separator-4px-dashed{ + border-bottom: 4px dashed !important; +} +.separator-5px-dashed{ + border-bottom: 5px dashed !important; +} + +.content-bold input { + font-weight:bold; +} + +.content-italic input { + font-style:italic; +} + +.content-10px input { + font-size:10px; +} +.content-11px input { + font-size:11px; +} +.content-12px input { + font-size:12px; +} +.content-13px input { + font-size:13px; +} +.content-14px input { + font-size:14px; +} +.content-15px input { + font-size:15px; +} +.content-16px input { + font-size:16px; +} +.content-18px input { + font-size:18px; +} +.content-20px input { + font-size:20px; +} +.content-22px input { + font-size:22px; +} +.content-24px input { + font-size:24px; +} + + +.content-black input{ + color: black !important; +} + +.content-blue input{ + color: blue !important; +} + +.content-grey input{ + color: grey !important; +} + +.content-green input{ + color: green !important; +} + +.content-lime input{ + color: lime !important; +} + +.content-maroon input{ + color: maroon !important; +} + +.content-navy input{ + color: navy !important; +} + +.content-olive input{ + color: olive !important; +} + +.content-orange input{ + color: orange !important; +} + +.content-purple input{ + color: purple !important; +} + +.content-red input{ + color: red !important; +} + +.content-silver input{ + color: silver !important; +} + +.content-white input{ + color: white !important; +} + +.content-yellow input{ + color: yellow !important; +} + +.btn-custom { + background-color: transparent; + color: #0275D8; + border: none; + height: 19px !important; + line-height: 13px; +} + +.btn-custom.disabled { + background-color: transparent !important; + color: #67ACE7 !important; + cursor: not-allowed !important; +} + +.btn-custom .fa { + margin: 0 4px; +} + +.btn-custom:hover span { + text-decoration: underline; +} + +.btn-custom.disabled:hover span { + text-decoration: none; +} + +.btn-custom:hover, .btn-custom:focus, .btn-custom:active { + background-color: transparent !important; + color: #0275D8; +} + +.btn-custom:active { + -webkit-box-shadow: unset; + box-shadow: unset; +} diff --git a/sophal/css/login.css b/sophal/css/login.css new file mode 100644 index 0000000..59ac274 --- /dev/null +++ b/sophal/css/login.css @@ -0,0 +1,204 @@ +/** + * Axelor Business Solutions + * + * Copyright (C) 2005-2019 Axelor (). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +body { + height: 100%; + display: block; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + + display: block; + background-color: #2f4050; + padding-top: 60px; +} + +@media (max-width: 979px) { + body { + padding-top: 20px; + } +} + +header .navbar .brand-logo { + float: left; +} + +header .navbar .brand-logo img { + height: 32px; + margin-top: 4px; +} + +.panel { + border: 1px solid #d4d4d4; + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + background-color: #fff; +} + +.panel .panel-header { + background-color: #dadada; + padding: 10px; + text-align: center; +} + +.panel .panel-title { + font-size: 18px; + font-weight: 600; +} + +.panel .panel-body { + padding: 14px; + overflow: hidden; +} + +.panel { + margin-bottom: 18px; +} + +.login-panel { + float: inherit !important; + margin: auto !important; + width: 420px; + border: 0; + box-shadow: none; + background-color: transparent; +} + +.alert { + width: 420px; +} + +@media (min-width: 1200px) { + .alert, + .login-panel { + width: 420px; + } +} + +@media (max-width: 767px) { + .alert, + .login-panel { + width: 100%; + } +} + +.login-panel .panel-header { + padding: 22px; +} + +.login-panel .panel-body { + padding: 0; +} + +.login-panel .form-fields, +.login-panel .form-footer { + padding: 22px; +} + +.login-panel .form-fields { + margin-top: 8px; + background-color: #eaeaea; +} + +.login-panel .form-footer { + background-color: #fff; +} + +.login-panel .form-footer button { + width: 100%; + padding: 8px 16px; + font-weight: 600; +} + +#login-form { + margin: 0; +} + +#login-form input[type="text"], +#login-form input[type="password"], +#login-form .add-on { + border-radius: 0 !important; + padding: 6px 10px; + font-size: 14px; + line-height: 20px; + height: 20px; +} + +#login-form .input-prepend { + width: 100%; + margin-bottom: 16px; +} + +#login-form .input-prepend input { + width: calc(100% - 60px); +} + +#login-form .input-prepend select { + height: 34px; + width: calc(100% - 38px); +} + +body > footer { + position: relative; + margin-top: 28px; + height: 28px; + text-align: center; +} + +body > footer > p { + margin: 0; + padding: 6px 10px; +} + +body > footer > p, +body > footer > p a, +body > footer > p a:hover, +body > footer > p a:active, +body > footer > p a:visited { + color: #f2f2f2; +} + +.alert { + box-sizing: border-box; + margin: auto; + margin-top: 8px; + border-radius: 0; +} + +.alert h4 { + margin-bottom: 8px; +} + +#social-buttons { + display: flex; + flex-direction: column; + padding: 18px 22px; +} + +#social-buttons button { + display: flex; + flex: 1; + padding: 8px 10px; + font-weight: 600; + margin: 4px 0; +} + +#social-buttons .social-logo { + height: 18px; + width: 18px; +} + +#social-buttons .social-title { + padding-left: 8px; +} diff --git a/sophal/css/main.css b/sophal/css/main.css new file mode 100644 index 0000000..cdce92f --- /dev/null +++ b/sophal/css/main.css @@ -0,0 +1,974 @@ +/** + * Axelor Business Solutions + * + * Copyright (C) 2005-2019 Axelor (). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +html, body { + overflow: hidden; + padding: 0 !important; + margin: 0 !important; +} + +body { + height: 100%; + width: 100%; + display: block; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} + +b, strong { + font-weight: 600; +} + +[ng\:cloak], [ng-cloak], .ng-cloak { + display: none !important; +} + +#container { + left: 0px; right: 0px; top: 41px; bottom: 0px; + position: absolute; + min-width: 320px; +} + +@media (max-width: 979px) { + header > .navbar-fixed-top { + position: fixed; + margin-bottom: 0; + } + + header > .navbar-fixed-top .navbar-inner { + padding: 0; + } +} + +header .navbar .brand-logo { + float: left; +} + +header .navbar .brand-logo img { + height: 32px; + margin-top: 4px; +} + +header .container-fluid { + padding: 0 4px; +} + +@media (max-width: 767px) { + header .container-fluid { + padding: 0 4px; + } + header .navbar-fixed-top { + margin-left: 0; + margin-right: 0; + min-width: 320px; + } +} + +header .nav-menu-bar li.empty > a > i { + font-size: 20px; +} + +header .nav-menu-bar li.empty > a, +header .navbar .nav-shortcuts > li > a { + padding: 9px 5px 10px; +} + +header .nav-menu-bar li > a > img { + width: 16px; + height: 16px; + max-width: 16px; + max-height: 16px; +} + +header .navbar .nav-shortcuts > .divider-vertical { + margin: 0 4px; +} + +header .navbar .nav-shortcuts > li > a > i { + font-size: 20px; +} + +header .navbar .nav-shortcuts > li > a > span { + vertical-align: top; +} + +header .navbar .nav-shortcuts .nav-link-mail sup { + position: absolute; + top: 8px; +} + +header .navbar .nav-shortcuts .nav-link-tasks .badge { + display: inline-block; + position: absolute; + padding: 5px 4px; + width: 11px; + height: 9px; + top: 1px; + right: -3px; +} + +header .navbar .nav-link-user > img { + width: 20px; + height: 20px; + margin-bottom: 1px; + background-color: white; +} + +header .navbar .nav-link-user-name, +header .navbar .nav-link-user-sub { + display: block; + font-weight: 600; + opacity: .9; +} +header .navbar .nav-link-user-sub { + font-size: 10px; + opacity: .7; +} + +.fill-parent { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; +} + +.footer { + position: absolute; + left: 0px; right: 0px; bottom: 0px; + padding: 4px 4px 0 4px; + background-color: #eee; +} + +.footer p { + margin-bottom: 4px; + text-shadow: 0 1px 1px #f0f0f0; +} + +.loading-counter { + padding: 4px 8px 6px 8px; + border-radius: 0px 0px 4px 4px; +} + +.blocker-overlay { + opacity: 0; +} + +.blocker-overlay.wait { + opacity: 1; + background: rgba(0, 0, 0, 0.5); + transition: opacity ease 0.4s; +} + +.blocker-overlay .blocker-wait { + display: none; + position: absolute; + top: 50%; + top: calc(50% - 30px); + width: 100%; + + text-align: center; + font-size: 18px; + color: white; +} + +.blocker-overlay .blocker-spinner { + margin: auto; +} + +.blocker-overlay .blocker-spinner i { + font-size: 42px; + -webkit-animation: fa-spin 1.05s infinite linear; + -moz-animation: fa-spin 1.05s infinite linear; + -o-animation: fa-spin 1.05s infinite linear; + animation: fa-spin 1.05s infinite linear; +} + +.blocker-overlay.wait .blocker-wait { + display: block; +} + +.spacer { + height: 1em; +} + +/* jQuery UI fixes */ +.ui-state-hover * { + color: inherit !important; +} + +.ui-widget { + font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: inherit; +} + +.ui-widget-content { + border: 1px solid #d4d4d4; +} + +.ui-dialog, +.ui-datepicker, +.ui-menu { + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); +} + +.tooltip, +.ui-menu, +.ui-datepicker, +.dropdown-menu { + z-index: 9999999999 !important; +} + +.tooltip { + font-size: 12px; +} +.tooltip.fade.in { + opacity: 1; +} + +.ui-menu { + border: 1px solid rgba(0, 0, 0, 0.2); +} + +.ui-menu .ui-menu-item a.ui-state-focus { + color: white; + text-decoration: none; + border-color: #0081C2; + background-color: #0081C2; + background-image: none; +} + +.ui-menu .ui-menu-item a:empty { + height: 18px; +} + +.ui-datepicker, +.ui-datepicker * { + line-height: 1.1em; +} + +.ui-datepicker, +.ui-datepicker table { + font-size: 13px; +} + +.ui-datepicker th { + font-weight: 600; +} + +.ui-datepicker-header { + background: none; + border: none; + font-weight: 600; +} + +.ui-datepicker .ui-state-default { + background: none !important; + border: none !important; + padding: 4px; +} + +.ui-datepicker .ui-state-hover { + background: #eee !important; + border: none !important; +} + +.ui-datepicker .ui-slider-handle { + padding: 0; + border: 1px solid #ddd !important; + background-image: none !important; + background: #eee !important; +} + +.ui-datepicker .ui-slider-handle.ui-state-hover, +.ui-datepicker .ui-state-active { + color: white !important; + border-color: #ccc !important; + background-color: #0074CC !important; + background-image: none !important; +} + +.ui-datepicker .ui-state-highlight { + border: 1px solid #08c !important; + padding: 3px; +} + +.ui-datepicker .ui-datepicker-next-hover, +.ui-datepicker .ui-datepicker-prev-hover { + top: 2px; +} + +.ui-datepicker .ui-datepicker-next-hover { + right: 2px; +} + +.ui-datepicker .ui-datepicker-prev-hover { + left: 2px; +} + +.ui-autocomplete { + max-height: 340px; + overflow-y: auto; + overflow-x: hidden; +} + +.ui-widget input, +.ui-widget select, +.ui-widget textarea, +.ui-widget button { + font-family: inherit; + font-size: 13px; +} + +/* end jQuery UI fixes */ + +#offcanvas { + height: 100%; +} + +#offcanvas-toggle { + margin: 0; + margin-left: 4px; +} + +#offcanvas-toggle a { + padding-left: 2px; + padding-right: 2px; +} + +#sidebar { + width: inherit; + min-width: 249px; + max-width: 249px; + float: left; + height: 100%; + position: relative; + overflow-x: hidden; + overflow-y: auto; + + border-right: 1px solid #d3d3d3; +} + +#offcanvas.hidden-menu { + position: relative; + left: -250px; + width: calc(100% + 250px); +} + +#offcanvas.hidden-menu #sidebar, +#offcanvas-toggle.hidden-menu { + display: none !important; +} + +#view-tabs { + height: 100%; + position: absolute; + left: 250px; + right: 0px; +} + +@media screen and (min-width: 769px) { + #offcanvas:not(.hidden-menu) { + left: 0; + width: 100%; + position: relative; + transition: all 0.25s ease-out; + } + #offcanvas.inactive { + position: relative; + left: -250px; + width: calc(100% + 250px); + } + #offcanvas.inactive #sidebar { + position: absolute; + top: 0; + } + #sidebar { + overflow: auto !important; + } +} + +@media screen and (max-width: 768px) { + #offcanvas { + position: relative; + transition: all 0.25s ease-out; + left: -250px; + width: calc(100% + 250px); + } + #sidebar { + position: absolute; + top: 0; + } + #offcanvas.active { + left: 0; + } + #offcanvas.active #sidebar { + position: relative; + } +} + +.navigation-tabs ul.nav-tabs-main { + margin-bottom: 0px; + height: 31px; +} + +.navigation-tabs { + position: absolute; + top: 8px; left: 0; right: 0; bottom: 0; +} + +.navigation-tabs > .nav-tabs-wrap li.dirty a:before, +.navigation-tabs > .nav-tabs li.dirty a:before { + content: '*'; + margin-right: 2px; +} + +.navigation-tabs > .nav-tabs-wrap li.notclosable a { + padding-right: 12px; +} + +.visible-false { + visibility: hidden; +} + +.visible-true { + visibility: inherit; +} + +.view-content { + position: absolute; + top: 39px; left: 0px; right: 0px; bottom: 0px; +} + +.view-pane { + position: absolute; + top: 0px; left: 0px; right: 0px; bottom: 0px; + padding: 2px; +} + +.view-pane > .view-container { + overflow: auto; +} + +.view-pane > .view-container, +.view-pane > .view-container > div:not(.slick-editor-dropdown) { + position: absolute; + top: 0px; left: 0px; right: 0px; bottom: 0px; +} + +.ui-dialog > [ui-view-popup], +.ui-dialog > [ui-view-popup] > .view-pane, +.ui-dialog > [ui-view-popup] > .view-pane > .view-container, +.ui-dialog > [ui-view-popup] > .view-pane > .view-container .form-view { + overflow: inherit; + display: flex; + flex-flow: column nowrap; + padding: 0 !important; + flex: 1 1 auto; +} + +.ui-dialog > [ui-view-popup] > .view-pane, +.ui-dialog > [ui-view-popup] > .view-pane > .view-container, +.ui-dialog > [ui-view-popup] > .view-pane > .view-container > div:not(.slick-editor-dropdown), +.ui-dialog > [ui-view-popup] > .view-pane > .view-container .form-view > div:last-child { + position: inherit; + top: 0 !important; +} + +.ui-dialog > [ui-view-popup] > .view-pane > .view-container .grid-view, +.ui-dialog > [ui-view-popup] > .view-pane > .view-container .html-view { + height: 450px; +} +.ui-dialog.maximized > [ui-view-popup] > .view-pane > .view-container .grid-view { + position: absolute !important; + height: auto; +} + +.view-pane > .view-container.has-toolbar { + top: -6px; +} +.view-tabs-single .view-pane > .view-container.has-toolbar { + top: 0; +} + +.grid-view > .slickgrid { + position: absolute !important; + top: 40px; left: 0px; right: 0px; bottom: 0px; + border: none; +} + +.grid-view > .help-item { + margin: 8px; +} + +.grid-view.has-details-view > .slickgrid { + right: 50%; + border-right: 1px solid #ddd; +} + +.grid-view > .details-view { + position: absolute !important; + top: 40px; left: 50%; right: 0px; bottom: 0px; +} + +.grid-view > .details-view > [ui-view-form] { + overflow: auto; + position: absolute; + top: 42px; left: 0; right: 0; bottom: 0; +} + +.record-toolbar { + margin: 0; +} + +.record-toolbar .navbar-inner { + border-left: none; + border-right: none; + border-radius: 0; + + margin: 0; + padding: 0 6px; + + border-top: 0; + background-color: #fff; +} + +.record-toolbar button { + padding: 4px 12px; +} + +.record-toolbar button span { + position: relative; + top: -1px; +} + +.record-toolbar button[ui-top-help] { + background: none; + outline: none; +} + +.record-toolbar .view-customize, +.record-toolbar .view-switcher { + margin-left: 4px !important; +} + +.record-toolbar .view-title { + display: inline-block; + font-weight: 600; + padding-top: 10px; + padding-left: 8px; +} + +.record-toolbar .dropdown a.dropdown-toggle { + padding: 4px 8px 4px; + margin-top: 6px; + color: #333; +} + +.record-toolbar .nav .dropdown.open a.dropdown-toggle { + color: #222; +} + +.record-toolbar .view-toolbar-mobile, +.record-toolbar .view-menubar-mobile { + margin: 0; +} +.record-toolbar-right { + top: 0; + right: 6px; + position: absolute; +} + +.grid-view > .details-view .record-toolbar { +} + +.grid-view > .details-view .record-toolbar .navbar-inner { + border-top: 1px solid #e7e7e7; +} + +@media (max-width: 767px) { + .menu-bar.visible-phone { + display: inline-block !important; + } + .view-toolbar-mobile > li > .dropdown-menu, + .view-menubar-mobile > li > .dropdown-menu { + left: auto; + right: 0; + } + .view-toolbar-mobile > li > .dropdown-menu:before, + .view-menubar-mobile > li > .dropdown-menu:before { + left: auto !important; + right: 12px; + } + .view-toolbar-mobile > li > .dropdown-menu:after, + .view-menubar-mobile > li > .dropdown-menu:after { + left: auto !important; + right: 13px; + } +} + +.record-pager-text { + display: inline-block; + margin-top: 9px; + margin-left: 8px; + margin-right: 8px; + font-size: 13px; +} + +.record-pager > button, +.record-pager > .btn { + margin-left: 4px; + margin-right: 4px; + margin-top: 6px; +} + +.record-pager.pull-right > span, +.record-pager.pull-left > .btn-group { + float: left; +} + +.record-pager.pull-left > span { + float: right; +} + +.record-pager-change { + display: inline-flex; +} + +.record-pager-change { + margin-right: 4px; +} + +.record-pager-change button { + height: auto !important; +} + +.stackbar { +} + +.stackbar .navbar, +.stackbar .navbar * { + color: #333; +} + +.stackbar .navbar .navbar-inner { + min-height: 26px; + padding-left: 10px; + padding-right: 10px; +} + +.stackbar .navbar .navbar-inner .brand { + font-size: small; + font-weight: 600; + padding: 4px 8px; + margin: 0; + margin-left: -10px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + max-width: calc(100% - 100px); +} + +.stackbar .navbar .navbar-inner .container-fluid { + min-width: 100px; + padding: 0; +} + +.stackbar .navbar { + margin-bottom: 0px; +} + +.stackbar .navbar, +.stackbar .navbar .navbar-inner { + border-bottom-left-radius: 0px; + border-bottom-right-radius: 0px; + box-shadow: none; +} + +.html-view, +.iframe-container, +.iframe-container > iframe { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.html-view > .iframe-container { + position: absolute; + top: 0; bottom: 0; left: 0; right: 0; +} + +.html-view > .dashlet-body { + overflow: inherit !important; + height: auto !important; + min-height: 50px; +} + +.iframe-container { + display: flex; +} + +.iframe-container > iframe { + width: 100%; + height: 100%; + flex: 1; +} + +.search-view form { + margin: 0 !important; + max-width: 100% !important; + padding: 0 !important; +} + +.search-view form .panel { + margin-bottom: 0 !important; +} + +.search-view .search-view-form, +.search-view .search-view-toolbar { + margin: 4px; +} + +.search-view .search-view-toolbar table.form-layout { + width: inherit; +} + +.search-view .search-view-grid { + position: relative; + overflow: hidden; +} + +.search-view .search-view-grid .slickgrid { + position: absolute; + top: 0; left: 0; right: 0; bottom: 0; + border: none; +} + +.unselectable-text { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +img.prefix-icon { + margin-right: 4px; +} + +.nav-tabs > li > a > img.prefix-icon { + margin-top: -1px; +} + +.nav-tabs > li > a > i.prefix-icon { + margin-right: 2px; +} + +.fa, [class^=fa-] { + font-size: 14px; +} + +.user-preferences > .form-view > .form-view { + max-width: 1200px; + margin: auto; +} + +.user-preferences form, form { + padding: 0; +} + +.user-preferences-header h3 { + margin: 0; +} + +.user-preferences-header { + margin-bottom: 14px; + border-bottom: 1px solid #e7e7e7; +} + +.btn-toolbar .nav { + font-size: 13px !important; + margin-bottom: 0; +} + +.record-toolbar .menu-bar { + display: inline-block; + float: inherit; + vertical-align: middle; + white-space: nowrap; +} + +.device-small .record-toolbar .menu-bar .has-icon .menu-title { + display: none; +} + +.record-toolbar .menu-bar, +.record-toolbar .view-toolbar { + margin-left: 0; + margin-right: 0; +} + +.record-toolbar .btn-group, +.record-toolbar .button-menu a.btn, +.record-toolbar .record-pager-change button, +.record-toolbar .record-pager-change input { + margin-top: 6px !important; +} + +.record-toolbar .button-menu a.btn { + padding: 4px 8px 4px; +} + +.record-toolbar .button-menu a.btn { + border-right-width: 0; +} +.record-toolbar .button-menu a.btn img { + margin-top: -2px; + max-width: 16px; + max-height: 16px +} + +.record-toolbar .button-menu:last-child a.btn { + border-right-width: 1px; +} + +.record-toolbar .menu-bar a.disabled { + color: #ccc; + cursor: default; +} + +.record-toolbar .menu-bar a.disabled:hover, +.record-toolbar .menu-bar a.disabled:focus { + background-color: inherit; + background-image: inherit; +} + +.record-toolbar .delete-button { + margin: 0 !important; +} + +.record-toolbar .delete-button .dropdown-toggle { + padding: 4px; +} + +.about-page, +.user-preferences { + position: absolute; + top: 0; left: 0; bottom: 0; right: 0; + overflow: auto; +} + +.about-page .page-header { + padding-bottom: 4px; + margin: 18px 0 14px; +} + +.about-page .page-header h3 { + font-size: 24px; + font-weight: 600; + line-height: 1; +} + +.about-page > .content { + padding: 0 18px; + padding-top: 8px; + max-width: 980px; + min-height: calc(100% - 50px); + height: auto; + padding-bottom: 42px; +} + +.about-page footer { + font-size: 13px; + clear: both; + position: relative; + padding: 0; + margin-top: -26px; +} + +.about-page footer p { + margin: 0; + padding: 4px; + text-align: center; +} + +.about-page hr { + margin: 14px 0; +} + +.system-page dt { + text-align: left; +} + + +/* single tab view mode */ +.view-tabs-single, +.view-tabs-single .navigation-tabs .nav-tabs { + margin: 0; +} + +.view-tabs-single .view-content { + top: 23px; +} + +.view-tabs-single .navigation-tabs > .nav-tabs { + position: relative; + top: -9px; +} + +.view-tabs-single .navigation-tabs > .nav-tabs > li { + width: 100%; + color: #555; +} + +.view-tabs-single .navigation-tabs > .nav-tabs > li > a { + font-size: 14px; + font-weight: 600; + padding: 6px 8px; + border-left: 0; + border-right: 0; +} + +.view-tabs-single .navigation-tabs > .nav-tabs > li > i { + width: 28px; + float: right; + font-size: 14px; + line-height: 32px; + text-align: center; + cursor: pointer; +} + +.view-tabs-single .navigation-tabs > .nav-tabs > li > span.view-switch-menu > a { + cursor: pointer; + color: #555; + display: block; + line-height: 32px; +} + +.view-tabs-single .navigation-tabs > .nav-tabs > li > span.view-switch-menu a[disabled] { + cursor: default; + color: #ccc; +} + +.view-tabs-single .navigation-tabs > .nav-tabs > li > span.view-switch-menu a[disabled]:hover { + background-color: #fff; +} + +.view-tabs-single .navigation-tabs > .nav-tabs > li > span.view-switch-menu > a > i { + width: 28px; + font-size: 14px; + text-align: center; + margin-top: 11px; +} diff --git a/sophal/css/modern-dark/theme.css b/sophal/css/modern-dark/theme.css new file mode 100644 index 0000000..b0b2fe0 --- /dev/null +++ b/sophal/css/modern-dark/theme.css @@ -0,0 +1,1033 @@ +/** + * Axelor Business Solutions + * + * Copyright (C) 2019 Axelor (). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +body, .navbar { + color: #fff; + background: #1b1b1b; +} + +.row-fluid { + background: transparent !important; +} + +a, a:hover { + color: #03a9f4; +} + +select, +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"], +.tag-select.picker-input, +.form-item-container > .display-text, +.uneditable-input { + color: #fff; + background-color: #323232; +} + +.bar-side select, +.bar-side textarea, +.bar-side input[type="text"], +.bar-side input[type="password"], +.bar-side input[type="datetime"], +.bar-side input[type="datetime-local"], +.bar-side input[type="date"], +.bar-side input[type="month"], +.bar-side input[type="time"], +.bar-side input[type="week"], +.bar-side input[type="number"], +.bar-side input[type="email"], +.bar-side input[type="url"], +.bar-side input[type="search"], +.bar-side input[type="tel"], +.bar-side input[type="color"], +.bar-side .tag-select.picker-input, +.bar-side .form-item-container > .display-text, +.bar-side .uneditable-input { + background-color: inherit; +} +table.form-layout .tabbable-tabs .tab-content{ + border: 2px solid #bbb; +} + +.panel-tabs .tab-content { + background: #323232 !important; +} + +.navigation-tabs { + top: 2px; +} + +.view-tabs, .nav-tabs-strip { + background: #323232 !important; +/* background: url('../../img/bg.jpg') !important; */ + /* background-repeat: no-repeat !important; */ + /* object-fit: fill !important; */ + /* background-size: 100% !important; */ +} + +.navbar-inner { + background: #323232 !important; + border-bottom-color: #323232; +} + +.form-item .navbar-inner { + background: #323232 !important; +} + +.form-item .navbar .brand { + color: #fff !important; + text-shadow: none !important; +} + + +.form-item-container, +.form-item-container > span.display-text { + min-height: 21px; +} + +.form-item-container > .translate-icon { + line-height: 21px; +} + +.picker-input > .picker-icons { + top: -1px; +} + +.picker-input > .picker-icons > i.fa { + padding-top: 1px; + color: #9F9F9F; +} + +.picker-input > .picker-icons > i.fa:hover { + color: #fff; +} + +[ui-nav-tree] .nav-search input[type="text"] { + background-color: #777; +} + +label, +.label-item span, +.slickgrid .slick-header, +.slickgrid .slick-header-column { + font-weight: 400 !important; +} + +.panel .panel-title { + color: #fff; +} + +.form-item-container > span.display-text { + padding-top: 1px; +} + +.form-item-container input { + padding: 0px 6px; + height: 21px; +} + +.icons-bar .fa, +.panel-icons .fa, +.links .fa { + color: #8C8C8C; +} + +.panel .panel-header { + position: relative; + z-index: 1; + padding: 8px 4px 8px 0 !important; + outline: none !important; + border-bottom: 1px solid #424242; +} + +.panel { + display: flex; + flex-direction: column; +} + +.panel .row-fluid > .form-item { + margin-bottom: 12px; +} + +.panel .row-fluid > .form-item-hidden { + margin-bottom: 0px; +} + +.panel .panel-header.clickable-header::before { + content: ' '; + display: block; + visibility: hidden; + position: absolute; + top: 1px; + left: 0; + z-index: -2; + background: #3a3a3a; + height: 100%; + width: 100%; +} + +.panel .panel-header:hover::before { + visibility: visible; +} + +.panel .panel-header.clickable-header::after { + content: ' '; + display: block; + opacity: 0; + position: absolute; + top: 10px; + left: 10px; + z-index: -1; + background: #444; + height: 30px; + width: 30px; + border-radius: 100%; + transform-origin: 50% 50%; +} + +.panel .panel-header:focus-within:not(:active)::after { + animation: ripple ease-out 1s; +} + +[ui-view-form] .panel .panel-header { + padding: 13px 0px 8px 0px; + border-top: 0; + margin-bottom: 8px; +} + +[ui-view-form] .panel .panel-related .panel-header, +[ui-view-form] .panel-tabs .panel-related .panel-header { + margin-bottom: 0; +} + +[ui-view-form] .panel .panel-title { + font-size: 16px; +} + +[ui-panel-viewer] > div > h5 { + margin: 4px 0px; +} + +.slickgrid .slick-header:hover, +.slickgrid .slick-header-column:hover, +.slickgrid .slick-header.ui-state-hover, +.slickgrid .slick-header-column.ui-state-hover { + color: #fff !important; +} + +.slick-row.selected, .slick-row .slick-cell.selected { + background-color: #777; +} + +.mail-composer textarea { + background: transparent; +} + +.mail-message, .arrow { + background: #323232 !important; + border: 1px solid #323232 !important; +} + +.mail-message { + border-radius: 3px !important; + box-shadow: 1px 1px 4px rgba(0,0,0,0.25) !important; +} + +.mail-message .mail-message-header .subject, +.mail-message .track-fields li { + color: #8C8C8C; +} + +.slick-cell.edit-icon { + padding: 2px; + text-align: center; +} +.slick-cell.edit-icon i { + width: 100%; + height: 100%; +} + +.slick-cell .picker-icons i.fa:hover { + color: #fff; +} + +.track-fields span { + color: #fff; +} + +.mail-followers .panel-header { + padding: 0; + padding-bottom: 14px; +} + +.bar-wrap { + min-height: 0 !important; +} + +[ui-view-form], .cards-view, .kanban-view, .grid-view, .view-container, .slick-viewport, .calendar-view, .tree-view, .tree-view-container, .dashboard { + background: #202124 !important; +} +.cards-view, +.kanban-view, +.view-container .form-view > div:last-child, +.grid-view > .slickgrid, +.view-container .calendar-view > div:last-child, +.dms-file-list .dms-folder-tree, +.view-container .tree-view > .tree-view-container { + top: 47px; +} + +.navbar { + width: 100%; +} + +.record-toolbar { + position: absolute; + width: 100%; + box-shadow: 0 3px 5px 0 rgba(0,0,0,0.5); + z-index: 3; +} + +.nav-tabs-strip { + z-index: 3; +} + +.nav-tabs-strip .nav-tabs { + padding: 0 2px; +} + +.user-preferences [ui-view-form] { + background: transparent !important; +} + + form .slick-viewport { + background: #323232 !important; + } + +[ui-view-form] > form:not(.mail-thread-view) > div > .bar-main > .bar-wrap { + padding: 16px; + box-shadow: 1px 2px 8px 0px rgba(0, 0, 0, 0.35); + margin-bottom: 22px; + border-radius: 5px; + background: #323232; +} + +.filter-menu form > div > .bar-main > .bar-wrap, +.chart-controls form > div > .bar-main > .bar-wrap { + box-shadow: none !important; + border: 0 !important; + border-radius: 0 !important; + margin: 0 !important; + padding: 0 !important; +} + +[ui-view-form] .panel { + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 0; + background-color: inherit; + margin-bottom: 0; +} + +.panel .panel-body { + padding: 0; +} + +.panel-tabs .tab-content { + padding: 14px 0; + border: none; + border-top: 2px solid transparent; +} + +.nav-tabs-wrap { + border-bottom: 0; + background-color: #323232; +} + +.nav-tabs { + border: none; +} + +.nav-tabs > li { + margin-right: 0; +} + +form .nav-tabs { + border: none; +} + +.nav-tabs > li > a { + border-radius: 0; + border: none; + border-radius: 0 !important; +} + +.nav-tabs > li > a, +.nav-tabs-main > li:not(.active) > a { + border-left: 0; + border-right: 0; +} + +.panel-tabs .nav-tabs > li > a, +.panel-tabs .nav-tabs > li.active > a { + border: 0; +} + +form .nav-tabs > li.active > a, +form .nav-tabs > li.active > a:hover, +form .nav-tabs > li.active > a:focus { + border-top-width: 2px; + padding-top: 5px; + color: #03a9f4 !important; +} + +form .nav-tabs > li > a { + background: #323232; + color: #dedede; +} + +.panel-tabs .nav-tabs > li { + margin-bottom: 0; +} + +form .panel-tabs { + margin-top: 10px; +} + +form .panel-tabs .nav-tabs > li:hover > a { + cursor: pointer; + background: transparent; + color: #fff; +} + +.panel-tabs .nav-tabs > li.active > a, +.panel-tabs .nav-tabs > li.active > a:hover, +.panel-tabs .nav-tabs > li.active > a:focus { + border: 0; + border-bottom: 2px solid #03a9f4 !important; + font-weight: 600; + background: transparent; +} + +.bar-main .mail-messages, +.bar-main .mail-followers, +.bar-main .mail-messages > .panel-body { + border: 0; + padding: 0; +} + +.bar-main .mail-message .mail-message-header { + border-bottom: 0; + padding-bottom: 0; +} + +.slickgrid .slick-header, +.slickgrid .slick-header-column, +.slickgrid .slick-headerrow-column, +.slickgrid .slick-row.odd, +table.treetable tbody tr.branch { + border-right: 0 !important; + color: #fff; + background: #3a3a3a; +} + +.slickgrid .slick-header-column.slick-header-column-active, +.slickgrid .slick-header-column.ui-state-hover { + padding: 4px 7px; +} + +.slickgrid { + background: #323232 !important; +} + +.slickgrid .slick-row { + border-bottom: 0 !important; + background: #424242; + color: #fff; +} + +.tree-view-container .tree-header th { + border-left: 0; +} + +.panel .panel-related .panel-body .slickgrid, +.panel-tabs .panel-related .panel-body .slickgrid, +.panel .form-item .dashlet .dashlet-body .portlet-grid .slickgrid, +.panel-tabs .form-item .dashlet .dashlet-body .portlet-grid .slickgrid { + border-left: 0; + border-right: 0; + border-bottom: 0; +} + +.bar-main .wysiwyg-container { + border: 0; +} + +textarea { + border-width: 0; + border-bottom-width: 1px; +} + +.slick-external-editor textarea { + border-width: 1px; +} + +.navbar .nav > li > a { + color: #fff; + text-shadow: none; +} + +.navbar .divider-vertical { + border: none !important; +} + +header .navbar .nav .fa-bars, header .navbar .dropdown-toggle .caret, +header .navbar .nav > li > a:focus, +header .navbar .nav > li > a:hover, +header .navbar .nav > li > a:active, +.navbar .nav li.dropdown.open > .dropdown-toggle, +.navbar .nav li.dropdown.active > .dropdown-toggle, +.navbar .nav li.dropdown.open.active > .dropdown-toggle { + color: #2185D0; +} + +header .dropdown-menu > li > a:hover, +header .dropdown-menu > li > a:focus, +header .dropdown-submenu:hover > a, +header .dropdown-submenu:focus > a { + color: #fff; + background: #2185D0; +} + +.record-toolbar .navbar-inner { + padding: 2px 6px; +} + +.record-toolbar .button-menu a.btn, +.navbar .btn-group .btn, +.record-toolbar .dropdown a.dropdown-toggle { + background: #323232; + color: #fff; +} + +.record-toolbar .button-menu a.btn:hover, .record-toolbar .button-menu a.btn:focus, .record-toolbar .button-menu a.btn:active, +.navbar .btn-group .btn:hover, .navbar .btn-group .btn:focus, .navbar .btn-group .btn:active { + background: #202124; + color: #fff !important; +} + +.slick-headerrow, .tree-header { + background: #323232 !important; + color: #fff !important; +} + +.slick-headerrow div { + background: #323232 !important; +} + +.popover { + border-radius: 6px; + background-color: #404040; +} + +.popover-title { + border-radius: 5px 5px 0 0; + background-color: #404040; +} + +.popover.bottom { + background-color: #fff; +} + +.popover.bottom .arrow:after { + border-bottom-color: #fff; +} + +.popover.bottom .popover-content { + background-color: #fff; +} + +[ui-view-form] input, +[ui-view-form] textarea, +[ui-view-form] select, +[ui-view-form] .tag-select { + border-color: #c0c0c0; +} + +.ng-invalid > input, +.ng-invalid > textarea, +.ng-invalid > .picker-input input, +.ng-invalid > .ui-spinner input, +.ng-invalid > .tag-select, +.ng-invalid > .form-item-container > .wysiwyg-container { + border-color: #B94A48; +} + +.dropdown-menu { + border: 1px solid rgba(0, 0, 0, 0.05); +} + +.btn { + border-radius: 3px !important; +} + +.btn:focus { + outline: none !important; +} + +.btn-danger { + border-color: #d43f3a; +} + +.btn-group > .btn + .btn { + margin-left: -3px; +} + +.navbar .btn-group .btn:not(:disabled):hover, .navbar .btn-group .btn:focus, .navbar .btn-group .btn:active { + background: #2185D0; + color: #fff; +} + +.panel-layout .form-item > .btn-group .btn { + border-radius: 0 !important; +} + +.bar-side .panel-layout .form-item > .btn { + min-height: 38px; + padding: 8px 10px; + font-weight: 600; +} + +.panel-layout .form-item .btn { + position: relative; + border-radius: 3px !important; + box-shadow: 1px 2px 3px rgba(0,0,0,0.16), 1px 2px 3px rgba(0,0,0,0.23); +} + +.panel-layout .form-item > .btn::after { + content: ''; + position: absolute; + top: 50%; + left: 50%; + width: 15px; + height: 15px; + background: rgba(255, 255, 255, .5); + opacity: 0; + border-radius: 100px; + transform: scale(1, 1) linear 0.1s; + transform-origin: 50% 50%; +} + +@keyframes ripple { + 0% { + transform: scale(0, 0); + opacity: 1; + } + + 100% { + opacity: 0; + transform: scale(100, 100); + } +} + +.panel-layout .form-item > .btn:focus:not(:active)::after { + animation: ripple 1s ease-out; +} + +.o2m-list-row .toggle-item button { + border-radius: 0 !important; + height: 20px !important; + padding: 0 1px 2px 1px !important; +} + +.btn-default { + background-color: #fff; + border: 1px solid #0275d8; + color: #0275d8; +} + +.btn-primary { + background-color: #0275d8; + border-color: #0275d8; + color: #fff; +} + +.info-button { + border-style: solid; + box-shadow: none !important; +} + +.info-button:not([class*=btn-]) > i, .info-button:not([class*=btn-]) .info-button-value { + color: #2185D0; +} + +.btn-default:hover, +.btn-default:focus, +.btn-default:active, +.btn-default.active, +.btn-default.disabled, +.btn-default[disabled] { + border: 1px solid #0275d8; +} + +.dms-file-list .dms-folder-tree { + background-color: #323232; + color: #fff; +} + +.dms-file-list .record-toolbar .breadcrumb { + background-color: #1b1b1b; + color: #fff; + text-shadow: none; +} +.dms-file-list .record-toolbar .breadcrumb li { + color: #fff; + text-shadow: none !important; +} + +.dms-folder-tree li > a.active { + color: #2185D0; +} + +.dms-folder-tree li > a { + color: #fff; +} + +.order-subtotal dl { + max-width: 280px; + float: right; +} +.order-subtotal dt, +.order-subtotal dd { + padding: 4px; +} + +.order-subtotal dt { + padding-right: 8px; + font-weight: normal; + white-space: normal; + width: 55%; +} +.order-subtotal dd { + margin-left: 0; + text-align: right; +} + +.order-subtotal dd:empty { + height: 26px; +} + +.order-subtotal-total { + border-top: 1px solid #ccc; + font-size: 18px; + font-weight: 600; +} + +@media (max-width: 767px) { + .order-subtotal dt { + float: left; + text-align: right; + width: 48%; + } +} + +.kanban-column, .kanban-card-list { + background-color: transparent !important; +} + +.kanban-card { + border: 1px solid #323232; + border-left-width: 1px; + box-shadow: 1px 1px 5px rgba(0,0,0,0.45); + background: #323232 !important; +} + +.kanban-card:hover{ + background: #fafafa; + box-shadow: 2px 2px 6px 0 rgba(0,0,0,0.45); +} + +.kanban-column .input-group .input-group-btn > .btn { + border-radius: 0 !important; +} + +.search-view .bar-wrap { + box-shadow: none !important; + border: 0 !important; + margin: 0 !important; +} + +.nav-select a.nav-label, +.nav-select a.nav-label:after { + box-shadow: 2px -2px 0 1px #323232; +} + +.nav-select a.nav-label:hover, +.nav-select a.nav-label:hover:after { + background-color: #e2e2e2; +} + +.dashboard ul.dashlet-buttons > li > a { + color: #fff; +} + +.dashboard .dashlet, +.dashboard .dashlet div, +.dashlet .dashlet-body, +.dashboard .dashlet-header, +.dashboard .dashlet .dashlet-header { + color: #fff; + border: none; + background: #323232 !important; +} + +.dashboard .dashlet { + box-shadow: 2px 2px 4px 0 rgba(0, 0, 0, 0.5); + border-radius: 5px !important; +} + +.html > .view-pane, +.dashboard > .view-pane { + top: -7px; +} + +.wysiwyg-toolbar-icon { + color: #fff; +} + +.progress { + border-radius: 5px !important; + box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.5); + background: #bbb; +} + +.view-pane > .view-container.has-toolbar { + top: -9px; +} + +.nav-tabs > li > a { + background: #323232 !important; + color: #fff !important; + border-left: none !important; + border-right: none !important; + border-top: 3px solid #0275d8; +} + +form .nav-tabs > li > a, .nav-tabs > li > a:hover, .nav-tabs > li > a:focus { + background: transparent !important; +} + +.nav-tabs-main > li:not(.active) > a { + border-top-color: #323232 !important; +} + +.navbar .tag-select.picker-input, .navbar input { + background: #323232; + color: #fff; +} + +.ui-dialog, .ui-dialog-content, .ui-dialog-title, .ui-dialog-titlebar, .ui-dialog-buttonpane { + background: #202124 !important; + color: #fff !important; + border: none !important; +} + +.ui-dialog .ui-dialog-titlebar a { + color: #f2f2f2; +} +.ui-dialog .ui-dialog-titlebar a:hover { + color: #fff; +} + +.ui-dialog { + box-shadow: 2px 2px 8px 0 rgba(150,150,150,0.75); +} + +.slickgrid .slick-header-menubutton, .slick-resizable-handle { + color: #fff; +} + +.ui-autocomplete, .ui-menu-item a { + background: #202124 !important; + color: #fff !important; + border: 1px solid #202124 !important; +} + +.ui-autocomplete .ui-menu-item:hover a { + background: #282828 !important; + border: 1px solid #282828 !important; +} + +.info-button, .info-button:hover, .info-button:focus, .info-button:active { + background: #424242 !important; + border: 1px solid #424242 !important; + color: #fff !important; +} + +.info-button { + box-shadow: 1px 1px 3px 0 rgba(0,0,0,0.35) !important; +} + +.sidebar { + background: #1b1b1b; + color: #ddd; + border: none !important; + box-shadow: 2px 0px 4px 0 rgba(0, 0, 0, 0.65); + z-index: 3; +} + +.nav-tree li > a { + text-shadow: none; + color: #ddd; + font-weight: 400 !important; +} + +.nav-tree li > a:hover, .nav-tree li.active > a, .nav-tree > li.open, .nav-tree > li.active { + color: #fff; + background: #202124; +} + +.code-editor, .CodeMirror, .CodeMirror-gutters { + background: #202124; + color: #fff; +} + +.cm-attribute { + color: #f92672 !important; +} + +.cm-string { + color: #e6db74 !important; +} + +.cm-tag, .cm-bracket { + color : #a6e22e !important; +} + +.cm-atom { + color: #fff !important; +} + +.cm-text { + color: #66d9ef !important; +} + +.CodeMirror-line::selection, .CodeMirror-line>span::selection, .CodeMirror-line>span>span::selection { + background: #66d9ef; +} + +.iswitch .box:before { + background: #777; + border-color: #777; +} + +.iswitch { + outline: none; +} + +.filter-menu { + background: #1b1b1b; + box-shadow: 2px 2px 10px rgba(0, 0, 0, 0.7); + border: none; +} + +.view-container .calendar-view > div:last-child { + background-color: #323232; +} + +.fc-unthemed .fc-today { + background-color: #777; +} + +.ui-datepicker .ui-datepicker-header { + color: #fff; +} + +.calendar-side .ui-datepicker { + border-top: 4px solid #3a3a3a; +} + + .ui-datepicker { + background: #424242; + border: none; + color: #fff; +} + +.ui-datepicker .ui-state-hover { + color: #333 !important; +} + +.ui-state-default, .ui-widget-content .ui-state-default { + color: #ddd; +} + +.ui-priority-secondary, .ui-widget-content .ui-priority-secondary { + opacity: .4; +} + +.form-item-container pre { + background-color: #777; +} + +.slickgrid-editable .slick-row.active .slick-cell-editable:before { + background-color: #666; +} + +.icons-bar a, .stackbar .navbar, .stackbar .navbar * { + color: #ddd; +} + +text { + fill: #fff !important; +} +.nvd3 .nv-axis path { + stroke: #fff !important; +} + +.nav-tabs-main > li:not(.active) > a { + border-bottom: none !important; +} + +.nav-tabs-scroll-l, .nav-tabs-scroll-r { + background-color: #323232; +} + +.panel-layout .editable > .o2m-list .o2m-list-row .toggle-item button { + color: #fff !important; + border-radius: 0 !important; + background: #323232 !important; + box-shadow: none; + border-color: #c0c0c0; +} +li a[href="#/about"] { + display: none; + visibility: hidden; +} \ No newline at end of file diff --git a/sophal/css/modern/theme.css b/sophal/css/modern/theme.css new file mode 100644 index 0000000..1a6b2d6 --- /dev/null +++ b/sophal/css/modern/theme.css @@ -0,0 +1,770 @@ +/** + * Axelor Business Solutions + * + * Copyright (C) 2005-2019 Axelor (). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +select, +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"], +.tag-select.picker-input, +.form-item-container > .display-text, +.uneditable-input { + color: #000; + border-color: #eee; +} + +.bar-side select, +.bar-side textarea, +.bar-side input[type="text"], +.bar-side input[type="password"], +.bar-side input[type="datetime"], +.bar-side input[type="datetime-local"], +.bar-side input[type="date"], +.bar-side input[type="month"], +.bar-side input[type="time"], +.bar-side input[type="week"], +.bar-side input[type="number"], +.bar-side input[type="email"], +.bar-side input[type="url"], +.bar-side input[type="search"], +.bar-side input[type="tel"], +.bar-side input[type="color"], +.bar-side .tag-select.picker-input, +.bar-side .form-item-container > .display-text, +.bar-side .uneditable-input { + background-color: inherit; +} +.bar-side .ui-spinner { + background: none; +} + +table.form-layout .tabbable-tabs .tab-content { + border: 2px solid #E7E7E7; +} + +.picker-input > .picker-icons > i.fa { + color: #9F9F9F; +} + +.picker-input > .picker-icons > i.fa:hover { + color: #000; +} + +[ui-nav-tree] .nav-search input[type="text"] { + background-color: #fff; +} + +label, +.label-item span, +.slickgrid .slick-header, +.slickgrid .slick-header-column { + color: #5C5C5C; + font-weight: 400 !important; +} + +.panel .panel-title { + color: #3A3A3A; +} + +.icons-bar .fa, +.panel-icons .fa, +.links .fa { + color: #8C8C8C; +} + +.panel .panel-header { + position: relative; + z-index: 1; + padding: 8px 4px !important; + outline: none !important; +} + +.panel { + display: flex; + flex-direction: column; +} + +.panel .row-fluid > .form-item { + margin-bottom: 12px; +} + +.panel .row-fluid > .form-item-hidden { + margin-bottom: 0px; +} + +.panel .panel-header.clickable-header::before { + content: ' '; + display: block; + visibility: hidden; + position: absolute; + top: 1px; + left: 0; + z-index: -2; + background: #f0f0f0; + height: 100%; + width: 100%; +} + +.panel .panel-header:hover::before { + visibility: visible; +} + +.panel .panel-header.clickable-header::after { + content: ' '; + display: block; + opacity: 0; + position: absolute; + top: 10px; + left: 10px; + z-index: -1; + background: #ddd; + height: 30px; + width: 30px; + border-radius: 100%; + transform-origin: 50% 50%; +} + +.panel .panel-header:focus-within:not(:active)::after { + animation: ripple ease-out 1s; +} + +[ui-view-form] .panel .panel-header { + padding: 13px 0px 8px 0px; + border-top: 0; + margin-bottom: 8px; +} + +[ui-view-form] .panel.collapsed .panel-header { + border-bottom: 1px solid #eee; +} + +[ui-view-form] .panel .panel-related .panel-header, +[ui-view-form] .panel-tabs .panel-related .panel-header { + margin-bottom: 0; +} + +[ui-view-form] .panel .panel-title { + font-size: 16px; +} + +[ui-panel-viewer] > div > h5 { + margin: 4px 0px; +} + +.slickgrid .slick-header:hover, +.slickgrid .slick-header-column:hover, +.slickgrid .slick-header.ui-state-hover, +.slickgrid .slick-header-column.ui-state-hover { + color: #000 !important; +} + +.slick-row.selected, .slick-row .slick-cell.selected { + background-color: #d3d3d3; +} + +.mail-composer textarea { + background: transparent; +} + +.mail-message { + border-radius: 3px !important; + box-shadow: 1px 1px 4px rgba(0,0,0,0.12) !important; +} + +.mail-message .mail-message-header .subject, +.mail-message .track-fields li { + color: #8C8C8C; +} + +.slick-cell.edit-icon { + padding: 2px; +} +.slick-cell.edit-icon i { + width: 100%; + height: 100%; + text-align: center; +} + +.slick-cell .picker-icons i.fa:hover { + color: #000; +} + +.track-fields span { + color: #000; +} + +.mail-followers .panel-header { + border-bottom: 1px solid #eee; + padding: 0; + padding-bottom: 14px; +} + +.bar-wrap { + min-height: 0 !important; + background-color: #fff; +} + +.panel .bar-wrap { + background-color: inherit; +} + +[ui-view-form], .cards-view, .kanban-view { + background: #fafafa; +} + +[ui-view-form] > form:not(.mail-thread-view) > div > .bar-main > .bar-wrap { + padding: 16px; + border: 1px solid #eee; + box-shadow: 1px 2px 8px 0px rgba(0, 0, 0, 0.15); + margin-bottom: 22px; + border-radius: 5px; +} + +.filter-menu .filter-inputs .tag-select { + border-color: #eee !important; +} + +.filter-menu form > div > .bar-main > .bar-wrap, +.chart-controls form > div > .bar-main > .bar-wrap { + box-shadow: none !important; + border: 0 !important; + border-radius: 0 !important; + margin: 0 !important; + padding: 0 !important; +} + +[ui-view-form] .panel { + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 0; + background-color: inherit; + margin-bottom: 0; +} + +.panel .panel-body { + padding: 0; +} + +.panel-tabs .tab-content { + border-left: 0; + border-right: 0; + padding: 14px 0; + border-top: 2px solid #E7E7E7; +} + +.panel-tabs .nav-tabs { + border-color: #eee; +} + +.nav-tabs-wrap { + border-bottom: 0; +} + +.nav-tabs > li { + margin-right: 0; +} + +.nav-tabs > li > a { + border-radius: 0; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} + +.nav-tabs > li > a, +.nav-tabs-main > li:not(.active) > a { + border-left: 0; + border-right: 0; +} + +.panel-tabs .nav-tabs > li > a, +.panel-tabs .nav-tabs > li.active > a { + border: 0; + margin-bottom: -1px; +} + +.nav-tabs-main > li:first-child a { + border-left: 1px solid #eee; +} + +.nav-tabs-main > li:last-child a { + border-right: 1px solid #eee; +} + +form .nav-tabs > li.active > a, +form .nav-tabs > li.active > a:hover, +form .nav-tabs > li.active > a:focus { + border-top-width: 2px; + padding-top: 5px; + color: #0275d8 !important; +} + +.panel-tabs .nav-tabs > li { + margin-bottom: 0; +} + +form .panel-tabs { + margin-top: 10px; +} + +form .panel-tabs .nav-tabs > li:hover > a { + background: #efefef; + border-bottom: 1px solid #efefef; + cursor: pointer; +} + +.panel-tabs .nav-tabs > li.active > a, +.panel-tabs .nav-tabs > li.active > a:hover, +.panel-tabs .nav-tabs > li.active > a:focus { + border: 0; + border-bottom: 2px solid #0275d8 !important; + font-weight: 600; +} + +.bar-main .mail-messages, +.bar-main .mail-followers, +.bar-main .mail-messages > .panel-body { + border: 0; + padding: 0; +} + +.bar-main .mail-message .mail-message-header { + border-bottom: 0; + padding-bottom: 0; +} + +.slickgrid .slick-header-column, +.slickgrid .slick-headerrow-column { + border-right: 0 !important; +} +.slickgrid .slick-header-menubutton { + border-left-color: #eee; +} + +.slickgrid .slick-header-column.slick-header-column-active, +.slickgrid .slick-header-column.ui-state-hover { + border-left: 1px solid #eee !important; + border-right: 1px solid #eee !important; + padding: 4px 7px; +} + +.slickgrid .slick-headerrow-columns .slick-headerrow-column { + background: #fff; +} +.slickgrid .slick-row { + border-bottom: 0 !important; +} + +.tree-view-container .tree-header th { + border-left: 0; +} +.tree-view-container .tree-header, +.view-container .tree-view > .tree-view-container { + border-color: #eee; +} + +.panel .panel-related .panel-body .slickgrid, +.panel-tabs .panel-related .panel-body .slickgrid, +.panel .form-item .dashlet .dashlet-body .portlet-grid .slickgrid, +.panel-tabs .form-item .dashlet .dashlet-body .portlet-grid .slickgrid { + border-left: 0; + border-right: 0; + border-bottom: 0; +} + +.bar-main .wysiwyg-container { + border: 0; +} + +textarea { + border-width: 0; + border-bottom-width: 1px; +} + +.slick-external-editor textarea { + border-width: 1px; + background-color: #fff; +} + +header .navbar .nav .fa-bars, header .navbar .dropdown-toggle .caret, +header .navbar .nav > li > a:focus, +header .navbar .nav > li > a:hover, +header .navbar .nav > li > a:active, +.navbar .nav li.dropdown.open > .dropdown-toggle, +.navbar .nav li.dropdown.active > .dropdown-toggle, +.navbar .nav li.dropdown.open.active > .dropdown-toggle { + color: #2185D0; +} + +header .dropdown-menu > li > a:hover, +header .dropdown-menu > li > a:focus, +header .dropdown-submenu:hover > a, +header .dropdown-submenu:focus > a { + color: #fff; + background: #2185D0; +} + +.navbar-inner, +.panel .panel-header, +.slickgrid .slick-header, +.nav-tabs-strip .nav-tabs { + border-color: #eee; +} +.slick-headerrow { + border-bottom-color: #eee !important; +} + +.popover { + border-radius: 6px; +} + +.popover-title { + border-radius: 5px 5px 0 0; + background-color: #fff; +} + +.popover.bottom { + background-color: #fff; +} + +.popover.bottom .arrow:after { + border-bottom-color: #fff; +} + +.popover.bottom .popover-content { + background-color: #fff; +} + +[ui-view-form] input, +[ui-view-form] textarea, +[ui-view-form] select, +[ui-view-form] .tag-select { + border-color: #c0c0c0; +} + +[ui-view-form] .form-item-container, +[ui-view-form] .form-item-container > span.display-text, +[ui-view-form] .form-item-container input { + min-height: 21px; + line-height: 21px; +} + +[ui-view-form] .form-item-container input { + height: 21px; +} + +[ui-view-form] .tag-select li.tag-selector input { + min-height: 18px; + height: 18px; +} + +[ui-view-form] .tag-select, +[ui-view-form] .tag-select > ul { + min-height: 20px; +} + +[ui-view-form] .tag-select { + margin-top: -3px !important; +} + +[ui-view-form] .tag-select .tag-text, +[ui-view-form] .tag-select .tag-link, +[ui-view-form] .tag-select-single .tag-link { + height: 14px; + line-height: 12px; +} + +[ui-view-form] .tag-select .label, +[ui-view-form] .tag-select .tag-selector { + height: 17px; +} + +[ui-view-form] .tag-select .label { + padding: .2em .4em .3em; +} + +[ui-view-form] .form-item-container > span.display-text { + padding: 0; +} + +.ng-invalid > input, +.ng-invalid > textarea, +.ng-invalid > .picker-input input, +.ng-invalid > .ui-spinner input, +.ng-invalid > .tag-select, +.ng-invalid > .form-item-container > .wysiwyg-container { + border-color: #B94A48; +} + +.btn, +.ui-widget-content, +.order-subtotal-total, +.panel-tabs .tab-content, +.mail-thread, +.mail-thread .mail-message { + border-color: #eee; +} + +.dropdown-menu { + border: 1px solid rgba(0, 0, 0, 0.05); +} + +.btn { + border-radius: 3px !important; +} + +.btn-danger { + border-color: #d43f3a; +} + +.btn-group > .btn + .btn { + margin-left: 0; +} + +.navbar .btn-group .btn:not(:disabled):hover { + background: #2185D0; + color: #fff; +} + +.panel-layout .form-item > .btn-group .btn { + border-radius: 0 !important; +} + +.bar-side .panel-layout .form-item > .btn { + min-height: 38px; + padding: 8px 10px; + font-weight: 600; +} + +.panel-layout .form-item .btn { + position: relative; + border-radius: 3px !important; + box-shadow: 1px 2px 3px rgba(0,0,0,0.16), 1px 2px 3px rgba(0,0,0,0.23); +} + +.panel-layout .form-item > .btn::after { + content: ''; + position: absolute; + top: 50%; + left: 50%; + width: 15px; + height: 15px; + background: rgba(255, 255, 255, .5); + opacity: 0; + border-radius: 100px; + transform: scale(1, 1) linear 0.1s; + transform-origin: 50% 50%; +} + +@keyframes ripple { + 0% { + transform: scale(0, 0); + opacity: 1; + } + + 100% { + opacity: 0; + transform: scale(100, 100); + } +} + +.panel-layout .form-item > .btn:focus:not(:active)::after { + animation: ripple 1s ease-out; +} + +.o2m-list .o2m-list-row .toggle-item button { + border-radius: 0 !important; + box-shadow: none; + height: 20px !important; + padding: 0 1px 2px 1px !important; + border-bottom-color: #c0c0c0; +} + +.btn-default { + background-color: #fff; + border: 1px solid #0275d8; + color: #0275d8; +} + +.o2m-list-row .toggle-item button { + border: 1px solid #eee; +} + +.btn-primary { + background-color: #0275d8; + border-color: #0275d8; + color: #fff; +} + +.info-button { + border-style: solid; + box-shadow: none !important; +} + +.info-button:not([class*=btn-]) > i, .info-button:not([class*=btn-]) .info-button-value { + color: #2185D0; +} + +.btn-default:hover, +.btn-default:focus, +.btn-default:active, +.btn-default.active, +.btn-default.disabled, +.btn-default[disabled] { + border: 1px solid #0275d8; +} + +.dms-file-list .dms-folder-tree { + border-right: 1px solid #eee; +} + +.view-tabs, +.nav-tabs-strip { + background-color: #fff; +} + +.order-subtotal dl { + max-width: 280px; + float: right; +} +.order-subtotal dt, +.order-subtotal dd { + padding: 4px; +} + +.order-subtotal dt { + padding-right: 8px; + font-weight: normal; + white-space: normal; + width: 55%; +} +.order-subtotal dd { + margin-left: 0; + text-align: right; +} + +.order-subtotal dd:empty { + height: 26px; +} + +.order-subtotal-total { + border-top: 1px solid #ccc; + font-size: 18px; + font-weight: 600; +} + +@media (max-width: 767px) { + .order-subtotal dt { + float: left; + text-align: right; + width: 48%; + } +} + +.order-subtotal-total { + border-color: #eee !important; +} + +.fc-unthemed th, +.fc-unthemed td, +.fc-unthemed thead, +.fc-unthemed tbody, +.fc-unthemed .fc-divider, +.fc-unthemed .fc-row, +.fc-unthemed .fc-popover { + border-color: #eee; +} + +.kanban-column { + background-color: #fff; + box-shadow: 1px 2px 8px 0px rgba(0, 0, 0, 0.15); +} + +.kanban-card, +.cards-view .kanban-card { + background-color: #fdfdfd; +} + +.kanban-card { + border-left-width: 1px; + box-shadow: 1px 1px 4px rgba(0,0,0,0.12); +} + +.kanban-card:hover{ + background: #fafafa; + box-shadow: 2px 2px 6px 0 rgba(0,0,0,0.15); +} + +.kanban-column .input-group .input-group-btn > .btn { + border-radius: 0 !important; +} + +.search-view .bar-wrap { + box-shadow: none !important; + border: 0 !important; + margin: 0 !important; +} + +.nav-select a.nav-label, +.nav-select a.nav-label:after { + background-color: #eee; +} + +.nav-select a.nav-label:hover, +.nav-select a.nav-label:hover:after { + background-color: #e2e2e2; +} + +.dashboard .dashlet-header, +.dashboard .dashlet .dashlet-header { + border-top-width: 1px; + border-top-color: #eee !important; +} + +.dashboard .dashlet { + border: 1px solid #e7e7e7; +} + +.html > .view-pane, +.dashboard > .view-pane { + top: -7px; +} + +.wysiwyg-container, +.wysiwyg-toolbar-top { + border-color: #eee; +} + +.wysiwyg-container.ui-resizable .ui-resizable-handle.ui-resizable-s { + background-color: #eee; +} + +.progress { + border-radius: 5px !important; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.08); +} diff --git a/sophal/css/navtree.css b/sophal/css/navtree.css new file mode 100644 index 0000000..e1d1715 --- /dev/null +++ b/sophal/css/navtree.css @@ -0,0 +1,250 @@ +/** + * Axelor Business Solutions + * + * Copyright (C) 2005-2019 Axelor (). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +.nav-tree, +.nav-tree * { + box-sizing: border-box; +} + +[ui-nav-tree] .nav-search { + margin: 0; + padding: 8px; + padding-bottom: 0; +} + +[ui-nav-tree] .nav-search input { + margin: 0; + box-sizing: border-box; + width: 100%; + height: 28px; +} + +[ui-nav-tree] .nav-search-toggle { + text-align: center; + color: #fff; + line-height: 0; +} + +[ui-nav-tree] .nav-search-toggle i { + cursor: pointer; + width: 32px; + color: #f3f3f3; + font-weight: 600; + margin-top: -1px; +} + +[ui-nav-tree] .nav-search-toggle i:hover { + color: #fff; +} + +.sidebar .ui-autocomplete { + border: 0; + box-sizing: border-box; + min-width: 232px !important; + max-width: 232px !important; + max-height: inherit !important; + background: #2f4050; + bottom: 10px; + box-shadow: none; +} + +.sidebar .ui-menu-category { + font-weight: 600; + padding: 2px 0; + color: #f3f3f3; +} + +.sidebar .ui-menu-item a { + color: #a7b1c2; +} + +.sidebar .ui-menu .ui-menu-item a.ui-state-focus { + color: #fff; + border-color: #293846; + background-color: #293846; +} + +.nav-tree ul, +.nav-tree li { + list-style: none; +} + +.nav-tree li > ul { + display: none; + margin: 0; +} + +.nav-tree li.open > ul { + display: block; +} + +.nav-tree li.animate > ul { + display: block; + height: 0; + position: relative; + overflow: hidden; + transition: all .35s ease; +} + +.nav-tree li > a { + color: #a7b1c2; + text-decoration: none; + outline: none; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 1); + font-weight: 600; +} + +.nav-tree li > a, +.nav-tree li > a:focus { + background: transparent; +} + +.nav-tree li > a > .nav-title { + display: inline-block; + max-width: 160px; +} + +.nav-tree li > a > .nav-image, +.nav-tree li > a > .nav-icon { + margin-right: 6px; + width: 28px; + height: 28px; + float: left; + display: inline-block; + margin-top: -4px; + border-radius: 4px; +} + +.nav-tree li > a > .nav-icon { + padding: 4px 7px; + text-shadow: -1px 1px 5px rgba(0, 0, 0, 0.15); + text-align: center; +} + +.nav-tree ul li > a > .nav-image, +.nav-tree ul li > a > .nav-icon { + width: 16px; + height: 16px; + margin-top: 2px; + margin-right: 4px; + margin-left: -20px; +} + +.nav-tree ul li > a > .nav-icon { + padding: 0; + margin-top: 1px; +} + +.nav-tree li > a * { + position: relative; +} + +.nav-tree li > a:hover, +.nav-tree li.active > a { + color: #fff; + background-color: #293846; +} + +.nav-tree > li { + overflow: hidden; + border-left: 0; +} + +.nav-tree > li.open, +.nav-tree > li.active { + background-color: #293846; +} + +.nav-tree > li.open { + border-left: 4px solid #0275d8; + transition: all .35s ease; +} + +.nav-tree li.folder > a::after { + font-family: "FontAwesome"; + font-size: 10px; + content: "\f053"; + position: absolute; + right: 16px; + z-index: 2; +} + +.nav-tree li.folder.animate > a::after { + -webkit-transform: rotate(-90deg); + -moz-transform: rotate(-90deg); + -ms-transform: rotate(-90deg); + transform: rotate(-90deg); + transition: all .35s ease; +} + +.nav-tree li.folder.open.animate > a::after { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + transition: all .35s ease; +} + +.nav-tree li.folder.open > a::after { + -webkit-transform: rotate(-90deg); + -moz-transform: rotate(-90deg); + -ms-transform: rotate(-90deg); + transform: rotate(-90deg); +} + +.nav-tree li.tagged > a::after { + content: none; +} + +.nav-tree span.nav-tag { + float: right; + text-transform: uppercase; + text-shadow: none; + line-height: 1; + font-size: 10px; + padding: 3px 8px; + border-radius: .25em; + margin-left: 3px; +} + +.nav-tree > li > ul > li:last-child { + margin-bottom: 10px; +} + +.nav-tree li > a { + padding: 7px 8px; +} + +/* 1st level */ +.nav-tree > li > a { + padding: 11px 8px; +} + +/* 2nd level */ +.nav-tree > li > ul > li > a { + padding-left: 42px; +} + +/* 3rd level */ +.nav-tree > li > ul > li > ul > li > a { + padding-left: 52px; +} + +/* 4th level and beyond */ +.nav-tree > li > ul > li > ul > li > ul li > a { + padding-left: 62px; +} diff --git a/sophal/css/print.css b/sophal/css/print.css new file mode 100644 index 0000000..069956d --- /dev/null +++ b/sophal/css/print.css @@ -0,0 +1,418 @@ +/** + * Axelor Business Solutions + * + * Copyright (C) 2005-2019 Axelor (). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +html, body { + overflow: inherit; +} + +#container, +#container > .fill-parent, +#offcanvas, +#view-tabs, +#view-tabs > .navigation-tabs, +.view-content, +.view-pane, +.view-pane > .view-container, +.view-pane > .view-container .form-view > div:last-child, +.view-pane > .view-container > div:not(.slick-editor-dropdown) { + position: inherit !important; +} + +abbr[title]:after, +a[href]:after, .ir a:after, +a[href^="javascript:"]:after, +a[href^="#"]:after { + content: ""; +} + +.popover, .dropdown-menu, +.ui-menu, .filter-menu { + display: none !important; +} + +.ui-dialog { + position: relative !important; + top: 48px !important; + left: inherit !important; + margin: auto !important; + background-color: white !important; +} + +header .navbar-inner { + border-color: #d4d4d4 !important; +} + +#container { + top: 16px; +} + +.view-content, +.view-container .portal-view, +.view-container .form-view > div:last-child { + top: 16px !important; +} + +.view-print-header, +.view-print-header h3 { + text-align: center; + font-size: 17px !important; +} + +.splitter-container .sidebar.splitter-panel, +.splitter-container .splitter-vertical { + display: none; +} + +.splitter-container .splitter-panel { + width: 0; +} + +.splitter-container .splitter-panel.view-tabs { + width: 100% !important; + left: 0 !important; +} + +.nav-menu-bar { + display: none !important; +} + +.nav.nav-shortcuts { + display: none; +} + +.navigation-tabs .axelor-logo { + top: -16px !important; + border: none; +} + +.navigation-tabs > .nav-tabs-wrap, +.navigation-tabs .record-toolbar { + display: none; +} + +.nav-tabs { + border: none; + display: none !important; +} + +.bar-wrap { + border: none !important; + box-shadow: none !important; + padding: 0 !important; + margin-bottom: 0 !important; +} + +.form-item .tabbable-tab, +.form-item .tab-content { + border: none !important; + margin: 0 !important; + padding: 0 !important; +} + +.form-item .nav-tabs-wrap { + display: none; +} + +.panel, +.panel-header, +.panel-body { + border: none !important; + margin: 0 !important; + padding: 6px 0 !important; +} + +.panel-body { + min-height: auto !important; +} + +.panel, .panel-tabs, .panel-stack, .bar-layout .dashboard { + margin-bottom: 0 !important; +} + +.panel-tabs .tab-content > .panel { + padding: 0 !important; +} + +.panel-tabs .tab-content > .panel > .panel-body { + padding: 0 !important; +} + +.panel-header .icons-bar { + display: none !important; +} + +.dashlet-buttons { + display: none; +} + +.report-box .report-tags { + right: 0; +} + +.dashlet.chart, +.chart-container { + page-break-inside: avoid; +} + +.nvtooltip { + display: none !important; +} + +.dashboard .dashlet { + border: none !important; +} + +.dashboard .dashlet-header { + border-top: none; + padding: 10px 0 !important; +} + +.dashlet.grid .dashlet-body { + height: auto !important; + overflow: inherit !important; + position: relative !important; +} + +.form-item-group > legend > i, +.form-item-group > legend > i:before { + display: none !important; +} + +.form-item-group > legend > span { + background: initial !important; + background-color: white !important; +} + +.btn { + display: none; +} + +.picker-input > .picker-icons { + display: none !important; +} + +input, +select, +textarea, +.tag-select { + border: none !important; + box-shadow: none !important; + transition: inherit; +} + +.dms-folder-tree { + display: none !important; +} + +.dms-file-list > .slickgrid { + left: 0 !important; + border: none !important; +} + +.grid-view, +form[ui-form] { + overflow: hidden; +} + +.cards-view, .kanban-view { + top: 0; + position: relative !important; + overflow: inherit !important; +} + +.kanban-column { + border: none !important; + margin-bottom: 0 !important; +} + +.kanban-column .input-group { + display: none !important; +} + +.kanban-column ul.kanban-card-list { + padding: 0 !important; +} + +.dashlet-body .slickgrid, +.dashlet-body .slickgrid .slick-viewport, +.panel-body .slickgrid, +.panel-body .slickgrid .slick-viewport, +.grid-view > .slickgrid, +.grid-view > .slickgrid .slick-viewport { + overflow: inherit !important; + position: relative !important; +} + +.dashlet-body .slickgrid .slick-viewport, +.panel-body .slickgrid .slick-viewport, +.grid-view > .slickgrid .slick-viewport { + height: auto !important; +} + +.grid-view > .slickgrid { + top: 0; +} + +.slickgrid, +.slickgrid .slick-header-column { + border: 0 !important; +} + +.slick-row, .slick-cell { + border-bottom-style: none !important; +} + +.slick-headerrow { + display: none !important; +} + +.stackbar > .navbar .icons-bar { + display: none !important; +} + +.slick-row .slick-cell.edit-icon, +.slick-row .slick-cell.move-icon { + display: none; +} + +.portlet .divider-vertical { + width: 0 !important; + border: none !important; +} + +.nav-select .nav-step:not(.active) { + display: none !important; +} + +.nav-select .nav-step.active a { + padding: 0 !important; +} + +.nav-select .nav-step.active a:after { + display: none !important; +} + +.mail-followers { + margin-left: 16px !important; +} + +.mail-followers .fa { + display: none !important; +} + +.mail-messages { + margin: 0 !important; + padding: 0 !important; +} + +.mail-composer { + display: none; +} + +.mail-thread { + margin-top: 0 !important; +} + +.mail-thread .avatar { + background-color: #ddd !important; +} + +.mail-thread .mail-message > .arrow { + background-color: #fff !important; +} + +.mail-message-icons { + display: none !important; +} + +.mail-thread-more { + display: none !important; +} + +[ui-view-form] > form:not(.mail-thread-view) .mail-messages, +[ui-view-form] > form:not(.mail-thread-view) .mail-followers { + display: none !important; +} + +.ibox .box:before, +.iswitch .box:before { + margin: 0 !important; + padding: 0 !important; + box-shadow: none; + border: none !important; +} + +.ibox .box:after, +.iswitch .box:after { + margin: 0 !important; + padding: 0 !important; + box-shadow: none; +} + +.ibox .box:before, +.iswitch .box:after { + content: "\f00d" !important; + font-family: FontAwesome; + transform: none; +} + +.ibox input:checked + .box:before, +.ibox input:checked + .box:before { + border: none !important; + background-color: #fff !important; +} + +.iswitch input:checked + .box:after { + transform: none; + width: auto; + top: 0; + left: 0; +} + +.iswitch input:checked + .box:after { + content: "\f00c"; + font-family: FontAwesome; +} + +.ibox input:checked + .box:after { + display: none; +} + +/** responsive */ + +header { + display: none; +} + +#sidebar { + display: none; +} + +#view-tabs { + left: 0; +} + +#container, +.view-content, +.view-container .form-view > div:last-child, +.navigation-tabs { + top: 0 !important; +} + +.panel-header .menu-bar { + display: none; +} diff --git a/sophal/css/slickgrid.css b/sophal/css/slickgrid.css new file mode 100644 index 0000000..d98c7ac --- /dev/null +++ b/sophal/css/slickgrid.css @@ -0,0 +1,466 @@ +/** + * Axelor Business Solutions + * + * Copyright (C) 2005-2019 Axelor (). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +.slickgrid { + background: white; + outline: 0; + border: 1px solid #DDD; + border-top: 0 !important; +} + +.slickgrid, +.slickgrid * { + box-sizing: border-box; +} + +.slickgrid .slick-header, +.slickgrid .slick-header-column { + color: #333; + background: #fff; + background-image: none; +} + +.slickgrid .slick-header { + border: 0; + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; +} + +.slickgrid .slick-header-column { + border-right: 1px solid #ddd; +} + +.slickgrid .slick-header-column:last-child { + border-right-color: transparent; +} + +.slickgrid-empty .slick-header, +.slickgrid-empty .slick-headerrow { + height: 0; + border-bottom: none; +} + +.slickgrid .slick-cell, +.slickgrid .slick-header-column { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + -ms-box-sizing: content-box; + box-sizing: content-box; +} + +.slick-row { + background: #f9f9f9; + border-bottom: 1px solid #e7eaec !important; +} +.slick-row.odd { + background: #fff; +} + +.slick-row:hover { + background: #f5f5f5; +} + +.slick-row .slick-cell { + border: 0; + padding: 2px 8px; +} + +.slick-row .slick-cell { + box-sizing: border-box; + line-height: 20px; + height: 100% !important; +} + +.slick-row.selected, +.slick-row .slick-cell.selected { + background-color: #abb9d3; +} + +.slick-row .slick-cell.text, +.slick-row .slick-cell.html { + white-space: pre-wrap; + word-wrap: break-word; +} + +.slick-row .slick-cell.selected.active::after { + content: " "; + display: block; + position: absolute; + top: 0; right: 0; bottom: 0; left: 0; + border: 1px dotted #76849c; + z-index: -1; +} + +.slickgrid-editable .slick-row.active .slick-cell-editable:before { + content: " "; + display: block; + position: absolute; + top: 0; right: 0; bottom: 0; left: 0; + border: 1px solid #8080ff; + background-color: #fff; + z-index: -1; +} + +.slickgrid-editable .slick-row.active .slick-cell-required:before { + background-color: #d2d2ff; +} + +.slick-headerrow { + height: 24px; + border: 0 !important; + border-bottom: 1px solid #ddd !important; + background: #fff !important; + background-image: none !important; +} + +.slick-headerrow-columns .slick-headerrow-column { + background: #f9f9f9; +} + +.slick-headerrow-column { + height: 24px; + border: none !important; + border-right: 1px solid #ddd !important; + background: #f5f5f5; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.slick-headerrow-column:last-child { + border-right: transparent !important; +} + +.slick-headerrow input { + margin: 0; + padding: 2px 8px; + width: 100%; + height: 100%; + outline: 0; + border: none; + border-radius: 0; + -moz-box-sizing: border-box; + box-sizing: border-box; + box-shadow: none !important; +} + + +.slick-headerrow i.combo-icon { + position: absolute; + font-size: 14px; + top: 5px; + right: 6px; +} + +.slick-header-column.ui-state-default { + height: inherit; + line-height: inherit; + padding: 4px 8px; + font-weight: 600; +} + +.slick-headerrow-column.ui-state-default { + padding: 0px; +} + +.slick-cell.editable { + background: white; + padding: 0; +} + +.slick-cell input, +.slick-cell .picker-input, +.slick-cell .ui-spinner, +.slick-cell [x-field] { + outline: 0; + margin: 0; + padding: 0; + border-radius: 0; + box-sizing: border-box; + width: 100%; + height: 100% !important; + min-width: inherit !important; + min-height: 23px; +} + +.slick-cell .picker-input { + width: 100% !important; +} + +.slick-cell .ui-spinner { + border: none; +} + +.slick-cell input { + padding-left: 6px !important; +} + +.slick-cell textarea { + border-radius: 0; + margin: 0; + outline: 0; +} + +.slick-cell .text-item { + height: auto !important; +} + +.slick-cell .picker-input > .picker-icons > i.fa { + padding-top: 2px !important; +} + +.slick-cell input[type=checkbox], +.slick-cell .form-item-container input[type=checkbox] { + width: auto; + height: auto; + margin-top: 0 !important; +} + +.slick-cell .form-item-container > .ibox { + width: auto; + margin-top: 2px !important; + padding: 0; + float: inherit !important; +} + +.slick-editor-dropdown { + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + min-width: 250px; +} + +.ui-dialog [ui-dialog] > .slickgrid { + position: absolute; + top: -1px; right: 0; bottom: -4px; left: 0; + border: 0; +} + +.ui-dialog .slick-editor-dropdown .slickgrid { + position: relative; + top: 0; right: 0; border: 0; left: 0; +} + +.slickgrid-editable .slick-row.active .slick-cell-editable.dirty:before, +.slick-cell.dirty { + background-image: url('../img/dirty.gif'); + background-position: 0 0; + background-repeat: no-repeat; +} + +.slick-cell .input-append > button { + display: none; +} + +.slick-cell.editable * { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; +} + +.slick-cell.button img { + cursor: pointer; +} + +.slick-cell.button .disabled { + outline: none; + opacity: 0.45; + cursor: inherit; +} + +.slick-cell.button, +.slick-cell-checkboxsel { + text-align: center; +} + +.slick-cell-checkboxsel input { + width: inherit; +} + +.slick-header-column.slick-cell-checkboxsel { + padding-top: 2px; +} + +.slick-group > .slick-cell-checkboxsel { + text-align: inherit; +} + +.slick-header-column.integer, +.slick-header-column.decimal, +.slick-cell.integer, +.slick-cell.decimal { + text-align: right; +} + +.slick-header-column.boolean, +.slick-cell.boolean { + text-align: center; +} + +.slick-cell.boolean .fa { + box-sizing: content-box; + border: 1px solid #ccc; + padding: 2px; + width: 14px; + height: 14px; +} + +.slick-headerrow input::-webkit-input-placeholder { + font-size: 11px; +} + +.slick-headerrow input::-moz-placeholder { + font-size: 11px; +} + +.slick-headerrow input::-ms-input-placeholder { + font-size: 11px; +} + +.slick-group-toggle { + width: 9px; + height: 9px; + margin-right: 5px; +} + +.slick-group-toggle.collapsed { + background: url(../lib/slickgrid/images/expand.gif) no-repeat center center; +} + +.slick-group-toggle.expanded { + background: url(../lib/slickgrid/images/collapse.gif) no-repeat center center; +} + +.slick-group-text, +.slick-group-count { + font-weight: 600; +} + +.slick-group-count { + color: green; +} + +.slick-group { + +} + +.slick-group-totals { + font-weight: 600; +} + +.slick-group-totals, +.slick-group-totals .slick-cell { + background-color: #e9e9e9; +} + +.slick-sort-indicator { + margin-left: 7px; +} + +.slick-sort-indicator-asc, +.slick-sort-indicator-desc { + display: inline-block; +} + +.slick-header-menu { + z-index: 1150; + padding: 0; + min-width: 100px; + + border: 1px solid rgba(0, 0, 0, 0.2); + background: #fff; + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + + border-bottom-left-radius: 6px; + border-bottom-right-radius: 6px; +} + +.slick-header-menuitem { + padding: 2px 4px; + padding-right: 20px; + border: 1px solid transparent; +} + +.slick-header-menu > div:first-of-type { + margin-top: 4px; +} + +.slick-header-menu > div:last-of-type { + margin-bottom: 4px; +} + +.slick-header-menuitem:hover { + color: #fff; + background-color: #0081c2; +} + +.slick-header-menusep { + margin: 4px 1px; + background-color: #e5e5e5; + border-bottom: 1px solid #ffffff; +} + +.slick-header-menubutton { + width: 16px; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); +} + +.slick-cell:not(.button) > a { + color: #0088cc; +} + +.slick-cell.edit-icon i, +.slick-cell i.slick-icon { + cursor: pointer; +} + +.slick-cell.move-icon { + cursor: move; +} +.panel-related.readonly .slick-cell.move-icon { + cursor: default; +} +.panel-related.readonly .slick-cell.move-icon::before { + content: ""; +} + +.slickgrid-empty-text { + display: none; +} + +.slickgrid-empty-message .slickgrid-empty-text { + display: block !important; + position: absolute; + top: 48%; + width: 100%; + font-weight: 400; + text-align: center; +} + +.slickgrid-empty-message .grid-canvas { + box-sizing: border-box; +} + +.slickgrid-overlay { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + background: #ddd; + opacity: 0.25; + z-index: 2; +} diff --git a/sophal/css/tabs.css b/sophal/css/tabs.css new file mode 100644 index 0000000..11298cf --- /dev/null +++ b/sophal/css/tabs.css @@ -0,0 +1,98 @@ +/** + * Axelor Business Solutions + * + * Copyright (C) 2005-2019 Axelor (). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +.nav-tabs-wrap { + position: relative; +} + +.nav-tabs-wrap a { + outline: none; +} + +.nav-tabs-menu, +.nav-tabs-scroll-l, +.nav-tabs-scroll-r { + position: absolute; + width: 16px; + top: 0px; + bottom: 0px; + margin-top: .8em; + border-bottom: 1px solid #DDD; + display: none; +} + +.nav-tabs-scroll-r { + right: 0px; +} + +.nav-tabs-scroll-l a, +.nav-tabs-scroll-r a { + margin: auto; + display: block; + width: 6px; + text-decoration: none; +} + +.nav-tabs-menu { + right: 0; +} + +.nav-tabs-scroll-l.disabled a, +.nav-tabs-scroll-r.disabled a { + color: #999999; + cursor: default; +} + +.nav-tabs-strip { + position: relative; + overflow: hidden; + height: 36px; +} + +.nav-tabs-strip .nav-tabs { + display: block; + position: absolute !important; + width: 100000px; +} + +.nav-tabs-closable li { + position: relative; +} + +.nav-tabs-scrollable li > a, +.nav-tabs-closable li > a { + border: 1px solid #EEE; + border-bottom: 1px solid #DDD; +} + +.nav-tabs-closable li > a { + padding-right: 18px; +} + +.nav-tabs-closable li > i { + position: absolute; + top: 5px; + right: 6px; + color: #ccc; + cursor: pointer; + font-size: 11px; +} + +.nav-tabs-closable .active > i, +.nav-tabs-closable li > i:hover { + color: #555; +} diff --git a/sophal/css/theme-default/theme.css b/sophal/css/theme-default/theme.css new file mode 100644 index 0000000..d40f0a3 --- /dev/null +++ b/sophal/css/theme-default/theme.css @@ -0,0 +1,677 @@ +/** + * Axelor Business Solutions + * + * Copyright (C) 2019 Axelor (). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +@import url('../custom.css'); + + +.font-italic{ + font-style:italic; +} + +.font-normal{ + font-weight:normal !important; +} + +.font-bold{ + font-weight:bold !important; +} + +.font-10px{ + font-size:10px; +} + +.font-11px{ + font-size:11px; +} + +.font-12px{ + font-size:12px; +} + +.font-13px{ + font-size:13px; +} + +.font-14px{ + font-size:14px; +} + +.font-15px{ + font-size:15px; +} + +.font-16px{ + font-size:16px; +} + +.font-18px{ + font-size:18px; +} + +.font-20px{ + font-size:20px !important; +} + +.font-22px{ + font-size:22px; +} + +.font-24px{ + font-size:24px; +} + +.font-verdana{ + font-family:Verdana; +} + +.font-times{ + font-family: Times New Roman; +} + +.font-arial{ + font-family: Arial; +} +.font-courier{ + font-family: Courier; +} +.font-sans-serif{ + font-family: sans-sarif; +} +.font-georgia{ + font-family: Aeorgia; +} +.font-trebuchet{ + font-family: Trebuchet; +} +.font-lucida-console{ + font-family: Lucida Console; +} +.font-tahoma{ + font-family: Tahoma; +} +.font-impact{ + font-family: Impact; +} + +.font-black{ + color: black !important; +} + +.font-blue{ + color: blue !important; +} + +.font-grey{ + color: grey !important; +} + +.font-green{ + color: green !important; +} + +.font-lime{ + color: lime !important; +} + +.font-maroon{ + color: maroon !important; +} + +.font-navy{ + color: navy !important; +} + +.font-olive{ + color: olive !important; +} + +.font-orange{ + color: orange !important; +} + +.font-purple{ + color: purple !important; +} + +.font-red{ + color: red !important; +} + +.font-silver{ + color: silver !important; +} + +.font-white{ + color: white !important; +} + +.font-yellow{ + color: yellow !important; +} + +.text-overline{ + text-decoration:overline; +} + +.text-line-through{ + text-decoration: line-through; +} + +.text-underline{ + text-decoration: underline; +} + +.text-left{ + text-align:left; +} + +.text-right{ + text-align:right; +} + +.text-center{ + text-align: center; +} + +.text-justify{ + text-align:justify; +} + +.text-upper{ + text-transform:uppercase; + +} +.text-lower{ + text-transform:lowercase; +} + +.text-capital{ + text-transform:capitalize; +} + +.text-direction-ltr{ + direction:ltr; +} + +.text-direction-rtl{ + direction:rtl; +} + + + +.button-yellow, .button-yellow:hover, .button-yellow:focus{ + border : 1px solid #FFCC00; + color : #333333; + background-image: -webkit-linear-gradient(bottom, #FFCC00, #FFE680); + background-image: -moz-linear-gradient(bottom, #FFCC00, #FFE680); + background-image: linear-gradient(bottom, #FFCC00, #FFE680); + background-color: #FFCC00; + + +} +.button-blue, .button-blue:hover, .button-blue:focus{ + border : 1px solid #3366CC; + color :white; + background-image: -webkit-linear-gradient(bottom, #3366CC, #85A3E0); + background-image: -moz-linear-gradient(bottom, #3366CC, #99B2E6); + background-image: linear-gradient(bottom, #3366CC, #99B2E6); + background-color: #3366CC; +} +.button-black, .button-black:focus, .button-black:hover{ + border : 1px solid #000000; + color :white; + background-image: -webkit-linear-gradient(bottom, #000000, #808080); + background-image: -moz-linear-gradient(bottom, #000000, #808080); + background-image: linear-gradient(bottom, #000000, #808080); + background-color: #000000; +} + +.button-purple, .button-purple:hover, .button-purple:focus{ + border : 1px solid #B280B2; + color :white !important; + background-image: -webkit-linear-gradient(bottom, #660066, #B280B2); + background-image: -moz-linear-gradient(bottom, #660066, #B280B2); + background-image: linear-gradient(bottom, #660066, #B280B2); + background-color: #660066; +} + +.button-green, .button-green:focus, .button-green:hover{ + border : 1px solid #80CC80; + color :white !important; + background-image: -webkit-linear-gradient(bottom, #009900, #80CC80); + background-image: -moz-linear-gradient(bottom, #009900, #80CC80); + background-image: linear-gradient(bottom, #009900, #80CC80); + background-color: #009900; +} + +.button-red, .button-red:focus, .button-red:hover{ + border : 1px solid #FF8080; + color :white !important; + background-image: -webkit-linear-gradient(bottom, #FF0000, #FF8080); + background-image: -moz-linear-gradient(bottom, #FF0000, #FF8080); + background-image: linear-gradient(bottom, #FF0000, #FF8080); + background-color: #FF0000; + +} + +.button-brown, .button-brown:focus, .button-brown:hover{ + border : 1px solid #B29980; + color :white; + background-image: -webkit-linear-gradient(bottom, #663300, #B29980); + background-image: -moz-linear-gradient(bottom, #663300, #B29980); + background-image: linear-gradient(bottom, #663300, #B29980); + background-color: #663300; +} + +.button-grey, .button-grey:focus, .button-grey:hover{ + border : 1px solid #B2B2B2; + color : white !important; + background-image: -webkit-linear-gradient(bottom, grey, #B2B2B2); + background-image: -moz-linear-gradient(bottom, grey, #B29980); + background-image: linear-gradient(bottom, grey, #B29980); + background-color: grey; +} +.button-pink, .button-pink:focus, .button-pink:hover{ + border : 1px solid #E680B2; + color : white !important; + background-image: -webkit-linear-gradient(bottom, #CC0066, #E680B2); + background-image: -moz-linear-gradient(bottom, #CC0066, #E680B2); + background-image: linear-gradient(bottom, #CC0066, #E680B2); + background-color: #CC0066; +} + +.border-solid{ + border-style: solid !important; +} + +.border-dotted{ + border-style: dotted !important; +} +.border-dashed{ + border-style: dashed !important; +} +.border-double{ + border-style: double !important; +} +.border-inset{ + border-style: inset !important; +} +.border-outset{ + border-style: outset !important; +} +.border-hidden{ + border-style: hidden !important; +} +.border-red{ + border-color: red !important; +} +.border-black{ + border-color: black !important; +} +.border-blue{ + border-color: blue !important; +} +.border-grey{ + border-color: grey !important; +} +.border-green{ + border-color: green !important; +} +.border-white{ + border-color: white !important; +} +.border-yellow{ + border-color: yellow !important; +} +.border-navy{ + border-color: navy !important; +} + +.border-top{ + border-top: 1px solid; +} + +.border-bottom{ + border-bottom: 1px solid; +} + +.border-left{ + border-left: 1px solid; +} + +.border-right{ + border-right: 1px solid; +} + +.group-bg-green{ + background-color: green !important; +} +.group-bg-gray{ + background-color: gray !important; +} +.group-bg-blue{ + background-color: blue !important; +} +.group-bg-white{ + background-color: white !important; +} +.group-bg-red{ + background-color: red !important; +} +.group-bg-yellow{ + background-color: yellow !important; +} +.group-bg-olive{ + background-color: olive !important; +} + +.group-title-green span.ng-binding{ + color: green !important; +} +.group-title-gray span.ng-binding{ + color: gray !important; +} +.group-title-blue span.ng-binding{ + color: blue !important; +} +.group-title-white span.ng-binding{ + color: white !important; +} +.group-title-red span.ng-binding{ + color: red !important; +} +.group-title-yellow span.ng-binding{ + color: yellow !important; +} +.group-title-olive span.ng-binding{ + color: olive !important; +} + +.group-border-1px{ + border : 1px solid; +} +.group-border-2px{ + border: 2px solid; +} +.group-border-3px{ + border: 3px solid; +} +.group-border-4px{ + border: 4px solid; +} +.group-border-5px{ + border: 5px solid; +} + + + + +.separator-bg-red{ + color : white; + background : red; + padding-top: 4px; + padding-left: 5px; + border-bottom: 2px solid red; +} +.separator-bg-yellow{ + color : white; + background : yellow; + padding-top: 4px; + padding-left: 5px; + border-bottom: 2px solid yellow; +} + +.separator-bg-green{ + color : white; + background : green; + padding-top: 4px; + padding-left: 5px; + border-bottom: 2px solid green; +} +.separator-bg-blue{ + color : white; + background : blue; + padding-top: 4px; + padding-left: 5px; + border-bottom: 1px solid blue; +} +.separator-bg-white{ + color : #333333 !important; + padding-top: 5px; + padding-left: 5px; + border-bottom: 2px solid #333333; +} + +.separator-bg{ + color : white; + background : #80B2B2; + padding-top: 5px; + padding-left: 5px; + border-bottom: 2px solid #80B2B2; +} +.separator-bg-theme{ + color : white; + background : #006666; + padding-top: 5px; + padding-left: 5px; + border-bottom: 2px solid #006666; +} + +.separator-bg-grey{ + color : white; + background : grey; + padding-top: 5px; + padding-left: 5px; + border-bottom: 2px solid grey; +} +.separator-bg-purple{ + color : white; + background : purple; + padding-top: 5px; + padding-left: 5px; + border-bottom: 2px solid purple; +} +.separator-bg-black{ + color : white; + background : #333333; + padding-top: 5px; + padding-left: 5px; + border-bottom: 2px solid #333333; +} +.separator-bg-pink{ + color : white; + background : #CC0066; + padding-top: 5px; + padding-left: 5px; + border-bottom: 2px solid #CC0066; +} +.separator-bg-brown{ + color : white; + background : #663300; + padding-top: 5px; + padding-left: 5px; + border-bottom: 2px solid #663300; +} +.rounded-corner{ + border-radius : 5px !important; +} +.separator-1px{ + border-bottom: 1px solid !important; +} +.separator-2px{ + border-bottom: 2px solid !important; +} +.separator-3px{ + border-bottom: 3px solid !important; +} +.separator-4px{ + border-bottom: 4px solid !important; +} +.separator-5px{ + border-bottom: 5px solid !important; +} + +.separator-1px-dotted{ + border-bottom: 1px dotted !important; +} +.separator-2px-dotted{ + border-bottom: 2px dotted !important; +} +.separator-3px-dotted{ + border-bottom: 3px dotted !important; +} +.separator-4px-dotted{ + border-bottom: 4px dotted !important; +} +.separator-5px-dotted{ + border-bottom: 5px dotted !important; +} + +.separator-1px-dashed{ + border-bottom: 1px dashed !important; +} +.separator-2px-dashed{ + border-bottom: 2px dashed !important; +} +.separator-3px-dashed{ + border-bottom: 3px dashed !important; +} +.separator-4px-dashed{ + border-bottom: 4px dashed !important; +} +.separator-5px-dashed{ + border-bottom: 5px dashed !important; +} + +.content-bold input { + font-weight:bold; +} + +.content-italic input { + font-style:italic; +} + +.content-10px input { + font-size:10px; +} +.content-11px input { + font-size:11px; +} +.content-12px input { + font-size:12px; +} +.content-13px input { + font-size:13px; +} +.content-14px input { + font-size:14px; +} +.content-15px input { + font-size:15px; +} +.content-16px input { + font-size:16px; +} +.content-18px input { + font-size:18px; +} +.content-20px input { + font-size:20px; +} +.content-22px input { + font-size:22px; +} +.content-24px input { + font-size:24px; +} + + +.content-black input{ + color: black !important; +} + +.content-blue input{ + color: blue !important; +} + +.content-grey input{ + color: grey !important; +} + +.content-green input{ + color: green !important; +} + +.content-lime input{ + color: lime !important; +} + +.content-maroon input{ + color: maroon !important; +} + +.content-navy input{ + color: navy !important; +} + +.content-olive input{ + color: olive !important; +} + +.content-orange input{ + color: orange !important; +} + +.content-purple input{ + color: purple !important; +} + +.content-red input{ + color: red !important; +} + +.content-silver input{ + color: silver !important; +} + +.content-white input{ + color: white !important; +} + +.content-yellow input{ + color: yellow !important; +} + + +/* */ + +.button-item.client-img-menu img{ + width: 50%; +} + +.button-item.client-img-menu img:hover{ + width: 80%; +} + +.button-item.client-img-menu span{ + color: #000; +} + +li a[href="#/about"] { + display: none; + visibility: hidden; +} diff --git a/sophal/css/view.calendar.css b/sophal/css/view.calendar.css new file mode 100644 index 0000000..da4f1b0 --- /dev/null +++ b/sophal/css/view.calendar.css @@ -0,0 +1,87 @@ +/** + * Axelor Business Solutions + * + * Copyright (C) 2005-2019 Axelor (). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +.view-container .calendar-view { + display: flex; + flex-direction: column; +} + +.view-container .calendar-view > div:last-child { + display: flex; + padding: 4px; + background-color: #fff; + max-height: 100%; + flex: 1; +} + +.calendar-main { + flex: 1; + height: 100%; +} + +.calendar-side { + overflow: hidden; + margin-left: 4px; + max-width: 228px; + display: flex; + flex-direction: column; + height: 100%; +} + +.calendar-side .ui-datepicker { + box-shadow: none; + border-radius: 0; +} + +.calendar-legend { + padding-left: 4px; + margin-top: 8px; + margin-bottom: 0; + overflow: auto; + flex: 1; +} + +.calendar-legend label { + line-height: 20px; +} + +.calendar-view .record-pager > span { + font-weight: 600; + padding: 10px 4px 0; +} + +.calendar-view .fc-month-view .calendar-event-day * { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.calendar-view .fc-event .fc-bg { + opacity: .1; +} + +.calendar-bubble-content { + overflow: hidden; +} + +.calendar-bubble-content hr { + margin: 8px 0; +} + +.calendar-view .fc-widget-header { + font-weight: 600; +} diff --git a/sophal/css/view.dms.css b/sophal/css/view.dms.css new file mode 100644 index 0000000..7f065f9 --- /dev/null +++ b/sophal/css/view.dms.css @@ -0,0 +1,490 @@ +/** + * Axelor Business Solutions + * + * Copyright (C) 2005-2019 Axelor (). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +.dms-file-list { + position: relative; + overflow: hidden; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.dms-file-list .record-toolbar .breadcrumb { + margin: 0; + padding: 11px 8px; + font-weight: 600; + white-space: nowrap; + overflow: hidden; + background-color: #fff; +} + +.dms-file-list .record-toolbar .breadcrumb a { + color: #0088cc; +} + +.dms-file-list .record-toolbar .btn { + outline: none; +} + +.dms-file-list > .slickgrid, +.dms-file-list .dms-folder-tree, +.dms-file-list .dms-details { + transition: all 0.25s; +} + +.dms-file-list .dms-folder-tree { + position: absolute; + overflow: auto; + width: 250px; + top: 41px; + bottom: 0; + left: 0; + border-right: 1px solid #d3d3d3; + background-color: #fff; +} + +.dms-file-list .dms-details { + position: absolute; + right: -1px; + top: 41px; + bottom: 0; + width: 249px; + margin: 0; + border-bottom: 0; + background-color: white; + box-shadow: 0 6px 12px rgba(0,0,0,.175); + z-index: 2; +} + +.dms-file-list .dms-details.ng-hide { + right: -261px; +} + +.dms-file-list .dms-details > .panel-body { + position: absolute; + top: 48px; + right: 0; + bottom: 0; + left: 0; + overflow: auto; +} + +.dms-file-list .dms-details > .panel-header .panel-title { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + max-width: calc(100% - 20px); + box-sizing: border-box; +} + +.dms-file-list .dms-details input.not-readonly { + background: inherit !important; + border: 0; + box-shadow: none; + margin-bottom: 5px; +} + +.dms-file-list .dms-details label { + cursor: default; + font-weight: 600; +} + +.dms-file-list .dms-details .tags > .label { + float: left; + margin-right: 5px; + margin-bottom: 5px; + padding: 4px 6px; + border-radius: 0; +} + +.dms-file-list .dms-details .tags form { + margin: 0; + padding: 0; + width: 100%; +} + +.dms-file-list .dms-details .tags .panel { + margin: 0; +} + +.dms-file-list .dms-details .tags a { + color: #222; + float: left; + margin-right: 5px; +} + +.dms-file-list > .slickgrid { + left: 250px; +} + +.dms-file-list.has-no-tree .dms-folder-tree { + left: -251px; +} + +.dms-file-list.has-no-tree > .slickgrid { + left: 0 !important; +} + +.dms-file-list .slick-icon.fa-file-text { + color: #337ab7; +} + +.dms-file-list .slick-icon.fa-table { + color: #0275d8; +} + +.dms-folder-dialog input { + box-sizing: border-box; + width: 100%; + height: 28px; + margin: 0; +} + +.dms-file-upload .upload-list, +.dms-file-upload .upload-dropzone { + position: absolute; + z-index: 10000; + background: white; +} + +.dms-file-upload .upload-dropzone { + border: 1px solid #d4d4d4; + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + width: 250px; + height: 250px; + border-radius: 125px; + text-align: center; + top: calc(50% - 125px); + left: calc(50% - 125px); + z-index: 10001; + display: none; +} + +.dms-file-upload .upload-dropzone .drop-image { + margin-top: 36%; + margin-bottom: 12px; +} + +.dms-file-upload .upload-dropzone .drop-image i { + font-size: 32px !important; +} + +.dms-file-list .dms-details .panel-header, +.dms-file-upload .panel-header { + overflow: hidden; +} + +.dms-file-list .dms-details .panel-header a, +.dms-file-upload .panel-header a { + color: #222; +} + +.dms-file-upload .panel-body { + padding: 0; +} + +.dms-file-upload .upload-list * { + box-sizing: border-box; +} + +.dms-file-upload .upload-list { + bottom: 0; + right: 10px; + width: 480px; + font-size: 12px; +} + +.dms-file-upload .upload-list-item { + border-bottom: 1px solid #d4d4d4; + padding: 2px; + position: relative; + overflow: hidden; +} + +.dms-file-upload .upload-list .panel-body { + max-height: 420px; + overflow: auto; +} + +.dms-file-upload .upload-list-item:last-child { + border-bottom: 0; +} + +.dms-file-upload .upload-list-item > div { + padding: 2px; + margin: 0; + min-height: inherit; + float: left; + white-space: nowrap; + text-overflow: ellipsis; + text-align: right; + overflow: hidden; +} + +.dms-file-upload .upload-list .file-name { + width: 60%; +} + +.dms-file-upload .upload-list .file-progress { + width: 25%; +} + +.dms-file-upload .upload-list .file-op { + width: 15%; +} + +.dms-file-upload .upload-list .progress { + margin-bottom: 0; +} + +.dms-file-upload .upload-list .progress, +.dms-file-upload .upload-list .progress .bar { + -webkit-transition: inherit; + transition: inherit; +} + +@media (max-width: 767px) { + .dms-file-upload .upload-list { + left: 8px; + right: 8px; + width: auto; + } + .dms-file-upload .upload-list-item > div { + width: 100% !important; + } +} + +.dms-file-upload .upload-overlay { + opacity: 0.3; + with: 100%; + height: 100%; + overflow: hidden; + z-index: 10000; + position: absolute; + top: 0px; + left: 0; + right: 0; + bottom: 0; + background-color: gray; + display: none; +} + +.dms-file-list.dropping .upload-overlay, +.dms-file-list.dropping .upload-dropzone { + display: block; +} + +.dms-folder-tree { + box-sizing: border-box; +} + +.dms-folder-tree * { + box-sizing: border-box; +} + +.dms-folder-tree ul { + margin: 0 0 0px 15px; +} + +.dms-folder-tree ul, +.dms-folder-tree li { + list-style: none; + white-space: nowrap; +} + +.dms-folder-tree li { + text-overflow: ellipsis; + overflow: hidden; +} + +.dms-folder-tree > ul { + margin: 1px 4px; +} + +.dms-folder-tree li > a { + color: #333; + text-decoration: none; + line-height: 2em; + padding: 4px; + outline: none; +} + +.dms-folder-tree li > a * { + position: relative; +} + +.dms-folder-tree li > a span.highlight { + position: absolute; + box-sizing: border-box; + width: 100%; + height: 2em; + left: 0; +} + +.dms-folder-tree li > a i.handle { + width: 16px; + display: inline-block; + text-align: center; +} + +.dms-folder-tree li.empty i.handle { + visibility: hidden; +} + +.dms-folder-tree li > a:hover span.highlight { + background-color: rgba(0, 0, 0, .05); +} + +.dms-folder-tree li > a.active span.highlight { + background-color: rgba(0, 0, 0, .1); +} + +.dms-folder-tree li > a.dropping span.highlight { + border: 1px solid rgba(82, 168, 236, 0.8); +} + +.dms-folder-tree li > a.active { + color: #222; + font-weight: 600; +} + +.dms-folder-tree li.dms-tree-more > a > span.title { + padding-left: 20px; + font-style: oblique; +} + +.grid-dnd-proxy { + position: absolute; + display: inline-block; + padding: 6px 12px; + background: #fff; + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 4px; + z-index: 100000; +} + +.grid-dnd-proxy .badge { + position: absolute; + bottom: calc(100% - 6px); + left: calc(100% - 6px); +} + +.dms-popup { + margin-top: -1px; + padding: 1px 0 0 !important; +} + +.ui-dialog .ui-dialog-content.dms-popup { + height: 450px !important; + overflow: inherit !important; +} +.ui-dialog.maximized .ui-dialog-content.dms-popup { + height: 100% !important; + max-height: 100% !important; +} + +.dms-popup > div, +.dms-popup > div > .grid-view { + height: 100%; + box-sizing: border-box; +} + +.dms-popup > div > .grid-view { + position: absolute; + top: 2px; + right: 0; + bottom: -4px; + left: 0; + border: 0; +} + +.dms-permission-popup { + +} + +.dms-permission-popup [x-field="user"] input, +.dms-permission-popup [x-field="group"] input { + border-right: none; +} + +.dms-permission-popup .picker-input i.fa-times { + font-size: 11px; + position: relative; + top: -1px; + color: #d4d4d4; +} + +.dms-permission-popup .picker-input i.fa-times:hover { + color: #222; +} + +.spreadsheet-item { + border: 1px solid #e7e7e7; +} +.spreadsheet-item .ui-resizable-s { + background-color: #e7e7e7; + border-color: #e7e7e7; +} + +.dms-folder-tree i.fa-folder { + font-size: 18px; + vertical-align: middle; + margin-right: 4px; + margin-top: -1px; +} + +i.fa-colored.fa-folder { + color: #FFA726; +} + +i.fa-colored.fa-file-o { + color: #767676; +} + +i.fa-colored.fa-file-text-o { + color: #2185D0; +} + +i.fa-colored.fa-file-word-o { + color: #2185D0; +} + +i.fa-colored.fa-file-excel-o { + color: #21BA45; +} + +i.fa-colored.fa-file-powerpoint-o { + color: #a33e03; +} + +i.fa-colored.fa-file-pdf-o { + color: #DB2828; +} + +i.fa-colored.fa-file-image-o { + color: #6435C9; +} + +i.fa-colored.fa-file-video-o { + color: #DB2828; +} + +i.fa-colored.fa-file-archive-o { + color: #A5673F; +} diff --git a/sophal/css/view.form.checkbox.css b/sophal/css/view.form.checkbox.css new file mode 100644 index 0000000..4f0e08f --- /dev/null +++ b/sophal/css/view.form.checkbox.css @@ -0,0 +1,202 @@ +/** + * Axelor Business Solutions + * + * Copyright (C) 2005-2019 Axelor (). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +.ibox { + display: inline-block; + width: inherit; + margin: 0; + overflow: hidden; +} + +.form-inline .ibox { + vertical-align: middle; + margin-bottom: 0; +} + +.ibox.readonly { + cursor: default; + opacity: 0.6; +} + +.ibox .box { + display: inline-block; + position: relative; + width: 20px; + height: 20px; + float: left; + outline: none; +} + +.ibox input { + opacity: 0 !important; + margin-left: -14px !important; + position: absolute; +} + +.ibox .title { + margin-left: 8px; +} + +.ibox .item-label { + color: #999; +} + +.ibox .box:before, +.ibox .box:after { + box-sizing: border-box; +} + +.ibox.round .box:before { + border-radius: 20px; +} + +.ibox .box:before { + content: " "; + display: inline-block; + border: 1px solid #ccc; + height: 100%; + width: 100%; + transition: all .2s; +} + +.ibox input:focus + .box:before { + border: 1px solid #0275d8; +} + +.ibox:hover .box:before, +.ibox:hover input:focus + .box:before { + border: 2px solid #0275d8; +} + +.ibox input:checked + .box:before { + border: 1px solid #0275d8; + background-color: #0275d8; +} + +.ibox input:checked + .box:after { + content: " "; + display: inline-block; + position: absolute; + top: 5px; + left: 4px; + width: 12px; + height: 7px; + border: 2px solid #fff; + border-top: 0; + border-right: 0; + -webkit-transform: rotate(-45deg); + -moz-transform: rotate(-45deg); + -ms-transform: rotate(-45deg); + transform: rotate(-45deg); +} + +.ibox:hover input:disabled + .box:before { + border: 1px solid #ccc; +} + +.ibox:hover input:disabled:checked + .box:before { + border: 1px solid #0275d8; +} + +.readonly > .ibox, +.readonly > .iswitch { + cursor: inherit; +} + +.readonly > .ibox > .box, +.readonly > .iswitch { + opacity: 0.6; +} + +.form-item.iswitch { + margin-top: 4px; +} + +.iswitch { + position: relative; + display: inline-block; + width: 35px; + height: 20px; + margin: 0; + cursor: pointer; + background-color: #0275d8; + border-radius: 30px +} + +.iswitch.readonly { + cursor: default; + opacity: 0.6; +} + +.iswitch input { + position: absolute; + opacity: 0; + filter: alpha(opacity=0) +} + +.iswitch input:checked + .box:before { + top: 50%; + right: 5px; + bottom: 50%; + left: 50%; + border-width: 0; + border-radius: 5px +} + +.iswitch input:checked + .box:after { + margin-left: 16px +} + +.iswitch .box:before { + content: ""; + position: absolute; + top: -1px; + right: -1px; + bottom: -1px; + left: -1px; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 30px; + transition: all .2s +} + +.iswitch input:focus + .box:before { + border: 1px solid #0275d8; +} + +.iswitch .box:after { + content: ""; + position: absolute; + top: 1px; + bottom: 1px; + width: 18px; + background-color: #fff; + border-radius: 50%; + box-shadow: 1px 1px 3px rgba(0,0,0,0.25); + transition: margin-left .3s +} + +.ng-invalid > .ibox .box:before, +.ng-invalid > .iswitch .box:before { + border-color: #B94A48; +} + +.form-item-container > .ibox, +.form-item-container > .iswitch { + margin: 4px 0 !important; + float: left; +} diff --git a/sophal/css/view.form.css b/sophal/css/view.form.css new file mode 100644 index 0000000..e72c992 --- /dev/null +++ b/sophal/css/view.form.css @@ -0,0 +1,1562 @@ +/** + * Axelor Business Solutions + * + * Copyright (C) 2005-2019 Axelor (). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +/* FORM VIEW */ + +::-ms-clear { + display: none; +} + +input[disabled], +select[disabled], +textarea[disabled], +input[readonly], +select[readonly], +textarea[readonly] { + cursor: default; +} + +.view-container .form-view > div:last-child { + position: absolute; + top: 41px; + bottom: 0; left: 0; right: 0; + overflow: auto; +} + +.view-container .form-view > div.no-toolbar { + top: 0; +} + +.view-container .form-view > div[ui-view-form].has-width { + padding: 8px 16px; + background-color: #f7f7f9; +} + +.view-container .form-view > div[ui-view-form].has-width > form { + padding: 8px; + background-color: #fff; + + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 4px; + box-shadow: 1px 1px 6px rgba(0, 0, 0, 0.2); + + width: 90%; + min-width: 600px; + overflow: auto; +} + +@media screen and (max-width: 979px) { + .view-container .form-view > div[ui-view-form].has-width { + padding: 4px; + background-color: #fff !important; + } + .view-container .form-view > div[ui-view-form].has-width > form { + border: none; + border-radius: 0; + box-shadow: none; + width: auto; + } +} + +.view-container .form-view .nested-editor form { + width: inherit !important; +} + +table.form-layout { + width: 100%; + border-collapse: collapse; +} + +table.form-layout * { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; +} + +table.form-debug, +table.form-debug td.form-label, +table.form-debug td.form-item { + border: 1px solid #D14; +} + +table.form-layout td.form-label, +table.form-layout td.form-item { + padding: 2px; + vertical-align: top; +} + +table.form-layout td.form-label { + text-align: left; + padding-left: 8px; + padding-right: 4px; + width: 15%; + min-width: 100px; +} + +table.form-layout td.form-item.boolean-item { + vertical-align: inherit; +} + +table.form-layout td.form-label > label { + padding-top: 3px; + margin-bottom: 0px; + font-weight: 600; + cursor: inherit; +} + +table.form-layout td.form-label > label > span { + cursor: pointer; +} + +table.form-layout td.form-label label.required { + color: #B94A48; +} + +table.form-layout td.form-label label.readonly { + color: inherit; +} + +table.form-layout td.form-item > *, +.form-item-container > * { + width: 100%; + margin: 0 !important; +} + +.form-item-container > * { + width: 100%; +} + +.form-item-container > .translate-icon { + position: absolute; + right: 0; + width: auto; + line-height: 28px; + padding: 0 4px; + cursor: pointer; +} + +.form-item-container.html-item > .translate-icon { + z-index: 1; +} +.form-item-container.html-item.readonly > .translate-icon { + display: none !important; +} + +table.form-layout td.form-item.v-align-top { + vertical-align: top; +} + +.form-item-container, +.form-item-container > span.display-text { + min-height: 26px; + display: flex; +} + +.form-item-container { + min-width: 26px; + position: relative; +} + +.form-item-container > span.display-text { + padding-top: 5px; + padding-bottom: 2px; +} + +.form-item-container input { + height: 28px; + padding: 2px 6px; + min-width: 170px; +} + +.form-item-container[style *= width] input { + min-width: inherit; +} + +.form-item-container.datetime-item .picker-input { + min-width: 120px; + width: 140px; +} + +.form-item-container.time-item input { + width: 60px; + min-width: 40px; +} + +.slick-cell .form-item-container { + width: 100% !important; + min-height: 100% !important; +} + +.form-item-container input, +.form-item-container input:focus, +.form-item-container textarea, +.form-item-container textarea:focus { + outline-style: none; +} + +.form-item-container .small-input input, +.form-item-container input.small-input { + min-width: 50px; + height: 26px; +} + +.form-item-container input[type="radio"], +.form-item-container input[type="checkbox"] { + width: auto; + min-width: inherit; + height: inherit; + margin-top: 6px !important; +} + +.form-item-container label.checkbox { + padding-right: 6px; +} + +.form-item-container.readonly label.checkbox { + cursor: default; +} + +.form-item-container label.radio input[type="radio"], +.form-item-container label.checkbox input[type="checkbox"] { + margin-top: 3px !important; +} + +.form-item > a.btn, +.form-item-container button { + padding: 2px 10px 2px; + min-width: 26px; + height: 26px; + overflow: hidden; + white-space: nowrap; +} + +.form-item-container textarea { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; + resize: vertical; +} + +.form-item fieldset { + min-width: inherit; +} + +table.form-layout fieldset { + padding: 4px 0; +} + +.form-item-container.readonly > a, +.form-item-container.readonly > input, +.form-item-container.readonly > span.display-text { + padding-left: 2px; +} + +.form-item-container.readonly > a { + line-height: 22px; + color: #0088cc; +} + +.form-item-container.datetime input { + min-width: 100px; +} + +.form-item-container.datetime-item input { + min-width: 134px; +} + +.form-item-container > input.display-text { + min-width: 100px; + border: none; + border-radius: 0; + box-shadow: none; + background: transparent; + padding-left: 0; +} + +.form-item-container > a.display-text { + display: inline-block; + white-space: nowrap; + height: 24px; + padding-top: 3px; +} + +.form-item-container > .display-text { + text-overflow: ellipsis; + overflow: hidden; + color: #555555; +} + +.picker-input, +.form-item .ui-spinner { + box-sizing: border-box; + position: relative; + display: inline-flex; +} + +.picker-input > input { + margin: 0; + width: 100%; +} + +.picker-input > .picker-icons { + position: absolute; + display: flex; + align-items: center; + white-space: nowrap; + + top: 0; + right: 3px; + height: 100%; +} + +.picker-input > .picker-icons > i.fa { + cursor: pointer; + margin-right: 1px; + padding: 2px; + display: flex; + align-items: center; + line-height: 20px; + height: 100%; +} + +.picker-input > input, +.picker-icons-1 > input { + padding-right: 18px !important; +} + +.picker-icons-2 > input { + padding-right: 36px !important; +} + +.picker-icons-3 > input { + padding-right: 54px !important; +} + +.picker-icons-4 > input { + padding-right: 72px !important; +} + +table.form-layout .tabbable-tabs .nav-tabs { + margin-bottom: 0px; +} + +table.form-layout .tabbable-tabs .tab-content { + position: relative; + padding: 4px; + border: 1px solid #DDD; + border-top: 0; + background-color: #fff; +} + +.form-item .stackbar { + position: relative; +} + +.form-item .stackbar.inline-editable { + min-height: 200px; +} + +.form-item .stackbar.noEdit .edit-icon i:before, +.form-item .stackbar.readonly .edit-icon i:before { + content: "\f0f6"; +} + +.form-item .stackbar .slickgrid { + position: absolute; + left: 0px; right: 0px; + top: 26px; bottom: 0px; + border-top: none; +} + +.icons-bar { + display: inline-block; + padding-top: 4px; +} + +.icons-bar a { + color: #333; +} + +.icons-bar i { + margin: 2px; + padding: 2px; + cursor: pointer; +} + +td.form-item > * { + position: relative; +} + +.border-box, +.bordered-box { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; +} + +.bordered, +.bordered-box { + border: 1px solid #DDD; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + border-radius: 4px; +} + +.form-item .disabled-overlay { + position: absolute; + top: 0; left: 0; right: 0; bottom: 0; + z-index: 10; +} + +.form-item .form-item-group > .disabled-overlay { + top: 12px; +} + +.form-item .form-item-group[x-show-title="false"] > .disabled-overlay { + top: 0; +} + +.ui-state-disabled .ui-state-disabled { + opacity: 1; +} + +.form-item .form-item-group { + padding: 0; +} + +.form-item .form-item-group.bordered-box { + padding: 4px; +} + +.form-item .form-item-group.bordered-box.has-title { + padding-top: 0; +} + +.form-item .form-item-group > legend i.fa { + color: #ccc; + height: 15px; + margin-right: 4px; + vertical-align: middle; + display: inline-block; + cursor: pointer; +} + +.form-item .form-item-group > legend i.fa:hover { + text-decoration: none; + color: inherit; +} + +.form-item .form-item-group > legend { + + width: auto; + margin: 0; + margin-left: 10px; + padding: 0 4px; + + font-size: inherit; + font-weight: 600; + line-height: 1.4em; + + border: none; +} + +.form-item .form-item-portlet, +.form-item .form-item-portlet .portlet { + min-height: 250px; +} + +.form-item .image-item .image-wrapper { + position: relative; +} + +.form-item .image-item div.btn-group { + position: absolute; + left: calc(50% - 32px); + bottom: 12px; +} +.form-item .image-item div.btn-group .btn { + padding: 2px 6px 2px; +} + +.form-item .nested-editor > legend > .legend-toolbar a { + outline: none; +} + +.form-item .nested-editor > legend > .legend-toolbar a:hover { + text-decoration: none; +} +.form-item .nested-editor > legend > .legend-toolbar a:first-of-type { + padding-left: 4px; +} + +.form-item .nested-editor { + margin-top: -3px !important; +} + +.form-item .nested-editor.inline-form { + position: relative; + border: 0; + padding-top: 30px; +} + +.form-item .nested-editor.detail-form { + border-top: 0; + padding-top: 8px; +} + +.form-item .not-readonly { + background: inherit !important; +} + +.ng-invalid > input, +.ng-invalid > textarea, +.ng-invalid > .picker-input input, +.ng-invalid > .ui-spinner input, +.ng-invalid > .tag-select, +.ng-invalid > .form-item-container > .wysiwyg-container { + border-color: #B94A48; +} + +.ng-invalid:focus, +.ng-invalid > input:focus, +.ng-invalid > textarea:focus, +.ng-invalid > .picker-input input:focus, +.ng-invalid > .ui-spinner input:focus { + border-color: #953B39; +} + +.nested-not-required .form-item .ng-invalid > input, +.nested-not-required .form-item .ng-invalid > textarea, +.nested-not-required .form-item .ng-invalid > .picker-input input, +.nested-not-required .form-item .ng-invalid > .ui-spinner input, +.nested-not-required .form-item .ng-invalid > .tag-select +.nested-not-required .form-item .ng-invalid > .form-item-container > .wysiwyg-container { + border-color: #ccc; +} + +.nested-not-required .form-item .ng-invalid:focus, +.nested-not-required .form-item .ng-invalid > input:focus, +.nested-not-required .form-item .ng-invalid > textarea:focus, +.nested-not-required .form-item .ng-invalid > .picker-input input:focus, +.nested-not-required .form-item .ng-invalid > .ui-spinner input:focus { + border-color: #953B39; +} + +.form-item form { + margin: 0; +} + +.form-item div.code-editor { + min-height: 50px; + height: 280px; +} + +.form-item div.code-editor .CodeMirror { + border: 1px solid #DDD; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + height: inherit; +} + +.ng-invalid > .CodeMirror { + border-color: #B94A48 !important; +} + +.form-item div.code-editor .CodeMirror-scroll { + height: calc(100% + 30px); + width: 100%; +} + +.form-item div.code-editor.readonly .CodeMirror-focused .CodeMirror-cursor { + visibility: hidden; +} + +.form-item span.error { + color: #953B39; +} + +.form-item .span-item { + display: inline-block; + padding: 2px; + padding-left: 6px; +} + +.form-item .spacer-item { + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.form-item .separator-item { + font-weight: 700; + border-bottom: 1px solid #c9c9c9; + margin: 1rem 0; + width: 100%; +} + +.form-item .separator-item.divider { + display: table; + border: none; +} + +.form-item .separator-item.divider::after, +.form-item .separator-item.divider::before { + content: ''; + display: table-cell; + position: relative; + top: 50%; + width: 50%; + background-repeat: no-repeat; + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAE4gAAAABCAQAAACYGIwDAAAAJElEQVR42u3BAQ0AAAgDIN8/mak0xzcgewMAAAAAAAAAAAD1HuWuAcq7kIiIAAAAAElFTkSuQmCC); +} + +.form-item .separator-item.divider::before { + background-position: right 1em top 50%; +} + +.form-item .separator-item.divider::after { + background-position: left 1em top 50%; +} + +.form-item .ui-spinner { + padding-right: 0; + border: 0; + overflow: inherit; +} + +.form-item .ui-spinner .ui-spinner-up { + margin-top: 1px; +} + +.form-item .ui-spinner .ui-spinner-down { + margin-bottom: 1px; +} +.form-item-container .ui-spinner .ui-spinner-button { + cursor: pointer; +} + +.form-item-container .ui-spinner input { + width: 100%; + text-align: right; + padding-right: 18px; + margin: 0; +} + +.form-item ul.radio-select, +.form-item ul.checkbox-select, +.form-item-container ul.boolean-radio { + list-style-type: none; + overflow: hidden; + padding-top: 3px; + margin: 0; +} + +.form-item ul.radio-select > li, +.form-item ul.checkbox-select > li, +.form-item-container ul.boolean-radio > li { + float: left; + margin: 0 4px; +} + +.form-item ul.radio-select-vertical > li, +.form-item ul.checkbox-select-vertical > li, +.form-item-container ul.boolean-radio-vertical > li { + float: none; +} + +.form-item ul.radio-select > li input[type="radio"], +.form-item ul.checkbox-select > li input[type="checkbox"] { + margin-top: -2px; +} + +.form-item ul.radio-select.readonly > li label, +.form-item ul.checkbox-select.readonly > li label { + cursor: default; +} + +.form-item-container .hot-edit-icon { + width: 18px; + position: absolute; + left: -16px; + top: 7px; + cursor: pointer; + display: none; +} + +form.readonly .form-item-container:hover .hot-edit-icon { + display: inline; +} + +.no-edit .hot-edit-icon, +[x-readonly="true"] .hot-edit-icon { + display: none !important; +} + +table.field-details { + margin-bottom: 0; + max-width: 480px; +} + +table.field-details th { + width: 1px; + text-align: right; + font-weight: 600; +} + +table.field-details th, +table.field-details td { + white-space: nowrap; + border-top: none; + padding: 4px; +} + +table.field-details .help-text { + white-space: normal; +} + +table.field-details .help-text hr { + margin: 9px 0; +} + +.popover { + width: auto; + max-width: inherit; + min-width: 220px; + z-index: 2147483647; + border: 1px solid rgba(0, 0, 0, 0.1); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + padding: 0; +} + +.popover, +.popover-title { + border-radius: 0; +} + +.popover-title { + font-weight: 600; +} + +.popover-content { + display: flex; +} + +.popover-inner { + width: inherit; + min-width: 280px; + max-width: inherit; + display: table; + overflow: hidden; +} + +.popover .field-details th { + vertical-align: top; + padding-right: 10px; +} + +.popover .field-details code { + display: block; + white-space: pre-wrap; + max-width: 450px; + overflow: hidden; + text-overflow: ellipsis; + font-size: 12px; + border-radius: 0; +} + +.popover.bottom { + background-color: #f7f7f7; +} + +.popover.bottom .arrow:after { + border-bottom-color: #f7f7f7; +} + +.popover.bottom .popover-content { + background-color: white; +} + +label.has-help > span:after, +[ui-help-popover].has-help:after, +.button-item.has-help > span:after, +.nav-tree a.has-help:after { + font: normal normal normal 14px/1 FontAwesome; + content: "\f06a"; + font-size: 10px; + margin-left: 3px; + position: absolute; +} + +.record-toolbar .button-item.has-help > span:after { + content: '' +} + +label.has-help > span, +[ui-help-popover].has-help { + padding-right: 13px; +} + +label.has-help > span:after, +[ui-help-popover].has-help:after { + color: #107a4a; +} + +.ws-nowrap { + white-space: nowrap; +} + +.subtotal { + float: right; +} + +.subtotal, +.subtotal input { + white-space: nowrap; + text-align: right; +} + +.subtotal label { + text-align: right; + font-weight: normal !important; +} + +.subtotal, +.subtotal * { + min-width: auto !important; + width: auto !important; + white-space: nowrap !important; +} + +.subtotal .form-label, +.subtotal .form-item { + padding: 2px 0 !important; +} + +.subtotal .display-text { + width: 100% !important; + padding-left: 22px !important; +} + +.subtotal-total { + border-top: 1px solid #c1c1c1; + font-size: 18px; + padding-top: 6px !important; +} + +.subtotal-total .display-text { + font-weight: 600; + padding-top: 0 !important; +} + +.nav-select { + +} + +.nav-select *, +.nav-select *:after, +.nav-select *:before { + box-sizing: border-box; +} + +.nav-select a { + outline: none; + text-decoration: none; + color: #333; +} + +.nav-select ul.nav-steps { + margin: 0; +} + +.nav-select ul.nav-steps, +.nav-select li.nav-step { + list-style: none; +} + +.nav-select li.nav-step { + float: left; +} + +.nav-select a.nav-label { + display: block; + position: relative; + line-height: 32px; + padding: 0 16px 0 32px; + white-space: nowrap; + background: #e2e2e2; +} + +.nav-select li.nav-step:first-child a.nav-label { + padding-left: 18px; +} + +.nav-select a.nav-label:after { + content: ''; + width: 32px; + height: 32px; + transform: scale(0.72) rotate(45deg); + + position: absolute; + right: -16px; + z-index: 1; + + background: #e2e2e2; + box-shadow: 2px -2px 0 1px rgba(255, 255, 255, 1); +} + +.nav-select li.dropdown { + max-width: 120px; +} +.nav-select li.dropdown a.nav-label { + padding-right: 6px; + padding: 0; + height: 32px; +} + +.nav-select li.dropdown a.nav-label > span { + display: inline-block; + float: left; + max-width: 96px; + margin-left: 24px; + margin-right: 6px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.nav-select li.dropdown a.nav-label > span:empty { + margin-right: 0; +} + +.nav-select li.dropdown a.nav-label:after { + font-family: FontAwesome; + content: '\f0d7'; + width: 16px; + box-shadow: none; + -webkit-transform: scale(1) rotate(0); + -moz-transform: scale(1) rotate(0); + -ms-transform: scale(1) rotate(0); + transform: scale(1) rotate(0); +} + +.nav-select:not(.readonly) a.nav-label:hover, +.nav-select:not(.readonly) a.nav-label:hover:after { + background: #d0d0d0; + transition: background-color 0.3s; +} + +.nav-select li.active a.nav-label, +.nav-select li.active a.nav-label:after { + background: #0275d8; + transition: background-color 0.3s; + color: #f0f0f0; +} + +.nav-select .nav-step > .dropdown-menu { + right: -16px; + margin-top: -2px; +} + +.nav-select.readonly .nav-label { + cursor: inherit; +} + +.tag-select { + border: 1px solid #c1c1c1; + border-radius: 4px; + transition: border linear .2s, box-shadow linear .2s; + min-height: 26px; + display: flex; + flex-wrap: wrap; + height: 100%; +} + +.tag-select.picker-input { + background-color: #fff; +} + +.readonly .tag-select { + border: none; + box-shadow: none; +} + +.tag-select:focus, +.tag-select.focus { + border-color: #0275d8; + outline: 0; +} + +.tag-select-placeholder { + position: absolute; + top: 3px; + left: 0; + right: 16px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + color: #999999; +} + +.ng-invalid > .tag-select:focus, +.ng-invalid > .tag-select.focus { + border-color: #953B39; +} + +.tag-select ul { + list-style: none; + overflow: hidden; + margin: 0; + margin-right: 16px; + padding-bottom: 2px; +} + +.tag-select li, +.tag-select .label { + float: left; + display: inline-block; + margin: 2px 2px 0 0; +} + +.tag-select .label, +.tag-select .tag-selector { + height: 21px; +} + +.tag-select ul, +.readonly > .tag-select { + padding-top: 2px; +} + +.tag-select li.tag-item i, +.tag-select-single .tag-item i { + font-size: 10px; + cursor: pointer; +} + +.tag-select .tag-text, +.tag-select .tag-link, +.tag-select-single .tag-link { + display: inline-block; + height: 15px; + max-width: 140px; + overflow: hidden; + text-overflow: ellipsis; + vertical-align: middle; +} + +.tag-select .tag-link, +.tag-select-single .tag-link { + cursor: pointer; +} + +.tag-select .tag-link:hover, +.tag-select-single .tag-link:hover { + text-decoration: underline; +} + +.tag-select li.tag-selector input { + border: none; + border-radius: 0 !important; + box-shadow: none; + width: 50px; + min-width: 50px !important; + margin: 0; + padding: 0 !important; + margin-left: 0; + margin-top: -3px; + line-height: 16px; + height: auto !important; +} + +.tag-select-single .tag-item { + position: absolute; + left: 4px; + top: 4px; +} + +.tag-select .tag-editor, +.tag-select-single .tag-editor { + position: absolute !important; + padding: 1px 4px !important; + padding-right: 4px !important; + box-shadow: none !important; + min-width: 10px !important; + height: auto !important; + border: 0 !important; + + color: white; + background-color: #3a87ad; + font-weight: 600; + font-size: 11px; +} + +.tag-select-action-menu .tag-select-action a { + font-style: oblique; + padding-left: 12px; +} + +.slick-cell .tag-select { + height: 25px !important; +} + +.slick-cell .tag-select .label { + margin: 0 2px 0 0; + display: flex; + align-items: center; +} + +.slick-cell .tag-select .tag-text { + line-height: 15px; +} + +.slick-cell .tag-select .label .fa { + margin-left: 2px; +} + +.slick-cell .tag-select.picker-input { + background-color: inherit; +} + +.slick-cell .tag-select.picker-input .tag-item { + margin-top: 1px; +} +.slick-cell .tag-select.picker-input ul { + margin-left: 3px; +} +.slick-cell .tag-select .label, .slick-cell .tag-select .tag-selector { + height: 20px; +} + +.slick-cell .tag-select li.tag-selector input { + height: 20px !important; + min-height: inherit; +} + +.image-select { + display: flex; + align-items: center; +} + +.image-select > img, +.image-select > i.fa { + position: absolute; + max-height: 18px; +} + +.image-select.readonly > img, +.image-select.readonly > i.fa { + position: initial; +} + +.empty > .image-select input { + padding-left: 8px; +} + +.image-select-item img, +.image-select-item i.fa { + margin-right: 6px; + max-height: 18px; +} + +.image-select-item > a { + display: flex; + align-items: center; +} + +.multi-object-select fieldset, +.multi-object-select td { + padding: 0 !important; +} + +.multi-object-select td.select-item { + padding-right: 4px !important; +} + +.multi-object-link.readonly .form-layout td[style*='150'] { + display: none; +} + +.select-item .picker-input > .picker-icons > .fa.fa-pencil { + font-size: 12px; +} + +.form-item-container textarea { + box-sizing: border-box; +} + +.form-item-container pre { + color: inherit; +} + +.button-item.img-button { + width: auto !important; + height: inherit !important; +} + +.button-item.img-button:not([class*=btn-]) { + background: inherit !important; + border: none !important; + padding: 2px !important; +} + +.button-item.img-button img { + margin: 0; +} + +.button-item.img-button span { + display: block; +} + +.button-item.button-icon { + text-decoration: none; +} + +.record-toolbar .button-item.button-icon img { + margin-top: -2px; +} + +/* filter menu */ + +.filter-box, +.filter-box * { + box-sizing: border-box; +} + +.filter-box { + position: relative; + display: inline-block; + margin: 6px 4px 0; + box-sizing: border-box; + width: 200px; + vertical-align: middle; + z-index: 1; +} + +.filter-box .search-query { + width: 100%; + min-height: 28px; +} + +.filter-box .tag-select ul { + padding-bottom: 0; + margin-left: 2px; +} + +.filter-box .tag-select li { + margin-right: 0; + margin-bottom: 0; + max-width: 150px !important; + text-overflow: ellipsis; +} + +.filter-box .tag-select li.tag-item { + line-height: 17px; +} + +.filter-box .tag-select .tag-text { + height: 16px; +} + +.filter-box .tag-select li.tag-selector { + width: 100%; + max-width: 100% !important; +} + +.filter-box .tag-select li.tag-selector input { + width: 100%; +} + +.filter-box .tag-select input.not-readonly { + background-color: #fff; +} + +.filter-box .search-icons { + position: absolute; + display: inline-block; + top: 0; + right: 0; + padding-top: 8px; + padding-right: 4px; +} + +.filter-box .search-icons i { + margin: 3px; + cursor: pointer; + color: silver; +} + +.filter-box .search-icons i:hover { + color: black; +} + +@media (max-width: 767px) { + .filter-box { + width: 172px; + } +} + +.update-menu, +.filter-menu { + + display: none; + position: absolute; + + padding: 12px; + + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + background: #fff; + + border-radius: 0; + border: 1px solid #e7e7e7; + + z-index: 11; +} + +.filter-menu hr { + margin: 8px 0; +} + +.filter-menu .filter-list { + display: table; + width: 100%; +} + +.filter-menu .filter-list > dl { + display: table-cell; + width: 50%; + padding-right: 8px; +} + +.filter-menu .filter-list > dl dt { + padding-bottom: 4px; +} + +.filter-menu .filter-list > dl dt i { + margin-right: 2px; +} + +.filter-menu .filter-list > dl dd { + cursor: pointer; +} + +.filter-menu .filter-list > dl dd a[disabled] { + pointer-events: none; + cursor: default; + text-decoration: none; + color: #333333; + opacity: 0.5; +} + +.filter-form .filter-operator .show-archived > span[disabled] { + color: #333333; + opacity: 0.5; + cursor: default; +} + +.filter-menu .filter-form { + margin-top: -6px; +} + +.filter-menu .filter-form .links { + line-height: 20px; +} + +.filter-menu .filter-form .links .divider { + color: #c1c1c1; + padding: 0 5px; +} + +.filter-menu form { + margin-bottom: 8px; +} + +.filter-menu .filter-inputs form { + margin: 0; + padding: 0; +} + +.filter-menu .filter-inputs .panel, +.filter-menu .filter-inputs .panel .panel-body { + border: 0; + margin: 0; + padding: 0; +} + +.filter-menu .filter-inputs .tag-select { + border: 1px solid #ccc !important; + display: block; +} + +.filter-menu .filter-inputs .multi-select-item { + margin-bottom: 0 !important; +} + +.filter-menu .filter-inputs .tag-select > .picker-icons { + right: 2px; +} + +.filter-menu .filter-inputs .tag-select ul { + margin-left: 2px; +} + +.filter-menu input[type=radio], +.filter-menu input[type=checkbox] { + margin-top: 3px; + min-width: initial; +} + +.filter-menu .show-archived { + margin-left: 26px; +} + +.filter-form .filter-context { + border-bottom: 1px solid #eeeeee; + margin-bottom: 0; + padding: 6px 0 8px 0; +} + +.record-toolbar button.update-menu-button { + padding: 4px; +} + +.filter-form.update-form .form-item { + min-width: 170px; +} + +.filter-menu.update-menu .checkbox.update-all { + margin-left: 8px; +} + +.filter-form .links { + margin: 4px; + padding-left: 14px; +} + +.filter-menu .btn-small { + font-size: 12px; +} + +.filter-form .flex-layout { + display: flex; + flex-direction: column; + align-items: stretch; +} + +.filter-form .flex-layout, +.filter-form .flex-layout * { + box-sizing: border-box; +} + +.filter-form .flex-layout .flex-row { + display: flex; + flex-direction: row; + align-items: center; + flex-grow: 1; +} + +.filter-form .flex-layout .flex-item { + display: flex; + flex-direction: row; + align-items: center; + padding: 0 2px; +} + +.filter-form .flex-layout .flex-item > span { + width: 170px; + margin: 2px; +} + +.filter-form .flex-layout .flex-item > span > input, +.filter-form .flex-layout .flex-item > span > select { + width: 100%; + margin: 0; + height: 28px; + line-height: 28px; +} + +.filter-form .flex-layout .flex-item.filter-inputs { + flex: 1; +} + +@media all and (max-width: 640px) { + .filter-form .flex-layout .flex-item { + flex-direction: column; + } + .filter-form .flex-layout .flex-item > span { + width: 100%; + } + .filter-menu .filter-list > dl { + float: left; + margin: 0; + padding: 0; + width: 100%; + } + .filter-menu .filter-list > dl:last-child { + margin-top: 8px; + } + .filter-menu { + top: 0 !important; + left: 0 !important; + right: 0 !important; + bottom: 0 !important; + box-shadow: none; + overflow-y: auto; + z-index: 10000 !important; + } +} + +/* end filter/update menu */ + +.btn-group > .btn-fix-left { + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; +} + +.btn-group > .btn-fix-right { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; +} + +.notify-stack { + width: 340px; +} + +.tag-select-placeholder { + color: #777; + font-size: 12px; +} + +::-webkit-input-placeholder { + font-size: 12px; +} + +:-moz-placeholder { /* older Firefox*/ + font-size: 12px; +} + +::-moz-placeholder { /* Firefox 19+ */ + font-size: 12px; +} + +:-ms-input-placeholder { + font-size: 12px; + color: #777 !important; +} diff --git a/sophal/css/view.form.hilite.css b/sophal/css/view.form.hilite.css new file mode 100644 index 0000000..c57f35d --- /dev/null +++ b/sophal/css/view.form.hilite.css @@ -0,0 +1,494 @@ +/** + * Axelor Business Solutions + * + * Copyright (C) 2005-2019 Axelor (). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +[class *= hilite-] > .display-text { + color: inherit; +} + +[class *= hilite-].strong, +[class *= hilite-].strong input:first-of-type, +[class *= hilite-].strong textarea:first-of-type { + font-weight: 600 !important; +} + +.hilite-primary-text, +.hilite-primary-text input:first-of-type, +.hilite-primary-text textarea:first-of-type { + color: #428bca !important; +} + +.hilite-primary, +.hilite-primary input:first-of-type, +.hilite-primary textarea:first-of-type, +.hilite-primary .slick-cell { + color: #fff !important; + background-color: #428bca !important; +} + +.hilite-warning-text, +.hilite-warning-text input:first-of-type, +.hilite-warning-text textarea:first-of-type { + color: #f0ad4e !important; +} + +.hilite-warning, +.hilite-warning input:first-of-type, +.hilite-warning textarea:first-of-type, +.hilite-warning .slick-cell { + color: #fff !important; + background-color: #f0ad4e !important; +} + +.hilite-success-text, +.hilite-success-text input:first-of-type, +.hilite-success-text textarea:first-of-type { + color: #5cb85c !important; +} + +.hilite-success, +.hilite-success input:first-of-type, +.hilite-success textarea:first-of-type, +.hilite-success .slick-cell { + color: #fff !important; + background-color: #5cb85c !important; +} + +.hilite-danger-text, +.hilite-danger-text input:first-of-type, +.hilite-danger-text textarea:first-of-type { + color: #d9534f !important; +} + +.hilite-danger, +.hilite-danger input:first-of-type, +.hilite-danger textarea:first-of-type, +.hilite-danger .slick-cell { + color: #fff !important; + background-color: #d9534f !important; +} + +.hilite-error-text, +.hilite-error-text input:first-of-type, +.hilite-error-text textarea:first-of-type { + color: #b94a48 !important; +} + +.hilite-error, +.hilite-error input:first-of-type, +.hilite-error textarea:first-of-type, +.hilite-error .slick-cell { + color: #fff !important; + background-color: #b94a48 !important; +} + +.hilite-info-text, +.hilite-info-text input:first-of-type, +.hilite-info-text textarea:first-of-type { + color: #5bc0de !important; +} + +.hilite-info, +.hilite-info input:first-of-type, +.hilite-info textarea:first-of-type, +.hilite-info .slick-cell { + color: #fff !important; + background-color: #5bc0de !important; +} + +.hilite-default-text, +.hilite-default-text input:first-of-type, +.hilite-default-text textarea:first-of-type { + +} + +.hilite-default, +.hilite-default input:first-of-type, +.hilite-default textarea:first-of-type, +.hilite-default .slick-cell { + +} + +.slick-row[class*="hilite-"].selected, +.slick-row[class*="hilite-"] .slick-cell.selected { + background-image: linear-gradient( + rgba(0, 0, 0, 0.2), + rgba(0, 0, 0, 0.2) + ); +} + +.slick-row[class*="-text"].selected, +.slick-row[class*="-text"] .slick-cell.selected { + background-image: none; +} + +.slickgrid-editable .slick-row[class*="hilite-"].active .slick-cell-editable:before, +[class*="hilite-"].form-item-container { + background-color: inherit !important; +} + +/** other predefined styles */ + +.form-item label.label-bold, +.form-item-container.bold, +.form-item-container.bold input:first-of-type, +.form-item-container.bold textarea:first-of-type { + font-weight: 600 !important; +} + +.form-item label.label-italic, +.form-item-container.italic, +.form-item-container.italic input:first-of-type, +.form-item-container.italic textarea:first-of-type { + font-style: italic !important; +} + +.form-item label.label-underline, +.form-item-container.underline, +.form-item-container.underline input:first-of-type, +.form-item-container.underline textarea:first-of-type { + text-decoration: underline !important; +} + +.form-item label.label-overline, +.form-item-container.overline, +.form-item-container.overline input:first-of-type, +.form-item-container.overline textarea:first-of-type { + text-decoration: overline !important; +} + +.form-item label.label-line-through, +.form-item-container.line-through, +.form-item-container.line-through input:first-of-type, +.form-item-container.line-through textarea:first-of-type { + text-decoration: line-through !important; +} + +.form-item label.label-small, +.form-item-container.small, +.form-item-container.small input:first-of-type, +.form-item-container.small textarea:first-of-type { + font-size: 10px !important; +} + +.form-item label.label-big, +.form-item-container.big, +.form-item-container.big input:first-of-type, +.form-item-container.big input:first-of-type { + font-size: 16px !important; +} + +.form-item label.label-large, +.form-item-container.large, +.form-item-container.large input:first-of-type, +.form-item-container.large textarea:first-of-type { + font-size: 18px !important; +} + +.form-item label.label-left, +.form-item-container.left, +.form-item-container.left input:first-of-type, +.form-item-container.left textarea:first-of-type { + text-align: left !important; +} + +.form-item label.label-right, +.form-item-container.right, +.form-item-container.right input:first-of-type, +.form-item-container.right textarea:first-of-type { + text-align: right !important; +} + +.form-item label.label-center, +.form-item-container.center, +.form-item-container.center input:first-of-type, +.form-item-container.center textarea:first-of-type { + text-align: center !important; +} + +.form-item label.label-justify, +.form-item-container.justify, +.form-item-container.justify input:first-of-type, +.form-item-container.justify textarea:first-of-type { + text-align: justify !important; +} + +.form-item label.label-red, +.form-item-container.red, +.form-item-container.red input:first-of-type, +.form-item-container.red textarea:first-of-type { + color: red !important; +} + +.form-item label.label-blue, +.form-item-container.blue, +.form-item-container.blue input:first-of-type, +.form-item-container.blue textarea:first-of-type { + color: blue !important; +} + +.form-item label.label-green, +.form-item-container.green, +.form-item-container.green input:first-of-type, +.form-item-container.green input:first-of-type { + color: green !important; +} + +.form-item label.label-muted, +.form-item-container.muted, +.form-item-container.muted input:first-of-type, +.form-item-container.muted textarea:first-of-type { + color: #777 !important; +} + +.form-item label.label-primary, +.form-item-container.primary, +.form-item-container.primary input:first-of-type, +.form-item-container.primary textarea:first-of-type { + color: #428bca !important; +} + +.form-item label.label-success, +.form-item-container.success, +.form-item-container.success input:first-of-type, +.form-item-container.success textarea:first-of-type { + color: #3c763d !important; +} + +.form-item label.label-info, +.form-item-container.info, +.form-item-container.info input:first-of-type, +.form-item-container.info textarea:first-of-type { + color: #31708f !important; +} + +.form-item label.label-warning, +.form-item-container.warning, +.form-item-container.warning input:first-of-type, +.form-item-container.warning textarea:first-of-type { + color: #8a6d3b !important; +} + +.form-item label.label-danger, +.form-item-container.danger, +.form-item-container.danger input:first-of-type, +.form-item-container.danger textarea:first-of-type { + color: #a94442 !important; +} + +.form-item label.label-bg-primary, +.form-item-container.bg-primary, +.form-item-container.bg-primary input:first-of-type, +.form-item-container.bg-primary textarea:first-of-type { + color: #fff; + background-color: #428bca !important; +} + +.form-item label.label-bg-success, +.form-item-container.bg-success, +.form-item-container.bg-success input:first-of-type, +.form-item-container.bg-success textarea:first-of-type { + background-color: #dff0d8 !important; +} + +.form-item label.label-bg-info, +.form-item-container.bg-info, +.form-item-container.bg-info input:first-of-type, +.form-item-container.bg-info textarea:first-of-type { + background-color: #d9edf7 !important; +} + +.form-item label.label-bg-warning, +.form-item-container.bg-warning, +.form-item-container.bg-warning input:first-of-type, +.form-item-container.bg-warning textarea:first-of-type { + background-color: #fcf8e3 !important; +} + +.form-item label.label-bg-danger, +.form-item-container.bg-danger, +.form-item-container.bg-danger input:first-of-type, +.form-item-container.bg-danger textarea:first-of-type { + background-color: #f2dede !important; +} + +.font-bold { + font-weight: 600; +} +.font-noraml { + font-weight: 400; +} + +.bg-red { background-color: #DB2828; } +.bg-orange { background-color: #F2711C; } +.bg-yellow { background-color: #FBBD08; } +.bg-olive { background-color: #B5CC18; } +.bg-green { background-color: #21BA45; } +.bg-teal { background-color: #00B5AD; } +.bg-blue { background-color: #2185D0; } +.bg-violet { background-color: #6435C9; } +.bg-purple { background-color: #A333C8; } +.bg-pink { background-color: #E03997; } +.bg-brown { background-color: #A5673F; } +.bg-grey { background-color: #767676; } +.bg-black { background-color: #1B1C1D; } +.bg-white { background-color: #F9FAFB; } + +.fg-red { color: #DB2828; } +.fg-orange { color: #F2711C; } +.fg-yellow { color: #B58105; } +.fg-olive { color: #8ABC1E; } +.fg-green { color: #1EBC30; } +.fg-teal { color: #10A3A3; } +.fg-blue { color: #2185D0; } +.fg-violet { color: #6435C9; } +.fg-purple { color: #A333C8; } +.fg-pink { color: #E03997; } +.fg-brown { color: #A5673F; } +.fg-grey { color: #767676; } +.fg-black { color: #1B1C1D; } +.fg-white { color: #F9FAFB; } + +.panel-red .panel .panel-header, +.panel-red .dashlet .dashlet-header { + border-top-color: #DB2828; +} +.panel-red.panel .panel-header { + border-top-color: #DB2828 !important; +} +.panel-red.dashlet .dashlet-header { + border-top-color: #DB2828 !important; +} +.panel-orange .panel .panel-header, +.panel-orange .dashlet .dashlet-header { + border-top-color: #F2711C; +} +.panel-orange.panel .panel-header { + border-top-color: #F2711C !important; +} +.panel-orange.dashlet .dashlet-header { + border-top-color: #F2711C !important; +} +.panel-yellow .panel .panel-header, +.panel-yellow .dashlet .dashlet-header { + border-top-color: #FBBD08; +} +.panel-yellow.panel .panel-header { + border-top-color: #FBBD08 !important; +} +.panel-yellow.dashlet .dashlet-header { + border-top-color: #FBBD08 !important; +} +.panel-olive .panel .panel-header, +.panel-olive .dashlet .dashlet-header { + border-top-color: #B5CC18; +} +.panel-olive.panel .panel-header { + border-top-color: #B5CC18 !important; +} +.panel-olive.dashlet .dashlet-header { + border-top-color: #B5CC18 !important; +} +.panel-green .panel .panel-header, +.panel-green .dashlet .dashlet-header { + border-top-color: #21BA45; +} +.panel-green.panel .panel-header { + border-top-color: #21BA45 !important; +} +.panel-green.dashlet .dashlet-header { + border-top-color: #21BA45 !important; +} +.panel-teal .panel .panel-header, +.panel-teal .dashlet .dashlet-header { + border-top-color: #00B5AD; +} +.panel-teal.panel .panel-header { + border-top-color: #00B5AD !important; +} +.panel-teal.dashlet .dashlet-header { + border-top-color: #00B5AD !important; +} +.panel-blue .panel .panel-header, +.panel-blue .dashlet .dashlet-header { + border-top-color: #2185D0; +} +.panel-blue.panel .panel-header { + border-top-color: #2185D0 !important; +} +.panel-blue.dashlet .dashlet-header { + border-top-color: #2185D0 !important; +} +.panel-violet .panel .panel-header, +.panel-violet .dashlet .dashlet-header { + border-top-color: #6435C9; +} +.panel-violet.panel .panel-header { + border-top-color: #6435C9 !important; +} +.panel-violet.dashlet .dashlet-header { + border-top-color: #6435C9 !important; +} +.panel-purple .panel .panel-header, +.panel-purple .dashlet .dashlet-header { + border-top-color: #A333C8; +} +.panel-purple.panel .panel-header { + border-top-color: #A333C8 !important; +} +.panel-purple.dashlet .dashlet-header { + border-top-color: #A333C8 !important; +} +.panel-pink .panel .panel-header, +.panel-pink .dashlet .dashlet-header { + border-top-color: #E03997; +} +.panel-pink.panel .panel-header { + border-top-color: #E03997 !important; +} +.panel-pink.dashlet .dashlet-header { + border-top-color: #E03997 !important; +} +.panel-brown .panel .panel-header, +.panel-brown .dashlet .dashlet-header { + border-top-color: #A5673F; +} +.panel-brown.panel .panel-header { + border-top-color: #A5673F !important; +} +.panel-brown.dashlet .dashlet-header { + border-top-color: #A5673F !important; +} +.panel-grey .panel .panel-header, +.panel-grey .dashlet .dashlet-header { + border-top-color: #767676; +} +.panel-grey.panel .panel-header { + border-top-color: #767676 !important; +} +.panel-grey.dashlet .dashlet-header { + border-top-color: #767676 !important; +} +.panel-black .panel .panel-header, +.panel-black .dashlet .dashlet-header { + border-top-color: #1B1C1D; +} +.panel-black.panel .panel-header { + border-top-color: #1B1C1D !important; +} +.panel-black.dashlet .dashlet-header { + border-top-color: #1B1C1D !important; +} diff --git a/sophal/css/view.form.panels.css b/sophal/css/view.form.panels.css new file mode 100644 index 0000000..3b53310 --- /dev/null +++ b/sophal/css/view.form.panels.css @@ -0,0 +1,878 @@ +/** + * Axelor Business Solutions + * + * Copyright (C) 2005-2019 Axelor (). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +.bar-layout { + max-width: 1500px; + margin: auto; + padding: 14px; +} + +.bar-layout.mid-form { + max-width: 768px; +} + +.bar-layout.mini-form { + max-width: 480px; +} +.bar-layout.large-form { + max-width: 1500px; +} + +.bar-container { + display: flex; +} + +.bar-main { + flex: 1; + max-width: 100%; +} + +.bar-wrap { + min-height: 0 !important; +} + +.bar-side { + width: 25%; + min-width: 15em; + margin-left: 14px; +} + +.bar-container.has-side > .bar-main { + max-width: 75%; +} + +@media (max-width: 767px) { + .bar-container { + flex-direction: column; + } + .bar-main { + flex: inherit; + max-width: inherit !important; + } + .bar-side { + margin: 0; + width: inherit; + min-width: auto; + } +} + +.panel-layout * { + box-sizing: border-box; +} + +.panel { + background-color: #fff; +} + +.panel .panel-header { + padding: 11px 15px 14px; + border-top: 4px solid #e7e7e7; + border-bottom: 1px solid #e7e7e7; + margin-top: -1px; + display: flex; + align-items: center; + outline: none; +} + +.panel-nested > .panel-header { + border-top: 0; + padding: 6px 0; + margin-bottom: 4px; +} + +.panel .panel-title { + font-size: 14px; + font-weight: 600; + flex: 1; +} + +.panel .panel-header .panel-icon { + margin-right: 8px; + padding: 2px 4px; + border-radius: 4px; +} + +.panel .panel-header .panel-icon.has-bg { + text-shadow: -1px 1px 5px rgba(0, 0, 0, 0.15); +} + +.panel .panel-header .panel-image { + width: 16px; + height: 16px; + margin-right: 8px; +} + +.panel .panel-header .panel-icons { + margin-left: 4px; +} + +.panel .panel-header .panel-icons a { + color: #c4c4c4; +} + +.panel .panel-header .menu-bar { + margin: 0; +} + +.panel .panel-header .menu-bar > .menu > a { + padding: 0 4px; + background-image: none; + border: 0; +} + +.panel .panel-header .menu-bar .caret { + margin-top: 8px; +} + +.panel .panel-header .dropdown-menu { + left: inherit; + right: 0; +} + +.panel.collapsed .panel-header { + border-bottom: 0; +} + +.clickable-header{ + cursor: pointer; + overflow: hidden; + outline: none !important; +} + +.panel .panel-body { + padding: 14px; + transition: height 0.3s ease-out; +} + +.panel { + margin-bottom: 16px; + border: 1px solid #e7e7e7; +} + +.panel.attached { + margin-top: -16px; +} + +.panel.noframe { + border: none; + box-shadow: none; +} + +.panel .row-fluid > .form-item { + margin-bottom: 6px; +} + +.panel.noframe .panel-body { + padding: 0; +} + +.panel .row-fluid > .form-item-hidden { + margin-bottom: 0; +} + +.panel .row-fluid > .form-item-hidden:first-child + .form-item { + margin-left: 0; +} + +.panel .row-fluid:last-child > .form-item-hidden { + margin-bottom: 1px; +} +.panel[x-stacked] .row-fluid:last-child > .form-item { + margin-bottom: 6px; +} +.panel[x-stacked] .row-fluid:last-child > .form-item-hidden, +.panel[x-stacked] .row-fluid:last-child > .form-item:last-child { + margin-bottom: 1px; +} + +.panel[x-stacked] .row-fluid:last-child > .form-item-hidden, +.panel[x-stacked] .row-fluid:last-child > .form-item:last-child, +.panel[x-stacked] .row-fluid:last-child > .form-item:last-child > .panel { + margin-bottom: 1px; +} + +@media (max-width: 767px) { + .panel .row-fluid:last-child > .form-item { + margin-bottom: 6px; + } + .panel .row-fluid:last-child > .form-item:last-child { + margin-bottom: 1px; + } +} + +.panel-layout .panel:not(.panel-related) { + border: none; + box-shadow: none; + margin-bottom: 0; +} + +.panel-layout .bar-layout, +.panel-layout .panel .panel-body { + padding: 0; +} + +.panel-layout .o2m-list .panel .row-fluid > .form-item { + margin-bottom: 6px; +} + +.panel-layout .form-item-container.readonly > a, +.panel-layout .form-item-container.readonly > input, +.panel-layout .form-item-container.readonly > span.display-text { + padding-left: 0; +} + +.panel-layout .readonly > .o2m-list > .o2m-list-row > a { + color: #0088cc; +} + +.panel-layout .form-item-container input { + min-width: inherit; +} +.panel-layout .form-item-container.time-item input, +.panel-layout .form-item-container.datetime-item .picker-input { + width: 100%; +} +.panel-layout .form-item-container input[type="radio"], +.panel-layout .form-item-container input[type="checkbox"] { + margin-top: 0 !important; +} + +.panel-layout .form-item-container, +.panel-layout .form-item-container > span.display-text { + min-height: 28px; + border-bottom: 1px solid #00000030; +} + +.panel-layout .form-item-container.editable input[type="text"], +.panel-layout .form-item-container.editable input[type="password"], +.panel-layout .form-item-container.editable input[type="number"], +.panel-layout .form-item-container.editable input[type="email"], +.panel-layout .form-item-container.editable input[type="url"], +.panel-layout .form-item-container.editable .tag-select { + border-top-width: 0; + border-left-width: 0; + border-right-width: 0; + padding-left: 0; +} + +.panel-layout .slick-cell .form-item-container.editable input[type="text"], +.panel-layout .slick-cell .form-item-container.editable input[type="password"], +.panel-layout .slick-cell .form-item-container.editable input[type="number"], +.panel-layout .slick-cell .form-item-container.editable input[type="email"], +.panel-layout .slick-cell .form-item-container.editable input[type="url"], +.panel-layout .slick-cell .form-item-container.editable .tag-select { + border-top-width: 1px; + border-left-width: 1px; + border-right-width: 1px; + padding-left: 6px; +} +.panel-layout .slick-cell .form-item-container.editable .tag-select { + padding-left: 0; +} + +.panel-layout .slick-cell .form-item-container, +.panel-layout .slick-cell .form-item-container > span.display-text { + min-height: auto; +} +.panel-layout .slick-cell .form-item-container > span.display-text { + padding: 2px 8px; +} + +.panel-layout .image-item .btn, +.panel-layout .file-item .btn { + width: 32px; + padding: 2px 6px 2px; + height: 28px; +} + +.panel-layout .tag-select, +.panel-layout .tag-select > ul { + min-height: 27px; +} +.panel-layout .tag-select .tag-text, +.panel-layout .tag-select .tag-link, +.panel-layout .tag-select-single .tag-link { + height: 16px; + line-height: 16px; + font-size: 11px; +} + +.panel-layout .label-item, +.panel-layout .label-item span, +.panel-layout label span.title { + font-weight: 800; /*sophal*/ + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + font-size: 12px; + margin-bottom: 0; + height: 18px; +} +.panel-layout .label-item span { + display: inline-block; + max-width: 100%; +} + +.panel-related .panel-header { + border-bottom: none; +} +.panel-related .panel-header .icons-bar { + padding-top: 0; +} +.panel-related .panel-header .icons-bar i { + margin: 0 4px; + padding: inherit; +} + +.panel-related .panel-body { + padding: 0; + position: relative; + min-height: 1px; +} + +.panel-related .panel-body .slickgrid { + position: absolute; + left: 0px; + right: 0px; + top: 0px; + bottom: 0px; + border: none; +} +.panel-related.noEdit .edit-icon i:before, +.panel-related.readonly .edit-icon i:before { + content: "\f0f6"; +} + +.panel-related.ng-invalid { + border-color: #B94A48; +} + +.panel-related.ng-invalid .panel-header { + border-top-color: #B94A48; +} + +.panel-tabs, +.panel-stack, +.bar-layout .dashboard { + margin-bottom: 16px; +} + +.panel-tabs .nav-tabs > li > a { + border-color: #e7e7e7; +} +.panel-tabs .nav-tabs > li.active > a { + color: #333; + border-bottom-color: transparent !important; +} +.panel-tabs .tab-content { + padding: 14px; + overflow: inherit; + background-color: #fff; + border: 1px solid #e7e7e7; +} + +.panel-tabs .tab-content > .panel { + margin: 0; +} + +.panel-stack > .panel { + margin: 0; +} + +.panel-tabs[x-sidebar] { + margin-bottom: 0; +} + +.bar-layout .portlet-header .navbar-inner { + background-image: none; + background-color: #f5f5f5; + border-bottom: 1px solid #e7e7e7; +} +.bar-layout .portlet-header .divider-vertical { + border-left: 1px solid #D3D3D3; +} + +.bar-layout .form-item-portlet, +.bar-layout .form-item-portlet .portlet-minimized { + height: auto; + min-height: inherit !important; +} + +.panel-layout .m2o-editor { + position: relative; +} +.panel-layout .m2o-editor-controls { + position: absolute; + top: -18px; + right: 0; +} + +.panel-layout .m2o-editor-controls a { + margin: 0 4px; + color: #333; +} + +[x-show-title="false"] > .m2o-editor { + margin-top: 18px; +} + +.panel-layout .o2m-list .form-item { + padding: 0; +} + +.panel-layout .o2m-list .panel { + margin-bottom: 0; +} + +.panel-layout .editable > .o2m-list { + display: table; + table-layout: fixed; + width: 100%; +} + +.panel-layout .editable > .o2m-list .o2m-list-row { + display: table-row; +} + +.panel-layout .editable > .o2m-list .o2m-list-row > div, +.panel-layout .editable > .o2m-list .o2m-list-row > span { + display: table-cell; + padding: 2px 0; + width: 100%; +} + +.panel-layout .editable > .o2m-list table.form-layout { + table-layout: fixed; +} + +.panel-layout .editable > .o2m-list .o2m-list-row > span.o2m-list-remove { + vertical-align: middle; + width: 24px; +} + +.panel-layout .editable > .o2m-list .o2m-list-row > a, +.panel-layout .editable > .o2m-list .o2m-list-row > span.o2m-list-remove a { + color: #333333; + outline: none; +} +.panel-layout .editable > .o2m-list .o2m-list-row > span.o2m-list-remove a { + padding: 0 6px; +} + +.panel-layout .editable > .o2m-list .o2m-list-row .toggle-item button { + border-left: 0; + border-top: 0; + border-right: 0; + outline: none; + height: 28px; + color: #ccc; + padding: 4px 6px; +} + +.panel-layout .editable > .o2m-list .o2m-list-row .toggle-item button:focus { + color: #ccc; + background: none; + box-shadow: none; + border-color: #ccc; +} +.panel-layout .editable > .o2m-list .o2m-list-row .toggle-item button:hover, +.panel-layout .editable > .o2m-list .o2m-list-row .toggle-item button:active, +.panel-layout .editable > .o2m-list .o2m-list-row .toggle-item button.active { + color: #333; + background: none; + box-shadow: none; + border-color: #ccc; +} + +.panel-layout .editable > .o2m-list .o2m-list-remove i, +.panel-layout .editable > .o2m-list .o2m-list-add i { + color: #ccc; + font-size: 12px; +} +.panel-layout .editable > .o2m-list .o2m-list-remove i:hover, +.panel-layout .editable > .o2m-list .o2m-list-add i:hover { + color: #333; +} + +.panel-layout .row-fluid [class*="span"] { + min-height: inherit !important; +} + +.panel-layout .form-item > a.btn, +.panel-layout .form-item-container button { + width: 100%; + max-width: 100%; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + + padding: 3px 10px 3px; + min-width: 28px; + height: 28px; +} +.panel-layout .btn:focus { + background-position: inherit; +} +.panel-layout .form-item.btn-group { + width: 100%; +} +.panel-layout .form-item.btn-group > a.btn { + width: auto; +} +.panel-layout .btn-link.disabled { + pointer-events: none; + cursor: default; + opacity: 0.6; +} + +.panel-layout .row-fluid.has-labels > .form-item > a.btn, +.panel-layout .row-fluid.has-labels > .form-item > [x-show-title="false"][ng-model] { + margin-top: 18px; +} + +.panel[x-stacked] > .panel-body > .panel-layout > .row-fluid.has-labels > .form-item > a.btn, +.panel[x-stacked] > .panel-body > .panel-layout > .row-fluid.has-labels > .form-item > [x-show-title="false"][ng-model] { + margin-top: 0; +} + +.panel-tabs .nav-tabs-responsive { + margin-bottom: -1px; + display: inline-flex; +} + +.panel-tabs .nav-tabs-responsive > li { + margin-top: -12px; +} + +.panel-tabs .nav-tabs-responsive > li.dropdown { + max-width: 120px; +} + +.panel-tabs .nav-tabs-responsive a, +.panel-tabs .nav-tabs-responsive > li.dropdown > a > span { + outline: none; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.panel-tabs .nav-tabs-responsive > li.dropdown > a > span { + display: inline-block; + max-width: 74px; + margin-bottom: -4px; +} + +/** nested editor **/ +.panel-layout .nested-editor .panel:not(.panel-related) { + margin-bottom: 16px; +} +.panel-layout .nested-editor .panel-layout .panel:not(.panel-related) { + margin-bottom: 0; +} +.panel-layout .nested-editor .panel .panel-body { + padding: 14px; +} +.panel-layout .nested-editor .panel-layout .panel .panel-body { + padding: 0; +} +.panel-layout .form-item-group.bordered-box { + padding: 14px 14px 0; +} +.panel-layout .form-item-group > legend { + padding: 0; + margin: 0; +} +.panel-layout .stackbar .navbar .navbar-inner { + background: #fff; + padding: 11px 15px 14px; + border-top: 4px solid #e7e7e7; + border-bottom: 1px solid #e7e7e7; + border-radius: 0; +} +.panel-layout .stackbar .navbar .navbar-inner .brand { + margin: 0; + padding: 0; + font-size: 14px; + font-weight: 600; +} +.panel-layout .stackbar .navbar .navbar-inner .icons-bar { + padding: 0; +} +.panel-layout .stackbar .navbar .navbar-inner .icons-bar i { + margin: 0 4px; + padding: inherit; +} +.panel-layout .stackbar > .slickgrid { + top: 47px; +} +.panel-layout .stackbar .form-item-group.inline-form { + padding-top: 30px; +} + +.panel-json .bar-layout { + padding: 0; +} + +/** some special classes */ +.border-left-none, +.border-left-none.form-item-container, +.border-left-none.form-item-container > input { + border-left: none; +} +.border-right-none, +.border-left-none.form-item-container, +.border-left-none.form-item-container > input { + border-left: none; +} + +.address-list .o2m-list-row { + width: 48.71%; + float: left; + margin-left: 0; +} +.address-list .o2m-list-add { + width: 100%; + margin-left: 0; +} +.address-list .o2m-list-row.even { + margin-left: 2.56%; +} + +@media (max-width: 767px) { + .address-list .o2m-list-row { + width: 100%; + float: none; + margin-left: 0 !important; + } +} +.panel-layout .order-subtotal dl { + max-width: 280px; + float: right; +} +.panel-layout .order-subtotal dt, +.panel-layout .order-subtotal dd { + padding: 4px; +} + +.panel-layout .order-subtotal dt { + padding-right: 8px; + font-weight: normal; + white-space: normal; + width: 55%; +} +.panel-layout .order-subtotal dd { + margin-left: 0; + text-align: right; +} + +.panel-layout .order-subtotal dd:empty { + height: 26px; +} + +.panel-layout .order-subtotal-total { + border-top: 1px solid #ccc; + font-size: 18px; + font-weight: 600; +} + +@media (max-width: 767px) { + .panel-layout .order-subtotal dt { + float: left; + text-align: right; + width: 48%; + } +} + +.panel.field-append > .panel-body > .panel-layout > .row-fluid { + display: flex; +} +.panel.field-append > .panel-body > .panel-layout > .row-fluid > .form-item[class*="span"] { + margin: 0; + width: auto; + float: inherit; +} +.panel.field-append > .panel-body > .panel-layout > .row-fluid > .form-item:first-child { + flex: 1; +} + +.panel-flex { + display: flex; + flex-wrap: wrap; + flex-direction: row; + margin-left: -7px; + margin-right: -7px; +} + +.panel-flex [class*="flex"] { + width: 100%; + margin-left: 7px; + margin-right: 7px; +} + +.panel-flex .form-item-hidden { + display: none; +} + +.panel-flex .flex1 { + width: calc(8.33% - 14px); +} + +.panel-flex .flex2 { + width: calc(8.33% * 2 - 14px); +} + +.panel-flex .flex3 { + width: calc(8.33% * 3 - 14px); +} + +.panel-flex .flex4 { + width: calc(8.33% * 4 - 14px); +} + +.panel-flex .flex5 { + width: calc(8.33% * 5 - 14px); +} + + +.panel-flex .flex6 { + width: calc(8.33% * 6 - 14px); +} + + +.panel-flex .flex7 { + width: calc(8.33% * 7 - 14px); +} + +.panel-flex .flex8 { + width: calc(8.33% * 8 - 14px); +} + +.panel-flex .flex9 { + width: calc(8.33% * 9 - 14px); +} + +.panel-flex .flex10 { + width: calc(8.33% * 10 - 14px); +} + +.panel-flex .flex11 { + width: calc(8.33% * 11 - 14px); +} + +.panel-flex .flex12 { + width: calc(8.33% * 12 - 14px); +} + +@media (max-width: 767px) { + .panel-flex { + flex-direction: column; + margin: 0; + } + .panel-flex [class*="flex"] { + width: 100%; + margin-left: 0; + margin-right: 0; + } +} + +.help-item { + border-radius: 0; +} + +.panel .help-item { + margin: 0; +} + +.help-item:after { + font: normal normal normal 14px/1 FontAwesome; + content: "\f10e"; + margin-left: 6px; +} +.help-item:before { + font: normal normal normal 14px/1 FontAwesome; + content: "\f10d"; + margin-right: 6px; +} + +.info-button { + height: 60px; + width: 100%; + padding: 4px 8px; + border-style: dotted; +} + +.info-button > i, +.info-button > img { + display: block; + width: 32px; + float: left; +} + +.info-button > i { + height: 100%; + font-size: 26px; + line-height: 50px; +} + +.info-button > img { + display: block; + height: 32px; + margin-top: 4px; +} + +.info-button-data { + float: left; + width: calc(100% - 32px); + height: 100%; + line-height: 22px; + padding-left: 8px; + text-align: left; +} + +.info-button-value { + font-size: 22px; + font-weight: 600; + display: block; + margin: 2px 0 4px; + white-space: nowrap; + max-width: 150px; + overflow: hidden; + text-overflow: ellipsis; +} + +.info-button-title { + display: block; + overflow: hidden; +} + +.info-button > i, +.info-button .info-button-value, +.info-button .info-button-title { + text-shadow: 1px 1px 0 rgba(0,0,0,.15); +} + +.info-button:not([class*=btn-]) > i, +.info-button:not([class*=btn-]) .info-button-value { + color: #3c763d; +} + +.info-button:not([class*=btn-]):hover, +.info-button:not([class*=btn-]):focus, +.info-button:not([class*=btn-]):active, +.info-button:not([class*=btn-]).active { + box-shadow: none; + background-color: #fff; +} diff --git a/sophal/css/view.gantt.css b/sophal/css/view.gantt.css new file mode 100644 index 0000000..063295b --- /dev/null +++ b/sophal/css/view.gantt.css @@ -0,0 +1,87 @@ +/** + * Axelor Business Solutions + * + * Copyright (C) 2005-2019 Axelor (). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +.view-container .gantt-view > div:last-child { + position: absolute; + top: 46px; + bottom: 0; left: 4px; right: 0; +} + +.gantt_grid_head_cell { + font-weight: bold; +} + +.gantt-main { + position: absolute; + top: 0; left: 0; bottom: 0; right: 0; + overflow: auto; +} + +.gantt_time_selects > select { + width: auto; +} + +.child_preview { + box-sizing: border-box; + margin-top: 2px; + position: absolute; + z-index: 1; + color: white; + text-align: center; + font-size: 12px; +} + +.gantt_task_line.task-collapsed { + height: 4px; + opacity: 0.25; +} + +.gantt_task_line.gantt_project.task-collapsed .gantt_task_content { + display: none; +} + +.gantt_row.task-parent { + font-weight: bold; +} + +.gantt_task_progress{ + text-align:left; + padding-left:10px; + box-sizing: border-box; + color:white; + font-weight: bold; +} + +.gantt_task_line.gantt_project{ + color:white; +} + +.gantt_side_content{ + color:#333; +} + +.summary-bar{ + font-weight: bold; +} + +.gantt_resource_task .gantt_task_content{ + color:inherit; +} + +.gantt_resource_task .gantt_task_progress{ + background-color:rgba(33,33,33,0.3); +} diff --git a/sophal/css/view.kanban.css b/sophal/css/view.kanban.css new file mode 100644 index 0000000..6de5c02 --- /dev/null +++ b/sophal/css/view.kanban.css @@ -0,0 +1,314 @@ +/** + * Axelor Business Solutions + * + * Copyright (C) 2005-2019 Axelor (). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +.cards-view, +.kanban-view { + position: absolute; + top: 41px; + right: 0; + bottom: 0; + left: 0; + overflow: auto; + padding: 18px 9px; +} + +.cards-view, +.cards-view *, +.kanban-view, +.kanban-view * { + box-sizing: border-box; +} + +.kanban-view { + display: flex; + padding: 0 6px; + background-color: #fff; +} + +.kanban-column { + display: flex; + flex-direction: column; + width: 24em; + background-color: #e7eaec; + margin: 12px 6px 0; + border-top-left-radius: 6px; + border-top-right-radius: 6px; +} + +.kanban-column ul.kanban-card-list, +.kanban-column li.kanban-card { + list-style: none; +} + +.kanban-column ul.kanban-card-list { + flex: 1; + margin: 0 4px 4px; + padding: 10px 10px 35px; + overflow: auto; + max-height: calc(100% - 22px); + background: #fff; +} + +.kanban-column .ui-sortable-placeholder { + border: 1px dashed #cecece !important; + visibility: visible !important; + background: #e7eaec !important; +} +.kanban-column .ui-sortable-helper { + box-shadow: 0 5px 10px rgba(0,0,0,.2); +} + +.kanban-column > h3 { + font-weight: 600; + font-size: 16px; + margin: 0; + padding: 10px; + line-height: 18px; +} + +.kanban-column .input-group { + display: flex; + margin: 0 8px 6px; +} + +.kanban-column .input-group .form-control { + height: 100%; + margin: 0; + flex: 1; +} + +.kanban-column .input-group .input-group-btn > .btn { + margin-left: -1px; +} + +.kanban-column .input-group .form-control:focus, +.kanban-column .input-group-btn > .btn:active, +.kanban-column .input-group-btn > .btn:focus, +.kanban-column .input-group-btn > .btn:hover { + z-index: 2; +} + +.kanban-more { + border-bottom: 1px dashed #ddd; + text-align: center; + margin: -40px 20px 25px 20px; +} + +.kanban-more .btn-load-more:hover { + background-color: #eaf2f8 !important; + color: #537c9f; +} + +.kanban-more .btn-load-more { + position: relative; + top: 11px; + padding: 0 4px; + outline: none; + border-color: #8aafce; + border-radius: 4px !important; + border-bottom-width: 2px; + color: #537c9f; +} + +.kanban-empty { + display: none; + margin: -30px 20px 10px 20px; +} + +.kanban-column.empty .kanban-empty { + display: block; +} + +.kanban-card { + list-style: none; + position: relative; + background: #fafafb; + border: 1px solid #e7eaec; + margin: 0 0 10px 0; + padding: 10px; + border-radius: 2px; + box-sizing: content-box; + border-left: 3px solid #e7eaec; +} + +.kanban-card:hover { + background-color: #fff; + cursor: pointer; +} + +.kanban-card.primary { + border-left: 3px solid #337ab7; +} + +.kanban-card.warning { + border-left: 3px solid #f0ad4e; +} + +.kanban-card.danger { + border-left: 3px solid #d9534f; +} + +.kanban-card.info { + border-left: 3px solid #23c6c8; +} + +.kanban-card.success { + border-left: 3px solid #0275d8; +} + +.kanban-card h4 { + margin: 0 0 4px 0; + font-weight: 600; + font-size: 13px; +} + +.kanban-card img { + width: 24px; + height: 24px; + position: absolute; + right: 2px; + bottom: 2px; + border-radius: 100%; +} + +.rect-image .kanban-card img { + border-radius: 0; +} + +.kanban-card .card-body { + +} + +.kanban-card .card-footer { + margin-top: 4px; + color: #777; + font-size: 12px; +} + +.kanban-card-menu { + display: none; + position: absolute; + top: 2px; + right: 2px; +} + +.kanban-card-menu > a { + padding: 0 4px; + outline: none !important; + border: 0 !important; + box-shadow: none !important; +} + +.kanban-card:hover .kanban-card-menu, +.kanban-card .kanban-card-menu.open { + display: inline-block; +} + +.cards-view .kanban-card-list { + display: flex; + flex-wrap: wrap; +} + +.cards-view.cards-center .kanban-card-list { + justify-content: center; +} + +.cards-view .kanban-card-container { + float: left; + width: 33.33333333%; + padding-left: 10px; + padding-right: 10px; + margin-bottom: 20px; + display: flex; +} + +.cards-view .kanban-card { + box-sizing: border-box; + margin: 0; + padding: 16px; + background-color: #fff; + overflow: hidden; + width: 100%; +} + +.cards-view .kanban-card address { + margin-bottom: 0; +} + +.cards-view .kanban-card p { + margin: 9px 0; +} + +.cards-view .card-image { + position: relative; + text-align: center; +} + +.cards-view .card-image img { + position: relative; + width: 64px; + height: 64px; +} + +.cards-view .card-image strong { + margin-top: 6px; + display: block; +} + +.cards-view .cards-no-records { + display: none; + position: absolute; + top: 48%; + width: 100%; + font-weight: 400; + text-align: center; +} + +.cards-view.empty .cards-no-records { + display: block; +} + +.kanban-column h3, +.kanban-column h4, +.kanban-column .card-body, +.kanban-column .card-footer { + overflow: hidden; + text-overflow: ellipsis; +} + +@media (max-width: 767px) { + .cards-view { + padding: 12px 0; + } + .cards-view .kanban-card-container { + width: 100% !important; + margin-bottom: 12px; + } +} + +@media (max-width: 480px) { + .kanban-view { + flex-direction: column; + padding-bottom: 12px; + } + .kanban-column { + display: block; + } + .kanban-column ul.kanban-card-list { + padding-bottom: 0; + } +} diff --git a/sophal/css/view.mail.css b/sophal/css/view.mail.css new file mode 100644 index 0000000..36f7078 --- /dev/null +++ b/sophal/css/view.mail.css @@ -0,0 +1,394 @@ +/** + * Axelor Business Solutions + * + * Copyright (C) 2005-2019 Axelor (). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +/* thread view */ + +.mail-thread-view { + width: inherit !important; + max-width: 720px; + margin: 0 16px 0 4px !important; + padding: 0; +} + +.mail-thread-view .panel { + border: none; + box-shadow: none; + background-color: transparent; +} + +/* form widgets */ + +.mail-thread { + margin-top: 16px; + margin-left: 20px; + border-left: 2px solid #ddd; +} + +.mail-composer { + margin: -16px 0 20px 30px; +} + +.mail-composer textarea { + max-width: 100%; + margin-bottom: 0; +} + +.mail-composer .btn { + margin-right: 8px; +} + +.mail-composer-buttons { + padding-top: 8px; +} + +.mail-composer-files { + padding-top: 8px; +} + +.mail-composer-files ul { + margin: 0; + list-style: none; +} + +.mail-editor .mail-files { + min-height: 18px; +} + +.mail-files i { + margin-right: 4px; +} +.mail-files i.fa-close { + cursor: pointer; +} + +.mail-thread .avatar { + position: relative; + display: inline-block; + width: 40px; + height: 40px; + margin-left: -21px; + border-radius: 500px; + line-height: 40px; + text-align: center; + font-size: 20px; + font-weight: 600; + color: #ffffff; + text-transform: uppercase; + text-shadow: 1px 1px 0 rgba(0,0,0,.15); +} + +.mail-thread .avatar:not([class*=bg-]) { + background-color: #0275d8; +} + +.mail-thread .avatar:hover, +.mail-thread .avatar:active, +.mail-thread .avatar:focus { + text-decoration: none; +} + +.mail-thread .avatar img { + width: 100%; + height: 100%; + border-radius: 500px; + vertical-align: inherit; +} + +.mail-thread .mail-message-indent { + padding-left: 40px; +} + +.mail-thread .mail-message { + position: relative; + border-radius: 0; + margin-left: 30px; + margin-bottom: 20px; + border: 1px solid #ddd; + border-radius: 2px; + background-color: #fff; + box-shadow: 0 1px 1px rgba(0,0,0,0.05); +} + +.mail-thread .mail-message > .arrow { + position: absolute; + display: inline-block; + width: 11px; + height: 11px; + border: 1px solid #ddd; + left: -7px; + top: 12px; + background-color: #fff; + border-right: 0; + border-bottom: 0; + -webkit-transform: rotate(-45deg); + -moz-transform: rotate(-45deg); + -ms-transform: rotate(-45deg); + transform: rotate(-45deg); +} + +.mail-thread .mail-message > .star { + position: absolute; + color: #d9534f; + left: 8px; +} + +.mail-thread .mail-message > .star i { + font-size: 8px; +} + +.mail-thread .mail-message-icons { + float: right; + margin: 10px; +} + +.mail-thread .mail-message-icons i { + cursor: pointer; + margin-left: 4px; + color: #0088cc; +} + +.mail-thread .mail-message-icons .btn { + padding: 0; + margin-top: -4px; + outline: none !important; + border: 0 !important; + box-shadow: none !important; +} + +.mail-thread .mail-message-icons .btn i { + margin: 0; + padding: 4px; +} + +.mail-thread .mail-message-body { + padding: 8px 16px; +} + +.mail-thread .mail-message-footer { + font-size: smaller; +} + +.mail-thread .mail-message-footer a { + cursor: pointer; +} + +.mail-thread .mail-message-files { + margin: 4px 0 4px -4px; +} + +.mail-thread .mail-message-files ul { + margin: 0; +} + +.mail-thread-more { + border-bottom: 1px dashed #ddd; + text-align: center; + margin-top: -15px; + margin-left: -2px; + border-left: 2px solid #fff; +} + +.mail-thread-more .btn-load-more:hover { + background-color: #eaf2f8 !important; + color: #537c9f; +} + +.mail-thread-more .btn-load-more { + position: relative; + top: 10px; + padding: 0 4px; + outline: none; + border-color: #8aafce; + border-radius: 4px !important; + border-bottom-width: 2px; + color: #537c9f; +} + +.mail-thread-view .mail-thread-more { + border-left: 2px solid #f3f3f4; +} + +.mail-messages > div > .mail-composer:first-child { + margin: 0 0 20px 0; +} + +.mail-followers .panel-title > span { + width: calc(100% - 40px); + display: inline-block; + overflow: hidden; + text-overflow: ellipsis; +} + +.mail-followers .panel-icons i { + margin-left: 8px; + cursor: pointer; +} + +.mail-followers .links { + list-style: none; + margin: 0; +} + +.mail-followers .links li { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.mail-followers .links i.fa-remove { + cursor: pointer; + margin-top: 3px; + margin-right: 4px; +} + +.mail-message i.fa:hover, +.mail-followers i.fa:hover { + color: black; +} + +.mail-message .mail-message-header { + font-weight: 600; + padding: 10px 16px; + border-bottom: 1px solid #ddd; +} + +.mail-message .mail-message-header .track-tags:before { + content: ' : '; +} + +.mail-message .track-message { + font-weight: 600; +} + +.mail-message .track-content { + margin-bottom: 8px; +} + +.mail-message .track-fields { + margin: 0 0 4px 26px; +} + +.mail-message .track-tags { +} + +.mail-message .track-tags .label { + margin-right: 2px; +} + +.mail-message-body a.show-full { + display: inline-block; + background-color: #f1f1f1; + border: 1px solid #ddd; + line-height: 8px; + outline: none; + padding: 1px 6px 0px; + margin-top: 6px; +} +.mail-message-body a.show-full:hover { + background-color: #d8d8d8; + border-color: #cdcdcd; +} + +.mail-message-body a.show-full i { + line-height: 6px; +} + +.form-mail .fade { + opacity: 0.1; +} + +.form-mail .fadeIn { + opacity: 1; + -webkit-transition: all linear 0.5s; + transition: all linear 0.5s; +} + +.form-mail .fadeDim .fade, +.form-mail .fadeDim .mail-thread-more { + display: none; +} + +/** special views */ + +.mail-group-form, +.mail-group-list { + +} + +.mail-group-form { + padding-left: 20px; + padding-right: 20px; +} + +.mail-group-form { + +} + +.grid-cards { + padding: 12px; +} + +.grid-cards .grid-card { + padding: 6px; + margin: 4px; + border: 1px solid #c0c0c0; + border-radius: 0; + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + width: calc(25% - 22px); + min-width: 300px; +} + +@media (max-width: 768px) { + .grid-cards .grid-card { + width: calc(50% - 22px); + } +} + +@media (max-width: 480px) { + .grid-cards .grid-card { + width: calc(100% - 22px); + } +} + +.grid-cards .grid-card, +.grid-cards .grid-card-left, +.grid-cards .grid-card-right { + position: relative; + display: inline-block; + vertical-align: top; +} + +.grid-cards .grid-card-left { + overflow: hidden; + border-collapse: separate; +} + +.grid-cards .grid-card-left img { + width: 64px; + min-height: 64px; + padding: 2px; +} + +.grid-cards .grid-card-right { + width: calc(100% - 86px); + min-height: 120px; + margin-left: 4px; +} + +.grid-cards .grid-card-right .buttons { + margin-top: 4px; +} diff --git a/sophal/css/view.popup.css b/sophal/css/view.popup.css new file mode 100644 index 0000000..55cc6ca --- /dev/null +++ b/sophal/css/view.popup.css @@ -0,0 +1,374 @@ +/** + * Axelor Business Solutions + * + * Copyright (C) 2005-2019 Axelor (). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +.ui-dialog { + padding: 0; + border: 0; + top: 30px !important; + left: 0 !important; + right: 0 !important; + display: flex; + flex-flow: column nowrap; +} + +.ui-dialog .ui-dialog-titlebar { + border: none; + border-bottom: 1px solid #EEE; + border-radius: 0; + background: none; + + padding: 9px 15px; + font-size: 20.5px; + font-weight: 600; + line-height: 26px; + flex: 0 0 auto; +} + +.ui-dialog .ui-dialog-title { + margin: 0; +} + +.ui-dialog, +.ui-dialog .ui-dialog-title { + border-radius: 0; +} + +.ui-dialog .ui-dialog-titlebar-close.ui-state-hover { + background: none; + border: 0; +} + +.ui-dialog .ui-dialog-titlebar-close:hover, +.ui-dialog .ui-dialog-titlebar-close:focus { + padding: 1px; +} + +.ui-dialog .ui-dialog-titlebar-close .ui-icon, +.ui-dialog .ui-dialog-titlebar-close .ui-icon.ui-state-hover { + background: none !important; +} + +.ui-dialog .ui-dialog-titlebar-close { + top: 20px; + right: .5em; + height: auto; + width: auto; + opacity: 0.2; +} + +.ui-dialog .ui-dialog-titlebar-close.ui-state-hover { + border: 0; + background: transparent; + font-weight: 600; + opacity: 0.4; +} + +.ui-dialog .ui-dialog-titlebar-close span::before { + content: "\00D7"; + display: inline-block; +} + +.ui-dialog .ui-dialog-titlebar-close .ui-icon { + text-indent: 0px !important; + line-height: 20px; + font-size: 20px; + height: 20px; + width: 12px; +} + +.ui-dialog .ui-dialog-titlebar-close.ui-state-focus { + background: inherit; + border: inherit; + font-weight: inherit; +} + +.ui-dialog .ui-dialog-titlebar-max, +.ui-dialog .ui-dialog-titlebar-collapse { + position: absolute; + right: 1.6em; + top: 7px; + opacity: 0.2; +} +.ui-dialog .ui-dialog-titlebar-max:hover, +.ui-dialog .ui-dialog-titlebar-collapse:hover { + font-weight: bold; + color: #212121; + opacity: 0.4; +} + +.ui-dialog .ui-dialog-titlebar-collapse { + right: 2.6em; +} + +.ui-dialog .ui-dialog-titlebar-close span::before { + font-size: 24px; +} + +.ui-dialog-buttonpane { + border-top: 1px solid #DDD; +} + +.ui-dialog-buttonpane .btn { + padding: 16px auto; +} + +.ui-dialog-buttonpane .btn[disabled] { + cursor: inherit; +} + +.ui-dialog .ui-dialog-content { + padding: 4px; + min-height: 50px; +} + +.ui-dialog .ui-dialog-content:not(.ui-dialog-ie11) { + max-height: calc(100% - 45px - 52px) !important; + height: inherit !important; +} + +.ui-dialog .ui-dialog-content[ui-editor-popup] { + min-height: 200px !important; +} + +.ui-dialog .ui-dialog-content[ui-selector-popup] { + overflow: hidden; + height: 450px !important; +} + +.ui-widget-overlay { + background: none; + background-color: black; +} + +.ui-dialog .ui-dialog-buttonpane { + margin-top: 0; + padding: .3em .5em .5em .5em; + flex: 0 0 auto; +} + +.ui-dialog.collapsed .ui-dialog-content, +.ui-dialog.collapsed .ui-dialog-buttonpane { + display: none !important; +} + +.ui-dialog-buttonpane .btn-group > .btn { + margin: 0; +} + +.ui-dialog-buttonpane .btn-group > .btn:first-child { + margin-left: 0; +} + +.ui-dialog-buttonpane .btn-group > .btn:last-child { + margin-left: -1px; +} + +.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset-left button { + margin-left: 0.4em; +} + +.ui-dialog-titlebar .record-pager { + position: absolute; + right: 76px; + top: 8px; + line-height: 25px; +} + +.ui-dialog-titlebar .record-pager-text { + margin-top: 0; +} + +.no-close .ui-dialog-titlebar-close { + display: none; +} + +.ui-dialog .message-box a { + color: #0088cc; + outline: none; +} + +.ui-dialog form[ui-bar-layout] { + padding-bottom: 0px; +} + +.ui-dialog-content > [ui-view-form], +.ui-dialog-content > [ui-view-form] > form { + box-sizing: border-box; + width: 100%; + min-width: 100%; + max-width: 100%; +} + +.ui-dialog-responsive { + position: absolute; + width: 100% !important; + margin: 0 auto !important; + max-width: calc(100% - 16px) !important; + max-height: calc(100% - 64px) !important; + border: none; +} + +.ui-dialog-small .ui-dialog-content { + height: auto !important; + overflow: inherit; +} + +.ui-dialog-small .ui-dialog-buttonpane { + position: relative; +} + +@media screen and (min-width: 768px) { + .ui-dialog-responsive { + width: 740px !important; + } + .ui-dialog-small { + width: 480px !important; + } +} +@media screen and (min-width: 1024px) { + .ui-dialog-responsive { + width: 900px !important; + } + .ui-dialog-small { + width: 480px !important; + } +} + +@media screen and (max-width: 768px) { + .ui-dialog .ui-dialog-titlebar, + .ui-dialog .ui-dialog-buttonpane { + position: absolute; + left: 0; + right: 0; + } + .ui-dialog { + position: absolute; + margin: 8px !important; + top: 0 !important; + left: 0 !important; + width: calc(100% - 16px) !important; + height: calc(100% - 16px) !important; + max-height: calc(100% - 16px) !important; + } + .ui-dialog .ui-dialog-title { + top: 0; + } + .ui-dialog .ui-dialog-buttonpane { + bottom: 0; + } + .ui-dialog .ui-dialog-content { + box-sizing: border-box; + width: 100% !important; + height: calc(100% - 45px - 52px) !important; + overflow: auto; + margin-top: 45px; + } + .ui-dialog .ui-dialog-content[ui-selector-popup] { + min-height: inherit !important; + } + .ui-dialog-small { + height: auto !important; + } + .ui-dialog-small .ui-dialog-content { + height: auto !important; + } + .ui-dialog-small .ui-dialog-buttonpane { + position: relative; + } +} + +.ui-dialog.maximized { + top: 0 !important; + left: 0 !important; + margin: 8px !important; + width: calc(100% - 16px) !important; + height: calc(100% - 16px) !important; + max-height: calc(100% - 16px) !important; +} +.ui-dialog.maximized .ui-dialog-buttonpane { + bottom: 0; +} +.ui-dialog.maximized .ui-dialog-content { + width: auto !important; + height: calc(100% - 45px - 52px) !important; +} +.ui-dialog.maximized.collapsed { + height: auto !important; +} + +.ui-dialog .translation-form { + overflow: auto; +} +.ui-dialog .translation-form i { + cursor: pointer; +} +.ui-dialog .translation-form i.fa-times { + line-height: 28px; + margin-right: -12px; + float: right; +} +.ui-dialog .translation-form i.fa-plus { + margin-right: 4px; +} +.ui-dialog .translation-form form { + margin: 0; + margin-right: 8px; +} +.ui-dialog .translation-form form label { + font-weight: 600; + min-height: 0; + margin-left: 6px; +} +.ui-dialog .translation-form form input { + margin-left: 6px; +} +.ui-dialog .translation-form form hr { + margin: 8px 0; +} + +#loginWindow * { + box-sizing: border-box; +} + +#loginWindow { + padding: 16px; +} + +#loginWindow form { + margin-bottom: 0; +} + +#loginWindow input { + width: 100%; + height: 33px; +} + +#errorWindow .errorMessage, +#errorWindow .errorDetails { + margin: 8px; +} + +#errorWindow .errorDetails .nav-tabs, +#errorWindow .errorDetails pre { + margin-bottom: 0; +} + +#errorWindow .errorDetails .tab-contents { + padding: 4px; + border: 1px solid #d4d4d4; + border-top: none; +} diff --git a/sophal/css/view.portal.css b/sophal/css/view.portal.css new file mode 100644 index 0000000..f3dcd94 --- /dev/null +++ b/sophal/css/view.portal.css @@ -0,0 +1,412 @@ +/** + * Axelor Business Solutions + * + * Copyright (C) 2005-2019 Axelor (). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +.portal-view .portal, +.portal-view .portlet, +.portal-view .portlet-body, +.portal-view .portlet-header, +.portal-view .portlet-content { + overflow: hidden; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.form-view .portlet, +.form-view .portlet-body, +.form-view .portlet-header, +.form-view .portlet-content { + overflow: hidden; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.portal-view .portal { + padding: 4px; +} + +.portal > .portal-tabs, +.portal > .portlet { + position: relative; + float: left; +} + +.portlet-header.navbar i { + padding: 4px; + margin: 0; +} + +.portlet-header.navbar .portlet-pager i.disabled { + color: gray; + cursor: default; +} + +.portlet-header.navbar .divider-vertical { + height: 28px; +} + +.portlet .portlet-body, +.portlet .portlet-content { + position: absolute !important; +} + +.portlet .portlet-body { + top: 0px; + right: 2px; + bottom: 4px; + left: 2px; + + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} + +.portlet .portlet-content { + top: 30px; + left: 0px; + right: 0px; + bottom: 0px; + + border: 1px solid #d4d4d4; + border-top: none; + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; +} + +.portlet .portlet-content > div, +.portlet .portlet-content > div > .slickgrid { + top: -1px !important; + height: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + + border: none; +} + +.portal-tabs { + margin-bottom: 4px; +} + +.portal-tabs > .nav-tabs { + margin-bottom: 0; +} + +.portal-tabs > .tab-content { + position: relative; + border: 1px solid #DDD; + border-top: 0; + background-color: #fff; +} + +.portlet .portlet-content > .nvtooltip { + height: auto; +} + +.portlet.portlet-minimized { + height: 34px !important; +} + +.portlet.portlet-minimized .portlet-content { + display: none !important; +} + +.portal-view .ui-sortable-placeholder { + border: 2px dashed #c9c9c9; + visibility: visible !important; + + margin-bottom: 4px; + + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +/** dashboard */ + +.dashboard { + margin: auto; + padding: 14px; +} + +.dashboard.attached { + margin-top: -16px; +} + +.dashboard, +.dashboard .dashlet { + box-sizing: border-box; +} + +.dashboard .ui-sortable-placeholder { + border: 1px dashed #cecece !important; + visibility: visible !important; + background: #e7eaec !important; +} +.dashboard .ui-sortable-helper { + box-shadow: 0 5px 10px rgba(0,0,0,.3); +} + +.dashboard .dashlet { + background-color: #fff; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} + +.dashboard .dashlet-header { + border-top: 4px solid #e7e7e7; + padding: 11px 15px 14px; + margin-top: -1px; + cursor: move; +} + +.bar-layout .dashlet { + height: 100%; +} +.bar-layout .dashlet-header { + cursor: default; +} +.bar-layout .panel .dashboard { + margin-bottom: 0; +} + +.dashboard .dashlet-title { + font-size: 14px; + font-weight: 600; + max-width: 60%; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.dashlet-title { + min-height: 14px; +} + +.dashboard .dashlet-body { + border-top: 1px solid #e7e7e7; + height: 250px; + overflow: auto; +} + +.dashboard .dashlet-body > * { + height: calc(100% - 1px); +} + +.dashboard .dashlet-body .slickgrid { + height: 100%; + border: 0; +} +.dashboard .dashlet-body .slickgrid .slick-header { + border-top: 0; +} + +.dashboard .dashlet-pager { + margin-right: 8px; +} + +.dashboard ul.dashlet-buttons { + list-style: none; + margin: 0; +} + +.dashboard ul.dashlet-buttons > li { + list-style: none; + float: left; + margin: 0 4px; +} + +.dashboard ul.dashlet-buttons > li > a { + color: #333; +} + +.dashboard .dashlet-buttons > a, +.dashboard .dashlet-pager > a { + color: #333; + padding-left: 8px; +} + +.dashboard .dashlet-pager > a.disabled { + color: gray; + cursor: default; +} + +.dashlet .chart-controls { + +} + +.dashlet .chart-controls form { + margin: 0; + padding: 0; +} + +.dashlet .chart-controls .panel { + border: 0; + box-shadow: none; + margin: 0; +} +.dashlet .chart-controls .panel-body { + padding: 4px; +} + +.dashboard .dashlet { + margin: 10px !important; +} + +.form-item .dashboard { + padding: 0 !important; +} +.form-item .dashlet { + margin: 0 !important; + border: 1px solid #e7e7e7; +} +.form-item .dashlet .dashlet-body > * { + height: 100%; +} +.form-item .dashlet .dashlet-body { + padding: 0; +} +.form-item .dashlet .dashlet-body .portlet-grid .slickgrid { + border: 0; +} +.form-item .dashlet .dashlet-body .portlet-grid .slick-header { + border-top: 0; +} + +/** responsive dashlet classes */ + +[class*="dashlet-cs"] { + float: left; + min-height: 1px; +} + +.dashlet-cs12 { + width: calc(100% - 24px); +} + +.dashlet-cs11 { + width: calc(91.666666667% - 24px); +} + +.dashlet-cs10 { + width: calc(83.333333333% - 24px); +} + +.dashlet-cs9 { + width: calc(75% - 24px); +} + +.dashlet-cs8 { + width: calc(66.666666667% - 24px); +} + +.dashlet-cs7 { + width: calc(58.333333333% - 24px); +} + +.dashlet-cs6 { + width: calc(50% - 24px); +} + +.dashlet-cs5 { + width: calc(41.666666667% - 24px); +} + +.dashlet-cs4 { + width: calc(33.333333333% - 24px); +} + +.dashlet-cs3 { + width: calc(25% - 24px); +} + +.dashlet-cs2 { + width: calc(16.666666667% - 24px); +} + +.dashlet-cs1 { + width: calc(8.333333333% - 24px); +} + +@media (max-width: 768px) { + [class*="dashlet-cs"] { + width: calc(100% - 24px); + } +} + +.chart-controls .span6 { + width: calc(50% - 12px) !important; + margin: 0 12px !important; + float: left !important; +} + +.chart-controls .span6:first-child { + margin-left: 0 !important; +} + +.chart-controls .span6:last-child { + margin-right: 0 !important; +} + +.report-box { + position: relative; +} + +.report-box .dashlet-body { + height: 60px; + padding: 15px 20px 20px 20px; + overflow: hidden; +} + +.report-box .dashlet-body h1 { + margin: 0; + font-size: 30px; + font-weight: 100; +} + +.report-box .report-tags { + position: absolute; + top: 12px; + right: 36px; +} + +.report-table tfoot td { + border-top: 1px solid #ccc; + font-weight: 600; +} + +@media (max-width: 480px) { + .nv-controlsWrap { + display: none !important; + } + .dashboard { + padding: 6px !important; + } + .dashboard .dashlet { + margin: 6px !important + } + .dashboard .dashlet:last-child { + margin-bottom: 12px !important; + } + [class*="dashlet-cs"] { + width: calc(100% - 12px); + } +} diff --git a/sophal/css/view.tree.css b/sophal/css/view.tree.css new file mode 100644 index 0000000..64cec6f --- /dev/null +++ b/sophal/css/view.tree.css @@ -0,0 +1,109 @@ +/** + * Axelor Business Solutions + * + * Copyright (C) 2005-2019 Axelor (). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +.view-container .tree-view > .tree-view-container { + position: absolute; + top: 40px; + bottom: 0; left: 0; right: 0; + border-top: 1px solid #e7e7e7; + background-color: #fff; +} + +table.treetable { + border: 0; + margin: 0; +} + +table.treetable tr { + line-height: 18px; +} + +table.treetable tbody tr.branch { + background-color: #fff; +} + +table.treetable tbody tr.selected { + background-color: #337ab7; +} + +table.treetable tbody tr.selected a { + color: #fff; +} + +table.treetable .tree-button i, +table.treetable .tree-button img { + margin-right: 4px; +} + +table.treetable tbody tr.accept { + background-color: #a3bce4; + color: #fff +} + +.tree-view-container .tree-header { + height: 24px; + color: #333; + background-color: #fff; +} + +.tree-view-container .tree-header { + width: 100%; + white-space: nowrap; + border-bottom: 1px solid #e7e7e7; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.tree-view-container .tree-header th { + display: inline-block; + height: 100%; + padding: 4px; + padding-left: 6px; + border-left: 1px solid #e7e7e7; + text-align: left; + text-overflow: ellipsis; + overflow: hidden; + font-weight: 600; +} + +.tree-view-container .tree-header th:first-of-type { + border-left: none; +} + +.tree-view-container .tree-table { + overflow: auto; + position: absolute; + top: 27px; left: 0; right: 0; bottom: 0; +} + +.tree-header th, +.tree-table td, +.tree-table td span { + box-sizing: content-box; +} + +.dashlet .tree-view-container { + position: relative; + height: 100%; + border: 1px solid #d4d4d4; +} + +.form-item .dashlet .tree-view-container { + border: 0; +} diff --git a/sophal/css/wysiwyg.css b/sophal/css/wysiwyg.css new file mode 100644 index 0000000..d86acbd --- /dev/null +++ b/sophal/css/wysiwyg.css @@ -0,0 +1,206 @@ +/** + * Axelor Business Solutions + * + * Copyright (C) 2005-2019 Axelor (). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +.wysiwyg-container { + border-radius: 0; +} + +.wysiwyg-editor { + min-height: 100px; +} + +.wysiwyg-browse { + padding: 0; +} + +.wysiwyg-popup { + border-radius: 0; + background: #fff; + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + background-clip: padding-box; + width: auto !important; +} + +.wysiwyg-toolbar-icon { + padding: 6px 8px; + font-size: 14px; +} + +.wysiwyg-toolbar a, +.wysiwyg-toolbar a:hover, +.wysiwyg-toolbar a:link, +.wysiwyg-toolbar a:visited { + text-decoration: none; +} + +.wysiwyg-plugin-list { + overflow: hidden; +} + +.wysiwyg-plugin-list a, +.wysiwyg-plugin-list a:link, +.wysiwyg-plugin-list a:visited { + display: block; + color: black; + padding: 5px 10px; + text-decoration: none; + cursor: pointer; +} + +.wysiwyg-toolbar-icon:hover, +.wysiwyg-plugin-list a:hover { + color: #fff; + background-color: #5377b1; +} + +.wysiwyg-toolbar-icon.disabled { + opacity: 0.3; + color: inherit; + background-color: inherit; + cursor: default; +} + +.wysiwyg-popup.wysiwyg-popuphover { + width: auto; +} + +input.wysiwyg-input { + margin: 0; +} + +.wysiwyg-toolbar-divider { + background-color: #ddd; + display: inline-block; + height: 26px; + margin-left: 0px; + margin-right: 0px; + vertical-align: middle; + width: 1px; +} + +/** normalize bootstrap css for content */ +.html-item .html-content blockquote { + margin: 0 0 9px 40px; + border: none; + padding: 0px; +} + +/** force same style on chrome */ +.html-item .html-content blockquote[style*='margin: 0 0 0 40px'] { + margin: 0 0 9px 40px !important; +} + +.html-item .html-content blockquote p { + font-size: 13.25px; + font-weight: inherit; + line-height: 18px; +} + +.wysiwyg-plugin-list h1, h2, h3, h4, h5, h6, +.html-item .html-content h1, h2, h3, h4, h5, h6 { + font-weight: 600; +} + +.wysiwyg-plugin-list h1, +.html-item .html-content h1 { + font-size: 24.75px; +} + +.wysiwyg-plugin-list h2, +.html-item .html-content h2 { + font-size: 22.25px; +} + +.wysiwyg-plugin-list h3, +.html-item .html-content h3 { + font-size: 18.75px; +} + +.html-item textarea.html-content { + border: none; + width: 100%; + margin: 0; +} + +.wysiwyg-plugin-list h1, +.wysiwyg-plugin-list h2, +.wysiwyg-plugin-list h3, +.wysiwyg-plugin-list h4, +.wysiwyg-plugin-list h5, +.wysiwyg-plugin-list h6, +.wysiwyg-plugin-list p, +.wysiwyg-plugin-list pre, +.wysiwyg-plugin-list blockquote { + margin: 0; +} + +.wysiwyg-plugin-list pre { + padding: 2px 4px 0; +} + +.html-item textarea.html-content { + border: none; + width: 100%; + margin: 0; +} + +.wysiwyg-container.ui-resizable { + min-height: 100px; +} + +.wysiwyg-container.ui-resizable .wysiwyg-editor { + min-height: auto; +} + +.wysiwyg-container.ui-resizable textarea { + resize: none; +} + +.wysiwyg-container.ui-resizable .html-content { + position: absolute; + top: 27px; + left: 0; + bottom: 4px; + right: 0; +} + +.wysiwyg-container.ui-resizable .ui-resizable-handle.ui-resizable-s { + background-color: #cccccc; + position: absolute; + right: 0; + bottom: 0; + left: 0; + height: 4px; +} + +.slick-external-editor.html-item { + background-color: white; + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + min-width: 380px; +} + +.slick-external-editor.html-item input.wysiwyg-input { + box-sizing: border-box; +} + +.slick-external-editor .wysiwyg-editor { + max-height: 200px; +} + +.slick-external-editor .wysiwyg-container textarea { + resize: none; +} diff --git a/sophal/js/application.js b/sophal/js/application.js new file mode 100644 index 0000000..4834123 --- /dev/null +++ b/sophal/js/application.js @@ -0,0 +1,133 @@ +/* + * Axelor Business Solutions + * + * Copyright (C) 2005-2019 Axelor (). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +//= lib/underscore/underscore.js +//= lib/underscore/underscore.string.js +//= lib/moment/moment.js + +//= lib/jquery.ui/js/jquery.js +//= lib/jquery.ui/js/jquery-ui.js +//= lib/jquery.ui/js/jquery.ui.mask.js +//= lib/bootstrap/js/bootstrap.js +//= lib/jquery.timepicker/jquery-ui-timepicker-addon.js + +//= lib/slickgrid/lib/jquery.event.drag-2.2.js +//= lib/slickgrid/lib/jquery.event.drop-2.2.js +//= lib/slickgrid/slick.core.js +//= lib/slickgrid/slick.grid.js +//= lib/slickgrid/slick.dataview.js +//= lib/slickgrid/slick.groupitemmetadataprovider.js +//= lib/slickgrid/plugins/slick.headermenu.js +//= lib/slickgrid/plugins/slick.rowselectionmodel.js +//= lib/slickgrid/plugins/slick.checkboxselectcolumn.js +//= lib/slickgrid/plugins/slick.rowmovemanager.js + +//= lib/jquery.treetable/js/jquery.treetable.js + +//= lib/fullcalendar/fullcalendar.js +//= lib/fullcalendar/gcal.js + +//= lib/dhtmlxGantt/dhtmlxgantt.js + +//= lib/handsontable/handsontable.full.js + +//= lib/d3/d3.js +//= lib/d3/nv/nv.d3.js +//= lib/d3/radar/radar-chart.js +//= lib/d3/gauge/gauge-chart.js +//= lib/d3/funnel/d3-funnel.js + +//= lib/codemirror/codemirror.min.js +//= lib/wysiwyg/wysiwyg.js +//= lib/wysiwyg/wysiwyg-editor.js + +//= lib/angular/angular.js +//= lib/angular/angular-route.js +//= lib/angular/angular-resource.js +//= lib/angular/angular-sanitize.js +//= lib/angular/angular-animate.js + +//= lib/angular-ui/sortable.js + +//= js/axelor.ns.js +//= js/axelor.ng.js + +//= js/lib/i18n.js +//= js/lib/utils.js +//= js/lib/dialogs.js +//= js/lib/tabs.js + +//= js/axelor.auth.js +//= js/axelor.app.js +//= js/axelor.ds.js +//= js/axelor.data.js +//= js/axelor.ui.js +//= js/axelor.nav.js +//= js/axelor.prefs.js + +//= js/widget/widget.navtabs.js +//= js/widget/widget.navtree.js +//= js/widget/widget.navmenu.js +//= js/widget/widget.slickgrid.js +//= js/widget/widget.dialog.js +//= js/widget/widget.update.js +//= js/widget/widget.search.js +//= js/widget/widget.menubar.js + +//= js/form/form.base.js +//= js/form/form.converters.js +//= js/form/form.actions.js +//= js/form/form.widget.js +//= js/form/form.layout.js +//= js/form/form.container.js + +//= js/form/form.input.static.js +//= js/form/form.input.boolean.js +//= js/form/form.input.text.js +//= js/form/form.input.html.js +//= js/form/form.input.number.js +//= js/form/form.input.datetime.js +//= js/form/form.input.select.js +//= js/form/form.input.progress.js +//= js/form/form.input.binary.js +//= js/form/form.input.spreadsheet.js + +//= js/form/form.relational.base.js +//= js/form/form.relational.single.js +//= js/form/form.relational.multiple.js +//= js/form/form.relational.nested.js + +//= js/form/form.input.json.js + +//= js/form/form.mail.js +//= js/form/form.code.js + +//= js/view/view.base.js +//= js/view/view.form.js +//= js/view/view.grid.js +//= js/view/view.tree.js +//= js/view/view.html.js +//= js/view/view.search.js +//= js/view/view.portal.js +//= js/view/view.dashboard.js +//= js/view/view.popup.js +//= js/view/view.chart.js +//= js/view/view.calendar.js +//= js/view/view.gantt.js +//= js/view/view.kanban.js +//= js/view/view.custom.js +//= js/view/view.dms.js diff --git a/sophal/js/application.login.js b/sophal/js/application.login.js new file mode 100644 index 0000000..84025b9 --- /dev/null +++ b/sophal/js/application.login.js @@ -0,0 +1,20 @@ +/* + * Axelor Business Solutions + * + * Copyright (C) 2005-2019 Axelor (). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +//= lib/jquery.ui/js/jquery.js +//= lib/bootstrap/js/bootstrap.js +//= js/axelor.ns.js diff --git a/sophal/js/axelor.app.js b/sophal/js/axelor.app.js new file mode 100644 index 0000000..247cbbd --- /dev/null +++ b/sophal/js/axelor.app.js @@ -0,0 +1,688 @@ +/* + * Axelor Business Solutions + * + * Copyright (C) 2005-2019 Axelor (). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +/** + * Application Module + * + */ +(function() { + + "use strict"; + + var loadingElem = null, + loadingTimer = null, + loadingCounter = 0; + + function updateLoadingCounter(val) { + loadingCounter += val; + loadingCounter = Math.max(0, loadingCounter); + } + + function hideLoading() { + if (loadingTimer) { + clearTimeout(loadingTimer); + loadingTimer = null; + } + if (loadingCounter > 0) { + loadingTimer = _.delay(hideLoading, 500); + return; + } + loadingTimer = _.delay(function () { + loadingTimer = null; + if (loadingElem) { + loadingElem.fadeOut(100); + } + }, 500); + } + + function onHttpStart() { + + updateLoadingCounter(1); + + if (loadingTimer) { + clearTimeout(loadingTimer); + loadingTimer = null; + } + + if (loadingElem === null) { + loadingElem = $('
' + _t('Loading') + '...
') + .css({ + position: 'fixed', + top: 0, + width: '100%', + 'text-align': 'center', + 'z-index': 2000 + }).appendTo('body'); + } + loadingElem.show(); + } + + function onHttpStop() { + updateLoadingCounter(-1); + hideLoading(); + } + + axelor.$evalScope = function (scope) { + + var evalScope = scope.$new(true); + + function isValid(name) { + if (!name) { + if (_.isFunction(scope.isValid)) { + return scope.isValid(); + } + return scope.isValid === undefined || scope.isValid; + } + + var ctrl = scope.form; + if (ctrl) { + ctrl = ctrl[name]; + } + if (ctrl) { + return ctrl.$valid; + } + return true; + } + + evalScope.$get = function(n) { + var context = this.$context || this.record || {}; + if (context.hasOwnProperty(n)) { + return context[n]; + } + return evalScope.$eval(n, context); + }; + evalScope.$moment = function(d) { return moment(d); }; // moment.js helper + evalScope.$number = function(d) { return +d; }; // number helper + evalScope.$popup = function() { return scope._isPopup; }; // popup detect + evalScope.$iif = function(c, t, f) { + console.warn('Use ternary operator instead of $iif() helper.'); + return c ? t : f; + }; + + evalScope.$sum = function (items, field, operation, field2) { + var total = 0; + if (items && items.length) { + items.forEach(function (item) { + var value = 0; + var value2 = 0; + if (field in item) { + value = +(item[field] || 0); + } + if (operation && field2 && field2 in item) { + value2 = +(item[field2] || 0); + switch (operation) { + case '*': + value = value * value2; + break; + case '/': + value = value2 ? value / value2 : value; + break; + case '+': + value = value + value2; + break; + case '-': + value = value - value2; + break; + } + } + if (value) { + total += value; + } + }); + } + return total; + }; + + // current user and group + evalScope.$user = axelor.config['user.login']; + evalScope.$group = axelor.config['user.group']; + evalScope.$userId = axelor.config['user.id']; + + evalScope.$contains = function(iter, item) { + if (iter && iter.indexOf) + return iter.indexOf(item) > -1; + return false; + }; + + // access json field values + evalScope.$json = function (name) { + var value = (scope.record || {})[name]; + if (value) { + return angular.fromJson(value); + } + }; + + evalScope.$readonly = scope.isReadonly ? _.bind(scope.isReadonly, scope) : angular.noop; + evalScope.$required = scope.isRequired ? _.bind(scope.isRequired, scope) : angular.noop; + + evalScope.$valid = function(name) { + return isValid(scope, name); + }; + + evalScope.$invalid = function(name) { + return !isValid(scope, name); + }; + + return evalScope; + }; + + axelor.$eval = function (scope, expr, context) { + if (!scope || !expr) { + return null; + } + + var evalScope = axelor.$evalScope(scope); + evalScope.$context = context; + try { + return evalScope.$eval(expr, context); + } finally { + evalScope.$destroy(); + evalScope = null; + } + }; + + axelor.$adjustSize = _.debounce(function () { + $(document).trigger('adjust:size'); + }, 100); + + var module = angular.module('axelor.app', ['axelor.ng', 'axelor.ds', 'axelor.ui', 'axelor.auth']); + + module.config(['$routeProvider', '$locationProvider', function($routeProvider, $locationProvider) { + var tabResource = { + action: 'main.tab', + controller: 'TabCtrl', + template: "" + }; + + $routeProvider + + .when('/preferences', { action: 'preferences' }) + .when('/about', { action: 'about' }) + .when('/system', { action: 'system' }) + .when('/', { action: 'main' }) + + .when('/ds/:resource', tabResource) + .when('/ds/:resource/:mode', tabResource) + .when('/ds/:resource/:mode/:state', tabResource) + + .otherwise({ redirectTo: '/' }); + }]); + + module.config(['$httpProvider', function(provider) { + + provider.useApplyAsync(true); + + var toString = Object.prototype.toString; + + function isFile(obj) { + return toString.call(obj) === '[object File]'; + } + + function isFormData(obj) { + return toString.call(obj) === '[object FormData]'; + } + + function isBlob(obj) { + return toString.call(obj) === '[object Blob]'; + } + + // restore old behavior + // breaking change (https://github.com/angular/angular.js/commit/c054288c9722875e3595e6e6162193e0fb67a251) + function jsonReplacer(key, value) { + if (typeof key === 'string' && key.charAt(0) === '$') { + return undefined; + } + return value; + } + + function transformRequest(d) { + return angular.isObject(d) && !isFile(d) && !isBlob(d) && !isFormData(d) ? JSON.stringify(d, jsonReplacer) : d; + } + + provider.interceptors.push('httpIndicator'); + provider.defaults.transformRequest.unshift(transformRequest); + provider.defaults.headers.common["X-Requested-With"] = 'XMLHttpRequest'; + provider.useApplyAsync(true); + }]); + + // only enable animation on element with ng-animate css class + module.config(['$animateProvider', function($animateProvider) { + $animateProvider.classNameFilter(/x-animate/); + }]); + + module.factory('httpIndicator', ['$rootScope', '$q', function($rootScope, $q){ + + var doc = $(document); + var body = $('body'); + var blocker = $('
') + .appendTo('body') + .hide() + .css({ + position: 'absolute', + zIndex: 100000, + width: '100%', height: '100%' + }); + + var spinner = $('
') + .append('
') + .append('
' + _t('Please wait...') + '
') + .appendTo(blocker); + + var blocked = false; + var blockedCounter = 0; + var blockedTimer = null; + var spinnerTime = 0; + + function block(callback) { + if (blocked) return true; + if (blockedTimer) { clearTimeout(blockedTimer); blockedTimer = null; } + if (loadingCounter > 0 || blockedCounter > 0) { + blocked = true; + doc.on("keydown.blockui mousedown.blockui", function(e) { + if ($('#loginWindow').is(':visible')) { + return; + } + e.preventDefault(); + e.stopPropagation(); + }); + body.css("cursor", "wait"); + blocker.show(); + } + unblock(callback); + return blocked; + } + + function unblock(callback) { + if (blockedTimer) { clearTimeout(blockedTimer); blockedTimer = null; } + if (loadingCounter > 0 || blockedCounter > 0 || loadingTimer) { + if (spinnerTime === 0) { + spinnerTime = moment(); + } + // show spinner after 5 seconds + if (moment().diff(spinnerTime, "seconds") > 5) { + blocker.addClass('wait'); + } + if (blockedCounter > 0) { + blockedCounter = blockedCounter - 10; + } + blockedTimer = _.delay(unblock, 200, callback); + return; + } + doc.off("keydown.blockui mousedown.blockui"); + body.css("cursor", ""); + blocker.removeClass('wait').hide(); + spinnerTime = 0; + if (callback) { + callback(blocked); + } + blocked = false; + } + + axelor.blockUI = function(callback, minimum) { + if (minimum && minimum > blockedCounter) { + blockedCounter = Math.max(0, blockedCounter); + blockedCounter = Math.max(minimum, blockedCounter); + } + return block(callback); + }; + + axelor.unblockUI = function() { + return unblock(); + }; + + function notSilent(config) { + return config && !config.silent; + } + + return { + request: function(config) { + if (notSilent(config)) { + onHttpStart(); + } + return config; + }, + response: function(response) { + if (notSilent(response.config)) { + onHttpStop(); + } + if (response.data) { + if (response.data.status === -1) { // STATUS_FAILURE + if (notSilent(response.config)) $rootScope.$broadcast('event:http-error', response.data); + return $q.reject(response); + } + if (response.data.status === -7) { // STATUS_LOGIN_REQUIRED + if (axelor.config['auth.central.client']) { + // redirect to central login page + window.location.href = './?client_name=' + axelor.config['auth.central.client'] + + "&hash_location=" + encodeURIComponent(window.location.hash); + } else if (notSilent(response.config)) { + // ajax login + $rootScope.$broadcast('event:auth-loginRequired', response.data); + } + return $q.reject(response); + } + } + return response; + }, + responseError: function(error) { + if (notSilent(error.config)) { + onHttpStop(); + $rootScope.$broadcast('event:http-error', error); + } + return $q.reject(error); + } + }; + }]); + + module.filter('unaccent', function() { + var source = 'ąàáäâãåæăćčĉęèéëêĝĥìíïîĵłľńňòóöőôõðøśșşšŝťțţŭùúüűûñÿýçżźž'; + var target = 'aaaaaaaaaccceeeeeghiiiijllnnoooooooossssstttuuuuuunyyczzz'; + + source += source.toUpperCase(); + target += target.toUpperCase(); + + var unaccent = function (text) { + return typeof(text) !== 'string' ? text : text.replace(/.{1}/g, function(c) { + var i = source.indexOf(c); + return i === -1 ? c : target[i]; + }); + }; + return function(input) { + return unaccent(input); + }; + }); + + module.filter('t', function(){ + return function(input) { + var t = _t || angular.nop; + return t(input); + }; + }); + + module.directive('translate', function(){ + return function(scope, element, attrs) { + var t = _t || angular.nop; + setTimeout(function(){ + element.html(t(element.text())); + }); + }; + }); + + module.controller('AppCtrl', AppCtrl); + + AppCtrl.$inject = ['$rootScope', '$exceptionHandler', '$scope', '$http', '$route', 'authService', 'MessageService', 'NavService']; + function AppCtrl($rootScope, $exceptionHandler, $scope, $http, $route, authService, MessageService, NavService) { + + function fetchConfig() { + return $http.get('ws/app/info').then(function(response) { + var config = _.extend(axelor.config, response.data); + $scope.$user.id = config["user.id"]; + $scope.$user.name = config["user.name"]; + $scope.$user.image = config["user.image"]; + config.DEV = config['application.mode'] == 'dev'; + config.PROD = config['application.mode'] == 'prod'; + + if (config['view.confirm.yes-no'] === true) { + _.extend(axelor.dialogs.config, { + yesNo: true + }); + } + }); + } + + function openHomeTab() { + var path = $scope.routePath; + var homeAction = axelor.config["user.action"]; + if (!homeAction || _.last(path) !== "main") { + return; + } + NavService.openTabByName(homeAction, { + __tab_prepend: true, + __tab_closable: false + }); + } + + // load app config + fetchConfig().then(function () { + openHomeTab(); + }); + + $scope.$user = {}; + $scope.$year = moment().year(); + $scope.openHomeTab = openHomeTab; + $scope.$unreadMailCount = function () { + return MessageService.unreadCount(); + }; + + $scope.showMailBox = function() { + NavService.openTabByName('mail.inbox'); + $scope.$timeout(function () { + $scope.$broadcast("on:nav-click", NavService.getSelected()); + }); + }; + + var loginAttempts = 0; + var loginWindow = null; + var errorWindow = null; + + function showLogin(hide) { + + if (loginWindow === null) { + loginWindow = $('#loginWindow') + .attr('title', _t('Log in')) + .dialog({ + dialogClass: 'no-close ui-dialog-responsive ui-dialog-small', + autoOpen: false, + modal: true, + position: "center", + width: "auto", + resizable: false, + closeOnEscape: false, + zIndex: 100001, + show: { + effect: 'fade', + duration: 300 + }, + buttons: [{ + text: _t("Log in"), + 'class': 'btn btn-primary', + click: function(){ + $scope.doLogin(); + } + }] + }); + + $('#loginWindow input').keypress(function(event){ + if (event.keyCode === 13) + $scope.doLogin(); + }); + } + return loginWindow.dialog(hide ? 'close' : 'open').height('auto'); + } + + function showError(hide) { + if (errorWindow === null) { + errorWindow = $('#errorWindow') + .attr('title', _t('Error')) + .dialog({ + dialogClass: 'ui-dialog-error ui-dialog-responsive', + draggable: true, + resizable: false, + closeOnEscape: true, + modal: true, + zIndex: 1100, + width: 420, + open: function(e, ui) { + setTimeout(function () { + if (errorWindow.dialog('isOpen')) { + errorWindow.dialog('moveToTop', true); + } + }, 300); + }, + close: function() { + $scope.httpError = {}; + $scope.$applyAsync(); + }, + show: { + effect: 'fade', + duration: 300 + }, + buttons: [{ + text: _t("Show Details"), + 'class': 'btn', + click: function(){ + var elem = $(this); + $scope.onErrorWindowShow('stacktrace'); + $scope.$applyAsync(function () { + setTimeout(function () { + var maxHeight = $(document).height() - 132; + var height = maxHeight; + if (height > elem[0].scrollHeight) { + height = elem[0].scrollHeight + 8; + } + elem.height(height); + elem.dialog('option', 'position', 'center'); + elem.dialog('widget').height(elem.dialog('widget').height()); + }, 100); + }); + } + }, { + text: _t("Close"), + 'class': 'btn btn-primary', + click: function() { + errorWindow.dialog('close'); + } + }] + }); + } + + return errorWindow + .dialog(hide ? 'close' : 'open') + .dialog('widget').css('top', 6) + .height('auto'); + } + + function showNotification(options) { + axelor.notify.error('

' + options.message.replace('\n', '
') + '

', { + title: options.title || options.type || _t('Error') + }); + } + + $scope.doLogin = function() { + + var data = { + username: $('#loginWindow form input:first').val(), + password: $('#loginWindow form input:last').val() + }; + + var last = axelor.config["user.login"]; + + $http.post('callback', data).then(function(response){ + authService.loginConfirmed(); + $('#loginWindow form input').val(''); + $('#loginWindow .alert').hide(); + if (last !== data.username) { + window.location.reload(); + } + }); + }; + + $scope.$on('event:auth-loginRequired', function(event, status) { + $('#loginWindow .alert').hide(); + showLogin(); + if (loginAttempts++ > 0) + $('#loginWindow .alert.login-failed').show(); + if (status === 0 || status === 502) + $('#loginWindow .alert.login-offline').show(); + setTimeout(function(){ + $('#loginWindow input:first').focus(); + }, 300); + }); + $scope.$on('event:auth-loginConfirmed', function() { + showLogin(true); + loginAttempts = 0; + fetchConfig(); + }); + + $scope.httpError = {}; + $scope.$on('event:http-error', function(event, data) { + var message = _t("Internal Server Error"), + report = data.data || data, stacktrace = null, cause = null, exception; + + // unauthorized errors are handled separately + if (data.status === 401) { + return; + } + + if (report.popup && report.message) { + return axelor.dialogs.box(report.message, { + title: report.title + }); + } else if (report.stacktrace) { + message = report.message || report.string; + exception = report['class'] || ''; + + if (exception.match(/(OptimisticLockException|StaleObjectStateException)/)) { + message = "" + _t('Concurrent updates error') + '
' + message; + } + + stacktrace = report.stacktrace; + cause = report.cause; + } else if (report.message) { + return showNotification(report); + } else if (_.isString(report)) { + stacktrace = report.replace(/.*|<\/body>.*/g, ''); + } else { + return; // no error report, so ignore + } + _.extend($scope.httpError, { + message: message, + stacktrace: stacktrace, + cause: cause + }); + showError(); + }); + $scope.onErrorWindowShow = function(what) { + $scope.httpError.show = what; + }; + + $scope.$on('$routeChangeSuccess', function(event, current, prev) { + + var route = current.$$route, + path = route && route.action ? route.action.split('.') : null; + + if (path) { + $scope.routePath = path; + } + }); + + $scope.routePath = ["main"]; + $route.reload(); + } + + //trigger adjustSize event on window resize --> + $(function(){ + $(window).resize(function(event){ + if (!event.isTrigger) { + $(document).trigger('adjust:size'); + } + $('body').toggleClass('device-small', axelor.device.small); + $('body').toggleClass('device-mobile', axelor.device.mobile); + }); + }); + +})(); diff --git a/sophal/js/axelor.auth.js b/sophal/js/axelor.auth.js new file mode 100644 index 0000000..691b011 --- /dev/null +++ b/sophal/js/axelor.auth.js @@ -0,0 +1,103 @@ +/* + * Axelor Business Solutions + * + * Copyright (C) 2005-2019 Axelor (). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +/** + * @license HTTP Auth Interceptor Module for AngularJS + * (c) 2012 Witold Szczerba + * License: MIT + */ +(function () { + +"use strict"; + +angular.module('axelor.auth', []).provider('authService', function() { + /** + * Holds all the requests which failed due to 401 response, + * so they can be re-requested in future, once login is completed. + */ + var buffer = []; + + /** + * Required by HTTP interceptor. + * Function is attached to provider to be invisible for regular users of this service. + */ + this.pushToBuffer = function(config, deferred) { + buffer.push({ + config: config, + deferred: deferred + }); + }; + + this.$get = ['$rootScope','$injector', function($rootScope, $injector) { + var $http; //initialized later because of circular dependency problem + function retry(config, deferred) { + setTimeout(axelor.blockUI); + $http = $http || $injector.get('$http'); + $http(config).then(function(response) { + deferred.resolve(response); + }); + } + function retryAll() { + for (var i = 0; i < buffer.length; ++i) { + retry(buffer[i].config, buffer[i].deferred); + } + buffer = []; + } + return { + loginConfirmed: function() { + $rootScope.$broadcast('event:auth-loginConfirmed'); + retryAll(); + } + }; + }]; +}) + +/** + * $http interceptor. + * On 401 response - it stores the request and broadcasts 'event:angular-auth-loginRequired'. + */ +.config(['$httpProvider', 'authServiceProvider', function($httpProvider, authServiceProvider) { + + $httpProvider.interceptors.push(['$rootScope', '$q', function($rootScope, $q) { + return { + responseError: function error(response) { + if (response.status === 401 && axelor.config['auth.central.client']) { + // redirect to central login page + window.location.href = './?client_name=' + axelor.config['auth.central.client'] + + "&hash_location=" + encodeURIComponent(window.location.hash); + return $q.reject(response); + } + if (response.status === 401 || response.status === 502 || (response.status === 0 && !response.data)) { + var deferred = $q.defer(); + authServiceProvider.pushToBuffer(response.config, deferred); + if (!response.config.silent) { + $rootScope.$broadcast('event:auth-loginRequired', response.status); + } + return deferred.promise; + } + // redirect to the CAS login page + if (response.status === 302 || response.status === 307) { + window.location.reload(); + } + // otherwise + return $q.reject(response); + } + }; + }]); +}]); + +})(); diff --git a/sophal/js/axelor.data.js b/sophal/js/axelor.data.js new file mode 100644 index 0000000..4dfbb7f --- /dev/null +++ b/sophal/js/axelor.data.js @@ -0,0 +1,1067 @@ +/* + * Axelor Business Solutions + * + * Copyright (C) 2005-2019 Axelor (). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +(function() { + + "use strict"; + + var extend = angular.extend, + isArray = angular.isArray, + isObject = angular.isObject, + forEach = angular.forEach, + push = [].push; + + var ds = angular.module('axelor.ds'); + + ds.factory('DataSource', ['$injector', '$rootScope', '$http', '$q', '$exceptionHandler', function($injector, $rootScope, $http, $q, $exceptionHandler) { + + function DataSource(model, options) { + + var opts = extend({ + limit : DataSource.DEFAULT_LIMIT, + domain : null, + context : null + }, options); + + this._model = model; + this._domain = opts.domain; + this._context = opts.context; + + this._filter = null; + this._sortBy = null; + this._lastDomain = null; + this._lastContext = null; + this._lastAction = null; + this._showArchived = opts.archived; + + if (opts.archived === undefined && _.has(opts.params || {}, 'showArchived')) { + this._showArchived = opts.params.showArchived; + } + + this._data = []; + + this._page = { + index : 0, + from : 0, + to : 0, + size : 0, + total : 0, + limit : opts.limit + }; + + this._listeners = {}; + } + + DataSource.DEFAULT_LIMIT = 40; + + DataSource.prototype = { + + constructor: DataSource, + + _http: $http, + + _request: function(action, id) { + var url = 'ws/rest/' + this._model; + if (id) url += '/' + id; + if (action) url += '/' + action; + + return { + get: function(data, config) { + return $http.get(url, data, config); + }, + post: function(data, config) { + return $http.post(url, data, config); + }, + send: function (config) { + return $http(_.extend({}, config, { + url: url + })); + } + }; + }, + + _new: function(model, options) { + return new DataSource(model, options); + }, + + on: function(name, listener) { + var listeners = this._listeners[name]; + if(!listeners){ + this._listeners[name] = listeners = []; + } + listeners.push(listener); + return function() { + var index = listeners.indexOf(listener); + if (index >= 0) + listeners.splice(index, 1); + return listener; + }; + }, + + trigger: function(name) { + var listeners = this._listeners[name] || [], + event = { + name : name, + target: this + }, + listenerArgs = [event]; + listenerArgs = listenerArgs.concat([].slice.call(arguments, 1)); + + forEach(listeners, function(listener) { + try { + listener.apply(null, listenerArgs); + } catch (e) { + $exceptionHandler(e); + } + }); + }, + + /** + * Check whether two objects are equal. + * + * It compares relational field values by it's id if version property + * is missing (assuming, they are not modified). + * + */ + equals: function(a, b) { + if (a === b) return true; + if (a === null || b === null) return false; + if (a !== a && b !== b) return true; // NaN === NaN + + function isWindow(obj) { + return obj && obj.document && obj.location && obj.alert && obj.setInterval; + } + + function isScope(obj) { + return obj && obj.$evalAsync && obj.$watch; + } + + function compact(obj) { + if (!obj || !_.isObject(obj)) return obj; + if (isScope(obj) || isWindow(obj)) return obj; + if (_.isArray(obj)) return _.map(obj, compact).sort(); + if (_.isDate(obj)) return obj; + if (obj.id > 0 && !obj.$dirty && !_.has(obj, "version")) { + return obj.id; + } + var res = {}; + _.each(obj, function(v, k) { + if (k.substring(0, 2) === '__') return; + if (k === 'selected') return; // selected is transient field + res[k] = compact(v); + }); + res.id = res.id || res.$id; // make sure to use dummy id + return res; + } + return angular.equals(compact(a), compact(b)); + }, + + /** + * Return the difference between two records. + * + * The relational fields are compared by it's id if version + * property is missing (assuming, the are not modified). + * + * @param {Object} a - source record + * @param {Object} b - original record + * + * @returns {Object} + */ + diff: function(a, b) { + if (a === b) return a; + if (a === null || b === null) return a; + if (!a && !b) return a; + if (!a.id || a.id < 1) return a; + var result = _.pick(a, 'id', 'version'), + that = this; + + _.each(a, function (value, key) { + if (!that.equals(value, b[key])) { + result[key] = value; + } + }); + + return result; + }, + + rpc: function(method, options) { + + var params = _.extend({ + model: this._model, + domain: this._domain, + context: this._lastContext + }, options); + + var promise = $http.post('ws/action/' + method, { + model : this._model, + data : params + }); + + promise.success = function(fn){ + promise.then(function(response){ + fn(response.data); + }); + return promise; + }; + + promise.error = function(fn){ + promise.then(null, fn); + return promise; + }; + + return promise; + }, + + // if search count is less than current page boundary, adjust the page and do search again + fixPage: function () { + var page = this._page; + if (page.from != 0 && page.total != 0 && page.from >= page.total) { + page.from = page.total - (page.total % page.limit); + page.from = page.from === page.total ? page.from - page.limit : page.from; + page.from = Math.max(0, page.from); + page.to = Math.min(page.from + page.limit, page.total); + return this.search(); + } + }, + + search: function(options) { + + var opts = _.extend({ + store: true + }, options); + + var limit = opts.limit === undefined ? this._page.limit : opts.limit; + var offset = opts.offset === undefined ? this._page.from : opts.offset; + var domain = opts.domain === undefined ? (this._lastDomain || this._domain) : opts.domain; + var context = opts.context === undefined ? (this._lastContext || this._context) : opts.context; + var action = opts.action === undefined ? this._lastAction : opts.action; + var archived = opts.archived === undefined ? this._showArchived : opts.archived; + + var fields = _.isEmpty(opts.fields) ? null : opts.fields; + var filter = opts.filter || this._filter; + var sortBy = opts.sortBy || this._sortBy; + + if (opts.store) { + this._filter = filter; + this._sortBy = sortBy; + this._lastDomain = domain; + this._lastContext = context; + this._lastAction = action; + + if (opts.archived !== undefined) { + this._showArchived = opts.archived; + } + } + + offset = offset || 0; + context = _.extend({}, this._context, context); + + //sophal + if(context._model != undefined){ + if(context._model =='com.axelor.apps.suppliermanagement.db.PurchaseOrderSupplierLine'){ + var limit = null ; + } + } + //sophal + + var query = extend({ + _domain: domain, + _domainContext: context, + _domainAction: action || undefined, + _archived: archived + }, filter); + + var that = this, + page = this._page, + records = this._data, + params = { + fields: fields, + sortBy: sortBy, + data: query, + limit: limit, + offset: offset, + parent: opts.parent + }; + + var promise = this._request('search').post(params); + + promise = promise.then(function(response){ + var res = response.data; + var length = (res.data||[]).length; + res.offset = offset; + res.data = _.unique(res.data, function (a) { return a.id; }); + + if (opts.store) { + that._accept(res); + page.index = -1; + } else { + records = res.data || []; + page = that._pageInfo(res); + } + + if (length !== page.size) { + page.total -= (length - page.size); + } + }); + promise.success = function(fn){ + promise.then(function(res){ + fn(records, page); + }); + return promise; + }; + promise.error = function(fn){ + promise.then(null, fn); + return promise; + }; + return promise; + }, + + at: function(index) { + return this._data[index]; + }, + + get: function(id) { + for (var i = 0; i < this._data.length; i++) { + if (this._data[i].id === id) { + return this._data[i]; + } + } + }, + + /** + * Read the object with the given id. + * + * If options are provided then POST request is used otherwise GET is used. + * @param id record id + * @param options request options + * @returns promise + */ + read: function(id, options) { + var promise, record; + if (options) { + promise = this._request('fetch', id).post({ + fields: options.fields, + related: options.related + }); + } else { + promise = this._request(null, id).get(); + } + + promise.then(function(response){ + var res = response.data; + record = res.data; + if (isArray(record)) { + record = record[0]; + } + }); + + promise.success = function(fn){ + promise.then(function(response){ + fn(record); + }); + return promise; + }; + promise.error = function(fn) { + promise.then(null, fn); + return promise; + }; + return promise; + }, + + // find followers of the given record + followers: function (id) { + var promise = this._request('followers', id).get(); + promise.success = function(fn) { + promise.then(function(res) { + fn(res.data); + }); + return promise; + }; + promise.error = function(fn) { + promise.then(null, fn); + return promise; + }; + return promise; + }, + + // find messages for the given record + messages: function (options) { + + var opts = _.extend({}, options); + var promise = this._request('messages').send({ + method: 'GET', + params: opts, + silent: opts.count ? true : undefined, + transformRequest: opts.count ? [] : undefined + }); + + promise.success = function(fn) { + promise.then(function(response) { + fn(response.data); + }); + return promise; + }; + promise.error = function(fn) { + promise.then(null, fn); + return promise; + }; + return promise; + }, + + messageCount: function (options) { + var opts = _.extend({}, options, { + count: true + }); + return this.messages(opts); + }, + + messagePost: function (id, text, options) { + + var opts = _.extend({}, options); + var data = _.extend({ + body : text, + subject: opts.subject, + type: opts.type, + parent: opts.parent, + files: opts.files, + recipients: opts.recipients + }); + + var promise = this._request('message', id).post({ + data: data + }); + + promise.success = function(fn) { + promise.then(function(response){ + fn(response.data); + }); + return promise; + }; + promise.error = function(fn) { + promise.then(null, fn); + return promise; + }; + return promise; + }, + + messageFollow: function (id, options) { + var opts = _.extend({}, options); + var promise = this._request('follow', id).post({ + data: opts.email + }); + + promise.success = function(fn) { + promise.then(function(response){ + fn(response.data); + }); + return promise; + }; + promise.error = function(fn) { + promise.then(null, fn); + return promise; + }; + return promise; + }, + + messageUnfollow: function (id, options) { + var opts = _.extend({}, options); + var promise = this._request('unfollow', id).post({ + records: opts.records + }); + + promise.success = function(fn) { + promise.then(function(response){ + fn(response.data); + }); + return promise; + }; + promise.error = function(fn) { + promise.then(null, fn); + return promise; + }; + return promise; + }, + + isPermitted: function(action, values) { + + var data = _.extend({}, { + id: values && values.id, + action: action + }); + var promise = this._request("perms").get({ + params: data + }); + promise.success = function(fn) { + promise.then(function(response){ + fn(response.data); + }); + return promise; + }; + promise.error = function(fn) { + promise.then(null, fn); + return promise; + }; + return promise; + }, + + verify: function(values) { + var promise = this._request("verify").post({ + data: values + }); + promise.success = function(fn) { + promise.then(function(response){ + fn(response.data); + }); + return promise; + }; + promise.error = function(fn) { + promise.then(null, fn); + return promise; + }; + return promise; + }, + + upload: function(values, field, file) { + var that = this, + page = this._page, + record = null, + deferred = $q.defer(), + promise = deferred.promise; + + var indicator = $injector.get('httpIndicator'); + promise = promise.then(indicator.response, indicator.responseError); + + var xhr = new XMLHttpRequest(); + var data = new FormData(); + var progress_cb = angular.noop; + + promise.then(function(response) { + var res = response.data; + res.data = res.data[0]; + record = that._accept(res); + }); + promise.progress = function(fn) { + progress_cb = fn; + return promise; + }; + promise.success = function(fn) { + promise.then(function(response) { + fn(record, page); + }); + return promise; + }; + promise.error = function(fn) { + promise.then(null, function(response){ + fn(response.data); + }); + return promise; + }; + + var request = { + data: values + }; + + data.append("file", file); + data.append("field", field); + data.append("request", angular.toJson(request)); + + xhr.upload.addEventListener("progress", function(e) { + var complete = Math.round(e.loaded * 100 / e.total); + progress_cb(complete); + }, false); + + _.each($http.defaults.transformRequest, function(tr) { + tr(data); + }); + + xhr.onerror = deferred.reject; + xhr.onabort = deferred.reject; + xhr.onload = function () { + var data = angular.fromJson(xhr.response || xhr.responseText); + var response = { + data: data, + status: xhr.status + }; + if (xhr.status == 200) { + deferred.resolve(response); + } else { + deferred.reject(response); + } + $rootScope.$applyAsync(); + }; + + xhr.open("POST", "ws/rest/" + this._model + "/upload", true); + xhr.send(data); + + return promise; + }, + + save: function(values) { + + var that = this, + page = this._page, + record, promise; + + if (values && values.$upload) { + var upload = values.$upload; + return this.upload(values, upload.field, upload.file); + } + + promise = this._request().post({ + data: values + }); + + promise.then(function(response){ + var res = response.data; + res.data = res.data[0]; + record = that._accept(res); + that.trigger('on:save', [values]); + $rootScope.$broadcast('ds:saved', that); + }); + + promise.success = function(fn) { + promise.then(function(response){ + fn(record, page); + }); + return promise; + }; + promise.error = function(fn) { + promise.then(null, fn); + return promise; + }; + + return promise; + }, + + saveAll: function(items, fields) { + + var that = this, + page = this._page, + records = this._data, + promise = this._request().post({ + fields: fields, + records: items + }); + + promise.then(function(response){ + var res = response.data; + _.each(res.data || [], function(item){ + var found = _.find(records, function(rec){ + if (rec.id === item.id) { + angular.copy(item, rec); + return true; + } + }); + if (!found) { + records.push(item); + page.total += 1; + page.size += 1; + } + }); + + var i = 0; + while(i < records.length) { + var rec = records[i]; + if (rec.id === 0) { + records.splice(i, 1); + break; + } + i ++; + } + + that.trigger('change', records, page); + that.trigger('on:save', items); + $rootScope.$broadcast('ds:saved', that); + }); + + promise.success = function(fn) { + promise.then(function(response){ + fn(records, page); + }); + return promise; + }; + promise.error = function(fn) { + promise.then(null, fn); + return promise; + }; + + return promise; + }, + + updateMass: function (values, ids) { + + var domain = this._lastDomain; + var context = this._lastContext; + var filter = this._filter; + + var items = _.compact(ids); + if (items.length > 0) { + if (domain) { + domain = domain + " AND self.id IN (:__ids__)"; + } else { + domain = "self.id IN (:__ids__)"; + } + context = _.extend({ + __ids__: items + }, context); + } + + var query = extend({ + _domain: domain, + _domainContext: context, + _archived: this._showArchived + }, filter); + + + + var promise = this._request('updateMass').post({ + records: [values], + sortBy: this._sortBy, + data: query + }); + + promise.success = function(fn) { + promise.then(function(response){ + var res = response.data; + fn(res); + }); + return promise; + }; + + promise.error = function(fn) { + promise.then(null, fn); + return promise; + }; + + return promise; + }, + + remove: function(record) { + + var that = this, + page = this._page, + records = this._data, + promise = this._request('remove', record.id).post({ + data: record + }); + + promise = promise.then(function(reponse){ + var index = -1; + for(var i = 0 ; i < records.length ; i++) { + if (records[i].id == record.id) { + index = i; + break; + } + } + if (index > -1) { + records.splice(index, 1); + page.total -= 1; + page.size -= 1; + } + + that.trigger('change', records, page); + that.trigger('on:remove', [record]); + $rootScope.$broadcast('ds:removed', that); + }); + + promise.success = function(fn) { + promise.then(function(response){ + fn(records, page); + }); + return promise; + }; + promise.error = function(fn) { + promise.then(null, fn); + return promise; + }; + + return promise; + }, + + removeAll: function(selection) { + + var that = this, + page = this._page, + records = this._data, + promise; + + selection = _.map(selection, function(record){ + return { "id" : record.id, "version": record.version }; + }); + + promise = this._request('removeAll').post({ + records: selection + }); + + promise = promise.then(function(response){ + var res = response.data; + function remove(id) { + var rec = _.find(records, function(record, i) { + return record.id == id; + }); + var index = _.indexOf(records, rec); + if (index > -1) { + records.splice(index, 1); + page.total -= 1; + page.size -= 1; + } + } + _.each(res.data, function(record) { + remove(record.id); + }); + that.trigger('change', records, page); + that.trigger('on:remove', selection); + $rootScope.$broadcast('ds:removed', that); + }); + + promise.success = function(fn) { + promise.then(function(response){ + fn(records, page); + }); + return promise; + }; + promise.error = function(fn) { + promise.then(null, fn); + return promise; + }; + + return promise; + }, + + copy: function(id) { + var promise = this._request('copy', id).get(); + promise.success = function(fn) { + promise.then(function(response){ + var res = response.data, + record = res.data; + if (isArray(record)) + record = record[0]; + fn(record); + }); + return promise; + }; + promise.error = function(fn) { + promise.then(null, fn); + return promise; + }; + return promise; + }, + + details: function(id, name) { + var promise = this._request('details', id).get({ + params: { + name: name + } + }); + promise.success = function(fn){ + promise.then(function(response){ + var res = response.data, + record = res.data; + if (isArray(record)) + record = record[0]; + fn(record); + }); + return promise; + }; + promise.error = function(fn) { + promise.then(null, fn); + return promise; + }; + return promise; + }, + + /** + * Get current page info. + * + */ + page: function() { + return this._page; + }, + + next: function(fields) { + var page = this._page; + return this.search({ + offset: page.from + page.limit, + fields: fields + }); + }, + + prev: function(fields) { + var page = this._page; + return this.search({ + offset: Math.max(0, page.from - page.limit), + fields: fields + }); + }, + + nextItem: function(success) { + var self = this, + page = this._page, + index = page.index + 1, + record = this.at(index); + + if (index < page.size) { + page.index = index; + return success(record); + } + + this.next().success(function(){ + page.index = 0; + record = self.at(0); + success(record); + }); + }, + + prevItem: function(success) { + var self = this, + page = this._page, + index = page.index - 1, + record = this.at(index); + + if (index > -1) { + page.index = index; + return success(record); + } + + this.prev().success(function(){ + page.index = page.size - 1; + record = self.at(page.index); + success(record); + }); + }, + + canNext: function() { + var page = this._page; + return page.to < page.total; + }, + + canPrev: function() { + var page = this._page; + return page.from > 0; + }, + + _pageInfo: function(res) { + var records = res.data || []; + var page = _.extend({}, this._page); + + page.from = res.offset === undefined ? page.from : res.offset; + page.to = page.from + records.length; + page.total = res.total === undefined ? page.total : res.total; + page.size = records.length; + + return page; + }, + + _accept: function(res) { + var page = this._page, + records = this._data, + data = res.data, + accepted = null; + + if (isArray(data)) { + + records.length = 0; + forEach(data, function(record){ + records.push(record); + }); + + _.extend(page, this._pageInfo(res)); + + accepted = records; + + } else if (isObject(data)) { + + var record = data; + var index = -1; + + for(var i = 0 ; i < records.length ; i++) { + if (records[i].id === data.id) { + index = i; + break; + } + } + + if (index > -1) { + var old = records.splice(index, 1, data)[0]; + _.each(old, function (value, key) { + if (key.indexOf('.') > -1 && !data.hasOwnProperty(key)) { + data[key] = value; + } + }); + } else { + records.push(record); + page.total += 1; + page.size += 1; + page.index = page.size - 1; + } + + accepted = record; + } + + this.trigger('change', records, page); + + return accepted; + }, + + export_: function(fields) { + var domain = this._lastDomain || this._domain; + var context = this._lastContext; + var filter = this._filter; + var action = this._lastAction; + + var query = extend({ + _domain: domain, + _domainContext: context, + _domainAction: action || undefined, + _archived: this._showArchived + }, filter); + + var params = { + fields: fields, + data: query, + sortBy: this._sortBy + }; + + var promise = this._request('export').post(params); + + promise.success = function(fn){ + promise.then(function(response){ + var res = response.data, + records = res.data; + fn(records); + }); + return promise; + }; + promise.error = function(fn) { + promise.then(null, fn); + return promise; + }; + return promise; + } + }; + + return { + create: create + }; + + function create(model, options) { + return new DataSource(model, options); + } + + }]); + +})(); diff --git a/sophal/js/axelor.ds.js b/sophal/js/axelor.ds.js new file mode 100644 index 0000000..ad0be0b --- /dev/null +++ b/sophal/js/axelor.ds.js @@ -0,0 +1,851 @@ +/* + * Axelor Business Solutions + * + * Copyright (C) 2005-2019 Axelor (). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +(function() { + + "use strict"; + + var ds = angular.module('axelor.ds', ['ngResource']); + + var forEach = angular.forEach, + extend = angular.extend, + isArray = angular.isArray; + + ds.factory('MenuService', ['$http', function($http) { + + function get(parent) { + + return $http.get('ws/action/menu', { + cache: true, + params : { + parent : parent + } + }); + } + + function all() { + return $http.get('ws/action/menu/all', { + cache: true + }); + } + + function tags() { + return $http.get('ws/action/menu/tags', { + silent: true, + transformRequest: [] + }); + } + + function action(name, options) { + + return $http.post('ws/action/' + name, { + model : 'com.axelor.meta.db.MetaAction', + data : options + }); + } + + return { + get: get, + all: all, + tags: tags, + action: action + }; + }]); + + ds.factory('TagService', ['$q', '$timeout', '$rootScope', 'MenuService', function($q, $timeout, $rootScope, MenuService) { + + var POLL_INTERVAL = 10000; + + var pollResult = {}; + var pollPromise = null; + var pollIdle = null; + + var listeners = []; + + function cancelPolling() { + if (pollPromise) { + $timeout.cancel(pollPromise); + pollPromise = null; + } + if (pollIdle) { + clearTimeout(pollIdle); + pollIdle = null; + } + } + + function startPolling() { + if (pollPromise === null) { + findTags(); + } + } + + var starting = false; + function findTags() { + if (starting) { return; } + if (pollPromise) { + $timeout.cancel(pollPromise); + } + starting = true; + MenuService.tags().success(function (res) { + var data = _.first(res.data); + var values = data.values; + for (var i = 0; i < listeners.length; i++) { + listeners[i](values); + } + pollPromise = $timeout(findTags, POLL_INTERVAL); + if (pollIdle === null) { + pollIdle = setTimeout(cancelPolling, POLL_INTERVAL * 2); + } + starting = false; + }); + } + + window.addEventListener("mousemove", startPolling, false); + window.addEventListener("mousedown", startPolling, false); + window.addEventListener("keypress", startPolling, false); + window.addEventListener("DOMMouseScroll", startPolling, false); + window.addEventListener("mousewheel", startPolling, false); + window.addEventListener("touchmove", startPolling, false); + window.addEventListener("MSPointerMove", startPolling, false); + + // start polling + startPolling(); + + return { + find: findTags, + listen: function(listener) { + listeners.push(listener); + return function () { + var i = listeners.indexOf(listener); + if (i >= 0) { + listeners.splice(i, 1); + } + return listener; + }; + } + }; + }]); + + ds.factory('ViewService', ['$http', '$q', '$cacheFactory', '$compile', function($http, $q, $cacheFactory, $compile) { + + var ViewService = function() { + + }; + + ViewService.prototype.accept = function(params) { + var views = {}; + forEach(params.views, function(view){ + var type = view.type || view.viewType; + params.viewType = params.viewType || type; + views[type] = extend({}, view, { + deferred: $q.defer() + }); + }); + return views; + }; + + ViewService.prototype.compile = function(template) { + return $compile(template); + }; + + ViewService.prototype.process = function(meta, view, parent) { + + var fields = {}; + + meta = meta || {}; + view = view || {}; + + if (meta.jsonAttrs && view && view.items) { + if (view.type === 'grid') { + view.items = (function (items) { + var button = _.findWhere(items, { type: 'button' }); + var index = items.indexOf(button); + if (index < 0) { + index = items.length; + } + items.splice(index, 0, { + type: 'field', + name: 'attrs', + jsonFields: meta.jsonAttrs + }); + return items; + })(view.items); + } + if (view.type === 'form') { + view.items.push({ + type: 'panel', + title: _t('Attributes'), + itemSpan: 12, + items: [{ + type: 'field', + name: 'attrs', + jsonFields: meta.jsonAttrs + }] + }); + } + } + + view = processJsonForm(view); + meta.fields = processFields(meta.fields); + + (function () { + var helps = meta.helps = meta.helps || {}; + var items = []; + + if (view.helpOverride && view.helpOverride.length) { + helps = _.groupBy(view.helpOverride || [], 'type'); + helps = meta.helps = _.object(_.map(helps, function(items, key) { + return [key, _.reduce(items, function(memo, item) { + memo[item.field] = item; + return memo; + }, {})]; + })); + + if (helps.tooltip && helps.tooltip.__top__) { + view.help = helps.tooltip.__top__.help; + } + } + + var help = helps.tooltip || {}; + var placeholder = helps.placeholder || {}; + var inline = helps.inline || {}; + + forEach(view.items, function (item) { + if (help[item.name]) { + item.help = help[item.name].help; + } + if (meta.view && meta.view.type === 'form') { + if (placeholder[item.name]) { + item.placeholder = placeholder[item.name].help; + } + if (inline[item.name] && !inline[item.name].used) { + inline[item.name].used = true; + items.push({ + type: 'help', + text: inline[item.name].help, + css: inline[item.name].style, + colSpan: 12 + }); + } + } + items.push(item); + }); + + forEach(view.toolbar, function (item) { + if (help[item.name]) { + item.help = help[item.name].help; + } + }); + + if (items.length) { + view.items = items; + } + })(); + + forEach(view.items || view.pages, function(item) { + processWidget(item); + processSelection(item); + forEach(fields[item.name], function(value, key){ + if (!item.hasOwnProperty(key)) { + item[key] = value; + } + }); + + ["canNew", "canView", "canEdit", "canRemove", "canSelect"].forEach(function (name) { + if (item[name] === "false" || item[name] === "true") { + item[name] = item[name] === "true"; + } + }); + + if (item.items || item.pages) { + ViewService.prototype.process(meta, item, view); + } + if (item.password) { + item.widget = "password"; + } + if (item.jsonFields && item.widget !== 'json-raw') { + var editor = { + layout: view.type === 'panel-json' ? 'table' : undefined, + flexbox: true, + items: [], + }; + var panel = null; + var panelTab = null; + item.jsonFields.sort(function (x, y) { return x.sequence - y.sequence; }); + item.jsonFields.forEach(function (field) { + if (field.widgetAttrs) { + field.widgetAttrs = angular.fromJson(field.widgetAttrs); + processWidget(field); + if (field.widgetAttrs.showTitle !== undefined) { + field.showTitle = field.widgetAttrs.showTitle; + } + if (field.widgetAttrs.multiline) { + field.type = 'text'; + } + if (field.widgetAttrs.targetName) { + field.targetName = field.widgetAttrs.targetName; + } + } + if (field.type === 'panel' || field.type === 'separator') { + field.visibleInGrid = false; + } + if (field.type === 'panel') { + panel = _.extend({}, field, { items: [] }); + if ((field.widgetAttrs || {}).sidebar && parent) { + panel.sidebar = true; + parent.width = 'large'; + } + if ((field.widgetAttrs || {}).tab) { + panelTab = panelTab || { + type: 'panel-tabs', + colSpan: 12, + items: [] + }; + panelTab.items.push(panel); + } else { + editor.items.push(panel); + } + return; + } + if (field.type !== 'separator') { + field.title = field.title || field.autoTitle; + } + var colSpan = (field.widgetAttrs||{}).colSpan || field.colSpan; + if (field.type == 'one-to-many') { + field.type = 'many-to-many'; + field.canSelect = false; + } + if (field.type == 'separator' || (field.type == 'many-to-many' && !field.widget)) { + field.showTitle = false; + field.colSpan = colSpan || 12; + } + if (panel) { + panel.items.push(field); + } else { + editor.items.push(field); + } + }); + + if (panelTab) { + editor.items.push(panelTab); + } + + item.widget = 'json-field'; + item.editor = editor; + if (!item.viewer) { + item.editor.viewer = true; + } + } + }); + + // include json fields in grid + if (view.type === 'grid') { + var items = []; + _.each(view.items, function (item) { + if (item.jsonFields) { + _.each(item.jsonFields, function (field) { + var type = field.type || 'text'; + if (type.indexOf('-to-many') === -1 && field.visibleInGrid) { + items.push(_.extend({}, field, { name: item.name + '.' + field.name })); + } + }); + } else { + items.push(item); + } + }); + items = items.sort(function (x, y) { return x.columnSequence - y.columnSequence; }); + view.items = items; + } + }; + + function processJsonForm(view) { + if (view.type !== 'form') return view; + if (view.model !== 'com.axelor.meta.db.MetaJsonRecord') return view; + + var panel = _.first(view.items) || {}; + var jsonField = _.first(panel.items) || {}; + var jsonFields = jsonField.jsonFields || []; + + var first = _.first(jsonFields) || {}; + if (first.type === 'panel') { + panel.type = 'panel-json'; + if (first.widgetAttrs) { + var attrs = angular.fromJson(first.widgetAttrs); + view.width = view.width || attrs.width; + } + } + + return view; + } + + function processFields(fields) { + var result = {}; + if (isArray(fields)) { + forEach(fields, function(field){ + field.type = _.chain(field.type || 'string').underscored().dasherize().value(); + field.title = field.title || field.autoTitle; + result[field.name] = field; + // if nested field then make it readonly + if (field.name.indexOf('.') > -1) { + field.readonly = true; + field.required = false; + } + processSelection(field); + }); + } else { + result = fields || {}; + } + return result; + } + + function processSelection(field) { + _.each(field.selectionList, function (item) { + if (_.isString(item.data)) { + item.data = angular.fromJson(item.data); + } + }); + } + + function processWidget(field) { + var attrs = {}; + _.each(field.widgetAttrs || {}, function (value, name) { + if (value === "true") value = true; + if (value === "false") value = false; + if (value === "null") value = null; + if (/^(-)?\d+$/.test(value)) value = +(value); + attrs[_.str.camelize(name)] = value; + }); + if (field.serverType) { + field.serverType = _.chain(field.serverType).underscored().dasherize().value(); + } + field.widgetAttrs = attrs; + } + + function useIncluded(view) { + + function useMenubar(menubar) { + if (!menubar) return; + var my = view.menubar || menubar; + if (my !== menubar && menubar) { + my = my.concat(menubar); + } + view.menubar = my; + } + function useToolbar(toolbar) { + if (!toolbar) return; + var my = view.toolbar || toolbar; + if (my !== toolbar) { + my = my.concat(toolbar); + } + view.toolbar = my; + } + function useItems(view) { + return useIncluded(view); + } + + var items = []; + + _.each(view.items, function(item) { + if (item.type === "include") { + if (item.view) { + items = items.concat(useItems(item.view)); + useMenubar(item.view.menubar); + useToolbar(item.view.toolbar); + } + } else { + items.push(item); + } + }); + return items; + } + + function findFields(view, res) { + var result = res || { + fields: [], + related: {} + }; + var items = result.fields; + var fields = view.items || view.pages; + + if (!fields) return items; + if (view.items && !view._included) { + view._included = true; + fields = view.items = useIncluded(view); + } + + function acceptEditor(item) { + var collect = items; + var editor = item.editor; + if (item.target) { + collect = result.related[item.name] || (result.related[item.name] = []); + } + if (editor.fields) { + editor.fields = processFields(editor.fields); + } + var acceptItems = function (items) { + _.each(items, function (child) { + if (child.name && collect.indexOf(child.name) === -1 && child.type === 'field') { + collect.push(child.name); + } else if (child.type === 'panel') { + acceptItems(child.items); + } + if (/RefSelect|ref-select/.test(child.widget)) { + collect.push(child.related); + } + if (child.depends) { + child.depends.split(/\s*,\s*/).forEach(function (name) { + collect.push(name); + }); + } + }); + }; + acceptItems(editor.items); + } + + function acceptViewer(item) { + var collect = items; + var viewer = item.viewer; + if (item.target) { + collect = result.related[item.name] || (result.related[item.name] = []); + } + _.each(viewer.fields, function (item) { + collect.push(item.name); + }); + if (viewer.fields) { + viewer.fields = processFields(viewer.fields); + } + } + + _.each(fields, function(item) { + if (item.editor) acceptEditor(item); + if (item.viewer) acceptViewer(item); + if (item.type === 'panel-related') { + items.push(item.name); + } else if (item.items || item.pages) { + findFields(item, result); + } else if (item.type === 'field') { + items.push(item.name); + } + }); + + if (view.type === "calendar") { + items.push(view.eventStart); + items.push(view.eventStop); + items.push(view.colorBy); + } + if (view.type === "kanban") { + items.push(view.columnBy); + items.push(view.sequenceBy); + } + + if (view.type === "gantt") { + items.push(view.taskUser); + } + + return result; + } + + var viewCache = $cacheFactory("viewCache", { capacity: 1000 }); + + function createStore(prefix) { + var toKey = function (name) { + return prefix + ':' + axelor.config['user.id'] + ':' + name; + }; + return { + get: function (name) { + return new $q(function (resolve) { + resolve(angular.copy(viewCache.get(toKey(name)))); + }); + }, + set: function (name, value) { + if (value) { + return new $q(function (resolve) { + var val = viewCache.put(toKey(name), angular.copy(value)); + resolve(val); + }); + } + return $q.resolve(value); + } + }; + } + + var PENDING_REQUESTS = {}; + + var FIELDS = createStore('f'); + var VIEWS = createStore('v'); + var PERMS = createStore('p'); + + ViewService.prototype.getMetaDef = function(model, view, context) { + var self = this; + var deferred = $q.defer(); + var promise = deferred.promise; + + promise.success = function(fn) { + promise.then(function(res) { + fn(res.fields, res.view); + }); + return promise; + }; + + function process(data) { + data.view.perms = data.view.perms || data.perms; + self.process(data, data.view); + + if (data.perms && data.perms.write === false) { + data.view.editable = false; + } + + return data; + } + + function updateFields(fetched) { + return FIELDS.get(model).then(function (current) { + current = current || {}; + if (current !== fetched.fields) { + _.extend(current, _.object(_.pluck(fetched.fields, 'name'), fetched.fields)); + } + return $q.all([FIELDS.set(model, current), PERMS.set(model, fetched.perms)]); + }); + } + + function fetchFields(data) { + var fields_data = findFields(data.view); + var fields = _.unique(_.compact(fields_data.fields.sort())); + + data.related = fields_data.related; + + if (_.isArray(data.fields) && data.fields.length > 0) { + updateFields(data).then(function () { + deferred.resolve(process(data)); + }); + return promise; + } + if (!model || _.isEmpty(fields)) { + deferred.resolve(data); + return promise; + } + + function resolve(fetched) { + return updateFields(fetched).then(function (res) { + var current = res[0]; + var perms = res[1]; + var result = _.extend({}, fetched, { + fields: _.map(fields, function(n) { return current[n]; }), + perms: perms + }); + + result.view = data.view || view; + result.fields = _.compact(result.fields); + result.related = data.related; + result = process(result); + + deferred.resolve(result); + return promise; + }); + } + + $q.all([FIELDS.get(model), PERMS.get(model)]).then(function (res) { + var fetchedFields = res[0] || {}; + var pendingFields = _.filter(fields, function (n) { return !fetchedFields.hasOwnProperty(n); }); + if (pendingFields.length == 0) { + resolve({ + fields: _.values(fetchedFields), + perms: res[1] + }); + return promise; + } + + var key = _.flatten([model, pendingFields]).join(); + var pending = PENDING_REQUESTS[key]; + + function clear() { + delete PENDING_REQUESTS[key]; + } + + if (pending) { + pending.then(clear, clear); + pending.then(function (response) { + resolve((response.data || {}).data); + }); + return promise; + } + + pending = $http.post('ws/meta/view/fields', { model: model, fields: pendingFields }).then(function (response) { + resolve((response.data || {}).data); + }); + + pending.then(clear, clear); + PENDING_REQUESTS[key] = pending; + }); + return promise; + } + + function fetchView() { + var key = [model, view.type, view.name].join(':'); + + function resolve(response) { + var result = (response.data || {}).data; + if (!result || !result.view) { + return deferred.reject('view not found', view); + } + if (result.searchForm) { + result.view.searchForm = result.searchForm; + } + + if (_.isArray(result.view.items)) { + var fieldsPromise = fetchFields(result, key); + if (!_.isArray(view.items)) { + // only cache fetched views + return fieldsPromise.then(function (res) { + return VIEWS.set(key, _.extend({}, res, { view: result.view })); + }); + } + return fieldsPromise; + } + + result = { + fields: result.view.items, + view: result.view + }; + + VIEWS.set(key, result).then(function () { + deferred.resolve(result); + }); + } + + VIEWS.get(key).then(function (loaded) { + if (loaded) { + return deferred.resolve(loaded); + } + + function clear() { + delete PENDING_REQUESTS[key]; + } + + var pending = PENDING_REQUESTS[key]; + if (pending) { + pending.then(clear, clear); + return pending.then(resolve); + } + + pending = $http.post('ws/meta/view', { + model: model, + data: { + type: view.type, + name: view.name, + context: context + } + }); + + pending.then(resolve); + + pending.then(clear, clear); + PENDING_REQUESTS[key] = pending; + }); + + return promise; + } + + if (_.isArray(view.items)) { + return fetchFields({ view: view, fields: view.fields }); + } + return fetchView(); + }; + + ViewService.prototype.defer = function() { + return $q.defer(); + }; + + ViewService.prototype.action = function(action, model, context, data) { + + var params = { + model: model, + action: action, + data: data || { + context: _.extend({ _model: model }, context) + } + }; + + var promise = $http.post('ws/action', params); + promise.success = function(fn) { + promise.then(function(response){ + fn(response.data); + }); + return promise; + }; + promise.error = function(fn) { + promise.then(null, fn); + return promise; + }; + + return promise; + }; + + ViewService.prototype.getFields = function(model, jsonModel) { + + var that = this, + promise = $http.get('ws/meta/fields/' + model, { + cache: true, + params: jsonModel ? { + jsonModel: jsonModel + } : undefined + }); + + promise.success = function(fn) { + promise.then(function(response) { + var res = response.data, + data = res.data; + that.process(data); + fn(data.fields, data.jsonFields); + }); + return promise; + }; + + promise.error = function(fn) { + promise.then(null, fn); + return promise; + }; + + return promise; + }; + + ViewService.prototype.save = function(schema) { + var promise = $http.post("ws/meta/view/save", { + data: schema + }); + + promise.success = function(fn) { + promise.then(function(response) { + var res = response.data, + data = res.data; + fn(data); + }); + return promise; + }; + + promise.error = function(fn) { + promise.then(null, fn); + return promise; + }; + + return promise; + }; + + return new ViewService(); + }]); + +})(); diff --git a/sophal/js/axelor.nav.js b/sophal/js/axelor.nav.js new file mode 100644 index 0000000..931824c --- /dev/null +++ b/sophal/js/axelor.nav.js @@ -0,0 +1,609 @@ +/* + * Axelor Business Solutions + * + * Copyright (C) 2005-2019 Axelor (). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +(function() { + +"use strict"; + +var app = angular.module("axelor.app"); + +function useSingleTabOnly() { + return axelor.device.mobile + || !!axelor.config['view.single.tab'] + || axelor.config['user.singleTab'] + || +(axelor.config["view.tabs.max"]) === 0 + || +(axelor.config["view.tabs.max"]) === 1; +} + +app.factory('NavService', ['$location', 'MenuService', function($location, MenuService) { + + var tabs = []; + var popups = []; + var selected = null; + + var VIEW_TYPES = { + 'list' : 'grid', + 'edit' : 'form' + }; + + function findTab(key) { + return _.find(tabs, function(tab){ + return tab.action == key; + }); + } + + function findTabTitle(tab) { + var first; + if (tab.title) { + return tab.title; + } + first = _.first(tab.views); + if (first) { + return first.title || first.name; + } + return tab.name || "Unknown"; + } + + function openView(view, options) { + if (view && (view.type || view.viewType) == 'html') { + var first = _.first(view.views) || view; + view.views = [{ + name: first.name, + resource: first.resource, + title: first.title, + type: 'html' + }]; + if ((view.params||{}).target === "_blank") { + var url = first.name || first.resource; + return setTimeout(function () { + window.open(url); + }); + } + } + + var closable = options && options.__tab_closable; + if (!closable && view.params && view.params.closable !== undefined) { + closable = view.params.closable; + } + + view.closable = closable; + + openTab(view, options); + } + + function openTabByName(name, options) { + + var tab = findTab(name); + if (tab) { + return openTab(tab, options); + } + + return MenuService.action(name).success(function(result){ + if (!result.data) { + return; + } + var view = result.data[0].view; + view.action = name; + return openView(view, options); + }); + } + + function openTabAsPopup(tab, options) { + popups.push(tab); + } + + function openTab(tab, options) { + + if (tab && tab.$popupParent) { + return openTabAsPopup(tab, options); + } + + options = options || tab.options; + + if (options && options.mode) { + tab.viewType = VIEW_TYPES[options.mode] || options.mode; + } + + tab.options = options; + tab.title = tab.title || findTabTitle(tab); + + if (tab.action && MenuService.updateTabStyle) { + MenuService.updateTabStyle(tab); + } + + function __doSelect(found) { + + var lastScope = (selected||{}).$viewScope || {}; + if (lastScope.$locationChangeOff) { + lastScope.$locationChangeOff(); + } + + found.selected = true; + selected = found; + + if (options && tab.$viewScope) { + var view = tab.$viewScope._views[tab.viewType], + promise = view ? view.deferred.promise : null; + if (promise) { + promise.then(function(viewScope) { + viewScope.setRouteOptions(options); + }); + } + } + + setTimeout(function(){ + axelor.$adjustSize(); + }); + } + + function __singleShow(found) { + tabs.length = 0; + tabs.push(found); + return __doSelect(found); + } + + var found = findTab(tab.action); + + if (useSingleTabOnly()) { + + if (found) { + return __singleShow(found); + } + + var last = _.last(tabs); + if (last) { + return closeTab(last, function () { + __singleShow(tab); + }); + } + return __singleShow(tab); + } + + if (!found) { + found = tab; + __closeUnusedTabs(); + if (options && options.__tab_prepend) { + tabs.unshift(tab); + } else { + tabs.push(tab); + } + } + + _.each(tabs, function(tab) { + tab.selected = false; + }); + + return __doSelect(found); + } + + var MAX_TABS; + + function __closeUnusedTabs() { + if (MAX_TABS === undefined) { + MAX_TABS = +(axelor.config["view.tabs.max"]) || -1; + } + if (MAX_TABS <= 0 || tabs.length < MAX_TABS) { + return; + } + + var all = _.filter(tabs, function (tab) { + return !tab.selected && canCloseTab(tab); + }); + var doClose = function doClose(tab) { + var index = _.indexOf(tabs, tab); + var vs = tab.$viewScope; + if (vs && vs.isDirty && vs.isDirty()) return; + if (vs && vs.$details && vs.$details.isDirty && vs.$details.isDirty()) return; + tabs.splice(index, 1); + }; + + for (var i = 0; i < all.length; i++) { + doClose(all[i]); + if (tabs.length === 0) selected = null; + if (tabs.length < MAX_TABS) break; + } + } + + function __closeTab(tab, callback) { + + var all = tab.$popupParent ? popups : tabs; + var index = _.indexOf(all, tab); + + // remove tab + all.splice(index, 1); + + if (tabs.length === 0) { + selected = null; + } + if (_.isFunction(callback)) { + callback(); + } + if (tab.$popupParent) { + return; + } + + if (tab.selected) { + if (index == tabs.length) + index -= 1; + _.each(all, function(tab){ + tab.selected = false; + }); + var select = all[index]; + if (select) { + select.selected = true; + openTab(select); + } else { + $location.path('/'); + } + } + } + + function canCloseTab(tab) { + return tab.closable === undefined ? true : tab.closable; + } + + function closeTab(tab, callback) { + var viewScope = tab.$viewScope; + if (viewScope && viewScope.confirmDirty) { + viewScope.confirmDirty(function(){ + __closeTab(tab, callback); + }); + } else { + __closeTab(tab, callback); + } + } + + function closeTabs(selection) { + var all = _.flatten([selection], true); + + function select(tab) { + if (!tab.selected) { + tab.selected = true; + openTab(tab); + } + } + + function close(tab, ignore) { + var at = tabs.indexOf(tab); + if (at > -1) { + tabs.splice(at, 1); + } + closeTabs(_.difference(selection, [ignore, tab])); + if (tabs.length === 0) { + selected = null; + } + } + + function doConfirm(tab, viewScope) { + return viewScope.confirmDirty(function(){ + return close(tab); + }, function() { + close(null, tab); + viewScope.$applyAsync(); + }); + } + + for (var i = 0; i < all.length; i++) { + var tab = all[i]; + var viewScope = tab.$viewScope; + if (viewScope && viewScope.confirmDirty) { + select(tab); + return doConfirm(tab, viewScope); + } + return close(tab); + } + + if (tabs.indexOf(selected) == -1) { + selected = null; + } + + if (selected) { + return openTab(selected); + } + + var first = _.first(tabs); + if (first && !first.selected) { + return openTab(first); + } + + axelor.$adjustSize(); + } + + function closeTabOthers(current) { + var rest = _.filter(tabs, function(tab) { + return canCloseTab(tab) && tab !== current; + }); + if (current && !current.selected) { + current.selected = true; + openTab(current); + } + return closeTabs(rest); + } + + function closeTabAll() { + closeTabOthers(); + } + + function reloadTab(current) { + var viewScope = current.$viewScope; + if (viewScope) { + viewScope.$broadcast('on:tab-reload', current); + } + } + + function getTabs() { + return tabs; + } + + function getPopups() { + return popups; + } + + function getSelected() { + return selected; + } + + return { + openTabByName: openTabByName, + openTab: openTab, + openView: openView, + canCloseTab: canCloseTab, + reloadTab: reloadTab, + closeTab: closeTab, + closeTabOthers: closeTabOthers, + closeTabAll: closeTabAll, + getTabs: getTabs, + getPopups: getPopups, + getSelected: getSelected + }; +}]); + +NavCtrl.$inject = ['$scope', '$rootScope', '$location', 'NavService']; +function NavCtrl($scope, $rootScope, $location, NavService) { + + $scope.singleTabOnly = useSingleTabOnly(); + + Object.defineProperty($scope, '$location', { + get: function() { + return $location; + } + }); + + Object.defineProperty($scope, 'navTabs', { + get: function() { + return NavService.getTabs(); + } + }); + + Object.defineProperty($scope, 'navPopups', { + get: function() { + return NavService.getPopups(); + } + }); + + Object.defineProperty($scope, 'selectedTab', { + get: function() { + return NavService.getSelected(); + } + }); + + $scope.hasNabPopups = function () { + return $scope.navPopups && $scope.navPopups.length > 0; + }; + + $scope.menuClick = function(event, record) { + + if (!record.action) { + return; + } + + if (axelor.device.small) { + $("#offcanvas").removeClass("active"); + } + + $scope.openTabByName(record.action); + $scope.$applyAsync(); + }; + + $scope.navClick = function(tab) { + $scope.openTab(tab); + $scope.$broadcast("on:nav-click", tab); + }; + + $scope.$on("on:update-route", update); + + function update(event) { + + var tab = $scope.selectedTab, + scope = event.targetScope; + + if (!tab || !tab.action || scope !== tab.$viewScope || !scope.getRouteOptions) { + return; + } + if (tab.action.indexOf('$act') > -1) { + return; + } + + var path = tab.action, + opts = scope.getRouteOptions(), + mode = opts.mode, + args = opts.args; + + path = "/ds/" + path + "/" + mode; + args = _.filter(args, function(arg) { + return _.isNumber(args) || arg; + }); + + if (args.length) { + path += "/" + args.join("/"); + } + + if ($location.$$path !== path) { + $location.path(path); + $location.search(opts.query || ""); + } + } + + $scope.canCloseTab = function(tab) { + return NavService.canCloseTab(tab); + }; + + $scope.openTab = function(tab, options) { + return NavService.openTab(tab, options); + }; + + $scope.openTabByName = function(name, options) { + return NavService.openTabByName(name, options); + }; + + $scope.closeTab = function(tab, callback) { + var wasSelected = tab.selected; + if (NavService.canCloseTab(tab)) { + NavService.closeTab(tab, callback); + if ($scope.selectedTab && wasSelected) { + $scope.$broadcast("on:nav-click", $scope.selectedTab); + } + } + }; + + $scope.closeTabOthers = function(tab) { + var wasSelected = tab.selected; + NavService.closeTabOthers(tab); + if ($scope.selectedTab === tab && !wasSelected) { + $scope.$broadcast("on:nav-click", tab); + } + }; + + $scope.closeTabAll = function() { + return NavService.closeTabAll(); + }; + + $scope.reloadTab = function(tab) { + return NavService.reloadTab(tab); + }; + + $scope.tabTitle = function(tab) { + var vs = tab.$viewScope || {}; + if (vs.viewType === "form") { + return vs.viewTitle || tab.title; + } + return tab.title; + }; + + $scope.tabDirty = function(tab) { + var viewScope = tab.$viewScope; + if (viewScope && viewScope.isDirty) { + return viewScope.isDirty(); + } + return false; + }; + + // expose common methods to $rootScope + $scope.$root.openTab = $scope.openTab; + $scope.$root.openTabByName = $scope.openTabByName; + + $scope.$watch('selectedTab.viewType', function tabViewTypeWatch(viewType){ + if (viewType) { + axelor.$adjustSize(); + } + }); + + $scope.$watch('routePath', function routePathWatch(path) { + $scope.openHomeTab(); + }); + + var confirm = _t('Current changes will be lost.'); + + function onbeforeunload(e) { + var tabs = $scope.navTabs || []; + for (var i = 0; i < tabs.length; i++) { + var vs = (tabs[i]||{}).$viewScope; + if (vs && vs.$$dirty) { + return confirm; + } + } + } + + $(function () { + + // menu toggle logic + var menuToggled = false; + var navigator = axelor.config["user.navigator"]; + + if (navigator !== 'hidden') { + $('#offcanvas-toggle').find('a').click(function (e) { + var active = ! $("#offcanvas").hasClass('inactive'); + if (active && axelor.device.small) { + active = $("#offcanvas").hasClass('active'); + } + $("#offcanvas").toggleClass("active", !active && axelor.device.small); + $("#offcanvas").toggleClass("inactive", active && !axelor.device.small); + if (!axelor.device.mobile) { + setTimeout(axelor.$adjustSize, 100); + } + }); + } + + $("#offcanvas,#offcanvas-toggle").toggleClass("hidden-menu", navigator === "hidden"); + if (navigator === "collapse") { + $("#offcanvas").addClass("inactive"); + } + $scope.ajaxStop(function () { + setTimeout(function () { + $("#offcanvas,#offcanvas-toggle").removeClass("hidden"); + }, 100); + }, 100); + + $(window).on('resize', _.debounce(function () { + $("#offcanvas").removeClass(axelor.device.small ? 'inactive' : 'active'); + setTimeout(axelor.$adjustSize, 100); + }, 100)); + + // confirm dirty + $(window).on('beforeunload', onbeforeunload); + }); +} + +TabCtrl.$inject = ['$scope', '$location', '$routeParams']; +function TabCtrl($scope, $location, $routeParams) { + + var homeAction = axelor.config["user.action"], + params = _.clone($routeParams), + search = _.clone($location.$$search); + + var opts = { + mode: params.mode, + state: params.state, + search: search + }; + + if (homeAction === params.resource) { + _.extend(opts, { + __tab_prepend: true, + __tab_closable: false + }); + } + + if (params.resource) { + $scope.openTabByName(params.resource, opts); + } +} + +app.controller("NavCtrl", NavCtrl); +app.controller("TabCtrl", TabCtrl); + +})(); diff --git a/sophal/js/axelor.ng.js b/sophal/js/axelor.ng.js new file mode 100644 index 0000000..e17b50f --- /dev/null +++ b/sophal/js/axelor.ng.js @@ -0,0 +1,201 @@ +/* + * Axelor Business Solutions + * + * Copyright (C) 2005-2019 Axelor (). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +(function() { + + "use strict"; + + var module = angular.module('axelor.ng', []); + + module.config(['$provide', function($provide) { + + $provide.decorator('$rootScope', ['$delegate', '$exceptionHandler', '$injector', function ($rootScope, $exceptionHandler, $injector) { + + var __orig__ = Object.getPrototypeOf($rootScope), + __super__ = {}, + __custom__ = {}; + + for (var name in __orig__) { + if (angular.isFunction(__orig__[name])) { + __super__[name] = __orig__[name]; + } + } + + var $q = null, + $http = null, + $timeout = null; + + __custom__.ajaxStop = function ajaxStop(callback, context) { + var count, wait; + + if ($http === null) { + $http = $injector.get('$http'); + } + + count = _.size($http.pendingRequests || []); + wait = _.last(arguments) || 10; + + if (_.isNumber(context)) { + context = undefined; + } + + if (count > 0) { + return _.delay(ajaxStop.bind(this), wait, callback, context); + } + if (_.isFunction(callback)) { + return this.$timeout(callback.bind(context), wait); + } + }; + + // expose _t() to use in template + __custom__._t = _t; + + __custom__.$actionPromises = []; + __custom__.waitForActions = function waitForActions(callback, wait) { + if ($q === null) { + $q = $injector.get('$q'); + } + var that = this; + var args = arguments; + var waitFor = wait || 10; + this.$timeout(function () { + // wait for any pending ajax requests + that.ajaxStop(function () { + var all = args.length === 3 ? args[2] : that.$actionPromises; + // wait for actions + $q.all(all).then(function () { + // if new actions are executed, wait for them + if (args.length !== 3 && that.$actionPromises.length) { + return _.delay(waitForActions.bind(that), 10, callback); + } + if (callback) { + callback(); + } + }, callback); + }); + }, waitFor); + }; + + __custom__.$callWhen = function (predicate, callback, wait) { + var count = wait || 100; + + function later() { + if (count-- === 0 || (_.isFunction(predicate) && predicate())) { + return callback(); + } + return _.delay(later, count); + } + + this.$timeout(later, wait); + }; + + __custom__.$timeout = function(func, wait, invokeApply) { + if ($timeout === null) { + $timeout = $injector.get('$timeout'); + } + if (arguments.length === 0) { + return $timeout(); + } + return $timeout.apply(null, arguments); + }; + + __custom__.$onAdjust = function (events, handler, wait) { + var names = events; + if (_.isFunction(names)) { + wait = handler; + handler = names; + names = 'adjust:size'; + } else { + names = names.replace(/(\w+)/g, 'adjust:$1'); + } + + var func = wait ? _.debounce(handler, wait) : handler; + + $(document).on(names, func); + this.$on('$destroy', function () { + $(document).off(names, func); + }); + }; + + __custom__.$new = function $new() { + var inst = __super__.$new.apply(this, arguments); + + inst.$$watchChecker = this.$$watchChecker; + inst.$$watchInitialized = false; + inst.$$childCanWatch = true; + inst.$$shouldWatch = false; + inst.$$popupStack = this.$$popupStack || (this.$$popupStack = []); + return inst; + }; + + // make sure to patch $rootScope.$digest with + // if ((!current.$$canWatch || current.$$canWatch(current)) && (watchers = current.$$watchers)) { + // ... + // } + + __custom__.$$canWatch = function () { + if (!this.$$watchInitialized || !this.$$watchChecker) { + this.$$watchInitialized = true; + return true; + } + if (this.$$shouldWatch === true) { + return true; + } + var parent = this.$parent || {}; + if (parent.$$childCanWatch !== undefined && !parent.$$childCanWatch) { + return false; + } + this.$$childCanWatch = this.$$watchChecker(this); + return this.$$childCanWatch; + }; + + __custom__.$watchChecker = function (checker) { + + var self = this, + previous = this.$$watchChecker; + + if (this.$$watchChecker === null) { + this.$$watchChecker = checker; + } else { + this.$$watchChecker = function() { + return previous(self) && checker(self); + }; + } + }; + + var __super__$$apply = _.debounce(__super__.$apply, 100); + + __custom__.$apply = function $apply() { + return arguments.length === 0 + ? __super__$$apply.apply(this) + : __super__.$apply.apply(this, arguments); + }; + + __custom__.$applyNow = function $applyNow() { + return __super__.$apply.apply(this, arguments); + }; + + angular.extend(__orig__, __custom__); + angular.extend($rootScope, __custom__); + + $rootScope.$$watchChecker = null; + + return $rootScope; + }]); + }]); + +})(); diff --git a/sophal/js/axelor.ns.js b/sophal/js/axelor.ns.js new file mode 100644 index 0000000..6264ce5 --- /dev/null +++ b/sophal/js/axelor.ns.js @@ -0,0 +1,126 @@ +/* + * Axelor Business Solutions + * + * Copyright (C) 2005-2019 Axelor (). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +(function() { + + "use strict"; + + // create global axelor namespace if not exists + window.axelor = window.axelor || {}; + window.axelor.config = {}; + + // browser detection (adopted from jquery) + var ua = navigator.userAgent.toLowerCase(); + var browser = {}; + var match = + /(edge)[\/]([\w.]+)/.exec(ua) || + /(opr)[\/]([\w.]+)/.exec(ua) || + /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(version)(applewebkit)[ \/]([\w.]+).*(safari)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+).*(version)[ \/]([\w.]+).*(safari)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("trident") >= 0 && /(rv)(?::| )([\w.]+)/.exec( ua ) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + var matched = { + browser: match[5] || match[3] || match[1] || "", + version: match[4] || match[2] || "0" + }; + + if (matched.browser) { + browser[matched.browser] = true; + browser.version = matched.version; + } + if (browser.chrome || browser.opr || browser.safari) { + browser.webkit = true; + } + + // IE11 + if (browser.rv) { + var ie = "msie"; + matched.browser = ie; + browser[ie] = true; + } + + // recent opera + if (browser.opr ) { + var opera = "opera"; + matched.browser = opera; + browser[opera] = true; + } + + // screen size detection + var device = { + small: false, + large: false + }; + + device.large = $(window).width() > 768; + device.small = !device.large; + device.mobile = /Mobile|Android|iPhone|iPad|iPod|BlackBerry|Windows Phone/i.test(ua); + + axelor.browser = browser; + axelor.device = device; + + function sanitizeElement(element) { + $.each(element.attributes, function() { + var attr = this.name; + var value = this.value; + if (attr.indexOf('xss-on') === 0 || value.indexOf('javascript:') === 0) { + $(element).removeAttr(attr); + } + }); + } + + // this function removes