Merge branch 'main' of bitbucket.org:studiotem/jandl-taskmanager-app

This commit is contained in:
StudioTem committed 2025-12-16 17:22:12 +01:00
commit e4e7dbb741
8 files changed
+1013 -307

No files matched your search

+14 -14
View File
@@ -455,7 +455,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var cor
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict"; "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 core_js_modules_es_json_stringify_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.json.stringify.js */ \"./node_modules/core-js/modules/es.json.stringify.js\");\n/* harmony import */ var core_js_modules_es_json_stringify_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_json_stringify_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/esnext.iterator.constructor.js */ \"./node_modules/core-js/modules/esnext.iterator.constructor.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/esnext.iterator.filter.js */ \"./node_modules/core-js/modules/esnext.iterator.filter.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var core_js_modules_esnext_iterator_find_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! core-js/modules/esnext.iterator.find.js */ \"./node_modules/core-js/modules/esnext.iterator.find.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_find_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_find_js__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var core_js_modules_esnext_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! core-js/modules/esnext.iterator.for-each.js */ \"./node_modules/core-js/modules/esnext.iterator.for-each.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! core-js/modules/esnext.iterator.map.js */ \"./node_modules/core-js/modules/esnext.iterator.map.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _plugins_tm_utils_tm_utils__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/plugins/tm@_utils/tm.utils */ \"./src/plugins/tm@_utils/tm.utils.ts\");\n/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! moment */ \"./node_modules/moment/moment.js\");\n/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(moment__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var _plugins_tm_modal_mixins_modal_mixin__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @/plugins/tm@modal/_mixins/modal.mixin */ \"./src/plugins/tm@modal/_mixins/modal.mixin.ts\");\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm-bundler.js\");\n/* harmony import */ var _employees_a_employee_timeblock_vue__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../employees/a-employee-timeblock.vue */ \"./src/plugins/tm@modal/task/_components/employees/a-employee-timeblock.vue\");\n/* harmony import */ var _employees_a_employee_timeblock_timeline_vue__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../employees/a-employee-timeblock-timeline.vue */ \"./src/plugins/tm@modal/task/_components/employees/a-employee-timeblock-timeline.vue\");\n/* harmony import */ var _plugins_tm_utils_timeblock_utils__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @/plugins/tm@_utils/timeblock.utils */ \"./src/plugins/tm@_utils/timeblock.utils.ts\");\n/* provided dependency */ var console = __webpack_require__(/*! ./node_modules/console-browserify/index.js */ \"./node_modules/console-browserify/index.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n components: {\n AEmployeeTimeblock: _employees_a_employee_timeblock_vue__WEBPACK_IMPORTED_MOLine truncated 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 core_js_modules_es_json_stringify_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.json.stringify.js */ \"./node_modules/core-js/modules/es.json.stringify.js\");\n/* harmony import */ var core_js_modules_es_json_stringify_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_json_stringify_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/esnext.iterator.constructor.js */ \"./node_modules/core-js/modules/esnext.iterator.constructor.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/esnext.iterator.filter.js */ \"./node_modules/core-js/modules/esnext.iterator.filter.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var core_js_modules_esnext_iterator_find_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! core-js/modules/esnext.iterator.find.js */ \"./node_modules/core-js/modules/esnext.iterator.find.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_find_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_find_js__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var core_js_modules_esnext_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! core-js/modules/esnext.iterator.for-each.js */ \"./node_modules/core-js/modules/esnext.iterator.for-each.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! core-js/modules/esnext.iterator.map.js */ \"./node_modules/core-js/modules/esnext.iterator.map.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _plugins_tm_utils_tm_utils__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/plugins/tm@_utils/tm.utils */ \"./src/plugins/tm@_utils/tm.utils.ts\");\n/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! moment */ \"./node_modules/moment/moment.js\");\n/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(moment__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var _plugins_tm_modal_mixins_modal_mixin__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @/plugins/tm@modal/_mixins/modal.mixin */ \"./src/plugins/tm@modal/_mixins/modal.mixin.ts\");\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm-bundler.js\");\n/* harmony import */ var _employees_a_employee_timeblock_vue__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../employees/a-employee-timeblock.vue */ \"./src/plugins/tm@modal/task/_components/employees/a-employee-timeblock.vue\");\n/* harmony import */ var _plugins_tm_utils_timeblock_utils__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @/plugins/tm@_utils/timeblock.utils */ \"./src/plugins/tm@_utils/timeblock.utils.ts\");\n/* provided dependency */ var console = __webpack_require__(/*! ./node_modules/console-browserify/index.js */ \"./node_modules/console-browserify/index.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n// import AEmployeeTimeblockTimeline from '../employees/a-employee-timeblock-timeline.vue';\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n components: {\n AEmployeeTimeblock: _employees_a_employee_timeblock_vue__WEBPACK_IMPORTED_MODULE_11__[\"default\"]\n // AEmployeeTimeblockTimeline,\n },\n mixins: [_plugins_tm_modal_mixins_modal_mixin__WEBPACK_IMPORTED_MODULE_9__[\"default\"]],\n props: {\n tLine truncated
/***/ }), /***/ }),
@@ -543,7 +543,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var cor
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict"; "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 core_js_modules_es_json_stringify_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.json.stringify.js */ \"./node_modules/core-js/modules/es.json.stringify.js\");\n/* harmony import */ var core_js_modules_es_json_stringify_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_json_stringify_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/esnext.iterator.constructor.js */ \"./node_modules/core-js/modules/esnext.iterator.constructor.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/esnext.iterator.filter.js */ \"./node_modules/core-js/modules/esnext.iterator.filter.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var core_js_modules_esnext_iterator_find_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! core-js/modules/esnext.iterator.find.js */ \"./node_modules/core-js/modules/esnext.iterator.find.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_find_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_find_js__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var core_js_modules_esnext_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! core-js/modules/esnext.iterator.for-each.js */ \"./node_modules/core-js/modules/esnext.iterator.for-each.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! core-js/modules/esnext.iterator.map.js */ \"./node_modules/core-js/modules/esnext.iterator.map.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _plugins_tm_components_z_datepicker_vue__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/plugins/tm@_components/z-datepicker.vue */ \"./src/plugins/tm@_components/z-datepicker.vue\");\n/* harmony import */ var _plugins_tm_components_z_files_upload_vue__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/plugins/tm@_components/z-files-upload.vue */ \"./src/plugins/tm@_components/z-files-upload.vue\");\n/* harmony import */ var _vuelidate_core__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @vuelidate/core */ \"./node_modules/@vuelidate/core/dist/index.esm.js\");\n/* harmony import */ var _vuelidate_validators__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @vuelidate/validators */ \"./node_modules/@vuelidate/validators/dist/index.esm.js\");\n/* harmony import */ var _plugins_lib_auth_utils_error_utils__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @/plugins/lib@auth/_utils/error.utils */ \"./src/plugins/lib@auth/_utils/error.utils.ts\");\n/* harmony import */ var _vueup_vue_quill__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @vueup/vue-quill */ \"./node_modules/@vueup/vue-quill/dist/vue-quill.esm-bundler.js\");\n/* harmony import */ var _master_task_mixins_selects_mixin__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../master-task/_mixins/selects.mixin */ \"./src/plugins/tm@modal/master-task/_mixins/selects.mixin.ts\");\n/* harmony import */ var _plugins_tm_utils_tm_utils__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @/plugins/tm@_utils/tm.utils */ \"./src/plugins/tm@_utils/tm.utils.ts\");\n/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! moment */ \"./node_modules/moment/moment.js\");\n/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(moment__WEBPACK_IMPORTED_MODULE_15__Line truncated 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 core_js_modules_es_json_stringify_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.json.stringify.js */ \"./node_modules/core-js/modules/es.json.stringify.js\");\n/* harmony import */ var core_js_modules_es_json_stringify_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_json_stringify_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/esnext.iterator.constructor.js */ \"./node_modules/core-js/modules/esnext.iterator.constructor.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/esnext.iterator.filter.js */ \"./node_modules/core-js/modules/esnext.iterator.filter.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var core_js_modules_esnext_iterator_find_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! core-js/modules/esnext.iterator.find.js */ \"./node_modules/core-js/modules/esnext.iterator.find.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_find_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_find_js__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var core_js_modules_esnext_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! core-js/modules/esnext.iterator.for-each.js */ \"./node_modules/core-js/modules/esnext.iterator.for-each.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! core-js/modules/esnext.iterator.map.js */ \"./node_modules/core-js/modules/esnext.iterator.map.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var core_js_modules_esnext_iterator_some_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! core-js/modules/esnext.iterator.some.js */ \"./node_modules/core-js/modules/esnext.iterator.some.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_some_js__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_some_js__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var _plugins_tm_components_z_datepicker_vue__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/plugins/tm@_components/z-datepicker.vue */ \"./src/plugins/tm@_components/z-datepicker.vue\");\n/* harmony import */ var _plugins_tm_components_z_files_upload_vue__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @/plugins/tm@_components/z-files-upload.vue */ \"./src/plugins/tm@_components/z-files-upload.vue\");\n/* harmony import */ var _vuelidate_core__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @vuelidate/core */ \"./node_modules/@vuelidate/core/dist/index.esm.js\");\n/* harmony import */ var _vuelidate_validators__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @vuelidate/validators */ \"./node_modules/@vuelidate/validators/dist/index.esm.js\");\n/* harmony import */ var _plugins_lib_auth_utils_error_utils__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @/plugins/lib@auth/_utils/error.utils */ \"./src/plugins/lib@auth/_utils/error.utils.ts\");\n/* harmony import */ var _vueup_vue_quill__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @vueup/vue-quill */ \"./node_modules/@vueup/vue-quill/dist/vue-quill.esm-bundler.js\");\n/* harmony import */ var _master_task_mixins_selects_mixin__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../master-task/_mixins/selects.mixin */ \"./src/plugins/tm@modal/master-task/_mixins/selects.mixin.ts\");\n/* harmony import */ var _Line truncated
/***/ }), /***/ }),
@@ -840,7 +840,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _no
/***/ (function(module, __webpack_exports__, __webpack_require__) { /***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict"; "use strict";
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../../../../node_modules/css-loader/dist/runtime/noSourceMaps.js */ \"./node_modules/css-loader/dist/runtime/noSourceMaps.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".timeline-scroll[data-v-5ca7dec4] {\\n overflow-x: auto;\\n overflow-y: hidden;\\n position: relative;\\n width: 100%;\\n scrollbar-width: none;\\n}\\n.timeline-scroll[data-v-5ca7dec4]::-webkit-scrollbar {\\n display: none;\\n}\\n.timeline-bar[data-v-5ca7dec4] {\\n position: relative;\\n height: 30px;\\n width: 1440px;\\n background: #fafafa;\\n border-radius: 4px;\\n}\\n@media (max-width: 768px) {\\n.timeline-bar[data-v-5ca7dec4] {\\n width: 1200px;\\n}\\n}\\n.non-working-hours[data-v-5ca7dec4] {\\n position: absolute;\\n top: 0;\\n height: 100%;\\n background: repeating-linear-gradient(45deg, transparent, transparent 10px, rgba(224, 224, 224, 0.3) 10px, rgba(224, 224, 224, 0.3) 20px);\\n z-index: 1;\\n}\\n.work-hours-bar[data-v-5ca7dec4] {\\n position: absolute;\\n top: 0;\\n height: 100%;\\n background: transparent;\\n z-index: 1;\\n}\\n.scheduled-block[data-v-5ca7dec4] {\\n position: absolute;\\n top: 5px;\\n height: 22px;\\n background: #7f39fb;\\n border: 1px solid #6a1bf7;\\n opacity: 0.6;\\n border-radius: 2px;\\n z-index: 2;\\n}\\n.scheduled-block--blocker[data-v-5ca7dec4] {\\n background: rgb(176, 0, 32);\\n border: 1px solid rgb(156, 0, 28);\\n opacity: 0.7;\\n}\\n.other-timeblock[data-v-5ca7dec4] {\\n position: absolute;\\n top: 5px;\\n height: 22px;\\n background: #FFA726;\\n opacity: 0.5;\\n border: 2px dashed #FF9800;\\n border-radius: 2px;\\n z-index: 2;\\n}\\n.current-timeblock[data-v-5ca7dec4] {\\n position: absolute;\\n top: 5px;\\n height: 22px;\\n background: #2196F3;\\n opacity: 0.7;\\n border: 2px solid #1976D2;\\n border-radius: 2px;\\n z-index: 3;\\n}\\n.current-timeblock.has-collision[data-v-5ca7dec4] {\\n border-color: #ff5252;\\n}\\n.collision-segment[data-v-5ca7dec4] {\\n position: absolute;\\n top: 5px;\\n height: 22px;\\n background: #ff5252;\\n opacity: 0.6;\\n border-radius: 2px;\\n z-index: 4;\\n}\\n.timeblock-duration[data-v-5ca7dec4] {\\n position: absolute;\\n top: 50%;\\n left: 50%;\\n transform: translate(-50%, -50%);\\n font-size: 14px;\\n font-weight: bold;\\n color: white;\\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);\\n pointer-events: none;\\n}\\n.timeline-loading[data-v-5ca7dec4] {\\n height: 60px;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n font-size: 14px;\\n opacity: 0.5;\\n}\", \"\"]);\n// Exports\n/* harmony default export */ __webpack_exports__[\"default\"] = (___CSS_LOADER_EXPORT___);\n\n\n//# sourceURL=webpack://jandl/./src/plugins/tm@modal/task/_components/employees/a-employee-timeblock-timeline.vue?./node_modules/css-loader/dist/cjs.js??clonedRuleSet-27.use%5B1%5D!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-27.use%5B2%5D!./node_modules/sass-loader/dist/cjs.js??clonedRuleSet-27.use%5B3%5D!./node_modules/vue-loader/dist/index.js??ruleSet%5B0%5D.use%5B0%5D\n}"); eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../../../../node_modules/css-loader/dist/runtime/noSourceMaps.js */ \"./node_modules/css-loader/dist/runtime/noSourceMaps.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".timeline-scroll[data-v-5ca7dec4] {\\n overflow-x: auto;\\n overflow-y: hidden;\\n position: relative;\\n width: 100%;\\n scrollbar-width: none;\\n}\\n.timeline-scroll[data-v-5ca7dec4]::-webkit-scrollbar {\\n display: none;\\n}\\n.timeline-bar[data-v-5ca7dec4] {\\n position: relative;\\n height: 30px;\\n width: 1440px;\\n background: #fafafa;\\n border-radius: 4px;\\n cursor: crosshair;\\n}\\n@media (max-width: 768px) {\\n.timeline-bar[data-v-5ca7dec4] {\\n width: 1200px;\\n}\\n}\\n.non-working-hours[data-v-5ca7dec4] {\\n position: absolute;\\n top: 0;\\n height: 100%;\\n background: repeating-linear-gradient(45deg, transparent, transparent 10px, rgba(224, 224, 224, 0.3) 10px, rgba(224, 224, 224, 0.3) 20px);\\n z-index: 1;\\n pointer-events: none;\\n}\\n.work-hours-bar[data-v-5ca7dec4] {\\n position: absolute;\\n top: 0;\\n height: 100%;\\n background: transparent;\\n z-index: 1;\\n pointer-events: none;\\n}\\n.scheduled-block[data-v-5ca7dec4] {\\n position: absolute;\\n top: 5px;\\n height: 22px;\\n background: #7f39fb;\\n border: 1px solid #6a1bf7;\\n opacity: 0.6;\\n border-radius: 2px;\\n z-index: 2;\\n pointer-events: none;\\n}\\n.scheduled-block--blocker[data-v-5ca7dec4] {\\n background: rgb(176, 0, 32);\\n border: 1px solid rgb(156, 0, 28);\\n opacity: 0.7;\\n}\\n.other-timeblock[data-v-5ca7dec4] {\\n position: absolute;\\n top: 5px;\\n height: 22px;\\n background: #FFA726;\\n opacity: 0.5;\\n border: 2px dashed #FF9800;\\n border-radius: 2px;\\n z-index: 2;\\n pointer-events: none;\\n}\\n.preview-block[data-v-5ca7dec4] {\\n position: absolute;\\n top: 5px;\\n height: 22px;\\n background: #4CAF50;\\n opacity: 0.6;\\n border: 2px dashed #388E3C;\\n border-radius: 2px;\\n z-index: 5;\\n cursor: crosshair;\\n transition: opacity 0.2s, box-shadow 0.2s;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n}\\n.preview-block[data-v-5ca7dec4]:hover {\\n opacity: 0.8;\\n box-shadow: 0 2px 8px rgba(76, 175, 80, 0.4);\\n}\\n.preview-block.is-stretching[data-v-5ca7dec4] {\\n opacity: 0.8;\\n box-shadow: 0 4px 12px rgba(76, 175, 80, 0.6);\\n cursor: ew-resize;\\n}\\n.preview-time-label[data-v-5ca7dec4] {\\n font-size: 11px;\\n font-weight: 600;\\n color: white;\\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.5);\\n white-space: nowrap;\\n pointer-events: none;\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n user-select: none;\\n}\\n.current-timeblock[data-v-5ca7dec4] {\\n position: absolute;\\n top: 5px;\\n height: 22px;\\n background: #2196F3;\\n opacity: 0.7;\\n border: 2px solid #1976D2;\\n border-radius: 2px;\\n z-index: 3;\\n transition: box-shadow 0.2s;\\n}\\n.current-timeblock.has-collision[data-v-5ca7dec4] {\\n border-color: #ff5252;\\n}\\n.current-timeblock.is-resizing[data-v-5ca7dec4] {\\n opacity: 0.8;\\n box-shadow: 0 4px 12px rgba(33, 150, 243, 0.6);\\n z-index: 6;\\n}\\n.resize-handle[data-v-5ca7dec4] {\\n position: absolute;\\n top: 0;\\n width: 8px;\\n height: 100%;\\n cursor: ew-resize;\\n z-index: 4;\\n}\\n.resize-handle[data-v-5ca7dec4]:hover {\\n background: rgba(255, 255, 255, 0.3);\\n}\\n.resize-handle--left[data-v-5ca7dec4] {\\n left: 0;\\n border-top-left-radius: 2px;\\n border-bottom-left-radius: 2px;\\n}\\n.resize-handle--right[data-v-5ca7dec4] {\\n right: 0;\\n border-top-right-radius: 2px;\\n border-bottom-right-radius: 2px;\\n}\\n.collision-segment[data-v-5ca7dec4] {\\n position: absolute;\\n top: 5px;\\n height: 22px;\\n background: #ff5252;\\n opacity: 0.6;\\n border-radius: 2px;\\n z-index: 4;\\n pointer-events: none;\\n}\\n.timeblock-duration[data-v-5ca7d Line truncated
/***/ }), /***/ }),
@@ -862,7 +862,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _no
/***/ (function(module, __webpack_exports__, __webpack_require__) { /***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict"; "use strict";
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../../../../node_modules/css-loader/dist/runtime/noSourceMaps.js */ \"./node_modules/css-loader/dist/runtime/noSourceMaps.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".employee[data-v-1030fd07] {\\n width: 100%;\\n margin-bottom: 16px;\\n}\\n.employee--has-background[data-v-1030fd07] {\\n border: 1px solid #e5e5e5;\\n border-bottom: 3px solid #7f39fb;\\n padding: 16px;\\n border-radius: 8px 8px 0 0;\\n}\\n.employee__timeblocks[data-v-1030fd07] {\\n display: flex;\\n flex-direction: column;\\n gap: 8px;\\n}\", \"\"]);\n// Exports\n/* harmony default export */ __webpack_exports__[\"default\"] = (___CSS_LOADER_EXPORT___);\n\n\n//# sourceURL=webpack://jandl/./src/plugins/tm@modal/task/_components/employees/a-employee.vue?./node_modules/css-loader/dist/cjs.js??clonedRuleSet-27.use%5B1%5D!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-27.use%5B2%5D!./node_modules/sass-loader/dist/cjs.js??clonedRuleSet-27.use%5B3%5D!./node_modules/vue-loader/dist/index.js??ruleSet%5B0%5D.use%5B0%5D\n}"); eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../../../../node_modules/css-loader/dist/runtime/noSourceMaps.js */ \"./node_modules/css-loader/dist/runtime/noSourceMaps.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".employee[data-v-1030fd07] {\\n width: 100%;\\n margin-bottom: 16px;\\n}\\n.employee--has-background[data-v-1030fd07] {\\n border: 1px solid #e5e5e5;\\n border-top: 3px solid #7f39fb;\\n padding: 16px;\\n border-radius: 8px 8px 0 0;\\n}\\n.employee__timeblocks[data-v-1030fd07] {\\n display: flex;\\n flex-direction: column;\\n gap: 8px;\\n}\", \"\"]);\n// Exports\n/* harmony default export */ __webpack_exports__[\"default\"] = (___CSS_LOADER_EXPORT___);\n\n\n//# sourceURL=webpack://jandl/./src/plugins/tm@modal/task/_components/employees/a-employee.vue?./node_modules/css-loader/dist/cjs.js??clonedRuleSet-27.use%5B1%5D!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-27.use%5B2%5D!./node_modules/sass-loader/dist/cjs.js??clonedRuleSet-27.use%5B3%5D!./node_modules/vue-loader/dist/index.js??ruleSet%5B0%5D.use%5B0%5D\n}");
/***/ }), /***/ }),
@@ -1177,7 +1177,7 @@ eval("{// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// l
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict"; "use strict";
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.runtime.esm-bundler.js\");\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm-bundler.js\");\n/* harmony import */ var _vuelidate_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @vuelidate/core */ \"./node_modules/@vuelidate/core/dist/index.esm.js\");\n/* harmony import */ var _vuelidate_validators__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @vuelidate/validators */ \"./node_modules/@vuelidate/validators/dist/index.esm.js\");\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (/*@__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.defineComponent)({\n __name: 'a-employee-select',\n props: {\n modelValue: {\n type: Object,\n required: true\n },\n customFilter: {\n type: Function,\n required: false,\n default: undefined\n },\n required: {\n type: Boolean,\n required: false\n }\n },\n emits: [\"update:modelValue\", \"clearEmployee\"],\n setup(__props, {\n expose: __expose,\n emit: __emit\n }) {\n const props = __props;\n const emit = __emit;\n const store = (0,vuex__WEBPACK_IMPORTED_MODULE_1__.useStore)();\n const enrichedEmployees = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(() => store.getters['tm/enrichedEmployees']);\n // Make modelValue reactive for Vuelidate\n const {\n modelValue\n } = (0,vue__WEBPACK_IMPORTED_MODULE_0__.toRefs)(props);\n // Custom validator: if either field is filled, both are required\n const requiredWhenPaired = fieldName => {\n return _value => {\n const {\n id,\n duration\n } = modelValue.value;\n const hasAnyData = !!(id || duration);\n // If no data at all, this is valid (both fields optional)\n if (!hasAnyData) {\n return true;\n }\n // If there's any data, this field must be filled\n if (fieldName === 'id') {\n return !!id;\n } else {\n return duration !== null && duration !== undefined;\n }\n };\n };\n // Vuelidate rules - only validate if employee has partial data\n const rules = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(() => {\n return props.required ? {\n id: {\n required: _vuelidate_validators__WEBPACK_IMPORTED_MODULE_3__.required\n },\n duration: {\n required: _vuelidate_validators__WEBPACK_IMPORTED_MODULE_3__.required\n }\n } : {\n id: {\n requiredWhenPaired: _vuelidate_validators__WEBPACK_IMPORTED_MODULE_3__.helpers.withMessage('Vyberte zamestnanca', requiredWhenPaired('id'))\n },\n duration: {\n requiredWhenPaired: _vuelidate_validators__WEBPACK_IMPORTED_MODULE_3__.helpers.withMessage('Zadajte časový odhad', requiredWhenPaired('duration'))\n }\n };\n });\n const v$ = (0,_vuelidate_core__WEBPACK_IMPORTED_MODULE_2__.useVuelidate)(rules.value, modelValue, {\n $autoDirty: false\n });\n const handleUpdateEmployee = value => {\n emit('update:modelValue', {\n ...props.modelValue,\n id: value\n });\n };\n const handleUpdateDuration = value => {\n const parsedValue = parseFloat(value);\n emit('update:modelValue', {\n ...props.modelValue,\n duration: isNaN(parsedValue) ? null : parsedValue\n });\n };\n const handleClearEmployee = () => {\n emit('clearEmployee');\n };\n // Expose validate method\n const validate = async (required = false) => {\n // If required, check that both fields are set\n if (required) {\n const {\n id,\n duration\n } = modelValue.value;\n if (!id || duration === null || duration === undefined) {\n // Explicitly mark fields as touched to show validation errors\n v$.value.$touch();\n return false;\n }\n }\n // Explicitly mark fields as touched to show validation errors\n v$.value.$touch();\n const isValid = await v$.value.$validate();\n return isValid;\n };\n __expose({\n validate\n });\n const __returned__ = {\n props,\n emit,\n store,\n enrichedEmployees,\n modelValue,\n requiredWhenPaired,\n rules,\n v$,\n handleUpdateEmployee,\n handleUpdateDuration,\n handleClearEmployee,\n validate\n };\n Object.defineProperty(__returned__, '__isScriptSetup', {\n enumerable: false,\n value: true\n });\n return __returned__;\n }\n}));\n\n//# sourceURL=webpack://jandl/./src/plugins/tm@modal/task/_components/employees/a-employee-select.vue?./node_modules/webpack-plugin-vuetify/dist/scriptLoader.js!./node_modules/babel-loader/lib/index.js!./node_ Line truncated eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/esnext.iterator.constructor.js */ \"./node_modules/core-js/modules/esnext.iterator.constructor.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_esnext_iterator_find_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/esnext.iterator.find.js */ \"./node_modules/core-js/modules/esnext.iterator.find.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_find_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_find_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/esnext.iterator.map.js */ \"./node_modules/core-js/modules/esnext.iterator.map.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.runtime.esm-bundler.js\");\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm-bundler.js\");\n/* harmony import */ var _vuelidate_core__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @vuelidate/core */ \"./node_modules/@vuelidate/core/dist/index.esm.js\");\n/* harmony import */ var _vuelidate_validators__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @vuelidate/validators */ \"./node_modules/@vuelidate/validators/dist/index.esm.js\");\n/* provided dependency */ var console = __webpack_require__(/*! ./node_modules/console-browserify/index.js */ \"./node_modules/console-browserify/index.js\");\n\n\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (/*@__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_3__.defineComponent)({\n __name: 'a-employee-select',\n props: {\n modelValue: {\n type: Object,\n required: true\n },\n customFilter: {\n type: Function,\n required: false,\n default: undefined\n },\n required: {\n type: Boolean,\n required: false\n }\n },\n emits: [\"update:modelValue\", \"clearEmployee\"],\n setup(__props, {\n expose: __expose,\n emit: __emit\n }) {\n const props = __props;\n const emit = __emit;\n const store = (0,vuex__WEBPACK_IMPORTED_MODULE_4__.useStore)();\n const employeeSelectRef = (0,vue__WEBPACK_IMPORTED_MODULE_3__.ref)(null);\n // Force re-render key\n const componentKey = (0,vue__WEBPACK_IMPORTED_MODULE_3__.ref)(0);\n // Ensure all employees have a displayable name\n const enrichedEmployees = (0,vue__WEBPACK_IMPORTED_MODULE_3__.computed)(() => {\n const employees = store.getters['tm/enrichedEmployees'] || [];\n return employees.map(emp => ({\n ...emp,\n _fullName: emp._fullName || `${emp.name || ''} ${emp.surname || ''}`.trim() || `Employee ${emp.id}`\n }));\n });\n // Function to get item title - handles both objects and IDs\n const getItemTitle = item => {\n // If item is an object with _fullName, return it\n if (item && typeof item === 'object' && item._fullName) {\n return item._fullName;\n }\n // If item is just an ID (string or number), find the employee\n if (item && (typeof item === 'string' || typeof item === 'number')) {\n const employee = enrichedEmployees.value.find(emp => emp.id == item);\n return employee?._fullName || `Employee ${item}`;\n }\n return '';\n };\n // Watch for when employees list changes to force re-render\n (0,vue__WEBPACK_IMPORTED_MODULE_3__.watch)(() => enrichedEmployees.value.length, (newLength, oldLength) => {\n // Force component re-render when employees are loaded\n if (newLength > 0 && newLength !== oldLength) {\n (0,vue__WEBPACK_IMPORTED_MODULE_3__.nextTick)(() => {\n componentKey.value++;\n });\n }\n }, {\n immediate: true\n });\n // Watch for when the selected employee ID changes to ensure display updates\n (0,vue__WEBPACK_IMPORTED_MODULE_3__.watch)(() => props.modelValue.id, newId => {\n // When ID is set and we have employees, force re-render to ensure proper display\n if (newId && enrichedEmployees.value.length > 0) {\n (0,vue__WEBPACK_IMPORTED_MODULE_3__.nextTick)(() => {\n componentKey.value++;\n });\n }\n });\n // Make modelValue reactive for Vuelidate\n con Line truncated
/***/ }), /***/ }),
@@ -1221,7 +1221,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var cor
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict"; "use strict";
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/esnext.iterator.constructor.js */ \"./node_modules/core-js/modules/esnext.iterator.constructor.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/esnext.iterator.filter.js */ \"./node_modules/core-js/modules/esnext.iterator.filter.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/esnext.iterator.map.js */ \"./node_modules/core-js/modules/esnext.iterator.map.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.runtime.esm-bundler.js\");\n/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! moment */ \"./node_modules/moment/moment.js\");\n/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(moment__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _a_employee_timeblock_timeline_header_vue__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./a-employee-timeblock-timeline-header.vue */ \"./src/plugins/tm@modal/task/_components/employees/a-employee-timeblock-timeline-header.vue\");\n\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (/*@__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_3__.defineComponent)({\n __name: 'a-employee-timeblock-timeline',\n props: {\n isLoading: {\n type: Boolean,\n required: true\n },\n employee: {\n type: Object,\n required: true\n },\n scheduledBlocks: {\n type: Array,\n required: true\n },\n otherTimeblocks: {\n type: Array,\n required: false,\n default: () => []\n },\n currentTimeblockRange: {\n type: Object,\n required: true\n },\n collision: {\n type: Object,\n required: true\n },\n collisionSegments: {\n type: Array,\n required: true\n },\n timeblockDuration: {\n type: Number,\n required: true\n },\n startHour: {\n type: Number,\n required: true\n },\n endHour: {\n type: Number,\n required: true\n },\n hourWidth: {\n type: Number,\n required: true\n }\n },\n setup(__props, {\n expose: __expose\n }) {\n const props = __props;\n const timelineContainer = (0,vue__WEBPACK_IMPORTED_MODULE_3__.ref)(null);\n const timelineScroll = (0,vue__WEBPACK_IMPORTED_MODULE_3__.ref)(null);\n // Convert other timeblocks to renderable format\n const otherTimeblocksRendered = (0,vue__WEBPACK_IMPORTED_MODULE_3__.computed)(() => {\n return props.otherTimeblocks.map(tb => {\n if (!tb.date || !tb.starts_at_time || !tb.ends_at_time) return null;\n const [startHour, startMinute] = tb.starts_at_time.split(':').map(Number);\n const [endHour, endMinute] = tb.ends_at_time.split(':').map(Number);\n const start = moment__WEBPACK_IMPORTED_MODULE_4___default()(tb.date).set({\n hour: startHour,\n minute: startMinute,\n second: 0\n }).toDate();\n const end = moment__WEBPACK_IMPORTED_MODULE_4___default()(tb.date).set({\n hour: endHour,\n minute: endMinute,\n second: 0\n }).toDate();\n return {\n _start: start,\n _end: end\n };\n }).filter(tb => tb !== null);\n });\n // Position calculations\n const getHourPosition = hour => {\n return (hour - props.startHour) * props.hourWidth;\n };\n const getHourWidth = hours => {\n return hours * props.hourWidth;\n };\n const getTimePosition = date => {\n const hour = date.getHours();\n const minute = date.getMinutes();\n const totalHours = hour + minute / 60;\n return (totalHours - props.startHour) * props.hourWidth + 1;\n };\n const getTimeWidth = (start, end) => {\n const startHour = start.getHours() + start.getMinutes() / 60;\n const endHour = end.getHours() + end.getMinutes() / 60;\n return (endHour - startHour) * props.hourWidth - 2;\n };\n // Expose r Line truncated eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/esnext.iterator.constructor.js */ \"./node_modules/core-js/modules/esnext.iterator.constructor.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/esnext.iterator.filter.js */ \"./node_modules/core-js/modules/esnext.iterator.filter.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/esnext.iterator.map.js */ \"./node_modules/core-js/modules/esnext.iterator.map.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.runtime.esm-bundler.js\");\n/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! moment */ \"./node_modules/moment/moment.js\");\n/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(moment__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _a_employee_timeblock_timeline_header_vue__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./a-employee-timeblock-timeline-header.vue */ \"./src/plugins/tm@modal/task/_components/employees/a-employee-timeblock-timeline-header.vue\");\n\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (/*@__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_3__.defineComponent)({\n __name: 'a-employee-timeblock-timeline',\n props: {\n isLoading: {\n type: Boolean,\n required: true\n },\n employee: {\n type: Object,\n required: true\n },\n scheduledBlocks: {\n type: Array,\n required: true\n },\n otherTimeblocks: {\n type: Array,\n required: false,\n default: () => []\n },\n currentTimeblockRange: {\n type: Object,\n required: true\n },\n collision: {\n type: Object,\n required: true\n },\n collisionSegments: {\n type: Array,\n required: true\n },\n timeblockDuration: {\n type: Number,\n required: true\n },\n startHour: {\n type: Number,\n required: true\n },\n endHour: {\n type: Number,\n required: true\n },\n hourWidth: {\n type: Number,\n required: true\n }\n },\n emits: [\"timeblockUpdated\"],\n setup(__props, {\n expose: __expose,\n emit: __emit\n }) {\n const props = __props;\n const emit = __emit;\n const timelineContainer = (0,vue__WEBPACK_IMPORTED_MODULE_3__.ref)(null);\n const timelineScroll = (0,vue__WEBPACK_IMPORTED_MODULE_3__.ref)(null);\n const timelineBar = (0,vue__WEBPACK_IMPORTED_MODULE_3__.ref)(null);\n // Check if mobile device\n const isMobile = (0,vue__WEBPACK_IMPORTED_MODULE_3__.ref)(false);\n // Interactive state\n const showPreview = (0,vue__WEBPACK_IMPORTED_MODULE_3__.ref)(false);\n const previewBlock = (0,vue__WEBPACK_IMPORTED_MODULE_3__.ref)(null);\n const dragState = (0,vue__WEBPACK_IMPORTED_MODULE_3__.ref)({\n isStretching: false,\n isResizingCurrent: false,\n resizeEdge: null,\n startX: 0,\n initialStart: null,\n initialEnd: null\n });\n const resizedCurrentBlock = (0,vue__WEBPACK_IMPORTED_MODULE_3__.ref)(null);\n // Convert other timeblocks to renderable format\n const otherTimeblocksRendered = (0,vue__WEBPACK_IMPORTED_MODULE_3__.computed)(() => {\n return props.otherTimeblocks.map(tb => {\n if (!tb.date || !tb.starts_at_time || !tb.ends_at_time) return null;\n const [startHour, startMinute] = tb.starts_at_time.split(':').map(Number);\n const [endHour, endMinute] = tb.ends_at_time.split(':').map(Number);\n const start = moment__WEBPACK_IMPORTED_MODULE_4___default()(tb.date).set({\n hour: startHour,\n minute: startMinute,\n second: 0\n }).toDate();\n const end = moment__WEBPACK_IMPORTED_MODULE_4___default()(tb.date).set({\n hour: endHour,\n minute: endMinute,\n second: 0\n }).toDate();\n return {\n _start: start,\n _end: end\n };\n }).filter(tb => t Line truncated
/***/ }), /***/ }),
@@ -1232,7 +1232,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var cor
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict"; "use strict";
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/esnext.iterator.constructor.js */ \"./node_modules/core-js/modules/esnext.iterator.constructor.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/esnext.iterator.filter.js */ \"./node_modules/core-js/modules/esnext.iterator.filter.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/esnext.iterator.map.js */ \"./node_modules/core-js/modules/esnext.iterator.map.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.runtime.esm-bundler.js\");\n/* harmony import */ var _vuelidate_core__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @vuelidate/core */ \"./node_modules/@vuelidate/core/dist/index.esm.js\");\n/* harmony import */ var _vuelidate_validators__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @vuelidate/validators */ \"./node_modules/@vuelidate/validators/dist/index.esm.js\");\n/* harmony import */ var _plugins_tm_utils_useEmployeeTimeline__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/plugins/tm@_utils/useEmployeeTimeline */ \"./src/plugins/tm@_utils/useEmployeeTimeline.ts\");\n/* harmony import */ var _plugins_tm_utils_timeblock_utils__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/plugins/tm@_utils/timeblock.utils */ \"./src/plugins/tm@_utils/timeblock.utils.ts\");\n/* harmony import */ var _a_employee_timeblock_header_vue__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./a-employee-timeblock-header.vue */ \"./src/plugins/tm@modal/task/_components/employees/a-employee-timeblock-header.vue\");\n/* harmony import */ var _a_employee_timeblock_timeline_vue__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./a-employee-timeblock-timeline.vue */ \"./src/plugins/tm@modal/task/_components/employees/a-employee-timeblock-timeline.vue\");\n/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! moment */ \"./node_modules/moment/moment.js\");\n/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(moment__WEBPACK_IMPORTED_MODULE_10__);\n\n\n\n\n\n\n\n\n\n\n\n\n// Configuration: Set to false to allow editing timeblocks with existing IDs\nconst ALLOW_EDITING_EXISTING_TIMEBLOCKS = true;\nconst HOUR_WIDTH = 60; // pixels per hour (desktop)\nconst HOUR_WIDTH_MOBILE = 50; // pixels per hour (mobile)\nconst START_HOUR = 0; // Start from midnight\nconst END_HOUR = 24; // End at midnight\n// Check if mobile\n/* harmony default export */ __webpack_exports__[\"default\"] = (/*@__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_3__.defineComponent)({\n __name: 'a-employee-timeblock',\n props: {\n modelValue: {\n type: Object,\n required: true\n },\n employee: {\n type: [Object, null],\n required: true\n },\n allEmployeeTimeblocks: {\n type: Array,\n required: false,\n default: () => []\n },\n allTimeblocks: {\n type: Array,\n required: false,\n default: () => []\n },\n deletedTimeblockIds: {\n type: Array,\n required: false,\n default: () => []\n },\n currentIndex: {\n type: Number,\n required: false,\n default: 0\n },\n deletable: {\n type: Boolean,\n required: false,\n default: false\n },\n index: {\n type: Number,\n required: false,\n default: 0\n }\n },\n emits: [\"update:modelValue\", \"addTimeblock\", \"removeTimeblock\"],\n setup(__props, {\n expose: __expose,\n emit: __emit\n }) {\n const props = __props;\n const emit = __emit;\n const timelineRef = (0,vue__WEBPACK_IMPORTED_MODULE_3__.ref)(null);\n // Check if timeblock is editable (based on whether it has an ID)\n const isEditable = (0,vue__WEBPACK_IMPORTED_MODULE_3__.computed)(() => {\n if (ALLOW_EDITING_EXISTING_TIMEBLOCKS) return true;\n return !props.modelValue.id;\n });\n // Minimum date is today (no past dates)\n const minDate = (0,vue__WEBPACK_IMPORTED_MODULE Line truncated eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/esnext.iterator.constructor.js */ \"./node_modules/core-js/modules/esnext.iterator.constructor.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/esnext.iterator.filter.js */ \"./node_modules/core-js/modules/esnext.iterator.filter.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/esnext.iterator.map.js */ \"./node_modules/core-js/modules/esnext.iterator.map.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.runtime.esm-bundler.js\");\n/* harmony import */ var _vuelidate_core__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @vuelidate/core */ \"./node_modules/@vuelidate/core/dist/index.esm.js\");\n/* harmony import */ var _vuelidate_validators__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @vuelidate/validators */ \"./node_modules/@vuelidate/validators/dist/index.esm.js\");\n/* harmony import */ var _plugins_tm_utils_useEmployeeTimeline__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/plugins/tm@_utils/useEmployeeTimeline */ \"./src/plugins/tm@_utils/useEmployeeTimeline.ts\");\n/* harmony import */ var _plugins_tm_utils_timeblock_utils__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/plugins/tm@_utils/timeblock.utils */ \"./src/plugins/tm@_utils/timeblock.utils.ts\");\n/* harmony import */ var _a_employee_timeblock_header_vue__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./a-employee-timeblock-header.vue */ \"./src/plugins/tm@modal/task/_components/employees/a-employee-timeblock-header.vue\");\n/* harmony import */ var _a_employee_timeblock_timeline_vue__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./a-employee-timeblock-timeline.vue */ \"./src/plugins/tm@modal/task/_components/employees/a-employee-timeblock-timeline.vue\");\n/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! moment */ \"./node_modules/moment/moment.js\");\n/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(moment__WEBPACK_IMPORTED_MODULE_10__);\n\n\n\n\n\n\n\n\n\n\n\n\n// Configuration: Set to false to allow editing timeblocks with existing IDs\nconst ALLOW_EDITING_EXISTING_TIMEBLOCKS = true;\nconst HOUR_WIDTH = 60; // pixels per hour (desktop)\nconst HOUR_WIDTH_MOBILE = 50; // pixels per hour (mobile)\nconst START_HOUR = 0; // Start from midnight\nconst END_HOUR = 24; // End at midnight\n// Check if mobile\n/* harmony default export */ __webpack_exports__[\"default\"] = (/*@__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_3__.defineComponent)({\n __name: 'a-employee-timeblock',\n props: {\n modelValue: {\n type: Object,\n required: true\n },\n employee: {\n type: [Object, null],\n required: true\n },\n allEmployeeTimeblocks: {\n type: Array,\n required: false,\n default: () => []\n },\n allTimeblocks: {\n type: Array,\n required: false,\n default: () => []\n },\n deletedTimeblockIds: {\n type: Array,\n required: false,\n default: () => []\n },\n currentIndex: {\n type: Number,\n required: false,\n default: 0\n },\n deletable: {\n type: Boolean,\n required: false,\n default: false\n },\n index: {\n type: Number,\n required: false,\n default: 0\n }\n },\n emits: [\"update:modelValue\", \"addTimeblock\", \"removeTimeblock\"],\n setup(__props, {\n expose: __expose,\n emit: __emit\n }) {\n const props = __props;\n const emit = __emit;\n const timelineRef = (0,vue__WEBPACK_IMPORTED_MODULE_3__.ref)(null);\n // Check if timeblock is editable (based on whether it has an ID)\n const isEditable = (0,vue__WEBPACK_IMPORTED_MODULE_3__.computed)(() => {\n if (ALLOW_EDITING_EXISTING_TIMEBLOCKS) return true;\n return !props.modelValue.id;\n });\n // Minimum date is today (no past dates)\n const minDate = (0,vue__WEBPACK_IMPORTED_MODULE Line truncated
/***/ }), /***/ }),
@@ -1243,7 +1243,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var cor
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict"; "use strict";
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/esnext.iterator.constructor.js */ \"./node_modules/core-js/modules/esnext.iterator.constructor.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/esnext.iterator.filter.js */ \"./node_modules/core-js/modules/esnext.iterator.filter.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_esnext_iterator_find_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/esnext.iterator.find.js */ \"./node_modules/core-js/modules/esnext.iterator.find.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_find_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_find_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.runtime.esm-bundler.js\");\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm-bundler.js\");\n/* harmony import */ var _a_employee_select_vue__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./a-employee-select.vue */ \"./src/plugins/tm@modal/task/_components/employees/a-employee-select.vue\");\n/* harmony import */ var _a_employee_timeblock_vue__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./a-employee-timeblock.vue */ \"./src/plugins/tm@modal/task/_components/employees/a-employee-timeblock.vue\");\n\n\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (/*@__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_3__.defineComponent)({\n __name: 'a-employee',\n props: {\n employeeData: {\n type: Object,\n required: true\n },\n timeblocks: {\n type: Array,\n required: false,\n default: () => []\n },\n allTimeblocks: {\n type: Array,\n required: false,\n default: () => []\n },\n deletedTimeblockIds: {\n type: Array,\n required: false,\n default: () => []\n },\n customFilter: {\n type: Function,\n required: false,\n default: undefined\n },\n hasBackground: {\n type: Boolean,\n required: false,\n default: true\n },\n required: {\n type: Boolean,\n required: false,\n default: false\n }\n },\n emits: [\"update:employeeData\", \"update:timeblocks\", \"clearEmployee\", \"addTimeblock\"],\n setup(__props, {\n expose: __expose,\n emit: __emit\n }) {\n const props = __props;\n const emit = __emit;\n const store = (0,vuex__WEBPACK_IMPORTED_MODULE_4__.useStore)();\n // Local models with v-model sync\n const employeeDataLocal = (0,vue__WEBPACK_IMPORTED_MODULE_3__.computed)({\n get: () => props.employeeData,\n set: value => emit('update:employeeData', value)\n });\n // Refs for validation\n const employeeSelectRef = (0,vue__WEBPACK_IMPORTED_MODULE_3__.ref)(null);\n const timeblockRefs = (0,vue__WEBPACK_IMPORTED_MODULE_3__.ref)([]);\n const setTimeblockRef = (el, index) => {\n if (el) {\n timeblockRefs.value[index] = el;\n }\n };\n // Get the full employee object from store\n const selectedEmployee = (0,vue__WEBPACK_IMPORTED_MODULE_3__.computed)(() => {\n if (!props.employeeData.id) return null;\n const employees = store.getters['tm/enrichedEmployees'];\n return employees.find(emp => emp.id === props.employeeData.id) || null;\n });\n // Filter allTimeblocks to only include timeblocks for current employee\n const allTimeblocksForCurrentEmployee = (0,vue__WEBPACK_IMPORTED_MODULE_3__.computed)(() => {\n if (!props.employeeData.id) return [];\n return props.allTimeblocks.filter(tb => tb.employee_id === props.employeeData.id);\n });\n // Watch for when employee is selected and ensure at least one timeblock exists\n (0,vue__WEBPACK_IMPORTED_MODULE_3__.watch)(() => props.employeeData.id, (newId, oldId) => {\n // If employee just got selected (id changed from null/undefined to a value)\n // and there are no timeblocks for this employee, request one to be added\n if (newId && !oldId && props.timeblocks.length === 0) {\n (0,vue__WEBPACK_IMPORTED_MODULE_3__.nextTick)(() => {\n emit('addTimeblock', -1);\n });\n }\n }, {\n flus Line truncated eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/esnext.iterator.constructor.js */ \"./node_modules/core-js/modules/esnext.iterator.constructor.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/esnext.iterator.filter.js */ \"./node_modules/core-js/modules/esnext.iterator.filter.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_esnext_iterator_find_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/esnext.iterator.find.js */ \"./node_modules/core-js/modules/esnext.iterator.find.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_find_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_find_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.runtime.esm-bundler.js\");\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm-bundler.js\");\n/* harmony import */ var _a_employee_select_vue__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./a-employee-select.vue */ \"./src/plugins/tm@modal/task/_components/employees/a-employee-select.vue\");\n/* harmony import */ var _a_employee_timeblock_vue__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./a-employee-timeblock.vue */ \"./src/plugins/tm@modal/task/_components/employees/a-employee-timeblock.vue\");\n\n\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (/*@__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_3__.defineComponent)({\n __name: 'a-employee',\n props: {\n employeeData: {\n type: Object,\n required: true\n },\n timeblocks: {\n type: Array,\n required: false,\n default: () => []\n },\n allTimeblocks: {\n type: Array,\n required: false,\n default: () => []\n },\n deletedTimeblockIds: {\n type: Array,\n required: false,\n default: () => []\n },\n customFilter: {\n type: Function,\n required: false,\n default: undefined\n },\n hasBackground: {\n type: Boolean,\n required: false,\n default: true\n },\n required: {\n type: Boolean,\n required: false,\n default: false\n }\n },\n emits: [\"update:employeeData\", \"update:timeblocks\", \"clearEmployee\", \"addTimeblock\"],\n setup(__props, {\n expose: __expose,\n emit: __emit\n }) {\n const props = __props;\n const emit = __emit;\n const store = (0,vuex__WEBPACK_IMPORTED_MODULE_4__.useStore)();\n // Local models with v-model sync\n const employeeDataLocal = (0,vue__WEBPACK_IMPORTED_MODULE_3__.computed)({\n get: () => props.employeeData,\n set: value => emit('update:employeeData', value)\n });\n // Refs for validation\n const employeeSelectRef = (0,vue__WEBPACK_IMPORTED_MODULE_3__.ref)(null);\n const timeblockRefs = (0,vue__WEBPACK_IMPORTED_MODULE_3__.ref)([]);\n const setTimeblockRef = (el, index) => {\n if (el) {\n timeblockRefs.value[index] = el;\n }\n };\n // Get the full employee object from store\n const selectedEmployee = (0,vue__WEBPACK_IMPORTED_MODULE_3__.computed)(() => {\n if (!props.employeeData.id) return null;\n const employees = store.getters['tm/enrichedEmployees'];\n return employees.find(emp => emp.id == props.employeeData.id) || null;\n });\n // Filter allTimeblocks to only include timeblocks for current employee\n const allTimeblocksForCurrentEmployee = (0,vue__WEBPACK_IMPORTED_MODULE_3__.computed)(() => {\n if (!props.employeeData.id) return [];\n return props.allTimeblocks.filter(tb => tb.employee_id == props.employeeData.id);\n });\n // Watch for when employee is selected and ensure at least one timeblock exists\n (0,vue__WEBPACK_IMPORTED_MODULE_3__.watch)(() => props.employeeData.id, (newId, oldId) => {\n // If employee just got selected (id changed from null/undefined to a value)\n // and there are no timeblocks for this employee, request one to be added\n if (newId && !oldId && props.timeblocks.length === 0) {\n (0,vue__WEBPACK_IMPORTED_MODULE_3__.nextTick)(() => {\n emit('addTimeblock', -1);\n });\n }\n }, {\n flush: Line truncated
/***/ }), /***/ }),
@@ -1254,7 +1254,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var cor
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict"; "use strict";
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ render: function() { return /* binding */ render; }\n/* harmony export */ });\n/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/esnext.iterator.constructor.js */ \"./node_modules/core-js/modules/esnext.iterator.constructor.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/esnext.iterator.map.js */ \"./node_modules/core-js/modules/esnext.iterator.map.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.runtime.esm-bundler.js\");\n/* harmony import */ var vuetify_lib_components_VAutocomplete_index_mjs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! vuetify/lib/components/VAutocomplete/index.mjs */ \"./node_modules/vuetify/lib/components/VAutocomplete/VAutocomplete.mjs\");\n/* harmony import */ var vuetify_lib_components_VIcon_index_mjs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! vuetify/lib/components/VIcon/index.mjs */ \"./node_modules/vuetify/lib/components/VIcon/VIcon.mjs\");\n/* harmony import */ var vuetify_lib_components_VTextField_index_mjs__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! vuetify/lib/components/VTextField/index.mjs */ \"./node_modules/vuetify/lib/components/VTextField/VTextField.mjs\");\n\n\n\nconst _hoisted_1 = {\n class: \"employee-select\"\n};\nconst _hoisted_2 = {\n class: \"employee-select__duration-container\"\n};\nconst _hoisted_3 = [\"disabled\"];\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n \n \n \n return (0,vue__WEBPACK_IMPORTED_MODULE_2__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_2__.createElementBlock)(\"div\", _hoisted_1, [(0,vue__WEBPACK_IMPORTED_MODULE_2__.createVNode)(vuetify_lib_components_VAutocomplete_index_mjs__WEBPACK_IMPORTED_MODULE_3__.VAutocomplete, {\n \"model-value\": $setup.modelValue.id,\n \"custom-filter\": $props.customFilter,\n \"match-any\": true,\n label: \"Priradený\",\n items: $setup.enrichedEmployees,\n \"item-title\": \"_fullName\",\n \"item-value\": \"id\",\n variant: \"solo\",\n class: (0,vue__WEBPACK_IMPORTED_MODULE_2__.normalizeClass)([\"employee-select__select-field\", {\n error: $setup.v$.id.$error\n }]),\n \"error-messages\": $setup.v$.id.$errors.map(e => String(e.$message)),\n \"onUpdate:modelValue\": $setup.handleUpdateEmployee\n }, null, 8 /* PROPS */, [\"model-value\", \"custom-filter\", \"items\", \"class\", \"error-messages\"]), (0,vue__WEBPACK_IMPORTED_MODULE_2__.createElementVNode)(\"div\", _hoisted_2, [(0,vue__WEBPACK_IMPORTED_MODULE_2__.createVNode)(vuetify_lib_components_VTextField_index_mjs__WEBPACK_IMPORTED_MODULE_5__.VTextField, {\n \"model-value\": $setup.modelValue.duration,\n class: (0,vue__WEBPACK_IMPORTED_MODULE_2__.normalizeClass)([\"employee-select__duration-field\", {\n error: $setup.v$.duration.$error\n }]),\n variant: \"solo\",\n type: \"number\",\n label: \"Časový odhad\",\n \"error-messages\": $setup.v$.duration.$errors.map(e => String(e.$message)),\n \"append-inner-icon\": \"mdi-clock-outline\",\n \"onUpdate:modelValue\": $setup.handleUpdateDuration\n }, null, 8 /* PROPS */, [\"model-value\", \"class\", \"error-messages\"]), (0,vue__WEBPACK_IMPORTED_MODULE_2__.createElementVNode)(\"button\", {\n class: \"employee-select__delete-button\",\n disabled: !$setup.modelValue.id,\n onClick: $setup.handleClearEmployee\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_2__.createVNode)(vuetify_lib_components_VIcon_index_mjs__WEBPACK_IMPORTED_MODULE_4__.VIcon, {\n icon: \"mdi-close\"\n })], 8 /* PROPS */, _hoisted_3)])]);\n}\n\n/* Vuetify */\n\n\n\n\n\n\n//# sourceURL=webpack://jandl/./src/plugins/tm@modal/task/_components/employees/a-employee-select.vue?./node_modules/webpack-plugin-vuetify/dist/scriptLoader.js!./node_modules/babel-loader/lib/index.js!./node_modules/ts-loader/index.js??clonedRuleSet-41.use%5B1%5D!./node_modules/vue-loader/dist/templateLoader.js??ruleSet%5B1%5D.rules%5B5%5D!./node_modules/vue-loader/dist/index.js??ruleSet%5B0%5D.use%5B0%5D\n}"); eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ render: function() { return /* binding */ render; }\n/* harmony export */ });\n/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/esnext.iterator.constructor.js */ \"./node_modules/core-js/modules/esnext.iterator.constructor.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/esnext.iterator.map.js */ \"./node_modules/core-js/modules/esnext.iterator.map.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.runtime.esm-bundler.js\");\n/* harmony import */ var vuetify_lib_components_VAutocomplete_index_mjs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! vuetify/lib/components/VAutocomplete/index.mjs */ \"./node_modules/vuetify/lib/components/VAutocomplete/VAutocomplete.mjs\");\n/* harmony import */ var vuetify_lib_components_VIcon_index_mjs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! vuetify/lib/components/VIcon/index.mjs */ \"./node_modules/vuetify/lib/components/VIcon/VIcon.mjs\");\n/* harmony import */ var vuetify_lib_components_VTextField_index_mjs__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! vuetify/lib/components/VTextField/index.mjs */ \"./node_modules/vuetify/lib/components/VTextField/VTextField.mjs\");\n\n\n\nconst _hoisted_1 = {\n class: \"employee-select\"\n};\nconst _hoisted_2 = {\n class: \"employee-select__duration-container\"\n};\nconst _hoisted_3 = [\"disabled\"];\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n \n \n \n return (0,vue__WEBPACK_IMPORTED_MODULE_2__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_2__.createElementBlock)(\"div\", _hoisted_1, [((0,vue__WEBPACK_IMPORTED_MODULE_2__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_2__.createBlock)(vuetify_lib_components_VAutocomplete_index_mjs__WEBPACK_IMPORTED_MODULE_3__.VAutocomplete, {\n key: `employee-select-${$setup.componentKey}`,\n ref: \"employeeSelectRef\",\n \"model-value\": $setup.modelValue.id,\n \"custom-filter\": $props.customFilter,\n \"match-any\": true,\n label: \"Priradený\",\n items: $setup.enrichedEmployees,\n \"item-title\": $setup.getItemTitle,\n \"item-value\": \"id\",\n variant: \"solo\",\n class: (0,vue__WEBPACK_IMPORTED_MODULE_2__.normalizeClass)([\"employee-select__select-field\", {\n error: $setup.v$.id.$error\n }]),\n \"error-messages\": $setup.v$.id.$errors.map(e => String(e.$message)),\n \"onUpdate:modelValue\": $setup.handleUpdateEmployee\n }, null, 8 /* PROPS */, [\"model-value\", \"custom-filter\", \"items\", \"class\", \"error-messages\"])), (0,vue__WEBPACK_IMPORTED_MODULE_2__.createElementVNode)(\"div\", _hoisted_2, [(0,vue__WEBPACK_IMPORTED_MODULE_2__.createVNode)(vuetify_lib_components_VTextField_index_mjs__WEBPACK_IMPORTED_MODULE_5__.VTextField, {\n \"model-value\": $setup.modelValue.duration,\n class: (0,vue__WEBPACK_IMPORTED_MODULE_2__.normalizeClass)([\"employee-select__duration-field\", {\n error: $setup.v$.duration.$error\n }]),\n variant: \"solo\",\n type: \"number\",\n label: \"Časový odhad\",\n \"error-messages\": $setup.v$.duration.$errors.map(e => String(e.$message)),\n \"append-inner-icon\": \"mdi-clock-outline\",\n \"onUpdate:modelValue\": $setup.handleUpdateDuration\n }, null, 8 /* PROPS */, [\"model-value\", \"class\", \"error-messages\"]), (0,vue__WEBPACK_IMPORTED_MODULE_2__.createElementVNode)(\"button\", {\n class: \"employee-select__delete-button\",\n disabled: !$setup.modelValue.id,\n onClick: $setup.handleClearEmployee\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_2__.createVNode)(vuetify_lib_components_VIcon_index_mjs__WEBPACK_IMPORTED_MODULE_4__.VIcon, {\n icon: \"mdi-close\"\n })], 8 /* PROPS */, _hoisted_3)])]);\n}\n\n/* Vuetify */\n\n\n\n\n\n\n//# sourceURL=webpack://jandl/./src/plugins/tm@modal/task/_components/employees/a-employee-select.vue?./node_modules/webpack-plugin-vuetify/dist/scriptLoader.js!./node_modules/babel-loader/lib/index.js!./node_modules/ts-loader/index.js??clonedRuleSet-41.use%5B1%5D!./node_modules/vue-loader/di Line truncated
/***/ }), /***/ }),
@@ -1298,7 +1298,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict"; "use strict";
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ render: function() { return /* binding */ render; }\n/* harmony export */ });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.runtime.esm-bundler.js\");\n\nconst _hoisted_1 = {\n class: \"timeline\"\n};\nconst _hoisted_2 = {\n key: 0,\n class: \"timeline-loading\"\n};\nconst _hoisted_3 = {\n key: 1,\n ref: \"timelineContainer\",\n class: \"timeline__content\"\n};\nconst _hoisted_4 = {\n ref: \"timelineScroll\",\n class: \"timeline-scroll\"\n};\nconst _hoisted_5 = {\n class: \"timeline-bar\"\n};\nconst _hoisted_6 = [\"title\"];\nconst _hoisted_7 = {\n key: 0,\n class: \"timeblock-duration\"\n};\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", _hoisted_1, [$props.isLoading ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", _hoisted_2, [...(_cache[0] || (_cache[0] = [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", null, \"Načítavam...\", -1 /* CACHED */)]))])) : ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", _hoisted_3, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_4, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)($setup[\"AEmployeeTimeblockTimelineHeader\"], {\n \"start-hour\": $props.startHour,\n \"end-hour\": $props.endHour,\n \"hour-width\": $props.hourWidth\n }, null, 8 /* PROPS */, [\"start-hour\", \"end-hour\", \"hour-width\"]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_5, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\" Non-working hours - before work \"), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", {\n class: \"non-working-hours\",\n style: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeStyle)({\n left: '0px',\n width: `${$setup.getHourPosition($props.employee.work_start)}px`\n })\n }, null, 4 /* STYLE */), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\" Non-working hours - after work \"), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", {\n class: \"non-working-hours\",\n style: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeStyle)({\n left: `${$setup.getHourPosition($props.employee.work_end)}px`,\n width: `${$setup.getHourWidth(24 - $props.employee.work_end)}px`\n })\n }, null, 4 /* STYLE */), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\" Work hours background (transparent/white) \"), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", {\n class: \"work-hours-bar\",\n style: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeStyle)({\n left: `${$setup.getHourPosition($props.employee.work_start)}px`,\n width: `${$setup.getHourWidth($props.employee.work_end - $props.employee.work_start)}px`\n })\n }, null, 4 /* STYLE */), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\" Existing scheduled blocks \"), ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.renderList)($props.scheduledBlocks, (task, index) => {\n return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", {\n key: `task-${index}`,\n class: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)([\"scheduled-block\", {\n 'scheduled-block--blocker': ['blocker', 'adhoc', 'home_office', 'vacation', 'free_day', 'office365_blocker'].includes(task.type)\n }]),\n style: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeStyle)({\n left: `${$setup.getTimePosition(task._real_start)}px`,\n width: `${$setup.getTimeWidth(task._real_start, task._real_end)}px`\n }),\n title: `${task.subtask?.title || task.blocker?.type || 'Task'}`\n }, null, 14 /* CLASS, STYLE, PROPS */, _hoisted_6);\n }), 128 /* KEYED_FRAGMENT */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\" Other timeblocks for same date \"), ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.renderList)($setup.otherTimeblocksRendered, (timeblock, index) => {\n return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", {\n key: `other-${index}`,\n class: \"other-timeblock\",\n style: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeStyle)({\n left: `${$setup.getTimePosition(timeblockLine truncated eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ render: function() { return /* binding */ render; }\n/* harmony export */ });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.runtime.esm-bundler.js\");\n\nconst _hoisted_1 = {\n class: \"timeline\"\n};\nconst _hoisted_2 = {\n key: 0,\n class: \"timeline-loading\"\n};\nconst _hoisted_3 = {\n key: 1,\n ref: \"timelineContainer\",\n class: \"timeline__content\"\n};\nconst _hoisted_4 = {\n ref: \"timelineScroll\",\n class: \"timeline-scroll\"\n};\nconst _hoisted_5 = [\"title\"];\nconst _hoisted_6 = {\n class: \"preview-time-label\"\n};\nconst _hoisted_7 = {\n key: 0\n};\nconst _hoisted_8 = {\n key: 1\n};\nconst _hoisted_9 = {\n key: 0,\n class: \"timeblock-duration\"\n};\nconst _hoisted_10 = {\n key: 0,\n class: \"preview-time-label\"\n};\nconst _hoisted_11 = {\n key: 1,\n class: \"preview-time-label\"\n};\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", _hoisted_1, [$props.isLoading ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", _hoisted_2, [...(_cache[2] || (_cache[2] = [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", null, \"Načítavam...\", -1 /* CACHED */)]))])) : ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", _hoisted_3, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_4, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)($setup[\"AEmployeeTimeblockTimelineHeader\"], {\n \"start-hour\": $props.startHour,\n \"end-hour\": $props.endHour,\n \"hour-width\": $props.hourWidth\n }, null, 8 /* PROPS */, [\"start-hour\", \"end-hour\", \"hour-width\"]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", {\n ref: \"timelineBar\",\n class: \"timeline-bar\",\n onMousemove: $setup.handleMouseMove,\n onMouseleave: $setup.handleMouseLeave,\n onMousedown: $setup.handleMouseDown\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\" Non-working hours - before work \"), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", {\n class: \"non-working-hours\",\n style: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeStyle)({\n left: '0px',\n width: `${$setup.getHourPosition($props.employee.work_start)}px`\n })\n }, null, 4 /* STYLE */), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\" Non-working hours - after work \"), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", {\n class: \"non-working-hours\",\n style: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeStyle)({\n left: `${$setup.getHourPosition($props.employee.work_end)}px`,\n width: `${$setup.getHourWidth(24 - $props.employee.work_end)}px`\n })\n }, null, 4 /* STYLE */), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\" Work hours background (transparent/white) \"), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", {\n class: \"work-hours-bar\",\n style: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeStyle)({\n left: `${$setup.getHourPosition($props.employee.work_start)}px`,\n width: `${$setup.getHourWidth($props.employee.work_end - $props.employee.work_start)}px`\n })\n }, null, 4 /* STYLE */), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\" Existing scheduled blocks \"), ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.renderList)($props.scheduledBlocks, (task, index) => {\n return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", {\n key: `task-${index}`,\n class: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)([\"scheduled-block\", {\n 'scheduled-block--blocker': ['blocker', 'adhoc', 'home_office', 'vacation', 'free_day', 'office365_blocker'].includes(task.type)\n }]),\n style: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeStyle)({\n left: `${$setup.getTimePosition(task._real_start)}px`,\n width: `${$setup.getTimeWidth(task._real_start, task._real_end)}px`\n }),\n title: `${task.subtask?.title || task.blocker?.type || 'Task'}`\n }, null, 14 /* CLASS, STYLE, PROPS */, _hoisted_5);\n }), 128 /* KEYED_FRAGMENT */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\" Other timeblocks for same date \"), ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, (0,vue__WEBPACK_Line truncated
/***/ }), /***/ }),
@@ -1309,7 +1309,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict"; "use strict";
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ render: function() { return /* binding */ render; }\n/* harmony export */ });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.runtime.esm-bundler.js\");\n\nconst _hoisted_1 = {\n class: \"timeblock\"\n};\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", _hoisted_1, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)($setup[\"AEmployeeTimeblockHeader\"], {\n \"model-value\": $props.modelValue,\n \"min-date\": $setup.minDate,\n deletable: $props.deletable,\n \"is-editable\": $setup.isEditable,\n \"is-time-range-valid\": $setup.isTimeRangeValid,\n collision: $setup.collision,\n \"has-validation-errors\": $setup.v$.$error && $setup.v$.$anyDirty,\n \"has-start-time-error\": $setup.hasStartTimeError,\n \"has-end-time-error\": $setup.hasEndTimeError,\n \"end-time-error-message\": $setup.endTimeErrorMessage,\n \"planned-time\": $setup._scheduledTime,\n \"free-time\": $setup._freeTime,\n employee: $props.employee,\n index: $props.index,\n onPreviousDay: $setup.previousDay,\n onNextDay: $setup.nextDay,\n onUpdateDate: $setup.updateDate,\n onUpdateStartTime: $setup.updateStartTime,\n onUpdateEndTime: $setup.updateEndTime,\n onAddTimeblock: _cache[0] || (_cache[0] = $event => _ctx.$emit('addTimeblock')),\n onRemoveTimeblock: _cache[1] || (_cache[1] = $event => _ctx.$emit('removeTimeblock'))\n }, null, 8 /* PROPS */, [\"model-value\", \"min-date\", \"deletable\", \"is-editable\", \"is-time-range-valid\", \"collision\", \"has-validation-errors\", \"has-start-time-error\", \"has-end-time-error\", \"end-time-error-message\", \"planned-time\", \"free-time\", \"employee\", \"index\"]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\" Timeline Visualization \"), $props.modelValue.date && $props.employee ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)($setup[\"AEmployeeTimeblockTimeline\"], {\n key: 0,\n ref: \"timelineRef\",\n \"is-loading\": $setup.isLoading,\n employee: $props.employee,\n \"scheduled-blocks\": $setup.scheduledBlocks,\n \"other-timeblocks\": $setup.otherTimeblocksForSameDate,\n \"current-timeblock-range\": $setup.currentTimeblockRange,\n collision: $setup.collision,\n \"collision-segments\": $setup.collisionSegments,\n \"timeblock-duration\": $setup.timeblockDuration,\n \"start-hour\": $setup.START_HOUR,\n \"end-hour\": $setup.END_HOUR,\n \"hour-width\": $setup.hourWidth\n }, null, 8 /* PROPS */, [\"is-loading\", \"employee\", \"scheduled-blocks\", \"other-timeblocks\", \"current-timeblock-range\", \"collision\", \"collision-segments\", \"timeblock-duration\", \"hour-width\"])) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true)]);\n}\n\n//# sourceURL=webpack://jandl/./src/plugins/tm@modal/task/_components/employees/a-employee-timeblock.vue?./node_modules/webpack-plugin-vuetify/dist/scriptLoader.js!./node_modules/babel-loader/lib/index.js!./node_modules/ts-loader/index.js??clonedRuleSet-41.use%5B1%5D!./node_modules/vue-loader/dist/templateLoader.js??ruleSet%5B1%5D.rules%5B5%5D!./node_modules/vue-loader/dist/index.js??ruleSet%5B0%5D.use%5B0%5D\n}"); eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ render: function() { return /* binding */ render; }\n/* harmony export */ });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.runtime.esm-bundler.js\");\n\nconst _hoisted_1 = {\n class: \"timeblock\"\n};\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", _hoisted_1, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)($setup[\"AEmployeeTimeblockHeader\"], {\n \"model-value\": $props.modelValue,\n \"min-date\": $setup.minDate,\n deletable: $props.deletable,\n \"is-editable\": $setup.isEditable,\n \"is-time-range-valid\": $setup.isTimeRangeValid,\n collision: $setup.collision,\n \"has-validation-errors\": $setup.v$.$error && $setup.v$.$anyDirty,\n \"has-start-time-error\": $setup.hasStartTimeError,\n \"has-end-time-error\": $setup.hasEndTimeError,\n \"end-time-error-message\": $setup.endTimeErrorMessage,\n \"planned-time\": $setup._scheduledTime,\n \"free-time\": $setup._freeTime,\n employee: $props.employee,\n index: $props.index,\n onPreviousDay: $setup.previousDay,\n onNextDay: $setup.nextDay,\n onUpdateDate: $setup.updateDate,\n onUpdateStartTime: $setup.updateStartTime,\n onUpdateEndTime: $setup.updateEndTime,\n onAddTimeblock: _cache[0] || (_cache[0] = $event => _ctx.$emit('addTimeblock')),\n onRemoveTimeblock: _cache[1] || (_cache[1] = $event => _ctx.$emit('removeTimeblock'))\n }, null, 8 /* PROPS */, [\"model-value\", \"min-date\", \"deletable\", \"is-editable\", \"is-time-range-valid\", \"collision\", \"has-validation-errors\", \"has-start-time-error\", \"has-end-time-error\", \"end-time-error-message\", \"planned-time\", \"free-time\", \"employee\", \"index\"]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\" Timeline Visualization \"), $props.modelValue.date && $props.employee ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)($setup[\"AEmployeeTimeblockTimeline\"], {\n key: 0,\n ref: \"timelineRef\",\n \"is-loading\": $setup.isLoading,\n employee: $props.employee,\n \"scheduled-blocks\": $setup.scheduledBlocks,\n \"other-timeblocks\": $setup.otherTimeblocksForSameDate,\n \"current-timeblock-range\": $setup.currentTimeblockRange,\n collision: $setup.collision,\n \"collision-segments\": $setup.collisionSegments,\n \"timeblock-duration\": $setup.timeblockDuration,\n \"start-hour\": $setup.START_HOUR,\n \"end-hour\": $setup.END_HOUR,\n \"hour-width\": $setup.hourWidth,\n onTimeblockUpdated: $setup.handleTimeblockUpdated\n }, null, 8 /* PROPS */, [\"is-loading\", \"employee\", \"scheduled-blocks\", \"other-timeblocks\", \"current-timeblock-range\", \"collision\", \"collision-segments\", \"timeblock-duration\", \"hour-width\"])) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true)]);\n}\n\n//# sourceURL=webpack://jandl/./src/plugins/tm@modal/task/_components/employees/a-employee-timeblock.vue?./node_modules/webpack-plugin-vuetify/dist/scriptLoader.js!./node_modules/babel-loader/lib/index.js!./node_modules/ts-loader/index.js??clonedRuleSet-41.use%5B1%5D!./node_modules/vue-loader/dist/templateLoader.js??ruleSet%5B1%5D.rules%5B5%5D!./node_modules/vue-loader/dist/index.js??ruleSet%5B0%5D.use%5B0%5D\n}");
/***/ }), /***/ }),
@@ -1760,7 +1760,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict"; "use strict";
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ render: function() { return /* binding */ render; }\n/* harmony export */ });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.runtime.esm-bundler.js\");\n/* harmony import */ var vuetify_lib_components_VBtn_index_mjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vuetify/lib/components/VBtn/index.mjs */ \"./node_modules/vuetify/lib/components/VBtn/VBtn.mjs\");\n/* harmony import */ var vuetify_lib_components_VCard_index_mjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vuetify/lib/components/VCard/index.mjs */ \"./node_modules/vuetify/lib/components/VCard/VCard.mjs\");\n/* harmony import */ var vuetify_lib_components_VCard_index_mjs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! vuetify/lib/components/VCard/index.mjs */ \"./node_modules/vuetify/lib/components/VCard/VCardActions.mjs\");\n/* harmony import */ var vuetify_lib_components_VCard_index_mjs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! vuetify/lib/components/VCard/index.mjs */ \"./node_modules/vuetify/lib/components/VCard/VCardText.mjs\");\n/* harmony import */ var vuetify_lib_components_VDialog_index_mjs__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! vuetify/lib/components/VDialog/index.mjs */ \"./node_modules/vuetify/lib/components/VDialog/VDialog.mjs\");\n/* harmony import */ var vuetify_lib_components_VGrid_index_mjs__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! vuetify/lib/components/VGrid/index.mjs */ \"./node_modules/vuetify/lib/components/VGrid/VCol.mjs\");\n/* harmony import */ var vuetify_lib_components_VGrid_index_mjs__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! vuetify/lib/components/VGrid/index.mjs */ \"./node_modules/vuetify/lib/components/VGrid/VRow.mjs\");\n/* harmony import */ var vuetify_lib_components_VIcon_index_mjs__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! vuetify/lib/components/VIcon/index.mjs */ \"./node_modules/vuetify/lib/components/VIcon/VIcon.mjs\");\n/* harmony import */ var vuetify_lib_components_VSheet_index_mjs__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! vuetify/lib/components/VSheet/index.mjs */ \"./node_modules/vuetify/lib/components/VSheet/VSheet.mjs\");\n\nconst _hoisted_1 = {\n class: \"d-flex align-center\"\n};\nconst _hoisted_2 = {\n key: 0,\n class: \"d-flex align-center mb-3\"\n};\nconst _hoisted_3 = {\n class: \"d-flex align-center mb-2\"\n};\nconst _hoisted_4 = {\n key: 0,\n class: \"existing-timeblock-timeline ml-8\"\n};\nconst _hoisted_5 = {\n class: \"d-flex justify-space-between align-center pa-4\"\n};\nconst _hoisted_6 = {\n class: \"d-flex justify-space-between align-center\"\n};\nconst _hoisted_7 = {\n class: \"text-red\"\n};\nconst _hoisted_8 = {\n class: \"text-black\"\n};\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n \n \n \n const _component_a_employee_timeblock_timeline = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)(\"a-employee-timeblock-timeline\");\n \n const _component_a_employee_timeblock = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)(\"a-employee-timeblock\");\n \n \n \n \n \n return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(vuetify_lib_components_VGrid_index_mjs__WEBPACK_IMPORTED_MODULE_7__.VRow, {\n \"no-gutters\": \"\"\n }, {\n default: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(() => [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(vuetify_lib_components_VGrid_index_mjs__WEBPACK_IMPORTED_MODULE_6__.VCol, {\n cols: \"5\"\n }, {\n default: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(() => [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(vuetify_lib_components_VSheet_index_mjs__WEBPACK_IMPORTED_MODULE_9__.VSheet, {\n class: \"py-3\"\n }, {\n default: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(() => [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_1, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(vuetify_lib_components_VIcon_index_mjs__WEBPACK_IMPORTED_MODULE_8__.VIcon, {\n icon: \"mdi-calendar-week\",\n size: \"large\"\n }), _cache[9] || (_cache[9] = (0,vue__WEBPACK_IMPORLine truncated eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ render: function() { return /* binding */ render; }\n/* harmony export */ });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.runtime.esm-bundler.js\");\n/* harmony import */ var vuetify_lib_components_VBtn_index_mjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vuetify/lib/components/VBtn/index.mjs */ \"./node_modules/vuetify/lib/components/VBtn/VBtn.mjs\");\n/* harmony import */ var vuetify_lib_components_VCard_index_mjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vuetify/lib/components/VCard/index.mjs */ \"./node_modules/vuetify/lib/components/VCard/VCard.mjs\");\n/* harmony import */ var vuetify_lib_components_VCard_index_mjs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! vuetify/lib/components/VCard/index.mjs */ \"./node_modules/vuetify/lib/components/VCard/VCardActions.mjs\");\n/* harmony import */ var vuetify_lib_components_VCard_index_mjs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! vuetify/lib/components/VCard/index.mjs */ \"./node_modules/vuetify/lib/components/VCard/VCardText.mjs\");\n/* harmony import */ var vuetify_lib_components_VDialog_index_mjs__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! vuetify/lib/components/VDialog/index.mjs */ \"./node_modules/vuetify/lib/components/VDialog/VDialog.mjs\");\n/* harmony import */ var vuetify_lib_components_VGrid_index_mjs__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! vuetify/lib/components/VGrid/index.mjs */ \"./node_modules/vuetify/lib/components/VGrid/VCol.mjs\");\n/* harmony import */ var vuetify_lib_components_VGrid_index_mjs__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! vuetify/lib/components/VGrid/index.mjs */ \"./node_modules/vuetify/lib/components/VGrid/VRow.mjs\");\n/* harmony import */ var vuetify_lib_components_VIcon_index_mjs__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! vuetify/lib/components/VIcon/index.mjs */ \"./node_modules/vuetify/lib/components/VIcon/VIcon.mjs\");\n/* harmony import */ var vuetify_lib_components_VSheet_index_mjs__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! vuetify/lib/components/VSheet/index.mjs */ \"./node_modules/vuetify/lib/components/VSheet/VSheet.mjs\");\n\nconst _hoisted_1 = {\n class: \"d-flex align-center\"\n};\nconst _hoisted_2 = {\n key: 0,\n class: \"d-flex align-center mb-3\"\n};\nconst _hoisted_3 = {\n class: \"d-flex align-center mb-2\"\n};\nconst _hoisted_4 = {\n class: \"d-flex justify-space-between align-center pa-4\"\n};\nconst _hoisted_5 = {\n class: \"d-flex justify-space-between align-center\"\n};\nconst _hoisted_6 = {\n class: \"text-red\"\n};\nconst _hoisted_7 = {\n class: \"text-black\"\n};\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n \n \n \n \n const _component_a_employee_timeblock = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)(\"a-employee-timeblock\");\n \n \n \n \n \n return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(vuetify_lib_components_VGrid_index_mjs__WEBPACK_IMPORTED_MODULE_7__.VRow, {\n \"no-gutters\": \"\"\n }, {\n default: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(() => [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(vuetify_lib_components_VGrid_index_mjs__WEBPACK_IMPORTED_MODULE_6__.VCol, {\n cols: \"5\"\n }, {\n default: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(() => [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(vuetify_lib_components_VSheet_index_mjs__WEBPACK_IMPORTED_MODULE_9__.VSheet, {\n class: \"py-3\"\n }, {\n default: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(() => [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_1, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(vuetify_lib_components_VIcon_index_mjs__WEBPACK_IMPORTED_MODULE_8__.VIcon, {\n icon: \"mdi-calendar-week\",\n size: \"large\"\n }), _cache[9] || (_cache[9] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"p\", {\n class: \"mx-3\"\n }, \"Trvanie\", -1 /* CACHED */))])]),\n _: 1 /* STABLE */\n })]),\n _: 1 /* STABLE */\n }), (0,vue__WEBPACK_IMPORTED_MODULE_0Line truncated
/***/ }), /***/ }),
@@ -1848,7 +1848,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict"; "use strict";
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ render: function() { return /* binding */ render; }\n/* harmony export */ });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.runtime.esm-bundler.js\");\n/* harmony import */ var vuetify_lib_components_VAutocomplete_index_mjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vuetify/lib/components/VAutocomplete/index.mjs */ \"./node_modules/vuetify/lib/components/VAutocomplete/VAutocomplete.mjs\");\n/* harmony import */ var vuetify_lib_components_VBtn_index_mjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vuetify/lib/components/VBtn/index.mjs */ \"./node_modules/vuetify/lib/components/VBtn/VBtn.mjs\");\n/* harmony import */ var vuetify_lib_components_VCard_index_mjs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! vuetify/lib/components/VCard/index.mjs */ \"./node_modules/vuetify/lib/components/VCard/VCard.mjs\");\n/* harmony import */ var vuetify_lib_components_VCard_index_mjs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! vuetify/lib/components/VCard/index.mjs */ \"./node_modules/vuetify/lib/components/VCard/VCardActions.mjs\");\n/* harmony import */ var vuetify_lib_components_VDialog_index_mjs__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! vuetify/lib/components/VDialog/index.mjs */ \"./node_modules/vuetify/lib/components/VDialog/VDialog.mjs\");\n/* harmony import */ var vuetify_lib_components_VTextField_index_mjs__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! vuetify/lib/components/VTextField/index.mjs */ \"./node_modules/vuetify/lib/components/VTextField/VTextField.mjs\");\n\nconst _hoisted_1 = {\n class: \"d-flex justify-space-between align-center modal-header\"\n};\nconst _hoisted_2 = {\n class: \"d-flex align-center\"\n};\nconst _hoisted_3 = {\n class: \"splitted-inputs\"\n};\nconst _hoisted_4 = {\n class: \"left\"\n};\nconst _hoisted_5 = {\n class: \"w-100 modal-input quill-editor-wrapper\"\n};\nconst _hoisted_6 = {\n class: \"d-flex justify-space-between align-center\"\n};\nconst _hoisted_7 = {\n class: \"d-flex align-center\"\n};\nconst _hoisted_8 = {\n class: \"d-flex justify-space-between align-center modal-header border-bottom pb-4\"\n};\nconst _hoisted_9 = {\n class: \"d-flex justify-start\"\n};\nconst _hoisted_10 = [\"src\"];\nconst _hoisted_11 = [\"src\"];\nconst _hoisted_12 = {\n class: \"w-100\"\n};\nconst _hoisted_13 = {\n class: \"d-flex justify-start align-center mt-8\"\n};\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_z_remove_employee_modal = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)(\"z-remove-employee-modal\");\n const _component_z_remove_timeblock_modal = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)(\"z-remove-timeblock-modal\");\n const _component_a_reset_size_button = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)(\"a-reset-size-button\");\n const _component_a_close_button = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)(\"a-close-button\");\n \n \n const _component_Z_datepicker = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)(\"Z-datepicker\");\n const _component_A_employee = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)(\"A-employee\");\n const _component_QuillEditor = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)(\"QuillEditor\");\n const _component_Z_files_upload = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)(\"Z-files-upload\");\n \n \n const _component_a_resize_handle = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)(\"a-resize-handle\");\n \n const _component_Z_task_readonly_info = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)(\"Z-task-readonly-info\");\n const _component_W_loadable = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)(\"W-loadable\");\n \n return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_z_remove_employee_modal, {\n ref: \"removeEmployeeModal\",\n onConfirm: $options.confirmRemoveEmployee\n }, null, 8 /* PROPS */, [\"onConfirm\"]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_z_remove_timeblock_modal, {\n ref: \"removeTimeblockModal\"\n }, null, 512 /* NEED_PATCH */), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(vuetify_lib_components_VDialog_index_mjs__WEBPACK_IMPORTED_MODULE_5__.VDialLine truncated eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ render: function() { return /* binding */ render; }\n/* harmony export */ });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.runtime.esm-bundler.js\");\n/* harmony import */ var vuetify_lib_components_VAutocomplete_index_mjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vuetify/lib/components/VAutocomplete/index.mjs */ \"./node_modules/vuetify/lib/components/VAutocomplete/VAutocomplete.mjs\");\n/* harmony import */ var vuetify_lib_components_VBtn_index_mjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vuetify/lib/components/VBtn/index.mjs */ \"./node_modules/vuetify/lib/components/VBtn/VBtn.mjs\");\n/* harmony import */ var vuetify_lib_components_VCard_index_mjs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! vuetify/lib/components/VCard/index.mjs */ \"./node_modules/vuetify/lib/components/VCard/VCard.mjs\");\n/* harmony import */ var vuetify_lib_components_VCard_index_mjs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! vuetify/lib/components/VCard/index.mjs */ \"./node_modules/vuetify/lib/components/VCard/VCardActions.mjs\");\n/* harmony import */ var vuetify_lib_components_VDialog_index_mjs__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! vuetify/lib/components/VDialog/index.mjs */ \"./node_modules/vuetify/lib/components/VDialog/VDialog.mjs\");\n/* harmony import */ var vuetify_lib_components_VTextField_index_mjs__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! vuetify/lib/components/VTextField/index.mjs */ \"./node_modules/vuetify/lib/components/VTextField/VTextField.mjs\");\n\nconst _hoisted_1 = {\n class: \"d-flex justify-space-between align-center modal-header\"\n};\nconst _hoisted_2 = {\n class: \"d-flex align-center\"\n};\nconst _hoisted_3 = {\n class: \"splitted-inputs\"\n};\nconst _hoisted_4 = {\n class: \"left\"\n};\nconst _hoisted_5 = {\n class: \"w-100 modal-input quill-editor-wrapper\"\n};\nconst _hoisted_6 = {\n class: \"d-flex justify-space-between align-center\"\n};\nconst _hoisted_7 = {\n class: \"d-flex align-center\"\n};\nconst _hoisted_8 = {\n class: \"d-flex justify-space-between align-center modal-header border-bottom pb-4\"\n};\nconst _hoisted_9 = {\n class: \"d-flex justify-start\"\n};\nconst _hoisted_10 = [\"src\"];\nconst _hoisted_11 = [\"src\"];\nconst _hoisted_12 = {\n class: \"w-100\"\n};\nconst _hoisted_13 = {\n class: \"d-flex justify-start align-center mt-8\"\n};\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_z_remove_employee_modal = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)(\"z-remove-employee-modal\");\n const _component_z_remove_timeblock_modal = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)(\"z-remove-timeblock-modal\");\n const _component_a_reset_size_button = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)(\"a-reset-size-button\");\n const _component_a_close_button = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)(\"a-close-button\");\n \n \n const _component_Z_datepicker = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)(\"Z-datepicker\");\n const _component_A_employee = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)(\"A-employee\");\n const _component_QuillEditor = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)(\"QuillEditor\");\n const _component_Z_files_upload = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)(\"Z-files-upload\");\n \n \n const _component_a_resize_handle = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)(\"a-resize-handle\");\n \n const _component_Z_task_readonly_info = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)(\"Z-task-readonly-info\");\n const _component_W_loadable = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)(\"W-loadable\");\n \n return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_z_remove_employee_modal, {\n ref: \"removeEmployeeModal\",\n onConfirm: $options.confirmRemoveEmployee\n }, null, 8 /* PROPS */, [\"onConfirm\"]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_z_remove_timeblock_modal, {\n ref: \"removeTimeblockModal\"\n }, null, 512 /* NEED_PATCH */), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(vuetify_lib_components_VDialog_index_mjs__WEBPACK_IMPORTED_MODULE_5__.VDialLine truncated
/***/ }), /***/ }),
@@ -2613,7 +2613,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _st
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict"; "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 core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/esnext.iterator.constructor.js */ \"./node_modules/core-js/modules/esnext.iterator.constructor.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/esnext.iterator.filter.js */ \"./node_modules/core-js/modules/esnext.iterator.filter.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/esnext.iterator.map.js */ \"./node_modules/core-js/modules/esnext.iterator.map.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _plugins_w_custom_axios_models_axios__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/plugins/w@custom/axios/models/axios */ \"./src/plugins/w@custom/axios/models/axios.ts\");\n/* harmony import */ var _store__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/store */ \"./src/store.ts\");\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n namespaced: true,\n state: {\n mastertasks: null,\n employees: null,\n teams: null,\n projects: null,\n unscheduledSubtasks: null,\n ongoingSubtasks: null,\n initialized: false,\n ongoingSubtasksEmployeeId: null,\n unscheduledSubtasksEmployeeId: null\n },\n mutations: {\n set_mastertasks(state, mastertasks) {\n state.mastertasks = mastertasks;\n },\n set_employees(state, employees) {\n state.employees = employees;\n // TODO: Remove\n // const employee = employees.find(employee => employee.email == 'zachariah.vonrueden@jandl.sk')\n // store.commit('auth/auth_success', {\n // \tuser: employee\n // })\n },\n set_teams(state, teams) {\n state.teams = teams;\n },\n set_projects(state, projects) {\n state.projects = projects;\n },\n set_unscheduled_subtasks(state, subtasks) {\n state.unscheduledSubtasks = subtasks;\n },\n set_ongoing_subtasks(state, subtasks) {\n state.ongoingSubtasks = subtasks;\n },\n remove_ongoing_subtask(state, subtaskId) {\n state.ongoingSubtasks = state.ongoingSubtasks.filter(st => st.id != subtaskId);\n },\n update_team(state, team) {\n state.teams = state.teams.map(t => {\n if (t.id == team.id) return team;\n return t;\n });\n },\n save_team(state, team) {\n state.teams.push(team);\n },\n delete_team(state, team) {\n state.teams = state.teams.filter(t => t.id != team.id);\n },\n update_subtask(state, subtask) {\n state.unscheduledSubtasks = state.unscheduledSubtasks.map(st => st.id == subtask.id ? subtask : st);\n state.ongoingSubtasks = state.ongoingSubtasks.map(st => st.id == subtask.id ? subtask : st);\n // state.mastertasks \t\t\t= state.mastertasks.map(mastertask \t\t=> {\n // \tmastertask.subtasks \t= mastertask.subtasks.map(st => st.id == subtask.id ? subtask : st)\n // \treturn mastertask\n // })\n },\n delete_subtask(state, subtask) {\n state.unscheduledSubtasks = state.unscheduledSubtasks.filter(st => st.id != subtask.id);\n state.ongoingSubtasks = state.ongoingSubtasks.filter(st => st.id != subtask.id);\n // state.mastertasks \t\t\t= state.mastertasks.map(mastertask \t\t=> {\n // \tmastertask.subtasks = mastertask.subtasks.filter(st => st.id != subtask.id)\n // \treturn mastertask\n // })\n },\n set_ongoing_subtasks_employee_id(state, employeeId) {\n state.ongoingSubtasksEmployeeId = employeeId;\n },\n set_unscheduled_subtasks_employee_id(state, employeeId) {\n state.unscheduledSubtasksEmployeeId = employeeId;\n },\n initialized(state) {\n state.initialized = true;\n }\n },\n actions: {\n initialize({\n dispatch, Line truncated 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 core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/esnext.iterator.constructor.js */ \"./node_modules/core-js/modules/esnext.iterator.constructor.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/esnext.iterator.filter.js */ \"./node_modules/core-js/modules/esnext.iterator.filter.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/esnext.iterator.map.js */ \"./node_modules/core-js/modules/esnext.iterator.map.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _plugins_w_custom_axios_models_axios__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/plugins/w@custom/axios/models/axios */ \"./src/plugins/w@custom/axios/models/axios.ts\");\n/* harmony import */ var _store__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/store */ \"./src/store.ts\");\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n namespaced: true,\n state: {\n mastertasks: null,\n employees: null,\n teams: null,\n projects: null,\n unscheduledSubtasks: null,\n ongoingSubtasks: null,\n initialized: false,\n ongoingSubtasksEmployeeId: null,\n unscheduledSubtasksEmployeeId: null\n },\n mutations: {\n set_mastertasks(state, mastertasks) {\n state.mastertasks = mastertasks;\n },\n set_employees(state, employees) {\n state.employees = employees;\n // TODO: Remove\n // const employee = employees.find(employee => employee.email == 'zachariah.vonrueden@jandl.sk')\n // store.commit('auth/auth_success', {\n // \tuser: employee\n // })\n },\n set_teams(state, teams) {\n state.teams = teams;\n },\n set_projects(state, projects) {\n state.projects = projects;\n },\n set_unscheduled_subtasks(state, subtasks) {\n state.unscheduledSubtasks = subtasks;\n },\n set_ongoing_subtasks(state, subtasks) {\n state.ongoingSubtasks = subtasks;\n },\n remove_ongoing_subtask(state, subtaskId) {\n state.ongoingSubtasks = state.ongoingSubtasks.filter(st => st.id != subtaskId);\n },\n update_team(state, team) {\n state.teams = state.teams.map(t => {\n if (t.id == team.id) return team;\n return t;\n });\n },\n save_team(state, team) {\n state.teams.push(team);\n },\n delete_team(state, team) {\n state.teams = state.teams.filter(t => t.id != team.id);\n },\n update_subtask(state, subtask) {\n if (state.unscheduledSubtasks) {\n state.unscheduledSubtasks = state.unscheduledSubtasks.map(st => st.id == subtask.id ? subtask : st);\n }\n if (state.ongoingSubtasks) {\n state.ongoingSubtasks = state.ongoingSubtasks.map(st => st.id == subtask.id ? subtask : st);\n }\n // state.mastertasks \t\t\t= state.mastertasks.map(mastertask \t\t=> {\n // \tmastertask.subtasks \t= mastertask.subtasks.map(st => st.id == subtask.id ? subtask : st)\n // \treturn mastertask\n // })\n },\n delete_subtask(state, subtask) {\n state.unscheduledSubtasks = state.unscheduledSubtasks.filter(st => st.id != subtask.id);\n state.ongoingSubtasks = state.ongoingSubtasks.filter(st => st.id != subtask.id);\n // state.mastertasks \t\t\t= state.mastertasks.map(mastertask \t\t=> {\n // \tmastertask.subtasks = mastertask.subtasks.filter(st => st.id != subtask.id)\n // \treturn mastertask\n // })\n },\n set_ongoing_subtasks_employee_id(state, employeeId) {\n state.ongoingSubtasksEmployeeId = employeeId;\n },\n set_unscheduled_subtasks_employee_id(state, employeeId) {\n state.unscheduledSubtasksEmployeeId = employeeId;\n },\n initialized(state Line truncated
/***/ }), /***/ }),
+266 -242
View File
@@ -1,286 +1,310 @@
import axios from '@/plugins/w@custom/axios/models/axios' import axios from '@/plugins/w@custom/axios/models/axios';
import store from '@/store' import store from '@/store';
export default { export default {
namespaced: true, namespaced: true,
state: { state: {
mastertasks: null, mastertasks: null,
employees: null, employees: null,
teams: null, teams: null,
projects: null, projects: null,
unscheduledSubtasks: null, unscheduledSubtasks: null,
ongoingSubtasks: null, ongoingSubtasks: null,
initialized: false, initialized: false,
ongoingSubtasksEmployeeId: null, ongoingSubtasksEmployeeId: null,
unscheduledSubtasksEmployeeId: null unscheduledSubtasksEmployeeId: null,
}, },
mutations: { mutations: {
set_mastertasks(state: any, mastertasks: any) { set_mastertasks(state: any, mastertasks: any) {
state.mastertasks = mastertasks state.mastertasks = mastertasks;
}, },
set_employees(state: any, employees: any) { set_employees(state: any, employees: any) {
state.employees = employees state.employees = employees;
// TODO: Remove // TODO: Remove
// const employee = employees.find(employee => employee.email == 'zachariah.vonrueden@jandl.sk') // const employee = employees.find(employee => employee.email == 'zachariah.vonrueden@jandl.sk')
// store.commit('auth/auth_success', { // store.commit('auth/auth_success', {
// user: employee // user: employee
// }) // })
}, },
set_teams(state: any, teams: any) { set_teams(state: any, teams: any) {
state.teams = teams state.teams = teams;
}, },
set_projects(state: any, projects: any) { set_projects(state: any, projects: any) {
state.projects = projects state.projects = projects;
}, },
set_unscheduled_subtasks(state: any, subtasks: any) { set_unscheduled_subtasks(state: any, subtasks: any) {
state.unscheduledSubtasks = subtasks state.unscheduledSubtasks = subtasks;
}, },
set_ongoing_subtasks(state: any, subtasks: any) { set_ongoing_subtasks(state: any, subtasks: any) {
state.ongoingSubtasks = subtasks state.ongoingSubtasks = subtasks;
}, },
remove_ongoing_subtask(state: any, subtaskId: any) { remove_ongoing_subtask(state: any, subtaskId: any) {
state.ongoingSubtasks = state.ongoingSubtasks.filter(st => st.id != subtaskId) state.ongoingSubtasks = state.ongoingSubtasks.filter(
}, (st) => st.id != subtaskId,
);
},
update_team(state: any, team: any) { update_team(state: any, team: any) {
state.teams = state.teams.map(t => { state.teams = state.teams.map((t) => {
if (t.id == team.id) if (t.id == team.id) return team;
return team
return t return t;
}) });
}, },
save_team(state: any, team: any) { save_team(state: any, team: any) {
state.teams.push(team) state.teams.push(team);
}, },
delete_team(state: any, team: any) { delete_team(state: any, team: any) {
state.teams = state.teams.filter(t => t.id != team.id) state.teams = state.teams.filter((t) => t.id != team.id);
}, },
update_subtask(state: any, subtask: any) { update_subtask(state: any, subtask: any) {
state.unscheduledSubtasks = state.unscheduledSubtasks.map(st => st.id == subtask.id ? subtask : st) if (state.unscheduledSubtasks) {
state.ongoingSubtasks = state.ongoingSubtasks.map(st => st.id == subtask.id ? subtask : st) state.unscheduledSubtasks = state.unscheduledSubtasks.map((st) =>
st.id == subtask.id ? subtask : st,
// state.mastertasks = state.mastertasks.map(mastertask => { );
// mastertask.subtasks = mastertask.subtasks.map(st => st.id == subtask.id ? subtask : st) }
// return mastertask if (state.ongoingSubtasks) {
// }) state.ongoingSubtasks = state.ongoingSubtasks.map((st) =>
}, st.id == subtask.id ? subtask : st,
);
}
delete_subtask(state: any, subtask: any) { // state.mastertasks = state.mastertasks.map(mastertask => {
state.unscheduledSubtasks = state.unscheduledSubtasks.filter(st => st.id != subtask.id) // mastertask.subtasks = mastertask.subtasks.map(st => st.id == subtask.id ? subtask : st)
state.ongoingSubtasks = state.ongoingSubtasks.filter(st => st.id != subtask.id) // return mastertask
// })
},
// state.mastertasks = state.mastertasks.map(mastertask => { delete_subtask(state: any, subtask: any) {
// mastertask.subtasks = mastertask.subtasks.filter(st => st.id != subtask.id) state.unscheduledSubtasks = state.unscheduledSubtasks.filter(
// return mastertask (st) => st.id != subtask.id,
// }) );
}, state.ongoingSubtasks = state.ongoingSubtasks.filter(
(st) => st.id != subtask.id,
);
set_ongoing_subtasks_employee_id(state: any, employeeId: any) { // state.mastertasks = state.mastertasks.map(mastertask => {
state.ongoingSubtasksEmployeeId = employeeId // mastertask.subtasks = mastertask.subtasks.filter(st => st.id != subtask.id)
}, // return mastertask
// })
},
set_unscheduled_subtasks_employee_id(state: any, employeeId: any) { set_ongoing_subtasks_employee_id(state: any, employeeId: any) {
state.unscheduledSubtasksEmployeeId = employeeId state.ongoingSubtasksEmployeeId = employeeId;
}, },
initialized(state: any) { set_unscheduled_subtasks_employee_id(state: any, employeeId: any) {
state.initialized = true state.unscheduledSubtasksEmployeeId = employeeId;
} },
},
actions: { initialized(state: any) {
initialize({dispatch, commit}: {dispatch: any, commit: any}) { state.initialized = true;
return Promise.all([ },
dispatch('loadMastertasks'), },
dispatch('loadEmployees'),
dispatch('loadTeams'),
dispatch('loadProjects'),
dispatch('loadUnscheduledSubtasks'),
dispatch('loadOngoingSubtasks')
]).then(() => commit('initialized'))
},
reloadSubtasks({dispatch}: {dispatch: any}) { actions: {
return Promise.all([ initialize({ dispatch, commit }: { dispatch: any; commit: any }) {
dispatch('loadMastertasks'), return Promise.all([
dispatch('loadProjects'), dispatch('loadMastertasks'),
dispatch('loadUnscheduledSubtasks'), dispatch('loadEmployees'),
dispatch('loadOngoingSubtasks') dispatch('loadTeams'),
]) dispatch('loadProjects'),
}, dispatch('loadUnscheduledSubtasks'),
dispatch('loadOngoingSubtasks'),
]).then(() => commit('initialized'));
},
reloadMastertasks({dispatch}: {dispatch: any}) { reloadSubtasks({ dispatch }: { dispatch: any }) {
return Promise.all([ return Promise.all([
dispatch('loadMastertasks') dispatch('loadMastertasks'),
]) dispatch('loadProjects'),
}, dispatch('loadUnscheduledSubtasks'),
dispatch('loadOngoingSubtasks'),
]);
},
loadMastertasks({commit}: {commit: any}) { reloadMastertasks({ dispatch }: { dispatch: any }) {
return new Promise((resolve, reject) => { return Promise.all([dispatch('loadMastertasks')]);
// axios.get_auth('v1/mastertasks') },
axios.get_auth('v1/mastertasks/?simple=true')
.then(({ mastertasks }) => {
commit('set_mastertasks', mastertasks)
resolve(mastertasks)
})
.catch(error => {
commit('set_mastertasks', {error: error})
reject(error)
})
})
},
loadEmployees({commit}: {commit: any}) { loadMastertasks({ commit }: { commit: any }) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
axios.get_auth_data('v1/employees') // axios.get_auth('v1/mastertasks')
.then(employees => { axios
commit('set_employees', employees) .get_auth('v1/mastertasks/?simple=true')
resolve(employees) .then(({ mastertasks }) => {
}) commit('set_mastertasks', mastertasks);
.catch(error => { resolve(mastertasks);
commit('set_employees', {error: error}) })
reject(error) .catch((error) => {
}) commit('set_mastertasks', { error: error });
}) reject(error);
});
}, });
},
loadTeams({commit}: {commit: any}) { loadEmployees({ commit }: { commit: any }) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
axios.get_auth_data('v1/teams') axios
.then(teams => { .get_auth_data('v1/employees')
commit('set_teams', teams) .then((employees) => {
resolve(teams) commit('set_employees', employees);
}) resolve(employees);
.catch(error => { })
commit('set_teams', {error: error}) .catch((error) => {
reject(error) commit('set_employees', { error: error });
}) reject(error);
}) });
}, });
},
loadProjects({commit}: {commit: any}) { loadTeams({ commit }: { commit: any }) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
axios.get_auth_data('v1/projects') axios
.then(project => { .get_auth_data('v1/teams')
commit('set_projects', project) .then((teams) => {
resolve(project) commit('set_teams', teams);
}) resolve(teams);
.catch(error => { })
commit('set_projects', {error: error}) .catch((error) => {
reject(error) commit('set_teams', { error: error });
}) reject(error);
}) });
});
}, },
loadUnscheduledSubtasks({commit, state}: {commit: any, state: any}, employeeId = undefined) { loadProjects({ commit }: { commit: any }) {
let employeeIdToUse = undefined return new Promise((resolve, reject) => {
axios
.get_auth_data('v1/projects')
.then((project) => {
commit('set_projects', project);
resolve(project);
})
.catch((error) => {
commit('set_projects', { error: error });
reject(error);
});
});
},
if (employeeId) { loadUnscheduledSubtasks(
employeeIdToUse = employeeId { commit, state }: { commit: any; state: any },
commit('set_unscheduled_subtasks_employee_id', employeeId) employeeId = undefined,
} else if (state.unscheduledSubtasksEmployeeId) { ) {
employeeIdToUse = state.unscheduledSubtasksEmployeeId let employeeIdToUse = undefined;
} else {
employeeIdToUse = store.getters['auth/user']?.id
}
return new Promise((resolve, reject) => { if (employeeId) {
axios.get_auth(`v1/subtasks?type=unscheduled&employee_id=${employeeIdToUse}`) employeeIdToUse = employeeId;
.then(({subtasks}) => { commit('set_unscheduled_subtasks_employee_id', employeeId);
commit('set_unscheduled_subtasks', subtasks) } else if (state.unscheduledSubtasksEmployeeId) {
resolve(subtasks) employeeIdToUse = state.unscheduledSubtasksEmployeeId;
}) } else {
.catch(error => { employeeIdToUse = store.getters['auth/user']?.id;
commit('set_unscheduled_subtasks', {error: error}) }
reject(error)
})
})
},
loadOngoingSubtasks({commit, state}: {commit: any, state: any}, employeeId = undefined) { return new Promise((resolve, reject) => {
let employeeIdToUse = undefined axios
.get_auth(
`v1/subtasks?type=unscheduled&employee_id=${employeeIdToUse}`,
)
.then(({ subtasks }) => {
commit('set_unscheduled_subtasks', subtasks);
resolve(subtasks);
})
.catch((error) => {
commit('set_unscheduled_subtasks', { error: error });
reject(error);
});
});
},
if (employeeId) { loadOngoingSubtasks(
employeeIdToUse = employeeId { commit, state }: { commit: any; state: any },
commit('set_ongoing_subtasks_employee_id', employeeId) employeeId = undefined,
} else if (state.ongoingSubtasksEmployeeId) { ) {
employeeIdToUse = state.ongoingSubtasksEmployeeId let employeeIdToUse = undefined;
} else {
employeeIdToUse = store.getters['auth/user']?.id
commit('set_ongoing_subtasks_employee_id', employeeIdToUse)
}
return new Promise((resolve, reject) => { if (employeeId) {
axios.get_auth(`v1/subtasks?type=ongoing&employee_id=${employeeIdToUse}`) employeeIdToUse = employeeId;
.then(({subtasks}) => { commit('set_ongoing_subtasks_employee_id', employeeId);
commit('set_ongoing_subtasks', subtasks) } else if (state.ongoingSubtasksEmployeeId) {
resolve(subtasks) employeeIdToUse = state.ongoingSubtasksEmployeeId;
}) } else {
.catch(error => { employeeIdToUse = store.getters['auth/user']?.id;
commit('set_ongoing_subtasks', {error: error}) commit('set_ongoing_subtasks_employee_id', employeeIdToUse);
reject(error) }
})
})
},
removeOngoingSubtask({commit}: {commit: any}, subtaskId: any) { return new Promise((resolve, reject) => {
commit('remove_ongoing_subtask', subtaskId) axios
} .get_auth(`v1/subtasks?type=ongoing&employee_id=${employeeIdToUse}`)
.then(({ subtasks }) => {
commit('set_ongoing_subtasks', subtasks);
resolve(subtasks);
})
.catch((error) => {
commit('set_ongoing_subtasks', { error: error });
reject(error);
});
});
},
}, removeOngoingSubtask({ commit }: { commit: any }, subtaskId: any) {
commit('remove_ongoing_subtask', subtaskId);
},
},
getters: { getters: {
mastertasks: (state: any) => { mastertasks: (state: any) => {
return state.mastertasks return state.mastertasks;
}, },
employees: (state: any) => { employees: (state: any) => {
return state.employees return state.employees;
}, },
enrichedEmployees: (state: any) => { enrichedEmployees: (state: any) => {
if (!state.employees) return [] if (!state.employees) return [];
return state.employees.map(employee => ({
...employee,
_fullName: `${ employee.name } ${ employee.surname }`,
_initials: employee.name.charAt(0) + employee.surname.charAt(0)
})).sort((a, b) => a.name < b.name ? -1 : 1)
},
teams: (state: any) => { return state.employees
return state.teams .map((employee) => ({
}, ...employee,
_fullName: `${employee.name} ${employee.surname}`,
_initials: employee.name.charAt(0) + employee.surname.charAt(0),
}))
.sort((a, b) => (a.name < b.name ? -1 : 1));
},
projects: (state: any) => { teams: (state: any) => {
return state.projects return state.teams;
}, },
unscheduledSubtasks: (state: any) => { projects: (state: any) => {
return state.unscheduledSubtasks return state.projects;
}, },
ongoingSubtasks: (state: any) => { unscheduledSubtasks: (state: any) => {
return state.ongoingSubtasks return state.unscheduledSubtasks;
}, },
isInitialized: (state: any) => { ongoingSubtasks: (state: any) => {
return state.initialized return state.ongoingSubtasks;
} },
}
} isInitialized: (state: any) => {
return state.initialized;
},
},
};
@@ -57,7 +57,7 @@
</div> </div>
<!-- Timeline Visualization for existing timeblock --> <!-- Timeline Visualization for existing timeblock -->
<div <!-- <div
v-if="employee && timeblock.date" v-if="employee && timeblock.date"
class="existing-timeblock-timeline ml-8" class="existing-timeblock-timeline ml-8"
> >
@@ -78,7 +78,7 @@
:end-hour="END_HOUR" :end-hour="END_HOUR"
:hour-width="hourWidth" :hour-width="hourWidth"
/> />
</div> </div> -->
</div> </div>
</v-sheet> </v-sheet>
</v-col> </v-col>
@@ -156,7 +156,7 @@ import moment from 'moment';
import modalMixin from '@/plugins/tm@modal/_mixins/modal.mixin'; import modalMixin from '@/plugins/tm@modal/_mixins/modal.mixin';
import { mapGetters } from 'vuex'; import { mapGetters } from 'vuex';
import AEmployeeTimeblock from '../employees/a-employee-timeblock.vue'; import AEmployeeTimeblock from '../employees/a-employee-timeblock.vue';
import AEmployeeTimeblockTimeline from '../employees/a-employee-timeblock-timeline.vue'; // import AEmployeeTimeblockTimeline from '../employees/a-employee-timeblock-timeline.vue';
import { import {
timeblockToDateRange, timeblockToDateRange,
detectCollision, detectCollision,
@@ -167,7 +167,7 @@ import {
export default { export default {
components: { components: {
AEmployeeTimeblock, AEmployeeTimeblock,
AEmployeeTimeblockTimeline, // AEmployeeTimeblockTimeline,
}, },
mixins: [modalMixin], mixins: [modalMixin],
@@ -1,12 +1,14 @@
<template> <template>
<div class="employee-select"> <div class="employee-select">
<v-autocomplete <v-autocomplete
:key="`employee-select-${componentKey}`"
ref="employeeSelectRef"
:model-value="modelValue.id" :model-value="modelValue.id"
:custom-filter="customFilter" :custom-filter="customFilter"
:match-any="true" :match-any="true"
label="Priradený" label="Priradený"
:items="enrichedEmployees" :items="enrichedEmployees"
item-title="_fullName" :item-title="getItemTitle"
item-value="id" item-value="id"
variant="solo" variant="solo"
class="employee-select__select-field" class="employee-select__select-field"
@@ -40,7 +42,7 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { computed, toRefs } from 'vue'; import { computed, toRefs, watch, nextTick, ref, onMounted } from 'vue';
import { useStore } from 'vuex'; import { useStore } from 'vuex';
import { useVuelidate } from '@vuelidate/core'; import { useVuelidate } from '@vuelidate/core';
import { helpers, required } from '@vuelidate/validators'; import { helpers, required } from '@vuelidate/validators';
@@ -63,7 +65,65 @@ const emit = defineEmits<{
const store = useStore(); const store = useStore();
const enrichedEmployees = computed(() => store.getters['tm/enrichedEmployees']); const employeeSelectRef = ref<any>(null);
// Force re-render key
const componentKey = ref(0);
// Ensure all employees have a displayable name
const enrichedEmployees = computed(() => {
const employees = store.getters['tm/enrichedEmployees'] || [];
return employees.map((emp: any) => ({
...emp,
_fullName:
emp._fullName ||
`${emp.name || ''} ${emp.surname || ''}`.trim() ||
`Employee ${emp.id}`,
}));
});
// Function to get item title - handles both objects and IDs
const getItemTitle = (item: any): string => {
// If item is an object with _fullName, return it
if (item && typeof item === 'object' && item._fullName) {
return item._fullName;
}
// If item is just an ID (string or number), find the employee
if (item && (typeof item === 'string' || typeof item === 'number')) {
const employee = enrichedEmployees.value.find((emp) => emp.id == item);
return employee?._fullName || `Employee ${item}`;
}
return '';
};
// Watch for when employees list changes to force re-render
watch(
() => enrichedEmployees.value.length,
(newLength, oldLength) => {
// Force component re-render when employees are loaded
if (newLength > 0 && newLength !== oldLength) {
nextTick(() => {
componentKey.value++;
});
}
},
{ immediate: true },
);
// Watch for when the selected employee ID changes to ensure display updates
watch(
() => props.modelValue.id,
(newId) => {
// When ID is set and we have employees, force re-render to ensure proper display
if (newId && enrichedEmployees.value.length > 0) {
nextTick(() => {
componentKey.value++;
});
}
},
);
// Make modelValue reactive for Vuelidate // Make modelValue reactive for Vuelidate
const { modelValue } = toRefs(props); const { modelValue } = toRefs(props);
@@ -150,6 +210,12 @@ const validate = async (required = false) => {
return isValid; return isValid;
}; };
onMounted(() => {
setTimeout(() => {
console.log('Employee select ref:', employeeSelectRef.value);
}, 1000);
});
defineExpose({ defineExpose({
validate, validate,
}); });
@@ -11,7 +11,13 @@
:hour-width="hourWidth" :hour-width="hourWidth"
/> />
<div class="timeline-bar"> <div
ref="timelineBar"
class="timeline-bar"
@mousemove="handleMouseMove"
@mouseleave="handleMouseLeave"
@mousedown="handleMouseDown"
>
<!-- Non-working hours - before work --> <!-- Non-working hours - before work -->
<div <div
class="non-working-hours" class="non-working-hours"
@@ -47,7 +53,14 @@
:key="`task-${index}`" :key="`task-${index}`"
class="scheduled-block" class="scheduled-block"
:class="{ :class="{
'scheduled-block--blocker': ['blocker', 'adhoc', 'home_office', 'vacation', 'free_day', 'office365_blocker'].includes(task.type) 'scheduled-block--blocker': [
'blocker',
'adhoc',
'home_office',
'vacation',
'free_day',
'office365_blocker',
].includes(task.type),
}" }"
:style="{ :style="{
left: `${getTimePosition(task._real_start)}px`, left: `${getTimePosition(task._real_start)}px`,
@@ -68,11 +81,41 @@
:title="`Other timeblock`" :title="`Other timeblock`"
></div> ></div>
<!-- Hover preview block -->
<div
v-if="showPreview && previewBlock"
class="preview-block"
:class="{ 'is-stretching': dragState.isStretching }"
:style="{
left: `${getTimePosition(previewBlock.start)}px`,
width: `${getTimeWidth(previewBlock.start, previewBlock.end)}px`,
}"
@mousedown.stop="handlePreviewMouseDown"
>
<div class="preview-time-label">
<div
v-if="getTimeWidth(previewBlock.start, previewBlock.end) <= 58"
>
{{ formatTime(previewBlock.start) }}
</div>
<div v-else>
{{ formatTime(previewBlock.start) }} -
{{ formatTime(previewBlock.end) }}
</div>
</div>
</div>
<!-- Current timeblock (if valid) --> <!-- Current timeblock (if valid) -->
<div <div
v-if="currentTimeblockRange.start && currentTimeblockRange.end" v-if="
currentTimeblockRange.start &&
currentTimeblockRange.end &&
!dragState.isResizingCurrent
"
class="current-timeblock" class="current-timeblock"
:class="{ 'has-collision': collision.hasCollision }" :class="{
'has-collision': collision.hasCollision,
}"
:style="{ :style="{
left: `${getTimePosition(currentTimeblockRange.start)}px`, left: `${getTimePosition(currentTimeblockRange.start)}px`,
width: `${getTimeWidth( width: `${getTimeWidth(
@@ -85,6 +128,46 @@
<div v-if="timeblockDuration > 0" class="timeblock-duration"> <div v-if="timeblockDuration > 0" class="timeblock-duration">
{{ timeblockDuration.toFixed(2) }}h {{ timeblockDuration.toFixed(2) }}h
</div> </div>
<!-- Resize handles -->
<div
class="resize-handle resize-handle--left"
@mousedown.stop="handleResizeMouseDown($event, 'left')"
></div>
<div
class="resize-handle resize-handle--right"
@mousedown.stop="handleResizeMouseDown($event, 'right')"
></div>
</div>
<!-- Resizing current timeblock preview -->
<div
v-if="dragState.isResizingCurrent && resizedCurrentBlock"
class="current-timeblock is-resizing"
:class="{ 'has-collision': collision.hasCollision }"
:style="{
left: `${getTimePosition(resizedCurrentBlock.start)}px`,
width: `${getTimeWidth(
resizedCurrentBlock.start,
resizedCurrentBlock.end,
)}px`,
}"
>
<div
v-if="
getTimeWidth(
resizedCurrentBlock.start,
resizedCurrentBlock.end,
) <= 58
"
class="preview-time-label"
>
{{ formatTime(resizedCurrentBlock.start) }}
</div>
<div v-else class="preview-time-label">
{{ formatTime(resizedCurrentBlock.start) }} -
{{ formatTime(resizedCurrentBlock.end) }}
</div>
</div> </div>
<!-- Collision segments --> <!-- Collision segments -->
@@ -104,7 +187,7 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ref, computed } from 'vue'; import { ref, computed, onMounted, onUnmounted } from 'vue';
import moment from 'moment'; import moment from 'moment';
import AEmployeeTimeblockTimelineHeader from './a-employee-timeblock-timeline-header.vue'; import AEmployeeTimeblockTimelineHeader from './a-employee-timeblock-timeline-header.vue';
import type { EmployeeFullData, TimeblockData } from './types'; import type { EmployeeFullData, TimeblockData } from './types';
@@ -114,6 +197,7 @@ interface TimelineTask {
_real_end: Date; _real_end: Date;
subtask?: { title: string }; subtask?: { title: string };
blocker?: { type: string }; blocker?: { type: string };
type?: string;
} }
interface CollisionSegment { interface CollisionSegment {
@@ -146,8 +230,32 @@ const props = withDefaults(defineProps<Props>(), {
otherTimeblocks: () => [], otherTimeblocks: () => [],
}); });
const emit = defineEmits<{
(
e: 'timeblockUpdated',
payload: { starts_at_time: string; ends_at_time: string },
): void;
}>();
const timelineContainer = ref<HTMLElement | null>(null); const timelineContainer = ref<HTMLElement | null>(null);
const timelineScroll = ref<HTMLElement | null>(null); const timelineScroll = ref<HTMLElement | null>(null);
const timelineBar = ref<HTMLElement | null>(null);
// Check if mobile device
const isMobile = ref(false);
// Interactive state
const showPreview = ref(false);
const previewBlock = ref<{ start: Date; end: Date } | null>(null);
const dragState = ref({
isStretching: false,
isResizingCurrent: false,
resizeEdge: null as 'left' | 'right' | null,
startX: 0,
initialStart: null as Date | null,
initialEnd: null as Date | null,
});
const resizedCurrentBlock = ref<{ start: Date; end: Date } | null>(null);
// Convert other timeblocks to renderable format // Convert other timeblocks to renderable format
const otherTimeblocksRendered = computed(() => { const otherTimeblocksRendered = computed(() => {
@@ -192,6 +300,303 @@ const getTimeWidth = (start: Date, end: Date): number => {
return (endHour - startHour) * props.hourWidth - 2; return (endHour - startHour) * props.hourWidth - 2;
}; };
// Time snapping utility - snap to 15 minute intervals
const snapToInterval = (date: Date, intervalMinutes = 15): Date => {
const minutes = date.getMinutes();
const snappedMinutes =
Math.round(minutes / intervalMinutes) * intervalMinutes;
return moment(date)
.set({ minute: snappedMinutes, second: 0, millisecond: 0 })
.toDate();
};
// Convert pixel position to time
const positionToTime = (pixelX: number): Date => {
const hoursFromStart = pixelX / props.hourWidth;
const totalHours = props.startHour + hoursFromStart;
const hour = Math.floor(totalHours);
const minute = (totalHours % 1) * 60;
// Use current date from currentTimeblockRange or today
const baseDate = props.currentTimeblockRange.start
? moment(props.currentTimeblockRange.start)
: moment();
return baseDate.set({ hour, minute, second: 0, millisecond: 0 }).toDate();
};
// Format time as HH:mm
const formatTime = (date: Date): string => {
return moment(date).format('HH:mm');
};
// Check if mouse is over an existing block (x is already relative position with scroll)
const isOverExistingBlock = (relativeX: number): boolean => {
// Check if over any scheduled block
for (const task of props.scheduledBlocks) {
const blockLeft = getTimePosition(task._real_start);
const blockWidth = getTimeWidth(task._real_start, task._real_end);
if (relativeX >= blockLeft && relativeX <= blockLeft + blockWidth) {
return true;
}
}
// Check if over any other timeblock
for (const tb of otherTimeblocksRendered.value) {
const blockLeft = getTimePosition(tb._start);
const blockWidth = getTimeWidth(tb._start, tb._end);
if (relativeX >= blockLeft && relativeX <= blockLeft + blockWidth) {
return true;
}
}
// Check if over current timeblock
if (props.currentTimeblockRange.start && props.currentTimeblockRange.end) {
const blockLeft = getTimePosition(props.currentTimeblockRange.start);
const blockWidth = getTimeWidth(
props.currentTimeblockRange.start,
props.currentTimeblockRange.end,
);
if (relativeX >= blockLeft && relativeX <= blockLeft + blockWidth) {
return true;
}
}
return false;
};
// Mouse move handler - show preview
const handleMouseMove = (event: MouseEvent) => {
// Disable hover preview on mobile
if (isMobile.value) {
return;
}
if (dragState.value.isStretching) {
handleStretchMove(event);
return;
}
if (dragState.value.isResizingCurrent) {
handleResizeCurrentMove(event);
return;
}
if (!timelineScroll.value) return;
// Get position relative to scroll container, accounting for scroll
const rect = timelineScroll.value.getBoundingClientRect();
const scrollLeft = timelineScroll.value.scrollLeft;
const x = event.clientX - rect.left + scrollLeft;
// Don't show preview if over existing block (using relative position)
if (isOverExistingBlock(x)) {
showPreview.value = false;
return;
}
// Convert to time and snap
const rawTime = positionToTime(x);
const snappedStart = snapToInterval(rawTime);
const snappedEnd = moment(snappedStart).add(1, 'hour').toDate();
// Only show preview within work hours
const startHour = snappedStart.getHours() + snappedStart.getMinutes() / 60;
const endHour = snappedEnd.getHours() + snappedEnd.getMinutes() / 60;
if (
startHour >= props.employee.work_start &&
endHour <= props.employee.work_end
) {
showPreview.value = true;
previewBlock.value = {
start: snappedStart,
end: snappedEnd,
};
} else {
showPreview.value = false;
}
};
// Mouse leave handler
const handleMouseLeave = () => {
if (!dragState.value.isStretching && !dragState.value.isResizingCurrent) {
showPreview.value = false;
}
};
// Mouse down on timeline bar (not on preview or current block)
const handleMouseDown = (_event: MouseEvent) => {
// This will only trigger if not clicking on preview or current block
// (those have @mousedown.stop)
};
// Preview block mouse down - start creating/stretching
const handlePreviewMouseDown = (event: MouseEvent) => {
if (!previewBlock.value) return;
dragState.value.isStretching = true;
dragState.value.startX = event.clientX;
dragState.value.initialStart = previewBlock.value.start;
dragState.value.initialEnd = previewBlock.value.end;
event.preventDefault();
};
// Handle stretch move
const handleStretchMove = (event: MouseEvent) => {
if (!dragState.value.initialStart || !timelineScroll.value) return;
const rect = timelineScroll.value.getBoundingClientRect();
const x = event.clientX - rect.left + timelineScroll.value.scrollLeft;
const currentTime = positionToTime(x);
const snappedTime = snapToInterval(currentTime);
const initialStartTime = dragState.value.initialStart.getTime();
const snappedTimeValue = snappedTime.getTime();
if (snappedTimeValue > initialStartTime) {
// Stretching right (extending end)
previewBlock.value = {
start: dragState.value.initialStart,
end: snappedTime,
};
} else {
// Stretching left (extending start)
previewBlock.value = {
start: snappedTime,
end: dragState.value.initialStart,
};
}
};
// Handle stretch end
const handleStretchEnd = () => {
if (dragState.value.isStretching && previewBlock.value) {
// Emit the new timeblock
emit('timeblockUpdated', {
starts_at_time: formatTime(previewBlock.value.start),
ends_at_time: formatTime(previewBlock.value.end),
});
}
dragState.value.isStretching = false;
dragState.value.initialStart = null;
dragState.value.initialEnd = null;
showPreview.value = false;
};
// Resize handle mouse down - start resizing
const handleResizeMouseDown = (event: MouseEvent, edge: 'left' | 'right') => {
if (!props.currentTimeblockRange.start || !props.currentTimeblockRange.end)
return;
dragState.value.isResizingCurrent = true;
dragState.value.resizeEdge = edge;
dragState.value.startX = event.clientX;
dragState.value.initialStart = props.currentTimeblockRange.start;
dragState.value.initialEnd = props.currentTimeblockRange.end;
resizedCurrentBlock.value = {
start: props.currentTimeblockRange.start,
end: props.currentTimeblockRange.end,
};
event.preventDefault();
};
// Handle resize current block move
const handleResizeCurrentMove = (event: MouseEvent) => {
if (
!dragState.value.initialStart ||
!dragState.value.initialEnd ||
!timelineScroll.value
)
return;
const rect = timelineScroll.value.getBoundingClientRect();
const x = event.clientX - rect.left + timelineScroll.value.scrollLeft;
const currentTime = positionToTime(x);
const snappedTime = snapToInterval(currentTime);
if (dragState.value.resizeEdge === 'left') {
// Resizing left edge (changing start time)
// Make sure new start is before end
if (snappedTime < dragState.value.initialEnd) {
resizedCurrentBlock.value = {
start: snappedTime,
end: dragState.value.initialEnd,
};
}
} else if (dragState.value.resizeEdge === 'right') {
// Resizing right edge (changing end time)
// Make sure new end is after start
if (snappedTime > dragState.value.initialStart) {
resizedCurrentBlock.value = {
start: dragState.value.initialStart,
end: snappedTime,
};
}
}
};
// Handle resize current block end
const handleResizeCurrentEnd = () => {
if (dragState.value.isResizingCurrent && resizedCurrentBlock.value) {
// Emit the updated timeblock
emit('timeblockUpdated', {
starts_at_time: formatTime(resizedCurrentBlock.value.start),
ends_at_time: formatTime(resizedCurrentBlock.value.end),
});
}
dragState.value.isResizingCurrent = false;
dragState.value.resizeEdge = null;
dragState.value.initialStart = null;
dragState.value.initialEnd = null;
resizedCurrentBlock.value = null;
};
// Global mouse up handler
const handleGlobalMouseUp = () => {
if (dragState.value.isStretching) {
handleStretchEnd();
} else if (dragState.value.isResizingCurrent) {
handleResizeCurrentEnd();
}
};
// Global mouse move handler
const handleGlobalMouseMove = (event: MouseEvent) => {
if (dragState.value.isStretching) {
handleStretchMove(event);
} else if (dragState.value.isResizingCurrent) {
handleResizeCurrentMove(event);
}
};
// Setup global listeners
onMounted(() => {
// Detect mobile device
isMobile.value = window.innerWidth <= 768;
// Listen for resize to update mobile status
const handleResize = () => {
isMobile.value = window.innerWidth <= 768;
};
window.addEventListener('resize', handleResize);
document.addEventListener('mouseup', handleGlobalMouseUp);
document.addEventListener('mousemove', handleGlobalMouseMove);
});
onUnmounted(() => {
document.removeEventListener('mouseup', handleGlobalMouseUp);
document.removeEventListener('mousemove', handleGlobalMouseMove);
});
// Expose refs for parent component // Expose refs for parent component
defineExpose({ defineExpose({
timelineScroll, timelineScroll,
@@ -230,6 +635,7 @@ defineExpose({
width: calc(24 * 60px) width: calc(24 * 60px)
background: #fafafa background: #fafafa
border-radius: 4px border-radius: 4px
cursor: crosshair
@media (max-width: 768px) @media (max-width: 768px)
width: calc(24 * 50px) width: calc(24 * 50px)
@@ -240,6 +646,7 @@ defineExpose({
height: 100% height: 100%
background: repeating-linear-gradient(45deg, transparent, transparent 10px, rgba(224, 224, 224, 0.3) 10px, rgba(224, 224, 224, 0.3) 20px) background: repeating-linear-gradient(45deg, transparent, transparent 10px, rgba(224, 224, 224, 0.3) 10px, rgba(224, 224, 224, 0.3) 20px)
z-index: 1 z-index: 1
pointer-events: none
.work-hours-bar .work-hours-bar
position: absolute position: absolute
@@ -247,6 +654,7 @@ defineExpose({
height: 100% height: 100%
background: transparent background: transparent
z-index: 1 z-index: 1
pointer-events: none
.scheduled-block .scheduled-block
position: absolute position: absolute
@@ -257,6 +665,7 @@ defineExpose({
opacity: 0.6 opacity: 0.6
border-radius: 2px border-radius: 2px
z-index: 2 z-index: 2
pointer-events: none
&--blocker &--blocker
background: rgb(176, 0, 32) background: rgb(176, 0, 32)
@@ -272,6 +681,40 @@ defineExpose({
border: 2px dashed #FF9800 border: 2px dashed #FF9800
border-radius: 2px border-radius: 2px
z-index: 2 z-index: 2
pointer-events: none
.preview-block
position: absolute
top: 5px
height: 22px
background: #4CAF50
opacity: 0.6
border: 2px dashed #388E3C
border-radius: 2px
z-index: 5
cursor: crosshair
transition: opacity 0.2s, box-shadow 0.2s
display: flex
align-items: center
justify-content: center
&:hover
opacity: 0.8
box-shadow: 0 2px 8px rgba(76, 175, 80, 0.4)
&.is-stretching
opacity: 0.8
box-shadow: 0 4px 12px rgba(76, 175, 80, 0.6)
cursor: ew-resize
.preview-time-label
font-size: 11px
font-weight: 600
color: white
text-shadow: 0 1px 2px rgba(0, 0, 0, 0.5)
white-space: nowrap
pointer-events: none
user-select: none
.current-timeblock .current-timeblock
position: absolute position: absolute
@@ -282,10 +725,37 @@ defineExpose({
border: 2px solid #1976D2 border: 2px solid #1976D2
border-radius: 2px border-radius: 2px
z-index: 3 z-index: 3
transition: box-shadow 0.2s
&.has-collision &.has-collision
border-color: #ff5252 border-color: #ff5252
&.is-resizing
opacity: 0.8
box-shadow: 0 4px 12px rgba(33, 150, 243, 0.6)
z-index: 6
.resize-handle
position: absolute
top: 0
width: 8px
height: 100%
cursor: ew-resize
z-index: 4
&:hover
background: rgba(255, 255, 255, 0.3)
&--left
left: 0
border-top-left-radius: 2px
border-bottom-left-radius: 2px
&--right
right: 0
border-top-right-radius: 2px
border-bottom-right-radius: 2px
.collision-segment .collision-segment
position: absolute position: absolute
top: 5px top: 5px
@@ -294,6 +764,7 @@ defineExpose({
opacity: 0.6 opacity: 0.6
border-radius: 2px border-radius: 2px
z-index: 4 z-index: 4
pointer-events: none
.timeblock-duration .timeblock-duration
position: absolute position: absolute
@@ -305,6 +776,7 @@ defineExpose({
color: white color: white
text-shadow: 0 1px 2px rgba(0, 0, 0, 0.3) text-shadow: 0 1px 2px rgba(0, 0, 0, 0.3)
pointer-events: none pointer-events: none
user-select: none
.timeline-loading .timeline-loading
height: 60px height: 60px
@@ -39,6 +39,7 @@
:start-hour="START_HOUR" :start-hour="START_HOUR"
:end-hour="END_HOUR" :end-hour="END_HOUR"
:hour-width="hourWidth" :hour-width="hourWidth"
@timeblock-updated="handleTimeblockUpdated"
/> />
</div> </div>
</template> </template>
@@ -269,24 +270,12 @@ const otherTimeblocksForSameDate = computed(() => {
if (!props.modelValue.date) return []; if (!props.modelValue.date) return [];
const currentDate = moment(props.modelValue.date).format('YYYY-MM-DD'); const currentDate = moment(props.modelValue.date).format('YYYY-MM-DD');
const currentTimeblock = props.modelValue;
// Use allTimeblocks if available (includes all employees), otherwise fall back to current employee only // Use allEmployeeTimeblocks which contains timeblocks for this specific employee
const timeblocksToCheck = // Filter out the current timeblock by comparing index directly
props.allTimeblocks.length > 0 return props.allEmployeeTimeblocks.filter((tb, index) => {
? props.allTimeblocks // Skip current timeblock by index
: props.allEmployeeTimeblocks; if (index === props.currentIndex) {
return timeblocksToCheck.filter((tb) => {
// Skip current timeblock - compare by reference or by matching all key properties
if (
tb === currentTimeblock ||
(tb.employee_id === currentTimeblock.employee_id &&
tb.date === currentTimeblock.date &&
tb.starts_at_time === currentTimeblock.starts_at_time &&
tb.ends_at_time === currentTimeblock.ends_at_time &&
tb.id === currentTimeblock.id)
) {
return false; return false;
} }
@@ -405,6 +394,23 @@ const updateEndTime = (event: Event) => {
}); });
}; };
// Handle timeblock updated from timeline (drag/drop or quick add)
const handleTimeblockUpdated = (payload: {
starts_at_time: string;
ends_at_time: string;
}) => {
emit('update:modelValue', {
...props.modelValue,
starts_at_time: payload.starts_at_time,
ends_at_time: payload.ends_at_time,
});
// Trigger validation after timeline update
nextTick(() => {
v$.value.$touch();
});
};
// Expose validate method // Expose validate method
const validate = async () => { const validate = async () => {
v$.value.$touch(); v$.value.$touch();
@@ -91,14 +91,14 @@ const setTimeblockRef = (el: any, index: number) => {
const selectedEmployee = computed(() => { const selectedEmployee = computed(() => {
if (!props.employeeData.id) return null; if (!props.employeeData.id) return null;
const employees = store.getters['tm/enrichedEmployees']; const employees = store.getters['tm/enrichedEmployees'];
return employees.find((emp: any) => emp.id === props.employeeData.id) || null; return employees.find((emp: any) => emp.id == props.employeeData.id) || null;
}); });
// Filter allTimeblocks to only include timeblocks for current employee // Filter allTimeblocks to only include timeblocks for current employee
const allTimeblocksForCurrentEmployee = computed(() => { const allTimeblocksForCurrentEmployee = computed(() => {
if (!props.employeeData.id) return []; if (!props.employeeData.id) return [];
return props.allTimeblocks.filter( return props.allTimeblocks.filter(
(tb) => tb.employee_id === props.employeeData.id, (tb) => tb.employee_id == props.employeeData.id,
); );
}); });
@@ -178,7 +178,7 @@ defineExpose({
&--has-background &--has-background
border: 1px solid #e5e5e5 border: 1px solid #e5e5e5
border-bottom: 3px solid #7f39fb border-top: 3px solid #7f39fb
padding: 16px padding: 16px
border-radius: 8px 8px 0 0 border-radius: 8px 8px 0 0
+157 -19
View File
@@ -95,14 +95,14 @@
</div> </div>
<!-- Employee Assignment with Timeblocks --> <!-- Employee Assignment with Timeblocks -->
<!-- Edit Mode: Single Employee --> <!-- Edit Mode: Single Employee (for published subtasks) -->
<A-employee <A-employee
v-if="subtask.id" v-if="subtask.id && !isDraftWithMultipleEmployees"
v-model:employee-data="editModeEmployee" v-model:employee-data="editModeEmployee"
:timeblocks="getEmployeeTimeblocks(subtask.employee_id)" :timeblocks="getEmployeeTimeblocks(subtask.employee_id)"
:all-timeblocks="timeblocks" :all-timeblocks="timeblocks"
:deleted-timeblock-ids="deletedTimeblockIds" :deleted-timeblock-ids="deletedTimeblockIds"
:custom-filter="customFilter" :custom-filter="customFilterWithEmployeeFilter"
@update:timeblocks=" @update:timeblocks="
updateEmployeeTimeblocks($event, subtask.employee_id) updateEmployeeTimeblocks($event, subtask.employee_id)
" "
@@ -112,7 +112,7 @@
" "
/> />
<!-- Create Mode: Multiple Employees --> <!-- Multi-Employee Mode (for new tasks and drafts with multiple employees) -->
<template v-else> <template v-else>
<A-employee <A-employee
v-for="(employee, index) in subtask.employees" v-for="(employee, index) in subtask.employees"
@@ -122,7 +122,7 @@
:timeblocks="getEmployeeTimeblocks(employee.id)" :timeblocks="getEmployeeTimeblocks(employee.id)"
:all-timeblocks="timeblocks" :all-timeblocks="timeblocks"
:deleted-timeblock-ids="deletedTimeblockIds" :deleted-timeblock-ids="deletedTimeblockIds"
:custom-filter="customFilter" :custom-filter="customFilterWithEmployeeFilter"
:required="index === 0" :required="index === 0"
@update:timeblocks="updateEmployeeTimeblocks($event, employee.id)" @update:timeblocks="updateEmployeeTimeblocks($event, employee.id)"
@clear-employee="() => removeEmployeeAtIndex(index)" @clear-employee="() => removeEmployeeAtIndex(index)"
@@ -350,6 +350,13 @@ export default {
} }
}, },
}, },
isDraftWithMultipleEmployees() {
return (
this.subtask?.is_draft &&
Array.isArray(this.subtask?.employees) &&
this.subtask.employees.length > 0
);
},
}, },
validations() { validations() {
@@ -369,7 +376,7 @@ export default {
// In edit mode: reassign timeblocks to new employee // In edit mode: reassign timeblocks to new employee
if (this.subtask.id) { if (this.subtask.id) {
this.timeblocks = this.timeblocks.map((tb) => { this.timeblocks = this.timeblocks.map((tb) => {
if (tb.employee_id === oldValue) { if (tb.employee_id == oldValue) {
return { ...tb, employee_id: value }; return { ...tb, employee_id: value };
} }
return tb; return tb;
@@ -377,7 +384,7 @@ export default {
} else { } else {
// In create mode: remove old employee's timeblocks // In create mode: remove old employee's timeblocks
this.timeblocks = this.timeblocks.filter( this.timeblocks = this.timeblocks.filter(
(tb) => tb.employee_id !== oldValue, (tb) => tb.employee_id != oldValue,
); );
} }
@@ -514,6 +521,33 @@ export default {
}, },
methods: { methods: {
customFilterWithEmployeeFilter(item, input, itemObject) {
const shouldShowItem = this.customFilter(item, input);
if (!shouldShowItem) return false;
if (!itemObject?.value) return false;
const employeeId = itemObject.value;
if (!this.subtask.id) {
// New subtask with multiple employees support or edit of draft with multiple employees
return (
shouldShowItem &&
!this.timeblocks.some((tb) => tb.employee_id === employeeId)
);
} else if (this.subtask.is_draft) {
// Edit draft subtask with multiple employees support
return (
shouldShowItem &&
!this.subtask.employees.some(
(employee) => Number(employee.id) === employeeId,
)
);
} else {
// Saved standard subtask, allow "re-select" for better UX
return shouldShowItem;
}
},
toggleEditMode() { toggleEditMode() {
if (this.subtask.type == 'office365') if (this.subtask.type == 'office365')
return this.$events.emit('show-unable-to-edit-office-task-modal', { return this.$events.emit('show-unable-to-edit-office-task-modal', {
@@ -554,7 +588,7 @@ export default {
// Helper: Get timeblocks for specific employee // Helper: Get timeblocks for specific employee
getEmployeeTimeblocks(employeeId) { getEmployeeTimeblocks(employeeId) {
if (!this.timeblocks) return []; if (!this.timeblocks) return [];
return this.timeblocks.filter((tb) => tb.employee_id === employeeId); return this.timeblocks.filter((tb) => tb.employee_id == employeeId);
}, },
updateEmployeeTimeblocks(updatedTimeblocks, employeeId) { updateEmployeeTimeblocks(updatedTimeblocks, employeeId) {
@@ -565,7 +599,7 @@ export default {
const deletedIds = this.timeblocks const deletedIds = this.timeblocks
.filter( .filter(
(tb) => (tb) =>
tb.employee_id === employeeId && tb.id && !updatedIds.has(tb.id), tb.employee_id == employeeId && tb.id && !updatedIds.has(tb.id),
) )
.map((tb) => tb.id) .map((tb) => tb.id)
.filter((id) => !this.deletedTimeblockIds.includes(id)); .filter((id) => !this.deletedTimeblockIds.includes(id));
@@ -574,7 +608,7 @@ export default {
// Replace timeblocks for this employee // Replace timeblocks for this employee
const otherEmployeeTimeblocks = this.timeblocks.filter( const otherEmployeeTimeblocks = this.timeblocks.filter(
(tb) => tb.employee_id !== employeeId, (tb) => tb.employee_id != employeeId,
); );
const updatedWithEmployeeId = updatedTimeblocks.map((tb) => ({ const updatedWithEmployeeId = updatedTimeblocks.map((tb) => ({
...tb, ...tb,
@@ -608,7 +642,7 @@ export default {
// Get timeblocks for this employee // Get timeblocks for this employee
const employeeTimeblocks = this.timeblocks.filter( const employeeTimeblocks = this.timeblocks.filter(
(tb) => tb.employee_id === employeeId, (tb) => tb.employee_id == employeeId,
); );
if (afterIndex === -1 || afterIndex >= employeeTimeblocks.length - 1) { if (afterIndex === -1 || afterIndex >= employeeTimeblocks.length - 1) {
@@ -654,7 +688,7 @@ export default {
if (this.subtask.employee_id) { if (this.subtask.employee_id) {
// Remove all timeblocks for this employee // Remove all timeblocks for this employee
this.timeblocks = this.timeblocks.filter( this.timeblocks = this.timeblocks.filter(
(tb) => tb.employee_id !== this.subtask.employee_id, (tb) => tb.employee_id != this.subtask.employee_id,
); );
} }
@@ -670,7 +704,7 @@ export default {
if (employee?.id) { if (employee?.id) {
// Remove all timeblocks for this employee // Remove all timeblocks for this employee
this.timeblocks = this.timeblocks.filter( this.timeblocks = this.timeblocks.filter(
(tb) => tb.employee_id !== employee.id, (tb) => tb.employee_id != employee.id,
); );
} }
@@ -741,8 +775,59 @@ export default {
// Store timeblocks in the component's timeblocks array // Store timeblocks in the component's timeblocks array
this.timeblocks = convertedTimeblocks; this.timeblocks = convertedTimeblocks;
// Ensure at least one timeblock exists for edit mode // If draft with employees data, parse timeblocks for each employee
if (data.employee_id && this.timeblocks.length === 0) { if (
data.is_draft &&
data.employees &&
Array.isArray(data.employees)
) {
const draftTimeblocks = [];
data.employees.forEach((employee) => {
if (employee.timeblocks && Array.isArray(employee.timeblocks)) {
employee.timeblocks.forEach((timeblock) => {
// Convert BE format to internal format
if (timeblock.start && timeblock.end) {
const startMoment = moment(
timeblock.start,
'YYYY-MM-DD HH:mm:ss',
);
const endMoment = moment(
timeblock.end,
'YYYY-MM-DD HH:mm:ss',
);
draftTimeblocks.push({
id: timeblock.id || null,
date: startMoment.toDate(),
starts_at_time: startMoment.format('HH:mm'),
ends_at_time: endMoment.format('HH:mm'),
is_finished: timeblock.is_finished || 0,
employee_id: employee.id, // Associate with employee
});
}
});
}
});
// Use draft timeblocks if they exist
if (draftTimeblocks.length > 0) {
this.timeblocks = draftTimeblocks;
}
// Ensure employees array has proper structure for editing
// Check if last employee is not empty, then add empty slot
const lastEmployee = data.employees[data.employees.length - 1];
if (lastEmployee && (lastEmployee.id || lastEmployee.duration)) {
data.employees.push({});
}
}
// Ensure at least one timeblock exists for edit mode (non-draft single employee)
if (
data.employee_id &&
!data.is_draft &&
this.timeblocks.length === 0
) {
this.addTimeblock(data.employee_id); this.addTimeblock(data.employee_id);
} }
@@ -772,12 +857,21 @@ export default {
// Load timeblocks from localStorage if they exist // Load timeblocks from localStorage if they exist
if (savedTimeblocks) { if (savedTimeblocks) {
try { try {
const parsedTimeblocks = JSON.parse(savedTimeblocks); let parsedTimeblocks = JSON.parse(savedTimeblocks);
// Filter out timeblocks that are not valid
parsedTimeblocks = parsedTimeblocks.filter(
(tb) =>
tb.employee_id && tb.starts_at_time && tb.ends_at_time,
);
if (Array.isArray(parsedTimeblocks)) { if (Array.isArray(parsedTimeblocks)) {
this.timeblocks = parsedTimeblocks.map((tb) => ({ this.timeblocks = parsedTimeblocks.map((tb) => ({
...tb, ...tb,
date: tb.date ? new Date(tb.date) : null, date: tb.date ? new Date(tb.date) : null,
})); }));
} else {
this.timeblocks = [];
} }
} catch (e) { } catch (e) {
console.error('Error parsing saved timeblocks:', e); console.error('Error parsing saved timeblocks:', e);
@@ -812,6 +906,17 @@ export default {
this.subtask.employees = [employee]; this.subtask.employees = [employee];
this.subtask.deadline = subtask.deadline; this.subtask.deadline = subtask.deadline;
this.subtask._deadline_time = subtask._deadline_time; this.subtask._deadline_time = subtask._deadline_time;
setTimeout(() => {
this.timeblocks = [
{
date: new Date(subtask.deadline),
starts_at_time: subtask._deadline_time,
ends_at_time: null,
employee_id: subtask.employee_id,
},
];
}, 500);
} }
if (subtask?.master_task_id && subtask?.project_code) { if (subtask?.master_task_id && subtask?.project_code) {
@@ -881,7 +986,7 @@ export default {
timeblock.date && timeblock.date &&
timeblock.starts_at_time && timeblock.starts_at_time &&
timeblock.ends_at_time && timeblock.ends_at_time &&
timeblock.employee_id === this.subtask.employee_id, timeblock.employee_id == this.subtask.employee_id,
) // Only send complete timeblocks for this employee ) // Only send complete timeblocks for this employee
.map((timeblock) => { .map((timeblock) => {
const dateStr = moment(timeblock.date).format('YYYY-MM-DD'); const dateStr = moment(timeblock.date).format('YYYY-MM-DD');
@@ -895,6 +1000,36 @@ export default {
const payload = { ...this.subtask, timesheets, timeblocks }; const payload = { ...this.subtask, timesheets, timeblocks };
// For drafts with multiple employees, include employees array
if (this.subtask.is_draft && this.isDraftWithMultipleEmployees) {
const validEmployees = this.subtask.employees.filter(
(employee) => employee.id && employee.duration,
);
// Assign timeblocks to each employee
validEmployees.forEach((employee) => {
employee.timeblocks = this.timeblocks
.filter(
(tb) =>
tb.employee_id == employee.id &&
tb.date &&
tb.starts_at_time &&
tb.ends_at_time,
)
.map((tb) => ({
start: `${moment(tb.date).format('YYYY-MM-DD')} ${
tb.starts_at_time
}:00`,
end: `${moment(tb.date).format('YYYY-MM-DD')} ${
tb.ends_at_time
}:00`,
id: tb.id || null,
}));
});
payload.employees = validEmployees;
}
if (concept) { if (concept) {
payload.is_draft = 1; payload.is_draft = 1;
} else { } else {
@@ -925,7 +1060,7 @@ export default {
timeblock.date && timeblock.date &&
timeblock.starts_at_time && timeblock.starts_at_time &&
timeblock.ends_at_time && timeblock.ends_at_time &&
timeblock.employee_id === employee.id, timeblock.employee_id == employee.id,
) )
.map((timeblock) => { .map((timeblock) => {
return { return {
@@ -1002,7 +1137,10 @@ export default {
_mergeDeadlineTimeDate() { _mergeDeadlineTimeDate() {
// Override for concept tasks which may not have a deadline time set (check for invalid date) // Override for concept tasks which may not have a deadline time set (check for invalid date)
if (isNaN(new Date(this.subtask.deadline).getTime())) { if (
isNaN(new Date(this.subtask.deadline).getTime()) ||
!this.subtask._deadline_time
) {
this.subtask.deadline = null; this.subtask.deadline = null;
} else { } else {
const date = new Date(this.subtask.deadline); const date = new Date(this.subtask.deadline);