mirror of https://github.com/OCA/web.git
[ADD] web_calendar_color_field
parent
4b7d4d3e32
commit
2fcb49dc93
|
@ -0,0 +1 @@
|
||||||
|
../../../../web_calendar_color_field
|
|
@ -0,0 +1,6 @@
|
||||||
|
import setuptools
|
||||||
|
|
||||||
|
setuptools.setup(
|
||||||
|
setup_requires=['setuptools-odoo'],
|
||||||
|
odoo_addon=True,
|
||||||
|
)
|
|
@ -0,0 +1,16 @@
|
||||||
|
# Copyright 2019 Iván Todorovich
|
||||||
|
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||||
|
{
|
||||||
|
"name": "Calendar Color Field",
|
||||||
|
"version": "14.0.1.0.0",
|
||||||
|
"category": "Web",
|
||||||
|
"website": "https://github.com/OCA/web",
|
||||||
|
"author": "Iván Todorovich, Odoo Community Association (OCA)",
|
||||||
|
"license": "AGPL-3",
|
||||||
|
"depends": [
|
||||||
|
"web",
|
||||||
|
],
|
||||||
|
"data": [
|
||||||
|
"views/assets.xml",
|
||||||
|
],
|
||||||
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
* Iván Todorovich <ivan.todorovich@gmail.com>
|
|
@ -0,0 +1,9 @@
|
||||||
|
This is a technical module. It doesn't do anything on its own.
|
||||||
|
|
||||||
|
Odoo introduced a mechanism to set the desired color for a calendar filter,
|
||||||
|
through the field's `color` attribute.
|
||||||
|
|
||||||
|
Unfortunately, this only works for filters, but not if we want to use the
|
||||||
|
calendar's `color` attribute.
|
||||||
|
|
||||||
|
This module makes the appropiate changes so that the filter's color is used, if available.
|
|
@ -0,0 +1,13 @@
|
||||||
|
Set a color attribute value on any many2one calendar field set as filter and
|
||||||
|
set the calendar's color attribute to use the same many2one field.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
.. code-block:: xml
|
||||||
|
|
||||||
|
<calendar color="category_id">
|
||||||
|
<field name="category_id" filter="1" color="kanban_color"/>
|
||||||
|
</calendar>
|
||||||
|
|
||||||
|
- `category_id` is a `Many2one` field in your record.
|
||||||
|
- `kanban_color` is an integer field in your category record.
|
|
@ -0,0 +1,67 @@
|
||||||
|
odoo.define("web_calendar_color_field.CalendarModel", function (require) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
const CalendarModel = require("web.CalendarModel");
|
||||||
|
|
||||||
|
CalendarModel.include({
|
||||||
|
/**
|
||||||
|
* Overload to handle custom colorIndex
|
||||||
|
*
|
||||||
|
* Default beaviour when using a many2one field as color attribute
|
||||||
|
* is to generate random colors based on the record id.
|
||||||
|
*
|
||||||
|
* We are changing that behaviour to play nicely with the newly added
|
||||||
|
* <field filter="1" color="color"/> color attribute.
|
||||||
|
*
|
||||||
|
* If the field is also added to filters, and a color field is defined,
|
||||||
|
* we use that color field as colorIndex.
|
||||||
|
*/
|
||||||
|
_loadColors: function (element, events) {
|
||||||
|
var self = this;
|
||||||
|
if (this.fieldColor) {
|
||||||
|
var fieldName = this.fieldColor;
|
||||||
|
var filter = this.data.filters[fieldName];
|
||||||
|
if (filter && filter.color_model && filter.field_color) {
|
||||||
|
// If we haven't loaded the color fields, we do it, and we
|
||||||
|
// store it in self._field_color_map. We only do it once,
|
||||||
|
// because subsequent calls will simply read it from the map.
|
||||||
|
// Note: _loadRecordsToFilters will also read these values
|
||||||
|
// from db, but on first render it's called after this method
|
||||||
|
var defs = [];
|
||||||
|
if (!this._field_color_map) {
|
||||||
|
var ids = _.map(events, function (event) {
|
||||||
|
return event.record[fieldName][0];
|
||||||
|
});
|
||||||
|
defs.push(
|
||||||
|
this._rpc({
|
||||||
|
model: filter.color_model,
|
||||||
|
method: "read",
|
||||||
|
args: [_.uniq(ids), [filter.field_color]],
|
||||||
|
}).then(function (res) {
|
||||||
|
self._field_color_map = self._field_color_map || {};
|
||||||
|
_.each(res, function (item) {
|
||||||
|
self._field_color_map[item.id] =
|
||||||
|
item[filter.field_color];
|
||||||
|
});
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
||||||
|
Promise.all(defs).then(function () {
|
||||||
|
_.each(events, function (event) {
|
||||||
|
var value = event.record[fieldName][0];
|
||||||
|
event.color_index = self._field_color_map[value];
|
||||||
|
});
|
||||||
|
});
|
||||||
|
// Don't set model color, so that filters generate their own
|
||||||
|
// https://github.com/odoo/odoo/blob/14.0/addons/web/static/src/js/views/calendar/calendar_model.js#L629
|
||||||
|
// this.model_color = this.fields[fieldName].relation || element.model;
|
||||||
|
} else {
|
||||||
|
return this._super.apply(this, arguments);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Promise.resolve();
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
return CalendarModel;
|
||||||
|
});
|
|
@ -0,0 +1,11 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<odoo>
|
||||||
|
<template id="assets_backend" inherit_id="web.assets_backend">
|
||||||
|
<xpath expr="." position="inside">
|
||||||
|
<script
|
||||||
|
type="text/javascript"
|
||||||
|
src="/web_calendar_color_field/static/src/js/calendar.js"
|
||||||
|
/>
|
||||||
|
</xpath>
|
||||||
|
</template>
|
||||||
|
</odoo>
|
Loading…
Reference in New Issue