Chamilo is a learning management system focused on ease of use and accessibility
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
chamilo-lms/assets/vue/composables/datatableUpdate.js

97 lines
2.1 KiB

import { computed, ref, watch } from 'vue';
import { useStore } from 'vuex';
import { useRoute } from 'vue-router';
import { isEmpty } from 'lodash';
import { useI18n } from 'vue-i18n';
import { useToast } from 'primevue/usetoast';
export function useDatatableUpdate (servicePrefix) {
const moduleName = servicePrefix.toLowerCase();
const store = useStore();
const route = useRoute();
const { t } = useI18n();
const toast = useToast();
const isLoading = computed(() => store.getters[`${moduleName}/isLoading`]);
const item = ref({});
async function retrieve () {
let id = route.params.id;
if (isEmpty(id)) {
id = route.query.id;
}
if (isEmpty(id)) {
return;
}
await store.dispatch(`${moduleName}/load`, decodeURIComponent(id));
}
const retrievedItem = computed(() => {
let id = route.params.id;
if (isEmpty(id)) {
id = route.query.id;
}
if (isEmpty(id)) {
return null;
}
return store.getters[`${moduleName}/find`](id);
});
watch(
retrievedItem,
(newValue) => {
item.value = newValue;
}
);
async function updateItem (item) {
await store.dispatch(`${moduleName}/update`, item);
}
const updated = computed(() => store.state[moduleName].updated);
watch(
updated,
(newValue) => {
if (!newValue) {
return;
}
onUpdated(item);
}
);
async function updateItemWithFormData (item) {
await store.dispatch(`${moduleName}/updateWithFormData`, item);
}
function onUpdated (item) {
toast.add({
severity: 'success',
detail: t('{resource} updated', {
'resource': item['@id'],
}),
life: 3500,
});
}
return {
isLoading,
item,
retrieve,
retrievedItem,
updateItem,
updateItemWithFormData,
updated,
onUpdated,
};
}