This commit is contained in:
jke-openerp
2013-11-15 17:58:26 +01:00
parent f8eae2f9c9
commit 7e1c7030b2
2 changed files with 201 additions and 47 deletions
+184 -46
View File
@@ -21,32 +21,18 @@ openerp.web_calendar = function(instance) {
*/
// Dates
monthNames: Date.CultureInfo.monthNames,
monthNamesShort: Date.CultureInfo.abbreviatedMonthNames,
dayNames: Date.CultureInfo.dayNames,
dayNamesShort: Date.CultureInfo.abbreviatedDayNames,
// Label
weekNumberTitle: _t("W"),
allDayText: _t("all-day"),
// Functional
firstDay: Date.CultureInfo.firstDayOfWeek,
/* XXXvlab: propose a patch to formatDate
https://github.com/arshaw/fullcalendar/blob/0c20380d6967e6669633918c16047bc23eae50f2/src/date_util.js
So as to allow overriding of formatDate function only (and not formatDates), and
use datejs formatting codes.
*/
// columnFormat: {
// month: ,
// week: ,
// day: ,
// }
};
function is_virtual_id(id) {
@@ -73,10 +59,10 @@ openerp.web_calendar = function(instance) {
this.view_type = 'calendar';
this.COLOR_PALETTE = ['#f57900', '#cc0000', '#d400a8', '#75507b', '#3465a4', '#73d216', '#c17d11', '#edd400',
this.COLOR_PALETTE = ['#ffc900', '#cc0000', '#d400a8', '#75507b', '#3465a4', '#73d216', '#c17d11', '#edd400',
'#fcaf3e', '#ef2929', '#ff00c9', '#ad7fa8', '#729fcf', '#8ae234', '#e9b96e', '#fce94f',
'#ff8e00', '#ff0000', '#b0008c', '#9000ff', '#0078ff', '#00ff00', '#e6ff00', '#ffff00',
'#905000', '#9b0000', '#840067', '#510090', '#0000c9', '#009b00', '#9abe00', '#ffc900' ];
'#905000', '#9b0000', '#840067', '#510090', '#0000c9', '#009b00', '#9abe00', '#f57900' ];
this.color_map = {};
this.last_search = [];
@@ -102,11 +88,8 @@ openerp.web_calendar = function(instance) {
view_loading: function (fv) {
var self = this;
this.fields_view = fv;
this.$calendar = this.$el.find(".oe_fullcalendar_widget");
this.$small_calendar = this.$el.find(".oe_calendar_mini");
this.info_fields = [];
@@ -138,12 +121,17 @@ openerp.web_calendar = function(instance) {
this.view_id = fv.view_id;
this.mode = attrs.mode; // one of month, week or day
this.date_start = attrs.date_start; // Field name of starting date field
this.date_delay = attrs.date_delay; // duration
this.mode = attrs.mode; // one of month, week or day
this.date_start = attrs.date_start; // Field name of starting date field
this.date_delay = attrs.date_delay; // duration
this.date_stop = attrs.date_stop;
this.all_day = attrs.all_day; // boolean
this.all_day = attrs.all_day; // boolean
this.attendee_people = attrs.attendee;
this.how_display_event = '';
if (typeof attrs.display !== "undefined")
this.how_display_event = attrs.display; // String with [FIELD]
this.color_field = attrs.color;
this.color_string = fv.fields[this.color_field] ?
fv.fields[this.color_field].string : _t("Filter");
@@ -156,21 +144,20 @@ openerp.web_calendar = function(instance) {
}
this.fields = fv.fields;
for (var fld = 0; fld < fv.arch.children.length; fld++) {
this.info_fields.push(fv.arch.children[fld].attrs.name);
}
return (new instance.web.Model(this.dataset.model))
.call("check_access_rights", ["create", false])
.then(function (create_right) {
self.create_right = create_right;
self.init_fullcalendar().then(function() {
self.init_fullcalendar().then(function() {
debugger;
self.trigger('calendar_view_loaded', fv);
self.ready.resolve();
});
});
},
get_fc_init_options: function () {
@@ -204,6 +191,19 @@ openerp.web_calendar = function(instance) {
if (!self.options.read_only_mode) {
self.append_deletion_handle(event, element, view);
}
element.find('.fc-event-title').html(event.title);
if (event.attendees.indexOf(self.myPartnerID)<0) {
console.log("HIDE !!!!");
console.log(self.myPartnerID);
console.log(event.attendees);
element.hide();
}
else {
console.log("SHOW !!!!");
console.log(self.myPartnerID);
console.log(event.attendees);
}
},
eventClick: function (event) { self.open_event(event._id); },
select: function (start_date, end_date, all_day, _js_event, _view) {
@@ -239,7 +239,7 @@ openerp.web_calendar = function(instance) {
});
},
smallCalChanged: function (context) {
calendarMiniChanged: function (context) {
return function(datum,obj) {
var curView = context.$calendar.fullCalendar( 'getView');
var curDate = new Date(obj.currentYear , obj.currentMonth, obj.currentDay);
@@ -252,13 +252,50 @@ openerp.web_calendar = function(instance) {
else if (curView.name != "agendaDay" || (curView.name == "agendaDay" && curDate.compareTo(curView.start)==0)) {
context.$calendar.fullCalendar('changeView','agendaWeek');
}
context.$calendar.fullCalendar( 'gotoDate', obj.currentYear , obj.currentMonth, obj.currentDay);
context.$calendar.fullCalendar('gotoDate', obj.currentYear , obj.currentMonth, obj.currentDay);
}
},
init_fullcalendar: function() {
this.$small_calendar.datepicker({ onSelect: this.smallCalChanged(this) });
this.$calendar.fullCalendar(this.get_fc_init_options());
var self = this;
new instance.web.Model("res.users").query(["partner_id"]).filter([["id", "=",this.dataset.context.uid]]).first().then(
function(result) {
self.myPartnerID = result.partner_id[0];;
});
if (!this.sidebar && this.options.$sidebar) {
this.sidebar = new instance.web_calendar.Sidebar(this);
this.sidebar.appendTo(this.$el.find('.oe_calendar_sidebar_container'));
//Initialize small calendar
this.$small_calendar = self.$el.find(".oe_calendar_mini");
this.$small_calendar.datepicker({ onSelect: self.calendarMiniChanged(self) });
var sidebar_items = {};
//CALENDAR_FRIENDLY ==> should be moved in WEB_CALENDAR.Friends
new instance.web.Model("calendar.friendly").query(["name","partner_id"]).filter([["user_id", "=",this.dataset.context.uid]]).all().then(function(result) {
_.each(result, function(item) {
var filter_value = item.partner_id[0];
var filter_item = {
value: filter_value,
label: item.name,
color: self.get_color(filter_value)
};
sidebar_items[filter_value] = filter_item ;
});
self.myFriends = sidebar_items;
self.sidebar.filter.events_loaded(sidebar_items);
});
}
self.$calendar.fullCalendar(self.get_fc_init_options());
return $.when();
},
@@ -377,33 +414,86 @@ openerp.web_calendar = function(instance) {
*/
event_data_transform: function(evt) {
var self = this;
var date_start = instance.web.auto_str_to_date(evt[this.date_start]),
date_stop = this.date_stop ? instance.web.auto_str_to_date(evt[this.date_stop]) : null,
date_delay = evt[this.date_delay] || 1.0,
all_day = this.all_day ? evt[this.all_day] : false,
res_text = '';
res_computed_text = '',
the_title = '',
attendees = [];
if (this.date_stop && this.fields[this.date_stop].type == 'date') {
date_stop.addDay(1);
}
if (this.info_fields) {
res_text = _(this.info_fields)
var temp_ret = {};
res_computed_text = this.how_display_event;
_.each(this.info_fields, function (fieldname) {
var value = evt[fieldname];
if (_.contains(["many2one", "one2one"], self.fields[fieldname].type)) {
if (value === false)
temp_ret[fieldname] = null;
else if (value instanceof Array)
temp_ret[fieldname] = value[1]; // Yipee, no name_get to make
else
throw new Error("Incomplete data received from dataset for record " + evt.id);
}
else if (_.contains(["one2many","many2many"], self.fields[fieldname].type)) {
if (value === false)
temp_ret[fieldname] = null;
else if (value instanceof Array)
temp_ret[fieldname] = value; // if x2many, keep all id !
else
throw new Error("Incomplete data received from dataset for record " + evt.id);
}
else {
temp_ret[fieldname] = value;
}
res_computed_text = res_computed_text.replace("["+fieldname+"]",temp_ret[fieldname]);
});
if (res_computed_text.length) {
the_title = res_computed_text;
}
else {
var res_text= [];
_.each(temp_ret, function(val,key) { res_text.push(val)} );
the_title = res_text.join(', ');
}
if (typeof this.attendee_people !== "undefined") {
_.each(temp_ret[this.attendee_people],
function (partner_id) {
attendees.push(partner_id);
if (partner_id in self.myFriends && partner_id != self.myPartnerID) {
the_title += '<span class="oe_e" style="font-size:20px; color:'+ self.get_color(partner_id) +';background-color:rgba(255,255,255,0.7)">+</span>'
}
}
);
}
/* res_text = _(this.info_fields)
.chain()
.map(function(fieldname) {
var value = evt[fieldname];
if (_.contains(["one2many", "many2one", "one2one", "many2many"],
self.fields[fieldname].type)) {
var temp_ret = {};
if (_.contains(["one2many", "many2one", "one2one", "many2many"], self.fields[fieldname].type)) {
if (value === false) return null;
if (value instanceof Array)
return value[1]; // Yipee, no name_get to make
if (value instanceof Array) {
return value[1]; // Yipee, no name_get to make
}
throw new Error("Incomplete data received from dataset for record " + evt.id);
}
return value;
}).reject(function (x) {
return x === null;
}).value();
}).value(); */
}
if (!date_stop && date_delay) {
date_stop = date_start.clone().addHours(date_delay);
}
@@ -413,12 +503,12 @@ openerp.web_calendar = function(instance) {
var r = {
'start': date_start.toString('yyyy-MM-dd HH:mm:ss'),
'end': date_stop.toString('yyyy-MM-dd HH:mm:ss'),
'title': res_text.join(', '),
// check this with recurring data !
'allDay': (this.fields[this.date_start].type == 'date' ||
(this.all_day && evt[this.all_day]) || false),
'title': the_title, //res_text.join(', '),
'allDay': (this.fields[this.date_start].type == 'date' || (this.all_day && evt[this.all_day]) || false),
'id': evt.id,
'attendees':attendees
};
if (this.color_field && evt[this.color_field]) {
var color_key = evt[this.color_field];
if (typeof color_key === "object") {
@@ -428,7 +518,7 @@ openerp.web_calendar = function(instance) {
}
return r;
},
/**
* Transform fullcalendar event object to OpenERP Data object
*/
@@ -455,7 +545,6 @@ openerp.web_calendar = function(instance) {
data[this.all_day] = event.allDay;
}
if (this.date_delay) {
// XXXvlab: what if different dates ?
var diff_seconds = Math.round((event_end.getTime() - event.start.getTime()) / 1000);
data[this.date_delay] = diff_seconds / 3600;
}
@@ -593,7 +682,7 @@ openerp.web_calendar = function(instance) {
remove_event: function(id) {
var self = this;
function do_it() {
return $.when(self.dataset.unlink([id])).done(function() {
return $.when(self.dataset.unlink([id])).then(function() {
self.$calendar.fullCalendar('removeEvents', id);
});
}
@@ -980,10 +1069,13 @@ openerp.web_calendar = function(instance) {
$.async_when().done(function () {
self.calendar_view.appendTo(self.$el);
});
return loaded;
},
render_value: function() {
debugger;
var self = this;
this.dataset.set_ids(this.get("value"));
this.is_loaded = this.is_loaded.then(function() {
@@ -1110,6 +1202,52 @@ openerp.web_calendar = function(instance) {
instance.web.form.widgets.add('many2many_calendar','instance.web_calendar.FieldMany2ManyCalendar');
instance.web.form.widgets.add('one2many_calendar','instance.web_calendar.FieldOne2ManyCalendar');
instance.web_calendar.Sidebar = instance.web.Widget.extend({
template: 'CalendarView.sidebar',
start: function() {
this._super();
this.filter = new instance.web_calendar.SidebarFilter(this, this.getParent());
this.filter.appendTo(this.$el.find('.oe_calendar_filter'));
}
});
instance.web_calendar.SidebarFilter = instance.web.Widget.extend({
events: {
'change input:checkbox': 'filter_click'
},
init: function(parent, view) {
this._super(parent);
this.view = view;
},
events_loaded: function(filters) {
var selected_filters = this.view.selected_filters.slice(0);
this.$el.html(QWeb.render('CalendarView.sidebar.responsible', { filters: filters }));
this.$('div.oe_calendar_responsible input').each(function() {
if (_.indexOf(selected_filters, $(this).val()) > -1) {
$(this).click();
}
});
},
filter_click: function(e) {
var self = this,
responsibles = [],
$e = $(e.target);
this.view.selected_filters = [];
this.$('div.oe_calendar_responsible input:checked').each(function() {
responsibles.push($(this).val());
self.view.selected_filters.push($(this).val());
});
//scheduler.clearAll();
if (responsibles.length) {
this.view.events_loaded(this.view.dataset_events, function(filter_value) {
return _.indexOf(responsibles, filter_value.toString()) > -1;
}, true);
} else {
this.view.events_loaded(this.view.dataset_events, false, true);
}
}
});
};
@@ -10,11 +10,27 @@
</div>
</td>
<td class='oe_calendar_sidebar_container'>
<div class="oe_calendar_mini" />
</td>
</tr>
</table>
</t>
<t t-name="CalendarView.sidebar">
<div class="oe_calendar_sidebar">
<div class="oe_calendar_mini" />
<div class="oe_calendar_filter">
<h3><t t-esc="widget.getParent().color_string"/></h3>
</div>
</div>
</t>
<t t-name="CalendarView.sidebar.responsible">
<div t-foreach="filters" class="oe_calendar_responsible" t-attf-style="background: #{filters_value.color}">
<input type="checkbox" name="selection" t-att-value="filters_value.value" checked="checked"/>
<span><t t-esc="filters_value.label"/></span>
</div>
</t>
<div t-name="CalendarView.buttons" class="oe_calendar_buttons">
<t t-if="widget.options.action_buttons !== false">
<t t-if="widget.is_action_enabled('create') &amp;&amp;