3
0
Fork 0

[ADD] web_view_calendar_column

12.0
Enric Tobella 2019-10-08 18:06:58 +02:00
parent 8ec76cf415
commit d179ca658f
15 changed files with 775 additions and 0 deletions

View File

@ -0,0 +1,88 @@
========================
Web View Calendar Column
========================
.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fweb-lightgray.png?logo=github
:target: https://github.com/OCA/web/tree/11.0/web_view_calendar_column
:alt: OCA/web
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/web-11-0/web-11-0-web_view_calendar_column
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
:target: https://runbot.odoo-community.org/runbot/162/11.0
:alt: Try me on Runbot
|badge1| |badge2| |badge3| |badge4| |badge5|
This module allows to configure multiple columns on calendar daily views.
This module only changes the daily view, weekly view and monthly view will
not change.
**Table of contents**
.. contents::
:local:
Usage
=====
In order to define columns, we must access the action of the menu and edit the
context.
We should add the item column with the name of the field to use.
If we want to define a set of options, we can use `force_columns` on the
context.
With the force column, we will define a dictionary with the field value as key
and column name as value.
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/web/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us smashing it by providing a detailed and welcomed
`feedback <https://github.com/OCA/web/issues/new?body=module:%20web_view_calendar_column%0Aversion:%2011.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Do not contact contributors directly about support or help with technical issues.
Credits
=======
Authors
~~~~~~~
* Creu Blanca
Contributors
~~~~~~~~~~~~
* Enric Tobella <etobella@creublanca.es>
Maintainers
~~~~~~~~~~~
This module is maintained by the OCA.
.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org
OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
This module is part of the `OCA/web <https://github.com/OCA/web/tree/11.0/web_view_calendar_column>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

View File

@ -0,0 +1,18 @@
# Copyright 2019 Creu Blanca
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
{
'name': 'Web View Calendar Column',
'summary': """
Allow to define columns on calendars""",
'version': '11.0.1.0.0',
'license': 'AGPL-3',
'author': 'Creu Blanca,Odoo Community Association (OCA)',
'website': 'https://github.com/OCA/web',
'depends': [
'web',
],
'data': [
'views/assets.xml',
],
}

View File

@ -0,0 +1 @@
* Enric Tobella <etobella@creublanca.es>

View File

@ -0,0 +1,4 @@
This module allows to configure multiple columns on calendar daily views.
This module only changes the daily view, weekly view and monthly view will
not change.

View File

@ -0,0 +1,8 @@
In order to define columns, we must access the action of the menu and edit the
context.
We should add the item column with the name of the field to use.
If we want to define a set of options, we can use `force_columns` on the
context.
With the force column, we will define a dictionary with the field value as key
and column name as value.

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

View File

@ -0,0 +1,432 @@
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils 0.14: http://docutils.sourceforge.net/" />
<title>Web View Calendar Column</title>
<style type="text/css">
/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 7952 2016-07-26 18:15:59Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/
/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
border: 0 }
table.borderless td, table.borderless th {
/* Override padding for "table.docutils td" with "! important".
The right padding separates the table cells. */
padding: 0 0.5em 0 0 ! important }
.first {
/* Override more specific margin styles with "! important". */
margin-top: 0 ! important }
.last, .with-subtitle {
margin-bottom: 0 ! important }
.hidden {
display: none }
.subscript {
vertical-align: sub;
font-size: smaller }
.superscript {
vertical-align: super;
font-size: smaller }
a.toc-backref {
text-decoration: none ;
color: black }
blockquote.epigraph {
margin: 2em 5em ; }
dl.docutils dd {
margin-bottom: 0.5em }
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
overflow: hidden;
}
/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
font-weight: bold }
*/
div.abstract {
margin: 2em 5em }
div.abstract p.topic-title {
font-weight: bold ;
text-align: center }
div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
margin: 2em ;
border: medium outset ;
padding: 1em }
div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
font-weight: bold ;
font-family: sans-serif }
div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title, .code .error {
color: red ;
font-weight: bold ;
font-family: sans-serif }
/* Uncomment (and remove this text!) to get reduced vertical space in
compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
margin-bottom: 0.5em }
div.compound .compound-last, div.compound .compound-middle {
margin-top: 0.5em }
*/
div.dedication {
margin: 2em 5em ;
text-align: center ;
font-style: italic }
div.dedication p.topic-title {
font-weight: bold ;
font-style: normal }
div.figure {
margin-left: 2em ;
margin-right: 2em }
div.footer, div.header {
clear: both;
font-size: smaller }
div.line-block {
display: block ;
margin-top: 1em ;
margin-bottom: 1em }
div.line-block div.line-block {
margin-top: 0 ;
margin-bottom: 0 ;
margin-left: 1.5em }
div.sidebar {
margin: 0 0 0.5em 1em ;
border: medium outset ;
padding: 1em ;
background-color: #ffffee ;
width: 40% ;
float: right ;
clear: right }
div.sidebar p.rubric {
font-family: sans-serif ;
font-size: medium }
div.system-messages {
margin: 5em }
div.system-messages h1 {
color: red }
div.system-message {
border: medium outset ;
padding: 1em }
div.system-message p.system-message-title {
color: red ;
font-weight: bold }
div.topic {
margin: 2em }
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
margin-top: 0.4em }
h1.title {
text-align: center }
h2.subtitle {
text-align: center }
hr.docutils {
width: 75% }
img.align-left, .figure.align-left, object.align-left, table.align-left {
clear: left ;
float: left ;
margin-right: 1em }
img.align-right, .figure.align-right, object.align-right, table.align-right {
clear: right ;
float: right ;
margin-left: 1em }
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
table.align-center {
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left }
.align-center {
clear: both ;
text-align: center }
.align-right {
text-align: right }
/* reset inner alignment in figures */
div.align-right {
text-align: inherit }
/* div.align-center * { */
/* text-align: left } */
.align-top {
vertical-align: top }
.align-middle {
vertical-align: middle }
.align-bottom {
vertical-align: bottom }
ol.simple, ul.simple {
margin-bottom: 1em }
ol.arabic {
list-style: decimal }
ol.loweralpha {
list-style: lower-alpha }
ol.upperalpha {
list-style: upper-alpha }
ol.lowerroman {
list-style: lower-roman }
ol.upperroman {
list-style: upper-roman }
p.attribution {
text-align: right ;
margin-left: 50% }
p.caption {
font-style: italic }
p.credits {
font-style: italic ;
font-size: smaller }
p.label {
white-space: nowrap }
p.rubric {
font-weight: bold ;
font-size: larger ;
color: maroon ;
text-align: center }
p.sidebar-title {
font-family: sans-serif ;
font-weight: bold ;
font-size: larger }
p.sidebar-subtitle {
font-family: sans-serif ;
font-weight: bold }
p.topic-title {
font-weight: bold }
pre.address {
margin-bottom: 0 ;
margin-top: 0 ;
font: inherit }
pre.literal-block, pre.doctest-block, pre.math, pre.code {
margin-left: 2em ;
margin-right: 2em }
pre.code .ln { color: grey; } /* line numbers */
pre.code, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
pre.code .literal.string, code .literal.string { color: #0C5404 }
pre.code .name.builtin, code .name.builtin { color: #352B84 }
pre.code .deleted, code .deleted { background-color: #DEB0A1}
pre.code .inserted, code .inserted { background-color: #A3D289}
span.classifier {
font-family: sans-serif ;
font-style: oblique }
span.classifier-delimiter {
font-family: sans-serif ;
font-weight: bold }
span.interpreted {
font-family: sans-serif }
span.option {
white-space: nowrap }
span.pre {
white-space: pre }
span.problematic {
color: red }
span.section-subtitle {
/* font-size relative to parent (h1..h6 element) */
font-size: 80% }
table.citation {
border-left: solid 1px gray;
margin-left: 1px }
table.docinfo {
margin: 2em 4em }
table.docutils {
margin-top: 0.5em ;
margin-bottom: 0.5em }
table.footnote {
border-left: solid 1px black;
margin-left: 1px }
table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
padding-left: 0.5em ;
padding-right: 0.5em ;
vertical-align: top }
table.docutils th.field-name, table.docinfo th.docinfo-name {
font-weight: bold ;
text-align: left ;
white-space: nowrap ;
padding-left: 0 }
/* "booktabs" style (no vertical lines) */
table.docutils.booktabs {
border: 0px;
border-top: 2px solid;
border-bottom: 2px solid;
border-collapse: collapse;
}
table.docutils.booktabs * {
border: 0px;
}
table.docutils.booktabs th {
border-bottom: thin solid;
text-align: left;
}
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
font-size: 100% }
ul.auto-toc {
list-style-type: none }
</style>
</head>
<body>
<div class="document" id="web-view-calendar-column">
<h1 class="title">Web View Calendar Column</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/web/tree/11.0/web_view_calendar_column"><img alt="OCA/web" src="https://img.shields.io/badge/github-OCA%2Fweb-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/web-11-0/web-11-0-web_view_calendar_column"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/162/11.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p>
<p>This module allows to configure multiple columns on calendar daily views.</p>
<p>This module only changes the daily view, weekly view and monthly view will
not change.</p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#usage" id="id1">Usage</a></li>
<li><a class="reference internal" href="#bug-tracker" id="id2">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="id3">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="id4">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="id5">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="id6">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="usage">
<h1><a class="toc-backref" href="#id1">Usage</a></h1>
<p>In order to define columns, we must access the action of the menu and edit the
context.
We should add the item column with the name of the field to use.</p>
<p>If we want to define a set of options, we can use <cite>force_columns</cite> on the
context.
With the force column, we will define a dictionary with the field value as key
and column name as value.</p>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#id2">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/web/issues">GitHub Issues</a>.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us smashing it by providing a detailed and welcomed
<a class="reference external" href="https://github.com/OCA/web/issues/new?body=module:%20web_view_calendar_column%0Aversion:%2011.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h1><a class="toc-backref" href="#id3">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#id4">Authors</a></h2>
<ul class="simple">
<li>Creu Blanca</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#id5">Contributors</a></h2>
<ul class="simple">
<li>Enric Tobella &lt;<a class="reference external" href="mailto:etobella&#64;creublanca.es">etobella&#64;creublanca.es</a>&gt;</li>
</ul>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#id6">Maintainers</a></h2>
<p>This module is maintained by the OCA.</p>
<a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a>
<p>OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.</p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/web/tree/11.0/web_view_calendar_column">OCA/web</a> project on GitHub.</p>
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
</div>
</div>
</div>
</body>
</html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,19 @@
odoo.define('web_view_calendar_column.CalendarController', function (require) {
"use strict";
var CalendarController = require('web.CalendarController');
CalendarController.include({
_onOpenCreate: function (event) {
if (event.data.resource && event.data.resource.id) {
var value = event.data.resource.id;
if (this.model.fields[this.model.fieldColumn].type === 'many2one')
value = parseInt(value);
this.context['default_'+ this.model.fieldColumn] = value;
}
else
this.context['default_'+ this.model.fieldColumn] = false;
return this._super.apply(this, arguments);
},
});
});

View File

@ -0,0 +1,57 @@
odoo.define('web_view_calendar_column.CalendarModel', function (require) {
"use strict";
var CalendarModel = require('web.CalendarModel');
var session = require('web.session');
var core = require('web.core');
var qweb = core.qweb;
var _t = core._t;
CalendarModel.include({
load: function (params) {
this.fieldColumn = params.fieldColumn;
this.forceColumns = params.forceColumns;
return this._super.apply(this, arguments);
},
_loadCalendar: function () {
var self = this;
return this._super.apply(this, arguments).then(function () {
self._compute_columns(self.data, self.data.data);
});
},
_compute_columns: function (element, events) {
if (this.fieldColumn && this.forceColumns) {
this.data.columns = this.forceColumns;
}
else if (this.fieldColumn) {
var fieldName = this.fieldColumn;
var columns = {}
var elements = events;
_.each(events, function (event) {
var value = event.record[fieldName];
var key = _.isArray(value) ? value[0] : value;
columns[key] = _.isArray(value) ? value[1] : value;
});
this.data.columns = columns;
}
},
_recordToCalendarEvent: function (evt) {
var result = this._super.apply(this, arguments);
var value = evt[this.fieldColumn];
result.resourceId = _.isArray(value) ? value[0] : value;
return result;
},
_getFullCalendarOptions: function () {
var result = this._super.apply(this, arguments);
if (this.fieldColumn)
result.resources = [];
return result;
},
calendarEventToRecord: function (event) {
var result = this._super.apply(this, arguments);
if (event.resourceId)
result[this.fieldColumn] = event.resourceId;
return result;
},
});
});

View File

@ -0,0 +1,92 @@
odoo.define('web_view_calendar_column.CalendarRenderer', function (require) {
"use strict";
var CalendarRenderer = require('web.CalendarRenderer');
var core = require('web.core');
var qweb = core.qweb;
var _t = core._t;
CalendarRenderer.include({
_initCalendar: function () {
var self = this;
this.$calendar = this.$(".o_calendar_widget");
// This seems like a workaround but apparently passing the locale
// in the options is not enough. We should initialize it beforehand
var locale = moment.locale();
$.fullCalendar.locale(locale);
//Documentation here : http://arshaw.com/fullcalendar/docs/
var fc_options = $.extend({}, this.state.fc_options, {
eventDrop: function (event) {
self.trigger_up('dropRecord', event);
},
eventResize: function (event) {
self.trigger_up('updateRecord', event);
},
eventClick: function (event) {
self.trigger_up('openEvent', event);
self.$calendar.fullCalendar('unselect');
},
select: function (target_date, end_date, event, _js_event, resource) {
var data = {'start': target_date, 'end': end_date, 'resource': resource};
if (self.state.context.default_name) {
data.title = self.state.context.default_name;
}
self.trigger_up('openCreate', data);
self.$calendar.fullCalendar('unselect');
},
eventRender: function (event, element) {
var $render = $(self._eventRender(event));
event.title = $render.find('.o_field_type_char:first').text();
element.find('.fc-content').html($render.html());
element.addClass($render.attr('class'));
var display_hour = '';
if (!event.allDay) {
var start = event.r_start || event.start;
var end = event.r_end || event.end;
var timeFormat = _t.database.parameters.time_format.search("%H") != -1 ? 'HH:mm': 'h:mma';
display_hour = start.format(timeFormat) + ' - ' + end.format(timeFormat);
if (display_hour === '00:00 - 00:00') {
display_hour = _t('All day');
}
}
element.find('.fc-content .fc-time').text(display_hour);
},
// Dirty hack to ensure a correct first render
eventAfterAllRender: function () {
$(window).trigger('resize');
},
viewRender: function (view) {
// compute mode from view.name which is either 'month', 'agendaWeek' or 'agendaDay'
var mode = view.name === 'month' ? 'month' : (view.name === 'agendaWeek' ? 'week' : 'day');
// compute title: in week mode, display the week number
var title = mode === 'week' ? view.intervalStart.week() : view.title;
self.trigger_up('viewUpdated', {
mode: mode,
title: title,
});
},
//eventResourceEditable: true, // except for between resources
height: 'parent',
unselectAuto: false,
locale: locale, // reset locale when fullcalendar has already been instanciated before now
});
this.$calendar.fullCalendar(fc_options);
},
_renderEvents: function () {
var self = this;
this.$calendar.fullCalendar('removeEvents');
if (this.state.columns)
_.each(Object.entries(this.state.columns), function (column) {
self.$calendar.fullCalendar('addResource', {
id: column[0],
title: column[1]
});
});
this.$calendar.fullCalendar(
'addEventSource', this.state.data);
},
});
});

View File

@ -0,0 +1,28 @@
odoo.define('web_view_calendar_column.CalendarView', function (require) {
"use strict";
var CalendarView = require('web.CalendarView');
CalendarView.include({
jsLibs: [
'/web/static/lib/fullcalendar/js/fullcalendar.js',
'/web_view_calendar_column/static/lib/scheduler.min.js'
],
cssLibs: [
'/web/static/lib/fullcalendar/css/fullcalendar.css',
'/web_view_calendar_column/static/lib/scheduler.min.css'
],
init: function (viewInfo, params) {
this._super.apply(this, arguments);
var arch = viewInfo.arch;
var fieldNames = this.loadParams.fieldNames;
if (params.context.column) {
var fieldName = params.context.column;
fieldNames.push(fieldName);
}
this.loadParams.fieldColumn = params.context.column;
this.loadParams.fieldNames = _.uniq(fieldNames);
this.loadParams.forceColumns = params.context.force_columns;
},
});
});

View File

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright 2019 Creu Blanca
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
<odoo>
<template id="assets_backend" inherit_id="web.assets_backend">
<xpath expr=".">
<script type="text/javascript" src="/web_view_calendar_column/static/src/js/calendar_view.js"/>
<script type="text/javascript" src="/web_view_calendar_column/static/src/js/calendar_model.js"/>
<script type="text/javascript" src="/web_view_calendar_column/static/src/js/calendar_renderer.js"/>
<script type="text/javascript" src="/web_view_calendar_column/static/src/js/calendar_controller.js"/>
</xpath>
</template>
</odoo>