import { defineStore } from 'pinia' import axios from "axios"; import { Inertia } from '@inertiajs/inertia' export const useShiftStore = defineStore('ShiftStore', { state: () => ({ createForm: { user_id: '', schedule_type: 'weekly', day_of_week: '', date: '', start_time: '', end_time: '', is_active: true, }, dayOptions: [ { label: 'شنبه', value: 'شنبه' }, { label: 'یکشنبه', value: 'یکشنبه' }, { label: 'دوشنبه', value: 'دوشنبه' }, { label: 'سه‌شنبه', value: 'سه‌شنبه' }, { label: 'چهارشنبه', value: 'چهارشنبه' }, { label: 'پنج‌شنبه', value: 'پنج‌شنبه' }, { label: 'جمعه', value: 'جمعه' }, ], scheduleTypeOptions: [ { label: 'هفتگی', value: 'weekly' }, { label: 'تاریخ مشخص', value: 'date' }, ], statusOptions: [ { label: 'فعال', value: true }, { label: 'غیرفعال', value: false }, ], doctorOptions: [], calendarShifts: [], loaderCalendar: false, loaderCreateForm: false, is_edit_form: false, errorsCreateForm: [], is_edit_id: null, filters: {}, columns: [ { key: 'doctor', title: 'پزشک', slot: 'doctor', }, { key: 'day_of_week', title: 'روز / تاریخ', render: (data) => data.date ?? data.day_of_week ?? 'ثبت نشده', filter: { type: 'multiselect', options: [ { label: 'شنبه', value: 'شنبه' }, { label: 'یکشنبه', value: 'یکشنبه' }, { label: 'دوشنبه', value: 'دوشنبه' }, { label: 'سه‌شنبه', value: 'سه‌شنبه' }, { label: 'چهارشنبه', value: 'چهارشنبه' }, { label: 'پنج‌شنبه', value: 'پنج‌شنبه' }, { label: 'جمعه', value: 'جمعه' }, ], placeholder: 'انتخاب روز...' } }, { key: 'start_time', title: 'ساعت شروع', }, { key: 'end_time', title: 'ساعت پایان', }, { key: 'occupancy', title: 'وضعیت اختصاص', slot: 'occupancy', filter: { type: 'dropdown', options: [ { label: 'آزاد', value: 'آزاد' }, { label: 'اختصاص یافته', value: 'اختصاص یافته' }, ], placeholder: 'انتخاب وضعیت اختصاص...' } }, { key: 'status', title: 'وضعیت', slot: 'status', filter: { type: 'dropdown', options: [ { label: 'فعال', value: 'فعال' }, { label: 'غیرفعال', value: 'غیرفعال' }, ], placeholder: 'انتخاب وضعیت...' } }, { key: 'created_at', title: 'تاریخ ثبت', }, { key: 'actions', title: 'عملیات', hasSort: false, slot: true, }, ], endpoints: { index: '/admin/shifts', create: '/admin/shifts/create', store: '/admin/shifts', edit: (id) => `/admin/shifts/${id}/edit`, update: (id) => `/admin/shifts/${id}`, delete: (id) => `/admin/shifts/${id}`, bulkDelete: '/admin/shifts-bulk-delete', calendarData: '/admin/shifts-calendar-data', doctorsOptions: '/admin/doctors-options', } }), getters: { buttonLabel: (state) => { return state.is_edit_id ? 'ویرایش شیفت' : 'ثبت و ایجاد شیفت جدید'; }, pageTitle: (state) => { return state.is_edit_id ? 'ویرایش شیفت' : 'افزودن شیفت جدید'; }, indexPageTitle: (state) => { return 'نمایش همه شیفت ها'; } }, actions: { update_and_store() { const url = this.is_edit_id ? this.endpoints.update(this.is_edit_id) : this.endpoints.store; const method = this.is_edit_id ? 'patch' : 'post'; this.loaderCreateForm = true; axios({ method: method, url: url, data: { user_id: this.createForm.user_id || null, day_of_week: this.createForm.schedule_type === 'weekly' ? this.createForm.day_of_week : null, date: this.createForm.schedule_type === 'date' ? this.formatDate(this.createForm.date) : null, start_time: this.formatTime(this.createForm.start_time), end_time: this.formatTime(this.createForm.end_time), is_active: this.createForm.is_active, } }).then(res => { this.errorsCreateForm = [] this.loaderCreateForm = false; if (this.is_edit_id) { Inertia.get(this.endpoints.edit(this.is_edit_id)); } else { this.resetCreateForm(); Inertia.get(this.endpoints.create); } }).catch(error => { this.loaderCreateForm = false; this.errorsCreateForm = error.response.data?.errors ?? []; }); }, resetCreateForm() { this.createForm = { user_id: '', schedule_type: 'weekly', day_of_week: '', date: '', start_time: '', end_time: '', is_active: true, } this.is_edit_id = null; this.errorsCreateForm = []; }, setEditData(data) { this.is_edit_id = data.id; this.createForm = { user_id: data.user_id ?? '', schedule_type: data.date_raw ? 'date' : 'weekly', day_of_week: data.day_of_week ?? '', date: data.date_raw ?? '', start_time: data.start_time ?? '', end_time: data.end_time ?? '', is_active: data.is_active, }; }, formatDate(value) { if (!value) return null; return String(value).split(' ')[0]; }, formatTime(value) { if (!value) return null; const parts = String(value).split(' '); const time = parts.length > 1 ? parts[1] : parts[0]; return time.substring(0, 5); }, fetchCalendarData() { this.loaderCalendar = true; axios.get(this.endpoints.calendarData).then(res => { this.calendarShifts = res.data?.data ?? []; }).finally(() => { this.loaderCalendar = false; }); }, fetchDoctorOptions() { axios.get(this.endpoints.doctorsOptions).then(res => { this.doctorOptions = res.data?.data ?? []; }); }, deleteRecord(id) { return new Promise((resolve, reject) => { axios.delete(this.endpoints.delete(id)) .then(response => { Inertia.get(this.endpoints.index); resolve(response); }) .catch(error => { reject(error); }); }); }, bulkDelete(ids) { return new Promise((resolve, reject) => { axios.post(this.endpoints.bulkDelete, { ids }) .then(response => { Inertia.get(this.endpoints.index); resolve(response); }) .catch(error => { reject(error); }); }); }, search(params) { return Inertia.get(this.endpoints.index, params, { preserveState: false }); }, navigateToPage(page) { return Inertia.get(this.endpoints.index, { page }, { preserveState: true }); }, getStatusSeverity(isActive) { return isActive ? 'info' : 'secondary'; }, getOccupancySeverity(userId) { return userId ? 'info' : 'success'; }, convertFiltersToArrayParams(filters) { const params = {}; Object.keys(filters).forEach(key => { if (Array.isArray(filters[key]) && filters[key].length > 0) { filters[key].forEach((value, index) => { params[`${key}[${index}]`] = value; }); } else if (!Array.isArray(filters[key]) && filters[key]) { params[key] = filters[key]; } }); return params; }, parseStringToArray(value) { if (Array.isArray(value)) { return value.filter(item => item !== '' && item != null); } if (value && typeof value === 'string' && value.trim() !== '') { return value.split(',').map(item => item.trim()).filter(item => item !== ''); } return []; }, } })