feat: add shift management functionality
This commit is contained in:
@@ -0,0 +1,291 @@
|
||||
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 [];
|
||||
},
|
||||
}
|
||||
})
|
||||
Reference in New Issue
Block a user