Merge lp:~majster-pl/ubuntu-calendar-app/new-event-page into lp:ubuntu-calendar-app

Proposed by Szymon Waliczek
Status: Rejected
Rejected by: Renato Araujo Oliveira Filho
Proposed branch: lp:~majster-pl/ubuntu-calendar-app/new-event-page
Merge into: lp:ubuntu-calendar-app
Diff against target: 1758 lines (+714/-626)
7 files modified
EventReminder.qml (+39/-27)
EventRepetition.qml (+236/-187)
NewEvent.qml (+265/-260)
NewEventEntryField.qml (+0/-38)
NewEventTimePicker.qml (+94/-58)
RemindersModel.qml (+12/-0)
po/com.ubuntu.calendar.pot (+68/-56)
To merge this branch: bzr merge lp:~majster-pl/ubuntu-calendar-app/new-event-page
Reviewer Review Type Date Requested Status
Renato Araujo Oliveira Filho (community) Disapprove
Jenkins Bot continuous-integration Needs Fixing
Nekhelesh Ramananthan code-review & testing Approve
Review via email: mp+288637@code.launchpad.net

Description of the change

This is very first implementation of new-event-page.
There is still plenty of space of improvements but I want to get it reviewed before I continue my work.

To post a comment you must log in.
Revision history for this message
Jenkins Bot (ubuntu-core-apps-jenkins-bot) wrote :

FAILED: Continuous integration, rev:773
No commit message was specified in the merge proposal. Click on the following link and set the commit message (if you want a jenkins rebuild you need to trigger it yourself):
https://code.launchpad.net/~majster-pl/ubuntu-calendar-app/new-event-page/+merge/288637/+edit-commit-message

https://core-apps-jenkins.ubuntu.com/job/calendar-app-ci/788/
Executed test runs:
    None: https://core-apps-jenkins.ubuntu.com/job/generic-update-mp/738/console

Click here to trigger a rebuild:
https://core-apps-jenkins.ubuntu.com/job/calendar-app-ci/788/rebuild

review: Needs Fixing (continuous-integration)
Revision history for this message
Nekhelesh Ramananthan (nik90) wrote :

I'm setting this MP as a work in progress since it is. I have added inline comments of all things that needs fixing. This is just a preliminary check since I suspect more changes.

Do note that when I click the add guest button, I get ,

file:///opt/click.ubuntu.com/com.ubuntu.calendar/0.4.latest/NewEvent.qml:726:17: QML ScriptAction: file:///opt/click.ubuntu.com/com.ubuntu.calendar/0.4.latest/NewEvent.qml:728: ReferenceError: addGuestButton is not defined
                            if (addGuestButton.contactsPopup) {

Not sure if this was introduced in your branch or in trunk by some other branch. Please do check to make sure you don't introduce a regression.

I also see file:///opt/click.ubuntu.com/com.ubuntu.calendar/0.4.latest/NewEvent.qml:347:28: Unable to assign [undefined] to QColor

review: Needs Fixing
Revision history for this message
Nekhelesh Ramananthan (nik90) wrote :

Nice work! It is *almost* ready. Just few minor touch ups to do and then we are set to land this MP.

1. In the old guest design layout, I notice 3 minor issues ( refer to http://imgur.com/HC4JAcs )

a) Remove the listitem dividers of the guests listitem
b) set the guest listitem height as listitemlayout.height. Otherwise it is not centered vertically.
c) Align the guest names to the "Add Guest" button. This can be done by setting the left and right margin to -2 gu. Yes negative :)

2. In the repeat and reminders page, the "Repeat" and "Reminder" listitem header is shown using "blue" color due to the new SDK. Please change these to the new list items to fix this issue.
( refer to http://imgur.com/5yzzm8h )

3. The selection color which is shown when you click on the date/time is a bit strong. Please change the background to lightgray shade and the text color to white/black.

review: Needs Fixing
Revision history for this message
Nekhelesh Ramananthan (nik90) wrote :

Almost there, just noticed one minor issue. In the Event reminders page, the option "No Reminder" is hidden by the page header. I had a quick look at it, and is quite easy to fix -> http://paste.ubuntu.com/15391380/

review: Needs Fixing
Revision history for this message
Nekhelesh Ramananthan (nik90) wrote :

LGTM. Awesome work. We can finish of the new design implementation for the Guests feature when we get design specs for it in another MP.

@renato, You can go ahead test this and top-approve. It fixes the label color issue that bill pointed out as well.

review: Approve (code-review & testing)
Revision history for this message
Renato Araujo Oliveira Filho (renatofilho) wrote :

Great work.
I added some small comments but in general the code looks great.

Revision history for this message
Szymon Waliczek (majster-pl) wrote :

Thanks for review, I added few comments.
Will push fixed code soon.

779. By Szymon Waliczek

Added Flickable to EventRepetition.qml and fixed anchoring to header.
Removed unnecessary empty lanes and code clean up.

Revision history for this message
Renato Araujo Oliveira Filho (renatofilho) wrote :

Code looks good, but I can not test it due some conflicts with trunk.

please merge with trunk

Revision history for this message
Jenkins Bot (ubuntu-core-apps-jenkins-bot) wrote :

FAILED: Continuous integration, rev:779
No commit message was specified in the merge proposal. Click on the following link and set the commit message (if you want a jenkins rebuild you need to trigger it yourself):
https://code.launchpad.net/~majster-pl/ubuntu-calendar-app/new-event-page/+merge/288637/+edit-commit-message

https://core-apps-jenkins.ubuntu.com/job/calendar-app-ci/796/
Executed test runs:
    None: https://core-apps-jenkins.ubuntu.com/job/generic-update-mp/798/console

Click here to trigger a rebuild:
https://core-apps-jenkins.ubuntu.com/job/calendar-app-ci/796/rebuild

review: Needs Fixing (continuous-integration)
Revision history for this message
Renato Araujo Oliveira Filho (renatofilho) wrote :
review: Disapprove

Unmerged revisions

779. By Szymon Waliczek

Added Flickable to EventRepetition.qml and fixed anchoring to header.
Removed unnecessary empty lanes and code clean up.

778. By Szymon Waliczek

Fix 'No Reminder' hiden under header. in EventReminder.qml

777. By Szymon Waliczek

Update code to new SDK (header, ListItems)
Small visual improvments in Guest repeater.
Changed color of selection then user choosing date/time.

776. By Szymon Waliczek

Postpone the 'Add guest' redesign - waiting for designs.

775. By Szymon Waliczek

Fix Save button to be desible when no event name is not set.

774. By Szymon Waliczek

Fixed everything what Nik90 pointed out in review, apart from AddGuest field as I'm missing designs for it.

773. By Szymon Waliczek

First implementation of NewEvent.qml page, few code clean ups

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'EventReminder.qml'
--- EventReminder.qml 2016-01-29 14:47:31 +0000
+++ EventReminder.qml 2016-03-15 21:24:54 +0000
@@ -32,43 +32,54 @@
3232
33 visible: false33 visible: false
34 flickable: null34 flickable: null
35 title: i18n.tr("Reminder")35
3636 header: PageHeader {
37 head.backAction: Action{37 title: i18n.tr("Reminder")
38 iconName:"back"38 flickable: _pageFlickable
39 onTriggered:{39
40 var repeatCount = 3;40 leadingActionBar.actions: [
41 var repeatDelay = 5 * 60;41 Action {
4242 iconName: "back"
43 //reminder on event time43 text: "Back"
44 if( reminderTime === 0 ) {44 shortcut: "Esc"
45 repeatCount = 0;45 onTriggered: onBackClicked()
46 repeatDelay = 0;
47 } else if( reminderTime === 300) { //5 min
48 repeatCount = 1;
49 }46 }
5047 ]
51 visualReminder.repetitionCount = repeatCount;48 }
52 visualReminder.repetitionDelay = repeatDelay;49
53 visualReminder.message = eventTitle50 function onBackClicked() {
54 visualReminder.secondsBeforeStart = reminderTime;51 var repeatCount = 3;
5552 var repeatDelay = 5 * 60;
56 audibleReminder.repetitionCount = repeatCount;53
57 audibleReminder.repetitionDelay = repeatDelay;54 //reminder on event time
58 audibleReminder.secondsBeforeStart = reminderTime;55 if( reminderTime === 0 ) {
5956 repeatCount = 0;
60 pop();57 repeatDelay = 0;
58 } else if( reminderTime === 300) { //5 min
59 repeatCount = 1;
61 }60 }
61
62 visualReminder.repetitionCount = repeatCount;
63 visualReminder.repetitionDelay = repeatDelay;
64 visualReminder.message = eventTitle
65 visualReminder.secondsBeforeStart = reminderTime;
66
67 audibleReminder.repetitionCount = repeatCount;
68 audibleReminder.repetitionDelay = repeatDelay;
69 audibleReminder.secondsBeforeStart = reminderTime;
70
71 pop();
62 }72 }
73
63 Scrollbar{74 Scrollbar{
64 id:scrollList75 id:scrollList
65 flickableItem: _pageFlickable76 flickableItem: _pageFlickable
66 anchors.fill :parent77 anchors.fill: parent
67 }78 }
79
68 Flickable {80 Flickable {
69 id: _pageFlickable81 id: _pageFlickable
7082
71
72 clip: true83 clip: true
73 anchors.fill: parent84 anchors.fill: parent
74 contentHeight: _reminders.itemHeight * reminderModel.count + units.gu(2)85 contentHeight: _reminders.itemHeight * reminderModel.count + units.gu(2)
@@ -91,6 +102,7 @@
91 }102 }
92 }103 }
93 }104 }
105
94 Component {106 Component {
95 id: selectorDelegate107 id: selectorDelegate
96 OptionSelectorDelegate { text: label; }108 OptionSelectorDelegate { text: label; }
97109
=== modified file 'EventRepetition.qml'
--- EventRepetition.qml 2016-03-07 17:57:04 +0000
+++ EventRepetition.qml 2016-03-15 21:24:54 +0000
@@ -19,25 +19,37 @@
19import QtQuick 2.419import QtQuick 2.4
20import QtOrganizer 5.020import QtOrganizer 5.0
21import Ubuntu.Components 1.321import Ubuntu.Components 1.3
22import Ubuntu.Components.ListItems 1.0 as ListItem22import Ubuntu.Components.ListItems 1.0 as ListItems
23import Ubuntu.Components.Pickers 1.023import Ubuntu.Components.Pickers 1.0
24import QtOrganizer 5.024import QtOrganizer 5.0
25import "Defines.js" as Defines25import "Defines.js" as Defines
26import "Recurrence.js" as Recurrence26import "Recurrence.js" as Recurrence
2727
28Page {28Page {
29 id: repetition29 id: root
3030
31 property var weekDays : [];31 property var weekDays : [];
32 property var eventRoot;32 property var eventRoot;
33 property var isEdit33 property var isEdit
3434
35 visible: false35 visible: false
36 // TRANSLATORS: this refers to how often a recurrent event repeats36 header: PageHeader {
37 // and it is shown as the header of the page to choose repetition37 // TRANSLATORS: this refers to how often a recurrent event repeats
38 // and as the header of the list item that shows the repetition38 // and it is shown as the header of the page to choose repetition
39 // summary in the page that displays the event details39 // and as the header of the list item that shows the repetition
40 title: i18n.tr("Repeat")40 // summary in the page that displays the event details
41 title: i18n.tr("Repeat")
42 flickable: null
43
44 leadingActionBar.actions: [
45 Action {
46 iconName: "back"
47 text: "Back"
48 shortcut: "Esc"
49 onTriggered: onBackClicked()
50 }
51 ]
52 }
4153
42 EventUtils{54 EventUtils{
43 id:eventUtils55 id:eventUtils
@@ -92,192 +104,229 @@
92 recurrenceOption.selectedIndex = index;104 recurrenceOption.selectedIndex = index;
93 }105 }
94106
95 head.backAction: Action{107 function onBackClicked() {
96 id:backAction108 var recurrenceRule = Defines.recurrenceValue[ recurrenceOption.selectedIndex ];
97 iconName: "back"109
98 onTriggered: {110 if (recurrenceRule !== RecurrenceRule.Invalid) {
99 var recurrenceRule = Defines.recurrenceValue[ recurrenceOption.selectedIndex ];111 if (eventRoot.rule === null || eventRoot.rule === undefined ){
100112 eventRoot.rule = Qt.createQmlObject("import QtOrganizer 5.0; RecurrenceRule {}", eventRoot.event.recurrence,"EventRepetition.qml");
101 if (recurrenceRule !== RecurrenceRule.Invalid) {113 }
102 if (eventRoot.rule === null || eventRoot.rule === undefined ){114
103 eventRoot.rule = Qt.createQmlObject("import QtOrganizer 5.0; RecurrenceRule {}", eventRoot.event.recurrence,"EventRepetition.qml");115 var rule = eventRoot.rule;
104 }116 rule.frequency = recurrenceRule;
105117 switch(recurrenceOption.selectedIndex){
106 var rule = eventRoot.rule;118 case 1: //daily
107 rule.frequency = recurrenceRule;119 case 2: //weekly
108 switch(recurrenceOption.selectedIndex){120 case 3: //weekly
109 case 1: //daily121 case 4: //weekly
110 case 2: //weekly122 case 5: //weekly
111 case 3: //weekly123 rule.daysOfWeek = eventUtils.getDaysOfWeek(recurrenceOption.selectedIndex, weekDays );
112 case 4: //weekly124 break;
113 case 5: //weekly125 case 6: //monthly
114 rule.daysOfWeek = eventUtils.getDaysOfWeek(recurrenceOption.selectedIndex, weekDays );126 rule.daysOfMonth = [eventRoot.date.getDate()];
115 break;127 break;
116 case 6: //monthly128 case 7: //yearly
117 rule.daysOfMonth = [eventRoot.date.getDate()];129 rule.monthsOfYear = [eventRoot.date.getMonth()];
118 break;130 rule.daysOfMonth = [eventRoot.date.getDate()];
119 case 7: //yearly131 break;
120 rule.monthsOfYear = [eventRoot.date.getMonth()];132 case 0: //once
121 rule.daysOfMonth = [eventRoot.date.getDate()];133 default:
122 break;134 //it should not come here
123 case 0: //once135 break;
124 default:136 }
125 //it should not come here137
126 break;138 if (limitOptions.selectedIndex === 1
127 }139 && recurrenceOption.selectedIndex > 0
128140 && limitCount.text != "") {
129 if (limitOptions.selectedIndex === 1141 rule.limit = parseInt(limitCount.text);
130 && recurrenceOption.selectedIndex > 0142 }
131 && limitCount.text != "") {143 else if (limitOptions.selectedIndex === 2 && recurrenceOption.selectedIndex > 0) {
132 rule.limit = parseInt(limitCount.text);144 rule.limit = datePick.date;
133 }
134 else if (limitOptions.selectedIndex === 2 && recurrenceOption.selectedIndex > 0) {
135 rule.limit = datePick.date;
136 }
137 else {
138 rule.limit = undefined;
139 }
140 }145 }
141 else {146 else {
142 eventRoot.rule = null;147 rule.limit = undefined;
143 }148 }
144 pop()149 }
145 }150 else {
151 eventRoot.rule = null;
152 }
153 pop()
146 }154 }
147155
148 Column{156 Flickable {
149 id:repeatColumn157 anchors { fill: parent; topMargin: parent.header.height }
150158 contentHeight: repeatColumn.height + units.gu(2)
151 anchors.fill: parent159 interactive: repeatColumn.height > height ? true : false
152 spacing: units.gu(1)160 Column{
153161 id:repeatColumn
154 ListItem.Header{162
155 text: i18n.tr("Repeat")163 width: parent.width
156 }
157
158 OptionSelector{
159 id: recurrenceOption
160 visible: true
161
162 anchors {
163 left: parent.left
164 right: parent.right
165 margins: units.gu(2)
166 }
167
168 model: Defines.recurrenceLabel
169 containerHeight: itemHeight * 4
170 onExpandedChanged: Qt.inputMethod.hide();
171 }
172
173 ListItem.Header{
174 text: i18n.tr("Repeats On:")
175 visible: recurrenceOption.selectedIndex == 5
176 }
177
178 Row {
179 id: weeksRow
180
181 anchors {
182 left: parent.left
183 right: parent.right
184 margins: units.gu(2)
185 }
186
187 spacing: units.gu(1)164 spacing: units.gu(1)
188 visible: recurrenceOption.selectedIndex == 5165
189166 ListItem {
190 Repeater {167 height: repeatListItem.height
191 model: Defines.weekLabel168 divider.visible: false
192 Column {169
193 id: weeksRowColumn170 ListItemLayout {
194 spacing: units.gu(1)171 id: repeatListItem
195 Label {172 title.text: i18n.tr("Repeat")
196 id:lbl173 title.color: Theme.palette.selected.overlayText
197 text:modelData174 }
198 anchors.horizontalCenter: parent.horizontalCenter175 }
199 }176
200 CheckBox {177 OptionSelector{
201 id: weekCheck178 id: recurrenceOption
202 onCheckedChanged: {179 visible: true
203 //EDS consider 7 as Sunday index so if the index is 0 then we have to explicitly push Sunday.180
204 if(index === 0)181 anchors {
205 (checked) ? weekDays.push(Qt.Sunday) : weekDays.splice(weekDays.indexOf(Qt.Sunday),1);182 left: parent.left
206 else183 right: parent.right
207 (checked) ? weekDays.push(index) : weekDays.splice(weekDays.indexOf(index),1);184 margins: units.gu(2)
208 }185 }
209 checked:{186
210 (weekDays.length === 0 && eventRoot.date && (index === eventRoot.date.getDay()) && !isEdit) ? true : false;187 model: Defines.recurrenceLabel
211 }188 containerHeight: itemHeight * 4
212189 onExpandedChanged: Qt.inputMethod.hide();
213 }190 }
214 }191
215 }192 ListItem {
216 }193 visible: recurrenceOption.selectedIndex == 5
217194 divider.visible: false
218 ListItem.Header {195
219 text: i18n.tr("Recurring event ends")196 ListItemLayout {
220 visible: recurrenceOption.selectedIndex != 0197 id: repeatsOnListItem
221 }198 title.text: i18n.tr("Repeats On:")
222199 title.color: Theme.palette.selected.overlayText
223 OptionSelector{200 }
224 id: limitOptions201 }
225 visible: recurrenceOption.selectedIndex != 0202
226203 Row {
227 anchors {204 id: weeksRow
228 left: parent.left205
229 right: parent.right206 anchors {
230 margins: units.gu(2)207 left: parent.left
231 }208 right: parent.right
232209 margins: units.gu(2)
233 model: limitLabels210 }
234 containerHeight: itemHeight * 4211
235 onExpandedChanged: Qt.inputMethod.hide()212 spacing: units.gu(1)
236 }213 visible: recurrenceOption.selectedIndex == 5
237214
238 ListItem.Header{215 Repeater {
239 // TRANSLATORS: this refers to how often a recurrent event repeats216 model: Defines.weekLabel
240 // and it is shown as the header of the option selector to choose217 Column {
241 // its repetition218 id: weeksRowColumn
242 text:i18n.tr("Repeats")219 spacing: units.gu(1)
243 visible: recurrenceOption.selectedIndex != 0220 Label {
244 && limitOptions.selectedIndex == 1221 id:lbl
245 }222 text:modelData
246223 anchors.horizontalCenter: parent.horizontalCenter
247 TextField {224 }
248 id: limitCount225 CheckBox {
249 objectName: "eventLimitCount"226 id: weekCheck
250227 onCheckedChanged: {
251 anchors {228 //EDS consider 7 as Sunday index so if the index is 0 then we have to explicitly push Sunday.
252 left: parent.left229 if(index === 0)
253 right: parent.right230 (checked) ? weekDays.push(Qt.Sunday) : weekDays.splice(weekDays.indexOf(Qt.Sunday),1);
254 margins: units.gu(2)231 else
255 }232 (checked) ? weekDays.push(index) : weekDays.splice(weekDays.indexOf(index),1);
256233 }
257 visible: recurrenceOption.selectedIndex != 0 && limitOptions.selectedIndex == 1234 checked:{
258 validator: IntValidator{ bottom: 1; }235 (weekDays.length === 0 && eventRoot.date && (index === eventRoot.date.getDay()) && !isEdit) ? true : false;
259 inputMethodHints: Qt.ImhDialableCharactersOnly236 }
260237
261 onTextChanged: {238 }
262 backAction.enabled = !!text.trim()239 }
263 }240 }
264 }241 }
265242
266 ListItem.Header{243 ListItem {
267 text:i18n.tr("Date")244 visible: recurrenceOption.selectedIndex != 0
268 visible: recurrenceOption.selectedIndex != 0 && limitOptions.selectedIndex == 2245 divider.visible: false
269 }246 height: recurringEventListItem.height
270247
271 DatePicker{248 ListItemLayout {
272 id:datePick;249 id: recurringEventListItem
273250 title.text: i18n.tr("Recurring event ends")
274 anchors {251 title.color: Theme.palette.selected.overlayText
275 left: parent.left252 }
276 right: parent.right253 }
277 margins: units.gu(2)254
278 }255 OptionSelector{
279256 id: limitOptions
280 visible: recurrenceOption.selectedIndex != 0 && limitOptions.selectedIndex===2257 visible: recurrenceOption.selectedIndex != 0
258
259 anchors {
260 left: parent.left
261 right: parent.right
262 margins: units.gu(2)
263 }
264
265 model: limitLabels
266 containerHeight: itemHeight * 4
267 onExpandedChanged: Qt.inputMethod.hide()
268 }
269
270 ListItem {
271 visible: recurrenceOption.selectedIndex != 0
272 && limitOptions.selectedIndex == 1
273 divider.visible: false
274 height: repeatsListItem.height
275
276 ListItemLayout {
277 id: repeatsListItem
278 // TRANSLATORS: this refers to how often a recurrent event repeats
279 // and it is shown as the header of the option selector to choose
280 // its repetition
281 title.text:i18n.tr("Repeats")
282 title.color: Theme.palette.selected.overlayText
283 }
284
285 }
286
287 TextField {
288 id: limitCount
289 objectName: "eventLimitCount"
290
291 anchors {
292 left: parent.left
293 right: parent.right
294 margins: units.gu(2)
295 }
296
297 visible: recurrenceOption.selectedIndex != 0 && limitOptions.selectedIndex == 1
298 validator: IntValidator{ bottom: 1; }
299 inputMethodHints: Qt.ImhDialableCharactersOnly
300
301 onTextChanged: {
302 backAction.enabled = !!text.trim()
303 }
304 }
305
306 ListItem {
307 visible: recurrenceOption.selectedIndex != 0 && limitOptions.selectedIndex == 2
308 divider.visible: false
309 height: dateListItem.height
310
311 ListItemLayout {
312 id: dateListItem
313 title.text:i18n.tr("Date")
314 title.color: Theme.palette.selected.overlayText
315 }
316 }
317
318 DatePicker{
319 id:datePick;
320
321 anchors {
322 left: parent.left
323 right: parent.right
324 margins: units.gu(2)
325 }
326
327 visible: recurrenceOption.selectedIndex != 0 && limitOptions.selectedIndex===2
328 }
281 }329 }
282 }330 }
331
283}332}
284333
=== modified file 'NewEvent.qml'
--- NewEvent.qml 2016-03-14 20:25:50 +0000
+++ NewEvent.qml 2016-03-15 21:24:54 +0000
@@ -66,8 +66,7 @@
66 }66 }
67 }67 }
6868
69 function cancel()69 function cancel() {
70 {
71 if (pageStack)70 if (pageStack)
72 pageStack.pop();71 pageStack.pop();
73 root.canceled()72 root.canceled()
@@ -254,6 +253,11 @@
254 secondsBeforeStart: root.reminderValue253 secondsBeforeStart: root.reminderValue
255 }254 }
256255
256 RemindersModel {
257 id: reminderModel
258 }
259
260
257 function getDaysOfWeek(){261 function getDaysOfWeek(){
258 var daysOfWeek = [];262 var daysOfWeek = [];
259 switch(recurrenceOption.selectedIndex){263 switch(recurrenceOption.selectedIndex){
@@ -310,7 +314,6 @@
310 scrollAnimation.start()314 scrollAnimation.start()
311 }315 }
312316
313 Keys.onEscapePressed: root.cancel()
314 onStartDateChanged: {317 onStartDateChanged: {
315 if (!startDate)318 if (!startDate)
316 return319 return
@@ -333,42 +336,47 @@
333336
334 header: PageHeader {337 header: PageHeader {
335 id: pageHeader338 id: pageHeader
336339 property Component delegate: Component {
337 flickable: null340 AbstractButton {
338 title: isEdit ? i18n.tr("Edit Event"):i18n.tr("New Event")341 id: button
339 leadingActionBar.actions: Action {342 action: modelData
340 id: backAction343 width: label.width + units.gu(4)
341344 height: parent.height
342 name: "cancel"345 Rectangle {
343 text: i18n.tr("Cancel")346 color: parent.pressed ? UbuntuColors.coolGrey : UbuntuColors.slate
344 iconName: isEdit ? "back" : "down"347 opacity: 0.1
345 onTriggered: root.cancel()348 anchors.fill: parent
346 }349 visible: button.pressed
347350 }
348 trailingActionBar.actions: [351 Label {
349 Action {352 anchors.centerIn: parent
350 text: i18n.tr("Delete");353 id: label
351 objectName: "delete"354 text: action.text
352 iconName: "delete"355 font.weight: text === i18n.tr("Save") ? Font.Normal : Font.Light
353 visible : isEdit356 }
354 onTriggered: {357 }
355 var dialog = PopupUtils.open(Qt.resolvedUrl("DeleteConfirmationDialog.qml"),root,{"event": event});358 }
356 dialog.deleteEvent.connect( function(eventId){359 leadingActionBar {
357 model.removeItem(eventId);360 anchors.leftMargin: 0
358 if (pageStack)361 actions: Action {
359 pageStack.pop();362 text: i18n.tr("Cancel")
360 root.eventDeleted(eventId);363 iconName: "close"
361 });364 shortcut: "Esc"
362 }365 onTriggered: root.cancel()
363 },366 }
364 Action {367 delegate: pageHeader.delegate
365 iconName: "ok"368 }
366 objectName: "save"369 trailingActionBar {
370 anchors.rightMargin: 0
371 actions: Action {
367 text: i18n.tr("Save")372 text: i18n.tr("Save")
373 iconName: "tick"
374 shortcut: "Ctrl+S"
368 enabled: !!titleEdit.text.trim()375 enabled: !!titleEdit.text.trim()
369 onTriggered: saveToQtPim();376 onTriggered: saveToQtPim()
370 }377 }
371 ]378 delegate: pageHeader.delegate
379 }
372 }380 }
373381
374 Component{382 Component{
@@ -389,7 +397,6 @@
389397
390 Flickable{398 Flickable{
391 id: flickable399 id: flickable
392 clip: true
393400
394 property var activeItem: null401 property var activeItem: null
395402
@@ -419,11 +426,11 @@
419 flickable.returnToBounds()426 flickable.returnToBounds()
420 }427 }
421428
429 clip: true
422 flickableDirection: Flickable.VerticalFlick430 flickableDirection: Flickable.VerticalFlick
423 anchors{431 anchors{
424 left: parent.left432 left: parent.left
425 top: parent.top433 top: parent.header.bottom
426 topMargin: pageHeader.height
427 right: parent.right434 right: parent.right
428 bottom: keyboardRectangle.top435 bottom: keyboardRectangle.top
429 }436 }
@@ -437,7 +444,8 @@
437444
438 NewEventTimePicker{445 NewEventTimePicker{
439 id: startDateTimeInput446 id: startDateTimeInput
440 header: i18n.tr("From")447 //TRANSLATORS: this referes to date. eg: From: Wendsday, 9 March 2016
448 headerText: i18n.tr("From")
441 showTimePicker: !allDayEventCheckbox.checked449 showTimePicker: !allDayEventCheckbox.checked
442 anchors {450 anchors {
443 left: parent.left451 left: parent.left
@@ -450,7 +458,8 @@
450458
451 NewEventTimePicker{459 NewEventTimePicker{
452 id: endDateTimeInput460 id: endDateTimeInput
453 header: i18n.tr("To")461 //TRANSLATORS: this referes to date. eg: To: Wendsday, 9 March 2016
462 headerText: i18n.tr("To")
454 showTimePicker: !allDayEventCheckbox.checked463 showTimePicker: !allDayEventCheckbox.checked
455 anchors {464 anchors {
456 left: parent.left465 left: parent.left
@@ -461,184 +470,186 @@
461 }470 }
462 }471 }
463472
464 ListItems.Standard {473 // All day event ListItem with Switch
465 anchors {474 ListItem {
466 left: parent.left475 width: parent.width
467 right: parent.right476
468 }477 ListItemLayout {
469478 title.text: i18n.tr("All day event")
470 text: i18n.tr("All day event")479 Switch {
471 showDivider: false480 id: allDayEventCheckbox
472 control: CheckBox {481 checked: false
473 objectName: "allDayEventCheckbox"482 SlotsLayout.position: SlotsLayout.Trailing;
474 id: allDayEventCheckbox483 }
475 checked: false484 }
476 }485 onClicked: {
477 }486 Haptics.play()
478487 allDayEventCheckbox.checked = !allDayEventCheckbox.checked
479 ListItems.ThinDivider {}488 }
480489
481 Column {490 }
482 width: parent.width491
483 spacing: units.gu(1)492 // ListItem which holds "Event details" label + TextField + TextArea + TextField
484493 ListItem {
485 ListItems.Header{494 height: eventDetailsColumn.height + (eventDetailsColumn.anchors.margins*2)
486 text: i18n.tr("Event Details")495
487 }496 Column {
488497 id: eventDetailsColumn
489 TextField {498 spacing: units.gu(2)
490 id: titleEdit499 anchors {
491 objectName: "newEventName"500 left: parent.left
492501 right: parent.right
493 anchors {502 top: parent.top
494 left: parent.left503 margins: units.gu(2)
495 right: parent.right504 }
496 margins: units.gu(2)505
497 }506 Label {
498507 width: parent.width
499 inputMethodHints: Qt.ImhNoPredictiveText508 text: i18n.tr("Event details")
500 placeholderText: i18n.tr("Event Name")509 elide: Text.ElideRight
501 onFocusChanged: {510 }
502 if(titleEdit.focus) {511
503 flickable.makeMeVisible(titleEdit);512 TextField {
504 }513 id: titleEdit
505 }514 objectName: "newEventName"
506 }515
507516 width: parent.width
508 TextArea{517 inputMethodHints: Qt.ImhNoPredictiveText
509 id: messageEdit518 placeholderText: i18n.tr("Event Name")
510 objectName: "eventDescriptionInput"519
511520 onFocusChanged: {
512 anchors {521 if(titleEdit.focus) {
513 left: parent.left522 flickable.makeMeVisible(titleEdit);
514 right: parent.right523 }
515 margins: units.gu(2)524 }
516 }525 }
517526
518 placeholderText: i18n.tr("Description")527 TextArea{
519 onFocusChanged: {528 id: messageEdit
520 if(messageEdit.focus) {529 objectName: "eventDescriptionInput"
521 flickable.makeMeVisible(messageEdit);530
522 }531 width: parent.width
523 }532 placeholderText: i18n.tr("Description")
524 }533
525534 onFocusChanged: {
526 TextField {535 if(messageEdit.focus) {
527 id: locationEdit536 flickable.makeMeVisible(messageEdit);
528 objectName: "eventLocationInput"537 }
529538 }
530 anchors {539 }
531 left: parent.left540
532 right: parent.right541 TextField {
533 margins: units.gu(2)542 id: locationEdit
534 }543 objectName: "eventLocationInput"
535544
536 inputMethodHints: Qt.ImhNoPredictiveText545 width: parent.width
537 placeholderText: i18n.tr("Location")546 inputMethodHints: Qt.ImhNoPredictiveText
538547 placeholderText: i18n.tr("Location")
539 onFocusChanged: {548
540 if(locationEdit.focus) {549 onFocusChanged: {
541 flickable.makeMeVisible(locationEdit);550 if(locationEdit.focus) {
542 }551 flickable.makeMeVisible(locationEdit);
543 }552 }
544 }553 }
545 }554 }
546555 }
547 Column {556 }
548 width: parent.width557
549 spacing: units.gu(1)558 // ListItem to hold calendars selector
550559 ListItem {
551 ListItems.Header {560 height: chooseCalendarColumn.height + (eventDetailsColumn.anchors.topMargin*2)
552 text: i18n.tr("Calendar")561
553 }562 Column {
554563 id: chooseCalendarColumn
555 OptionSelector{564 spacing: units.gu(2)
556 id: calendarsOption565 anchors {
557 objectName: "calendarsOption"566 left: parent.left
558567 right: parent.right
559 anchors {568 top: parent.top
560 left: parent.left569 topMargin: units.gu(2)
561 right: parent.right570 }
562 margins: units.gu(2)571
563 }572 Label {
564573 width: parent.width
565 containerHeight: itemHeight * 4574 anchors {
566 model: root.model.getWritableCollections();575 left: parent.left
567576 leftMargin: units.gu(2)
568 delegate: OptionSelectorDelegate{577 right: parent.right
569 text: modelData.name578 rightMargin: units.gu(2)
570579 }
571 UbuntuShape{580 text: i18n.tr("Choose calendar")
572 id: calColor581 elide: Text.ElideRight
573 width: height582 }
574 height: parent.height - units.gu(2)583
575 color: modelData.color584 ListItems.ItemSelector {
576 anchors {585 id: calendarsOption
577 right: parent.right586 model: root.model.getWritableCollections();
578 rightMargin: units.gu(4)587 delegate: OptionSelectorDelegate { text: modelData.name }
579 verticalCenter: parent.verticalCenter588 }
580 }589
581 }590 }
582 }591 }
583 onExpandedChanged: Qt.inputMethod.hide();592
584 }593
585 }594 ListItem {
586595 height: guestsColumn.height + (guestsColumn.anchors.margins*2)
587 Column {596
588 width: parent.width597 Column {
589 spacing: units.gu(1)598 id: guestsColumn
590599 spacing: units.gu(2)
591 ListItems.Header {600 anchors {
592 text: i18n.tr("Guests")601 left: parent.left
593 }602 right: parent.right
594603 top: parent.top
595 Button{604 margins: units.gu(2)
596 id: addGuestButton605 }
597 objectName: "addGuestButton"606
598607 Label {
599 property var contactsPopup: null608 width: parent.width
600609 text: i18n.tr("Guests")
601 text: i18n.tr("Add Guest")610 elide: Text.ElideRight
602 anchors {611 }
603 left: parent.left612
604 right: parent.right613 Button{
605 margins: units.gu(2)614 id: addGuestButton
606 }615 objectName: "addGuestButton"
607616
608 onClicked: {617 property var contactsPopup: null
609 if (contactsPopup)618
610 return619 text: i18n.tr("Add Guest")
611620 anchors { left: parent.left; right: parent.right }
612 flickable.makeMeVisible(addGuestButton)621
613 contactsPopup = PopupUtils.open(Qt.resolvedUrl("ContactChoicePopup.qml"), addGuestButton);622 onClicked: {
614 contactsPopup.contactSelected.connect( function(contact, emailAddress) {623 if (contactsPopup)
615 if(!internal.isContactAlreadyAdded(contact, emailAddress) ) {624 return
616 var t = internal.contactToAttendee(contact, emailAddress);625
617 contactModel.append({"contact": t});626 flickable.makeMeVisible(addGuestButton)
618 }627 contactsPopup = PopupUtils.open(Qt.resolvedUrl("ContactChoicePopup.qml"), addGuestButton);
619628 contactsPopup.contactSelected.connect( function(contact, emailAddress) {
620 });629 if(!internal.isContactAlreadyAdded(contact, emailAddress) ) {
621 contactsPopup.Component.onDestruction.connect( function() {630 var t = internal.contactToAttendee(contact, emailAddress);
622 addGuestButton.contactsPopup = null631 contactModel.append({"contact": t});
623 })632 }
624 }633
625 }634 });
626635 contactsPopup.Component.onDestruction.connect( function() {
627 UbuntuShape {636 addGuestButton.contactsPopup = null
628 anchors {637 })
629 left: parent.left638 }
630 right: parent.right639 }
631 margins: units.gu(2)640
632 }
633
634 height: contactList.height
635641
636 Column{642 Column{
637 id: contactList643 id: contactList
638 objectName: "guestList"644 objectName: "guestList"
639645
640 spacing: units.gu(1)646 anchors {
641 width: parent.width647 left: parent.left;
648 leftMargin: units.gu(-2);
649 right: parent.right;
650 rightMargin: units.gu(-2);
651
652 }
642 clip: true653 clip: true
643654
644 ListModel{655 ListModel{
@@ -650,7 +661,11 @@
650 delegate: ListItem {661 delegate: ListItem {
651 objectName: "eventGuest%1".arg(index)662 objectName: "eventGuest%1".arg(index)
652663
664 height: guestListItemLayout.height
665 divider.visible: false
666
653 ListItemLayout {667 ListItemLayout {
668 id: guestListItemLayout
654 title.text: contact.name669 title.text: contact.name
655 subtitle.text: contact.emailAddress670 subtitle.text: contact.emailAddress
656 }671 }
@@ -666,27 +681,28 @@
666 }681 }
667 }682 }
668 }683 }
669 }684
670685 //TODO//
671 ListItems.ThinDivider {686 /////////////////
672 visible: (event != undefined) && (event.itemType === Type.Event)687
673 }688 }
674
675 }689 }
676690
677 ListItems.Subtitled{691
692 ListItem {
678 id:thisHappens693 id:thisHappens
679 objectName :"thisHappens"694 objectName :"thisHappens"
680695
681 anchors {696 height: thisHappensLayout.height
682 left: parent.left697
698 ListItemLayout {
699 id: thisHappensLayout
700 title.text: i18n.tr("Repeats")
701 summary.text: (event != undefined) && (event.itemType === Type.Event) ? rule === null ? i18n.tr(Defines.recurrenceLabel[0])
702 : eventUtils.getRecurrenceString(rule)
703 : ""
704 ProgressionSlot {}
683 }705 }
684
685 showDivider: false
686 progression: true
687 visible: (event != undefined) && (event.itemType === Type.Event)
688 text: i18n.tr("Repeats")
689 subText: (event != undefined) && (event.itemType === Type.Event) ? rule === null ? Defines.recurrenceLabel[0] : eventUtils.getRecurrenceString(rule) : ""
690 onClicked: {706 onClicked: {
691 var stack = pageStack707 var stack = pageStack
692 if (!stack)708 if (!stack)
@@ -696,41 +712,23 @@
696 }712 }
697 }713 }
698714
699 ListItems.ThinDivider {
700 visible: (event != undefined) && (event.itemType === Type.Event)
701 }
702715
703 ListItems.Subtitled{716 ListItem {
704 id:eventReminder717 id:eventReminder
705 objectName : "eventReminder"718 objectName : "eventReminder"
706719
707 anchors.left:parent.left720 height: eventReminderLayout.height
708 showDivider: false721
709 progression: true722 ListItemLayout {
710 text: i18n.tr("Reminder")723 id: eventReminderLayout
711724 title.text: i18n.tr("Reminder")
712 RemindersModel {725 subtitle.text: i18n.tr("%1").arg(reminderModel.getSelectedReminder())
713 id: reminderModel726 ProgressionSlot {}
714 }727 }
715728
716 subText:{729 onClicked: {
717 if(visualReminder.secondsBeforeStart !== -1) {
718 for( var i=0; i<reminderModel.count; i++ ) {
719 if(visualReminder.secondsBeforeStart === reminderModel.get(i).value) {
720 return reminderModel.get(i).label
721 }
722 }
723 } else {
724 return reminderModel.get(0).label
725 }
726
727 }
728
729 onClicked:{
730 var stack = pageStack730 var stack = pageStack
731 if (!stack)731 if (!stack) stack = bottomEdgePageStack
732 stack = bottomEdgePageStack
733
734 stack.push(Qt.resolvedUrl("EventReminder.qml"),732 stack.push(Qt.resolvedUrl("EventReminder.qml"),
735 {"visualReminder": visualReminder,733 {"visualReminder": visualReminder,
736 "audibleReminder": audibleReminder,734 "audibleReminder": audibleReminder,
@@ -739,8 +737,15 @@
739 }737 }
740 }738 }
741739
742 ListItems.ThinDivider {}
743 }740 }
741
742
743 }
744
745 // Scrollbar
746 Scrollbar{
747 flickableItem: flickable
748 align: Qt.AlignTrailing
744 }749 }
745750
746 // used to keep the field visible when the keyboard appear or dismiss751 // used to keep the field visible when the keyboard appear or dismiss
747752
=== removed file 'NewEventEntryField.qml'
--- NewEventEntryField.qml 2016-01-29 14:47:31 +0000
+++ NewEventEntryField.qml 1970-01-01 00:00:00 +0000
@@ -1,38 +0,0 @@
1/*
2 * Copyright (C) 2013-2014 Canonical Ltd
3 *
4 * This file is part of Ubuntu Calendar App
5 *
6 * Ubuntu Calendar App is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 3 as
8 * published by the Free Software Foundation.
9 *
10 * Ubuntu Calendar App is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
17 */
18
19import QtQuick 2.4
20import Ubuntu.Components 1.3
21
22Label {
23 id: root
24
25 property bool highlighted: false
26
27 height: units.gu(6)
28
29 verticalAlignment: Text.AlignVCenter
30 color: highlighted ? "#2C001E" : Theme.palette.normal.baseText
31
32 Rectangle {
33 z: -1
34 anchors.fill: parent
35 color: root.highlighted ? Theme.palette.selected.background
36 : "Transparent"
37 }
38}
390
=== modified file 'NewEventTimePicker.qml'
--- NewEventTimePicker.qml 2016-01-25 17:52:33 +0000
+++ NewEventTimePicker.qml 2016-03-15 21:24:54 +0000
@@ -1,75 +1,111 @@
1import QtQuick 2.41import QtQuick 2.4
2import Ubuntu.Components.ListItems 1.0 as ListItem2import Ubuntu.Components 1.3
3import Ubuntu.Components.Themes.Ambiance 1.03import Ubuntu.Components.Themes.Ambiance 1.0
4import Ubuntu.Components.Pickers 1.04import Ubuntu.Components.Pickers 1.3
5//import QtQuick.Layouts 1.1
56
6Column {7ListItem {
7 id: dateTimeInput8 id: dateTimeInput
8 property alias header: listHeader.text9
910 property string headerText //header label ("From" or "To")
10 property date dateTime;11 property date dateTime //keep date from DatePicker
11 property bool showTimePicker;12 property bool showTimePicker //if true then user is able to set time on event
13
14 // when new date set in DatePicker then this will be run.
15 onDateTimeChanged: {
16 layout.summary.text = dateTime.toLocaleDateString() // set date
17 secondLabel.text = Qt.formatTime(dateTime, "hh:mm AP").replace(/\./g, "") // set time
18 }
1219
13 function clearFocus() {20 function clearFocus() {
14 dateInput.focus = false;21 dateBG.focus = false;
15 timeInput.focus = false;22 timeBG.focus = false;
16 }23 }
1724
25 // function to open date/time picker
18 function openDatePicker (element, caller, callerProperty, mode) {26 function openDatePicker (element, caller, callerProperty, mode) {
19 element.highlighted = true;27 element.highlighted = true;
20 var picker = PickerPanel.openDatePicker(caller, callerProperty, mode);28 var picker = PickerPanel.openDatePicker(caller, callerProperty, mode);
21 if (!picker) return;29 if (!picker) return;
22 picker.closed.connect(function () {30 picker.closed.connect(function () { element.highlighted = false; });
23 element.highlighted = false;31 }
24 });32
25 }33 height: layout.height + divider.height
2634
27 onDateTimeChanged: {35 // backgroud color of full date fabel, to be shown when user click on date and DatePicker is visable
28 dateInput.text = dateTime.toLocaleDateString();36 Rectangle {
29 timeInput.text = Qt.formatTime(dateTime);37 id: dateBG
30 }38
3139 property bool highlighted: false
32 ListItem.Header {40
33 id: listHeader41 height: layout.summary.height + units.gu(3.5)
34 }42 width: showTimePicker ? layout.title.width + units.gu(3) : layout.width
3543 anchors.bottom: parent.bottom
36 Item {44 color: highlighted ? UbuntuColors.lightGrey : "transparent"
37 anchors {45
38 left: parent.left46 Behavior on color { ColorAnimation {} }
39 right: parent.right47 }
40 margins: units.gu(2)48
41 }49 // backgroud color of time label, to be shown when user click on date and DatePicker is visable
4250 Rectangle {
43 height: dateInput.height51 id: timeBG
4452
45 NewEventEntryField{53 property bool highlighted: false
46 id: dateInput54
47 objectName: "dateInput"55 height: dateBG.height
4856 width: slot.width + units.gu(4)
49 text: ""57 anchors.bottom: parent.bottom
50 anchors.left: parent.left58 anchors.right: parent.right
51 width: !showTimePicker ? parent.width : 4 * parent.width / 559 color: highlighted ? UbuntuColors.lightGrey : "transparent"
5260
53 MouseArea{61 Behavior on color { ColorAnimation {} }
54 anchors.fill: parent62 }
55 onClicked: openDatePicker(dateInput, dateTimeInput, "dateTime", "Years|Months|Days")63
56 }64 // ListItemLayout to keep full date label and time label
57 }65 ListItemLayout {
5866 id: layout
59 NewEventEntryField{67
60 id: timeInput68 title.text: headerText
61 objectName: "timeInput"69 title.color: Theme.palette.selected.overlayText
6270 title.font.pixelSize: FontUtils.sizeToPixels("small")
63 text: ""71 subtitle.text: " "
64 anchors.right: parent.right72 summary.color: dateBG.highlighted ? "white" : Theme.palette.selected.fieldText
65 width: parent.width / 573 summary.font.pixelSize: FontUtils.sizeToPixels("medium")
74
75 Behavior on summary.color { ColorAnimation {} }
76
77 // Item to hold Trailing tile label item
78 Item {
79 id: slot
80
81 width: secondLabel.width
82 height: parent.height
66 visible: showTimePicker83 visible: showTimePicker
67 horizontalAlignment: Text.AlignRight84 SlotsLayout.overrideVerticalPositioning: true
6885
69 MouseArea{86 // label to keep time [ 10:20 AM ]
70 anchors.fill: parent87 Label {
71 onClicked: openDatePicker(timeInput, dateTimeInput, "dateTime", "Hours|Minutes")88 id: secondLabel
89
90 fontSize: "medium"
91 color: timeBG.highlighted ? "white" : Theme.palette.selected.fieldText
92 y: layout.mainSlot.y + layout.summary.y + layout.summary.baselineOffset - baselineOffset
93 Behavior on color { ColorAnimation {} }
72 }94 }
73 }95 }
74 }96 }
97
98 // AbstractButton to be triggered when user click on full date
99 AbstractButton {
100 anchors.fill: dateBG
101 onClicked: { openDatePicker(dateBG, dateTimeInput, "dateTime", "Years|Months|Days")}
102 }
103
104 // AbstractButton to be triggered when user click on time
105 AbstractButton {
106 anchors.fill: timeBG
107 visible: showTimePicker
108 onClicked: { openDatePicker(timeBG, dateTimeInput, "dateTime", "Hours|Minutes")}
109 }
110
75}111}
76112
=== modified file 'RemindersModel.qml'
--- RemindersModel.qml 2016-03-14 14:30:16 +0000
+++ RemindersModel.qml 2016-03-15 21:24:54 +0000
@@ -40,5 +40,17 @@
40 reminderModel.append({ "label": i18n.tr("2 weeks"), "value": 1209600 })40 reminderModel.append({ "label": i18n.tr("2 weeks"), "value": 1209600 })
41 reminderModel.loaded()41 reminderModel.loaded()
42 }42 }
43
44 function getSelectedReminder() {
45 if(visualReminder.secondsBeforeStart !== -1) {
46 for( var i=0; i<reminderModel.count; i++ ) {
47 if(visualReminder.secondsBeforeStart === reminderModel.get(i).value) {
48 return reminderModel.get(i).label
49 }
50 }
51 } else {
52 return reminderModel.get(0).label
53 }
54 }
43}55}
4456
4557
=== modified file 'po/com.ubuntu.calendar.pot'
--- po/com.ubuntu.calendar.pot 2016-03-03 22:32:56 +0000
+++ po/com.ubuntu.calendar.pot 2016-03-15 21:24:54 +0000
@@ -8,7 +8,7 @@
8msgstr ""8msgstr ""
9"Project-Id-Version: \n"9"Project-Id-Version: \n"
10"Report-Msgid-Bugs-To: \n"10"Report-Msgid-Bugs-To: \n"
11"POT-Creation-Date: 2016-03-04 04:02+0530\n"11"POT-Creation-Date: 2016-03-15 12:32+0000\n"
12"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"12"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
13"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"13"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14"Language-Team: LANGUAGE <LL@li.org>\n"14"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -18,7 +18,7 @@
18"Content-Transfer-Encoding: 8bit\n"18"Content-Transfer-Encoding: 8bit\n"
19"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"19"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
2020
21#: ../AgendaView.qml:50 ../calendar.qml:292 ../calendar.qml:51821#: ../AgendaView.qml:50 ../calendar.qml:321 ../calendar.qml:547
22msgid "Agenda"22msgid "Agenda"
23msgstr ""23msgstr ""
2424
@@ -57,8 +57,10 @@
57#. where it's shown has limited space57#. where it's shown has limited space
58#: ../AllDayEventComponent.qml:15058#: ../AllDayEventComponent.qml:150
59#, qt-format59#, qt-format
60msgid "%1 ev."60msgid "%1 event"
61msgstr ""61msgid_plural "%1 events"
62msgstr[0] ""
63msgstr[1] ""
6264
63#. TRANSLATORS: the argument refers to the number of all day events65#. TRANSLATORS: the argument refers to the number of all day events
64#: ../AllDayEventComponent.qml:15466#: ../AllDayEventComponent.qml:154
@@ -68,7 +70,7 @@
68msgstr[0] ""70msgstr[0] ""
69msgstr[1] ""71msgstr[1] ""
7072
71#: ../CalendarChoicePopup.qml:34 ../EventActions.qml:5173#: ../CalendarChoicePopup.qml:34 ../EventActions.qml:52
72msgid "Calendars"74msgid "Calendars"
73msgstr ""75msgstr ""
7476
@@ -78,11 +80,11 @@
7880
79#. TRANSLATORS: Please translate this string to 15 characters only.81#. TRANSLATORS: Please translate this string to 15 characters only.
80#. Currently ,there is no way we can increase width of action menu currently.82#. Currently ,there is no way we can increase width of action menu currently.
81#: ../CalendarChoicePopup.qml:48 ../EventActions.qml:3683#: ../CalendarChoicePopup.qml:48 ../EventActions.qml:37
82msgid "Sync"84msgid "Sync"
83msgstr ""85msgstr ""
8486
85#: ../CalendarChoicePopup.qml:48 ../EventActions.qml:3687#: ../CalendarChoicePopup.qml:48 ../EventActions.qml:37
86msgid "Syncing"88msgid "Syncing"
87msgstr ""89msgstr ""
8890
@@ -95,7 +97,7 @@
95msgstr ""97msgstr ""
9698
97#: ../ColorPickerDialog.qml:55 ../DeleteConfirmationDialog.qml:6099#: ../ColorPickerDialog.qml:55 ../DeleteConfirmationDialog.qml:60
98#: ../EditEventConfirmationDialog.qml:53 ../NewEvent.qml:340100#: ../EditEventConfirmationDialog.qml:53 ../NewEvent.qml:362
99msgid "Cancel"101msgid "Cancel"
100msgstr ""102msgstr ""
101103
@@ -107,23 +109,17 @@
107msgid "Search contact"109msgid "Search contact"
108msgstr ""110msgstr ""
109111
110#: ../DayView.qml:71 ../MonthView.qml:50 ../WeekView.qml:54 ../YearView.qml:57112#: ../DayView.qml:72 ../MonthView.qml:50 ../WeekView.qml:55 ../YearView.qml:57
111msgid "Today"113msgid "Today"
112msgstr ""114msgstr ""
113115
114#. TRANSLATORS: this is a time formatting string,116#. TRANSLATORS: this is a time formatting string,
115#. see http://qt-project.org/doc/qt-5/qml-qtqml-date.html#details for valid expressions.117#. see http://qt-project.org/doc/qt-5/qml-qtqml-date.html#details for valid expressions.
116#. It's used in the header of the month and week views118#. It's used in the header of the month and week views
117#: ../DayView.qml:115 ../DayView.qml:203 ../MonthView.qml:78119#: ../DayView.qml:122 ../MonthView.qml:78 ../WeekView.qml:144
118#: ../WeekView.qml:137 ../WeekView.qml:256
119msgid "MMMM yyyy"120msgid "MMMM yyyy"
120msgstr ""121msgstr ""
121122
122#: ../DayView.qml:201 ../MonthView.qml:73 ../WeekView.qml:254
123#, qt-format
124msgid "%1 %2"
125msgstr ""
126
127#: ../DeleteConfirmationDialog.qml:31123#: ../DeleteConfirmationDialog.qml:31
128msgid "Delete Recurring Event"124msgid "Delete Recurring Event"
129msgstr ""125msgstr ""
@@ -151,11 +147,11 @@
151msgid "Delete this"147msgid "Delete this"
152msgstr ""148msgstr ""
153149
154#: ../DeleteConfirmationDialog.qml:51 ../NewEvent.qml:347150#: ../DeleteConfirmationDialog.qml:51
155msgid "Delete"151msgid "Delete"
156msgstr ""152msgstr ""
157153
158#: ../EditEventConfirmationDialog.qml:29 ../NewEvent.qml:335154#: ../EditEventConfirmationDialog.qml:29
159msgid "Edit Event"155msgid "Edit Event"
160msgstr ""156msgstr ""
161157
@@ -173,25 +169,25 @@
173msgid "Edit this"169msgid "Edit this"
174msgstr ""170msgstr ""
175171
176#: ../EventActions.qml:63 ../Settings.qml:29172#: ../EventActions.qml:64 ../Settings.qml:29
177msgid "Settings"173msgid "Settings"
178msgstr ""174msgstr ""
179175
180#. TRANSLATORS: the first argument (%1) refers to a start time for an event,176#. TRANSLATORS: the first argument (%1) refers to a start time for an event,
181#. while the second one (%2) refers to the end time177#. while the second one (%2) refers to the end time
182#: ../EventBubble.qml:97178#: ../EventBubble.qml:104
183#, qt-format179#, qt-format
184msgid "%1 - %2"180msgid "%1 - %2"
185msgstr ""181msgstr ""
186182
187#. TRANSLATORS: the first argument (%1) refers to a time for an event,183#. TRANSLATORS: the first argument (%1) refers to a time for an event,
188#. while the second one (%2) refers to title of event184#. while the second one (%2) refers to title of event
189#: ../EventBubble.qml:108 ../EventBubble.qml:113185#: ../EventBubble.qml:115 ../EventBubble.qml:120
190#, qt-format186#, qt-format
191msgid "%1 <b>%2</b>"187msgid "%1 <b>%2</b>"
192msgstr ""188msgstr ""
193189
194#: ../EventDetails.qml:44 ../NewEvent.qml:483190#: ../EventDetails.qml:44
195msgid "Event Details"191msgid "Event Details"
196msgstr ""192msgstr ""
197193
@@ -235,38 +231,34 @@
235msgid "Edit"231msgid "Edit"
236msgstr ""232msgstr ""
237233
238#: ../EventDetails.qml:389 ../NewEvent.qml:589234#: ../EventDetails.qml:389 ../NewEvent.qml:615
239msgid "Guests"235msgid "Guests"
240msgstr ""236msgstr ""
241237
242#: ../EventDetails.qml:432 ../EventReminder.qml:35 ../NewEvent.qml:701238#: ../EventDetails.qml:432 ../EventReminder.qml:35 ../NewEvent.qml:754
243msgid "Reminder"239msgid "Reminder"
244msgstr ""240msgstr ""
245241
246#. TRANSLATORS: this refers to how often a recurrent event repeats242#: ../EventRepetition.qml:43 ../EventRepetition.qml:175
247#. and it is shown as the header of the page to choose repetition
248#. and as the header of the list item that shows the repetition
249#. summary in the page that displays the event details
250#: ../EventRepetition.qml:40 ../EventRepetition.qml:155
251msgid "Repeat"243msgid "Repeat"
252msgstr ""244msgstr ""
253245
254#: ../EventRepetition.qml:174246#: ../EventRepetition.qml:202
255msgid "Repeats On:"247msgid "Repeats On:"
256msgstr ""248msgstr ""
257249
258#: ../EventRepetition.qml:219250#: ../EventRepetition.qml:254
259msgid "Recurring event ends"251msgid "Recurring event ends"
260msgstr ""252msgstr ""
261253
262#. TRANSLATORS: this refers to how often a recurrent event repeats254#. TRANSLATORS: this refers to how often a recurrent event repeats
263#. and it is shown as the header of the option selector to choose255#. and it is shown as the header of the option selector to choose
264#. its repetition256#. its repetition
265#: ../EventRepetition.qml:242 ../NewEvent.qml:685257#: ../EventRepetition.qml:285 ../NewEvent.qml:730
266msgid "Repeats"258msgid "Repeats"
267msgstr ""259msgstr ""
268260
269#: ../EventRepetition.qml:267261#: ../EventRepetition.qml:317
270msgid "Date"262msgid "Date"
271msgstr ""263msgstr ""
272264
@@ -314,58 +306,74 @@
314msgid "Wk"306msgid "Wk"
315msgstr ""307msgstr ""
316308
317#: ../NewEvent.qml:171309#: ../MonthView.qml:73 ../WeekView.qml:131
310#, qt-format
311msgid "%1 %2"
312msgstr ""
313
314#: ../NewEvent.qml:173
318msgid "End time can't be before start time"315msgid "End time can't be before start time"
319msgstr ""316msgstr ""
320317
321#: ../NewEvent.qml:335 ../NewEventBottomEdge.qml:52318#: ../NewEvent.qml:355 ../NewEvent.qml:372
322msgid "New Event"
323msgstr ""
324
325#: ../NewEvent.qml:364
326msgid "Save"319msgid "Save"
327msgstr ""320msgstr ""
328321
329#: ../NewEvent.qml:375322#: ../NewEvent.qml:387
330msgid "Error"323msgid "Error"
331msgstr ""324msgstr ""
332325
333#: ../NewEvent.qml:377326#: ../NewEvent.qml:389
334msgid "OK"327msgid "OK"
335msgstr ""328msgstr ""
336329
337#: ../NewEvent.qml:437330#. TRANSLATORS: this referes to date. eg: From: Wendsday, 9 March 2016
331#: ../NewEvent.qml:454
338msgid "From"332msgid "From"
339msgstr ""333msgstr ""
340334
341#: ../NewEvent.qml:450335#. TRANSLATORS: this referes to date. eg: To: Wendsday, 9 March 2016
336#: ../NewEvent.qml:468
342msgid "To"337msgid "To"
343msgstr ""338msgstr ""
344339
345#: ../NewEvent.qml:467340#: ../NewEvent.qml:484
346msgid "All day event"341msgid "All day event"
347msgstr ""342msgstr ""
348343
349#: ../NewEvent.qml:497344#: ../NewEvent.qml:514
345msgid "Event details"
346msgstr ""
347
348#: ../NewEvent.qml:524
350msgid "Event Name"349msgid "Event Name"
351msgstr ""350msgstr ""
352351
353#: ../NewEvent.qml:515352#: ../NewEvent.qml:538
354msgid "Description"353msgid "Description"
355msgstr ""354msgstr ""
356355
357#: ../NewEvent.qml:534356#: ../NewEvent.qml:553
358msgid "Location"357msgid "Location"
359msgstr ""358msgstr ""
360359
361#: ../NewEvent.qml:549 com.ubuntu.calendar_calendar.desktop.in.in.h:1360#: ../NewEvent.qml:586
362msgid "Calendar"361msgid "Choose calendar"
363msgstr ""362msgstr ""
364363
365#: ../NewEvent.qml:598364#: ../NewEvent.qml:645
366msgid "Add Guest"365msgid "Add Guest"
367msgstr ""366msgstr ""
368367
368#: ../NewEvent.qml:755
369#, qt-format
370msgid "%1"
371msgstr ""
372
373#: ../NewEventBottomEdge.qml:52
374msgid "New Event"
375msgstr ""
376
369#: ../RecurrenceLabelDefines.qml:23377#: ../RecurrenceLabelDefines.qml:23
370msgid "Once"378msgid "Once"
371msgstr ""379msgstr ""
@@ -467,7 +475,7 @@
467msgid "All Day"475msgid "All Day"
468msgstr ""476msgstr ""
469477
470#: ../WeekView.qml:131 ../WeekView.qml:132478#: ../WeekView.qml:138 ../WeekView.qml:139
471msgid "MMM"479msgid "MMM"
472msgstr ""480msgstr ""
473481
@@ -476,29 +484,33 @@
476msgid "Year %1"484msgid "Year %1"
477msgstr ""485msgstr ""
478486
479#: ../calendar.qml:46487#: ../calendar.qml:48
480msgid ""488msgid ""
481"Calendar app accept four arguments: --starttime, --endtime, --newevent and --"489"Calendar app accept four arguments: --starttime, --endtime, --newevent and --"
482"eventid. They will be managed by system. See the source for a full comment "490"eventid. They will be managed by system. See the source for a full comment "
483"about them"491"about them"
484msgstr ""492msgstr ""
485493
486#: ../calendar.qml:260 ../calendar.qml:434494#: ../calendar.qml:289 ../calendar.qml:463
487msgid "Year"495msgid "Year"
488msgstr ""496msgstr ""
489497
490#: ../calendar.qml:268 ../calendar.qml:455498#: ../calendar.qml:297 ../calendar.qml:484
491msgid "Month"499msgid "Month"
492msgstr ""500msgstr ""
493501
494#: ../calendar.qml:276 ../calendar.qml:476502#: ../calendar.qml:305 ../calendar.qml:505
495msgid "Week"503msgid "Week"
496msgstr ""504msgstr ""
497505
498#: ../calendar.qml:284 ../calendar.qml:497506#: ../calendar.qml:313 ../calendar.qml:526
499msgid "Day"507msgid "Day"
500msgstr ""508msgstr ""
501509
510#: com.ubuntu.calendar_calendar.desktop.in.in.h:1
511msgid "Calendar"
512msgstr ""
513
502#: com.ubuntu.calendar_calendar.desktop.in.in.h:2514#: com.ubuntu.calendar_calendar.desktop.in.in.h:2
503msgid "A calendar for Ubuntu which syncs with online accounts."515msgid "A calendar for Ubuntu which syncs with online accounts."
504msgstr ""516msgstr ""

Subscribers

People subscribed via source and target branches

to status/vote changes: