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 @@
-
-
+
@@ -123,7 +122,7 @@ export default {
id: { required }
},
duration: { required },
- employee_id: { required }
+ employee: { required }
}
}
},
@@ -227,6 +226,10 @@ export default {
this.subtask.files = files
},
+ onEmployeeSelected({ key }) {
+ this.subtask.employee_id = key
+ },
+
_enrichTask(subtask) {
subtask.master_task = this.mastertasks.find((mastertask) => mastertask.id == subtask.master_task_id)
subtask.employee = this.enrichedEmployees.find((employee) => employee.id == subtask.employee_id)
@@ -257,10 +260,6 @@ export default {
editMode() {
this.$nextTick(() => {
this.$refs["description"]?.setHTML(this.subtask.description || "")
-
- const employeeSelect = this.$refs['employee-select']?.$el?.querySelector('.v-select__selection-text')
- if (employeeSelect)
- employeeSelect.innerHTML = this.subtask?.employee?._fullName || ''
})
}
}
diff --git a/app/src/plugins/tm@profile/profile/my-profile.vue b/app/src/plugins/tm@profile/profile/my-profile.vue
index 16659eb..d04e7dc 100644
--- a/app/src/plugins/tm@profile/profile/my-profile.vue
+++ b/app/src/plugins/tm@profile/profile/my-profile.vue
@@ -50,10 +50,13 @@ export default {
async updateUserInfo() {
if (!(await this.v$.$validate())) return
+ const [sHours, sMinutes] = this.form.work_start.split(':');
+ const [eHours, eMinutes] = this.form.work_end.split(':');
+
const data = {
id: this.user.id,
- work_start: parseInt(this.form.work_start.split(':')[0]),
- work_end: parseInt(this.form.work_end.split(':')[0])
+ work_start: parseFloat(sHours) * 60 + parseFloat(sMinutes),
+ work_end: parseFloat(eHours) * 60 + parseFloat(eMinutes)
}
try {
@@ -66,9 +69,18 @@ export default {
_setDates() {
this.form = {
- work_start: this.user.work_start < 10 ? `0${this.user.work_start}:00` : `${this.user.work_start}:00`,
- work_end: this.user.work_end < 10 ? `0${this.user.work_end}:00` : `${this.user.work_end}:00`
+ work_start: this.minutesToTime(this.user.work_start),
+ work_end: this.minutesToTime(this.user.work_end)
}
+ },
+
+ minutesToTime(minutes) {
+ var hours = Math.floor(minutes / 60)
+ var mins = minutes % 60
+ hours = (hours < 10 ? '0' : '') + hours
+ mins = (mins < 10 ? '0' : '') + mins
+
+ return hours + ':' + mins
}
},