diff --git a/third_party_addons/ica_web_responsive/__init__.py b/third_party_addons/ica_web_responsive/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/third_party_addons/ica_web_responsive/__manifest__.py b/third_party_addons/ica_web_responsive/__manifest__.py new file mode 100644 index 000000000..234385321 --- /dev/null +++ b/third_party_addons/ica_web_responsive/__manifest__.py @@ -0,0 +1,76 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +{ + 'name': 'ICA Web Responsive', + 'author':"Agga, IdeaCode Academy", + 'version': '18.0.1.0', + 'depends': ['web', 'base_setup'], + # 'auto_install': ['web'], + 'auto_install': False, + 'data': [ + 'views/webclient_templates.xml', + ], + 'assets': { + 'web._assets_primary_variables': [ + ('after', 'web/static/src/scss/primary_variables.scss', 'ica_web_responsive/static/src/**/*.variables.scss'), + ('before', 'web/static/src/scss/primary_variables.scss', 'ica_web_responsive/static/src/scss/primary_variables.scss'), + ], + 'web._assets_secondary_variables': [ + ('before', 'web/static/src/scss/secondary_variables.scss', 'ica_web_responsive/static/src/scss/secondary_variables.scss'), + ], + 'web._assets_backend_helpers': [ + ('before', 'web/static/src/scss/bootstrap_overridden.scss', 'ica_web_responsive/static/src/scss/bootstrap_overridden.scss'), + ], + 'web.assets_frontend': [ + 'ica_web_responsive/static/src/webclient/home_menu/home_menu_background.scss', # used by login page + 'ica_web_responsive/static/src/webclient/navbar/navbar.scss', + ], + 'web.assets_backend': [ + 'ica_web_responsive/static/src/webclient/**/*.scss', + 'ica_web_responsive/static/src/views/**/*.scss', + + 'ica_web_responsive/static/src/core/**/*', + 'ica_web_responsive/static/src/webclient/**/*.js', + ('after', 'web/static/src/views/list/list_renderer.xml', 'ica_web_responsive/static/src/views/list/list_renderer_desktop.xml'), + 'ica_web_responsive/static/src/webclient/**/*.xml', + 'ica_web_responsive/static/src/views/**/*.js', + 'ica_web_responsive/static/src/views/**/*.xml', + ('remove', 'ica_web_responsive/static/src/views/pivot/**'), + + # Don't include dark mode files in light mode + ('remove', 'ica_web_responsive/static/src/**/*.dark.scss'), + ], + 'web.assets_backend_lazy': [ + 'ica_web_responsive/static/src/views/pivot/**', + ], + 'web.assets_backend_lazy_dark': [ + ('include', 'web.dark_mode_variables'), + # web._assets_backend_helpers + ('before', 'ica_web_responsive/static/src/scss/bootstrap_overridden.scss', 'ica_web_responsive/static/src/scss/bootstrap_overridden.dark.scss'), + ('after', 'web/static/lib/bootstrap/scss/_functions.scss', 'ica_web_responsive/static/src/scss/bs_functions_overridden.dark.scss'), + ], + 'web.assets_web': [ + ('replace', 'web/static/src/main.js', 'ica_web_responsive/static/src/main.js'), + ], + # ========= Dark Mode ========= + "web.dark_mode_variables": [ + # web._assets_primary_variables + ('before', 'ica_web_responsive/static/src/scss/primary_variables.scss', 'ica_web_responsive/static/src/scss/primary_variables.dark.scss'), + ('before', 'ica_web_responsive/static/src/**/*.variables.scss', 'ica_web_responsive/static/src/**/*.variables.dark.scss'), + # web._assets_secondary_variables + ('before', 'ica_web_responsive/static/src/scss/secondary_variables.scss', 'ica_web_responsive/static/src/scss/secondary_variables.dark.scss'), + ], + "web.assets_web_dark": [ + ('include', 'web.dark_mode_variables'), + # web._assets_backend_helpers + ('before', 'ica_web_responsive/static/src/scss/bootstrap_overridden.scss', 'ica_web_responsive/static/src/scss/bootstrap_overridden.dark.scss'), + ('after', 'web/static/lib/bootstrap/scss/_functions.scss', 'ica_web_responsive/static/src/scss/bs_functions_overridden.dark.scss'), + # assets_backend + 'ica_web_responsive/static/src/**/*.dark.scss', + ], + }, + 'license': 'LGPL-3', + + "images":["static/description/img.png"], +} diff --git a/third_party_addons/ica_web_responsive/static/description/icon.png b/third_party_addons/ica_web_responsive/static/description/icon.png new file mode 100644 index 000000000..16dd80994 Binary files /dev/null and b/third_party_addons/ica_web_responsive/static/description/icon.png differ diff --git a/third_party_addons/ica_web_responsive/static/description/img.png b/third_party_addons/ica_web_responsive/static/description/img.png new file mode 100644 index 000000000..18fdf457d Binary files /dev/null and b/third_party_addons/ica_web_responsive/static/description/img.png differ diff --git a/third_party_addons/ica_web_responsive/static/img/automation.svg b/third_party_addons/ica_web_responsive/static/img/automation.svg new file mode 100755 index 000000000..3e22456e6 --- /dev/null +++ b/third_party_addons/ica_web_responsive/static/img/automation.svg @@ -0,0 +1,25 @@ + + + ++ + +When... + +Then... + +Task moved to "In Progress" + +Send email to customer + +Add Anita Oliver as follower + ++ + +Create activity "Follow Up" + + + diff --git a/third_party_addons/ica_web_responsive/static/img/background-dark.jpg b/third_party_addons/ica_web_responsive/static/img/background-dark.jpg new file mode 100644 index 000000000..ce69f9532 Binary files /dev/null and b/third_party_addons/ica_web_responsive/static/img/background-dark.jpg differ diff --git a/third_party_addons/ica_web_responsive/static/img/background-light.svg b/third_party_addons/ica_web_responsive/static/img/background-light.svg new file mode 100644 index 000000000..aa437a117 --- /dev/null +++ b/third_party_addons/ica_web_responsive/static/img/background-light.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party_addons/ica_web_responsive/static/src/@types/main.d.ts b/third_party_addons/ica_web_responsive/static/src/@types/main.d.ts new file mode 100644 index 000000000..851df0085 --- /dev/null +++ b/third_party_addons/ica_web_responsive/static/src/@types/main.d.ts @@ -0,0 +1,3 @@ +declare module "@odoo/owl" { + export * from "@odoo/owl/dist/types/owl" +} diff --git a/third_party_addons/ica_web_responsive/static/src/core/colorlist/colorlist.dark.scss b/third_party_addons/ica_web_responsive/static/src/core/colorlist/colorlist.dark.scss new file mode 100644 index 000000000..b68b1de02 --- /dev/null +++ b/third_party_addons/ica_web_responsive/static/src/core/colorlist/colorlist.dark.scss @@ -0,0 +1,8 @@ +// Overrides the existing classes to fit the text-color of +// tag_list.dark.scss +@for $size from 2 through length($o-colors) { + .o_colorlist_item_color_#{$size - 1} { + --background-color: #{adjust-color(nth($o-colors, $size), $lightness: -5%, $saturation: -15%)}; + --color: #{mix(nth($o-colors, $size), $o-view-background-color, 15%)}; + } +} diff --git a/third_party_addons/ica_web_responsive/static/src/core/dropdown/dropdown.dark.scss b/third_party_addons/ica_web_responsive/static/src/core/dropdown/dropdown.dark.scss new file mode 100644 index 000000000..1fc28544b --- /dev/null +++ b/third_party_addons/ica_web_responsive/static/src/core/dropdown/dropdown.dark.scss @@ -0,0 +1,8 @@ +// = Dropdowns +// ============================================================================ +// No CSS hacks, variables overrides only + +.o-dropdown { + --border-color: #{$dropdown-border-color}; + --o-input-border-color: #{$dropdown-border-color}; +} diff --git a/third_party_addons/ica_web_responsive/static/src/core/notebook/notebook.scss b/third_party_addons/ica_web_responsive/static/src/core/notebook/notebook.scss new file mode 100644 index 000000000..8cf0ca977 --- /dev/null +++ b/third_party_addons/ica_web_responsive/static/src/core/notebook/notebook.scss @@ -0,0 +1,12 @@ +// Custom SCSS for enterprise version of notebook tabs + +.o_notebook { + --notebook-link-border-color: #{$border-color}; + --notebook-link-border-color-hover: #{$border-color}; + --notebook-link-border-color-active-accent: #{$o-brand-odoo}; + + .modal & { + --notebook-padding-x: #{$modal-inner-padding}; + --notebook-margin-x: -#{$modal-inner-padding}; + } +} diff --git a/third_party_addons/ica_web_responsive/static/src/core/popover/popover.dark.scss b/third_party_addons/ica_web_responsive/static/src/core/popover/popover.dark.scss new file mode 100644 index 000000000..ff451eeb9 --- /dev/null +++ b/third_party_addons/ica_web_responsive/static/src/core/popover/popover.dark.scss @@ -0,0 +1,15 @@ +// = Popovers +// ============================================================================ +// No CSS hacks, variables overrides only + +.o_popover { + --border-color: #{$popover-border-color}; + + .table { + --table-bg: #{$popover-bg}; + } + + .o_input { + --o-input-border-color: #{$popover-border-color}; + } +} diff --git a/third_party_addons/ica_web_responsive/static/src/core/tags_list/tags_list.dark.scss b/third_party_addons/ica_web_responsive/static/src/core/tags_list/tags_list.dark.scss new file mode 100644 index 000000000..c7484ddb2 --- /dev/null +++ b/third_party_addons/ica_web_responsive/static/src/core/tags_list/tags_list.dark.scss @@ -0,0 +1,13 @@ +.o_tag { + @for $size from 1 through length($o-colors) { + &.o_tag_color_#{$size - 1} { + --background-color: #{mix(nth($o-colors, $size), $o-view-background-color, 15%)}; + --color: #{adjust-color(nth($o-colors, $size), $lightness: 5%, $saturation: -15%)}; + + &::after { + --background-color: var(--background-color); + --color: var(--color); + } + } + } +} diff --git a/third_party_addons/ica_web_responsive/static/src/main.js b/third_party_addons/ica_web_responsive/static/src/main.js new file mode 100644 index 000000000..b4d4340c1 --- /dev/null +++ b/third_party_addons/ica_web_responsive/static/src/main.js @@ -0,0 +1,11 @@ +/** @odoo-module **/ + +import { startWebClient } from "@web/start"; +import { WebClientEnterprise } from "./webclient/webclient"; + +/** + * This file starts the enterprise webclient. In the manifest, it replaces + * the community main.js to load a different webclient class + * (WebClientEnterprise instead of WebClient) + */ +startWebClient(WebClientEnterprise); diff --git a/third_party_addons/ica_web_responsive/static/src/scss/bootstrap_overridden.dark.scss b/third_party_addons/ica_web_responsive/static/src/scss/bootstrap_overridden.dark.scss new file mode 100644 index 000000000..bbb2ee320 --- /dev/null +++ b/third_party_addons/ica_web_responsive/static/src/scss/bootstrap_overridden.dark.scss @@ -0,0 +1,180 @@ +/// +/// This file is a copy of the bootstrap _variables.scss file where all the +/// left-untouched variables definition have been removed. +/// + + +// == Color system +$danger: $o-danger !default; + +$min-contrast-ratio: 4.5 !default; + +$info-text-emphasis: shift-color($o-info, 90%) !default; +$info-bg-subtle: shift-color($o-info, -65%) !default; +$info-border-subtle: shift-color($o-info, 0%) !default; + +// == Characters which are escaped by the escape-svg function + + +// == Options + + +// == Prefix for :root CSS variables + + +// == Gradient + + +// == Spacing + + +// == Position + + +// == Body + +// == Links + +$link-shade-percentage: 15% !default; +$link-hover-color: shift-color($o-action, 30%) !default; + +// == Paragraphs + + +// == Grid breakpoints + + +// == Grid containers + + +// == Grid columns + + +// == Components +$box-shadow: 0 .5rem 1rem rgba($o-white, .3) !default; +$box-shadow-sm: 0 .125rem .25rem rgba($o-white, .15) !default; +$box-shadow-lg: 0 1rem 3rem rgba($o-white, .3) !default; +$box-shadow-inset: inset 0 1px 2px rgba($o-white, .15) !default; + +$component-active-bg: $o-gray-300 !default; + + +// == Typography +$mark-bg: #ffdebc !default; + +// == Tables +$table-bg: $o-view-background-color !default; +$table-border-color: $o-gray-300 !default; +$table-group-separator-color: $o-gray-300 !default; +$table-bg-scale: -70% !default; +$table-striped-bg-factor: .02 !default; +$table-hover-bg-factor: .1 !default; +$table-active-bg-factor: .1 !default; + +// == Buttons + Forms + + +// == Buttons + + +// == Forms +$input-border-color: $o-gray-300 !default; +$input-placeholder-color: mix($o-gray-500, $o-gray-600) !default; +$input-focus-bg: inherit !default; +$form-range-thumb-active-bg: lighten($o-brand-primary, 10%); +$form-range-track-bg: $o-gray-300 !default; + +$form-switch-color: rgba($o-black, .5) !default; +$form-switch-focus-color: $o-black !default; +$form-switch-checked-color: $o-view-background-color !default; + +// == Form validation + + +// == Z-index master list + + +// == Navs + + +// == Navbar + + +// == Dropdowns +$dropdown-bg: $o-gray-300 !default; +$dropdown-border-color: $o-gray-400 !default; +$dropdown-header-color: $o-gray-700 !default; + + +// == Pagination + + +// == Placeholders + + +// == Cards +$card-cap-bg: $o-view-background-color !default; + +// == Accordion + + +// == Tooltips +$tooltip-color: $o-gray-800 !default; +$tooltip-bg: $o-gray-300 !default; + + +// == Form tooltips must come after regular tooltips + + +// == Popovers +$popover-bg: $o-gray-300 !default; +$popover-border-color: $o-gray-400 !default; + +// == Toasts + + +// == Badges + + +// == Modals + + +// == Alerts +$alert-bg-scale: -65% !default; +$alert-border-scale: 0% !default; +$alert-color-scale: 90% !default; + +// == Progress bars + + +// == List group +$list-group-bg: $o-view-background-color !default; + + +// == Image thumbnails + + +// == Figures + + +// == Breadcrumbs + + +// == Carousel + + +// == Spinners + + +// == Close + + +// == Offcanvas + + +// == Code + +// == Keyboard Input +$kbd-color: $o-gray-200 !default; +$kbd-bg: $o-gray-900 !default; +$kbd-box-shadow: 0px 1px 1px rgba($o-white, 0.2), inset 0px -1px 1px 1px rgba($o-gray-800, 0.8), inset 0px 2px 0px 0px rgba($o-black, 0.8) !default; diff --git a/third_party_addons/ica_web_responsive/static/src/scss/bootstrap_overridden.scss b/third_party_addons/ica_web_responsive/static/src/scss/bootstrap_overridden.scss new file mode 100644 index 000000000..0fd68b229 --- /dev/null +++ b/third_party_addons/ica_web_responsive/static/src/scss/bootstrap_overridden.scss @@ -0,0 +1,136 @@ +/// +/// This file is a copy of the bootstrap _variables.scss file where all the +/// left-untouched variables definition have been removed. +/// + +// +// Color system +// + +$light: $o-white !default; +$dark: $o-gray-900 !default; +$warning: #e99d00 !default; +$danger: #d44c59 !default; + + +// Options + +// Enable predefined decorative box-shadow styles on various components. +// Does not affect box-shadows used for focus states. + +$enable-shadows: true !default; + +// Components +// +// Define common padding and border radius sizes and more. + +$component-active-color: unset !default; +$component-active-bg: mix($o-enterprise-action-color, $o-white, 10%) !default; + +$nav-tabs-border-radius: 0 !default; +$nav-pills-border-radius: 0 !default; +$card-border-radius: 0 !default; +$accordion-border-radius: 0 !default; +$toast-border-radius: 0 !default; +$badge-border-radius: 0 !default; +$progress-border-radius: 0 !default; +$list-group-border-radius: 0 !default; +$thumbnail-border-radius: 0 !default; +$form-check-input-border-radius: 0 !default; + +// Typography +// +// Font, line-height, and color for body text, headings, and more. + +$h1-font-size: $o-font-size-base * 2.4 !default; +$h2-font-size: $o-font-size-base * 1.5 !default; +$h3-font-size: $o-font-size-base * 1.3 !default; +$h4-font-size: $o-font-size-base * 1.2 !default; +$h5-font-size: $o-font-size-base * 1.1 !default; + +// Buttons +// +// For each of Bootstrap's buttons, define text, background, and border color. + +$btn-transition: none !default; + +$btn-box-shadow: 0 !default; +$btn-active-box-shadow: 0 !default; +$btn-focus-box-shadow: 0 !default; + +// Dropdowns +// +// Dropdown menu container and contents. + +$dropdown-box-shadow: 0 .3rem 1rem rgba(#000, .1) !default; + +// Forms +// + +$input-border-color: $o-gray-200 !default; +$input-box-shadow: 0 !default; + +$input-focus-bg: $o-white !default; +$input-focus-box-shadow: 0 !default; +$input-focus-border-color: mix($o-enterprise-action-color, $o-gray-200) !default; + +$form-check-input-checked-color: $o-white !default; +$form-check-input-checked-border-color: $o-enterprise-action-color !default; +$form-check-input-checked-bg-color: $o-enterprise-action-color !default; + +$form-select-focus-box-shadow: 0 !default; + +$form-range-track-box-shadow: 0 !default; + +// Z-index master list +// +// Change the z-index of the modal-backdrop elements to be equal to the +// modal elements' ones. Bootstrap does not support multi-modals, and without +// this rule all the modal-backdrops are below all the opened modals. +// Indeed, bootstrap forces them to a lower z-index as the modal-backdrop +// element (unique in their supported cases) might be put after the modal +// element (if the modal is already in the DOM, hidden, then opened). This +// cannot happen in odoo though as modals are not hidden but removed from +// the DOM and are always put at the end of the body when opened. +// +// TODO the following code was disabled because it is saas-incompatible +// +// $zindex-modal-backdrop: $zindex-modal; + +// Navs +$nav-link-color: $o-main-text-color !default; +$nav-tabs-link-active-color: $o-main-headings-color !default; +$nav-tabs-link-active-bg: transparent !default; + + +// Badges + +$badge-border-radius: $o-border-radius !default; +$badge-font-weight: normal !default; + +// Alerts +// +// Define alert colors, border radius, and padding. + +$alert-border-width: 0 !default; + +// Progress bars + +$progress-box-shadow: 0 !default; + +// List group + +$list-group-active-color: $o-enterprise-action-color !default; +$list-group-active-bg: $component-active-bg !default; +$list-group-active-border-color: $o-enterprise-action-color !default; + + +// Image thumbnails + +$thumbnail-box-shadow: 0 !default; + + +// Breadcrumbs + +$breadcrumb-active-color: $o-main-text-color !default; +$breadcrumb-divider-color: $o-main-color-muted !default; diff --git a/third_party_addons/ica_web_responsive/static/src/scss/bs_functions_overridden.dark.scss b/third_party_addons/ica_web_responsive/static/src/scss/bs_functions_overridden.dark.scss new file mode 100644 index 000000000..9e27515ea --- /dev/null +++ b/third_party_addons/ica_web_responsive/static/src/scss/bs_functions_overridden.dark.scss @@ -0,0 +1,14 @@ +/// +/// This file is a copy of the bootstrap _functions.scss file where all the +/// left-untouched function definition have been removed. +/// + +// Tint a color: mix a color with black +@function tint-color($color, $weight) { + @return mix(#000, $color, $weight); +} + +// Shade a color: mix a color with white +@function shade-color($color, $weight) { + @return mix(#FFF, $color, $weight); +} diff --git a/third_party_addons/ica_web_responsive/static/src/scss/primary_variables.dark.scss b/third_party_addons/ica_web_responsive/static/src/scss/primary_variables.dark.scss new file mode 100644 index 000000000..eb9fd55ec --- /dev/null +++ b/third_party_addons/ica_web_responsive/static/src/scss/primary_variables.dark.scss @@ -0,0 +1,193 @@ +/// +/// Odoo Dark-Mode +/// +/// + +// = Colors +// ============================================================================ + +$o-white: #000 !default; +$o-black: #FFF !default; + +$o-gray-100: #1B1D26 !default; +$o-gray-200: #262A36 !default; +$o-gray-300: #3C3E4B !default; +$o-gray-400: #5A5E6B !default; +$o-gray-500: #6B707F !default; +$o-gray-600: #7E8392 !default; +$o-gray-700: #B1B3BC !default; +$o-gray-800: #D1D1D1 !default; +$o-gray-900: #E4E4E4 !default; + +$o-enterprise-color: #6b3e66 !default; +$o-brand-primary: $o-enterprise-color !default; +$o-enterprise-action-color: #02c7b5 !default; + +$o-success: #1dc959 !default; +$o-info: #6AB5FB !default; +$o-warning: #FBB56A !default; +$o-danger: #b83232 !default; +$o-action: $o-enterprise-action-color !default; +$light: $o-gray-300 !default; +$dark: $o-gray-700 !default; + + +// = Text +// ============================================================================ + +$o-main-text-color: $o-gray-800 !default; +$o-main-link-color: $o-action !default; +$o-enterprise-color: $o-brand-odoo !default; +$o-main-favorite-color: #ffd532 !default; +$o-main-code-color: #c58bc8 !default; + +// = Fine-tune contextual text colors. +$o-theme-text-colors: ( + "primary": #b972a6, + "success": #1dc959, + "info": #6AB5FB, + "warning": #FBB56A, + "danger": #ff5757, +) !default; + + +// = Webclient +// ============================================================================ +$o-webclient-color-scheme: dark !default; +$o-webclient-background-color: $o-gray-100 !default; +$o-view-background-color: $o-gray-200 !default; + +// = Inputs +$o-input-border-required: $o-black !default; + +// = Components +// ============================================================================ +$o-component-active-bg: mix($o-action, $o-gray-300, 10%) !default; +$o-form-lightsecondary: $o-gray-300 !default; + +// = List-group +$o-list-group-active-color: $o-gray-900 !default; +$o-list-group-active-bg: rgba(saturate(adjust-hue($o-info, 15), 1.8), .5) !default; + +// = Modal +$modal-backdrop-bg: $o-white !default; + +// = Buttons +$o-btns-bs-override: () !default; +$o-btns-bs-override: map-merge(( + "primary": ( + background: $o-brand-primary, + border: $o-brand-primary, + color: $o-black, + + hover-background: lighten($o-brand-primary, 5%), + hover-border: lighten($o-brand-primary, 5%), + hover-color: $o-black, + + active-background: lighten($o-brand-primary, 10%), + active-border: lighten($o-brand-primary, 10%), + active-color: $o-black, + ), + + "secondary": ( + background: $o-gray-300, + border: $o-gray-300, + color: $o-gray-900, + + hover-background: $o-gray-400, + hover-border: $o-gray-400, + hover-color: $o-gray-900, + + active-background: mix($o-action, $o-gray-100, 15%), + active-border: lighten($o-action, 10%), + active-color: $o-black, + ), + + "light": ( + background: $o-gray-200, + border: $o-gray-200, + color: $o-gray-800, + + hover-background: $o-gray-300, + hover-border: $o-gray-300, + hover-color: $o-gray-900, + + active-background: mix($o-action, $o-gray-100, 15%), + active-border: darken($o-action, 10%), + active-color: $o-black, + ), + + "danger": ( + background: $o-danger, + border: $o-danger, + color: $o-black, + + hover-background: lighten($o-danger, 5%), + hover-border: lighten($o-danger, 5%), + hover-color: $o-black, + + active-background: lighten($o-danger, 10%), + active-border: lighten($o-danger, 10%), + active-color: $o-black, + ), +), $o-btns-bs-override); + + +$o-btns-bs-outline-override: () !default; +$o-btns-bs-outline-override: map-merge(( + + "primary": ( + background: transparent, + border: map-get($o-theme-text-colors, 'primary'), + color: map-get($o-theme-text-colors, 'primary'), + + hover-background: lighten($o-brand-primary, 5%), + hover-border: lighten($o-brand-primary, 5%), + hover-color: $o-black, + + active-background: lighten($o-brand-primary, 10%), + active-border: lighten($o-brand-primary, 10%), + active-color: $o-black, + ), + "secondary": ( + background: transparent, + border: $o-gray-300, + color: $o-gray-700, + + hover-background: $o-gray-300, + hover-border: $o-gray-300, + hover-color: $o-black, + + active-background: mix($o-action, $o-gray-100, 15%), + active-border: lighten($o-action, 10%), + active-color: $o-black, + ), + + "light": ( + background: transparent, + border: $o-gray-300, + color: $o-black, + + hover-background: $o-gray-300, + hover-border: $o-gray-300, + hover-color: $o-gray-900, + + active-background: mix($o-action, $o-gray-100, 15%), + active-border: lighten($o-action, 10%), + active-color: $o-black, + ), + + "danger": ( + background: transparent, + border: $o-danger, + color: $o-danger, + + hover-background: lighten($o-danger, 5%), + hover-border: lighten($o-danger, 5%), + hover-color: $o-black, + + active-background: lighten($o-danger, 10%), + active-border: lighten($o-danger, 10%), + active-color: $o-black, + ), +), $o-btns-bs-outline-override); diff --git a/third_party_addons/ica_web_responsive/static/src/scss/primary_variables.scss b/third_party_addons/ica_web_responsive/static/src/scss/primary_variables.scss new file mode 100644 index 000000000..5e95dbf23 --- /dev/null +++ b/third_party_addons/ica_web_responsive/static/src/scss/primary_variables.scss @@ -0,0 +1,107 @@ +/// +/// This file regroups the variables that style odoo components. +/// They are available in every asset bundle. +/// + +// Colors +$o-white: #FFF !default; +$o-black: #000 !default; + +$o-gray-100: #F9FAFB !default; +$o-gray-200: #e7e9ed !default; +$o-gray-300: #d8dadd !default; +$o-gray-400: #9a9ca5 !default; +$o-gray-500: #7c7f89 !default; +$o-gray-600: #5f636f !default; +$o-gray-700: #374151 !default; +$o-gray-800: #1F2937 !default; +$o-gray-900: #111827 !default; + +$o-enterprise-color: #714B67 !default; +$o-enterprise-action-color: #017e84 !default; + +$o-opacity-disabled: .5 !default; +$o-opacity-muted: .76 !default; + +$o-brand-odoo: $o-enterprise-color !default; +$o-brand-primary: $o-brand-odoo !default; +$o-brand-secondary: #8f8f8f !default; +$o-brand-lightsecondary: $o-gray-100 !default; + +$o-action: $o-enterprise-action-color !default; +$o-main-text-color: $o-gray-700 !default; +$o-main-link-color: $o-enterprise-action-color !default; +$o-main-color-muted: rgba($o-main-text-color, $o-opacity-muted) !default; + +// Components +$o-component-active-color: $o-gray-900 !default; +$o-component-active-bg: mix($o-action, $o-white, 10%) !default; +$o-component-active-border: $o-action !default; + +$o-list-group-header-color: $o-gray-900 !default; +$o-list-footer-color: $o-gray-900 !default; +$o-list-footer-bg-color: transparent !default; +$o-list-footer-font-weight: 500 !default; + +$o-form-lightsecondary: $o-gray-200 !default; + +// o-inputs +$o-input-padding-y: 1px !default; +$o-input-padding-x: 0 !default; + +$o-input-border-required: $o-gray-900 !default; + +// Badges +$o-badge-min-width: 2.7ch !default !default; + +// Buttons +// Map of customized values for each button. If a button's design is defined +// here, the relative values will take priority over default BS ones. +// Notice: each map's entry is passed directly to the Bootstrap mixin, meaning +// that all states must be defined, there can't be omissions. +$o-btns-bs-override: () !default; +$o-btns-bs-override: map-merge(( + "primary": ( + background: $o-brand-primary, + border: $o-brand-primary, + color: $o-white, + + hover-background: darken($o-brand-primary, 10%), + hover-border: darken($o-brand-primary, 10%), + hover-color: $o-white, + + active-background: mix($o-brand-primary, $o-white, 10%), + active-border: $o-brand-primary, + active-color:$o-brand-primary, + ), + "secondary": ( + background: $o-gray-200, + border: $o-gray-200, + color: $o-gray-700, + + hover-background: $o-gray-300, + hover-border: $o-gray-300, + hover-color: $o-gray-800, + + active-background: $o-component-active-bg, + active-border: $o-component-active-border, + active-color: $o-component-active-color, + ), +), $o-btns-bs-override); + +$o-btns-bs-outline-override: () !default; +$o-btns-bs-outline-override: map-merge(( + "secondary": ( + background: transparent, + border: $o-gray-300, + color: $o-gray-700, + + hover-background: $o-gray-200, + hover-border: $o-gray-300, + hover-color: $o-gray-800, + + active-background: mix($o-enterprise-action-color, $o-white, 10%), + active-border: $o-enterprise-action-color, + active-color: $o-gray-900, + ), +), $o-btns-bs-outline-override); diff --git a/third_party_addons/ica_web_responsive/static/src/scss/secondary_variables.dark.scss b/third_party_addons/ica_web_responsive/static/src/scss/secondary_variables.dark.scss new file mode 100644 index 000000000..3db856613 --- /dev/null +++ b/third_party_addons/ica_web_responsive/static/src/scss/secondary_variables.dark.scss @@ -0,0 +1,19 @@ +$o-colors-original: lighten(#000, 46.7%), #f07b50, #f4b660, #F7CD1F, #6cedeb, #8d5482, + #e74e4e, #2C8397, #475577, #dc0457, #30C381, #9365B8 !default; + +$o-colors-secondary-original: #aa4b6b, #30C381, #97743a, #F7CD1F, #4285F4, #8E24AA, + #D6145F, #173e43, #348F50, #AA3A38, #795548, #5e0231, + #6be585, #999966, #e9d362, #b56969, #bdc3c7, #649173 !default; + +$o-colors: ()!default; +$o-colors-secondary: ()!default; + +@each $-color in $o-colors-original { + $-adjusted: saturate(mix($-color, $o-black, 50%), 60%); + $o-colors: append($o-colors, $-adjusted); +} + +@each $-color in $o-colors-secondary-original { + $-adjusted: saturate(mix($-color, $o-black, 50%), 80%); + $o-colors-secondary: append($o-colors-secondary, $-adjusted); +} diff --git a/third_party_addons/ica_web_responsive/static/src/scss/secondary_variables.scss b/third_party_addons/ica_web_responsive/static/src/scss/secondary_variables.scss new file mode 100644 index 000000000..9dba4643e --- /dev/null +++ b/third_party_addons/ica_web_responsive/static/src/scss/secondary_variables.scss @@ -0,0 +1,4 @@ +// Needed for having no spacing between sheet and mail body in mass_mailing: +// Different required cancel paddings between web and ica_web_responsive +$o-sheet-cancel-tpadding: $o-horizontal-padding !default; +$o-sheet-cancel-bpadding: $o-horizontal-padding + $o-sheet-vpadding !default; diff --git a/third_party_addons/ica_web_responsive/static/src/search/search_bar/search_bar.dark.scss b/third_party_addons/ica_web_responsive/static/src/search/search_bar/search_bar.dark.scss new file mode 100644 index 000000000..e5e3bbdb8 --- /dev/null +++ b/third_party_addons/ica_web_responsive/static/src/search/search_bar/search_bar.dark.scss @@ -0,0 +1,7 @@ +// = Search Bar +// ============================================================================ +// No CSS hacks, variables overrides only + +.o_searchview_facet { + --SearchBar-facet-background: #{$o-black}; +} diff --git a/third_party_addons/ica_web_responsive/static/src/search/search_panel/search_view.dark.scss b/third_party_addons/ica_web_responsive/static/src/search/search_panel/search_view.dark.scss new file mode 100644 index 000000000..ab7f4b56f --- /dev/null +++ b/third_party_addons/ica_web_responsive/static/src/search/search_panel/search_view.dark.scss @@ -0,0 +1,12 @@ +// = Mobile Search +// ============================================================================ +// No CSS hacks, variables overrides only + +.o_mobile_search { + --mobileSearch-bg: #{$o-gray-200}; + --mobileSearch__header-bg: #{$o-gray-100}; +} + +.o_searchview { + --SearchBar-background-color: #{$o-gray-100}; +} diff --git a/third_party_addons/ica_web_responsive/static/src/views/dashboard/dashboard_controller.dark.scss b/third_party_addons/ica_web_responsive/static/src/views/dashboard/dashboard_controller.dark.scss new file mode 100644 index 000000000..5d13f1c5f --- /dev/null +++ b/third_party_addons/ica_web_responsive/static/src/views/dashboard/dashboard_controller.dark.scss @@ -0,0 +1,10 @@ +// = Dashboard View +// ============================================================================ +// No CSS hacks, variables overrides only + +.o_dashboard_view { + --DashboardView-background-color: #{$o-gray-100}; + --DashboardView__controlPanel-background-color: transparent; + --DashboardView__pieChart-background-color: transparent; +} + diff --git a/third_party_addons/ica_web_responsive/static/src/views/fields/image/image_field.dark.scss b/third_party_addons/ica_web_responsive/static/src/views/fields/image/image_field.dark.scss new file mode 100644 index 000000000..3b5078522 --- /dev/null +++ b/third_party_addons/ica_web_responsive/static/src/views/fields/image/image_field.dark.scss @@ -0,0 +1,7 @@ +// = Image Field +// ============================================================================ +// No CSS hacks, variables overrides only + +.o_field_image { + --ImageField-background-color: #{$o-gray-900}; +} diff --git a/third_party_addons/ica_web_responsive/static/src/views/fields/properties/properties_field.dark.scss b/third_party_addons/ica_web_responsive/static/src/views/fields/properties/properties_field.dark.scss new file mode 100644 index 000000000..e45f6a1c2 --- /dev/null +++ b/third_party_addons/ica_web_responsive/static/src/views/fields/properties/properties_field.dark.scss @@ -0,0 +1,19 @@ +.o_field_property_definition_type, .o_field_property_definition_type_menu { + .o_field_property_dropdown > img { + -webkit-filter: invert(100%); + filter: invert(100%); + } +} +.o_property_field_value { + select { + option { + background-color: $border-color; + } + } +} +.o_field_property_definition_type_popover.popover { + .dropdown-item img { + -webkit-filter: invert(100%); + filter: invert(100%); + } +} diff --git a/third_party_addons/ica_web_responsive/static/src/views/form/button_box/button_box.dark.scss b/third_party_addons/ica_web_responsive/static/src/views/form/button_box/button_box.dark.scss new file mode 100644 index 000000000..f95694fa4 --- /dev/null +++ b/third_party_addons/ica_web_responsive/static/src/views/form/button_box/button_box.dark.scss @@ -0,0 +1,4 @@ +.o-form-buttonbox { + --o-stat-button-color: currentColor; + --o-stat-text-color: #{o-text-color('primary')}; +} diff --git a/third_party_addons/ica_web_responsive/static/src/views/gantt/web_gantt.variables.dark.scss b/third_party_addons/ica_web_responsive/static/src/views/gantt/web_gantt.variables.dark.scss new file mode 100644 index 000000000..fc39ad93c --- /dev/null +++ b/third_party_addons/ica_web_responsive/static/src/views/gantt/web_gantt.variables.dark.scss @@ -0,0 +1,9 @@ +// = Gantt View Variables +// ============================================================================ +// No CSS hacks, variables overrides only + +$gantt-highlight-today-border: rgba($o-warning, 0.5) !default; +$gantt-highlight-today-bg: rgba($o-warning, 0.15)!default; +$gantt-highlight-hover-row: rgba($o-brand-primary, .1) !default; +$gantt-row-open-bg: $o-gray-100 !default; +$gantt-unavailability-bg: $o-gray-200 !default; diff --git a/third_party_addons/ica_web_responsive/static/src/views/kanban/kanban_controller.dark.scss b/third_party_addons/ica_web_responsive/static/src/views/kanban/kanban_controller.dark.scss new file mode 100644 index 000000000..5d953cbc6 --- /dev/null +++ b/third_party_addons/ica_web_responsive/static/src/views/kanban/kanban_controller.dark.scss @@ -0,0 +1,11 @@ +// = Kanban Rendered +// ============================================================================ +// No CSS hacks, variables overrides only + +.o_kanban_renderer { + --KanbanGroup-grouped-bg: #{$o-view-background-color}; + --KanbanRecord__image-bg-color: #{$o-gray-900}; + --KanbanColumn__highlight-background: #{mix($o-action, $o-gray-100, 15%)}; + --KanbanColumn__highlight-border: #{$o-component-active-border}; + --Kanban-background: #{$gray-100}; +} diff --git a/third_party_addons/ica_web_responsive/static/src/views/kanban/kanban_header_patch.js b/third_party_addons/ica_web_responsive/static/src/views/kanban/kanban_header_patch.js new file mode 100644 index 000000000..01ec724d1 --- /dev/null +++ b/third_party_addons/ica_web_responsive/static/src/views/kanban/kanban_header_patch.js @@ -0,0 +1,44 @@ +/* @odoo-module */ + +import { registry } from "@web/core/registry"; +import { patch } from "@web/core/utils/patch"; +import { KanbanHeader } from "@web/views/kanban/kanban_header"; +import { PromoteStudioAutomationDialog } from "@ica_web_responsive/webclient/promote_studio_dialog/promote_studio_dialog"; +import { _t } from "@web/core/l10n/translation"; +import { user } from "@web/core/user"; + +patch(KanbanHeader.prototype, { + /** + * @override + */ + get permissions() { + const permissions = super.permissions; + Object.defineProperty(permissions, "canEditAutomations", { + get: () => user.isAdmin, + configurable: true, + }); + return permissions; + }, + + async openAutomations() { + if (typeof this._openAutomations === "function") { + // this is the case if base_automation is installed + return this._openAutomations(); + } else { + this.env.services.dialog.add(PromoteStudioAutomationDialog, { + title: _t("Odoo Studio - Customize workflows in minutes"), + }); + } + }, +}); + +registry.category("kanban_header_config_items").add( + "open_automations", + { + label: _t("Automations"), + method: "openAutomations", + isVisible: ({ permissions }) => permissions.canEditAutomations, + class: "o_column_automations", + }, + { sequence: 25, force: true } +); diff --git a/third_party_addons/ica_web_responsive/static/src/views/kanban/kanban_view.scss b/third_party_addons/ica_web_responsive/static/src/views/kanban/kanban_view.scss new file mode 100644 index 000000000..5ea95e165 --- /dev/null +++ b/third_party_addons/ica_web_responsive/static/src/views/kanban/kanban_view.scss @@ -0,0 +1,14 @@ +.o_kanban_view { + + .o_column_quick_create .o_kanban_quick_create { + input { + &, &:focus, &:hover { + background: transparent; + border-bottom: 1px solid map-get($grays, '600'); + } + } + .input-group-append, .input-group-prepend { + border-left: 10px solid map-get($grays, '200'); + } + } +} diff --git a/third_party_addons/ica_web_responsive/static/src/views/list/list_controller.dark.scss b/third_party_addons/ica_web_responsive/static/src/views/list/list_controller.dark.scss new file mode 100644 index 000000000..219e84e50 --- /dev/null +++ b/third_party_addons/ica_web_responsive/static/src/views/list/list_controller.dark.scss @@ -0,0 +1,4 @@ +// = ListRenderer +// ============================================================================ +// No CSS hacks, variables overrides only + diff --git a/third_party_addons/ica_web_responsive/static/src/views/list/list_controller.scss b/third_party_addons/ica_web_responsive/static/src/views/list/list_controller.scss new file mode 100644 index 000000000..8eb931c41 --- /dev/null +++ b/third_party_addons/ica_web_responsive/static/src/views/list/list_controller.scss @@ -0,0 +1,3 @@ +.o_list_renderer { + --ListRenderer-thead-border-end-color: transparent; +} diff --git a/third_party_addons/ica_web_responsive/static/src/views/list/list_renderer_desktop.js b/third_party_addons/ica_web_responsive/static/src/views/list/list_renderer_desktop.js new file mode 100644 index 000000000..589f63b91 --- /dev/null +++ b/third_party_addons/ica_web_responsive/static/src/views/list/list_renderer_desktop.js @@ -0,0 +1,100 @@ +/** @odoo-module */ + +import { isMobileOS } from "@web/core/browser/feature_detection"; +import { user } from "@web/core/user"; +import { useService } from "@web/core/utils/hooks"; +import { patch } from "@web/core/utils/patch"; +import { ListRenderer } from "@web/views/list/list_renderer"; +import { PromoteStudioDialog } from "@ica_web_responsive/webclient/promote_studio_dialog/promote_studio_dialog"; +import { _t } from "@web/core/l10n/translation"; +import { onWillDestroy, useState } from "@odoo/owl"; + +export const patchListRendererDesktop = () => ({ + setup() { + super.setup(...arguments); + this.actionService = useService("action"); + const list = this.props.list; + + const { actionId, actionType } = this.env.config || {}; + + // Start by determining if the current ListRenderer is in a context that would + // allow the edition of the arch by studio. + // It needs to be a full list view, in an action + // (not a X2Many list, and not an "embedded" list in another component) + // Also, there is not enough information when an action is in target new, + // and this use case is fairly outside of the feature's scope + const isPotentiallyEditable = + !isMobileOS() && + !this.env.inDialog && + user.isSystem && + list === list.model.root && + actionId && + actionType === "ir.actions.act_window"; + this.studioEditable = useState({ value: isPotentiallyEditable }); + + if (isPotentiallyEditable) { + const computeStudioEditable = (action) => { + // Finalize the computation when the actionService is ready. + // The following code is copied from studioService. + if (!action.xml_id) { + return false; + } + if ( + action.res_model.indexOf("settings") > -1 && + action.res_model.indexOf("x_") !== 0 + ) { + return false; // settings views aren't editable; but x_settings is + } + if (action.res_model === "board.board") { + return false; // dashboard isn't editable + } + if (action.view_mode === "qweb") { + // Apparently there is a QWebView that allows to + // implement ActWindow actions that are completely custom + // but not editable by studio + return false; + } + if (action.res_model === "knowledge.article") { + // The knowledge form view is very specific and custom, it doesn't make sense + // to edit it. Editing the list and kanban is more debatable, but for simplicity's sake + // we set them to not editable too. + return false; + } + return Boolean(action.res_model); + }; + const onUiUpdated = () => { + const action = this.actionService.currentController.action; + if (action.id === actionId) { + this.studioEditable.value = computeStudioEditable(action); + } + stopListening(); + }; + const stopListening = () => + this.env.bus.removeEventListener("ACTION_MANAGER:UI-UPDATED", onUiUpdated); + this.env.bus.addEventListener("ACTION_MANAGER:UI-UPDATED", onUiUpdated); + + onWillDestroy(stopListening); + } + }, + + isStudioEditable() { + return this.studioEditable.value; + }, + + get displayOptionalFields() { + return this.isStudioEditable() || super.displayOptionalFields; + }, + + /** + * This function opens promote studio dialog + * + * @private + */ + onSelectedAddCustomField() { + this.env.services.dialog.add(PromoteStudioDialog, { + title: _t("Odoo Studio - Add new fields to any view"), + }); + }, +}); + +export const unpatchListRendererDesktop = patch(ListRenderer.prototype, patchListRendererDesktop()); diff --git a/third_party_addons/ica_web_responsive/static/src/views/list/list_renderer_desktop.xml b/third_party_addons/ica_web_responsive/static/src/views/list/list_renderer_desktop.xml new file mode 100644 index 000000000..dbab49517 --- /dev/null +++ b/third_party_addons/ica_web_responsive/static/src/views/list/list_renderer_desktop.xml @@ -0,0 +1,16 @@ + + + + + + +