diff --git a/app/src/plugins/tm@dashboard/_components/z-timeline.vue b/app/src/plugins/tm@dashboard/_components/z-timeline.vue index 3d86b06..63b79fd 100644 --- a/app/src/plugins/tm@dashboard/_components/z-timeline.vue +++ b/app/src/plugins/tm@dashboard/_components/z-timeline.vue @@ -79,7 +79,7 @@
{{ event.initials }}
- {{ event.date.toLocaleDateString('sk-SK') }} + {{ event.date?.toLocaleDateString('sk-SK') }} diff --git a/app/src/plugins/tm@dashboard/tasks/_utils/timeline.utils.ts b/app/src/plugins/tm@dashboard/tasks/_utils/timeline.utils.ts index 1a31d8a..0fe3275 100644 --- a/app/src/plugins/tm@dashboard/tasks/_utils/timeline.utils.ts +++ b/app/src/plugins/tm@dashboard/tasks/_utils/timeline.utils.ts @@ -99,11 +99,13 @@ export default { generateTimelineNonWorkingHours(date, employee) { const events = [] + const { start: dayStart, end: dayEnd } = this._getDayStartEnd(date) + for (let i = 0; i < 7; i++) { events.push({ title: "Non working hours", - start: setMinutes(setHours(date, 0), 0), - end: setMinutes(setHours(date, employee.work_start), 0), + start: dayStart, + end: this._setMinutesToDate(employee.work_start, date), type: 'non-working-hours', split: i + 1, draggable: false @@ -111,14 +113,16 @@ export default { events.push({ title: "Non working hours", - start: setMinutes(setHours(date, employee.work_end), 0), - end: setMinutes(setHours(date, 23), 59), + start: this._setMinutesToDate(employee.work_end, date), + end: dayEnd, type: 'non-working-hours', split: i + 1, draggable: false }) } + console.log(events) + return events }, @@ -130,5 +134,18 @@ export default { let diff =(date1.getTime() - date2.getTime()) / 1000; diff /= (60 * 60) return Math.abs(Math.round(diff)) + }, + + _getDayStartEnd(date) { + return { + start: this._setMinutesToDate(0, date), + end: this._setMinutesToDate(1439, date) + } + }, + + _setMinutesToDate(minutes, date) { + const newDate = new Date(date) + newDate.setHours(Math.floor(minutes / 60), minutes % 60, 0, 0) + return newDate } } \ No newline at end of file diff --git a/app/src/plugins/tm@dashboard/tasks/tasks.vue b/app/src/plugins/tm@dashboard/tasks/tasks.vue index a3a43f1..fd5e668 100644 --- a/app/src/plugins/tm@dashboard/tasks/tasks.vue +++ b/app/src/plugins/tm@dashboard/tasks/tasks.vue @@ -88,11 +88,11 @@ export default { this.onFilterChanged(this.filter) }) - this.$events.on('on-blocker-edited', () => { + this.$events.on('on-subtask-deleted', () => { this.onFilterChanged(this.filter) }) - this.$events.on('on-subtask-deleted', () => { + this.$events.on('on-blocker-edited', () => { this.onFilterChanged(this.filter) }) @@ -104,6 +104,8 @@ export default { unmounted() { this.$events.off('on-subtask-edited') this.$events.off('on-subtask-deleted') + this.$events.off('on-blocker-edited') + this.$events.off('on-blocker-deleted') }, methods: { diff --git a/app/src/plugins/tm@dashboard/teams/_mixins/TeamsCalendar.mixin.ts b/app/src/plugins/tm@dashboard/teams/_mixins/TeamsCalendar.mixin.ts new file mode 100644 index 0000000..f63d6d6 --- /dev/null +++ b/app/src/plugins/tm@dashboard/teams/_mixins/TeamsCalendar.mixin.ts @@ -0,0 +1,162 @@ +import { setHours, setMinutes } from 'date-fns' +import moment from 'moment' +import timelineUtils from '@/plugins/tm@dashboard/tasks/_utils/timeline.utils' + + +export default { + computed: { + calendarData() { + if (!this.subtasks || !this.blockers) + return + + return { + unscheduledTime: 333, + tasks: [...this._generateNonWorking(), ...this._generateTasks(), ...this._generateBlockers()] + } + }, + + splitDays() { + const days = [] + + this.filter.team.employees.forEach((employee, index) => { + let workingHours = 0 + + this.calendarData.tasks.forEach(task => { + if (task?.subtask?.employee_id == employee.id) + workingHours += timelineUtils._getDifferenceInHours(task.end, task.start) + }) + + days.push({ + id: index + 1, + name: employee.name, + fullname: `${employee.name} ${employee.surname}`, + initials: employee.name.charAt(0).toUpperCase() + employee.surname.charAt(0).toUpperCase(), + unscheduledTime: workingHours + }) + }) + + return days + }, + }, + + methods: { + _generateNonWorking() { + const nonWorkingHours = [] + const date = new Date(this.filter.start) + let earliestStartHour = null + this.calendarConfig.date = date + + const { start: dayStart, end: dayEnd } = this._getDayStartEnd() + + this.filter.team.employees.forEach((employee, index) => { + if (!earliestStartHour || employee.work_start < earliestStartHour) + earliestStartHour = employee.work_start + + + nonWorkingHours.push({ + title: "Non working hours", + start: dayStart, + end: this._setMinutesToDate(employee.work_start), + split: index + 1, + type: 'non-working-hours', + draggable: false + }) + + nonWorkingHours.push({ + title: "Non working hours", + start: this._setMinutesToDate(employee.work_end), + end: dayEnd, + split: index + 1, + type: 'non-working-hours', + draggable: false + }) + }) + + this.calendarConfig.scrollHour = earliestStartHour - 1 + return nonWorkingHours + }, + + _generateTasks() { + const tasks = [] + const calendarDate = moment(this.filter.start).format('DD-MM-YYYY') + + this.subtasks.forEach(subtask => { + let split = null + let employee = null + + this.filter.team.employees.forEach((e, index) => { + if (e.id == subtask.employee_id) { + split = index + 1 + employee = e + } + }) + + subtask.timeblocks.forEach(timeblock => { + const formattedDate = moment(timeblock.start).format('DD-MM-YYYY') + + if (formattedDate == calendarDate) { + tasks.push({ + id: subtask.id, + start: new Date(timeblock.start), + end: new Date(timeblock.end), + master_task: subtask.master_task, + name: employee?.name, + surname: employee?.surname, + // date: new Date(timeblock.start), + isWeekend: moment(timeblock.start).day() % 6 == 0, + initials: employee?.name?.charAt(0)?.toUpperCase() + employee?.surname?.charAt(0)?.toUpperCase(), + split: split, + project_code: subtask.project_code, + subtask: subtask, + _timeblock_id: timeblock.id + }) + } + }) + }) + + return tasks + }, + + _generateBlockers() { + const blockers = [] + + this.blockers.forEach(blocker => { + let split = null + let employee = null + + this.filter.team.employees.forEach((e, index) => { + if (e.id == blocker.employee?.id) { + split = index + 1 + employee = e + } + }) + + blockers.push({ + blocker, + split, + start: new Date(blocker.start), + end: new Date(blocker.end), + type: 'blocker', + initials: `${employee?.name[0]}${employee?.surname[0]}`, + color: '#B00020', + draggable: false, + isWeekend: moment(blocker.start).day() % 6 == 0, + }) + }) + + return blockers + }, + + _getDayStartEnd() { + return { + start: this._setMinutesToDate(0), + end: this._setMinutesToDate(1439) + } + }, + + _setMinutesToDate(minutes, date = new Date(this.filter.start)) { + date.setHours(Math.floor(minutes / 60), minutes % 60, 0, 0) + return date + } + } +} \ No newline at end of file diff --git a/app/src/plugins/tm@dashboard/teams/teams.vue b/app/src/plugins/tm@dashboard/teams/teams.vue index 1066695..7600eaa 100644 --- a/app/src/plugins/tm@dashboard/teams/teams.vue +++ b/app/src/plugins/tm@dashboard/teams/teams.vue @@ -1,20 +1,20 @@ \ No newline at end of file + diff --git a/app/src/plugins/tm@modal/task/z-task-modal.vue b/app/src/plugins/tm@modal/task/z-task-modal.vue index 095e444..6ffdd6c 100644 --- a/app/src/plugins/tm@modal/task/z-task-modal.vue +++ b/app/src/plugins/tm@modal/task/z-task-modal.vue @@ -12,8 +12,7 @@ - - +