From 73925f731b724b22f5e447179318cd7ca5a7fd10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Glasn=C3=A1k?= Date: Mon, 7 Jul 2025 08:16:13 +0200 Subject: [PATCH] build(dev) fixed office 365 tasks on teams overview --- app/dist/js/src_plugins_tm_dashboard_teams_teams_vue.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/dist/js/src_plugins_tm_dashboard_teams_teams_vue.js b/app/dist/js/src_plugins_tm_dashboard_teams_teams_vue.js index 1803781..232d622 100644 --- a/app/dist/js/src_plugins_tm_dashboard_teams_teams_vue.js +++ b/app/dist/js/src_plugins_tm_dashboard_teams_teams_vue.js @@ -15,7 +15,7 @@ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.push.js */ \"./node_modules/core-js/modules/es.array.push.js\");\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! moment */ \"./node_modules/moment/moment.js\");\n/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(moment__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _plugins_tm_dashboard_tasks_utils_timeline_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @/plugins/tm@dashboard/tasks/_utils/timeline.utils */ \"./src/plugins/tm@dashboard/tasks/_utils/timeline.utils.ts\");\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n computed: {\n calendarData() {\n if (!this.subtasks || !this.blockers) return;\n const blockers = this._generateBlockers();\n return {\n tasks: [...this._generateNonWorking(), ...this._generateTasks(), ...blockers.filter(blocker => blocker.type != 'home_office')],\n homeoffices: [...blockers.filter(blocker => blocker.type == 'home_office')]\n };\n },\n splitDays() {\n const days = [];\n const homeoffice = {};\n const now = moment__WEBPACK_IMPORTED_MODULE_1___default()();\n this.filter.team.employees.forEach((employee, index) => {\n const selectedDate = moment__WEBPACK_IMPORTED_MODULE_1___default()(this.filter.start);\n const capacityMinutes = this._getRemainingWorkCapacityMinutes(employee);\n let scheduledCapacityMinutes = 0;\n let totalScheduledTime = 0;\n this.calendarData.tasks.forEach(task => {\n if (task.subtask?.employee_id != employee.id && task.blocker?.employee?.id != employee.id) return;\n if (task.type == 'non-working-hours' || task.subtask?.is_finished || task.blocker?.is_finished || task.isBlocker) return;\n if (selectedDate.isBefore(moment__WEBPACK_IMPORTED_MODULE_1___default()(), 'days')) {\n totalScheduledTime += _plugins_tm_dashboard_tasks_utils_timeline_utils__WEBPACK_IMPORTED_MODULE_2__[\"default\"]._getDifferenceInMinutes(task._real_end, task._real_start);\n // Past\n return;\n } else if (selectedDate.isSame(moment__WEBPACK_IMPORTED_MODULE_1___default()(), 'days')) {\n totalScheduledTime += _plugins_tm_dashboard_tasks_utils_timeline_utils__WEBPACK_IMPORTED_MODULE_2__[\"default\"]._getDifferenceInMinutes(task._real_end, task._real_start);\n // Today\n const isTaskCurrentlyInProgress = moment__WEBPACK_IMPORTED_MODULE_1___default()(task._real_start).isBefore(moment__WEBPACK_IMPORTED_MODULE_1___default()(), 'minutes') && moment__WEBPACK_IMPORTED_MODULE_1___default()(task._real_end).isAfter(moment__WEBPACK_IMPORTED_MODULE_1___default()(), 'minutes');\n const isTaskInFuture = moment__WEBPACK_IMPORTED_MODULE_1___default()(task._real_start).isAfter(moment__WEBPACK_IMPORTED_MODULE_1___default()(), 'minutes');\n const isTaskDuringWorkHours = moment__WEBPACK_IMPORTED_MODULE_1___default()(task._real_start).hour() >= employee.work_start && moment__WEBPACK_IMPORTED_MODULE_1___default()(task._real_start).hour() <= employee.work_end;\n if (isTaskDuringWorkHours) {\n if (isTaskCurrentlyInProgress) {\n scheduledCapacityMinutes += _plugins_tm_dashboard_tasks_utils_timeline_utils__WEBPACK_IMPORTED_MODULE_2__[\"default\"]._getDifferenceInMinutes(new Date(), task._real_end);\n } else if (isTaskInFuture) {\n scheduledCapacityMinutes += _plugins_tm_dashboard_tasks_utils_timeline_utils__WEBPACK_IMPORTED_MODULE_2__[\"default\"]._getDifferenceInMinutes(task._real_end, task._real_start);\n }\n }\n } else {\n // Future\n const isTaskDuringWorkHours = moment__WEBPACK_IMPORTED_MODULE_1___default()(task._real_start).hour() >= employee.work_start && moment__WEBPACK_IMPORTED_MODULE_1___default()(task._real_start).hour() <= employee.work_end;\n if (isTaskDuringWorkHours) {\n scheduledCapacityMinutes += _plugins_tm_dashboard_tasks_utils_timeline_utils__WEBPACK_IMPORTED_MODULE_2__[\"default\"]._getDifferenceInMinutes(task._real_end, task._real_start);\n }\n totalScheduledTime += _plugins_tm_dashboard_tasks_utils_timeline_utils__WEBPACK_IMPORTED_MODULE_2__[\"default\"]._getDifferenceInMinutes(task._real_end, task._real_start);\n }\n });\n this.calendarData.homeoffices.forEach(task => {\n if (task.blocker.employee?.id != employee.id) return;\n homeoffice[task.split] = true;\n });\n const unscheduledTime = capacityMinutes - scheduledCapacityMinutes;\n days.push({\n id: index + 1,\n name: employee.name,\n surname: employee.surname,\n employee_id: employee.id,\n date: this.filter.start,\n fullname: `${employee.name} ${employee.surname}`,\n initials: employee.name.charAt(0).toUpperCase() + employee.surname.charAt(0).toUpperCase(),\n unscheduledTime: unscheduledTime > 0 ? (unscheduledTime / 60).toFixed(1) : 0,\n scheduledTime: totalScheduledTime > 0 ? (totalScheduledTime / 60).toFixed(1) : 0,\n isHomeoffice: homeoffice[index + 1] ? true : false\n });\n });\n return days;\n }\n },\n methods: {\n _generateNonWorking() {\n const nonWorkingHours = [];\n const date = new Date(this.filter.start);\n let earliestHour = null;\n this.calendarConfig.date = date;\n const {\n start: dayStart,\n end: dayEnd\n } = this._getDayStartEnd();\n this.filter.team.employees.forEach((employee, index) => {\n if (!earliestHour || employee.work_start < earliestHour) earliestHour = employee.work_start;\n nonWorkingHours.push({\n title: \"Non working hours\",\n start: dayStart,\n end: this._setMinutesToDate((employee.work_start + 0.1) * 60),\n split: index + 1,\n type: 'non-working-hours',\n draggable: false\n });\n nonWorkingHours.push({\n title: \"Non working hours\",\n start: this._setMinutesToDate((employee.work_end + 0.1) * 60),\n end: dayEnd,\n split: index + 1,\n type: 'non-working-hours',\n draggable: false\n });\n });\n this.calendarConfig.scrollHour = earliestHour - 1;\n return nonWorkingHours;\n },\n _generateTasks() {\n const tasks = [];\n const calendarDate = moment__WEBPACK_IMPORTED_MODULE_1___default()(this.filter.start).format('DD-MM-YYYY');\n this.subtasks.forEach(subtask => {\n let split = null;\n let employee = null;\n this.filter.team.employees.forEach((e, index) => {\n if (e.id == subtask.employee_id) {\n split = index + 1;\n employee = e;\n }\n });\n subtask.timeblocks.forEach(timeblock => {\n const formattedDate = moment__WEBPACK_IMPORTED_MODULE_1___default()(timeblock.start).format('DD-MM-YYYY');\n if (formattedDate == calendarDate) {\n tasks.push({\n id: subtask.id,\n start: new Date(timeblock.start),\n end: new Date(timeblock.end),\n master_task: subtask.master_task,\n name: employee?.name,\n surname: employee?.surname,\n // date: new Date(timeblock.start),\n isWeekend: moment__WEBPACK_IMPORTED_MODULE_1___default()(timeblock.start).day() % 6 == 0,\n initials: employee?.name?.charAt(0)?.toUpperCase() + employee?.surname?.charAt(0)?.toUpperCase(),\n split: split,\n project_code: subtask.project_code,\n type: 'subtask',\n subtask,\n _timeblock_id: timeblock.id,\n _timeblock_is_finished: timeblock.is_finished,\n _real_start: new Date(timeblock.start),\n _real_end: new Date(timeblock.end)\n });\n }\n });\n });\n return tasks;\n },\n _generateBlockers() {\n const blockers = [];\n this.blockers.forEach(blocker => {\n let split = null;\n let employee = null;\n this.filter.team.employees.forEach((e, index) => {\n if (e.id == blocker.employee?.id) {\n split = index + 1;\n employee = e;\n }\n });\n blockers.push({\n blocker,\n split,\n start: new Date(blocker.start),\n end: new Date(blocker.end),\n type: blocker.type,\n isBlocker: true,\n initials: `${employee?.name[0]}${employee?.surname[0]}`,\n color: '#B00020',\n draggable: false,\n isWeekend: moment__WEBPACK_IMPORTED_MODULE_1___default()(blocker.start).day() % 6 == 0,\n _real_start: new Date(blocker.start),\n _real_end: new Date(blocker.end)\n });\n });\n return blockers;\n },\n _getDayStartEnd() {\n return {\n start: this._setMinutesToDate(0),\n end: this._setMinutesToDate(1439)\n };\n },\n _setMinutesToDate(minutes, date = new Date(this.filter.start)) {\n date.setHours(Math.floor(minutes / 60), minutes % 60, 0, 0);\n return date;\n },\n _getRemainingWorkCapacityMinutes(employee) {\n const date = moment__WEBPACK_IMPORTED_MODULE_1___default()(this.filter.start);\n const now = moment__WEBPACK_IMPORTED_MODULE_1___default()();\n if (now.isAfter(date, 'days')) {\n // Past dates\n return 0;\n } else if (now.isBefore(date, 'days')) {\n // Future dates\n return (employee.work_end - employee.work_start) * 60;\n }\n // Today\n const workStartMinutes = employee.work_start * 60;\n const workEndMinutes = employee.work_end * 60;\n const elapsedMinutesOfCurrenyDay = now.diff(moment__WEBPACK_IMPORTED_MODULE_1___default()().startOf('day'), 'minutes');\n if (workStartMinutes > elapsedMinutesOfCurrenyDay) return workEndMinutes - workStartMinutes;else if (workEndMinutes < elapsedMinutesOfCurrenyDay) return 0;else return workEndMinutes - elapsedMinutesOfCurrenyDay;\n }\n }\n});\n\n//# sourceURL=webpack://jandl/./src/plugins/tm@dashboard/teams/_mixins/TeamsCalendar.mixin.ts?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.push.js */ \"./node_modules/core-js/modules/es.array.push.js\");\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! moment */ \"./node_modules/moment/moment.js\");\n/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(moment__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _plugins_tm_dashboard_tasks_utils_timeline_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @/plugins/tm@dashboard/tasks/_utils/timeline.utils */ \"./src/plugins/tm@dashboard/tasks/_utils/timeline.utils.ts\");\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n computed: {\n calendarData() {\n if (!this.subtasks || !this.blockers) return;\n const blockers = this._generateBlockers();\n return {\n tasks: [...this._generateNonWorking(), ...this._generateTasks(), ...blockers.filter(blocker => blocker.type != 'home_office')],\n homeoffices: [...blockers.filter(blocker => blocker.type == 'home_office')]\n };\n },\n splitDays() {\n const days = [];\n const homeoffice = {};\n const now = moment__WEBPACK_IMPORTED_MODULE_1___default()();\n this.filter.team.employees.forEach((employee, index) => {\n const selectedDate = moment__WEBPACK_IMPORTED_MODULE_1___default()(this.filter.start);\n const capacityMinutes = this._getRemainingWorkCapacityMinutes(employee);\n let scheduledCapacityMinutes = 0;\n let totalScheduledTime = 0;\n this.calendarData.tasks.forEach(task => {\n if (task.subtask?.employee_id != employee.id && task.blocker?.employee?.id != employee.id) return;\n if (task.type == 'non-working-hours' || task.subtask?.is_finished || task.blocker?.is_finished || task.isBlocker) return;\n if (selectedDate.isBefore(moment__WEBPACK_IMPORTED_MODULE_1___default()(), 'days')) {\n totalScheduledTime += _plugins_tm_dashboard_tasks_utils_timeline_utils__WEBPACK_IMPORTED_MODULE_2__[\"default\"]._getDifferenceInMinutes(task._real_end, task._real_start);\n // Past\n return;\n } else if (selectedDate.isSame(moment__WEBPACK_IMPORTED_MODULE_1___default()(), 'days')) {\n totalScheduledTime += _plugins_tm_dashboard_tasks_utils_timeline_utils__WEBPACK_IMPORTED_MODULE_2__[\"default\"]._getDifferenceInMinutes(task._real_end, task._real_start);\n // Today\n const isTaskCurrentlyInProgress = moment__WEBPACK_IMPORTED_MODULE_1___default()(task._real_start).isBefore(moment__WEBPACK_IMPORTED_MODULE_1___default()(), 'minutes') && moment__WEBPACK_IMPORTED_MODULE_1___default()(task._real_end).isAfter(moment__WEBPACK_IMPORTED_MODULE_1___default()(), 'minutes');\n const isTaskInFuture = moment__WEBPACK_IMPORTED_MODULE_1___default()(task._real_start).isAfter(moment__WEBPACK_IMPORTED_MODULE_1___default()(), 'minutes');\n const isTaskDuringWorkHours = moment__WEBPACK_IMPORTED_MODULE_1___default()(task._real_start).hour() >= employee.work_start && moment__WEBPACK_IMPORTED_MODULE_1___default()(task._real_start).hour() <= employee.work_end;\n if (isTaskDuringWorkHours) {\n if (isTaskCurrentlyInProgress) {\n scheduledCapacityMinutes += _plugins_tm_dashboard_tasks_utils_timeline_utils__WEBPACK_IMPORTED_MODULE_2__[\"default\"]._getDifferenceInMinutes(new Date(), task._real_end);\n } else if (isTaskInFuture) {\n scheduledCapacityMinutes += _plugins_tm_dashboard_tasks_utils_timeline_utils__WEBPACK_IMPORTED_MODULE_2__[\"default\"]._getDifferenceInMinutes(task._real_end, task._real_start);\n }\n }\n } else {\n // Future\n const isTaskDuringWorkHours = moment__WEBPACK_IMPORTED_MODULE_1___default()(task._real_start).hour() >= employee.work_start && moment__WEBPACK_IMPORTED_MODULE_1___default()(task._real_start).hour() <= employee.work_end;\n if (isTaskDuringWorkHours) {\n scheduledCapacityMinutes += _plugins_tm_dashboard_tasks_utils_timeline_utils__WEBPACK_IMPORTED_MODULE_2__[\"default\"]._getDifferenceInMinutes(task._real_end, task._real_start);\n }\n totalScheduledTime += _plugins_tm_dashboard_tasks_utils_timeline_utils__WEBPACK_IMPORTED_MODULE_2__[\"default\"]._getDifferenceInMinutes(task._real_end, task._real_start);\n }\n });\n this.calendarData.homeoffices.forEach(task => {\n if (task.blocker.employee?.id != employee.id) return;\n homeoffice[task.split] = true;\n });\n const unscheduledTime = capacityMinutes - scheduledCapacityMinutes;\n days.push({\n id: index + 1,\n name: employee.name,\n surname: employee.surname,\n employee_id: employee.id,\n date: this.filter.start,\n fullname: `${employee.name} ${employee.surname}`,\n initials: employee.name.charAt(0).toUpperCase() + employee.surname.charAt(0).toUpperCase(),\n unscheduledTime: unscheduledTime > 0 ? (unscheduledTime / 60).toFixed(1) : 0,\n scheduledTime: totalScheduledTime > 0 ? (totalScheduledTime / 60).toFixed(1) : 0,\n isHomeoffice: homeoffice[index + 1] ? true : false\n });\n });\n return days;\n }\n },\n methods: {\n _generateNonWorking() {\n const nonWorkingHours = [];\n const date = new Date(this.filter.start);\n let earliestHour = null;\n this.calendarConfig.date = date;\n const {\n start: dayStart,\n end: dayEnd\n } = this._getDayStartEnd();\n this.filter.team.employees.forEach((employee, index) => {\n if (!earliestHour || employee.work_start < earliestHour) earliestHour = employee.work_start;\n nonWorkingHours.push({\n title: \"Non working hours\",\n start: dayStart,\n end: this._setMinutesToDate((employee.work_start + 0.1) * 60),\n split: index + 1,\n type: 'non-working-hours',\n draggable: false\n });\n nonWorkingHours.push({\n title: \"Non working hours\",\n start: this._setMinutesToDate((employee.work_end + 0.1) * 60),\n end: dayEnd,\n split: index + 1,\n type: 'non-working-hours',\n draggable: false\n });\n });\n this.calendarConfig.scrollHour = earliestHour - 1;\n return nonWorkingHours;\n },\n _generateTasks() {\n const tasks = [];\n const calendarDate = moment__WEBPACK_IMPORTED_MODULE_1___default()(this.filter.start).format('DD-MM-YYYY');\n this.subtasks.forEach(subtask => {\n let split = null;\n let employee = null;\n this.filter.team.employees.forEach((e, index) => {\n if (e.id == subtask.employee_id) {\n split = index + 1;\n employee = e;\n }\n });\n subtask.timeblocks.forEach(timeblock => {\n const formattedDate = moment__WEBPACK_IMPORTED_MODULE_1___default()(timeblock.start).format('DD-MM-YYYY');\n let type = 'subtask';\n if (subtask.type == 'office365') type = 'office365';\n if (formattedDate == calendarDate) {\n tasks.push({\n id: subtask.id,\n start: new Date(timeblock.start),\n end: new Date(timeblock.end),\n master_task: subtask.master_task,\n name: employee?.name,\n surname: employee?.surname,\n // date: new Date(timeblock.start),\n isWeekend: moment__WEBPACK_IMPORTED_MODULE_1___default()(timeblock.start).day() % 6 == 0,\n initials: employee?.name?.charAt(0)?.toUpperCase() + employee?.surname?.charAt(0)?.toUpperCase(),\n split: split,\n project_code: subtask.project_code,\n type,\n subtask,\n _timeblock_id: timeblock.id,\n _timeblock_is_finished: timeblock.is_finished,\n _real_start: new Date(timeblock.start),\n _real_end: new Date(timeblock.end)\n });\n }\n });\n });\n return tasks;\n },\n _generateBlockers() {\n const blockers = [];\n this.blockers.forEach(blocker => {\n let split = null;\n let employee = null;\n this.filter.team.employees.forEach((e, index) => {\n if (e.id == blocker.employee?.id) {\n split = index + 1;\n employee = e;\n }\n });\n blockers.push({\n blocker,\n split,\n start: new Date(blocker.start),\n end: new Date(blocker.end),\n type: blocker.type,\n isBlocker: true,\n initials: `${employee?.name[0]}${employee?.surname[0]}`,\n color: '#B00020',\n draggable: false,\n isWeekend: moment__WEBPACK_IMPORTED_MODULE_1___default()(blocker.start).day() % 6 == 0,\n _real_start: new Date(blocker.start),\n _real_end: new Date(blocker.end)\n });\n });\n return blockers;\n },\n _getDayStartEnd() {\n return {\n start: this._setMinutesToDate(0),\n end: this._setMinutesToDate(1439)\n };\n },\n _setMinutesToDate(minutes, date = new Date(this.filter.start)) {\n date.setHours(Math.floor(minutes / 60), minutes % 60, 0, 0);\n return date;\n },\n _getRemainingWorkCapacityMinutes(employee) {\n const date = moment__WEBPACK_IMPORTED_MODULE_1___default()(this.filter.start);\n const now = moment__WEBPACK_IMPORTED_MODULE_1___default()();\n if (now.isAfter(date, 'days')) {\n // Past dates\n return 0;\n } else if (now.isBefore(date, 'days')) {\n // Future dates\n return (employee.work_end - employee.work_start) * 60;\n }\n // Today\n const workStartMinutes = employee.work_start * 60;\n const workEndMinutes = employee.work_end * 60;\n const elapsedMinutesOfCurrenyDay = now.diff(moment__WEBPACK_IMPORTED_MODULE_1___default()().startOf('day'), 'minutes');\n if (workStartMinutes > elapsedMinutesOfCurrenyDay) return workEndMinutes - workStartMinutes;else if (workEndMinutes < elapsedMinutesOfCurrenyDay) return 0;else return workEndMinutes - elapsedMinutesOfCurrenyDay;\n }\n }\n});\n\n//# sourceURL=webpack://jandl/./src/plugins/tm@dashboard/teams/_mixins/TeamsCalendar.mixin.ts?"); /***/ }),