Merge lp:~renatofilho/ubuntu-calendar-app/keep-event-size into lp:ubuntu-calendar-app

Proposed by Renato Araujo Oliveira Filho
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
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.

To post a comment you must log in.
Revision history for this message
Jenkins Bot (ubuntu-core-apps-jenkins-bot) wrote :
review: Needs Fixing (continuous-integration)
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.

Revision history for this message
Jenkins Bot (ubuntu-core-apps-jenkins-bot) wrote :
review: Approve (continuous-integration)
Revision history for this message
Arthur Mello (artmello) wrote :

in line comment

review: Needs Fixing
786. By Renato Araujo Oliveira Filho

Typo fixed.

Revision history for this message
Jenkins Bot (ubuntu-core-apps-jenkins-bot) wrote :
review: Approve (continuous-integration)
787. By Renato Araujo Oliveira Filho

Trunk merged.

Revision history for this message
Jenkins Bot (ubuntu-core-apps-jenkins-bot) wrote :
review: Approve (continuous-integration)
Revision history for this message
Arthur Mello (artmello) wrote :

lgtm

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
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+}

Subscribers

People subscribed via source and target branches

to status/vote changes: