Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Return a moment for dates from tasks model #713

Merged
merged 1 commit into from
Nov 14, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
10 changes: 5 additions & 5 deletions src/components/Task.vue
Original file line number Diff line number Diff line change
Expand Up @@ -76,8 +76,8 @@ License along with this library. If not, see <http://www.gnu.org/licenses/>.
<span :style="{'background-color': task.calendar.color}" class="calendar-indicator" />
<span class="calendar-name">{{ task.calendar.displayName }}</span>
</div>
<div v-if="task.due" :class="{overdue: overdue(task.due)}" class="duedate">
{{ task.due | formatDate }}
<div v-if="task.due" :class="{overdue: overdue(task.dueMoment)}" class="duedate">
{{ task.dueMoment | formatDate }}
</div>
<div v-if="task.pinned">
<span class="icon icon-bw icon-pinned" />
Expand Down Expand Up @@ -141,7 +141,7 @@ License along with this library. If not, see <http://www.gnu.org/licenses/>.
</template>

<script>
import { overdue, valid, sort, searchSubTasks, isTaskInList } from '../store/storeHelper'
import { overdue, sort, searchSubTasks, isTaskInList } from '../store/storeHelper'
import ClickOutside from 'vue-click-outside'
import { mapGetters, mapActions } from 'vuex'
import focus from '../directives/focus'
Expand All @@ -162,8 +162,8 @@ export default {
},
filters: {
formatDate: function(date) {
return valid(date)
? moment(date, 'YYYYMMDDTHHmmss').calendar(null, {
return date.isValid()
? date.calendar(null, {
lastDay: OCA.Tasks.$t('tasks', '[Yesterday]'),
sameDay: OCA.Tasks.$t('tasks', '[Today]'),
nextDay: OCA.Tasks.$t('tasks', '[Tomorrow]'),
Expand Down
39 changes: 17 additions & 22 deletions src/components/TheDetails.vue
Original file line number Diff line number Diff line change
Expand Up @@ -70,13 +70,13 @@ License along with this library. If not, see <http://www.gnu.org/licenses/>.
</div>
<div class="body">
<ul class="sections">
<li v-show="!task.calendar.readOnly || task.start" :class="{'date': valid(task.start), 'editing': edit=='start', 'high': overdue(task.start)}"
<li v-show="!task.calendar.readOnly || task.start" :class="{'date': task.startMoment.isValid(), 'editing': edit=='start', 'high': overdue(task.startMoment)}"
class="section detail-start"
>
<div v-click-outside="() => finishEditing('start')"
@click="editProperty('start', $event)"
>
<span :class="[dateIcon(task.start)]"
<span :class="[dateIcon(task.startMoment)]"
class="icon"
/>
<span class="section-title">
Expand Down Expand Up @@ -104,13 +104,13 @@ License along with this library. If not, see <http://www.gnu.org/licenses/>.
</a>
</div>
</li>
<li v-show="!task.calendar.readOnly || task.due" :class="{'date': valid(task.due), 'editing': edit=='due', 'high': overdue(task.due)}"
<li v-show="!task.calendar.readOnly || task.due" :class="{'date': task.dueMoment.isValid(), 'editing': edit=='due', 'high': overdue(task.dueMoment)}"
class="section detail-date"
>
<div v-click-outside="() => finishEditing('due')"
@click="editProperty('due', $event)"
>
<span :class="[dateIcon(task.due)]"
<span :class="[dateIcon(task.dueMoment)]"
class="icon"
/>
<span class="section-title">
Expand Down Expand Up @@ -373,7 +373,7 @@ License along with this library. If not, see <http://www.gnu.org/licenses/>.

<script>
import { mapGetters, mapActions } from 'vuex'
import { valid, overdue } from '../store/storeHelper'
import { overdue } from '../store/storeHelper'
import { DatetimePicker, Multiselect } from 'nextcloud-vue'
import Markdown from './Markdown'
import TaskStatusDisplay from './TaskStatusDisplay'
Expand All @@ -394,7 +394,7 @@ export default {
},
filters: {
formatStartDate: function(date) {
if (valid(date)) {
if (moment(date, 'YYYYMMDDTHHmmss').isValid()) {
if (date.isDate) {
return moment(date, 'YYYYMMDDTHHmmss').calendar(null, {
// TRANSLATORS This is a string for moment.js. The square brackets escape the string from moment.js. Please translate the string and keep the brackets.
Expand Down Expand Up @@ -452,7 +452,7 @@ export default {
}
},
formatDueDate: function(date) {
if (valid(date)) {
if (moment(date, 'YYYYMMDDTHHmmss').isValid()) {
if (date.isDate) {
return moment(date, 'YYYYMMDDTHHmmss').calendar(null, {
// TRANSLATORS This is a string for moment.js. The square brackets escape the string from moment.js. Please translate the string and keep the brackets.
Expand Down Expand Up @@ -564,9 +564,9 @@ export default {
},
computed: {
taskInfo: function() {
return this.$t('tasks', 'Last modified {date}', { date: moment(this.task.modified, 'YYYY-MM-DDTHH:mm:ss').calendar() })
+ '<br />' + this.$t('tasks', 'Created {date}', { date: moment(this.task.created, 'YYYY-MM-DDTHH:mm:ss').calendar() })
+ (this.task.completed ? ('<br />' + this.$t('tasks', 'Completed {date}', { date: moment(this.task.completedDate, 'YYYY-MM-DDTHH:mm:ss').calendar() })) : '')
return this.$t('tasks', 'Last modified {date}', { date: this.task.modifiedMoment.calendar() })
+ '<br />' + this.$t('tasks', 'Created {date}', { date: this.task.createdMoment.calendar() })
+ (this.task.completed ? ('<br />' + this.$t('tasks', 'Completed {date}', { date: this.task.completedDateMoment.calendar() })) : '')
},
isAllDayPossible: function() {
return !this.task.calendar.readOnly && (this.task.due || this.task.start)
Expand Down Expand Up @@ -711,7 +711,7 @@ export default {
},

dateIcon: function(date) {
if (valid(date)) {
if (date.isValid()) {
var c = 'icon-color icon-calendar-due'
if (overdue(date)) {
c += ' icon-calendar-overdue'
Expand All @@ -727,11 +727,6 @@ export default {
*/
overdue: overdue,

/**
* Checks if a date is valid
*/
valid: valid,

editProperty: function(type, event) {
// don't start to edit the property again
// if the confirm button of the datepicker was clicked
Expand All @@ -749,11 +744,11 @@ export default {
// If we edit the due or the start date, inintialize it.
if (type === 'due') {
this.tmpTask.due = this.initDueDate()
this.tmpTask.start = moment(this.task.start, 'YYYY-MM-DDTHH:mm:ss')
this.tmpTask.start = this.task.startMoment
}
if (type === 'start') {
this.tmpTask.start = this.initStartDate()
this.tmpTask.due = moment(this.task.due, 'YYYY-MM-DDTHH:mm:ss')
this.tmpTask.due = this.task.dueMoment
}
}
if (type === 'summary' || type === 'note') {
Expand Down Expand Up @@ -804,9 +799,9 @@ export default {
* @returns {Moment} The start date moment
*/
initStartDate: function() {
var start = moment(this.task.start, 'YYYY-MM-DDTHH:mm:ss')
var start = this.task.startMoment
if (!start.isValid()) {
var due = moment(this.task.due, 'YYYY-MM-DDTHH:mm:ss')
var due = this.task.dueMoment
var reference = moment().add(1, 'h')
if (due.isBefore(reference)) {
reference = due.subtract(1, 'm')
Expand All @@ -823,9 +818,9 @@ export default {
* @returns {Moment} The due date moment
*/
initDueDate: function() {
var due = moment(this.task.due, 'YYYY-MM-DDTHH:mm:ss')
var due = this.task.dueMoment
if (!due.isValid()) {
var start = moment(this.task.start, 'YYYY-MM-DDTHH:mm:ss')
var start = this.task.startMoment
var reference = start.isAfter() ? start : moment()
if (this.task.allDay) {
reference.startOf('day').add(1, 'd')
Expand Down
30 changes: 30 additions & 0 deletions src/models/task.js
Original file line number Diff line number Diff line change
Expand Up @@ -87,13 +87,16 @@ export default class Task {
var comp = this.vtodo.getFirstPropertyValue('completed')
this._completed = !!comp
this._completedDate = comp ? comp.toJSDate() : null
this._completedDateMoment = moment(this._completedDate, 'YYYYMMDDTHHmmss')
this._status = this.vtodo.getFirstPropertyValue('status')
this._note = this.vtodo.getFirstPropertyValue('description') || ''
this._related = this.vtodo.getFirstPropertyValue('related-to') || null
this._hideSubtaks = +this.vtodo.getFirstPropertyValue('x-oc-hidesubtasks') || 0
this._hideCompletedSubtaks = +this.vtodo.getFirstPropertyValue('x-oc-hidecompletedsubtasks') || 0
this._start = this.vtodo.getFirstPropertyValue('dtstart')
this._startMoment = moment(this._start, 'YYYYMMDDTHHmmss')
this._due = this.vtodo.getFirstPropertyValue('due')
this._dueMoment = moment(this._due, 'YYYYMMDDTHHmmss')
var start = this.vtodo.getFirstPropertyValue('dtstart')
var due = this.vtodo.getFirstPropertyValue('due')
var d = due || start
Expand All @@ -102,7 +105,9 @@ export default class Task {
var categories = this.vtodo.getFirstProperty('categories')
this._categories = categories ? categories.getValues() : []
this._modified = this.vtodo.getFirstPropertyValue('last-modified')
this._modifiedMoment = moment(this._modified, 'YYYYMMDDTHHmmss')
this._created = this.vtodo.getFirstPropertyValue('created')
this._createdMoment = moment(this._created, 'YYYYMMDDTHHmmss')
this._class = this.vtodo.getFirstPropertyValue('class') || 'PUBLIC'
this._pinned = this.vtodo.getFirstPropertyValue('x-pinned') === 'true'

Expand Down Expand Up @@ -290,12 +295,17 @@ export default class Task {
var comp = this.vtodo.getFirstPropertyValue('completed')
this._completed = !!comp
this._completedDate = comp ? comp.toJSDate() : null
this._completedDateMoment = moment(this._completedDate, 'YYYYMMDDTHHmmss')
}

get completedDate() {
return this._completedDate
}

get completedDateMoment() {
return this._completedDateMoment.clone()
}

get status() {
return this._status
}
Expand Down Expand Up @@ -394,6 +404,11 @@ export default class Task {
}
this.updateLastModified()
this._start = this.vtodo.getFirstPropertyValue('dtstart')
this._startMoment = moment(this._start, 'YYYYMMDDTHHmmss')
}

get startMoment() {
return this._startMoment.clone()
}

get due() {
Expand All @@ -408,6 +423,11 @@ export default class Task {
}
this.updateLastModified()
this._due = this.vtodo.getFirstPropertyValue('due')
this._dueMoment = moment(this._due, 'YYYYMMDDTHHmmss')
}

get dueMoment() {
return this._dueMoment.clone()
}

get allDay() {
Expand Down Expand Up @@ -487,20 +507,30 @@ export default class Task {
this.vtodo.updatePropertyWithValue('last-modified', now)
this.vtodo.updatePropertyWithValue('dtstamp', now)
this._modified = now
this._modifiedMoment = moment(this._modified, 'YYYYMMDDTHHmmss')
}

get modified() {
return this._modified
}

get modifiedMoment() {
return this._modifiedMoment.clone()
}

get created() {
return this._created
}

get createdMoment() {
return this._createdMoment.clone()
}

set created(createdDate) {
this.vtodo.updatePropertyWithValue('created', createdDate)
this.updateLastModified()
this._created = this.vtodo.getFirstPropertyValue('created')
this._createdMoment = moment(this._created, 'YYYYMMDDTHHmmss')
}

get class() {
Expand Down
38 changes: 13 additions & 25 deletions src/store/storeHelper.js
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ function isTaskPriority(task) {
* @returns {Boolean}
*/
function isTaskCurrent(task) {
return !valid(task.start) || moment(task.start, 'YYYYMMDDTHHmmss').diff(moment(), 'days', true) < 0 || moment(task.due, 'YYYYMMDDTHHmmss').diff(moment(), 'days', true) < 0
return !task.startMoment.isValid() || task.startMoment.diff(moment(), 'days', true) < 0 || task.dueMoment.diff(moment(), 'days', true) < 0
}

/**
Expand All @@ -107,17 +107,17 @@ function isTaskCurrent(task) {
* @returns {Boolean}
*/
function isTaskToday(task) {
return (today(task.start) || today(task.due))
return (today(task.startMoment) || today(task.dueMoment))
}

/**
* Checks if a date is today
*
* @param {String} date The date
* @param {Moment} date The date as moment
* @returns {Boolean}
*/
function today(date) {
return valid(date) && moment(date, 'YYYYMMDDTHHmmss').diff(moment().startOf('day'), 'days', true) < 1
return date.isValid() && date.diff(moment().startOf('day'), 'days', true) < 1
}

/**
Expand All @@ -127,17 +127,17 @@ function today(date) {
* @returns {Boolean}
*/
function isTaskWeek(task) {
return (week(task.start) || week(task.due))
return (week(task.startMoment) || week(task.dueMoment))
}

/**
* Checks if a date lies within the next week
*
* @param {String} date The date
* @param {Moment} date The date as moment
* @returns {Boolean}
*/
function week(date) {
return valid(date) && moment(date, 'YYYYMMDDTHHmmss').diff(moment().startOf('day'), 'days', true) < 7
return date.isValid() && date.diff(moment().startOf('day'), 'days', true) < 7
}

/**
Expand All @@ -155,8 +155,8 @@ function isTaskDay(task, day) {

function dayOfTask(task) {
var diff, startdiff, duediff
var start = moment(task.start, 'YYYYMMDDTHHmmss').startOf('day')
var due = moment(task.due, 'YYYYMMDDTHHmmss').startOf('day')
var start = task.startMoment.startOf('day')
var due = task.dueMoment.startOf('day')

// Add all tasks whose start date will be reached at that day.
if (start.isValid() && !due.isValid()) {
Expand All @@ -180,24 +180,14 @@ function dayOfTask(task) {
return diff
}

/**
* Checks if a date is valid
*
* @param {String} date The date
* @returns {Boolean}
*/
function valid(date) {
return moment(date, 'YYYYMMDDTHHmmss').isValid()
}

/**
* Checks if a date is overdue
*
* @param {String} due The due date
* @param {Moment} date The date
* @returns {Boolean}
*/
function overdue(due) {
return valid(due) && moment(due, 'YYYYMMDDTHHmmss').diff(moment()) < 0
function overdue(date) {
return date.isValid() && date.diff(moment()) < 0
}

/**
Expand Down Expand Up @@ -396,8 +386,7 @@ function sortByDate(taskA, taskB, date) {
if (taskA[date] === null && taskB[date] === null) {
return 0
}

return moment(taskA[date], 'YYYYMMDDTHHmmss').diff(moment(taskB[date], 'YYYYMMDDTHHmmss'))
return taskA[date + 'Moment'].diff(taskB[date + 'Moment'])
}

/**
Expand Down Expand Up @@ -433,7 +422,6 @@ function searchSubTasks(task, searchQuery) {

export {
isTaskInList,
valid,
overdue,
isParentInList,
sort,
Expand Down