Merge lp:~renatofilho/ubuntu-calendar-app/keep-event-size into lp:ubuntu-calendar-app
- keep-event-size
- Merge into trunk
Status: | Merged |
---|---|
Approved by: | Arthur Mello |
Approved revision: | 787 |
Merged at revision: | 809 |
Proposed branch: | lp:~renatofilho/ubuntu-calendar-app/keep-event-size |
Merge into: | lp:ubuntu-calendar-app |
Diff against target: |
408 lines (+217/-51) 4 files modified
NewEvent.qml (+43/-46) dateExt.js (+4/-4) tests/unittests/CMakeLists.txt (+1/-1) tests/unittests/tst_new_event.qml (+169/-0) |
To merge this branch: | bzr merge lp:~renatofilho/ubuntu-calendar-app/keep-event-size |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Arthur Mello (community) | Approve | ||
Jenkins Bot | continuous-integration | Approve | |
Review via email: mp+289288@code.launchpad.net |
Commit message
Make sure that event keep the same size when changing the start date.
Description of the change
Jenkins Bot (ubuntu-core-apps-jenkins-bot) wrote : | # |
- 783. By Renato Araujo Oliveira Filho
-
Trunk merged.
- 784. By Renato Araujo Oliveira Filho
-
Update NewEvent to handle null end time.
- 785. By Renato Araujo Oliveira Filho
-
created unit test for new event page.
Jenkins Bot (ubuntu-core-apps-jenkins-bot) wrote : | # |
PASSED: Continuous integration, rev:785
https:/
Executed test runs:
None: https:/
Click here to trigger a rebuild:
https:/
Arthur Mello (artmello) wrote : | # |
in line comment
- 786. By Renato Araujo Oliveira Filho
-
Typo fixed.
Jenkins Bot (ubuntu-core-apps-jenkins-bot) wrote : | # |
PASSED: Continuous integration, rev:786
https:/
Executed test runs:
None: https:/
Click here to trigger a rebuild:
https:/
- 787. By Renato Araujo Oliveira Filho
-
Trunk merged.
Jenkins Bot (ubuntu-core-apps-jenkins-bot) wrote : | # |
PASSED: Continuous integration, rev:787
https:/
Executed test runs:
None: https:/
Click here to trigger a rebuild:
https:/
Preview Diff
1 | === modified file 'NewEvent.qml' |
2 | --- NewEvent.qml 2016-03-23 18:53:48 +0000 |
3 | +++ NewEvent.qml 2016-03-28 21:19:15 +0000 |
4 | @@ -25,6 +25,7 @@ |
5 | import Ubuntu.Components.Pickers 1.0 |
6 | import QtOrganizer 5.0 |
7 | import "Defines.js" as Defines |
8 | +import "dateExt.js" as DateExt |
9 | |
10 | Page { |
11 | id: root |
12 | @@ -35,18 +36,22 @@ |
13 | |
14 | property var date; |
15 | property alias allDay: allDayEventCheckbox.checked |
16 | + property int eventSize: -1 |
17 | |
18 | property var event:null; |
19 | property var rule :null; |
20 | property var model:null; |
21 | |
22 | - property var startDate; |
23 | - property var endDate; |
24 | + property alias startDate: startDateTimeInput.dateTime |
25 | + property alias endDate: endDateTimeInput.dateTime |
26 | property alias reminderValue: eventReminder.reminderValue |
27 | |
28 | property alias scrollY: flickable.contentY |
29 | property bool isEdit: false |
30 | |
31 | + readonly property int millisecsInADay: 86400000 |
32 | + readonly property int millisecsInAnHour: 3600000 |
33 | + |
34 | signal eventAdded(var event); |
35 | signal eventDeleted(var event); |
36 | signal canceled() |
37 | @@ -78,8 +83,6 @@ |
38 | } |
39 | |
40 | function updateEventDate(date, allDay) { |
41 | - root.startDate = undefined |
42 | - root.endDate = undefined |
43 | setDate(date) |
44 | root.allDay = allDay |
45 | } |
46 | @@ -94,18 +97,9 @@ |
47 | date.setHours(newDate.getHours(), newDate.getMinutes()); |
48 | } |
49 | |
50 | - // If startDate is setted by argument we have to not change it |
51 | - //Set the nearest current time. |
52 | - if (typeof(startDate) === 'undefined') |
53 | - startDate = new Date(root.roundDate(date)) |
54 | - |
55 | - // If endDate is setted by argument we have to not change it |
56 | - if (typeof(endDate) === 'undefined') { |
57 | - endDate = new Date(root.roundDate(date)) |
58 | - endDate.setMinutes(endDate.getMinutes() + 30) |
59 | - endTimeInput.text = Qt.formatDateTime(endDate, Qt.locale().timeFormat(Locale.ShortFormat)); |
60 | - } |
61 | - |
62 | + startDate = new Date(root.roundDate(date)) |
63 | + var enDateValue = new Date(root.roundDate(date)) |
64 | + endDate = enDateValue.addMinutes(60) |
65 | } |
66 | |
67 | function selectCalendar(collectionId) { |
68 | @@ -140,9 +134,19 @@ |
69 | titleEdit.text = e.displayLabel; |
70 | } |
71 | |
72 | + allDayEventCheckbox.checked = e.allDay; |
73 | + |
74 | + var eventEndDate = e.endDateTime |
75 | + if (!eventEndDate || isNaN(eventEndDate.getTime())) |
76 | + eventEndDate = new Date(startDate) |
77 | + |
78 | if (e.allDay) { |
79 | allDayEventCheckbox.checked = true |
80 | - endDate = new Date(e.endDateTime).addDays(-1); |
81 | + endDate = new Date(eventEndDate).addDays(-1); |
82 | + eventSize = DateExt.daysBetween(startDate, eventEndDate) * root.millisecsInADay |
83 | + } else { |
84 | + endDate = eventEndDate |
85 | + eventSize = (eventEndDate.getTime() - startDate.getTime()) |
86 | } |
87 | |
88 | if(e.location) { |
89 | @@ -153,7 +157,6 @@ |
90 | messageEdit.text = e.description; |
91 | } |
92 | |
93 | - allDayEventCheckbox.checked = e.allDay; |
94 | var index = 0; |
95 | |
96 | if( e.itemType === Type.Event ) { |
97 | @@ -309,33 +312,6 @@ |
98 | } |
99 | |
100 | Keys.onEscapePressed: root.cancel() |
101 | - onStartDateChanged: { |
102 | - if (!startDate) |
103 | - return |
104 | - |
105 | - startDateTimeInput.dateTime = startDate; |
106 | - |
107 | - // set time forward to one hour |
108 | - var time_forward = 3600000; |
109 | - |
110 | - if (isEdit && event !== null) { |
111 | - time_forward = event.endDateTime - event.startDateTime; |
112 | - } |
113 | - adjustEndDateToStartDate(time_forward); |
114 | - } |
115 | - |
116 | - onEndDateChanged: { |
117 | - if (!root.endDate || isNaN(root.endDate.getTime())) { |
118 | - if (root.startDate) { |
119 | - endDateTimeInput.dateTime = root.startDate; |
120 | - } |
121 | - } else { |
122 | - if (root.endDate) { |
123 | - endDateTimeInput.dateTime = root.endDate; |
124 | - } |
125 | - } |
126 | - } |
127 | - |
128 | header: PageHeader { |
129 | id: pageHeader |
130 | |
131 | @@ -442,6 +418,8 @@ |
132 | |
133 | NewEventTimePicker{ |
134 | id: startDateTimeInput |
135 | + objectName: "startDateTimeInput" |
136 | + |
137 | header: i18n.tr("From") |
138 | showTimePicker: !allDayEventCheckbox.checked |
139 | anchors { |
140 | @@ -450,11 +428,14 @@ |
141 | } |
142 | onDateTimeChanged: { |
143 | startDate = dateTime; |
144 | + endDateTimeInput.dateTime = new Date(startDate.getTime() + root.eventSize) |
145 | } |
146 | } |
147 | |
148 | NewEventTimePicker{ |
149 | id: endDateTimeInput |
150 | + objectName: "endDateTimeInput" |
151 | + |
152 | header: i18n.tr("To") |
153 | showTimePicker: !allDayEventCheckbox.checked |
154 | anchors { |
155 | @@ -462,7 +443,17 @@ |
156 | right: parent.right |
157 | } |
158 | onDateTimeChanged: { |
159 | + if (dateTime.getTime() < startDate.getTime()) { |
160 | + root.eventSize = root.allDay ? 0 : root.millisecsInAnHour |
161 | + dateTime = new Date(startDate.getTime() + root.eventSize) |
162 | + return |
163 | + } |
164 | + |
165 | endDate = dateTime; |
166 | + if (allDay) |
167 | + root.eventSize = endDate.midnight().getTime() - startDate.midnight().getTime() |
168 | + else |
169 | + root.eventSize = endDate.getTime() - startDate.getTime() |
170 | } |
171 | } |
172 | |
173 | @@ -479,6 +470,12 @@ |
174 | objectName: "allDayEventCheckbox" |
175 | id: allDayEventCheckbox |
176 | checked: false |
177 | + onCheckedChanged: { |
178 | + if (checked) |
179 | + root.eventSize = Math.max(endDate.midnight().getTime() - startDate.midnight().getTime(), 0) |
180 | + else |
181 | + root.eventSize = Math.max(endDate.getTime() - startDate.getTime(), root.millisecsInAnHour) |
182 | + } |
183 | } |
184 | } |
185 | |
186 | @@ -570,7 +567,7 @@ |
187 | } |
188 | |
189 | containerHeight: itemHeight * 4 |
190 | - model: root.model.getWritableAndSelectedCollections(); |
191 | + model: root.model ? root.model.getWritableAndSelectedCollections() : [] |
192 | |
193 | delegate: OptionSelectorDelegate{ |
194 | text: modelData.name |
195 | |
196 | === modified file 'dateExt.js' |
197 | --- dateExt.js 2016-03-02 19:55:52 +0000 |
198 | +++ dateExt.js 2016-03-28 21:19:15 +0000 |
199 | @@ -60,19 +60,19 @@ |
200 | } |
201 | |
202 | Date.prototype.addDays = function(days) { |
203 | + var date = new Date(this) |
204 | if (days === 0) |
205 | - return this |
206 | + return date |
207 | |
208 | - var date = new Date(this) |
209 | date.setDate(date.getDate() + days); |
210 | return date |
211 | } |
212 | |
213 | Date.prototype.addMinutes = function(minutes) { |
214 | + var date = new Date(this) |
215 | if (minutes === 0) |
216 | - return this |
217 | + return date |
218 | |
219 | - var date = new Date(this) |
220 | date.setMinutes(date.getMinutes() + minutes); |
221 | return date |
222 | } |
223 | |
224 | === modified file 'tests/unittests/CMakeLists.txt' |
225 | --- tests/unittests/CMakeLists.txt 2014-01-28 16:51:15 +0000 |
226 | +++ tests/unittests/CMakeLists.txt 2016-03-28 21:19:15 +0000 |
227 | @@ -3,6 +3,6 @@ |
228 | file(GLOB TESTS tst_*.qml) |
229 | foreach(TEST ${TESTS}) |
230 | get_filename_component(NAME ${TEST} NAME_WE) |
231 | - add_test(${NAME} ${QMLTESTRUNNER} -input ${TEST}) |
232 | + add_test(${NAME} ${QMLTESTRUNNER} -import ${CMAKE_SOURCE_DIR} -input ${TEST}) |
233 | set_tests_properties(${NAME} PROPERTIES ENVIRONMENT "QT_QPA_PLATFORM=minimal") |
234 | endforeach(TEST) |
235 | |
236 | === added file 'tests/unittests/tst_new_event.qml' |
237 | --- tests/unittests/tst_new_event.qml 1970-01-01 00:00:00 +0000 |
238 | +++ tests/unittests/tst_new_event.qml 2016-03-28 21:19:15 +0000 |
239 | @@ -0,0 +1,169 @@ |
240 | +import QtQuick 2.0 |
241 | +import QtTest 1.0 |
242 | +import QtOrganizer 5.0 |
243 | + |
244 | +TestCase{ |
245 | + id: root |
246 | + name: "New Event tests" |
247 | + |
248 | + property var newEventPage: null |
249 | + |
250 | + Component { |
251 | + id: eventComp |
252 | + |
253 | + Event { |
254 | + } |
255 | + } |
256 | + |
257 | + function create_event_from_data(data) |
258 | + { |
259 | + return eventComp.createObject(root, |
260 | + {'allDay': data.allDay, |
261 | + 'displayLabel': data.label, |
262 | + 'startDateTime': data.startDate, |
263 | + 'endDateTime': data.endDate}) |
264 | + } |
265 | + |
266 | + function create_new_event_page(event) |
267 | + { |
268 | + var component = Qt.createComponent(Qt.resolvedUrl("../../NewEvent.qml")) |
269 | + if (component.status === Component.Ready) |
270 | + return component.createObject(root, {"event": event}) |
271 | + |
272 | + return null |
273 | + } |
274 | + |
275 | + function init() |
276 | + { |
277 | + |
278 | + } |
279 | + |
280 | + function cleanup() |
281 | + { |
282 | + if (newEventPage) { |
283 | + newEventPage.destroy() |
284 | + newEventPage = null |
285 | + } |
286 | + } |
287 | + |
288 | + function test_new_event_title() |
289 | + { |
290 | + newEventPage = create_new_event_page(null) |
291 | + compare(newEventPage.header.title, "New Event") |
292 | + } |
293 | + |
294 | + function test_edit_event_details() |
295 | + { |
296 | + var startDate = new Date(2016, 3, 28, 14, 0,0 ) |
297 | + var endDate = new Date(2016, 3, 28, 15, 0,0 ) |
298 | + var eventData = {"label": 'test_event_details', |
299 | + "allDay": false, |
300 | + "startDate": startDate, |
301 | + "endDate": endDate } |
302 | + var event = create_event_from_data(eventData) |
303 | + newEventPage = create_new_event_page(event) |
304 | + |
305 | + compare(newEventPage.header.title, "Edit Event") |
306 | + compare(newEventPage.startDate, startDate) |
307 | + compare(newEventPage.endDate, endDate) |
308 | + } |
309 | + |
310 | + function test_change_start_date() |
311 | + { |
312 | + var startDate = new Date(2016, 3, 28, 14, 0,0 ) |
313 | + var endDate = new Date(2016, 3, 28, 15, 0,0 ) |
314 | + var eventData = {"label": 'test_event_details', |
315 | + "allDay": false, |
316 | + "startDate": startDate, |
317 | + "endDate": endDate } |
318 | + var event = create_event_from_data(eventData) |
319 | + newEventPage = create_new_event_page(event) |
320 | + |
321 | + compare(newEventPage.eventSize, 3600000) // 1h |
322 | + |
323 | + //Move start date 1h foward |
324 | + var startDatePicker = findChild(newEventPage, "startDateTimeInput") |
325 | + startDatePicker.dateTime = new Date(2016, 3, 28, 15, 0,0 ) |
326 | + compare(newEventPage.eventSize, 3600000) // 1h |
327 | + compare(newEventPage.endDate, new Date(2016, 3, 28, 16, 0,0 )) |
328 | + |
329 | + //Move start date 3h backward |
330 | + startDatePicker.dateTime = new Date(2016, 3, 28, 12, 0,0 ) |
331 | + compare(newEventPage.eventSize, 3600000) // 1h |
332 | + compare(newEventPage.endDate, new Date(2016, 3, 28, 13, 0,0 )) |
333 | + } |
334 | + |
335 | + function test_change_end_date() |
336 | + { |
337 | + var startDate = new Date(2016, 3, 28, 14, 0,0 ) |
338 | + var endDate = new Date(2016, 3, 28, 15, 0,0 ) |
339 | + var eventData = {"label": 'test_event_details', |
340 | + "allDay": false, |
341 | + "startDate": startDate, |
342 | + "endDate": endDate } |
343 | + var event = create_event_from_data(eventData) |
344 | + newEventPage = create_new_event_page(event) |
345 | + |
346 | + // Move end date 30 min backward |
347 | + var endDatePicker = findChild(newEventPage, "endDateTimeInput") |
348 | + endDatePicker.dateTime = new Date(2016, 3, 28, 14, 30,0 ) |
349 | + compare(newEventPage.eventSize, 1800000) // 30 min |
350 | + |
351 | + // Move start date 1h foward |
352 | + var startDatePicker = findChild(newEventPage, "startDateTimeInput") |
353 | + startDatePicker.dateTime = new Date(2016, 3, 28, 15, 0,0 ) |
354 | + compare(newEventPage.eventSize, 1800000) // 30 min |
355 | + compare(newEventPage.endDate, new Date(2016, 3, 28, 15, 30,0 )) |
356 | + } |
357 | + |
358 | + function test_change_start_date_for_all_day() |
359 | + { |
360 | + var startDate = new Date(2016, 3, 28, 0, 0,0 ) |
361 | + var endDate = new Date(2016, 3, 28, 0, 0,0 ) |
362 | + var eventData = {"label": 'test_event_details', |
363 | + "allDay": true, |
364 | + "startDate": startDate, |
365 | + "endDate": endDate } |
366 | + var event = create_event_from_data(eventData) |
367 | + newEventPage = create_new_event_page(event) |
368 | + |
369 | + compare(newEventPage.eventSize, 0) // 1 day |
370 | + |
371 | + // Move start date 1 day foward |
372 | + var startDatePicker = findChild(newEventPage, "startDateTimeInput") |
373 | + startDatePicker.dateTime = new Date(2016, 3, 29, 0, 0,0) |
374 | + |
375 | + // end date should move 1 day |
376 | + compare(newEventPage.endDate, new Date(2016, 3, 29, 0, 0,0 )) |
377 | + |
378 | + // Move end date 1 day foward |
379 | + var endDatePicker = findChild(newEventPage, "endDateTimeInput") |
380 | + endDatePicker.dateTime = new Date(2016, 3, 30, 0, 0,0) |
381 | + |
382 | + // start date should not change |
383 | + compare(newEventPage.startDate, new Date(2016, 3, 29, 0, 0,0 )) |
384 | + // event size should increase |
385 | + compare(newEventPage.eventSize, 86400000) // 2 days |
386 | + |
387 | + // Move start date 1 day foward |
388 | + startDatePicker.dateTime = new Date(2016, 3, 30, 0, 0,0) |
389 | + |
390 | + // end date should move 2 day |
391 | + compare(newEventPage.endDate, new Date(2016, 3, 31, 0, 0,0 )) |
392 | + } |
393 | + |
394 | + function test_events_with_null_end_date() |
395 | + { |
396 | + var startDate = new Date(2016, 3, 28, 15, 0,0 ) |
397 | + var eventData = {"label": 'test_event_details', |
398 | + "allDay": false, |
399 | + "startDate": startDate, |
400 | + "endDate": null } |
401 | + var event = create_event_from_data(eventData) |
402 | + newEventPage = create_new_event_page(event) |
403 | + |
404 | + compare(newEventPage.eventSize, 0) |
405 | + compare(newEventPage.startDate, new Date(2016, 3, 28, 15, 0,0 )) |
406 | + compare(newEventPage.endDate, new Date(2016, 3, 28, 15, 0,0 )) |
407 | + } |
408 | +} |
FAILED: Continuous integration, rev:782 /core-apps- jenkins. ubuntu. com/job/ calendar- app-ci/ 793/ /core-apps- jenkins. ubuntu. com/job/ generic- update- mp/794/ console
https:/
Executed test runs:
None: https:/
Click here to trigger a rebuild: /core-apps- jenkins. ubuntu. com/job/ calendar- app-ci/ 793/rebuild
https:/