304 lines
11 KiB
JavaScript
304 lines
11 KiB
JavaScript
import { defineStore } from 'pinia'
|
|
import axios from "axios";
|
|
import { Inertia } from '@inertiajs/inertia'
|
|
|
|
export const useDocumentStore = defineStore('DocumentStore', {
|
|
state: () => ({
|
|
createForm: {
|
|
modality: '',
|
|
status: '',
|
|
priority: '',
|
|
note: '',
|
|
pet_id: '',
|
|
user_id: '',
|
|
submitted_at: '',
|
|
scan_date: '',
|
|
processing_deadline: '',
|
|
primary_files: [],
|
|
history_files: [],
|
|
},
|
|
|
|
loaderCreateForm: false,
|
|
is_edit_form: false,
|
|
errorsCreateForm: [],
|
|
is_edit_id: null,
|
|
|
|
columns: [
|
|
{
|
|
key: 'code',
|
|
title: 'شناسه پرونده',
|
|
width: 130,
|
|
},
|
|
{
|
|
key: 'modality',
|
|
title: 'نوع درخواست',
|
|
width: 130,
|
|
render: (data) => `<pre dir="ltr" class="text-right">${data.modality}</pre>`,
|
|
},
|
|
{
|
|
key: 'status',
|
|
title: 'وضعیت',
|
|
slot: 'status',
|
|
filter: {
|
|
type: 'dropdown',
|
|
options: [
|
|
{ label: 'ثبت شده', value: 'Registered' },
|
|
{ label: 'در حال انجام', value: 'InProgress' },
|
|
{ label: 'تکمیل شده', value: 'Completed' },
|
|
{ label: 'رد شده', value: 'Rejected' },
|
|
{ label: 'لغو شده', value: 'Cancelled' }
|
|
],
|
|
placeholder: 'انتخاب وضعیت...'
|
|
}
|
|
},
|
|
{
|
|
key: 'pet',
|
|
title: 'کیس',
|
|
slot: 'pet',
|
|
filter: {
|
|
type: 'dropdown',
|
|
dynamic: true,
|
|
search: true,
|
|
url: '/admin/pets-options',
|
|
placeholder: 'انتخاب کیس...'
|
|
}
|
|
},
|
|
{
|
|
key: 'requester',
|
|
title: 'درخواست دهنده',
|
|
width: 200,
|
|
slot: 'requester',
|
|
},
|
|
{
|
|
key: 'priority',
|
|
title: 'اولویت',
|
|
slot: 'priority',
|
|
filter: {
|
|
type: 'dropdown',
|
|
options: [
|
|
{ label: 'عادی', value: 'Medium' },
|
|
{ label: 'اورژانسی', value: 'High' },
|
|
],
|
|
placeholder: 'انتخاب اولویت...'
|
|
}
|
|
},
|
|
{
|
|
key: 'submitted_at',
|
|
title: 'تاریخ ثبت',
|
|
hasSort: true,
|
|
width: 200,
|
|
render:(data) => data.submitted_at ?? 'ثبت نشده',
|
|
},
|
|
{
|
|
key: 'processing_deadline',
|
|
title: 'تاریخ مهلت گزارش',
|
|
hasSort: true,
|
|
width: 200,
|
|
render:(data) => data.processing_deadline ?? 'ثبت نشده',
|
|
},
|
|
{
|
|
key: 'actions',
|
|
title: 'عملیات',
|
|
hasSort: false,
|
|
slot: true,
|
|
},
|
|
],
|
|
endpoints: {
|
|
index: '/admin/documents',
|
|
create: '/admin/documents/create',
|
|
store: '/admin/documents',
|
|
edit: (id) => `/admin/documents/${id}/edit`,
|
|
update: (id) => `/admin/documents/${id}`,
|
|
delete: (id) => `/admin/documents/${id}`,
|
|
bulkDelete: '/admin/documents-bulk-delete',
|
|
export: '/admin/documents-export-data'
|
|
},
|
|
statusOptions: [
|
|
{ label: 'ثبت شده', value: 'Registered' },
|
|
{ label: 'در حال انجام', value: 'InProgress' },
|
|
{ label: 'تکمیل شده', value: 'Completed' },
|
|
{ label: 'رد شده', value: 'Rejected' },
|
|
{ label: 'لغو شده', value: 'Cancelled' },
|
|
],
|
|
priorityOptions: [
|
|
{ label: 'عادی', value: 'Medium' },
|
|
{ label: 'اورژانسی', value: 'High' },
|
|
],
|
|
modalityOptions: [
|
|
{ label: 'CT', value: 'CT' },
|
|
{ label: 'MRI', value: 'MRI' },
|
|
{ label: 'X-Ray', value: 'X-Ray' },
|
|
{ label: 'Ultrasound', value: 'Ultrasound' },
|
|
{ label: 'PET', value: 'PET' },
|
|
{ label: 'other', value: 'Other' },
|
|
],
|
|
petOptions: [],
|
|
}),
|
|
|
|
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;
|
|
this.createForm.primary_files = this.createForm.primary_files.map(file => file.id);
|
|
this.createForm.history_files = this.createForm.history_files.map(file => file.id);
|
|
axios({
|
|
method: method,
|
|
url: url,
|
|
data: this.createForm
|
|
}).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 = {
|
|
modality: '',
|
|
status: '',
|
|
priority: '',
|
|
note: '',
|
|
pet_id: '',
|
|
user_id: '',
|
|
submitted_at: '',
|
|
scan_date: '',
|
|
processing_deadline: '',
|
|
primary_files: [],
|
|
history_files: [],
|
|
}
|
|
this.is_edit_id = null;
|
|
this.errorsCreateForm = [];
|
|
},
|
|
|
|
setEditData(data) {
|
|
this.is_edit_id = data.id;
|
|
|
|
Object.keys(this.createForm).forEach(field => {
|
|
if (field === 'submitted_at' && data.submitted_at) {
|
|
this.createForm[field] = data.submitted_at;
|
|
} else if (field === 'scan_date' && data.scan_date) {
|
|
this.createForm[field] = data.scan_date;
|
|
} else if (field === 'processing_deadline' && data.processing_deadline) {
|
|
this.createForm[field] = data.processing_deadline;
|
|
} else if (field === 'created_at' && data.created_at) {
|
|
this.createForm[field] = data.created_at;
|
|
} else if (field === 'primary_files' && data.primary_files) {
|
|
this.createForm[field] = data.primary_files;
|
|
} else if (field === 'history_files' && data.history_files) {
|
|
this.createForm[field] = data.history_files;
|
|
} else {
|
|
this.createForm[field] = data[field] || '';
|
|
}
|
|
});
|
|
},
|
|
|
|
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);
|
|
});
|
|
});
|
|
},
|
|
|
|
exportData(filters = {}) {
|
|
const query = new URLSearchParams(filters).toString();
|
|
window.open(`${this.endpoints.export}?${query}`, '_blank');
|
|
},
|
|
|
|
search(params) {
|
|
return Inertia.get(this.endpoints.index, params, {
|
|
preserveState: false
|
|
});
|
|
},
|
|
|
|
navigateToPage(page) {
|
|
return Inertia.get(this.endpoints.index, { page }, { preserveState: true });
|
|
},
|
|
|
|
getStatusSeverity(status) {
|
|
const statusSeverities = {
|
|
'ثبت شده': 'info',
|
|
'در حال انجام': 'warning',
|
|
'تکمیل شده': 'success',
|
|
'رد شده': 'danger',
|
|
'لغو شده': 'secondary'
|
|
};
|
|
return statusSeverities[status] || 'secondary';
|
|
},
|
|
|
|
getPrioritySeverity(priority) {
|
|
const prioritySeverities = {
|
|
'عادی': 'info',
|
|
'اورژانسی': 'danger'
|
|
};
|
|
return prioritySeverities[priority] || 'secondary';
|
|
},
|
|
|
|
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 [];
|
|
},
|
|
})
|