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/views/message/MessageCreate.vue

180 lines
4.8 KiB

<template>
<!-- :handle-submit="onSendMessageForm"-->
<MessageForm v-model:attachments="attachments" :values="item">
<!-- @input="v$.item.receiversTo.$touch()"-->
<BaseAutocomplete id="to" v-model="usersTo" :label="t('To')" :search="asyncFind" is-multiple />
<BaseAutocomplete id="cc" v-model="usersCc" :label="t('Cc')" :search="asyncFind" is-multiple />
<div class="field">
<TinyEditor
v-model="item.content"
:init="{
skin_url: '/build/libs/tinymce/skins/ui/oxide',
content_css: '/build/libs/tinymce/skins/content/default/content.css',
branding: false,
relative_urls: false,
height: 500,
toolbar_mode: 'sliding',
file_picker_callback: browser,
autosave_ask_before_unload: true,
plugins: [
'advlist autolink lists link image charmap print preview anchor',
'searchreplace visualblocks code fullscreen',
'insertdatetime media table paste wordcount emoticons',
],
toolbar:
'undo redo | bold italic underline strikethrough | insertfile image media template link | fontselect fontsizeselect formatselect | alignleft aligncenter alignright alignjustify | outdent indent | numlist bullist | forecolor backcolor removeformat | pagebreak | charmap emoticons | fullscreen preview save print | code codesample | ltr rtl',
}"
required
/>
</div>
<BaseButton :label="t('Send')" icon="plus" type="primary" @click="onSubmit" />
</MessageForm>
<Loading :visible="isLoading" />
</template>
<script setup>
import { useStore } from "vuex";
import MessageForm from "../../components/message/Form.vue";
import Loading from "../../components/Loading.vue";
import { computed, ref } from "vue";
import axios from "axios";
import { ENTRYPOINT } from "../../config/entrypoint";
import BaseAutocomplete from "../../components/basecomponents/BaseAutocomplete.vue";
import BaseButton from "../../components/basecomponents/BaseButton.vue";
import { useI18n } from "vue-i18n";
import { useRoute, useRouter } from "vue-router";
import { MESSAGE_TYPE_INBOX } from "../../components/message/constants";
const store = useStore();
const router = useRouter();
const route = useRoute();
const { t } = useI18n();
const asyncFind = (query) => {
return axios
.get(ENTRYPOINT + "users", {
params: {
username: query,
},
})
.then((response) => {
let data = response.data;
return (
data["hydra:member"]?.map((member) => ({
name: member.fullName,
value: member["@id"],
})) ?? []
);
})
.catch(function (error) {
console.log(error);
});
};
const currentUser = computed(() => store.getters["security/getUser"]);
const item = ref({
sender: currentUser.value["@id"],
receivers: [],
msgType: MESSAGE_TYPE_INBOX,
title: "",
content: "",
});
const attachments = ref([]);
const usersTo = ref([]);
const usersCc = ref([]);
const receiversTo = computed(() =>
usersTo.value.map((userTo) => ({
receiver: userTo,
receiverType: 1,
}))
);
const receiversCc = computed(() =>
usersCc.value.map((userCc) => ({
receiver: userCc,
receiverType: 2,
}))
);
const isLoading = computed(() => store.getters["message/isLoading"]);
const messageCreated = computed(() => store.state.message.created);
const onSubmit = () => {
item.value.receivers = [...receiversTo.value, ...receiversCc.value];
store.dispatch("message/create", item.value).then(() => {
if (attachments.value.length > 0) {
attachments.value.forEach((attachment) =>
store.dispatch("messageattachment/createWithFormData", {
messageId: messageCreated.value.id,
file: attachment,
})
);
}
router.push({
name: "MessageList",
query: route.query,
});
});
};
const browser = (callback, value, meta) => {
let url = '/resources/personal_files/';
if (meta.filetype === "image") {
url = url + "&type=images";
} else {
url = url + "&type=files";
}
window.addEventListener("message", function (event) {
var data = event.data;
if (data.url) {
url = data.url;
console.log(meta); // {filetype: "image", fieldname: "src"}
callback(url);
}
});
tinymce.activeEditor.windowManager.openUrl(
{
url: url,
title: "file manager",
},
{
oninsert: function (file, fm) {
var url, reg, info;
url = fm.convAbsUrl(file.url);
info = file.name + " (" + fm.formatSize(file.size) + ")";
if (meta.filetype === "file") {
callback(url, { text: info, title: info });
}
if (meta.filetype === "image") {
callback(url, { alt: info });
}
if (meta.filetype === "media") {
callback(url);
}
},
}
);
};
</script>