3
0
Fork 0

web_chatter_position: create module

15.0-ocabot-merge-pr-2789-by-pedrobaeza-bump-patch
JuMiSanAr 2022-07-26 09:11:47 +02:00
parent bc7096d036
commit c0805cfadd
17 changed files with 555 additions and 0 deletions

View File

@ -0,0 +1 @@
../../../../web_chatter_position

View File

@ -0,0 +1,6 @@
import setuptools
setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)

View File

@ -0,0 +1 @@
Wait for the bot to create a proper README.

View File

@ -0,0 +1 @@
from . import models

View File

@ -0,0 +1,27 @@
# Copyright 2022 Hynsys Technologies
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl).
{
"name": "Chatter Position",
"summary": "Add an option to change the chatter position",
"version": "15.0.1.0.0",
"author": "Hynsys Technologies, Camptocamp, Odoo Community Association (OCA)",
"website": "https://github.com/OCA/web",
"license": "LGPL-3",
"category": "Extra Tools",
"images": ["static/description/images/web_chatter_position.png"],
"depends": ["web", "mail"],
"data": ["views/res_users.xml", "views/web.xml"],
"assets": {
"web.assets_backend": [
"/web_chatter_position/static/src/scss/chatter_position.scss",
"/web_chatter_position/static/src/scss/attachment_viewer.scss",
"/web_chatter_position/static/src/js/form_chatter_position.js",
],
"web.assets_qweb": [
"/web_chatter_position/static/src/xml/form_buttons.xml",
],
},
"installable": True,
"auto_install": False,
}

View File

@ -0,0 +1 @@
from . import res_users

View File

@ -0,0 +1,23 @@
# Copyright 2022 Hynsys Technologies
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl).
from odoo import fields, models
class ResUsers(models.Model):
_inherit = "res.users"
chatter_position = fields.Selection(
[("bottom", "Bottom"), ("sided", "Sided")],
default="sided",
)
# Override so that the user can change the chatter_position field
@property
def SELF_READABLE_FIELDS(self):
return super().SELF_READABLE_FIELDS + ["chatter_position"]
@property
def SELF_WRITEABLE_FIELDS(self):
return super().SELF_WRITEABLE_FIELDS + ["chatter_position"]

View File

@ -0,0 +1,2 @@
* Hynsys Technologies <hynsystechnologies@gmail.com>
* Juan Miguel Sánchez Arce <juan.sanchez@camptocamp.com>

View File

@ -0,0 +1,4 @@
Configurable Chatter Position.
Change Chatter Position in User Preferences.
Change Chatter Position on the fly.
Supports Both Community & Enterprise Edition.

View File

@ -0,0 +1 @@
* This module implements the same feature as **web_responsive**. Once the enterprise interface is moved to community in version 16, only this module will be needed.

View File

@ -0,0 +1,2 @@
#. There's a **Chatter Position** option in **User Preferences**, where you can choose between "bottom" and "sided".
#. The position can also be changed on the fly using a new button on the top left side of Form Views.

View File

@ -0,0 +1,48 @@
// Copyright 2022 Hynsys Technologies
// License LGPL - 3.0 or later(http://www.gnu.org/licenses/lgpl).
odoo.define("web_chatter_position.ChatterPositionFormController", function (require) {
"use strict";
var config = require("web.config");
var FormController = require("web.FormController");
var FormRenderer = require("web.FormRenderer");
var ChatterPositionFormController = FormController.include({
renderButtons: function () {
this._super.apply(this, arguments);
if (this.$buttons) {
this.$buttons.on(
"click",
".o_chatter_position_button",
this._onChatterPosition.bind(this)
);
}
},
_onChatterPosition: function () {
if (this.$el.offsetParent().hasClass("o_chatter_position_bottom")) {
this.$el
.offsetParent()
.attr("class", "o_web_client o_chatter_position_sided");
} else if (this.$el.offsetParent().hasClass("o_chatter_position_sided")) {
this.$el
.offsetParent()
.attr("class", "o_web_client o_chatter_position_bottom");
}
},
});
FormRenderer.include({
_applyFormSizeClass: function () {
const formEl = this.$el[0];
if (config.device.size_class <= config.device.SIZES.XS) {
formEl.classList.add("o_xxs_form_view");
} else {
formEl.classList.remove("o_xxs_form_view");
}
},
});
return ChatterPositionFormController;
});

View File

@ -0,0 +1,52 @@
// Attachment Viewer
.o_web_client.o_chatter_position_sided .o_DialogManager_dialog {
/* Show sided viewer on large screens */
@include media-breakpoint-up(lg) {
position: static;
.o_AttachmentViewer_main {
padding-bottom: 20px;
}
.o_AttachmentViewer {
// On-top of navbar
z-index: 10;
position: absolute;
right: 0;
top: 0;
bottom: 0;
margin-left: auto;
background-color: rgba(0, 0, 0, 0.7);
width: $chatter_zone_width;
&.o_AttachmentViewer_maximized {
width: 100%;
}
/* Show/Hide control buttons (next, prev, etc..) */
&:hover .o_AttachmentViewer_buttonNavigation,
&:hover .o_AttachmentViewer_toolbar {
display: flex;
}
.o_AttachmentViewer_buttonNavigation,
.o_AttachmentViewer_toolbar {
display: none;
}
.o_AttachmentViewer_viewIframe {
width: 95%;
}
}
}
@include media-breakpoint-down(md) {
.o_AttachmentViewer_headerItemButtonMinimize,
.o_AttachmentViewer_headerItemButtonMaximize {
display: none;
}
}
}
/* Attachment Viewer Max/Min buttons only are useful in sided mode */
.o_web_client:not(.o_chatter_position_sided) {
.o_AttachmentViewer_headerItemButtonMinimize,
.o_AttachmentViewer_headerItemButtonMaximize {
display: none;
}
}

View File

@ -0,0 +1,338 @@
$chatter_zone_width: 35%;
// Size of labels
.o_web_client {
&.o_chatter_position_sided {
.o_action_manager {
.o_content,
.modal-content {
@include media-breakpoint-up(xl, $o-extra-grid-breakpoints) {
.o_inner_group {
.o_td_label {
min-width: 260px !important;
}
}
}
@include media-breakpoint-between(lg, xl, $o-extra-grid-breakpoints) {
.o_group_col_6 {
width: 100% !important;
}
}
}
}
}
&:not(.o_chatter_position_sided) {
@include media-breakpoint-up(lg, $o-extra-grid-breakpoints) {
.o_action_manager {
.o_content,
.modal-content {
.o_inner_group {
.o_td_label {
min-width: 260px !important;
}
}
}
}
}
}
}
// Normal views
.o_content,
.modal-content {
max-width: 100%;
// Form views
.o_form_view {
.o_form_sheet {
max-width: calc(100% - 32px);
overflow-x: auto;
}
.o_td_label .o_form_label:not(.o_status):not(.o_calendar_invitation) {
min-height: 23px;
@include media-breakpoint-up(md) {
margin-bottom: 10px;
}
}
.o_horizontal_separator {
font-size: 14px;
}
// Some UX improvements for form in edit mode
@include media-breakpoint-down(sm) {
.o_field_widget {
vertical-align: middle;
}
&.o_form_editable .o_field_widget {
&:not(.o_stat_info):not(.o_readonly_modifier):not(.oe_form_field_html):not(.o_field_image) {
min-height: 35px;
}
.o_x2m_control_panel {
margin-bottom: 10px;
}
&.o_field_float_percentage,
&.o_field_monetary,
&.o_field_many2manytags,
.o_field_many2one_selection {
align-items: center;
}
.o_field_many2one_selection .o_input_dropdown,
&.o_datepicker,
&.o_field_partner_autocomplete {
input {
min-height: 35px;
}
}
.o_external_button {
margin-left: 10px;
}
.o_dropdown_button,
.o_datepicker_button {
top: 8px;
right: 6px;
bottom: auto;
}
}
}
.o_FormRenderer_chatterContainer {
padding-top: 0;
.o_Activity_info {
flex-wrap: wrap;
}
.o_ActivityBox_title {
margin-bottom: 0;
}
.o_MessageList_separatorDate {
padding-bottom: 0;
}
}
// Sided chatter scrolling behavior
.o_Chatter {
height: fit-content;
.o_Chatter_fixedPanel {
position: sticky;
top: 0;
z-index: 1;
background-color: white;
padding-bottom: 10px;
}
.o_Chatter_scrollPanel {
overflow: initial;
}
}
// Sticky statusbar
.o_form_statusbar {
position: sticky;
top: 0;
z-index: 2;
}
// Support for long title (with ellipsis)
.oe_title {
span.o_field_widget:not(.oe_inline) {
max-width: 100%;
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
width: initial;
&:active {
white-space: normal;
}
}
}
@include media-breakpoint-down(sm) {
min-width: auto;
// More buttons border
.oe_button_box {
.o_dropdown_more {
button:last-child {
border-right: 1px solid gray("400");
}
}
}
// Avoid overflow on forms with title and/or button box
.oe_title {
max-width: 100%;
}
.oe_button_box + .oe_title,
.oe_button_box + .oe_avatar + .oe_title {
width: 100%;
}
// Avoid overflow on modals
.o_form_sheet {
min-width: auto;
}
// Render website inputs properly in phones
.o_group .o_field_widget.o_text_overflow {
// Overrides another !important
width: auto !important;
}
// Make all input groups vertical
.o_group_col_6,
.o_group_col_8 {
width: 100%;
}
// Statusbar buttons dropdown for mobiles
.o_statusbar_buttons_dropdown {
border: {
bottom: 0;
radius: 0;
top: 0;
}
height: 100%;
}
.o_statusbar_buttons.dropdown-menu {
.btn {
border-radius: 0;
border: 0;
width: 100%;
margin-bottom: 0.2rem;
white-space: nowrap;
@include media-breakpoint-down(xs) {
max-width: 80vw;
overflow: hidden;
text-overflow: ellipsis;
}
&:last-child {
margin-bottom: 0;
}
}
}
.o_statusbar_status {
// Arrow from rightmost button exceeds allowed width
.o_arrow_button:first-child::before {
content: none;
display: none;
}
}
// Full width in form sheets
.o_form_sheet,
.o_FormRenderer_chatterContainer {
min-width: auto;
max-width: 98%;
}
// Settings pages
.app_settings_block {
.row {
margin: 0;
}
}
.o_FormRenderer_chatterContainer {
padding-top: initial;
// Display send button on small screens
.o_Chatter_composer {
&.o-has-current-partner-avatar {
grid-template-columns: 0px 1fr;
padding: 1rem 1rem 1.5rem 1rem;
}
.o_Composer_sidebarMain {
display: none;
}
}
}
}
}
//No content message improvements on mobile
@include media-breakpoint-down(md) {
.o_view_nocontent {
top: 80px;
}
.o_nocontent_help {
box-shadow: none;
}
.o_sample_data_disabled {
display: none;
}
}
// Sided chatter, if user wants
.o_chatter_position_sided & {
@include media-breakpoint-up(lg) {
.o_form_view:not(.o_form_nosheet) {
display: flex;
flex-flow: row nowrap;
height: 100%;
.o_form_sheet_bg {
flex: 1 1 auto;
overflow: auto;
> .o_form_sheet {
min-width: unset;
}
}
.o_FormRenderer_chatterContainer {
border-left: 1px solid gray("400");
flex: 0 0 $chatter_zone_width;
max-width: initial;
min-width: initial;
overflow: auto;
.o_chatter_header_container {
padding-top: $grid-gutter-width * 0.5;
top: 0;
position: sticky;
background-color: $o-view-background-color;
z-index: 1;
// Scrollable input text to avoid hide conversation & buttons
.o_composer_text_field {
max-height: 120px;
overflow-y: auto !important; /* Forced because Odoo uses inline style */
}
.o_attachments_list {
overflow: auto;
max-height: $o-mail-attachment-image-size * 3;
margin-top: 0.4em;
}
.o_attachments_previews {
overflow: auto;
max-height: $o-mail-attachment-image-size * 6;
}
}
}
}
}
}
}
.o_FormRenderer_chatterContainer {
&.o-aside {
border-left: $border-width 0;
padding: map-get($spacers, 0);
width: $o-form-view-sheet-max-width !important;
.o_Message.o-not-discussion {
border-width: $border-width 0;
}
}
&.o-isInFormSheetBg:not(.o-aside) {
max-width: $o-form-view-sheet-max-width;
background-color: $white;
@include o-form-sheet-negative-margin;
&:not(.o-aside) {
width: auto;
border-top: 1px solid $border-color;
}
}
}

View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8" ?>
<templates id="form_view" xml:space="preserve">
<t t-extend="FormView.buttons">
<t t-jquery=".o_form_button_edit" t-operation="before">
<button type="button" class="btn btn-secondary o_chatter_position_button">
<i class="fa fa-arrows-h" />
</button>
</t>
<t t-jquery=".o_form_button_save" t-operation="before">
<button type="button" class="btn btn-secondary o_chatter_position_button">
<i class="fa fa-arrows-h" />
</button>
</t>
</t>
</templates>

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="view_users_form_simple_modif_chatter_position" model="ir.ui.view">
<field name="name">view.users.form.simple.modif.chatter.position</field>
<field name="model">res.users</field>
<field name="inherit_id" ref="base.view_users_form_simple_modif" />
<field name="arch" type="xml">
<xpath expr="//field[@name='email']" position="after">
<field name="chatter_position" readonly="0" />
</xpath>
</field>
</record>
</odoo>

View File

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<template id="webclient_bootstrap" inherit_id="web.webclient_bootstrap">
<xpath expr="//t[@t-set='body_classname']" position="attributes">
<attribute
name="t-value"
add="+ ' o_chatter_position_' + (request.env.user.chatter_position or 'bottom')"
separator=" "
/>
</xpath>
</template>
<template id="view_web_layout" inherit_id="web.layout" name="View Layout">
<xpath expr="//meta[last()]" position="after">
<meta
name="viewport"
content="width=device-width, initial-scale=1, user-scalable=no"
/>
</xpath>
</template>
</odoo>