diff --git a/assets/css/app.scss b/assets/css/app.scss index 0219d1506f..f65ab79b7b 100644 --- a/assets/css/app.scss +++ b/assets/css/app.scss @@ -520,6 +520,63 @@ table#skill_holder { justify-content: center; } +.documents-layout { + display: flex; + justify-content: space-between; +} + +.template-list-container { + flex-basis: 20%; + max-height: 600px; + overflow-y: auto; +} + +.documents-form-container { + flex-basis: 78%; +} + +.template-item img { + border: 1px solid #ccc; + box-shadow: 2px 2px 5px rgba(0, 0, 0, 0.2); + border-radius: 4px; + transition: transform 0.2s ease; +} + +.template-item img:hover { + transform: scale(1.05); + cursor: pointer; +} + +.template-list { + display: flex; + flex-direction: column; + gap: 10px; +} + +.template-item { + display: flex; + flex-direction: column; + align-items: center; + text-align: center; + padding: 10px; + border: 1px solid #ccc; + border-radius: 4px; + background-color: #f9f9f9; +} + +.template-item img { + width: 100%; + max-width: 200px; + height: auto; + object-fit: cover; + border-radius: 4px; + margin-bottom: 5px; +} + +.template-item:hover { + background-color: #ececec; + cursor: pointer; +} //@import 'primevue-md-light-indigo/theme.css'; //@import '~primevue/resources/primevue.min.css'; diff --git a/assets/vue/components/documents/FormNewDocument.vue b/assets/vue/components/documents/FormNewDocument.vue index e32029b87b..878c4b8297 100644 --- a/assets/vue/components/documents/FormNewDocument.vue +++ b/assets/vue/components/documents/FormNewDocument.vue @@ -87,11 +87,16 @@ export default { data() { return { title: null, - contentFile: null, + contentFile: this.initialValues ? this.initialValues.contentFile : '', parentResourceNodeId: null, resourceNode: null, }; }, + watch: { + contentFile(newContent) { + tinymce.get('item_content').setContent(newContent); + } + }, computed: { item() { return this.initialValues || this.values; @@ -180,6 +185,9 @@ export default { ); return false; }, + updateContent(content) { + this.contentFile = content; + }, }, validations: { item: { diff --git a/assets/vue/components/documents/TemplateList.vue b/assets/vue/components/documents/TemplateList.vue new file mode 100644 index 0000000000..e55523e560 --- /dev/null +++ b/assets/vue/components/documents/TemplateList.vue @@ -0,0 +1,26 @@ + + + diff --git a/assets/vue/views/documents/CreateFile.vue b/assets/vue/views/documents/CreateFile.vue index 65da2d2d3e..3b094f9318 100644 --- a/assets/vue/views/documents/CreateFile.vue +++ b/assets/vue/views/documents/CreateFile.vue @@ -3,11 +3,23 @@ :handle-reset="resetForm" :handle-submit="onSendFormData" /> - + +
+
+ +
+
+ +
+
+ { + console.log(response.data); + this.templates = response.data; + }) + .catch(error => { + console.error('There was an error fetching the templates:', error); + }); + }, getCertificateTags(){ let finalTags = ""; let tags = [ @@ -107,6 +136,9 @@ export default { return finalTags; }, ...mapActions('documents', ['createWithFormData', 'reset']) - } + }, + mounted() { + this.fetchTemplates(); + }, }; diff --git a/assets/vue/views/documents/UpdateFile.vue b/assets/vue/views/documents/UpdateFile.vue index 13b998fbef..9aa08e50ff 100644 --- a/assets/vue/views/documents/UpdateFile.vue +++ b/assets/vue/views/documents/UpdateFile.vue @@ -5,17 +5,27 @@ :handle-reset="resetForm" :handle-submit="onSendFormData" /> - - - +
+
+ +
+
+ + + +
+
@@ -29,6 +39,8 @@ import Loading from "../../components/Loading.vue" import Toolbar from "../../components/Toolbar.vue" import UpdateMixin from "../../mixins/UpdateMixin" import EditLinks from "../../components/resource_links/EditLinks.vue" +import TemplateList from "../../components/documents/TemplateList.vue" +import axios from "axios"; const servicePrefix = "Documents" @@ -36,11 +48,17 @@ export default { name: "DocumentsUpdate", servicePrefix, components: { + TemplateList, EditLinks, Loading, Toolbar, DocumentsForm, }, + data() { + return { + templates: [], + }; + }, mixins: [UpdateMixin], computed: { ...mapFields("documents", { @@ -56,6 +74,20 @@ export default { }), }, methods: { + fetchTemplates() { + axios.get('/system-templates') + .then(response => { + this.templates = response.data; + }) + .catch(error => { + console.error('Error fetching the templates:', error); + }); + }, + addTemplateToEditor(templateContent) { + if (this.$refs.updateForm && typeof this.$refs.updateForm.updateContent === 'function') { + this.$refs.updateForm.updateContent(templateContent); + } + }, ...mapActions("documents", { createReset: "resetCreate", deleteItem: "del", @@ -65,5 +97,8 @@ export default { updateReset: "resetUpdate", }), }, + mounted() { + this.fetchTemplates(); + }, } diff --git a/public/main/admin/settings.php b/public/main/admin/settings.php index 74a06edf36..6c5591f90b 100644 --- a/public/main/admin/settings.php +++ b/public/main/admin/settings.php @@ -33,7 +33,7 @@ api_protect_admin_script(); $table_settings_current = Database::get_main_table(TABLE_MAIN_SETTINGS_CURRENT); // Setting breadcrumbs. -$interbreadcrumb[] = ['url' => 'index.php', 'name' => get_lang('Administration')]; +$interbreadcrumb[] = ['url' => api_get_path(WEB_PATH).'admin', 'name' => get_lang('Administration')]; // Setting the name of the tool. $tool_name = get_lang('Configuration settings'); diff --git a/src/CoreBundle/Controller/Admin/IndexBlocksController.php b/src/CoreBundle/Controller/Admin/IndexBlocksController.php index 511678bc6c..fc4c07054e 100644 --- a/src/CoreBundle/Controller/Admin/IndexBlocksController.php +++ b/src/CoreBundle/Controller/Admin/IndexBlocksController.php @@ -457,6 +457,12 @@ class IndexBlocksController extends BaseController 'label' => $this->translator->trans('Contact categories'), ]; + $items[] = [ + 'class' => 'item-system-template-admin', + 'url' => $this->generateUrl('legacy_main', ['name' => 'admin/settings.php', 'category' => 'Templates']), + 'label' => $this->translator->trans('System Templates'), + ]; + return $items; } diff --git a/src/CoreBundle/Controller/TemplateController.php b/src/CoreBundle/Controller/TemplateController.php new file mode 100644 index 0000000000..8a69322a7d --- /dev/null +++ b/src/CoreBundle/Controller/TemplateController.php @@ -0,0 +1,33 @@ +findAll(); + + $data = array_map(function ($template) use ($assetRepository) { + return [ + 'id' => $template->getId(), + 'title' => $template->getTitle(), + 'comment' => $template->getComment(), + 'content' => $template->getContent(), + 'image' => $template->getImage() ? $assetRepository->getAssetUrl($template->getImage()) : null, + ]; + }, $templates); + + return $this->json($data); + } +} diff --git a/src/CoreBundle/Entity/SystemTemplate.php b/src/CoreBundle/Entity/SystemTemplate.php index b1e4bd7280..61bf008d7b 100644 --- a/src/CoreBundle/Entity/SystemTemplate.php +++ b/src/CoreBundle/Entity/SystemTemplate.php @@ -6,13 +6,14 @@ declare(strict_types=1); namespace Chamilo\CoreBundle\Entity; +use Chamilo\CoreBundle\Repository\SystemTemplateRepository; use Doctrine\ORM\Mapping as ORM; /** * SystemTemplate. */ #[ORM\Table(name: 'system_template')] -#[ORM\Entity] +#[ORM\Entity(repositoryClass: SystemTemplateRepository::class)] class SystemTemplate { #[ORM\Column(name: 'id', type: 'integer')] diff --git a/src/CoreBundle/Repository/SystemTemplateRepository.php b/src/CoreBundle/Repository/SystemTemplateRepository.php new file mode 100644 index 0000000000..d7b8fee17e --- /dev/null +++ b/src/CoreBundle/Repository/SystemTemplateRepository.php @@ -0,0 +1,19 @@ +