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) => `
${data.modality}
`, }, { 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 []; }, })