Merge lp:~openerp-dev/openerp-web/trunk-improve-calendar-dragdrop-bth into lp:openerp-web

Proposed by Thibault Delavallée (OpenERP)
Status: Needs review
Proposed branch: lp:~openerp-dev/openerp-web/trunk-improve-calendar-dragdrop-bth
Merge into: lp:openerp-web
Diff against target: 322 lines (+120/-20)
5 files modified
addons/web/static/src/css/base.css (+5/-0)
addons/web/static/src/css/base.sass (+4/-0)
addons/web_calendar/static/src/js/calendar.js (+109/-20)
addons/web_kanban/static/src/css/kanban.css (+1/-0)
addons/web_kanban/static/src/css/kanban.sass (+1/-0)
To merge this branch: bzr merge lp:~openerp-dev/openerp-web/trunk-improve-calendar-dragdrop-bth
Reviewer Review Type Date Requested Status
OpenERP R&D Web Team Pending
Review via email: mp+169200@code.launchpad.net
To post a comment you must log in.
3758. By Jignesh Rathod(OpenERP)

Merge with latest web.

3759. By Bhumi Thakkar (Open ERP)

[MERGE]Merge lp:openerp-web.

3760. By Amit Bhavsar (Open ERP)

[MERGE] merge with latest trunk

3761. By Bhumi Thakkar (Open ERP)

[IMP]Get readonly modifiers from py file of date_start field of calendar view and set value of true or false to date_start field.

3762. By Bhumi Thakkar (Open ERP)

[MERGE]Merge lp:openerp-web.

3763. By Bhumi Thakkar (Open ERP)

[IMP]Get attrs of start_date field from calendar view.

3764. By Bhumi Thakkar (Open ERP)

[IMP]ON date_start field drag & drop will work and improved code.

3765. By Bhumi Thakkar (Open ERP)

[IMP]Improved code to remove exist data from object.

3766. By Bhumi Thakkar (Open ERP)

[MERGE]Merge lp:openerp-web.

3767. By Bhumi Thakkar (Open ERP)

[MERGE]Fixed issue of traceback on calendar view.

3768. By Bhumi Thakkar (Open ERP)

[IMP]Improved code for resize stop_date based on attribute of stop_date.

3769. By Bhumi Thakkar (Open ERP)

[MERGE]Merge lp:openerp-web.

3770. By Bhumi Thakkar (Open ERP)

[IMP]Improved code to pop up existing value and push updated value.

3771. By Bhumi Thakkar (Open ERP)

[MERGE]Merge lp:openerp-web.

3772. By Bhumi Thakkar (Open ERP)

[IMP]Improved code for reload dataset when create or update record.

3773. By Bhumi Thakkar (Open ERP)

[MERGE]Merge lp:openerp-web.

3774. By Bhumi Thakkar (Open ERP)

[IMP]Code Optimization.

3775. By Bhumi Thakkar (Open ERP)

[IMP]Code Optimization.

3776. By Bhumi Thakkar (Open ERP)

[MERGE]Merge lp:openerp-web.

3777. By Bhumi Thakkar (Open ERP)

[MERGE]Merge trunk.

3778. By Bhumi Thakkar (Open ERP)

[MERGE]Merge trunk.

Unmerged revisions

3778. By Bhumi Thakkar (Open ERP)

[MERGE]Merge trunk.

3777. By Bhumi Thakkar (Open ERP)

[MERGE]Merge trunk.

3776. By Bhumi Thakkar (Open ERP)

[MERGE]Merge lp:openerp-web.

3775. By Bhumi Thakkar (Open ERP)

[IMP]Code Optimization.

3774. By Bhumi Thakkar (Open ERP)

[IMP]Code Optimization.

3773. By Bhumi Thakkar (Open ERP)

[MERGE]Merge lp:openerp-web.

3772. By Bhumi Thakkar (Open ERP)

[IMP]Improved code for reload dataset when create or update record.

3771. By Bhumi Thakkar (Open ERP)

[MERGE]Merge lp:openerp-web.

3770. By Bhumi Thakkar (Open ERP)

[IMP]Improved code to pop up existing value and push updated value.

3769. By Bhumi Thakkar (Open ERP)

[MERGE]Merge lp:openerp-web.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'addons/web/static/src/css/base.css'
2--- addons/web/static/src/css/base.css 2013-10-18 12:32:53 +0000
3+++ addons/web/static/src/css/base.css 2013-11-08 10:26:02 +0000
4@@ -1440,6 +1440,11 @@
5 white-space: nowrap;
6 text-overflow: ellipsis;
7 }
8+.openerp .oe_application .oe_breadcrumb_item:last-child {
9+ max-width: 17em;
10+ white-space: nowrap;
11+ text-overflow: ellipsis;
12+}
13 .openerp .oe_application .oe_breadcrumb_title > * {
14 display: inline-block;
15 overflow: hidden;
16
17=== modified file 'addons/web/static/src/css/base.sass'
18--- addons/web/static/src/css/base.sass 2013-10-18 12:32:53 +0000
19+++ addons/web/static/src/css/base.sass 2013-11-08 10:26:02 +0000
20@@ -1157,6 +1157,10 @@
21 max-width: 7em
22 white-space: nowrap
23 text-overflow: ellipsis
24+ .oe_breadcrumb_item:last-child
25+ max-width: 17em
26+ white-space: nowrap
27+ text-overflow: ellipsis
28 .oe_breadcrumb_title > *
29 display: inline-block
30 overflow: hidden
31
32=== modified file 'addons/web_calendar/static/src/js/calendar.js'
33--- addons/web_calendar/static/src/js/calendar.js 2013-08-28 16:58:15 +0000
34+++ addons/web_calendar/static/src/js/calendar.js 2013-11-08 10:26:02 +0000
35@@ -66,12 +66,15 @@
36 this._super();
37 },
38 load_calendar: function(data) {
39+ var self = this;
40 this.fields_view = data;
41 this.$el.addClass(this.fields_view.arch.attrs['class']);
42 this.calendar_fields = {};
43+ this.res_event = [];
44 this.ids = this.dataset.ids;
45 this.color_values = [];
46 this.info_fields = [];
47+ this.field_modifiers = [];
48
49 this.name = this.fields_view.name || this.fields_view.arch.attrs.string;
50 this.view_id = this.fields_view.view_id;
51@@ -83,7 +86,7 @@
52 this.date_start = this.fields_view.arch.attrs.date_start;
53 this.date_delay = this.fields_view.arch.attrs.date_delay;
54 this.date_stop = this.fields_view.arch.attrs.date_stop;
55-
56+
57 this.day_length = this.fields_view.arch.attrs.day_length || 8;
58 this.color_field = this.fields_view.arch.attrs.color;
59 this.color_string = this.fields_view.fields[this.color_field] ?
60@@ -96,7 +99,6 @@
61 }
62 }
63 this.fields = this.fields_view.fields;
64-
65 if (!this.date_start) {
66 throw new Error(_t("Calendar view has not defined 'date_start' attribute."));
67 }
68@@ -117,7 +119,17 @@
69 for (var fld = 0; fld < this.fields_view.arch.children.length; fld++) {
70 this.info_fields.push(this.fields_view.arch.children[fld].attrs.name);
71 }
72-
73+ var modifiers = [], modifiers_stop = [];
74+ this.field_attrs_modifiers = [];
75+ _.each(this.fields_view.arch.children, function(r) {
76+ if (r.attrs.attrs) {
77+ modifier = JSON.parse(r.attrs.modifiers || '{}')
78+ if (r.attrs.name == self.date_start)
79+ self.field_attrs_modifiers = modifier['readonly'];
80+ if (r.attrs.name == self.date_stop)
81+ self.field_stop_modifiers = modifier['readonly'];
82+ }
83+ });
84 this.init_scheduler();
85
86 if (!this.sidebar && this.options.$sidebar) {
87@@ -125,6 +137,7 @@
88 this.has_been_loaded.then(this.sidebar.appendTo(this.$el.find('.oe_calendar_sidebar_container')));
89 }
90 this.trigger('calendar_view_loaded', data);
91+
92 return this.has_been_loaded.resolve();
93 },
94 init_scheduler: function() {
95@@ -231,7 +244,30 @@
96 }
97 return false;
98 });
99-
100+ scheduler.attachEvent('onBeforeDrag', function(event_id,mode,event) {
101+ if (mode == "create") {
102+ e = event || window.event; //e ||
103+ scheduler.callEvent("onEmptyClick",[scheduler.getActionData(e).date, e]);
104+ }
105+ else{
106+ for (i=0; i < self.res_event.length; i++) {
107+ if (self.res_event[i].id == event_id) {
108+ if (mode == "move") {
109+ result = (self.res_event[i].readonly==true || self.res_event[i].readonly==1) ? false : true;
110+ return result;
111+ } else if (mode == "resize") {
112+ var compute_domain = instance.web.form.compute_domain;
113+ var res = [];
114+ _.each(self.dataset_events[i], function(d, k){
115+ res[k] = {'value': d};
116+ });
117+ result = (compute_domain(self.field_stop_modifiers, res) == true) ? false : true;
118+ return result;
119+ }
120+ }
121+ }
122+ }
123+ });
124 this.refresh_scheduler();
125
126 // Remove hard coded style attributes from dhtmlx scheduler
127@@ -256,7 +292,12 @@
128 scheduler.setCurrentView(scheduler._date);
129 },
130 reload_event: function(id) {
131- this.dataset.read_ids([id], _.keys(this.fields)).done(this.proxy('events_loaded'));
132+ var self = this;
133+ this.id = id;
134+ this.dataset.read_ids([id], _.keys(this.fields)).done(function(events) {
135+ _.each(events, function(event){self.dataset_events.push(event);});
136+ self.events_loaded(events, false, true);
137+ });
138 },
139 get_color: function(key) {
140 if (this.color_map[key]) {
141@@ -280,6 +321,16 @@
142 selection_label[value[0]] = value[1];
143 });
144 }
145+ if (this.fields[this.date_start].states) {
146+ var states = [];
147+ var res = "";
148+ _.each (this.fields[this.date_start].states, function(modifier, state) {
149+ if (modifier[0][0] == "readonly")
150+ states.push(state);
151+ res = (modifier[0][1] == false) ? ['state', 'not in', states] : ['state', 'in', states];
152+ });
153+ this.field_modifiers.push(res);
154+ }
155 for (var e = 0; e < events.length; e++) {
156 var evt = events[e];
157 if (!evt[this.date_start]) {
158@@ -313,14 +364,28 @@
159 evt.textColor = '#000000';
160 }
161 }
162-
163- if (this.fields[this.date_start]['type'] == 'date') {
164+ if (this.fields[this.date_start]['type'] == 'date' || this.fields[this.date_start]['type'] == 'datetime') {
165 evt[this.date_start] = instance.web.auto_str_to_date(evt[this.date_start]).set({hour: 9}).toString('yyyy-MM-dd HH:mm:ss');
166 }
167 if (this.date_stop && evt[this.date_stop] && this.fields[this.date_stop]['type'] == 'date') {
168 evt[this.date_stop] = instance.web.auto_str_to_date(evt[this.date_stop]).set({hour: 17}).toString('yyyy-MM-dd HH:mm:ss');
169 }
170- res_events.push(this.convert_event(evt));
171+ var converted_data = this.convert_event(evt);
172+ res_events.push(converted_data);
173+
174+ if (events.length == 1) {
175+ for (i=0; i<this.res_event.length; i++) {
176+ if (this.res_event[i].id == evt.id) {
177+ this.res_event.pop(this.res_event[i].id);
178+ }
179+ }
180+ }
181+ if (events.length != this.res_event.length) {
182+ this.res_event.push(converted_data);
183+ }
184+ }
185+ if(events.length == this.res_event.length) {
186+ this.res_event = res_events;
187 }
188 scheduler.parse(res_events, 'json');
189 this.refresh_scheduler();
190@@ -332,8 +397,8 @@
191 var date_start = instance.web.str_to_datetime(evt[this.date_start]),
192 date_stop = this.date_stop ? instance.web.str_to_datetime(evt[this.date_stop]) : null,
193 date_delay = evt[this.date_delay] || 1.0,
194+ readonly = this.process_modifiers(evt),
195 res_text = '';
196-
197 if (this.info_fields) {
198 res_text = _.map(this.info_fields, function(fld) {
199 if(evt[fld] instanceof Array)
200@@ -348,7 +413,8 @@
201 'start_date': date_start.toString('yyyy-MM-dd HH:mm:ss'),
202 'end_date': date_stop.toString('yyyy-MM-dd HH:mm:ss'),
203 'text': res_text.join(', '),
204- 'id': evt.id
205+ 'id': evt.id,
206+ 'readonly': readonly
207 };
208 if (evt.color) {
209 r.color = evt.color;
210@@ -424,7 +490,6 @@
211 current_mode: function() {
212 return scheduler.getState().mode;
213 },
214-
215 quick_save: function(event_id, event_obj) {
216 var self = this;
217 var data = this.get_event_data(event_obj);
218@@ -464,6 +529,7 @@
219 },
220 slow_create: function(event_id, event_obj) {
221 var self = this;
222+ var def = $.Deferred();
223 if (this.current_mode() === 'month') {
224 event_obj['start_date'].addHours(8);
225 if (event_obj._length === 1) {
226@@ -477,7 +543,7 @@
227 _.each(this.get_event_data(event_obj), function(val, field_name) {
228 defaults['default_' + field_name] = val;
229 });
230- var something_saved = false;
231+ var something_saved = false, reload = false, created_id = null;
232 var pop = new instance.web.form.FormOpenPopup(this);
233 var pop_infos = this.get_form_popup_infos();
234 pop.show_element(this.dataset.model, null, this.dataset.get_context(defaults), {
235@@ -485,16 +551,24 @@
236 disable_multiple_selection: true,
237 view_id: pop_infos.view_id,
238 });
239- pop.on('closed', self, function() {
240- if (!something_saved) {
241- scheduler.deleteEvent(event_id);
242- }
243- });
244 pop.on('create_completed', self, function(id) {
245 something_saved = true;
246+ def.resolve(id).promise();
247 self.dataset.ids.push(id);
248+ created_id = id;
249 scheduler.changeEventId(event_id, id);
250- self.reload_event(id);
251+ });
252+ pop.on('closed', self, function(id) {
253+ $.when(def).then(function(id) {
254+ if (something_saved) {
255+ reload = true;
256+ something_saved = false;
257+ }
258+ });
259+ if (reload) {
260+ self.reload_event(created_id);
261+ reload = false;
262+ }
263 });
264 },
265 open_event: function(event_id) {
266@@ -521,8 +595,12 @@
267 title: _.str.sprintf(_t("Edit: %s"), pop_infos.title),
268 view_id: pop_infos.view_id,
269 });
270- pop.on('write_completed', self, function(){
271- self.reload_event(id_from_dataset);
272+ var reload = false;
273+ pop.on('closed', self, function() {
274+ if(!reload){
275+ self.reload_event(id_from_dataset);
276+ reload = true;
277+ }
278 });
279 }
280 },
281@@ -535,6 +613,17 @@
282 this.dataset.unlink(this.dataset.ids[index]);
283 }
284 },
285+ process_modifiers: function(field){
286+ var compute_domain = instance.web.form.compute_domain;
287+ var res = [];
288+ _.each(field, function(d, k){
289+ res[k] = {'value': d};
290+ });
291+ var result = false;
292+ if (this.field_attrs_modifiers.length) result = compute_domain(this.field_attrs_modifiers, res);
293+ else if (this.field_modifiers.length) result = compute_domain(this.field_modifiers, res);
294+ return result;
295+ },
296 });
297
298 instance.web_calendar.Sidebar = instance.web.Widget.extend({
299
300=== modified file 'addons/web_kanban/static/src/css/kanban.css'
301--- addons/web_kanban/static/src/css/kanban.css 2013-10-02 09:37:30 +0000
302+++ addons/web_kanban/static/src/css/kanban.css 2013-11-08 10:26:02 +0000
303@@ -198,6 +198,7 @@
304 }
305 .openerp .oe_kanban_view .oe_kanban_add {
306 top: -8px;
307+ z-index: 1;
308 }
309 .openerp .oe_kanban_view .oe_kanban_header .oe_dropdown_toggle {
310 top: -2px;
311
312=== modified file 'addons/web_kanban/static/src/css/kanban.sass'
313--- addons/web_kanban/static/src/css/kanban.sass 2013-10-02 09:37:30 +0000
314+++ addons/web_kanban/static/src/css/kanban.sass 2013-11-08 10:26:02 +0000
315@@ -213,6 +213,7 @@
316 position: relative
317 .oe_kanban_add
318 top: -8px
319+ z-index: 1
320 .oe_kanban_header .oe_dropdown_toggle
321 top: -2px
322 height: 14px