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 @@
+
+
+
+
![]()
+
{{ template.title }}
+
+
+
+
+
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 @@
+