diff options
author | raimund-schluessler <raimund.schluessler@googlemail.com> | 2014-04-27 19:34:35 +0400 |
---|---|---|
committer | raimund-schluessler <raimund.schluessler@googlemail.com> | 2014-04-27 19:34:35 +0400 |
commit | 34dd3b2aa5a3a023663f7cec1f15b0ce0be92826 (patch) | |
tree | dfc8f7b05687a0f44c30af0c81edea1df42bf120 | |
parent | 910d0938c8161b3b77c3a311df7e9859a9b5fbaf (diff) |
Setting reminders of type Date-Time
-rw-r--r-- | css/style.css | 23 | ||||
-rw-r--r-- | css/style.less | 22 | ||||
-rw-r--r-- | js/app/app.coffee | 22 | ||||
-rw-r--r-- | js/app/controllers/detailscontroller.coffee | 59 | ||||
-rw-r--r-- | js/app/controllers/taskscontroller.coffee | 2 | ||||
-rw-r--r-- | js/app/directives/timepicker.coffee | 7 | ||||
-rw-r--r-- | js/app/filters/dateTaskList.coffee (renamed from js/app/filters/timeDetails.coffee) | 11 | ||||
-rw-r--r-- | js/app/filters/reminderDetails.coffee | 39 | ||||
-rw-r--r-- | js/app/services/businesslayer/tasksbusinesslayer.coffee | 104 | ||||
-rw-r--r-- | js/app/services/models/tasksmodel.coffee | 6 | ||||
-rw-r--r-- | js/app/services/persistence.coffee | 30 | ||||
-rw-r--r-- | js/public/app.js | 298 | ||||
-rw-r--r-- | l10n/de.php | 26 | ||||
-rw-r--r-- | lib/controller/taskscontroller.php | 50 | ||||
-rw-r--r-- | lib/helper.php | 19 | ||||
-rw-r--r-- | templates/part.details.php | 15 |
16 files changed, 515 insertions, 218 deletions
diff --git a/css/style.css b/css/style.css index 54119023..109014ac 100644 --- a/css/style.css +++ b/css/style.css @@ -837,6 +837,14 @@ border: 1px solid rgba(43, 136, 217, 0.65); box-shadow: 0 0 4px rgba(43, 136, 217, 0.32), 0 1px 1px rgba(255, 255, 255, 0.43), 0 2px 4px rgba(43, 136, 217, 0.12) inset, 0 0 4px rgba(43, 136, 217, 0.2) inset; } +#task-details .body .section select { + background-color: rgba(0, 0, 0, 0); + border-radius: 0px; + border: 1px solid #CCC; + padding: 0; + width: 100px; + font-weight: normal; +} #task-details .body .section .icon { left: 16px; position: absolute; @@ -907,9 +915,6 @@ #task-details .body .section.detail-reminder.date .section-description { display: block; } -#task-details .body .section.detail-reminder.date .section-title { - margin-top: -2px; -} input, textarea { -moz-user-select: text; @@ -953,6 +958,14 @@ input.timepicker-input { td.ui-timepicker-hours table { border-right: 1px solid #CCCCCC; } +.ui-timepicker table td a.ui-state-active { + background: -moz-linear-gradient(center top, #33a3ef, #168ad4) repeat scroll 0 0 transparent !important; + border-radius: 3px 3px 3px 3px; + color: white; + opacity: 1; + position: relative; + text-shadow: 0 1px 1px rgba(0, 0, 0, 0.4); +} .ui-datepicker, .ui-timepicker { width: 185px; @@ -1039,9 +1052,7 @@ td.ui-timepicker-hours table { color: #2289DA; } .ui-datepicker table td.selected a, -.ui-timepicker table td.selected a, -.ui-datepicker table td a.ui-state-active, -.ui-timepicker table td a.ui-state-active { +.ui-timepicker table td.selected a { background: -moz-linear-gradient(center top, #33a3ef, #168ad4) repeat scroll 0 0 transparent !important; border-radius: 3px 3px 3px 3px; color: white; diff --git a/css/style.less b/css/style.less index e47845f5..d34814c1 100644 --- a/css/style.less +++ b/css/style.less @@ -871,6 +871,14 @@ box-shadow: 0 0 4px rgba(43, 136, 217, 0.32), 0 1px 1px rgba(255, 255, 255, 0.43), 0 2px 4px rgba(43, 136, 217, 0.12) inset, 0 0 4px rgba(43, 136, 217, 0.2) inset; } } + select{ + background-color: rgba(0, 0, 0, 0); + border-radius: 0px; + border: 1px solid #CCC; + padding:0; + width: 100px; + font-weight: normal; + } .icon{ left: 16px; position: absolute; @@ -947,7 +955,7 @@ display: block; } .section-title{ - margin-top:-2px; + // margin-top:-2px; } } } @@ -1001,6 +1009,16 @@ input.timepicker-input{ td.ui-timepicker-hours table{ border-right: 1px solid #CCCCCC; } +.ui-timepicker{ + table td a.ui-state-active{ + background: -moz-linear-gradient(center top , #33A3EF, #168AD4) repeat scroll 0 0 transparent !important; + border-radius: 3px 3px 3px 3px; + color: white; + opacity: 1; + position: relative; + text-shadow: 0 1px 1px rgba(0, 0, 0, 0.4); + } +} .ui-datepicker, .ui-timepicker { width: 185px; .ui-widget-header{ @@ -1074,7 +1092,7 @@ td.ui-timepicker-hours table{ color:#2289DA; } } - &.selected a, a.ui-state-active{ + &.selected a{ background: -moz-linear-gradient(center top , #33A3EF, #168AD4) repeat scroll 0 0 transparent !important; border-radius: 3px 3px 3px 3px; color: white; diff --git a/js/app/app.coffee b/js/app/app.coffee index 980ea8ab..5e11f714 100644 --- a/js/app/app.coffee +++ b/js/app/app.coffee @@ -78,9 +78,9 @@ angular.module('Tasks').run ['Config', '$timeout', moment.lang('details', { calendar: { - lastDay : '['+t('tasks_enhanced','Due Yesterday')+'], HH:mm' - sameDay : '['+t('tasks_enhanced','Due Today')+'], HH:mm' - nextDay : '['+t('tasks_enhanced','Due Tomorrow')+'], HH:mm' + lastDay : '['+t('tasks_enhanced','Due yesterday')+'], HH:mm' + sameDay : '['+t('tasks_enhanced','Due today')+'], HH:mm' + nextDay : '['+t('tasks_enhanced','Due tomorrow')+'], HH:mm' lastWeek : '['+t('tasks_enhanced', 'Due on')+'] MMM DD, YYYY, HH:mm' nextWeek : '['+t('tasks_enhanced', 'Due on')+'] MMM DD, YYYY, HH:mm' sameElse : '['+t('tasks_enhanced', 'Due on')+'] MMM DD, YYYY, HH:mm' @@ -88,9 +88,9 @@ angular.module('Tasks').run ['Config', '$timeout', }) moment.lang('start', { calendar: { - lastDay : '['+t('tasks_enhanced','Started Yesterday')+'], HH:mm' - sameDay : '['+t('tasks_enhanced','Starts Today')+'], HH:mm' - nextDay : '['+t('tasks_enhanced','Starts Tomorrow')+'], HH:mm' + lastDay : '['+t('tasks_enhanced','Started yesterday')+'], HH:mm' + sameDay : '['+t('tasks_enhanced','Starts today')+'], HH:mm' + nextDay : '['+t('tasks_enhanced','Starts tomorrow')+'], HH:mm' lastWeek : '['+t('tasks_enhanced', 'Started on')+'] MMM DD, YYYY, HH:mm' nextWeek : '['+t('tasks_enhanced', 'Starts on')+'] MMM DD, YYYY, HH:mm' sameElse : () -> @@ -100,6 +100,16 @@ angular.module('Tasks').run ['Config', '$timeout', '['+t('tasks_enhanced', 'Started on')+'] MMM DD, YYYY, HH:mm' } }) + moment.lang('reminder', { + calendar: { + lastDay : t('tasks_enhanced', '[Remind me yesterday at ]HH:mm') + sameDay : t('tasks_enhanced', '[Remind me today at ]HH:mm') + nextDay : t('tasks_enhanced', '[Remind me tomorrow at ]HH:mm') + lastWeek : t('tasks_enhanced', '[Remind me on ]MMM DD, YYYY,[ at ]HH:mm') + nextWeek : t('tasks_enhanced', '[Remind me on ]MMM DD, YYYY,[ at ]HH:mm') + sameElse : t('tasks_enhanced', '[Remind me on ]MMM DD, YYYY,[ at ]HH:mm') + } + }) moment.lang('tasks', { calendar: { lastDay : '['+t('tasks_enhanced','Yesterday')+']' diff --git a/js/app/controllers/detailscontroller.coffee b/js/app/controllers/detailscontroller.coffee index a216cd58..c8a4001d 100644 --- a/js/app/controllers/detailscontroller.coffee +++ b/js/app/controllers/detailscontroller.coffee @@ -37,6 +37,17 @@ $timeout, $routeParams) -> _$scope.task = _$tasksmodel.getById(_$scope.route.taskID) ) + @_$scope.durations = [ + {name: t('tasks_enhanced','years'), abbr: 'y'}, + {name: t('tasks_enhanced','months'), abbr: 'm'}, + {name: t('tasks_enhanced','days'), abbr: 'd'}, + {name: t('tasks_enhanced','hours'), abbr: 'h'}, + {name: t('tasks_enhanced','minutes'), abbr: 'i'}, + {name: t('tasks_enhanced','seconds'), abbr: 's'} + ] + + @_$scope.duration = _$scope.durations[1] + @_$scope.closeDetails = () -> if _$scope.status.searchActive _$location.path('/search/'+_$scope.route.searchString) @@ -106,15 +117,15 @@ $timeout, $routeParams) -> _$scope.endEdit() @_$scope.deleteDueDate = () -> - _tasksbusinesslayer.deleteDueDate(_$scope.route.taskID, undefined) + _tasksbusinesslayer.deleteDueDate(_$scope.route.taskID) _$scope.endEdit() - @_$scope.deleteReminder = () -> - _tasksbusinesslayer.setReminderDate(_$scope.route.taskID, undefined) + @_$scope.deleteStartDate = () -> + _tasksbusinesslayer.deleteStartDate(_$scope.route.taskID) _$scope.endEdit() - @_$scope.deleteStartDate = () -> - _tasksbusinesslayer.setStartDate(_$scope.route.taskID, undefined) + @_$scope.deleteReminder = () -> + _tasksbusinesslayer.deleteReminderDate(_$scope.route.taskID) _$scope.endEdit() @_$scope.toggleCompleted = (taskID) -> @@ -155,24 +166,38 @@ $timeout, $routeParams) -> ,true) @_$scope.setstartday = (date) -> - _tasksbusinesslayer.setStartDay(_$scope.route.taskID, - moment(date,'MM/DD/YYYY')) + _tasksbusinesslayer.setStart(_$scope.route.taskID, + moment(date,'MM/DD/YYYY'),'day') @_$scope.setstarttime = (date) -> - _tasksbusinesslayer.setStartTime(_$scope.route.taskID, - moment(date,'HH:mm')) + _tasksbusinesslayer.setStart(_$scope.route.taskID, + moment(date,'HH:mm'),'time') @_$scope.setdueday = (date) -> - _tasksbusinesslayer.setDueDay(_$scope.route.taskID, - moment(date,'MM/DD/YYYY')) + _tasksbusinesslayer.setDue(_$scope.route.taskID, + moment(date,'MM/DD/YYYY'),'day') @_$scope.setduetime = (date) -> - _tasksbusinesslayer.setDueTime(_$scope.route.taskID, - moment(date,'HH:mm')) - - @_$scope.setreminder = (date) -> - _tasksbusinesslayer.setReminderDate(_$scope.route.taskID, - moment(date,'MM/DD/YYYY').format('YYYYMMDDTHHmmss')) + _tasksbusinesslayer.setDue(_$scope.route.taskID, + moment(date,'HH:mm'),'time') + + @_$scope.setreminderday = (date) -> + _tasksbusinesslayer.setReminder(_$scope.route.taskID, + moment(date,'MM/DD/YYYY'),'day') + + @_$scope.setremindertime = (date) -> + _tasksbusinesslayer.setReminder(_$scope.route.taskID, + moment(date,'HH:mm'),'time') + + @_$scope.reminderType = (task) -> + if !angular.isUndefined(task) + if task.reminder == null + if moment(task.start, "YYYYMMDDTHHmmss").isValid() + return 'DURATION' + else + return 'DATE-TIME' + else + return task.reminder.type return new DetailsController($scope, $window, TasksModel, TasksBusinessLayer, $route, $location, $timeout, $routeParams) diff --git a/js/app/controllers/taskscontroller.coffee b/js/app/controllers/taskscontroller.coffee index bc5cbea4..6bfc7bba 100644 --- a/js/app/controllers/taskscontroller.coffee +++ b/js/app/controllers/taskscontroller.coffee @@ -129,7 +129,7 @@ CollectionsModel, TasksBusinessLayer, $location) -> task = { tmpID: 'newTask' + Date.now() - calendarID: undefined + calendarID: null name: taskName starred: false due: false diff --git a/js/app/directives/timepicker.coffee b/js/app/directives/timepicker.coffee index 75c2b12d..7411d906 100644 --- a/js/app/directives/timepicker.coffee +++ b/js/app/directives/timepicker.coffee @@ -30,11 +30,4 @@ angular.module('Tasks').directive 'timepicker', -> atPosition: 'center bottom' hourText: t('tasks_enhanced','Hours') minuteText: t('tasks_enhanced','Minutes') - # beforeShowDay: (date) -> - # if (moment(date).startOf('day') - # .diff(moment(scope.task[attr.datepicker], "YYYYMMDDTHHmmss") - # .startOf('day'),'days') == 0) - # return [1,"selected"] - # else - # return [1,""] })
\ No newline at end of file diff --git a/js/app/filters/timeDetails.coffee b/js/app/filters/dateTaskList.coffee index 15fc2833..f2fc743a 100644 --- a/js/app/filters/timeDetails.coffee +++ b/js/app/filters/dateTaskList.coffee @@ -19,10 +19,9 @@ You should have received a copy of the GNU Affero General Public License along with this library. If not, see <http://www.gnu.org/licenses/>. ### -angular.module('Tasks').filter 'timeDetails', () -> - (reminder) -> - if moment(reminder, "YYYYMMDDTHHmmss").isValid() - return moment(reminder, "YYYYMMDDTHHmmss"). - format('['+t('tasks_enhanced','Remind me at')+'] HH:mm A') +angular.module('Tasks').filter 'dateTaskList', () -> + (due) -> + if moment(due, "YYYYMMDDTHHmmss").isValid() + return moment(due, "YYYYMMDDTHHmmss").lang('tasks').calendar() else - return t('tasks_enhanced', 'Remind me')
\ No newline at end of file + return ''
\ No newline at end of file diff --git a/js/app/filters/reminderDetails.coffee b/js/app/filters/reminderDetails.coffee new file mode 100644 index 00000000..346374e7 --- /dev/null +++ b/js/app/filters/reminderDetails.coffee @@ -0,0 +1,39 @@ +### + +ownCloud - Tasks + +@author Raimund Schlüßler +@copyright 2013 + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE +License as published by the Free Software Foundation; either +version 3 of the License, or any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU AFFERO GENERAL PUBLIC LICENSE for more details. + +You should have received a copy of the GNU Affero General Public +License along with this library. If not, see <http://www.gnu.org/licenses/>. + +### +angular.module('Tasks').filter 'reminderDetails', () -> + (reminder,scope) -> + if !(angular.isUndefined(reminder) || reminder == null) + if reminder.type == 'DATE-TIME' && + moment(reminder.date, "YYYYMMDDTHHmmss").isValid() + return moment(reminder.date, "YYYYMMDDTHHmmss").lang('reminder').calendar() + else if reminder.type == 'DURATION' + ds = t('tasks_enhanced', 'Remind me') + for token in scope.durations + if reminder.duration[token.abbr] + ds+=' '+reminder.duration[token.abbr]+' '+t('tasks_enhanced',token.name) + if reminder.duration.invert + ds+= ' '+t('tasks_enhanced','before') + else + ds+= ' '+t('tasks_enhanced','after') + return ds + else + return t('tasks_enhanced', 'Remind me')
\ No newline at end of file diff --git a/js/app/services/businesslayer/tasksbusinesslayer.coffee b/js/app/services/businesslayer/tasksbusinesslayer.coffee index ec6718c7..a472c4fd 100644 --- a/js/app/services/businesslayer/tasksbusinesslayer.coffee +++ b/js/app/services/businesslayer/tasksbusinesslayer.coffee @@ -62,65 +62,87 @@ angular.module('Tasks').factory 'TasksBusinessLayer', @_$tasksmodel.removeById(taskID) @_persistence.deleteTask(taskID) - setDueDay: (taskID, day) -> + setDue: (taskID, date, type='day') -> due = moment(@_$tasksmodel.getById(taskID).due, "YYYYMMDDTHHmmss") - if moment(due).isValid() - due.year(day.year()).month(day.month()).day(day.day()) - else - due = day.add('h',12) - - @_$tasksmodel.setDueDate(taskID,due.format('YYYYMMDDTHHmmss')) - @_persistence.setDueDate(taskID, - if due.isValid() then due.unix() else false) - - setDueTime: (taskID, time) -> - due = moment(@_$tasksmodel.getById(taskID).due, "YYYYMMDDTHHmmss") - if moment(due).isValid() - due.hour(time.hour()).minute(time.minute()) + if type=='day' + if moment(due).isValid() + due.year(date.year()).month(date.month()).date(date.date()) + else + due = date.add('h',12) + else if type == 'time' + if moment(due).isValid() + due.hour(date.hour()).minute(date.minute()) + else + due = date else - due = time + return @_$tasksmodel.setDueDate(taskID,due.format('YYYYMMDDTHHmmss')) @_persistence.setDueDate(taskID, if due.isValid() then due.unix() else false) deleteDueDate: (taskID) -> - @_$tasksmodel.setDueDate(taskID, undefined) + @_$tasksmodel.setDueDate(taskID, null) @_persistence.setDueDate(taskID, false) - setStartDay: (taskID, day) -> - start = moment(@_$tasksmodel.getById(taskID).start, "YYYYMMDDTHHmmss") - if moment(start).isValid() - start.year(day.year()).month(day.month()).day(day.day()) - else - start = day.add('h',12) - - @_$tasksmodel.setStartDate(taskID,start.format('YYYYMMDDTHHmmss')) - @_persistence.setStartDate(taskID, - if start.isValid() then start.unix() else false) - - setStartTime: (taskID, time) -> + setStart: (taskID, date, type='day') -> start = moment(@_$tasksmodel.getById(taskID).start, "YYYYMMDDTHHmmss") - if moment(start).isValid() - start.hour(time.hour()).minute(time.minute()) + if type == 'day' + if moment(start).isValid() + start.year(date.year()).month(date.month()).date(date.date()) + else + start = date.add('h',12) + else if type == 'time' + if moment(start).isValid() + start.hour(date.hour()).minute(date.minute()) + else + start = date else - start = time + return @_$tasksmodel.setStartDate(taskID,start.format('YYYYMMDDTHHmmss')) @_persistence.setStartDate(taskID, if start.isValid() then start.unix() else false) deleteStartDate: (taskID) -> - @_$tasksmodel.setStartDate(taskID, undefined) + @_$tasksmodel.setStartDate(taskID, null) @_persistence.setStartDate(taskID, false) - - setStartDate: (taskID, start) -> - @_$tasksmodel.setStartDate(taskID,start) - date = moment(start, "YYYYMMDDTHHmmss") - @_persistence.setStartDate(taskID, - if date.isValid() then date.unix() else false) - - setReminderDate: (taskID, reminder) -> - @_$tasksmodel.setReminderDate(taskID,reminder) + setReminder: (taskID, date, type='day') -> + reminder = @_$tasksmodel.getById(taskID).reminder + newreminder = { + type: 'DATE-TIME', + action: 'DISPLAY', + duration: null, + trigger: null + } + if type == 'day' + if !(angular.isUndefined(reminder) || reminder == null) + reminderdate = moment(reminder.date, "YYYYMMDDTHHmmss") + newreminder.action = reminder.action + if (reminderdate.isValid() && reminder.type == 'DATE-TIME') + reminderdate.year(date.year()).month(date.month()).date(date.date()) + else + reminderdate = date.add('h',12) + else + reminderdate = date.add('h',12) + else if type == 'time' + if !(angular.isUndefined(reminder) || reminder == null) + reminderdate = moment(reminder.date, "YYYYMMDDTHHmmss") + newreminder.action = reminder.action + if (reminderdate.isValid() && reminder.type == 'DATE-TIME') + reminderdate.hour(date.hour()).minute(date.minute()) + else + reminderdate = date + else + reminderdate = date + else + return + newreminder.date = reminderdate.format('YYYYMMDDTHHmmss') + @_$tasksmodel.setReminderDate(taskID,newreminder) + @_persistence.setReminder(taskID,newreminder) + + deleteReminderDate: (taskID) -> + @_$tasksmodel.setReminderDate(taskID, null) + @_persistence.setReminder(taskID,false) changeCalendarId: (taskID, calendarID) -> @_$tasksmodel.changeCalendarId(taskID, calendarID) diff --git a/js/app/services/models/tasksmodel.coffee b/js/app/services/models/tasksmodel.coffee index 508e554a..a759c751 100644 --- a/js/app/services/models/tasksmodel.coffee +++ b/js/app/services/models/tasksmodel.coffee @@ -122,13 +122,13 @@ angular.module('Tasks').factory 'TasksModel', uncomplete: (taskID) -> @update({id:taskID,completed:false, - completed_date:undefined}) + completed_date:null}) setDueDate: (taskID,date) -> @update({id:taskID,due:date}) - setReminderDate: (taskID,date) -> - @update({id:taskID,reminder:{date:date}}) + setReminderDate: (taskID,reminder) -> + @update({id:taskID,reminder:reminder}) setStartDate: (taskID,date) -> @update({id:taskID,start:date}) diff --git a/js/app/services/persistence.coffee b/js/app/services/persistence.coffee index 14630b6b..ab07ed88 100644 --- a/js/app/services/persistence.coffee +++ b/js/app/services/persistence.coffee @@ -183,12 +183,30 @@ angular.module('Tasks').factory 'Persistence', @_request.post '/apps/tasks_enhanced/tasks/{taskID}/start', params - setReminderDate: (taskID, reminder) -> - params = - routeParams: - taskID: taskID - data: - reminder: reminder + setReminder: (taskID, reminder) -> + if reminder == false + params = + routeParams: + taskID: taskID + data: + type: false + else if reminder.type == 'DATE-TIME' + params = + routeParams: + taskID: taskID + data: + type: reminder.type + action: reminder.action + date: moment(reminder.date, 'YYYYMMDDTHHmmss').unix() + else if reminder.type == 'DURATION' + params = + routeParams: + taskID: taskID + data: + type: reminder.type + action: reminder.action + duration: reminder.duration + else return @_request.post '/apps/tasks_enhanced/tasks/{taskID}/reminder', params diff --git a/js/public/app.js b/js/public/app.js index ac8c4b67..cd3b312b 100644 --- a/js/public/app.js +++ b/js/public/app.js @@ -74,9 +74,9 @@ })(); moment.lang('details', { calendar: { - lastDay: '[' + t('tasks_enhanced', 'Due Yesterday') + '], HH:mm', - sameDay: '[' + t('tasks_enhanced', 'Due Today') + '], HH:mm', - nextDay: '[' + t('tasks_enhanced', 'Due Tomorrow') + '], HH:mm', + lastDay: '[' + t('tasks_enhanced', 'Due yesterday') + '], HH:mm', + sameDay: '[' + t('tasks_enhanced', 'Due today') + '], HH:mm', + nextDay: '[' + t('tasks_enhanced', 'Due tomorrow') + '], HH:mm', lastWeek: '[' + t('tasks_enhanced', 'Due on') + '] MMM DD, YYYY, HH:mm', nextWeek: '[' + t('tasks_enhanced', 'Due on') + '] MMM DD, YYYY, HH:mm', sameElse: '[' + t('tasks_enhanced', 'Due on') + '] MMM DD, YYYY, HH:mm' @@ -84,9 +84,9 @@ }); moment.lang('start', { calendar: { - lastDay: '[' + t('tasks_enhanced', 'Started Yesterday') + '], HH:mm', - sameDay: '[' + t('tasks_enhanced', 'Starts Today') + '], HH:mm', - nextDay: '[' + t('tasks_enhanced', 'Starts Tomorrow') + '], HH:mm', + lastDay: '[' + t('tasks_enhanced', 'Started yesterday') + '], HH:mm', + sameDay: '[' + t('tasks_enhanced', 'Starts today') + '], HH:mm', + nextDay: '[' + t('tasks_enhanced', 'Starts tomorrow') + '], HH:mm', lastWeek: '[' + t('tasks_enhanced', 'Started on') + '] MMM DD, YYYY, HH:mm', nextWeek: '[' + t('tasks_enhanced', 'Starts on') + '] MMM DD, YYYY, HH:mm', sameElse: function() { @@ -98,6 +98,16 @@ } } }); + moment.lang('reminder', { + calendar: { + lastDay: t('tasks_enhanced', '[Remind me yesterday at ]HH:mm'), + sameDay: t('tasks_enhanced', '[Remind me today at ]HH:mm'), + nextDay: t('tasks_enhanced', '[Remind me tomorrow at ]HH:mm'), + lastWeek: t('tasks_enhanced', '[Remind me on ]MMM DD, YYYY,[ at ]HH:mm'), + nextWeek: t('tasks_enhanced', '[Remind me on ]MMM DD, YYYY,[ at ]HH:mm'), + sameElse: t('tasks_enhanced', '[Remind me on ]MMM DD, YYYY,[ at ]HH:mm') + } + }); moment.lang('tasks', { calendar: { lastDay: '[' + t('tasks_enhanced', 'Yesterday') + ']', @@ -337,6 +347,28 @@ this._$scope.$on('$routeChangeSuccess', function() { return _$scope.task = _$tasksmodel.getById(_$scope.route.taskID); }); + this._$scope.durations = [ + { + name: t('tasks_enhanced', 'years'), + abbr: 'y' + }, { + name: t('tasks_enhanced', 'months'), + abbr: 'm' + }, { + name: t('tasks_enhanced', 'days'), + abbr: 'd' + }, { + name: t('tasks_enhanced', 'hours'), + abbr: 'h' + }, { + name: t('tasks_enhanced', 'minutes'), + abbr: 'i' + }, { + name: t('tasks_enhanced', 'seconds'), + abbr: 's' + } + ]; + this._$scope.duration = _$scope.durations[1]; this._$scope.closeDetails = function() { if (_$scope.status.searchActive) { return _$location.path('/search/' + _$scope.route.searchString); @@ -402,15 +434,15 @@ } }; this._$scope.deleteDueDate = function() { - _tasksbusinesslayer.deleteDueDate(_$scope.route.taskID, void 0); + _tasksbusinesslayer.deleteDueDate(_$scope.route.taskID); return _$scope.endEdit(); }; - this._$scope.deleteReminder = function() { - _tasksbusinesslayer.setReminderDate(_$scope.route.taskID, void 0); + this._$scope.deleteStartDate = function() { + _tasksbusinesslayer.deleteStartDate(_$scope.route.taskID); return _$scope.endEdit(); }; - this._$scope.deleteStartDate = function() { - _tasksbusinesslayer.setStartDate(_$scope.route.taskID, void 0); + this._$scope.deleteReminder = function() { + _tasksbusinesslayer.deleteReminderDate(_$scope.route.taskID); return _$scope.endEdit(); }; this._$scope.toggleCompleted = function(taskID) { @@ -456,19 +488,35 @@ } }, true); this._$scope.setstartday = function(date) { - return _tasksbusinesslayer.setStartDay(_$scope.route.taskID, moment(date, 'MM/DD/YYYY')); + return _tasksbusinesslayer.setStart(_$scope.route.taskID, moment(date, 'MM/DD/YYYY'), 'day'); }; this._$scope.setstarttime = function(date) { - return _tasksbusinesslayer.setStartTime(_$scope.route.taskID, moment(date, 'HH:mm')); + return _tasksbusinesslayer.setStart(_$scope.route.taskID, moment(date, 'HH:mm'), 'time'); }; this._$scope.setdueday = function(date) { - return _tasksbusinesslayer.setDueDay(_$scope.route.taskID, moment(date, 'MM/DD/YYYY')); + return _tasksbusinesslayer.setDue(_$scope.route.taskID, moment(date, 'MM/DD/YYYY'), 'day'); }; this._$scope.setduetime = function(date) { - return _tasksbusinesslayer.setDueTime(_$scope.route.taskID, moment(date, 'HH:mm')); + return _tasksbusinesslayer.setDue(_$scope.route.taskID, moment(date, 'HH:mm'), 'time'); }; - this._$scope.setreminder = function(date) { - return _tasksbusinesslayer.setReminderDate(_$scope.route.taskID, moment(date, 'MM/DD/YYYY').format('YYYYMMDDTHHmmss')); + this._$scope.setreminderday = function(date) { + return _tasksbusinesslayer.setReminder(_$scope.route.taskID, moment(date, 'MM/DD/YYYY'), 'day'); + }; + this._$scope.setremindertime = function(date) { + return _tasksbusinesslayer.setReminder(_$scope.route.taskID, moment(date, 'HH:mm'), 'time'); + }; + this._$scope.reminderType = function(task) { + if (!angular.isUndefined(task)) { + if (task.reminder === null) { + if (moment(task.start, "YYYYMMDDTHHmmss").isValid()) { + return 'DURATION'; + } else { + return 'DATE-TIME'; + } + } else { + return task.reminder.type; + } + } }; } @@ -776,7 +824,7 @@ _$scope.isAddingTask = true; task = { tmpID: 'newTask' + Date.now(), - calendarID: void 0, + calendarID: null, name: taskName, starred: false, due: false, @@ -951,73 +999,113 @@ return this._persistence.deleteTask(taskID); }; - TasksBusinessLayer.prototype.setDueDay = function(taskID, day) { + TasksBusinessLayer.prototype.setDue = function(taskID, date, type) { var due; - due = moment(this._$tasksmodel.getById(taskID).due, "YYYYMMDDTHHmmss"); - if (moment(due).isValid()) { - due.year(day.year()).month(day.month()).day(day.day()); - } else { - due = day.add('h', 12); + if (type == null) { + type = 'day'; } - this._$tasksmodel.setDueDate(taskID, due.format('YYYYMMDDTHHmmss')); - return this._persistence.setDueDate(taskID, due.isValid() ? due.unix() : false); - }; - - TasksBusinessLayer.prototype.setDueTime = function(taskID, time) { - var due; due = moment(this._$tasksmodel.getById(taskID).due, "YYYYMMDDTHHmmss"); - if (moment(due).isValid()) { - due.hour(time.hour()).minute(time.minute()); + if (type === 'day') { + if (moment(due).isValid()) { + due.year(date.year()).month(date.month()).date(date.date()); + } else { + due = date.add('h', 12); + } + } else if (type === 'time') { + if (moment(due).isValid()) { + due.hour(date.hour()).minute(date.minute()); + } else { + due = date; + } } else { - due = time; + return; } this._$tasksmodel.setDueDate(taskID, due.format('YYYYMMDDTHHmmss')); return this._persistence.setDueDate(taskID, due.isValid() ? due.unix() : false); }; TasksBusinessLayer.prototype.deleteDueDate = function(taskID) { - this._$tasksmodel.setDueDate(taskID, void 0); + this._$tasksmodel.setDueDate(taskID, null); return this._persistence.setDueDate(taskID, false); }; - TasksBusinessLayer.prototype.setStartDay = function(taskID, day) { + TasksBusinessLayer.prototype.setStart = function(taskID, date, type) { var start; - start = moment(this._$tasksmodel.getById(taskID).start, "YYYYMMDDTHHmmss"); - if (moment(start).isValid()) { - start.year(day.year()).month(day.month()).day(day.day()); - } else { - start = day.add('h', 12); + if (type == null) { + type = 'day'; } - this._$tasksmodel.setStartDate(taskID, start.format('YYYYMMDDTHHmmss')); - return this._persistence.setStartDate(taskID, start.isValid() ? start.unix() : false); - }; - - TasksBusinessLayer.prototype.setStartTime = function(taskID, time) { - var start; start = moment(this._$tasksmodel.getById(taskID).start, "YYYYMMDDTHHmmss"); - if (moment(start).isValid()) { - start.hour(time.hour()).minute(time.minute()); + if (type === 'day') { + if (moment(start).isValid()) { + start.year(date.year()).month(date.month()).date(date.date()); + } else { + start = date.add('h', 12); + } + } else if (type === 'time') { + if (moment(start).isValid()) { + start.hour(date.hour()).minute(date.minute()); + } else { + start = date; + } } else { - start = time; + return; } this._$tasksmodel.setStartDate(taskID, start.format('YYYYMMDDTHHmmss')); return this._persistence.setStartDate(taskID, start.isValid() ? start.unix() : false); }; TasksBusinessLayer.prototype.deleteStartDate = function(taskID) { - this._$tasksmodel.setStartDate(taskID, void 0); + this._$tasksmodel.setStartDate(taskID, null); return this._persistence.setStartDate(taskID, false); }; - TasksBusinessLayer.prototype.setStartDate = function(taskID, start) { - var date; - this._$tasksmodel.setStartDate(taskID, start); - date = moment(start, "YYYYMMDDTHHmmss"); - return this._persistence.setStartDate(taskID, date.isValid() ? date.unix() : false); + TasksBusinessLayer.prototype.setReminder = function(taskID, date, type) { + var newreminder, reminder, reminderdate; + if (type == null) { + type = 'day'; + } + reminder = this._$tasksmodel.getById(taskID).reminder; + newreminder = { + type: 'DATE-TIME', + action: 'DISPLAY', + duration: null, + trigger: null + }; + if (type === 'day') { + if (!(angular.isUndefined(reminder) || reminder === null)) { + reminderdate = moment(reminder.date, "YYYYMMDDTHHmmss"); + newreminder.action = reminder.action; + if (reminderdate.isValid() && reminder.type === 'DATE-TIME') { + reminderdate.year(date.year()).month(date.month()).date(date.date()); + } else { + reminderdate = date.add('h', 12); + } + } else { + reminderdate = date.add('h', 12); + } + } else if (type === 'time') { + if (!(angular.isUndefined(reminder) || reminder === null)) { + reminderdate = moment(reminder.date, "YYYYMMDDTHHmmss"); + newreminder.action = reminder.action; + if (reminderdate.isValid() && reminder.type === 'DATE-TIME') { + reminderdate.hour(date.hour()).minute(date.minute()); + } else { + reminderdate = date; + } + } else { + reminderdate = date; + } + } else { + return; + } + newreminder.date = reminderdate.format('YYYYMMDDTHHmmss'); + this._$tasksmodel.setReminderDate(taskID, newreminder); + return this._persistence.setReminder(taskID, newreminder); }; - TasksBusinessLayer.prototype.setReminderDate = function(taskID, reminder) { - return this._$tasksmodel.setReminderDate(taskID, reminder); + TasksBusinessLayer.prototype.deleteReminderDate = function(taskID) { + this._$tasksmodel.setReminderDate(taskID, null); + return this._persistence.setReminder(taskID, false); }; TasksBusinessLayer.prototype.changeCalendarId = function(taskID, calendarID) { @@ -1505,7 +1593,7 @@ return this.update({ id: taskID, completed: false, - completed_date: void 0 + completed_date: null }); }; @@ -1516,12 +1604,10 @@ }); }; - TasksModel.prototype.setReminderDate = function(taskID, date) { + TasksModel.prototype.setReminderDate = function(taskID, reminder) { return this.update({ id: taskID, - reminder: { - date: date - } + reminder: reminder }); }; @@ -1807,16 +1893,42 @@ return this._request.post('/apps/tasks_enhanced/tasks/{taskID}/start', params); }; - Persistence.prototype.setReminderDate = function(taskID, reminder) { + Persistence.prototype.setReminder = function(taskID, reminder) { var params; - params = { - routeParams: { - taskID: taskID - }, - data: { - reminder: reminder - } - }; + if (reminder === false) { + params = { + routeParams: { + taskID: taskID + }, + data: { + type: false + } + }; + } else if (reminder.type === 'DATE-TIME') { + params = { + routeParams: { + taskID: taskID + }, + data: { + type: reminder.type, + action: reminder.action, + date: moment(reminder.date, 'YYYYMMDDTHHmmss').unix() + } + }; + } else if (reminder.type === 'DURATION') { + params = { + routeParams: { + taskID: taskID + }, + data: { + type: reminder.type, + action: reminder.action, + duration: reminder.duration + } + }; + } else { + return; + } return this._request.post('/apps/tasks_enhanced/tasks/{taskID}/reminder', params); }; @@ -1991,6 +2103,37 @@ }).call(this); (function() { + angular.module('Tasks').filter('reminderDetails', function() { + return function(reminder, scope) { + var ds, token, _i, _len, _ref; + if (!(angular.isUndefined(reminder) || reminder === null)) { + if (reminder.type === 'DATE-TIME' && moment(reminder.date, "YYYYMMDDTHHmmss").isValid()) { + return moment(reminder.date, "YYYYMMDDTHHmmss").lang('reminder').calendar(); + } else if (reminder.type === 'DURATION') { + ds = t('tasks_enhanced', 'Remind me'); + _ref = scope.durations; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + token = _ref[_i]; + if (reminder.duration[token.abbr]) { + ds += ' ' + reminder.duration[token.abbr] + ' ' + t('tasks_enhanced', token.name); + } + } + if (reminder.duration.invert) { + ds += ' ' + t('tasks_enhanced', 'before'); + } else { + ds += ' ' + t('tasks_enhanced', 'after'); + } + return ds; + } + } else { + return t('tasks_enhanced', 'Remind me'); + } + }; + }); + +}).call(this); + +(function() { angular.module('Tasks').filter('startDetails', function() { return function(due) { if (moment(due, "YYYYMMDDTHHmmss").isValid()) { @@ -2027,19 +2170,6 @@ }).call(this); (function() { - angular.module('Tasks').filter('timeDetails', function() { - return function(reminder) { - if (moment(reminder, "YYYYMMDDTHHmmss").isValid()) { - return moment(reminder, "YYYYMMDDTHHmmss").format('[' + t('tasks_enhanced', 'Remind me at') + '] HH:mm A'); - } else { - return t('tasks_enhanced', 'Remind me'); - } - }; - }); - -}).call(this); - -(function() { angular.module('Tasks').filter('timeTaskList', function() { return function(due) { if (moment(due, "YYYYMMDDTHHmmss").isValid()) { diff --git a/l10n/de.php b/l10n/de.php index 606a7acf..2e3439b7 100644 --- a/l10n/de.php +++ b/l10n/de.php @@ -7,24 +7,36 @@ "Done" => "Erledigt", "All" => "Alle", "Current" => "Aktuell", +"years" => "Jahre", +"months" => "Monate", +"weeks" => "Wochen", +"days" => "Tage", "Hours" => "Stunden", +"hours" => "Stunden", "Minutes" => "Minuten", +"minutes" => "Minuten", +"seconds" => "Sekunden", +"before" => "vorher", +"after" => "danach", "Week" => "Woche", "Add Task" => "Task hinzufügen", "Set due date" => "Fälligkeitsdatum auswählen", "Remind me" => "Erinnere mich", -"Remind me at" => "Erinnere mich um", +'[Remind me yesterday at ]HH:mm' => '[Erinnere mich gestern um ]HH:mm', +'[Remind me today at ]HH:mm' => '[Erinnere mich heute um ]HH:mm', +'[Remind me tomorrow at ]HH:mm' => '[Erinnere mich morgen um ]HH:mm', +'[Remind me on ]MMM DD, YYYY,[ at ]HH:mm' => '[Erinnere mich am ]MMM DD, YYYY,[ um ]HH:mm', "Add Subtask" => "Teilaufgabe hinzufügen", "Add List..." => "Liste hinzufügen...", "Due on" => "Fällig am", -"Due Yesterday" => "Zu erledigen Gestern", -"Due Today" => "Zu erledigen Heute", -"Due Tomorrow" => "Zu erledigen Morgen", +"Due yesterday" => "Zu erledigen gestern", +"Due today" => "Zu erledigen heute", +"Due tomorrow" => "Zu erledigen morgen", "Starts on" => "Beginnt am", "Started on" => "Begann am", -"Started Yesterday" => "Begann gestern", -"Starts Today" => "Beginnt heute", -"Starts Tomorrow" => "Beginnt morgen", +"Started yesterday" => "Begann gestern", +"Starts today" => "Beginnt heute", +"Starts tomorrow" => "Beginnt morgen", "Set start date" => "Beginn auswählen", "Yesterday" => "Gestern", "Tomorrow" => "Morgen", diff --git a/lib/controller/taskscontroller.php b/lib/controller/taskscontroller.php index f7b0481d..c4b6f1c0 100644 --- a/lib/controller/taskscontroller.php +++ b/lib/controller/taskscontroller.php @@ -343,35 +343,45 @@ class TasksController extends Controller { */ public function setReminderDate(){ $taskId = $this->params('taskID'); - $reminder = $this->params('reminder'); - $remindertype = $this->params('reminder_type'); + $type = $this->params('type'); + $action = $this->params('action'); + // $date = $this->params('date'); $response = new JSONResponse(); - try{ - $vcalendar = \OC_Calendar_App::getVCalendar($taskId); - $vtodo = $vcalendar->VTODO; - $valarm = $vtodo->VALARM; - if ($reminder != 'false'){ + + $types = array('DATE-TIME','DURATION'); + + $vcalendar = \OC_Calendar_App::getVCalendar($taskId); + $vtodo = $vcalendar->VTODO; + $valarm = $vtodo->VALARM; + + if ($type == false){ + unset($vtodo->VALARM); + \OC_Calendar_Object::edit($taskId, $vcalendar->serialize()); + } + elseif (in_array($type,$types)) { + try{ if($valarm == null) { - $valarm = new OC_VObject('VALARM'); - - $valarm->setString('ACTION', $remindertype); + $valarm = new \OC_VObject('VALARM'); + $valarm->setString('ACTION', $action); $valarm->setString('DESCRIPTION', 'Default Event Notification'); $valarm->setString(''); - - $vevent->add($valarm); + $vtodo->add($valarm); } else { unset($valarm->TRIGGER); } - - $valarm->addProperty('TRIGGER', $reminder, array('VALUE' => 'DURATION')); - - } else { - if($valarm != null) { - unset($vevent->VALARM); + $triggervalue = ''; + if ($type == 'DATE-TIME') { + $date = new \DateTime('@'.$this->params('date')); + $triggervalue = $date->format('Ymd\THis\Z'); + } elseif ($type == 'DURATION') { + // TODO + $triggervalue = '-PT5M'; } - } - } catch (\Exception $e) { + $valarm->addProperty('TRIGGER', $triggervalue, array('VALUE' => $type)); + \OC_Calendar_Object::edit($taskId, $vcalendar->serialize()); + } catch (\Exception $e) { + } } return $response; diff --git a/lib/helper.php b/lib/helper.php index ddc29f85..86165bf2 100644 --- a/lib/helper.php +++ b/lib/helper.php @@ -46,11 +46,11 @@ Class helper { $start->setTimezone(new \DateTimeZone($user_timezone)); $task['start'] = $start->format('Ymd\THis'); } catch(\Exception $e) { - $task['start'] = 'undefined'; + $task['start'] = null; \OCP\Util::writeLog('tasks_enhanced', $e->getMessage(), \OCP\Util::ERROR); } } else { - $task['start'] = 'undefined'; + $task['start'] = null; } $due = $vtodo->DUE; if ($due) { @@ -59,11 +59,11 @@ Class helper { $due->setTimezone(new \DateTimeZone($user_timezone)); $task['due'] = $due->format('Ymd\THis'); } catch(\Exception $e) { - $task['due'] = 'undefined'; + $task['due'] = null; \OCP\Util::writeLog('tasks_enhanced', $e->getMessage(), \OCP\Util::ERROR); } } else { - $task['due'] = 'undefined'; + $task['due'] = null; } $reminder = $vtodo->VALARM; if($reminder) { @@ -72,17 +72,19 @@ Class helper { $reminderType = $reminder->TRIGGER['VALUE']->value; $reminderTrigger = $reminder->TRIGGER->value; $reminderAction = $reminder->ACTION->value; + $parsed1 = null; if($reminderType == 'DATE-TIME'){ $reminderDate = $reminder->TRIGGER->getDateTime(); $reminderDate->setTimezone(new \DateTimeZone($user_timezone)); $reminderDate = $reminderDate->format('Ymd\THis'); } elseif ($reminderType == 'DURATION' && $start) { + $parsed_complete = VObject\DateTimeParser::parseDuration($reminder->TRIGGER); $parsed = VObject\DateTimeParser::parseDuration($reminder->TRIGGER,true); // Calculate the reminder date from duration and start date $reminderDate = $start->modify($parsed)->format('Ymd\THis'); } else { - $reminderDate = 'undefined'; + $reminderDate = null; } @@ -90,15 +92,16 @@ Class helper { 'type' => $reminderType, 'trigger' => $reminderTrigger, 'action' => $reminderAction, - 'date' => $reminderDate + 'date' => $reminderDate, + 'duration' => $parsed_complete ); } catch(\Exception $e) { - $task['reminder'] = 'undefined'; + $task['reminder'] = null; \OCP\Util::writeLog('tasks_enhanced', $e->getMessage(), \OCP\Util::ERROR); } } else { - $task['reminder'] = 'undefined'; + $task['reminder'] = null; } $starred = $vtodo->getAsString('PRIORITY'); if($starred){ diff --git a/templates/part.details.php b/templates/part.details.php index e1f73c69..08f1d642 100644 --- a/templates/part.details.php +++ b/templates/part.details.php @@ -50,15 +50,22 @@ <!-- oc-click-focus="{selector: 'div.detail-reminder input.datepicker-input', timeout: 0}" --> <span class="icon detail-reminder" ng-class="{'overdue':isOverDue(task.reminder.date)}"></span> <div class="section-title" ng-class="{'overdue':isOverDue(task.reminder.date)}" ng-hide="route.parameter=='reminder'"> - <text rel="">{{ task.reminder.date | timeDetails }}</text> + <text rel="">{{ task.reminder | reminderDetails:this }}</text> </div> - <div class="section-description" ng-hide="route.parameter=='reminder'">{{ task.reminder.date | dateDetailsShort }}</div> + <!-- <div class="section-description" ng-hide="route.parameter=='reminder'">{{ task.reminder.date | dateDetailsShort }}</div> --> <a class="detail-delete" ng-click="deleteReminder()" stop-event="click"> <span class="icon detail-delete"></span> </a> <span class="icon detail-save" ng-click="endEdit()" stop-event="click"></span> - <div class="section-edit" ng-show="route.parameter=='reminder'"> - <input class="datepicker-input medium focus" type="text" key-value="" value="{{ task.reminder.date | dateTaskList }}" datepicker="reminder"> + <div class="section-edit" ng-show="route.parameter=='reminder'" ng-switch='reminderType(task)'> + <div ng-switch-when="DATE-TIME"> + <input class="datepicker-input medium focus" type="text" key-value="" placeholder="dd.mm.yyyy" value="{{ task.reminder.date | dateTaskList }}" datepicker="reminder"> + <input class="timepicker-input medium focus" type="text" key-value="" placeholder="hh:mm" value="{{ task.reminder.date | timeTaskList }}" timepicker="reminder" stop-event="click"> + </div> + <div ng-switch-when="DURATION"> + <input class="datepicker-input medium focus" type="text" key-value="" placeholder="" value=""> + <select ng-model="duration" ng-options="duration.name for duration in durations"></select> + </div> </div> </div> <!-- <ul class="subtasks buffer"></ul> --> |