@o-kanban-record-margin: @flectra-horizontal-padding/2; @o-kanban-group-padding: @flectra-horizontal-padding; // Cannot be higher than this @o-kanban-default-record-width: 300px; @o-kanban-small-record-width: 240px; @o-kanban-header-title-height: 50px; @o-kanban-image-width: 64px; @o-kanban-inside-vgutter: 8px; @o-kanban-inside-hgutter: 8px; @o-kanban-color-border-width: 3px; @o-kanban-inside-hgutter-mobile: @flectra-horizontal-padding; @o-kanban-inner-hmargin: 5px; @o-kanban-progressbar-height: 20px; // ------- Kanban grouped mixins ------- .o-kanban-icon(@base-opacity: 0.5) { display: block; line-height: @o-kanban-header-title-height; text-align: center; color: @flectra-main-text-color; font-size: @font-size-small; cursor: pointer; .o-hover-opacity(@base-opacity); } .o-kanban-tag-color(@size: 0) when (@size < @flectra-nb-ui-color) { // Note: the 0 color is supposed to be invisible if there is a color field // but it is used as a default color when there is no color field &.o_tag_color_@{size} span { background-color: ~"@{flectra-color-@{size}}"; } .o-kanban-tag-color(@size + 1); } .o-kanban-record-color(@size: 1) when (@size < @flectra-nb-ui-color) { // Note: the 0 color is not defined as it is the 'no color' for kanban .oe_kanban_color_@{size}::after { background-color: ~"@{flectra-color-@{size}}"; } .o-kanban-record-color(@size + 1); } .o-kanban-slim-col() { position: relative; .o-flex(0, 0, auto); margin: 0; padding: 0 floor(@o-kanban-group-padding * 0.7); cursor: pointer; } .o-kanban-header-title() { .o-flex-display(); .o-align-items(center); height: @o-kanban-header-title-height; line-height: 2.2; color: @headings-color; } .o-kanban-v-title() { .o-position-absolute(@o-kanban-inside-vgutter * 2, @left: floor(-@o-kanban-inside-vgutter * 1.2)); .o-transform-origin(left, bottom, @z: 0); .o-transform(rotate(90deg)); overflow: visible; white-space: nowrap; font-size: 15px; } // ------- Kanban records mixins ------- .o-kanban-record-title(@font-size) { color: @headings-color; font-size: @font-size; font-weight: 500; margin-bottom: 0; margin-top: 0; } .o-kanban-dropdown(@padding-base: @o-kanban-inside-vgutter) { margin: -1px -1px auto auto; // compensate border padding: @padding-base/2 @padding-base; border: 1px solid transparent; border-bottom: none; vertical-align: top; color: @text-color; &:hover { color: @headings-color; } &:focus, &:active, &:focus:active { outline: none; } } .o-kanban-dropdown-open() { position: relative; background: white; border-color: @gray-lighter-darker; z-index: @zindex-dropdown + 1; } .o-kanban-dropdown-menu() { .o-position-absolute(@right: -1px); margin-top: -1px; border-color: @gray-lighter-darker; } .o-kanban-colorpicker() { max-width: 150px; padding: 3px (@flectra-dropdown-hpadding - @o-kanban-inner-hmargin) 3px @flectra-dropdown-hpadding; > li { display: inline-block; margin: @o-kanban-inner-hmargin @o-kanban-inner-hmargin 0 0; border: 1px solid white; box-shadow: 0 0 0 1px @gray-lighter-dark; > a { display: block; &::after { content: ""; display: block; width: 20px; height: 15px; } } // No Color &:first-child > a { position: relative; &::before { content: ""; .o-position-absolute(-2px, @left: 10px); display: block; width: 1px; height: 20px; .rotate(45deg); background-color: red; } &::after { background-color: white; } } } } // ------- Kanban View Layout ------- .o_kanban_view { .o-flex-display(); .o-align-content(stretch); overflow-x: visible; @media (max-width: @screen-xs-max) { padding: 0px!important; overflow-x: auto; } .o_kanban_record, .o_kanban_quick_create { padding: @o-kanban-inside-vgutter @o-kanban-inside-hgutter; border: 1px solid @gray-lighter-dark; background-color: white; @media (max-width: @screen-xs-max) { padding: @o-kanban-inside-vgutter @o-kanban-inside-hgutter-mobile; } } .o_kanban_quick_create { box-shadow: 0 0 20px -10px; margin: 0 @o-kanban-record-margin -1px @o-kanban-record-margin; input { width: 100%; margin: 2px 0 8px; padding: 3px 6px; color: @headings-color; font-weight: 500; } } .o_kanban_record { position: relative; display: inline-block; // Force the creation of a block formatting context to clear float items border-color: @gray-lighter-darker; min-width: 150px; margin: 0 0 -1px; // ------- Kanban Record, v11 Layout ------- // Records colours &::after { content: ""; .o-position-absolute(0, auto, 0, -1px); width: @o-kanban-color-border-width; } // Inner Sections .o_kanban_record_top, .o_kanban_record_body { margin-bottom: @o-kanban-inner-hmargin; } .o_kanban_record_top, .o_kanban_record_bottom { .o-flex-display(); } .o_kanban_record_top { .o-align-items(flex-start); .o_dropdown_kanban { // For v11 layout, reset positioning to default to properly use // flex-box position: relative; top: auto; right: auto; } .o_kanban_record_headings { line-height: 1.2; .o-flex(1, 1, auto); // Ensure long word doesn't break out of container word-wrap: break-word; overflow: hidden; } } .o_kanban_record_title { .o-kanban-record-title (@font-size: 13px); } .o_kanban_record_subtitle { display: block; margin-top: @o-kanban-inner-hmargin*0.5; } .o_kanban_record_bottom { .oe_kanban_bottom_left, .oe_kanban_bottom_right { .o-flex-display(); .o-align-items(center); height: 20px; } .oe_kanban_bottom_left { .o-flex(1, 1, auto); > * { margin-right: 6px; line-height: 1; } .o_priority_star { margin-top: 1px; font-size: 18px; } } .oe_kanban_bottom_right{ .o-flex(0, 1, auto); .oe_kanban_avatar { width: 20px; height: 20px; margin-left: 6px; } } .o_link_muted { color: @text-color; &:hover { color: @brand-primary; text-decoration: underline; } } } } // ------- Compatibility of old (<= v10) Generic layouts ------- // Kanban Records - Uniform Design // Provide a basic style for different kanban record layouts // --------------------------------------------------------- .oe_kanban_card, .o_kanban_record { // ------- v11 Layout + generic layouts (~v10) ------- // Kanban Record - Dropdown .o_dropdown_kanban { .o-position-absolute(@o-kanban-inside-vgutter, @o-kanban-inside-hgutter); visibility: hidden; @media (max-width: @screen-xs-max) { visibility: visible; } .dropdown-toggle { .o-kanban-dropdown(); margin: (-@o-kanban-inside-vgutter - 1px) (-@o-kanban-inside-hgutter - 1px) 0 0; } &.open .dropdown-toggle { .o-kanban-dropdown-open(); } .dropdown-menu { .o-kanban-dropdown-menu(); right: (-@o-kanban-inside-hgutter - 1); } } &:hover .o_dropdown_kanban, .o_dropdown_kanban.open { visibility: visible; } // Kanban Record - Dropdown colorpicker .oe_kanban_colorpicker { .o-kanban-colorpicker(); } // Kanban Record - Inner elements .o_field_many2manytags, .o_kanban_tags { display: block; margin-bottom: @o-kanban-inner-hmargin; line-height: 1.2; .o_tag { display: inline-block; margin-right: 4px; font-size: 11px; font-weight: 500; background-color: transparent; .o-kanban-tag-color(); span { display: inline-block; width: 6px; height: 6px; margin-right: 4px; border-radius: 100%; } } } // Commonly used to place an image beside the text // (e.g. Fleet, Employees, ...) .o_kanban_image { text-align: center; img { max-width: 100%; } } .o_kanban_button { margin-top: 15px; > button, > a { .o-position-absolute(@right: @o-kanban-record-margin, @bottom: @o-kanban-record-margin); @media (max-width: @screen-xs-max) { right: @o-kanban-inside-hgutter-mobile; } } } // Kanban Record - Utility classes &.oe_kanban_global_click, &.oe_kanban_global_click_edit { cursor: pointer; } &.ui-sortable-helper { .o-transform(rotate(-3deg)); box-shadow: 0 5px 25px -10px black; .transition(~"transform 0.6s, box-shadow 0.3s"); } .o_attachment_image > img { width: 100%; height: auto; margin-bottom: @o-kanban-inner-hmargin; } .o_progressbar { .o-flex-display(); height: @o-kanban-progressbar-height; .o_progressbar_title { .o-flex(0, 0, auto); } .o_progress { .o-flex(1, 1, auto); margin-top: 3px; } .o_progressbar_value { .o-flex(0, 0, auto); width: auto; height: 100%; text-align: right; } input.o_progressbar_value { width: 15%; margin-left: 8px; } } .o_kanban_image { float: left; width: @o-kanban-image-width; + div { padding-left: @o-kanban-image-width + @o-kanban-inside-hgutter; @media (max-width: @screen-xs-max) { padding-left: @o-kanban-image-width + @o-kanban-inside-hgutter-mobile; } } } .oe_kanban_details { width: 100%; ul { margin-bottom: @o-kanban-inner-hmargin*0.5;; padding-left: 0; list-style: none; font-size: @font-size-small; li { margin-bottom: 2px; } } } .o_kanban_footer { .o-flex-display(); .o-justify-content(space-between); .o-align-items(center); > * { .o-flex(0, 0, auto); } } .oe_kanban_text_red { color: #A61300; font-weight: bold; } .o_text_bold { font-weight: bold; } .o_text_block { display: block; } } // Kanban Grouped Layout &.o_kanban_grouped { min-height: 100%; padding: 0; background-color: @gray-lighter; .o_kanban_record, .o_kanban_quick_create { width: 100%; margin-left: 0; margin-right: 0; } &.o_kanban_small_column .o_kanban_group:not(.o_column_folded) { width: @o-kanban-small-record-width + 2*@o-kanban-group-padding; } } // Kanban Grouped Layout - Column default .o_kanban_group { .o-flex(0, 0, auto); padding: 0 @o-kanban-group-padding*2 @o-kanban-group-padding @o-kanban-group-padding; .o_kanban_header > .o_kanban_header_title { .o-kanban-header-title(); .o_column_title { .o-flex(1, 1, auto); .o-text-overflow(); font-size: 16px; font-weight: 500; } .o_column_unfold { display: none; } .o_kanban_quick_add i { .o-kanban-icon; margin-left: @o-kanban-inside-hgutter*2; } &:hover .o_kanban_config, .o_kanban_config.open { visibility: visible; margin-left: @o-kanban-inside-hgutter; } .o_kanban_config { visibility: hidden; i { .o-kanban-icon; } } } .o_kanban_load_more { padding: @o-kanban-record-margin 0; box-shadow: inset 0 10px 13px -13px black; text-align: center; } &.ui-sortable-helper { box-shadow: 0 0 30px -10px black; } &:not(.o_column_folded) { width: @o-kanban-default-record-width + 2*@o-kanban-group-padding; } &.o_kanban_dragged { background-color: @flectra-main-text-color; .o_kanban_record { visibility: hidden; } } } &.ui-sortable .o_kanban_header_title { cursor: move; } // Kanban Grouped Layout - Column Folded .o_kanban_group.o_column_folded { .o-kanban-slim-col(); background-color: @gray-lighter-dark; & + .o_kanban_group.o_column_folded { margin-left: 1px; } .o_kanban_header_title { position: relative; opacity: 0.5; .o_column_title { .o-kanban-v-title(); } .o_column_unfold { .o-kanban-icon(1); } } > .o_kanban_record, .o_kanban_quick_add, .o_kanban_config, .o_kanban_load_more { display: none!important; } &:hover, &.o_kanban_hover { .o_kanban_header_title { opacity: 1; } } } // Kanban Grouped Layout - "Create new column" column .o_column_quick_create { .o-kanban-slim-col(); .o_column_header { .o-kanban-header-title(); position: relative; opacity: 0.5; .o_kanban_title { .o-kanban-v-title(); } .o_kanban_add_column { .o-kanban-icon(1); } } .o_kanban_quick_create { display: none; width: @o-kanban-default-record-width; height: 100%; margin: 0 (-@o-kanban-group-padding/2); border: none; box-shadow: 0 0 20px -10px; background-color: @gray-lighter; input, input:focus, input:hover { font-size: 16px; background: @gray-lighter; outline: none; box-shadow: none; font-weight: 400; margin: 0; } } &:hover { .o_column_header, .o_kanban_add_column { opacity: 1; } } } // Kanban UN-grouped Layout &.o_kanban_ungrouped { .o-flex-flow(row, wrap); .o-justify-content(flex-start); padding: @o-kanban-record-margin (@flectra-horizontal-padding - @o-kanban-record-margin); .o_kanban_record { .o-flex(1, 1, auto); width: @o-kanban-default-record-width; margin: (@o-kanban-record-margin * 0.5) @o-kanban-record-margin; @media (max-width: @screen-xs-max) { margin: 0 0 -1px 0; .o-flex(1, 0, 100%); } &.o_kanban_ghost { height: 0; min-height: 0!important; // to prevent view writers to override this height visibility: hidden; margin-top: 0; margin-bottom: 0; padding: 0; } } } // Kanban special layouts &.o_kanban_nocontent { min-height: 0; padding: 0; } &.o_kanban_mobile .o_kanban_record { div.label { .o_text_overflow; } } // Records colours .o-kanban-record-color(); }