Compare commits
	
		
			4 Commits
		
	
	
		
			dashboard-
			...
			#152-dashb
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 0ddbec1499 | |||
| 94350f8a82 | |||
| 0398b44141 | |||
| 783586d3ed | 
| @@ -1,6 +1,21 @@ | |||||||
| <template> | <template> | ||||||
|   <div |   <div | ||||||
|     :class="[ (day.isVacation || day.isPendingVacation) && `border-b-2 border-dashed ${getVacationBorder(day)}` ]" |     class="box-border" | ||||||
|  |     :class="[ | ||||||
|  |       day.isCurrentMonth ? { | ||||||
|  |         'bg-red-100': day.isWeekend, | ||||||
|  |         'bg-white hover:bg-blumilk-25': !day.isWeekend && !day.isHoliday, | ||||||
|  |         'bg-red-100 text-red-800': day.isHoliday || day.isWeekend | ||||||
|  |       } : [ | ||||||
|  |         'bg-gray-50 text-gray-500', | ||||||
|  |         { | ||||||
|  |           'bg-red-50': day.isWeekend | ||||||
|  |         } | ||||||
|  |       ], | ||||||
|  |       day.isHoliday && 'font-bold cursor-default', | ||||||
|  |       (day.isPendingVacation) && `border-b-4 border-dashed ${day.getVacationType.border}`, | ||||||
|  |       (day.isVacation) && `border-b-4 ${day.getVacationType.border}` | ||||||
|  |     ]" | ||||||
|   > |   > | ||||||
|     <Popper |     <Popper | ||||||
|       v-if="day.isHoliday" |       v-if="day.isHoliday" | ||||||
| @@ -10,27 +25,6 @@ | |||||||
|       offset-distance="0" |       offset-distance="0" | ||||||
|       @mouseover.passive="onMouseover" |       @mouseover.passive="onMouseover" | ||||||
|       @mouseleave="onMouseleave" |       @mouseleave="onMouseleave" | ||||||
|     > |  | ||||||
|       <time |  | ||||||
|         :datetime="day.date" |  | ||||||
|         :class="[ day.isToday && 'flex h-6 w-6 items-center justify-center rounded-full bg-blumilk-500 font-semibold text-white', 'text-red-600' ]" |  | ||||||
|       > |  | ||||||
|         {{ day.dayNumber }} |  | ||||||
|       </time> |  | ||||||
|       <template #content> |  | ||||||
|         <div class="py-2 px-6 text-sm font-semibold text-left text-gray-700 bg-white rounded-lg border border-gray-400"> |  | ||||||
|           {{ getHolidayDescription(day) }} |  | ||||||
|         </div> |  | ||||||
|       </template> |  | ||||||
|     </Popper> |  | ||||||
|     <Popper |  | ||||||
|       v-else-if="day.isPendingVacation" |  | ||||||
|       as="div" |  | ||||||
|       open-delay="200" |  | ||||||
|       hover |  | ||||||
|       offset-distance="0" |  | ||||||
|       @mouseover.passive="onMouseover" |  | ||||||
|       @mouseleave="onMouseleave" |  | ||||||
|     > |     > | ||||||
|       <time |       <time | ||||||
|         :datetime="day.date" |         :datetime="day.date" | ||||||
| @@ -39,14 +33,44 @@ | |||||||
|         {{ day.dayNumber }} |         {{ day.dayNumber }} | ||||||
|       </time> |       </time> | ||||||
|       <template #content> |       <template #content> | ||||||
|         <VacationPopup :vacation="getVacationInfo(day)" /> |         <div class="py-2 px-6 text-sm font-semibold text-left text-gray-700 bg-white rounded-lg border border-gray-400"> | ||||||
|  |           {{ day.getHolidayInfo }} | ||||||
|  |         </div> | ||||||
|  |       </template> | ||||||
|  |     </Popper> | ||||||
|  |     <Popper | ||||||
|  |       v-else-if="day.isVacation || day.isPendingVacation" | ||||||
|  |       as="div" | ||||||
|  |       open-delay="200" | ||||||
|  |       hover | ||||||
|  |       offset-distance="0" | ||||||
|  |       @mouseover.passive="onMouseover" | ||||||
|  |       @mouseleave="onMouseleave" | ||||||
|  |     > | ||||||
|  |       <div class="flex justify-between"> | ||||||
|  |         <time | ||||||
|  |           :datetime="day.date" | ||||||
|  |           :class="[ day.isToday && 'flex h-6 w-6 items-center justify-center rounded-full bg-blumilk-500 font-semibold text-white' ]" | ||||||
|  |         > | ||||||
|  |           {{ day.dayNumber }} | ||||||
|  |         </time> | ||||||
|  |         <div class="hidden md:inline-block"> | ||||||
|  |           <VacationIcon | ||||||
|  |             :type="day.getVacationType.value" | ||||||
|  |           /> | ||||||
|  |         </div> | ||||||
|  |       </div> | ||||||
|  |       <template #content> | ||||||
|  |         <VacationPopup :vacation="day.getVacationInfo" /> | ||||||
|       </template> |       </template> | ||||||
|     </Popper> |     </Popper> | ||||||
|     <div |     <div | ||||||
|       v-else-if="day.isWeekend" |       v-else-if="day.isWeekend" | ||||||
|  |       class="text-red-800" | ||||||
|     > |     > | ||||||
|       <time |       <time | ||||||
|         :datetime="day.date" |         :datetime="day.date" | ||||||
|  |         class="cursor-default" | ||||||
|         :class="{ 'flex h-6 w-6 items-center justify-center rounded-full bg-blumilk-500 font-semibold text-white': day.isToday }" |         :class="{ 'flex h-6 w-6 items-center justify-center rounded-full bg-blumilk-500 font-semibold text-white': day.isToday }" | ||||||
|       > |       > | ||||||
|         {{ day.dayNumber }} |         {{ day.dayNumber }} | ||||||
| @@ -73,21 +97,13 @@ | |||||||
| import Popper from 'vue3-popper' | import Popper from 'vue3-popper' | ||||||
| import { defineProps, ref } from 'vue' | import { defineProps, ref } from 'vue' | ||||||
| import VacationPopup from '@/Shared/VacationPopup' | import VacationPopup from '@/Shared/VacationPopup' | ||||||
|  | import VacationIcon from '@/Shared/VacationTypeCalendarIcon' | ||||||
|  |  | ||||||
| defineProps({ | defineProps({ | ||||||
|   day: { |   day: { | ||||||
|     type: Object, |     type: Object, | ||||||
|     required: true, |     required: true, | ||||||
|   }, |   }, | ||||||
|   getHolidayDescription: { |  | ||||||
|     type: Function, |  | ||||||
|   }, |  | ||||||
|   getVacationBorder: { |  | ||||||
|     type: Function, |  | ||||||
|   }, |  | ||||||
|   getVacationInfo: { |  | ||||||
|     type: Function, |  | ||||||
|   }, |  | ||||||
| }) | }) | ||||||
|  |  | ||||||
| const isActive = ref(false) | const isActive = ref(false) | ||||||
|   | |||||||
| @@ -7,10 +7,10 @@ | |||||||
|       <div class="flex justify-center"> |       <div class="flex justify-center"> | ||||||
|         <div class="flex items-center rounded-md shadow-sm md:items-stretch"> |         <div class="flex items-center rounded-md shadow-sm md:items-stretch"> | ||||||
|           <button |           <button | ||||||
|             v-if="calendarState.isPrevious" |  | ||||||
|             type="button" |             type="button" | ||||||
|             class="flex items-center justify-center rounded-l-md border border-r-0 border-gray-300 bg-white py-2 pl-3 pr-4 text-gray-400 hover:text-gray-500 focus:relative md:w-9 md:px-2 md:hover:bg-gray-50" |             class="flex items-center justify-center rounded-l-md border border-r-0 border-gray-300 py-2 pl-3 pr-4 text-gray-400 focus:relative md:w-9 md:px-2" | ||||||
|             @click="toLast" |             :class="[ calendarState.isPrevious ? 'bg-white hover:text-gray-500 md:hover:bg-gray-50' : 'bg-gray-100' ]" | ||||||
|  |             @click="toPrevious" | ||||||
|           > |           > | ||||||
|             <span class="sr-only">Poprzedni {{ calendarState.viewMode.details.shortcut }}</span> |             <span class="sr-only">Poprzedni {{ calendarState.viewMode.details.shortcut }}</span> | ||||||
|             <ChevronLeftIcon |             <ChevronLeftIcon | ||||||
| @@ -21,16 +21,18 @@ | |||||||
|           <button |           <button | ||||||
|             type="button" |             type="button" | ||||||
|             class="hidden border-t border-b border-gray-300 bg-white px-3.5 text-sm font-medium text-gray-700 hover:bg-gray-50 hover:text-gray-900 focus:relative md:block" |             class="hidden border-t border-b border-gray-300 bg-white px-3.5 text-sm font-medium text-gray-700 hover:bg-gray-50 hover:text-gray-900 focus:relative md:block" | ||||||
|             :class="{ 'rounded-l-md border border-r-0': !calendarState.isPrevious, 'rounded-r-md border border-l-0': !calendarState.isNext }" |  | ||||||
|             @click="goToToday" |             @click="goToToday" | ||||||
|           > |           > | ||||||
|             Dziś |             Dzisiaj | ||||||
|           </button> |           </button> | ||||||
|           <span class="relative -mx-px h-5 w-px bg-gray-300 md:hidden" /> |           <span | ||||||
|  |             class="relative -mx-px h-5 w-px bg-gray-300 md:hidden z-10" | ||||||
|  |           /> | ||||||
|           <button |           <button | ||||||
|             v-if="calendarState.isNext" |  | ||||||
|             type="button" |             type="button" | ||||||
|             class="flex items-center justify-center rounded-r-md border border-l-0 border-gray-300 bg-white py-2 pl-4 pr-3 text-gray-400 hover:text-gray-500 focus:relative md:w-9 md:px-2 md:hover:bg-gray-50" |             class="flex items-center justify-center rounded-r-md border border-l-0 border-gray-300 py-2 pl-4 pr-3 text-gray-400 focus:relative md:w-9 md:px-2" | ||||||
|  |             :class="[ calendarState.isNext ? 'bg-white hover:text-gray-500 md:hover:bg-gray-50' : 'bg-gray-100' ]" | ||||||
|  |             :disabled="!calendarState.isNext" | ||||||
|             @click="toNext" |             @click="toNext" | ||||||
|           > |           > | ||||||
|             <span class="sr-only">Następny {{ calendarState.viewMode.details.shortcut }}</span> |             <span class="sr-only">Następny {{ calendarState.viewMode.details.shortcut }}</span> | ||||||
| @@ -49,7 +51,8 @@ | |||||||
|           type="button" |           type="button" | ||||||
|           class="flex items-center rounded-md border border-gray-300 bg-white py-2 pl-3 pr-2 text-sm font-medium text-gray-700 shadow-sm hover:bg-gray-50" |           class="flex items-center rounded-md border border-gray-300 bg-white py-2 pl-3 pr-2 text-sm font-medium text-gray-700 shadow-sm hover:bg-gray-50" | ||||||
|         > |         > | ||||||
|           {{ calendarState.viewMode.details.name }} |           <span class="md:hidden">{{ calendarState.viewMode.details.shortcut }}</span> | ||||||
|  |           <span class="hidden md:inline-block">{{ calendarState.viewMode.details.name }}</span> | ||||||
|           <ChevronDownIcon |           <ChevronDownIcon | ||||||
|             class="ml-2 h-5 w-5 text-gray-400" |             class="ml-2 h-5 w-5 text-gray-400" | ||||||
|             aria-hidden="true" |             aria-hidden="true" | ||||||
| @@ -93,25 +96,25 @@ | |||||||
|         v-if="calendarState.viewMode.isMonth" |         v-if="calendarState.viewMode.isMonth" | ||||||
|         class="grid grid-cols-7 gap-px border-b border-gray-300 bg-gray-200 text-center text-xs font-semibold leading-6 text-gray-700 lg:flex-none" |         class="grid grid-cols-7 gap-px border-b border-gray-300 bg-gray-200 text-center text-xs font-semibold leading-6 text-gray-700 lg:flex-none" | ||||||
|       > |       > | ||||||
|         <div class="bg-white py-2"> |         <div class="py-2 bg-white"> | ||||||
|           Pn |           Pn | ||||||
|         </div> |         </div> | ||||||
|         <div class="bg-white py-2"> |         <div class="py-2 bg-white"> | ||||||
|           Wt |           Wt | ||||||
|         </div> |         </div> | ||||||
|         <div class="bg-white py-2"> |         <div class="py-2 bg-white"> | ||||||
|           Śr |           Śr | ||||||
|         </div> |         </div> | ||||||
|         <div class="bg-white py-2"> |         <div class="py-2 bg-white"> | ||||||
|           Cz |           Cz | ||||||
|         </div> |         </div> | ||||||
|         <div class="bg-white py-2"> |         <div class="py-2 bg-white"> | ||||||
|           Pt |           Pt | ||||||
|         </div> |         </div> | ||||||
|         <div class="bg-red-100 py-2"> |         <div class="py-2 bg-red-100 text-red-800"> | ||||||
|           Sb |           Sb | ||||||
|         </div> |         </div> | ||||||
|         <div class="bg-red-100 py-2"> |         <div class="py-2 bg-red-100 text-red-800"> | ||||||
|           Nd |           Nd | ||||||
|         </div> |         </div> | ||||||
|       </div> |       </div> | ||||||
| @@ -125,10 +128,7 @@ | |||||||
|             :key="index" |             :key="index" | ||||||
|             :day="day" |             :day="day" | ||||||
|             class="flex flex-col relative py-2 px-3" |             class="flex flex-col relative py-2 px-3" | ||||||
|             :class="[day.isCurrentMonth ? 'bg-white' : 'bg-gray-50 text-gray-500', { 'hover:bg-blumilk-25': day.isCurrentMonth && !day.isWeekend }, { 'day': calendarState.viewMode.isWeek }, { 'bg-red-100': day.isCurrentMonth && day.isWeekend }, { 'bg-red-50': !day.isCurrentMonth && day.isWeekend }, { 'text-red-800': day.isWeekend }]" |             :class="{ 'day': calendarState.viewMode.isWeek }" | ||||||
|             :get-holiday-description="getHolidayDescription" |  | ||||||
|             :get-vacation-border="getVacationBorder" |  | ||||||
|             :get-vacation-info="getVacationInfo" |  | ||||||
|           /> |           /> | ||||||
|         </div> |         </div> | ||||||
|       </div> |       </div> | ||||||
| @@ -164,6 +164,7 @@ const currentDate = getCurrentDate() | |||||||
| const months = useMonthInfo().getMonths() | const months = useMonthInfo().getMonths() | ||||||
| const { findType } = useVacationTypeInfo() | const { findType } = useVacationTypeInfo() | ||||||
| const selectedYear = useCurrentYearPeriodInfo().year.value | const selectedYear = useCurrentYearPeriodInfo().year.value | ||||||
|  | const weeksInYear = DateTime.fromObject({ year: selectedYear, month: 12, day: 31 }).weekNumber | ||||||
|  |  | ||||||
| const calendar = { | const calendar = { | ||||||
|   viewMode: ref('week'), |   viewMode: ref('week'), | ||||||
| @@ -183,7 +184,7 @@ const calendarState = reactive({ | |||||||
|   monthName: computed(() => months[calendar.currents.month - 1]?.name), |   monthName: computed(() => months[calendar.currents.month - 1]?.name), | ||||||
|   isActualYear: computed(() => calendar.currents.year === DateTime.now().year), |   isActualYear: computed(() => calendar.currents.year === DateTime.now().year), | ||||||
|   isPrevious: computed(() => calendarState.viewMode.isMonth ? calendar.currents.month !== 1 : calendar.currents.week > 0), |   isPrevious: computed(() => calendarState.viewMode.isMonth ? calendar.currents.month !== 1 : calendar.currents.week > 0), | ||||||
|   isNext: computed(() => calendarState.viewMode.isMonth ? calendar.currents.month !== 12 : calendar.currents.week < DateTime.fromObject({ year: selectedYear, month: 12, day: 31 }).weekNumber), |   isNext: computed(() => calendarState.viewMode.isMonth ? calendar.currents.month !== 12 : calendar.currents.week < weeksInYear), | ||||||
| }) | }) | ||||||
|  |  | ||||||
| const customCalendar = { | const customCalendar = { | ||||||
| @@ -230,15 +231,22 @@ const customCalendar = { | |||||||
|   }, |   }, | ||||||
|   prepareDay(day) { |   prepareDay(day) { | ||||||
|     const isCurrentMonth = isInCurrentMonth(day) |     const isCurrentMonth = isInCurrentMonth(day) | ||||||
|     return { |     const startDay = { | ||||||
|       date: day.toISODate(), |       date: day.toISODate(), | ||||||
|       dayNumber: day.day, |  | ||||||
|       isCurrentMonth: isCurrentMonth, |  | ||||||
|       isToday: isToday(day), |  | ||||||
|       isWeekend: isWeekend(day), |  | ||||||
|       isHoliday: isHoliday(day), |  | ||||||
|       isVacation: isCurrentMonth && isVacation(day), |       isVacation: isCurrentMonth && isVacation(day), | ||||||
|       isPendingVacation: isCurrentMonth && isPendingVacation(day), |       isPendingVacation: isCurrentMonth && isPendingVacation(day), | ||||||
|  |       isHoliday: isHoliday(day), | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return { | ||||||
|  |       ...startDay, | ||||||
|  |       dayNumber: day.day, | ||||||
|  |       isCurrentMonth, | ||||||
|  |       isToday: isToday(day), | ||||||
|  |       isWeekend: isWeekend(day), | ||||||
|  |       getHolidayInfo: startDay.isHoliday ? getHolidayInfo(startDay) : undefined, | ||||||
|  |       getVacationType: startDay.isVacation || startDay.isPendingVacation ? getVacationType(startDay) : undefined, | ||||||
|  |       getVacationInfo: startDay.isVacation || startDay.isPendingVacation ? getVacationInfo(startDay) : undefined, | ||||||
|     } |     } | ||||||
|   }, |   }, | ||||||
| } | } | ||||||
| @@ -249,18 +257,22 @@ watch([calendar.viewMode, calendar.currents], () => { | |||||||
|  |  | ||||||
| customCalendar.loadCalendar() | customCalendar.loadCalendar() | ||||||
|  |  | ||||||
| function toLast() { | function toPrevious() { | ||||||
|  |   if (calendarState.isPrevious) { | ||||||
|     if (calendar.viewMode.value === 'week') |     if (calendar.viewMode.value === 'week') | ||||||
|       minusWeek() |       minusWeek() | ||||||
|     else |     else | ||||||
|       minusMonth() |       minusMonth() | ||||||
|  |   } | ||||||
| } | } | ||||||
|  |  | ||||||
| function toNext() { | function toNext() { | ||||||
|  |   if (calendarState.isNext) { | ||||||
|     if (calendar.viewMode.value === 'week') |     if (calendar.viewMode.value === 'week') | ||||||
|       addWeek() |       addWeek() | ||||||
|     else |     else | ||||||
|       addMonth() |       addMonth() | ||||||
|  |   } | ||||||
| } | } | ||||||
|  |  | ||||||
| function resetCalendar(config = {}) { | function resetCalendar(config = {}) { | ||||||
| @@ -342,7 +354,7 @@ function isHoliday(date) { | |||||||
|   return props.holidays[date.toISODate()] !== undefined |   return props.holidays[date.toISODate()] !== undefined | ||||||
| } | } | ||||||
|  |  | ||||||
| function getHolidayDescription(day) { | function getHolidayInfo(day) { | ||||||
|   return props.holidays[day.date] |   return props.holidays[day.date] | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -354,8 +366,8 @@ function isPendingVacation(date) { | |||||||
|   return props.pendingVacations[date.toISODate()] !== undefined |   return props.pendingVacations[date.toISODate()] !== undefined | ||||||
| } | } | ||||||
|  |  | ||||||
| function getVacationBorder(day) { | function getVacationType(day) { | ||||||
|   return findType(getVacationInfo(day).type)?.border |   return findType(getVacationInfo(day).type) | ||||||
| } | } | ||||||
|  |  | ||||||
| function getVacationInfo(day) { | function getVacationInfo(day) { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user