From 7dcd9eda4db6734d48c3168eb475de2693fad92b Mon Sep 17 00:00:00 2001 From: romankko2 Date: Thu, 1 Aug 2024 17:41:51 +0200 Subject: [PATCH] [sub & master task] saved data in LS + build for stage --- app/dist/js/index.js | 4 +-- .../master-task/z-master-task-modal.vue | 35 +++++++++++++++---- .../plugins/tm@modal/task/z-task-modal.vue | 33 +++++++++++++++-- 3 files changed, 60 insertions(+), 12 deletions(-) diff --git a/app/dist/js/index.js b/app/dist/js/index.js index a8855b5..45514f9 100644 --- a/app/dist/js/index.js +++ b/app/dist/js/index.js @@ -664,7 +664,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _plu /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.push.js */ \"./node_modules/core-js/modules/es.array.push.js\");\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _vuepic_vue_datepicker__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @vuepic/vue-datepicker */ \"./node_modules/@vuepic/vue-datepicker/dist/vue-datepicker.js\");\n/* harmony import */ var _plugins_tm_components_z_files_upload_vue__WEBPACK_IMPORTED_MODULE_2__ = __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_3__ = __webpack_require__(/*! @vuelidate/core */ \"./node_modules/@vuelidate/core/dist/index.esm.js\");\n/* harmony import */ var _vuelidate_validators__WEBPACK_IMPORTED_MODULE_15__ = __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_4__ = __webpack_require__(/*! @/plugins/lib@auth/_utils/error.utils */ \"./src/plugins/lib@auth/_utils/error.utils.ts\");\n/* harmony import */ var _plugins_tm_modal_mixins_vuetify_fix_focus__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/plugins/tm@modal/_mixins/vuetify-fix-focus */ \"./src/plugins/tm@modal/_mixins/vuetify-fix-focus.ts\");\n/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! moment */ \"./node_modules/moment/moment.js\");\n/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(moment__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _vueup_vue_quill__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @vueup/vue-quill */ \"./node_modules/@vueup/vue-quill/dist/vue-quill.esm-bundler.js\");\n/* harmony import */ var _plugins_tm_modal_mixins_modal_mixin__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/plugins/tm@modal/_mixins/modal.mixin */ \"./src/plugins/tm@modal/_mixins/modal.mixin.ts\");\n/* harmony import */ var _vueup_vue_quill_dist_vue_quill_snow_css__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @vueup/vue-quill/dist/vue-quill.snow.css */ \"./node_modules/@vueup/vue-quill/dist/vue-quill.snow.css\");\n/* harmony import */ var _vueup_vue_quill_dist_vue_quill_snow_css__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(_vueup_vue_quill_dist_vue_quill_snow_css__WEBPACK_IMPORTED_MODULE_9__);\n/* harmony import */ var _mixins_selects_mixin__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./_mixins/selects.mixin */ \"./src/plugins/tm@modal/master-task/_mixins/selects.mixin.ts\");\n/* harmony import */ var _components_a_tasks_table_vue__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./_components/a-tasks-table.vue */ \"./src/plugins/tm@modal/master-task/_components/a-tasks-table.vue\");\n/* harmony import */ var _components_a_mastertask_description_vue__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./_components/a-mastertask-description.vue */ \"./src/plugins/tm@modal/master-task/_components/a-mastertask-description.vue\");\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm-bundler.js\");\n/* harmony import */ var _plugins_tm_mixins_autocomplete_mixin__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @/plugins/tm@_mixins/autocomplete.mixin */ \"./src/plugins/tm@_mixins/autocomplete.mixin.ts\");\n\n\n\n\n\n\n// import ZAutocomplete from '@/plugins/tm@_components/z-autocomplete.vue'\n\n\n\n// import tmUtils from '@/plugins/tm@_utils/tm.utils'\n\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n // MIXINS\n // computed: employeesOptions, projectsOptions\n // methods: onProjectSelected, onEmployeeSelected, onEmployeeDurationChanged\n // watch: mastertask.team_id\n\n emits: ['master-task-edited', 'close'],\n mixins: [_plugins_tm_modal_mixins_vuetify_fix_focus__WEBPACK_IMPORTED_MODULE_5__[\"default\"], _mixins_selects_mixin__WEBPACK_IMPORTED_MODULE_10__[\"default\"], _plugins_tm_mixins_autocomplete_mixin__WEBPACK_IMPORTED_MODULE_13__[\"default\"], _plugins_tm_modal_mixins_modal_mixin__WEBPACK_IMPORTED_MODULE_8__[\"default\"]],\n components: {\n AMastertaskDescription: _components_a_mastertask_description_vue__WEBPACK_IMPORTED_MODULE_12__[\"default\"],\n ATasksTable: _components_a_tasks_table_vue__WEBPACK_IMPORTED_MODULE_11__[\"default\"],\n Datepicker: _vuepic_vue_datepicker__WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n ZFilesUpload: _plugins_tm_components_z_files_upload_vue__WEBPACK_IMPORTED_MODULE_2__[\"default\"],\n // ZAutocomplete,\n QuillEditor: _vueup_vue_quill__WEBPACK_IMPORTED_MODULE_7__.QuillEditor\n },\n data() {\n return {\n deadline: null,\n editMode: false,\n visible: false,\n errorUtils: _plugins_lib_auth_utils_error_utils__WEBPACK_IMPORTED_MODULE_4__[\"default\"],\n v$: (0,_vuelidate_core__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(),\n mastertask: null,\n isSaving: false,\n showAddEmployeeInput: false,\n date: null,\n projectCodeSearch: null\n };\n },\n computed: {\n ...(0,vuex__WEBPACK_IMPORTED_MODULE_14__.mapGetters)('tm', ['teams', 'projects', 'enrichedEmployees']),\n enrichedSubtasks() {\n if (!this.mastertask?.subtasks) return null;\n return this.mastertask.subtasks.map(subtask => {\n const employee = this.enrichedEmployees.find(employee => employee.id == subtask.employee_id);\n return {\n ...subtask,\n _initials: employee ? employee.name.charAt(0) + employee.surname.charAt(0) : '?',\n _fullName: employee ? `${employee.name} ${employee.surname}` : ''\n };\n });\n }\n },\n validations() {\n const quillEditorRequired = value => {\n if (!value || !value.length || !value.replace(/<[^>]*>/g, '').length) return false;\n return true;\n };\n return {\n mastertask: {\n employees: {\n required: _vuelidate_validators__WEBPACK_IMPORTED_MODULE_15__.required,\n minLength: (0,_vuelidate_validators__WEBPACK_IMPORTED_MODULE_15__.minLength)(1),\n $each: {\n duration: {\n required: _vuelidate_validators__WEBPACK_IMPORTED_MODULE_15__.required\n }\n }\n },\n project_id: {\n required: _vuelidate_validators__WEBPACK_IMPORTED_MODULE_15__.required\n },\n name: {\n required: _vuelidate_validators__WEBPACK_IMPORTED_MODULE_15__.required\n },\n description: {\n quillEditorRequired\n },\n deadline: {\n required: _vuelidate_validators__WEBPACK_IMPORTED_MODULE_15__.required\n },\n _deadline_time: {\n required: _vuelidate_validators__WEBPACK_IMPORTED_MODULE_15__.required\n }\n }\n };\n },\n mounted() {\n this.$events.on('close-both-modals', this.closeBothModals);\n this.$events.on('master-task:team-member-deleted', ({\n teamId,\n memberId\n }) => {\n if (this.mastertask.team_id != teamId) return;\n this.mastertask.employees = this.mastertask.employees.filter(employee => employee.id != memberId);\n }), this.$events.on('on-mastertask-deleted', mastertask => {\n if (mastertask?.id == this.mastertask?.id) this.closeModal();\n });\n this.$events.on('on-subtask-deleted', task => {\n if (!this.mastertask) return;\n this.mastertask.subtasks = this.mastertask.subtasks.filter(subtask => subtask.id != task.id);\n });\n this.$events.on('on-subtask-edited', task => {\n if (!this.mastertask?.subtasks) return;\n if (this.mastertask.subtasks.find(subtask => subtask.id == task.id)) {\n this.mastertask.subtasks = this.mastertask.subtasks.map(t => t.id == task.id ? task : t);\n } else {\n this.mastertask.subtasks.push(task);\n }\n });\n },\n beforeUnmount() {\n this.$events.off('on-mastertask-deleted');\n this.$events.off('on-subtask-deleted');\n this.$events.off('on-subtask-edited');\n this.$events.off('master-task:team-member-deleted');\n this.$events.off('close-both-modals', this.closeBothModals);\n },\n methods: {\n closeBothModals() {\n this.$emit('close');\n this.visible = false;\n },\n removeEmployee({\n id\n }) {\n // const isEmployeeInTeam = this.mastertask.team?.employees.find(employee => employee.id == id)\n\n // if (isEmployeeInTeam) {\n // \tthis.mastertask.team_id = null\n // \tthis.mastertask.team = null\n // }\n\n this.mastertask.employees = this.mastertask.employees.filter(employee => employee.id != id);\n },\n removeMemberAlert(member) {\n const team = this.mastertask.team;\n this.$events.emit('show-delete-team-member-modal', {\n member,\n team\n });\n },\n async showModal({\n mastertask,\n editMode = false\n }) {\n this.isSaving = false;\n this.editMode = null;\n this.visible = true;\n this.mastertask = null;\n this.$nextTick(() => {\n this.setFocusEvent();\n this.v$.$reset();\n });\n try {\n if (mastertask?.id) {\n this.mastertask = await this.$axios.get_auth_data(`v1/mastertasks/${mastertask.id}`);\n\n // TODO zmazat ked zacne prichadzat project_id a team_id\n const project = this.projects.find(project => project.code == this.mastertask.project_code);\n this.mastertask.project_id = project?.id || null;\n this.mastertask.team_id = this.mastertask.team?.id || null;\n this.mastertask._allEmployees = this.mastertask.subtasks.map(({\n employee_id,\n duration\n }) => {\n const employee = this.enrichedEmployees.find(({\n id\n }) => id == employee_id);\n employee.duration = duration;\n return employee;\n });\n\n // this.mastertask.project_code \t= project.code\n } else {\n this.mastertask = {\n employees: [],\n duration: 0,\n _deadline_time: '17:00'\n };\n }\n this.editMode = editMode || !this.mastertask.id;\n } catch (error) {\n this.$toast.error(error.message || error);\n }\n },\n toggleIsFinished() {\n this.$events.emit('show-complete-master-task-modal', {\n mastertask: this.mastertask\n });\n },\n async save() {\n if (this.mastertask.id) {\n this.mastertask.employees = this.mastertask.employees.map(employee => {\n const {\n duration\n } = this.mastertask.subtasks.find(({\n employee_id\n }) => employee_id == employee.id) || {};\n employee.duration = duration;\n return employee;\n });\n }\n const vuelidateValid = await this.v$.$validate();\n const employeesValid = await this._validateEmployees();\n if (!vuelidateValid || !employeesValid) return;\n if (this.$refs['description']) this.mastertask.description = this.$refs['description'].getHTML();\n this._mergeDeadlineTimeDate();\n try {\n this.isSaving = true;\n this.mastertask.deadline = moment__WEBPACK_IMPORTED_MODULE_6___default()(this.mastertask.deadline).format('YYYY-MM-DD HH:MM:SS');\n if (this.mastertask.id) await this.$axios.patch_auth_form(`v1/mastertasks/${this.mastertask.id}`, this.mastertask);else await this.$axios.post_auth_data('v1/mastertasks', this.mastertask);\n this.$emit('master-task-edited', this.mastertask);\n this.closeModal();\n } catch (error) {\n this.$toast.error(this.$parseError(error));\n } finally {\n this.isSaving = false;\n }\n },\n filesUploaded(files) {\n this.mastertask.files = files;\n },\n closeModal() {\n this.visible = false;\n },\n openDeleteMasterTaskModal(mastertask) {\n this.$events.emit('show-delete-master-task-modal', {\n mastertask\n });\n },\n addTask() {\n this.$events.emit('show-subtask-modal', {\n subtask: {\n master_task_id: this.mastertask.id,\n project_code: this.mastertask.project_code\n }\n });\n },\n onQuillEditorInput() {\n this.mastertask.description = this.$refs['description'].getHTML();\n },\n _mergeDeadlineTimeDate() {\n const date = new Date(this.mastertask.deadline);\n const timeParts = this.mastertask._deadline_time.split(':');\n date.setHours(parseInt(timeParts[0]));\n date.setMinutes(parseInt(timeParts[1]));\n this.mastertask.deadline = date;\n },\n _validateEmployees() {\n let isValid = true;\n this.mastertask.employees = this.mastertask.employees.map(employee => {\n if (!employee.duration) {\n employee.invalid = true;\n isValid = false;\n }\n return employee;\n });\n return isValid;\n }\n },\n watch: {\n editMode() {\n this.$nextTick(() => {\n this.$refs['description']?.setHTML(this.mastertask.description || '');\n if (!this.mastertask?.id) return;\n const date = new Date(this.mastertask.deadline);\n const hours = date.getHours();\n const minutes = date.getMinutes();\n this.mastertask._deadline_time = `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}`;\n });\n }\n\n // mastertask: {\n // \thandler(value) {\n // \t\tconsole.log(value.description)\n // \t},\n // \tdeep: true\n // }\n }\n});\n\n//# sourceURL=webpack://jandl/./src/plugins/tm@modal/master-task/z-master-task-modal.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use%5B0%5D!./node_modules/vue-loader/dist/index.js??ruleSet%5B0%5D.use%5B0%5D"); +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 _vuepic_vue_datepicker__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @vuepic/vue-datepicker */ \"./node_modules/@vuepic/vue-datepicker/dist/vue-datepicker.js\");\n/* harmony import */ var _plugins_tm_components_z_files_upload_vue__WEBPACK_IMPORTED_MODULE_2__ = __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_3__ = __webpack_require__(/*! @vuelidate/core */ \"./node_modules/@vuelidate/core/dist/index.esm.js\");\n/* harmony import */ var _vuelidate_validators__WEBPACK_IMPORTED_MODULE_15__ = __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_4__ = __webpack_require__(/*! @/plugins/lib@auth/_utils/error.utils */ \"./src/plugins/lib@auth/_utils/error.utils.ts\");\n/* harmony import */ var _plugins_tm_modal_mixins_vuetify_fix_focus__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/plugins/tm@modal/_mixins/vuetify-fix-focus */ \"./src/plugins/tm@modal/_mixins/vuetify-fix-focus.ts\");\n/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! moment */ \"./node_modules/moment/moment.js\");\n/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(moment__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _vueup_vue_quill__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @vueup/vue-quill */ \"./node_modules/@vueup/vue-quill/dist/vue-quill.esm-bundler.js\");\n/* harmony import */ var _plugins_tm_modal_mixins_modal_mixin__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/plugins/tm@modal/_mixins/modal.mixin */ \"./src/plugins/tm@modal/_mixins/modal.mixin.ts\");\n/* harmony import */ var _vueup_vue_quill_dist_vue_quill_snow_css__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @vueup/vue-quill/dist/vue-quill.snow.css */ \"./node_modules/@vueup/vue-quill/dist/vue-quill.snow.css\");\n/* harmony import */ var _vueup_vue_quill_dist_vue_quill_snow_css__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(_vueup_vue_quill_dist_vue_quill_snow_css__WEBPACK_IMPORTED_MODULE_9__);\n/* harmony import */ var _mixins_selects_mixin__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./_mixins/selects.mixin */ \"./src/plugins/tm@modal/master-task/_mixins/selects.mixin.ts\");\n/* harmony import */ var _components_a_tasks_table_vue__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./_components/a-tasks-table.vue */ \"./src/plugins/tm@modal/master-task/_components/a-tasks-table.vue\");\n/* harmony import */ var _components_a_mastertask_description_vue__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./_components/a-mastertask-description.vue */ \"./src/plugins/tm@modal/master-task/_components/a-mastertask-description.vue\");\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm-bundler.js\");\n/* harmony import */ var _plugins_tm_mixins_autocomplete_mixin__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @/plugins/tm@_mixins/autocomplete.mixin */ \"./src/plugins/tm@_mixins/autocomplete.mixin.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// import ZAutocomplete from '@/plugins/tm@_components/z-autocomplete.vue'\n\n\n\n// import tmUtils from '@/plugins/tm@_utils/tm.utils'\n\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n // MIXINS\n // computed: employeesOptions, projectsOptions\n // methods: onProjectSelected, onEmployeeSelected, onEmployeeDurationChanged\n // watch: mastertask.team_id\n\n emits: ['master-task-edited', 'close'],\n mixins: [_plugins_tm_modal_mixins_vuetify_fix_focus__WEBPACK_IMPORTED_MODULE_5__[\"default\"], _mixins_selects_mixin__WEBPACK_IMPORTED_MODULE_10__[\"default\"], _plugins_tm_mixins_autocomplete_mixin__WEBPACK_IMPORTED_MODULE_13__[\"default\"], _plugins_tm_modal_mixins_modal_mixin__WEBPACK_IMPORTED_MODULE_8__[\"default\"]],\n components: {\n AMastertaskDescription: _components_a_mastertask_description_vue__WEBPACK_IMPORTED_MODULE_12__[\"default\"],\n ATasksTable: _components_a_tasks_table_vue__WEBPACK_IMPORTED_MODULE_11__[\"default\"],\n Datepicker: _vuepic_vue_datepicker__WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n ZFilesUpload: _plugins_tm_components_z_files_upload_vue__WEBPACK_IMPORTED_MODULE_2__[\"default\"],\n // ZAutocomplete,\n QuillEditor: _vueup_vue_quill__WEBPACK_IMPORTED_MODULE_7__.QuillEditor\n },\n data() {\n return {\n deadline: null,\n editMode: false,\n visible: false,\n errorUtils: _plugins_lib_auth_utils_error_utils__WEBPACK_IMPORTED_MODULE_4__[\"default\"],\n v$: (0,_vuelidate_core__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(),\n mastertask: null,\n isSaving: false,\n showAddEmployeeInput: false,\n date: null,\n projectCodeSearch: null\n };\n },\n computed: {\n ...(0,vuex__WEBPACK_IMPORTED_MODULE_14__.mapGetters)('tm', ['teams', 'projects', 'enrichedEmployees']),\n enrichedSubtasks() {\n if (!this.mastertask?.subtasks) return null;\n return this.mastertask.subtasks.map(subtask => {\n const employee = this.enrichedEmployees.find(employee => employee.id == subtask.employee_id);\n return {\n ...subtask,\n _initials: employee ? employee.name.charAt(0) + employee.surname.charAt(0) : '?',\n _fullName: employee ? `${employee.name} ${employee.surname}` : ''\n };\n });\n }\n },\n validations() {\n const quillEditorRequired = value => {\n if (!value || !value.length || !value.replace(/<[^>]*>/g, '').length) return false;\n return true;\n };\n return {\n mastertask: {\n employees: {\n required: _vuelidate_validators__WEBPACK_IMPORTED_MODULE_15__.required,\n minLength: (0,_vuelidate_validators__WEBPACK_IMPORTED_MODULE_15__.minLength)(1),\n $each: {\n duration: {\n required: _vuelidate_validators__WEBPACK_IMPORTED_MODULE_15__.required\n }\n }\n },\n project_id: {\n required: _vuelidate_validators__WEBPACK_IMPORTED_MODULE_15__.required\n },\n name: {\n required: _vuelidate_validators__WEBPACK_IMPORTED_MODULE_15__.required\n },\n description: {\n quillEditorRequired\n },\n deadline: {\n required: _vuelidate_validators__WEBPACK_IMPORTED_MODULE_15__.required\n },\n _deadline_time: {\n required: _vuelidate_validators__WEBPACK_IMPORTED_MODULE_15__.required\n }\n }\n };\n },\n mounted() {\n this.$events.on('close-both-modals', this.closeBothModals);\n this.$events.on('master-task:team-member-deleted', ({\n teamId,\n memberId\n }) => {\n if (this.mastertask.team_id != teamId) return;\n this.mastertask.employees = this.mastertask.employees.filter(employee => employee.id != memberId);\n }), this.$events.on('on-mastertask-deleted', mastertask => {\n if (mastertask?.id == this.mastertask?.id) this.closeModal();\n });\n this.$events.on('on-subtask-deleted', task => {\n if (!this.mastertask) return;\n this.mastertask.subtasks = this.mastertask.subtasks.filter(subtask => subtask.id != task.id);\n });\n this.$events.on('on-subtask-edited', task => {\n if (!this.mastertask?.subtasks) return;\n if (this.mastertask.subtasks.find(subtask => subtask.id == task.id)) {\n this.mastertask.subtasks = this.mastertask.subtasks.map(t => t.id == task.id ? task : t);\n } else {\n this.mastertask.subtasks.push(task);\n }\n });\n },\n beforeUnmount() {\n this.$events.off('on-mastertask-deleted');\n this.$events.off('on-subtask-deleted');\n this.$events.off('on-subtask-edited');\n this.$events.off('master-task:team-member-deleted');\n this.$events.off('close-both-modals', this.closeBothModals);\n },\n methods: {\n closeBothModals() {\n this.$emit('close');\n this.visible = false;\n },\n removeEmployee({\n id\n }) {\n // const isEmployeeInTeam = this.mastertask.team?.employees.find(employee => employee.id == id)\n\n // if (isEmployeeInTeam) {\n // \tthis.mastertask.team_id = null\n // \tthis.mastertask.team = null\n // }\n\n this.mastertask.employees = this.mastertask.employees.filter(employee => employee.id != id);\n },\n removeMemberAlert(member) {\n const team = this.mastertask.team;\n this.$events.emit('show-delete-team-member-modal', {\n member,\n team\n });\n },\n async showModal({\n mastertask,\n editMode = false\n }) {\n this.isSaving = false;\n this.editMode = null;\n this.visible = true;\n this.mastertask = null;\n this.$nextTick(() => {\n this.setFocusEvent();\n this.v$.$reset();\n });\n try {\n if (mastertask?.id) {\n this.mastertask = await this.$axios.get_auth_data(`v1/mastertasks/${mastertask.id}`);\n\n // TODO zmazat ked zacne prichadzat project_id a team_id\n const project = this.projects.find(project => project.code == this.mastertask.project_code);\n this.mastertask.project_id = project?.id || null;\n this.mastertask.team_id = this.mastertask.team?.id || null;\n this.mastertask._allEmployees = this.mastertask.subtasks.map(({\n employee_id,\n duration\n }) => {\n const employee = this.enrichedEmployees.find(({\n id\n }) => id == employee_id);\n employee.duration = duration;\n return employee;\n });\n\n // this.mastertask.project_code \t= project.code\n } else {\n const savedMastertask = localStorage.getItem('mastertaskData');\n try {\n if (savedMastertask) {\n const parsedMastertask = JSON.parse(savedMastertask);\n this.mastertask = parsedMastertask;\n // If the parsed result is not an object, reset to default\n if (typeof this.mastertask !== 'object' || this.mastertask === null) {\n throw new Error('Parsed mastertask is not an object');\n }\n this.$nextTick(() => {\n this.$refs['description']?.setHTML(this.mastertask.description || '');\n });\n } else {\n throw new Error('mastertaskData is null or undefined');\n }\n } catch (error) {\n console.error('Error parsing mastertaskData:', error);\n this.mastertask = {\n employees: [],\n duration: 0,\n _deadline_time: '17:00'\n };\n }\n }\n this.editMode = editMode || !this.mastertask.id;\n } catch (error) {\n this.$toast.error(error.message || error);\n }\n },\n toggleIsFinished() {\n this.$events.emit('show-complete-master-task-modal', {\n mastertask: this.mastertask\n });\n },\n async save() {\n if (this.mastertask.id) {\n this.mastertask.employees = this.mastertask.employees.map(employee => {\n const {\n duration\n } = this.mastertask.subtasks.find(({\n employee_id\n }) => employee_id == employee.id) || {};\n employee.duration = duration;\n return employee;\n });\n }\n const vuelidateValid = await this.v$.$validate();\n const employeesValid = await this._validateEmployees();\n if (!vuelidateValid || !employeesValid) return;\n if (this.$refs['description']) this.mastertask.description = this.$refs['description'].getHTML();\n this._mergeDeadlineTimeDate();\n try {\n this.isSaving = true;\n this.mastertask.deadline = moment__WEBPACK_IMPORTED_MODULE_6___default()(this.mastertask.deadline).format('YYYY-MM-DD HH:MM:SS');\n if (this.mastertask.id) await this.$axios.patch_auth_form(`v1/mastertasks/${this.mastertask.id}`, this.mastertask);else await this.$axios.post_auth_data('v1/mastertasks', this.mastertask);\n localStorage.removeItem('mastertaskData');\n this.$emit('master-task-edited', this.mastertask);\n this.closeModal();\n } catch (error) {\n this.$toast.error(this.$parseError(error));\n } finally {\n this.isSaving = false;\n }\n },\n filesUploaded(files) {\n this.mastertask.files = files;\n },\n closeModal() {\n this.visible = false;\n },\n openDeleteMasterTaskModal(mastertask) {\n this.$events.emit('show-delete-master-task-modal', {\n mastertask\n });\n },\n addTask() {\n this.$events.emit('show-subtask-modal', {\n subtask: {\n master_task_id: this.mastertask.id,\n project_code: this.mastertask.project_code\n }\n });\n },\n onQuillEditorInput() {\n this.mastertask.description = this.$refs['description'].getHTML();\n },\n _mergeDeadlineTimeDate() {\n const date = new Date(this.mastertask.deadline);\n const timeParts = this.mastertask._deadline_time.split(':');\n date.setHours(parseInt(timeParts[0]));\n date.setMinutes(parseInt(timeParts[1]));\n this.mastertask.deadline = date;\n },\n _validateEmployees() {\n let isValid = true;\n this.mastertask.employees = this.mastertask.employees.map(employee => {\n if (!employee.duration) {\n employee.invalid = true;\n isValid = false;\n }\n return employee;\n });\n return isValid;\n }\n },\n watch: {\n editMode() {\n this.$nextTick(() => {\n this.$refs['description']?.setHTML(this.mastertask.description || '');\n if (!this.mastertask?.id) return;\n const date = new Date(this.mastertask.deadline);\n const hours = date.getHours();\n const minutes = date.getMinutes();\n this.mastertask._deadline_time = `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}`;\n });\n },\n mastertask: {\n handler(val) {\n if (this.editMode && !this.mastertask?.id) {\n localStorage.setItem('mastertaskData', JSON.stringify(val));\n }\n },\n deep: true\n }\n }\n});\n\n//# sourceURL=webpack://jandl/./src/plugins/tm@modal/master-task/z-master-task-modal.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use%5B0%5D!./node_modules/vue-loader/dist/index.js??ruleSet%5B0%5D.use%5B0%5D"); /***/ }), @@ -851,7 +851,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.push.js */ \"./node_modules/core-js/modules/es.array.push.js\");\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _vuepic_vue_datepicker__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @vuepic/vue-datepicker */ \"./node_modules/@vuepic/vue-datepicker/dist/vue-datepicker.js\");\n/* harmony import */ var _plugins_tm_components_z_files_upload_vue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @/plugins/tm@_components/z-files-upload.vue */ \"./src/plugins/tm@_components/z-files-upload.vue\");\n/* harmony import */ var _plugins_tm_modal_task_components_components_a_task_timeblocks_vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @/plugins/tm@modal/task/_components/_components/a-task-timeblocks.vue */ \"./src/plugins/tm@modal/task/_components/_components/a-task-timeblocks.vue\");\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_18__ = __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_5__ = __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_6__ = __webpack_require__(/*! @vueup/vue-quill */ \"./node_modules/@vueup/vue-quill/dist/vue-quill.esm-bundler.js\");\n/* harmony import */ var _plugins_tm_modal_mixins_vuetify_fix_focus__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/plugins/tm@modal/_mixins/vuetify-fix-focus */ \"./src/plugins/tm@modal/_mixins/vuetify-fix-focus.ts\");\n/* harmony import */ var _master_task_mixins_selects_mixin__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../master-task/_mixins/selects.mixin */ \"./src/plugins/tm@modal/master-task/_mixins/selects.mixin.ts\");\n/* harmony import */ var file_saver__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! file-saver */ \"./node_modules/file-saver/dist/FileSaver.min.js\");\n/* harmony import */ var file_saver__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(file_saver__WEBPACK_IMPORTED_MODULE_9__);\n/* harmony import */ var _plugins_tm_utils_tm_utils__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @/plugins/tm@_utils/tm.utils */ \"./src/plugins/tm@_utils/tm.utils.ts\");\n/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! moment */ \"./node_modules/moment/moment.js\");\n/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(moment__WEBPACK_IMPORTED_MODULE_11__);\n/* harmony import */ var _vueup_vue_quill_dist_vue_quill_snow_css__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @vueup/vue-quill/dist/vue-quill.snow.css */ \"./node_modules/@vueup/vue-quill/dist/vue-quill.snow.css\");\n/* harmony import */ var _vueup_vue_quill_dist_vue_quill_snow_css__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(_vueup_vue_quill_dist_vue_quill_snow_css__WEBPACK_IMPORTED_MODULE_12__);\n/* harmony import */ var _plugins_tm_mixins_autocomplete_mixin__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @/plugins/tm@_mixins/autocomplete.mixin */ \"./src/plugins/tm@_mixins/autocomplete.mixin.ts\");\n/* harmony import */ var _components_z_task_readonly_info_vue__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./_components/z-task-readonly-info.vue */ \"./src/plugins/tm@modal/task/_components/z-task-readonly-info.vue\");\n/* harmony import */ var _components_a_timeblock_vue__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./_components/a-timeblock.vue */ \"./src/plugins/tm@modal/task/_components/a-timeblock.vue\");\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm-bundler.js\");\n/* harmony import */ var _plugins_tm_modal_mixins_modal_mixin__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @/plugins/tm@modal/_mixins/modal.mixin */ \"./src/plugins/tm@modal/_mixins/modal.mixin.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\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n emits: ['close', 'refresh'],\n mixins: [_plugins_tm_modal_mixins_vuetify_fix_focus__WEBPACK_IMPORTED_MODULE_7__[\"default\"], _master_task_mixins_selects_mixin__WEBPACK_IMPORTED_MODULE_8__[\"default\"], _plugins_tm_mixins_autocomplete_mixin__WEBPACK_IMPORTED_MODULE_13__[\"default\"], _plugins_tm_modal_mixins_modal_mixin__WEBPACK_IMPORTED_MODULE_16__[\"default\"]],\n components: {\n ZTaskReadonlyInfo: _components_z_task_readonly_info_vue__WEBPACK_IMPORTED_MODULE_14__[\"default\"],\n ATimeblock: _components_a_timeblock_vue__WEBPACK_IMPORTED_MODULE_15__[\"default\"],\n ZFilesUpload: _plugins_tm_components_z_files_upload_vue__WEBPACK_IMPORTED_MODULE_2__[\"default\"],\n Datepicker: _vuepic_vue_datepicker__WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n // ATaskTimeblocks,\n QuillEditor: _vueup_vue_quill__WEBPACK_IMPORTED_MODULE_6__.QuillEditor\n },\n data() {\n return {\n tmUtils: _plugins_tm_utils_tm_utils__WEBPACK_IMPORTED_MODULE_10__[\"default\"],\n editMode: false,\n visible: false,\n subtask: null,\n isSaving: false,\n errorUtils: _plugins_lib_auth_utils_error_utils__WEBPACK_IMPORTED_MODULE_5__[\"default\"],\n v$: (0,_vuelidate_core__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(),\n employeeValidations: [],\n showDatePicker: false,\n selectedNewDate: [],\n timeblocks: [{\n date: null,\n starts_at_time: null,\n ends_at_time: null\n }]\n };\n },\n computed: {\n ...(0,vuex__WEBPACK_IMPORTED_MODULE_17__.mapGetters)('tm', ['mastertasks', 'enrichedEmployees'])\n },\n validations() {\n return {\n subtask: {\n master_task_id: {\n required: _vuelidate_validators__WEBPACK_IMPORTED_MODULE_18__.required\n },\n deadline: {\n required: _vuelidate_validators__WEBPACK_IMPORTED_MODULE_18__.required\n },\n _deadline_time: {\n required: _vuelidate_validators__WEBPACK_IMPORTED_MODULE_18__.required\n }\n }\n };\n },\n mounted() {\n this.$events.on('add-timeblock', timeblock => {\n if (!this.subtask?.timeblocks) {\n this.subtask.timeblocks = [];\n }\n if (!this.subtask?.timesheets) {\n this.subtask.timesheets = [];\n }\n if (!this.subtask?.is_finished) {\n this.subtask.is_finished = 0;\n }\n this.subtask.timeblocks.push(timeblock);\n });\n this.$events.on('on-subtask-edited', subtask => {\n if (subtask?.id == this.subtask?.id) this.subtask = this._enrichTask(subtask);\n\n // TODO: Remove? riesil som neodstranovanie jedineho zanamu v trvani a odpracovanom case\n this.$forceUpdate();\n });\n this.$events.on('on-subtask-deleted', subtask => {\n if (subtask?.id == this.subtask?.id) this.closeModal();\n });\n },\n methods: {\n openDatepicker(ref) {\n this.$refs[ref].openMenu();\n },\n updateTimeblock(val, index) {\n this.timeblocks[index] = val;\n },\n removeTimeblock(index) {\n this.timeblocks.splice(index, 1);\n },\n async showModal({\n subtask,\n editMode = false,\n mastertask = {}\n }) {\n this.isSaving = false;\n this.subtask = null;\n this.visible = true;\n this.timeblocks = [{\n date: null,\n starts_at_time: null,\n ends_at_time: null\n }];\n this.$nextTick(() => {\n this.v$.$reset();\n this.setFocusEvent();\n });\n try {\n if (subtask?.id) {\n const data = await this.$axios.get_auth_data(`v1/subtasks/${subtask.id}`);\n if (!data.deadline) {\n this.editMode = editMode || !data.id;\n return this.subtask = this._enrichTask(data);\n }\n const splittedDeadline = data.deadline.split(' ');\n data.deadline = moment__WEBPACK_IMPORTED_MODULE_11___default()(splittedDeadline[0]);\n data._deadline_time = splittedDeadline[1];\n this.subtask = this._enrichTask(data);\n } else {\n this.subtask = {\n master_task: mastertask,\n employees: [{}],\n _deadline_time: '17:00'\n };\n if (subtask?.deadline && subtask._deadline_time && subtask.employee_id) {\n const employee = this.enrichedEmployees.find(employee => employee.id == subtask.employee_id);\n this.subtask.employees = [employee];\n this.subtask.deadline = subtask.deadline;\n this.subtask._deadline_time = subtask._deadline_time;\n }\n if (subtask?.master_task_id && subtask?.project_code) {\n this.subtask.master_task_id = subtask.master_task_id;\n this.subtask.project_code = subtask.project_code;\n }\n }\n this.editMode = editMode || !this.subtask.id;\n } catch (error) {\n console.error('ERROR', error);\n this.$toast.error(this.$parseError(error));\n }\n },\n deleteTimeblock(i) {\n this.subtask.timeblocks.splice(i, 1);\n },\n closeModal() {\n this.visible = false;\n this.$router.replace({\n name: this.$route.name\n });\n },\n async save() {\n const employeesValid = await this._validateEmployees();\n const timeblocksValid = this.subtask?.id ? true : await this._validateTimeblocks();\n if (!(await this.v$.$validate())) return;\n if (!employeesValid || !timeblocksValid) return;\n this.subtask.description = this.$refs['description'].getHTML();\n this._mergeDeadlineTimeDate();\n try {\n this.isSaving = true;\n this.subtask.deadline = moment__WEBPACK_IMPORTED_MODULE_11___default()(this.subtask.deadline).format('YYYY-MM-DD HH:mm:SS');\n if (this.subtask?.id) {\n const timesheets = this.subtask.timesheets.map(timesheet => {\n delete timesheet.employee_name;\n return timesheet;\n });\n const {\n subtask\n } = await this.$axios.patch_auth_form(`v1/subtasks/${this.subtask.id}`, {\n ...this.subtask,\n timesheets\n });\n this.$store.commit('tm/update_subtask', subtask);\n this.$events.emit('on-subtask-edited', this.subtask);\n } else {\n this.subtask.employees.forEach(employee => {\n if (employee.id) employee.timeblocks = this.timeblocks.filter(timeblock => timeblock.date).map(timeblock => {\n return {\n start: `${moment__WEBPACK_IMPORTED_MODULE_11___default()(timeblock.date).format('YYYY-MM-DD')} ${timeblock.starts_at_time}:00`,\n end: `${moment__WEBPACK_IMPORTED_MODULE_11___default()(timeblock.date).format('YYYY-MM-DD')} ${timeblock.ends_at_time}:00`,\n id: null\n };\n });\n });\n const subtaskCopy = this.subtask;\n delete subtaskCopy._master_task;\n const {\n subtasks\n } = await this.$axios.post_auth(`v1/mastertasks/${this.subtask.master_task_id}/subtasks`, subtaskCopy);\n this.subtask.id = subtasks[0].id;\n subtasks.forEach(subtask => {\n this.$store.commit('tm/update_subtask', subtask);\n this.$events.emit('on-subtask-edited', this.subtask);\n });\n this.$events.emit('task-created');\n this.$events.emit('close-both-modals');\n }\n this.closeModal();\n } catch (error) {\n this.$toast.error(this.$parseError(error));\n } finally {\n this.isSaving = false;\n }\n },\n openDeleteTaskModal(subtask) {\n this.$events.emit('show-delete-task-modal', {\n subtask\n });\n },\n showCompleteTaskModal() {\n this.$events.emit('show-complete-task-modal', {\n subtask: this.subtask\n });\n if (this.subtask.deadline) this.subtask.deadline = _plugins_tm_utils_tm_utils__WEBPACK_IMPORTED_MODULE_10__[\"default\"].formatDateTimeForBackend(this.subtask.deadline);\n },\n filesUploaded(files) {\n this.subtask.files = files;\n },\n updateSubtask(subtask) {\n this.subtask = subtask;\n },\n _mergeDeadlineTimeDate() {\n const date = new Date(this.subtask.deadline);\n const timeParts = this.subtask._deadline_time.split(':');\n date.setHours(parseInt(timeParts[0]));\n date.setMinutes(parseInt(timeParts[1]));\n this.subtask.deadline = date;\n },\n _validateEmployees() {\n return new Promise(resolve => {\n this.employeeValidations = [];\n if (this.subtask.id) {\n if (this.subtask.employee && this.subtask.duration) return;\n this.employeeValidations[0] = {};\n if (!this.subtask.employee_id) this.employeeValidations[0].employee = true;\n if (!this.subtask.duration) this.employeeValidations[0].duration = true;\n } else {\n this.subtask.employees.forEach((employee, index) => {\n if (index == this.subtask.employees.length - 1 && index > 0) return; // Skip the last which is allways empty\n\n if (employee.id && employee.duration) return;\n this.employeeValidations[index] = {};\n if (!employee.id) this.employeeValidations[index].employee = true;\n if (!employee.duration) this.employeeValidations[index].duration = true;\n });\n }\n const isError = this.employeeValidations.some(employee => employee.duration || employee.employee);\n resolve(!isError);\n });\n },\n async _validateTimeblocks() {\n let invalid = false;\n for (let i = 0; i < this.timeblocks.length; i++) {\n const ref = this.$refs[`timetable-${i}`];\n invalid = (await ref[0].v$.$validate()) || invalid;\n }\n return invalid;\n },\n _enrichTask(subtask) {\n return {\n ...subtask,\n _created_by: this.enrichedEmployees.find(employee => employee.id == subtask.created_by),\n _employee: this.enrichedEmployees.find(employee => employee.id == subtask.employee_id),\n _master_task: this.mastertasks.find(mastertask => mastertask.id == subtask.master_task_id)\n };\n }\n },\n watch: {\n 'subtask.employee_id'(value, oldValue) {\n if (!value || !oldValue) return;\n this.subtask.timeblocks = [];\n this.subtask._employee = this.enrichedEmployees.find(employee => employee.id == this.subtask.employee_id);\n },\n 'subtask.employees': {\n handler() {\n if (!this.subtask?.employees) return;\n const lastEmployee = this.subtask.employees[this.subtask.employees.length - 1];\n if (lastEmployee.id || lastEmployee.duration) this.subtask.employees.push({});\n },\n deep: true\n },\n 'subtask.master_task_id'(value) {\n if (!value) return;\n this.subtask._master_task = this.mastertasks.find(mastertask => mastertask.id == this.subtask.master_task_id);\n this.subtask.project_code = this.subtask._master_task?.project_code || null;\n },\n editMode() {\n this.$nextTick(() => {\n this.$refs['description']?.setHTML(this.subtask.description || '');\n });\n }\n }\n});\n\n//# sourceURL=webpack://jandl/./src/plugins/tm@modal/task/z-task-modal.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use%5B0%5D!./node_modules/vue-loader/dist/index.js??ruleSet%5B0%5D.use%5B0%5D"); +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 _vuepic_vue_datepicker__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @vuepic/vue-datepicker */ \"./node_modules/@vuepic/vue-datepicker/dist/vue-datepicker.js\");\n/* harmony import */ var _plugins_tm_components_z_files_upload_vue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @/plugins/tm@_components/z-files-upload.vue */ \"./src/plugins/tm@_components/z-files-upload.vue\");\n/* harmony import */ var _plugins_tm_modal_task_components_components_a_task_timeblocks_vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @/plugins/tm@modal/task/_components/_components/a-task-timeblocks.vue */ \"./src/plugins/tm@modal/task/_components/_components/a-task-timeblocks.vue\");\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_18__ = __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_5__ = __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_6__ = __webpack_require__(/*! @vueup/vue-quill */ \"./node_modules/@vueup/vue-quill/dist/vue-quill.esm-bundler.js\");\n/* harmony import */ var _plugins_tm_modal_mixins_vuetify_fix_focus__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/plugins/tm@modal/_mixins/vuetify-fix-focus */ \"./src/plugins/tm@modal/_mixins/vuetify-fix-focus.ts\");\n/* harmony import */ var _master_task_mixins_selects_mixin__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../master-task/_mixins/selects.mixin */ \"./src/plugins/tm@modal/master-task/_mixins/selects.mixin.ts\");\n/* harmony import */ var file_saver__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! file-saver */ \"./node_modules/file-saver/dist/FileSaver.min.js\");\n/* harmony import */ var file_saver__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(file_saver__WEBPACK_IMPORTED_MODULE_9__);\n/* harmony import */ var _plugins_tm_utils_tm_utils__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @/plugins/tm@_utils/tm.utils */ \"./src/plugins/tm@_utils/tm.utils.ts\");\n/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! moment */ \"./node_modules/moment/moment.js\");\n/* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(moment__WEBPACK_IMPORTED_MODULE_11__);\n/* harmony import */ var _vueup_vue_quill_dist_vue_quill_snow_css__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @vueup/vue-quill/dist/vue-quill.snow.css */ \"./node_modules/@vueup/vue-quill/dist/vue-quill.snow.css\");\n/* harmony import */ var _vueup_vue_quill_dist_vue_quill_snow_css__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(_vueup_vue_quill_dist_vue_quill_snow_css__WEBPACK_IMPORTED_MODULE_12__);\n/* harmony import */ var _plugins_tm_mixins_autocomplete_mixin__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @/plugins/tm@_mixins/autocomplete.mixin */ \"./src/plugins/tm@_mixins/autocomplete.mixin.ts\");\n/* harmony import */ var _components_z_task_readonly_info_vue__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./_components/z-task-readonly-info.vue */ \"./src/plugins/tm@modal/task/_components/z-task-readonly-info.vue\");\n/* harmony import */ var _components_a_timeblock_vue__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./_components/a-timeblock.vue */ \"./src/plugins/tm@modal/task/_components/a-timeblock.vue\");\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm-bundler.js\");\n/* harmony import */ var _plugins_tm_modal_mixins_modal_mixin__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @/plugins/tm@modal/_mixins/modal.mixin */ \"./src/plugins/tm@modal/_mixins/modal.mixin.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\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n emits: ['close', 'refresh'],\n mixins: [_plugins_tm_modal_mixins_vuetify_fix_focus__WEBPACK_IMPORTED_MODULE_7__[\"default\"], _master_task_mixins_selects_mixin__WEBPACK_IMPORTED_MODULE_8__[\"default\"], _plugins_tm_mixins_autocomplete_mixin__WEBPACK_IMPORTED_MODULE_13__[\"default\"], _plugins_tm_modal_mixins_modal_mixin__WEBPACK_IMPORTED_MODULE_16__[\"default\"]],\n components: {\n ZTaskReadonlyInfo: _components_z_task_readonly_info_vue__WEBPACK_IMPORTED_MODULE_14__[\"default\"],\n ATimeblock: _components_a_timeblock_vue__WEBPACK_IMPORTED_MODULE_15__[\"default\"],\n ZFilesUpload: _plugins_tm_components_z_files_upload_vue__WEBPACK_IMPORTED_MODULE_2__[\"default\"],\n Datepicker: _vuepic_vue_datepicker__WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n // ATaskTimeblocks,\n QuillEditor: _vueup_vue_quill__WEBPACK_IMPORTED_MODULE_6__.QuillEditor\n },\n data() {\n return {\n tmUtils: _plugins_tm_utils_tm_utils__WEBPACK_IMPORTED_MODULE_10__[\"default\"],\n editMode: false,\n visible: false,\n subtask: null,\n isSaving: false,\n errorUtils: _plugins_lib_auth_utils_error_utils__WEBPACK_IMPORTED_MODULE_5__[\"default\"],\n v$: (0,_vuelidate_core__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(),\n employeeValidations: [],\n showDatePicker: false,\n selectedNewDate: [],\n timeblocks: [{\n date: null,\n starts_at_time: null,\n ends_at_time: null\n }]\n };\n },\n computed: {\n ...(0,vuex__WEBPACK_IMPORTED_MODULE_17__.mapGetters)('tm', ['mastertasks', 'enrichedEmployees'])\n },\n validations() {\n return {\n subtask: {\n master_task_id: {\n required: _vuelidate_validators__WEBPACK_IMPORTED_MODULE_18__.required\n },\n deadline: {\n required: _vuelidate_validators__WEBPACK_IMPORTED_MODULE_18__.required\n },\n _deadline_time: {\n required: _vuelidate_validators__WEBPACK_IMPORTED_MODULE_18__.required\n }\n }\n };\n },\n mounted() {\n this.$events.on('add-timeblock', timeblock => {\n if (!this.subtask?.timeblocks) {\n this.subtask.timeblocks = [];\n }\n if (!this.subtask?.timesheets) {\n this.subtask.timesheets = [];\n }\n if (!this.subtask?.is_finished) {\n this.subtask.is_finished = 0;\n }\n this.subtask.timeblocks.push(timeblock);\n });\n this.$events.on('on-subtask-edited', subtask => {\n if (subtask?.id == this.subtask?.id) this.subtask = this._enrichTask(subtask);\n\n // TODO: Remove? riesil som neodstranovanie jedineho zanamu v trvani a odpracovanom case\n this.$forceUpdate();\n });\n this.$events.on('on-subtask-deleted', subtask => {\n if (subtask?.id == this.subtask?.id) this.closeModal();\n });\n },\n methods: {\n openDatepicker(ref) {\n this.$refs[ref].openMenu();\n },\n updateTimeblock(val, index) {\n this.timeblocks[index] = val;\n },\n removeTimeblock(index) {\n this.timeblocks.splice(index, 1);\n },\n async showModal({\n subtask,\n editMode = false,\n mastertask = {}\n }) {\n this.isSaving = false;\n this.subtask = null;\n this.visible = true;\n this.timeblocks = [{\n date: null,\n starts_at_time: null,\n ends_at_time: null\n }];\n this.$nextTick(() => {\n this.v$.$reset();\n this.setFocusEvent();\n });\n try {\n if (subtask?.id) {\n const data = await this.$axios.get_auth_data(`v1/subtasks/${subtask.id}`);\n if (!data.deadline) {\n this.editMode = editMode || !data.id;\n return this.subtask = this._enrichTask(data);\n }\n const splittedDeadline = data.deadline.split(' ');\n data.deadline = moment__WEBPACK_IMPORTED_MODULE_11___default()(splittedDeadline[0]);\n data._deadline_time = splittedDeadline[1];\n this.subtask = this._enrichTask(data);\n } else {\n const savedSubtask = localStorage.getItem('subtaskData');\n try {\n if (savedSubtask) {\n const parsedSubtask = JSON.parse(savedSubtask);\n this.subtask = parsedSubtask;\n // If the parsed result is not an object, reset to default\n if (typeof this.subtask !== 'object' || this.subtask === null) {\n throw new Error('Parsed subtask is not an object');\n }\n this.$nextTick(() => {\n this.$refs['description']?.setHTML(this.subtask.description || '');\n });\n } else {\n throw new Error('subtaskData is null or undefined');\n }\n } catch (error) {\n console.error('Error parsing subtaskData:', error);\n this.subtask = {\n master_task: mastertask,\n employees: [{}],\n _deadline_time: '17:00'\n };\n }\n if (subtask?.deadline && subtask._deadline_time && subtask.employee_id) {\n const employee = this.enrichedEmployees.find(employee => employee.id == subtask.employee_id);\n this.subtask.employees = [employee];\n this.subtask.deadline = subtask.deadline;\n this.subtask._deadline_time = subtask._deadline_time;\n }\n if (subtask?.master_task_id && subtask?.project_code) {\n this.subtask.master_task_id = subtask.master_task_id;\n this.subtask.project_code = subtask.project_code;\n }\n }\n this.editMode = editMode || !this.subtask.id;\n } catch (error) {\n console.error('ERROR', error);\n this.$toast.error(this.$parseError(error));\n }\n },\n deleteTimeblock(i) {\n this.subtask.timeblocks.splice(i, 1);\n },\n closeModal() {\n this.visible = false;\n this.$router.replace({\n name: this.$route.name\n });\n },\n async save() {\n const employeesValid = await this._validateEmployees();\n const timeblocksValid = this.subtask?.id ? true : await this._validateTimeblocks();\n if (!(await this.v$.$validate())) return;\n if (!employeesValid || !timeblocksValid) return;\n this.subtask.description = this.$refs['description'].getHTML();\n this._mergeDeadlineTimeDate();\n try {\n this.isSaving = true;\n this.subtask.deadline = moment__WEBPACK_IMPORTED_MODULE_11___default()(this.subtask.deadline).format('YYYY-MM-DD HH:mm:SS');\n if (this.subtask?.id) {\n const timesheets = this.subtask.timesheets.map(timesheet => {\n delete timesheet.employee_name;\n return timesheet;\n });\n const {\n subtask\n } = await this.$axios.patch_auth_form(`v1/subtasks/${this.subtask.id}`, {\n ...this.subtask,\n timesheets\n });\n localStorage.removeItem('subtaskData');\n this.$store.commit('tm/update_subtask', subtask);\n this.$events.emit('on-subtask-edited', this.subtask);\n } else {\n this.subtask.employees.forEach(employee => {\n if (employee.id) employee.timeblocks = this.timeblocks.filter(timeblock => timeblock.date).map(timeblock => {\n return {\n start: `${moment__WEBPACK_IMPORTED_MODULE_11___default()(timeblock.date).format('YYYY-MM-DD')} ${timeblock.starts_at_time}:00`,\n end: `${moment__WEBPACK_IMPORTED_MODULE_11___default()(timeblock.date).format('YYYY-MM-DD')} ${timeblock.ends_at_time}:00`,\n id: null\n };\n });\n });\n const subtaskCopy = this.subtask;\n delete subtaskCopy._master_task;\n const {\n subtasks\n } = await this.$axios.post_auth(`v1/mastertasks/${this.subtask.master_task_id}/subtasks`, subtaskCopy);\n localStorage.removeItem('subtaskData');\n this.subtask.id = subtasks[0].id;\n subtasks.forEach(subtask => {\n this.$store.commit('tm/update_subtask', subtask);\n this.$events.emit('on-subtask-edited', this.subtask);\n });\n this.$events.emit('task-created');\n this.$events.emit('close-both-modals');\n }\n this.closeModal();\n } catch (error) {\n this.$toast.error(this.$parseError(error));\n } finally {\n this.isSaving = false;\n }\n },\n openDeleteTaskModal(subtask) {\n this.$events.emit('show-delete-task-modal', {\n subtask\n });\n },\n showCompleteTaskModal() {\n this.$events.emit('show-complete-task-modal', {\n subtask: this.subtask\n });\n if (this.subtask.deadline) this.subtask.deadline = _plugins_tm_utils_tm_utils__WEBPACK_IMPORTED_MODULE_10__[\"default\"].formatDateTimeForBackend(this.subtask.deadline);\n },\n filesUploaded(files) {\n this.subtask.files = files;\n },\n updateSubtask(subtask) {\n this.subtask = subtask;\n },\n _mergeDeadlineTimeDate() {\n const date = new Date(this.subtask.deadline);\n const timeParts = this.subtask._deadline_time.split(':');\n date.setHours(parseInt(timeParts[0]));\n date.setMinutes(parseInt(timeParts[1]));\n this.subtask.deadline = date;\n },\n _validateEmployees() {\n return new Promise(resolve => {\n this.employeeValidations = [];\n if (this.subtask.id) {\n if (this.subtask.employee && this.subtask.duration) return;\n this.employeeValidations[0] = {};\n if (!this.subtask.employee_id) this.employeeValidations[0].employee = true;\n if (!this.subtask.duration) this.employeeValidations[0].duration = true;\n } else {\n this.subtask.employees.forEach((employee, index) => {\n if (index == this.subtask.employees.length - 1 && index > 0) return; // Skip the last which is allways empty\n\n if (employee.id && employee.duration) return;\n this.employeeValidations[index] = {};\n if (!employee.id) this.employeeValidations[index].employee = true;\n if (!employee.duration) this.employeeValidations[index].duration = true;\n });\n }\n const isError = this.employeeValidations.some(employee => employee.duration || employee.employee);\n resolve(!isError);\n });\n },\n async _validateTimeblocks() {\n let invalid = false;\n for (let i = 0; i < this.timeblocks.length; i++) {\n const ref = this.$refs[`timetable-${i}`];\n invalid = (await ref[0].v$.$validate()) || invalid;\n }\n return invalid;\n },\n _enrichTask(subtask) {\n return {\n ...subtask,\n _created_by: this.enrichedEmployees.find(employee => employee.id == subtask.created_by),\n _employee: this.enrichedEmployees.find(employee => employee.id == subtask.employee_id),\n _master_task: this.mastertasks.find(mastertask => mastertask.id == subtask.master_task_id)\n };\n }\n },\n watch: {\n 'subtask.employee_id'(value, oldValue) {\n if (!value || !oldValue) return;\n this.subtask.timeblocks = [];\n this.subtask._employee = this.enrichedEmployees.find(employee => employee.id == this.subtask.employee_id);\n },\n 'subtask.employees': {\n handler() {\n if (!this.subtask?.employees) return;\n const lastEmployee = this.subtask.employees[this.subtask.employees.length - 1];\n if (lastEmployee.id || lastEmployee.duration) this.subtask.employees.push({});\n },\n deep: true\n },\n 'subtask.master_task_id'(value) {\n if (!value) return;\n this.subtask._master_task = this.mastertasks.find(mastertask => mastertask.id == this.subtask.master_task_id);\n this.subtask.project_code = this.subtask._master_task?.project_code || null;\n },\n editMode() {\n this.$nextTick(() => {\n this.$refs['description']?.setHTML(this.subtask.description || '');\n });\n },\n subtask: {\n handler(val) {\n if (this.editMode && !this.subtask?.id) {\n localStorage.setItem('subtaskData', JSON.stringify(val));\n }\n },\n deep: true\n }\n }\n});\n\n//# sourceURL=webpack://jandl/./src/plugins/tm@modal/task/z-task-modal.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use%5B0%5D!./node_modules/vue-loader/dist/index.js??ruleSet%5B0%5D.use%5B0%5D"); /***/ }), diff --git a/app/src/plugins/tm@modal/master-task/z-master-task-modal.vue b/app/src/plugins/tm@modal/master-task/z-master-task-modal.vue index 28d16f1..8dc03c4 100644 --- a/app/src/plugins/tm@modal/master-task/z-master-task-modal.vue +++ b/app/src/plugins/tm@modal/master-task/z-master-task-modal.vue @@ -282,7 +282,25 @@ export default { // this.mastertask.project_code = project.code } else { - this.mastertask = { employees: [], duration: 0, _deadline_time: '17:00' } + const savedMastertask = localStorage.getItem('mastertaskData') + try { + if (savedMastertask) { + const parsedMastertask = JSON.parse(savedMastertask) + this.mastertask = parsedMastertask + // If the parsed result is not an object, reset to default + if (typeof this.mastertask !== 'object' || this.mastertask === null) { + throw new Error('Parsed mastertask is not an object') + } + this.$nextTick(() => { + this.$refs['description']?.setHTML(this.mastertask.description || ''); + }) + } else { + throw new Error('mastertaskData is null or undefined') + } + } catch (error) { + console.error('Error parsing mastertaskData:', error); + this.mastertask = { employees: [], duration: 0, _deadline_time: '17:00' } + } } this.editMode = editMode || !this.mastertask.id @@ -319,6 +337,7 @@ export default { this.mastertask.deadline = moment(this.mastertask.deadline).format('YYYY-MM-DD HH:MM:SS') if (this.mastertask.id) await this.$axios.patch_auth_form(`v1/mastertasks/${this.mastertask.id}`, this.mastertask) else await this.$axios.post_auth_data('v1/mastertasks', this.mastertask) + localStorage.removeItem('mastertaskData') this.$emit('master-task-edited', this.mastertask) this.closeModal() @@ -394,12 +413,14 @@ export default { }) }, - // mastertask: { - // handler(value) { - // console.log(value.description) - // }, - // deep: true - // } + mastertask: { + handler(val) { + if (this.editMode && !this.mastertask?.id) { + localStorage.setItem('mastertaskData', JSON.stringify(val)) + } + }, + deep: true + } } } diff --git a/app/src/plugins/tm@modal/task/z-task-modal.vue b/app/src/plugins/tm@modal/task/z-task-modal.vue index e8d8596..71270c3 100644 --- a/app/src/plugins/tm@modal/task/z-task-modal.vue +++ b/app/src/plugins/tm@modal/task/z-task-modal.vue @@ -158,8 +158,6 @@ import ATimeblock from './_components/a-timeblock.vue' import { mapGetters } from 'vuex' import modalMixin from '@/plugins/tm@modal/_mixins/modal.mixin' -import axios from 'axios' - export default { emits: ['close', 'refresh'], mixins: [VuetifyFixFocusMixin, SelectsMixin, AutocompleteMixin, modalMixin], @@ -275,7 +273,25 @@ export default { this.subtask = this._enrichTask(data) } else { - this.subtask = { master_task: mastertask, employees: [{}], _deadline_time: '17:00' } + const savedSubtask = localStorage.getItem('subtaskData') + try { + if (savedSubtask) { + const parsedSubtask = JSON.parse(savedSubtask) + this.subtask = parsedSubtask + // If the parsed result is not an object, reset to default + if (typeof this.subtask !== 'object' || this.subtask === null) { + throw new Error('Parsed subtask is not an object') + } + this.$nextTick(() => { + this.$refs['description']?.setHTML(this.subtask.description || ''); + }) + } else { + throw new Error('subtaskData is null or undefined') + } + } catch (error) { + console.error('Error parsing subtaskData:', error); + this.subtask = { master_task: mastertask, employees: [{}], _deadline_time: '17:00' } + } if (subtask?.deadline && subtask._deadline_time && subtask.employee_id) { const employee = this.enrichedEmployees.find(employee => employee.id == subtask.employee_id) @@ -326,6 +342,7 @@ export default { }) const { subtask } = await this.$axios.patch_auth_form(`v1/subtasks/${this.subtask.id}`, { ...this.subtask, timesheets }) + localStorage.removeItem('subtaskData') this.$store.commit('tm/update_subtask', subtask) this.$events.emit('on-subtask-edited', this.subtask) @@ -337,6 +354,7 @@ export default { const subtaskCopy = this.subtask delete subtaskCopy._master_task const { subtasks } = await this.$axios.post_auth(`v1/mastertasks/${this.subtask.master_task_id}/subtasks`, subtaskCopy) + localStorage.removeItem('subtaskData') this.subtask.id = subtasks[0].id subtasks.forEach((subtask) => { @@ -459,6 +477,15 @@ export default { this.$nextTick(() => { this.$refs['description']?.setHTML(this.subtask.description || '') }) + }, + + subtask: { + handler(val) { + if (this.editMode && !this.subtask?.id) { + localStorage.setItem('subtaskData', JSON.stringify(val)) + } + }, + deep: true } } }