diff --git a/app/src/plugins/tm@_utils/useEmployeeTimeline.ts b/app/src/plugins/tm@_utils/useEmployeeTimeline.ts index 103724d..5c796b4 100644 --- a/app/src/plugins/tm@_utils/useEmployeeTimeline.ts +++ b/app/src/plugins/tm@_utils/useEmployeeTimeline.ts @@ -24,6 +24,7 @@ export function useEmployeeTimeline( date: Ref, currentTimeblock: Ref, otherLocalTimeblocks?: Ref, + editingBlockerId?: Ref, ) { // Fetch employee's tasks for the selected date const { @@ -105,6 +106,7 @@ export function useEmployeeTimeline( const conceptData = unref(conceptTasksData); const emp = unref(employee); const d = unref(date); + const excludeBlockerId = editingBlockerId ? unref(editingBlockerId) : null; if (!data || !conceptData || !emp || !d) { return []; @@ -138,6 +140,11 @@ export function useEmployeeTimeline( 'office365_blocker', ].includes(subtask.type) ) { + // Skip the blocker being edited + if (excludeBlockerId && subtask.id === excludeBlockerId) { + return; + } + const blockerDateStr = moment(subtask.start).format('YYYY-MM-DD'); if (blockerDateStr === selectedDateStr) { diff --git a/app/src/plugins/tm@modal/_components/read-only/z-created-by.vue b/app/src/plugins/tm@modal/_components/read-only/z-created-by.vue index 1ae2497..4327844 100644 --- a/app/src/plugins/tm@modal/_components/read-only/z-created-by.vue +++ b/app/src/plugins/tm@modal/_components/read-only/z-created-by.vue @@ -8,13 +8,13 @@ - +

{{ employee ? employee._initials : '?' }}

-

{{ employee ? employee._fullName : $t('Unasigned') }}

+

{{ employee ? employee?._fullName : $t('Unasigned') }}

diff --git a/app/src/plugins/tm@modal/_components/read-only/z-team.vue b/app/src/plugins/tm@modal/_components/read-only/z-team.vue index 6cde48b..4ba8f09 100644 --- a/app/src/plugins/tm@modal/_components/read-only/z-team.vue +++ b/app/src/plugins/tm@modal/_components/read-only/z-team.vue @@ -17,7 +17,7 @@

{{ employee._initials }}

-

{{ employee._fullName }}

+

{{ employee?._fullName }}

@@ -27,7 +27,7 @@

{{ employee._initials }}

-

{{ employee._fullName }}

+

{{ employee?._fullName }}

@@ -44,7 +44,7 @@ export default { type: Object, required: false }, - + employees: { type: Array, required: true @@ -56,7 +56,7 @@ export default { if (!this.team?.employees) return [] - return tmUtils.enrichEmployees(this.team.employees) + return tmUtils.enrichEmployees(this.team.employees) }, enrichedEmployeesOutsideTeam() { diff --git a/app/src/plugins/tm@modal/blocker/z-blocker-modal.vue b/app/src/plugins/tm@modal/blocker/z-blocker-modal.vue index 06fb2cb..7a269a0 100644 --- a/app/src/plugins/tm@modal/blocker/z-blocker-modal.vue +++ b/app/src/plugins/tm@modal/blocker/z-blocker-modal.vue @@ -40,11 +40,17 @@ :match-any="true" clearable label="Vyhľadať zamestnanca" - :items="[...enrichedEmployees]" + :items="enrichedEmployees" item-title="_fullName" item-value="id" variant="solo" class="modal-input" + :error="!selectedEmployee && blocker.employee_id" + :hint=" + !selectedEmployee && blocker.employee_id + ? 'Zamestnanec neexistuje' + : null + " /> @@ -52,6 +58,7 @@ ref="employeeTimeblockRef" v-model="timeblockData" :employee="selectedEmployee" + :editing-blocker-id="blocker.id" :deletable="false" :index="0" /> @@ -100,7 +107,13 @@ export default { visible: false, v$: useVuelidate(), errorUtils, - blocker: null, + blocker: { + id: null, + name: '', + start: null, + end: null, + employee_id: null, + }, timeblockData: { id: null, date: new Date(), @@ -161,13 +174,22 @@ export default { methods: { async showModal({ blocker }) { this.visible = true; - this.blocker = null; + + // Reset blocker to initial state + this.blocker = { + id: null, + name: '', + start: null, + end: null, + employee_id: this.user.id, + }; + this.timeblockData = { id: null, date: new Date(), starts_at_time: null, ends_at_time: null, - employee_id: null, + employee_id: this.user.id, }; this.$nextTick(() => { @@ -188,29 +210,31 @@ export default { date: startMoment.toDate(), starts_at_time: startMoment.format('HH:mm'), ends_at_time: endMoment.format('HH:mm'), - employee_id: blocker.employee.id, + employee_id: blocker.employee?.id || this.user.id, }; - blocker.employee_id = blocker.employee.id; - this.blocker = blocker; + this.blocker = { + id: blocker.id, + name: blocker.name || '', + start: blocker.start, + end: blocker.end, + employee_id: blocker.employee?.id || this.user.id, + }; } else { - this.blocker = { start: null, employee_id: this.user.id }; - + // Creating new blocker if ( - blocker.starts_at_time && - blocker.datepicker && - blocker.employee_id + blocker?.starts_at_time && + blocker?.datepicker && + blocker?.employee_id ) { this.timeblockData = { id: null, date: blocker.datepicker, starts_at_time: blocker.starts_at_time, - ends_at_time: blocker.ends_at_time, + ends_at_time: blocker.ends_at_time || null, employee_id: blocker.employee_id, }; this.blocker.employee_id = blocker.employee_id; - } else { - this.timeblockData.employee_id = this.user.id; } } } catch (error) { @@ -250,6 +274,13 @@ export default { closeModal() { this.visible = false; + this.blocker = { + id: null, + name: '', + start: null, + end: null, + employee_id: null, + }; this.timeblockData = { id: null, date: new Date(), @@ -262,6 +293,7 @@ export default { _syncDatesTimes() { if ( + !this.blocker || !this.timeblockData.starts_at_time || !this.timeblockData.ends_at_time || !this.timeblockData.date diff --git a/app/src/plugins/tm@modal/task/_components/_components/a-task-assigned-by.vue b/app/src/plugins/tm@modal/task/_components/_components/a-task-assigned-by.vue index 0f7d82b..400ef79 100644 --- a/app/src/plugins/tm@modal/task/_components/_components/a-task-assigned-by.vue +++ b/app/src/plugins/tm@modal/task/_components/_components/a-task-assigned-by.vue @@ -8,13 +8,13 @@ - +

{{ employee.name.charAt(0) + employee.surname.charAt(0) }}

-

{{ employee._fullName }}

+

{{ employee?._fullName }}

diff --git a/app/src/plugins/tm@modal/task/_components/employees/a-employee-timeblock-header.vue b/app/src/plugins/tm@modal/task/_components/employees/a-employee-timeblock-header.vue index 2eccda9..33ca93f 100644 --- a/app/src/plugins/tm@modal/task/_components/employees/a-employee-timeblock-header.vue +++ b/app/src/plugins/tm@modal/task/_components/employees/a-employee-timeblock-header.vue @@ -4,7 +4,7 @@

Časový blok {{ index + 1 }} - - {{ employee._fullName }} + {{ employee?._fullName }}

diff --git a/app/src/plugins/tm@modal/task/_components/employees/a-employee-timeblock.vue b/app/src/plugins/tm@modal/task/_components/employees/a-employee-timeblock.vue index b3b4e09..0563af2 100644 --- a/app/src/plugins/tm@modal/task/_components/employees/a-employee-timeblock.vue +++ b/app/src/plugins/tm@modal/task/_components/employees/a-employee-timeblock.vue @@ -73,6 +73,7 @@ interface Props { allEmployeeTimeblocks?: TimeblockData[]; // Timeblocks for current employee allTimeblocks?: TimeblockData[]; // All timeblocks from all employees deletedTimeblockIds?: number[]; // IDs of saved timeblocks that have been deleted + editingBlockerId?: number | null; // ID of blocker being edited (to exclude from timeline) currentIndex?: number; deletable?: boolean; index?: number; @@ -82,6 +83,7 @@ const props = withDefaults(defineProps(), { allEmployeeTimeblocks: () => [], allTimeblocks: () => [], deletedTimeblockIds: () => [], + editingBlockerId: null, currentIndex: 0, deletable: false, index: 0, @@ -235,6 +237,8 @@ const otherTimeblocksForSameDate = computed(() => { }); // Use timeline composable +const editingBlockerIdRef = computed(() => props.editingBlockerId); + const { isLoading, timelineTasks, @@ -248,6 +252,7 @@ const { dateRef, timeblockRef, otherTimeblocksForSameDate, + editingBlockerIdRef, ); // Force refetch when date changes