summaryrefslogtreecommitdiff
path: root/ob_chatter_position
diff options
context:
space:
mode:
authorstephanchrst <stephanchrst@gmail.com>2022-10-24 12:01:57 +0700
committerstephanchrst <stephanchrst@gmail.com>2022-10-24 12:01:57 +0700
commit9e640373587dea1e612b34eca6308cb42458b714 (patch)
tree5222b900daef5a6eafceeed7c572c715891ae620 /ob_chatter_position
parent2b3c94874466c3dd0a05f0f81dd4b09bc3f87987 (diff)
Update __init__.py, __manifest__.py, and 21 more files...
Diffstat (limited to 'ob_chatter_position')
-rwxr-xr-xob_chatter_position/__init__.py2
-rwxr-xr-xob_chatter_position/__manifest__.py23
-rwxr-xr-xob_chatter_position/models/__init__.py2
-rwxr-xr-xob_chatter_position/models/res_users.py25
-rwxr-xr-xob_chatter_position/static/description/icon.pngbin0 -> 63977 bytes
-rwxr-xr-xob_chatter_position/static/description/images/chatter_position.gifbin0 -> 690784 bytes
-rwxr-xr-xob_chatter_position/static/description/images/chatter_position.pngbin0 -> 141676 bytes
-rwxr-xr-xob_chatter_position/static/description/images/chatter_position2.pngbin0 -> 105425 bytes
-rwxr-xr-xob_chatter_position/static/description/images/ob_chatter_position.pngbin0 -> 29544 bytes
-rwxr-xr-xob_chatter_position/static/description/images/pos_discount_restrict.pngbin0 -> 31607 bytes
-rwxr-xr-xob_chatter_position/static/description/images/pos_global_discount_amount_percentage.pngbin0 -> 21244 bytes
-rwxr-xr-xob_chatter_position/static/description/images/pos_payment_restriction.pngbin0 -> 36971 bytes
-rwxr-xr-xob_chatter_position/static/description/images/pos_product_tax_display.pngbin0 -> 19785 bytes
-rwxr-xr-xob_chatter_position/static/description/images/pos_sales_session_report.pngbin0 -> 38831 bytes
-rwxr-xr-xob_chatter_position/static/description/images/purchase_tax_summary.pngbin0 -> 19651 bytes
-rwxr-xr-xob_chatter_position/static/description/index.html139
-rwxr-xr-xob_chatter_position/static/src/js/form_chatter_position.js39
-rwxr-xr-xob_chatter_position/static/src/scss/attachment_viewer.scss52
-rwxr-xr-xob_chatter_position/static/src/scss/chatter_position.scss339
-rwxr-xr-xob_chatter_position/static/src/xml/form_buttons.xml15
-rwxr-xr-xob_chatter_position/views/assets.xml10
-rwxr-xr-xob_chatter_position/views/res_users.xml13
-rwxr-xr-xob_chatter_position/views/web.xml13
23 files changed, 672 insertions, 0 deletions
diff --git a/ob_chatter_position/__init__.py b/ob_chatter_position/__init__.py
new file mode 100755
index 0000000..a0fdc10
--- /dev/null
+++ b/ob_chatter_position/__init__.py
@@ -0,0 +1,2 @@
+# -*- coding: utf-8 -*-
+from . import models
diff --git a/ob_chatter_position/__manifest__.py b/ob_chatter_position/__manifest__.py
new file mode 100755
index 0000000..c337320
--- /dev/null
+++ b/ob_chatter_position/__manifest__.py
@@ -0,0 +1,23 @@
+# -*- coding: utf-8 -*-
+{
+ "name": "Chatter Position",
+ "summary": "Chatter Position",
+ "version": "14.0.1.0.3",
+ 'author': "Odoo Being, Odoo Community Association (OCA)",
+ 'website': "https://www.odoobeing.com",
+ 'license': "LGPL-3",
+ "category": "Extra Tools",
+ 'images': ['static/description/images/ob_chatter_position.png'],
+ 'support': 'odoobeing@gmail.com',
+ "depends": ["web", "mail"],
+ "data": [
+ "views/res_users.xml",
+ "views/web.xml",
+ "views/assets.xml",
+ ],
+ 'qweb': [
+ 'static/src/xml/form_buttons.xml',
+ ],
+ 'installable': True,
+ 'auto_install': False,
+}
diff --git a/ob_chatter_position/models/__init__.py b/ob_chatter_position/models/__init__.py
new file mode 100755
index 0000000..741ed46
--- /dev/null
+++ b/ob_chatter_position/models/__init__.py
@@ -0,0 +1,2 @@
+# -*- coding: utf-8 -*-
+from . import res_users
diff --git a/ob_chatter_position/models/res_users.py b/ob_chatter_position/models/res_users.py
new file mode 100755
index 0000000..fab83a7
--- /dev/null
+++ b/ob_chatter_position/models/res_users.py
@@ -0,0 +1,25 @@
+# -*- coding: utf-8 -*-
+from odoo import fields, models
+
+
+class ResUsers(models.Model):
+ _inherit = "res.users"
+
+ chatter_position = fields.Selection(
+ [("normal", "Normal"), ("sided", "Sided")],
+ default="sided",
+ )
+
+ # Override so that the user can change the chatter_position field
+
+ def __init__(self, pool, cr):
+ """ Override of init to allow user to set its chatter position. """
+ init_res = super(ResUsers, self).__init__(pool, cr)
+
+ # duplicate list to avoid modifying the original reference
+ type(self).SELF_WRITEABLE_FIELDS = list(self.SELF_WRITEABLE_FIELDS)
+ type(self).SELF_WRITEABLE_FIELDS.extend(['chatter_position'])
+
+ type(self).SELF_READABLE_FIELDS = list(self.SELF_READABLE_FIELDS)
+ type(self).SELF_READABLE_FIELDS.extend(['chatter_position'])
+ return init_res
diff --git a/ob_chatter_position/static/description/icon.png b/ob_chatter_position/static/description/icon.png
new file mode 100755
index 0000000..eeffbd9
--- /dev/null
+++ b/ob_chatter_position/static/description/icon.png
Binary files differ
diff --git a/ob_chatter_position/static/description/images/chatter_position.gif b/ob_chatter_position/static/description/images/chatter_position.gif
new file mode 100755
index 0000000..be22b04
--- /dev/null
+++ b/ob_chatter_position/static/description/images/chatter_position.gif
Binary files differ
diff --git a/ob_chatter_position/static/description/images/chatter_position.png b/ob_chatter_position/static/description/images/chatter_position.png
new file mode 100755
index 0000000..6a68448
--- /dev/null
+++ b/ob_chatter_position/static/description/images/chatter_position.png
Binary files differ
diff --git a/ob_chatter_position/static/description/images/chatter_position2.png b/ob_chatter_position/static/description/images/chatter_position2.png
new file mode 100755
index 0000000..78bd986
--- /dev/null
+++ b/ob_chatter_position/static/description/images/chatter_position2.png
Binary files differ
diff --git a/ob_chatter_position/static/description/images/ob_chatter_position.png b/ob_chatter_position/static/description/images/ob_chatter_position.png
new file mode 100755
index 0000000..bd32eb5
--- /dev/null
+++ b/ob_chatter_position/static/description/images/ob_chatter_position.png
Binary files differ
diff --git a/ob_chatter_position/static/description/images/pos_discount_restrict.png b/ob_chatter_position/static/description/images/pos_discount_restrict.png
new file mode 100755
index 0000000..c87a822
--- /dev/null
+++ b/ob_chatter_position/static/description/images/pos_discount_restrict.png
Binary files differ
diff --git a/ob_chatter_position/static/description/images/pos_global_discount_amount_percentage.png b/ob_chatter_position/static/description/images/pos_global_discount_amount_percentage.png
new file mode 100755
index 0000000..545a55b
--- /dev/null
+++ b/ob_chatter_position/static/description/images/pos_global_discount_amount_percentage.png
Binary files differ
diff --git a/ob_chatter_position/static/description/images/pos_payment_restriction.png b/ob_chatter_position/static/description/images/pos_payment_restriction.png
new file mode 100755
index 0000000..d80630a
--- /dev/null
+++ b/ob_chatter_position/static/description/images/pos_payment_restriction.png
Binary files differ
diff --git a/ob_chatter_position/static/description/images/pos_product_tax_display.png b/ob_chatter_position/static/description/images/pos_product_tax_display.png
new file mode 100755
index 0000000..60a62aa
--- /dev/null
+++ b/ob_chatter_position/static/description/images/pos_product_tax_display.png
Binary files differ
diff --git a/ob_chatter_position/static/description/images/pos_sales_session_report.png b/ob_chatter_position/static/description/images/pos_sales_session_report.png
new file mode 100755
index 0000000..97020bd
--- /dev/null
+++ b/ob_chatter_position/static/description/images/pos_sales_session_report.png
Binary files differ
diff --git a/ob_chatter_position/static/description/images/purchase_tax_summary.png b/ob_chatter_position/static/description/images/purchase_tax_summary.png
new file mode 100755
index 0000000..5f8365b
--- /dev/null
+++ b/ob_chatter_position/static/description/images/purchase_tax_summary.png
Binary files differ
diff --git a/ob_chatter_position/static/description/index.html b/ob_chatter_position/static/description/index.html
new file mode 100755
index 0000000..09a0202
--- /dev/null
+++ b/ob_chatter_position/static/description/index.html
@@ -0,0 +1,139 @@
+<div class="row" style="margin:75px 0;position: relative;color: #000;background-position: center;background: #ffffff;border-bottom: 1px solid #e4e4e4; padding-bottom: 30px;">
+ <div class="col-md-12 col-sm-12 col-xs-12" style="padding: 0px">
+ <div style=" margin: 0 0 0px;padding: 20px 0 10;font-size: 23px;line-height: 35px;font-weight: 400;color: #000;border-top: 1px solid rgba(255,255,255,0.1);border-bottom: 1px solid rgba(255,255,255,0.11);text-align: center;">
+ <h1 style="font-size: 39px;font-weight: 600;margin: 0px !important;"> Configurable Chatter Position. </h1>
+ </div>
+ <br>
+
+ <div class="col-md-12 col-sm-12 col-xs-12" style="padding: 0px">
+ <div style="margin-left: 18%;">
+ <img src="images/chatter_position.gif" class="mb-5" alt="Working of app"/>
+ </div>
+ </div>
+
+ <h2 style="font-weight: 600;font-size: 1.8rem;margin-top: 15px;">Features</h2>
+ <ul style=" padding: 0 1px; list-style: none; ">
+ <li style="display: flex;align-items: center;padding: 8px 0;font-size: 18px;">
+ <i class="fa fa-check-square-o" style="width:40px; color:#07B700"></i> Configurable Chatter Position.
+ </li>
+ <li style="display: flex;align-items: center;padding: 8px 0;font-size: 18px;">
+ <i class="fa fa-check-square-o" style="width:40px; color:#07B700"></i> Change Chatter Position from User Preferences.
+ </li>
+ <li style="display: flex;align-items: center;padding: 8px 0;font-size: 18px;">
+ <i class="fa fa-check-square-o" style="width:40px; color:#07B700"></i> Change Chatter Position on fly.
+ </li>
+ <li style="display: flex;align-items: center;padding: 8px 0;font-size: 18px;">
+ <i class="fa fa-check-square-o" style="width:40px; color:#07B700"></i> Supports Both Community & Enterprise Edition.
+ </li>
+ </ul>
+ </div>
+</div>
+
+<div>
+ <section class="oe_container" style="padding: 1rem 0rem 1rem; background-color: #ffffff !important;">
+ <div class="row py-4 px-3">
+ <div class="w-100" style="padding-top:30px;padding-bottom:45px;border-radius: 10px;">
+ <div class="tab-content" id="pills-tabContent"
+ style="padding-top: 30px; padding-bottom: 30px; padding: 30px;">
+ <!-- Screenshot tab-->
+ <h2 style="font-weight: 600;text-align: center;width: 100%;">Screenshots</h2>
+ <hr style="margin-top: 0px;margin-bottom: 2%;border: 0;text-align: center;border-top: 3px solid #d21c22;width: 5%;">
+ <div>
+ <section class="oe_container">
+ <div id="demo" class="row carousel slide mb32" data-ride="carousel">
+ <div class="carousel-inner">
+ <div class="carousel-item active" style="min-height: 0px;">
+ <div class="col-xs-12 col-sm-12 col-md-12 mb16 mt16" style="float: left;">
+ <h3 class="alert" style="font-weight:400;color: #091E42;background: #fff;text-align: left;border-radius: 0; font-size: 18px;"> <i class="fa fa-check-circle-o" style="width:40px; color:#07B700"></i> Chatter Position option in User Preferences </h3>
+ <div style=""> <img class="img img-responsive center-block" style="border-top-left-radius: 10px;border-top-right-radius: 10px;" src="images/chatter_position.png">
+ </div>
+ </div>
+ </div>
+ <div class="carousel-item " style="min-height: 0px;">
+ <div class="col-xs-12 col-sm-12 col-md-12 mb16 mt16" style="float: left;">
+ <h3 class="alert" style="font-weight:400;color: #091E42;background: #fff;text-align: left;border-radius: 0; font-size: 18px;"> <i class="fa fa-check-circle-o" style="width:40px; color:#07B700"></i> Change Chatter Position on fly using the button on top of Form Views </h3>
+ <div style=""> <img class="img img-responsive center-block" style="border-top-left-radius: 10px;border-top-right-radius: 10px;" src="images/chatter_position2.png">
+ </div>
+ </div>
+ </div>
+ </div>
+ <a class="carousel-control-prev" href="#demo" data-slide="prev" style="left:-25px;width: 35px;color: #000;"> <span class="carousel-control-prev-icon"><i class="fa fa-chevron-left" style="font-size:24px"></i></span> </a> <a class="carousel-control-next" href="#demo" data-slide="next" style="right:-25px;width: 35px;color: #000;"> <span class="carousel-control-next-icon"><i class="fa fa-chevron-right" style="font-size:24px"></i></span> </a>
+ </div>
+ </section>
+ </div>
+ </div>
+ </div>
+ </div>
+ </section>
+</div>
+
+<section class="oe_container" style="padding: 2rem 3rem 1rem;">
+ <h2 class="col-mg-12 col-lg-12 oe_slogan">
+ <a style="color: #000000;">
+ You may also like
+ </a>
+ </h2>
+ <div id="demo1" class="row carousel slide" data-ride="carousel">
+ <div class="carousel-inner">
+ <div class="carousel-item active" style="min-height: 0px;">
+ <div class="col-xs-6 col-sm-4 col-md-4 mb16 mt16" style="float: left;">
+ <a target="_blank" href="https://apps.odoo.com/apps/modules/15.0/ob_pos_session_report/">
+ <div style="box-shadow: 0 15px 35px rgba(50, 50, 93, 0.1), 0 5px 15px rgba(0, 0, 0, 0.07);border-radius: 10px;">
+ <img class="img img-responsive center-block" src="images/pos_sales_session_report.png" style="border-top-left-radius: 10px;border-top-right-radius: 10px;"/>
+ </div>
+ </a>
+ </div>
+ <div class="col-xs-6 col-sm-4 col-md-4 mb16 mt16" style="float: left;">
+ <a target="_blank" href="https://apps.odoo.com/apps/modules/15.0/ob_purchase_tax_summary/">
+ <div style="box-shadow: 0 15px 35px rgba(50, 50, 93, 0.1), 0 5px 15px rgba(0, 0, 0, 0.07);border-radius: 10px;">
+ <img class="img img-responsive center-block" src="images/purchase_tax_summary.png" style="border-top-left-radius: 10px;border-top-right-radius: 10px;"/>
+ </div>
+ </a>
+ </div>
+ <div class="col-xs-6 col-sm-4 col-md-4 mb16 mt16" style="float: left;">
+ <a target="_blank" href="https://apps.odoo.com/apps/modules/15.0/ob_pos_discount_restrict/">
+ <div style="box-shadow: 0 15px 35px rgba(50, 50, 93, 0.1), 0 5px 15px rgba(0, 0, 0, 0.07);border-radius: 10px;">
+ <img class="img img-responsive center-block" src="images/pos_discount_restrict.png" style="border-top-left-radius: 10px;border-top-right-radius: 10px;"/>
+ </div>
+ </a>
+ </div>
+ <div class="col-xs-6 col-sm-4 col-md-4 mb16 mt16" style="float: left;">
+ <a target="_blank" href="https://apps.odoo.com/apps/modules/15.0/ob_pos_payment_restriction/">
+ <div style="box-shadow: 0 15px 35px rgba(50, 50, 93, 0.1), 0 5px 15px rgba(0, 0, 0, 0.07);border-radius: 10px;">
+ <img class="img img-responsive center-block" src="images/pos_payment_restriction.png" style="border-top-left-radius: 10px;border-top-right-radius: 10px;"/>
+ </div>
+ </a>
+ </div>
+ <div class="col-xs-6 col-sm-4 col-md-4 mb16 mt16" style="float: left;">
+ <a target="_blank" href="https://apps.odoo.com/apps/modules/15.0/ob_pos_global_discount_selection/">
+ <div style="box-shadow: 0 15px 35px rgba(50, 50, 93, 0.1), 0 5px 15px rgba(0, 0, 0, 0.07);border-radius: 10px;">
+ <img class="img img-responsive center-block" src="images/pos_global_discount_amount_percentage.png" style="border-top-left-radius: 10px;border-top-right-radius: 10px;"/>
+ </div>
+ </a>
+ </div>
+ <div class="col-xs-6 col-sm-4 col-md-4 mb16 mt16" style="float: left;">
+ <a target="_blank" href="https://apps.odoo.com/apps/modules/15.0/ob_pos_tax_display/">
+ <div style="box-shadow: 0 15px 35px rgba(50, 50, 93, 0.1), 0 5px 15px rgba(0, 0, 0, 0.07);border-radius: 10px;">
+ <img class="img img-responsive center-block" src="images/pos_product_tax_display.png" style="border-top-left-radius: 10px;border-top-right-radius: 10px;"/>
+ </div>
+ </a>
+ </div>
+ </div>
+ <!-- <div class="carousel-item" style="min-height: 0px;"> -->
+ <!-- </div> -->
+ </div>
+ <a class="carousel-control-prev" href="#demo" data-slide="prev" style="left:-25px;width: 35px;color: #000;"> <span class="carousel-control-prev-icon"><i class="fa fa-chevron-left" style="font-size:24px"></i></span> </a> <a class="carousel-control-next" href="#demo" data-slide="next" style="right:-25px;width: 35px;color: #000;"> <span class="carousel-control-next-icon"><i class="fa fa-chevron-right" style="font-size:24px"></i></span> </a>
+ </div>
+</section>
+
+<h3 class="oe_slogan" style="margin-top:20px;" >Need Any Help Or Have Any Feature Requests?</h3>
+<div class="oe_slogan" style="margin-top:10px !important;">
+ <div>
+ <a class="btn btn-primary btn-lg mt8"
+ style="color: #FFFFFF !important;border-radius: 0;" href="mailto:odoobeing@gmail.com"><i
+ class="fa fa-envelope"></i> Email </a>
+ </div>
+ <br>
+</div>
+</section>
+</div>
diff --git a/ob_chatter_position/static/src/js/form_chatter_position.js b/ob_chatter_position/static/src/js/form_chatter_position.js
new file mode 100755
index 0000000..706b057
--- /dev/null
+++ b/ob_chatter_position/static/src/js/form_chatter_position.js
@@ -0,0 +1,39 @@
+odoo.define('ob_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 ($node) {
+ 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_normal")) {
+ 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_normal');
+ }
+ },
+ });
+
+ 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;
+
+ });
diff --git a/ob_chatter_position/static/src/scss/attachment_viewer.scss b/ob_chatter_position/static/src/scss/attachment_viewer.scss
new file mode 100755
index 0000000..874191c
--- /dev/null
+++ b/ob_chatter_position/static/src/scss/attachment_viewer.scss
@@ -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;
+ }
+}
diff --git a/ob_chatter_position/static/src/scss/chatter_position.scss b/ob_chatter_position/static/src/scss/chatter_position.scss
new file mode 100755
index 0000000..7616857
--- /dev/null
+++ b/ob_chatter_position/static/src/scss/chatter_position.scss
@@ -0,0 +1,339 @@
+$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;
+ }
+ }
+}
diff --git a/ob_chatter_position/static/src/xml/form_buttons.xml b/ob_chatter_position/static/src/xml/form_buttons.xml
new file mode 100755
index 0000000..638460e
--- /dev/null
+++ b/ob_chatter_position/static/src/xml/form_buttons.xml
@@ -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>
diff --git a/ob_chatter_position/views/assets.xml b/ob_chatter_position/views/assets.xml
new file mode 100755
index 0000000..b9c0c69
--- /dev/null
+++ b/ob_chatter_position/views/assets.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+ <template id="assets_backend" name="chatter_assets_backend" inherit_id="web.assets_backend">
+ <xpath expr="." position="inside">
+ <link rel="stylesheet" type="text/scss" href="/ob_chatter_position/static/src/scss/chatter_position.scss"/>
+ <link rel="stylesheet" type="text/scss" href="/ob_chatter_position/static/src/scss/attachment_viewer.scss"/>
+ <script type="text/javascript" src="/ob_chatter_position/static/src/js/form_chatter_position.js"></script>
+ </xpath>
+ </template>
+</odoo>
diff --git a/ob_chatter_position/views/res_users.xml b/ob_chatter_position/views/res_users.xml
new file mode 100755
index 0000000..1eb7cab
--- /dev/null
+++ b/ob_chatter_position/views/res_users.xml
@@ -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>
diff --git a/ob_chatter_position/views/web.xml b/ob_chatter_position/views/web.xml
new file mode 100755
index 0000000..55bccd4
--- /dev/null
+++ b/ob_chatter_position/views/web.xml
@@ -0,0 +1,13 @@
+<?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 'normal')" 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>