From df41c63c0fb711eea44706b32189c925be06c485 Mon Sep 17 00:00:00 2001 From: Christian Beeznest Date: Sat, 27 Sep 2025 02:28:38 -0500 Subject: [PATCH 1/3] Admin: Improve settings categorization - refs #6819 --- .../components/basecomponents/BaseTable.vue | 4 +- assets/vue/components/course/CourseTool.vue | 2 +- .../vue/components/layout/TopbarLoggedIn.vue | 4 +- assets/vue/composables/sidebarMenu.js | 6 +- assets/vue/pages/Home.vue | 2 +- assets/vue/views/course/CourseHome.vue | 2 +- assets/vue/views/documents/DocumentsList.vue | 6 +- assets/vue/views/lp/LpList.vue | 4 +- .../views/sessionadmin/RegisterStudent.vue | 2 +- public/main/admin/add_users_to_usergroup.php | 6 +- public/main/admin/career_diagram.php | 2 +- public/main/admin/careers.php | 2 +- public/main/admin/course_add.php | 2 +- public/main/admin/course_edit.php | 2 +- public/main/admin/index.php | 2 +- public/main/admin/subscribe_user2course.php | 2 +- public/main/admin/user_import.php | 2 +- public/main/admin/user_information.php | 2 +- public/main/auth/my_progress.php | 4 +- public/main/auth/registration.php | 6 +- public/main/auth/reset.php | 2 +- public/main/auth/tc.php | 2 +- public/main/course_info/infocours.php | 4 +- public/main/create_course/add_course.php | 2 +- public/main/forum/forumfunction.inc.php | 2 +- public/main/gamification/my_progress.php | 2 +- public/main/gradebook/get_badges.php | 2 +- .../gradebook_display_certificate.php | 4 +- public/main/gradebook/index.php | 2 +- .../main/gradebook/lib/be/category.class.php | 4 +- public/main/gradebook/my_certificates.php | 6 +- public/main/gradebook/search.php | 2 +- public/main/group/member_settings.php | 4 +- public/main/group/tutor_settings.php | 4 +- public/main/inc/ajax/model.ajax.php | 8 +- public/main/inc/lib/Compilatio.php | 4 +- public/main/inc/lib/SkillModel.php | 2 +- public/main/inc/lib/add_course.lib.inc.php | 2 +- public/main/inc/lib/api.lib.php | 5 +- public/main/inc/lib/certificate.lib.php | 6 +- public/main/inc/lib/course.lib.php | 4 +- public/main/inc/lib/display.lib.php | 6 +- public/main/inc/lib/groupmanager.lib.php | 2 +- public/main/inc/lib/legal.lib.php | 4 +- public/main/inc/lib/link.lib.php | 2 +- public/main/inc/lib/pdf.lib.php | 2 +- public/main/inc/lib/plugin.class.php | 8 +- public/main/inc/lib/redirect.class.php | 2 +- public/main/inc/lib/social.lib.php | 4 +- public/main/inc/lib/sortable_table.class.php | 4 +- public/main/inc/lib/template.lib.php | 12 +- public/main/inc/lib/usermanager.lib.php | 12 +- public/main/inc/lib/userportal.lib.php | 14 +- public/main/install/profiles/dev.json | 7 +- public/main/lp/learnpath.class.php | 2 +- public/main/lp/lp_controller.php | 6 +- public/main/lp/lp_list.php | 8 +- public/main/lp/lp_stats.php | 2 +- public/main/lp/lp_view.php | 2 +- public/main/my_space/index.php | 2 +- public/main/my_space/myStudents.php | 2 +- public/main/my_space/my_career.php | 2 +- .../session/add_edit_users_to_session.php | 4 +- .../session/add_users_to_session_course.php | 4 +- public/main/session/index.php | 2 +- public/main/skills/skill_badge.php | 2 +- public/main/social/personal_data.php | 8 +- public/main/tracking/courseLog.php | 2 +- public/main/user/career_diagram.php | 2 +- public/main/user/subscribe_user.php | 18 +- public/main/user/user.php | 6 +- public/main/user/user_import.php | 2 +- public/main/work/work.lib.php | 2 +- public/main/work/work_list_all.php | 2 +- .../Controller/AccountController.php | 2 +- .../Admin/IndexBlocksController.php | 2 +- .../Admin/SessionAdminController.php | 4 +- .../Controller/Admin/SettingsController.php | 57 ++ .../Controller/Api/CheckCLinkAction.php | 2 +- .../Controller/CertificateController.php | 4 +- .../Controller/CourseController.php | 4 +- .../PlatformConfigurationController.php | 28 +- .../Controller/ResourceController.php | 11 +- .../Controller/SecurityController.php | 4 +- .../Controller/SocialController.php | 8 +- .../DataFixtures/SettingsCurrentFixtures.php | 872 +++++++++--------- .../SettingsValueTemplateFixtures.php | 176 ++-- src/CoreBundle/Helpers/ChamiloHelper.php | 2 +- src/CoreBundle/Helpers/CourseHelper.php | 4 +- .../Helpers/IsAllowedToEditHelper.php | 2 +- src/CoreBundle/Helpers/MailHelper.php | 2 +- .../Schema/V200/Version20250926174000.php | 43 + .../Schema/V200/Version20250927022200.php | 43 + src/CoreBundle/Resources/config/settings.yml | 10 + .../views/Admin/Settings/default.html.twig | 44 +- .../views/Admin/Settings/menu.html.twig | 116 +-- .../views/Admin/Settings/search.html.twig | 9 +- .../Resources/views/LearnPath/list.html.twig | 2 +- .../Settings/AdminSettingsSchema.php | 10 - .../Settings/AnnouncementSettingsSchema.php | 4 - .../Settings/CertificateSettingsSchema.php | 41 +- .../Settings/CourseSettingsSchema.php | 100 +- .../Settings/DisplaySettingsSchema.php | 75 +- .../Settings/DocumentSettingsSchema.php | 25 +- .../Settings/ForumSettingsSchema.php | 3 + .../Settings/GradebookSettingsSchema.php | 11 - .../Settings/GroupSettingsSchema.php | 2 + .../Settings/LanguageSettingsSchema.php | 2 - .../Settings/LearningPathSettingsSchema.php | 14 +- .../Settings/PlatformSettingsSchema.php | 114 +-- .../Settings/PrivacySettingsSchema.php | 43 + .../Settings/ProfileSettingsSchema.php | 27 +- .../Settings/RegistrationSettingsSchema.php | 6 + .../Settings/SecuritySettingsSchema.php | 8 + .../Settings/SessionSettingsSchema.php | 26 +- src/CoreBundle/Settings/SettingsManager.php | 11 +- .../Settings/SkillSettingsSchema.php | 2 + .../Settings/TicketSettingsSchema.php | 10 +- .../Settings/TrackingSettingsSchema.php | 7 + .../Settings/WebServiceSettingsSchema.php | 7 + .../Settings/WorkSettingsSchema.php | 5 + .../Settings/WorkflowsSettingsSchema.php | 121 +++ src/CoreBundle/State/CToolStateProvider.php | 2 +- 123 files changed, 1350 insertions(+), 1073 deletions(-) create mode 100644 src/CoreBundle/Migrations/Schema/V200/Version20250926174000.php create mode 100644 src/CoreBundle/Migrations/Schema/V200/Version20250927022200.php create mode 100644 src/CoreBundle/Settings/PrivacySettingsSchema.php create mode 100644 src/CoreBundle/Settings/WorkflowsSettingsSchema.php diff --git a/assets/vue/components/basecomponents/BaseTable.vue b/assets/vue/components/basecomponents/BaseTable.vue index 8ff71f151ad..1837221c836 100644 --- a/assets/vue/components/basecomponents/BaseTable.vue +++ b/assets/vue/components/basecomponents/BaseTable.vue @@ -98,10 +98,10 @@ function parseRowList(val) { return [5, 10, 20, 50] } -const rowListRaw = computed(() => getSetting("platform.table_row_list", [5, 10, 20, 50])) +const rowListRaw = computed(() => getSetting("display.table_row_list", [5, 10, 20, 50])) const defaultRowSetting = computed(() => { - const raw = getSetting("platform.table_default_row", DEFAULT_FALLBACK_ROWS) + const raw = getSetting("display.table_default_row", DEFAULT_FALLBACK_ROWS) const n = Number(raw) if (!Number.isFinite(n) || n <= 0) return DEFAULT_FALLBACK_ROWS return n diff --git a/assets/vue/components/course/CourseTool.vue b/assets/vue/components/course/CourseTool.vue index 4d7760a28ad..e0efbbf6709 100644 --- a/assets/vue/components/course/CourseTool.vue +++ b/assets/vue/components/course/CourseTool.vue @@ -30,7 +30,7 @@ isAllowedToEdit && !isSorting && !isCustomizing && - (session?.id ? 'true' === getSetting('course.allow_edit_tool_visibility_in_session') : true) + (session?.id ? 'true' === getSetting('session.allow_edit_tool_visibility_in_session') : true) " @click="changeVisibility(tool)" > diff --git a/assets/vue/components/layout/TopbarLoggedIn.vue b/assets/vue/components/layout/TopbarLoggedIn.vue index 37148a579b1..32a99c74db0 100644 --- a/assets/vue/components/layout/TopbarLoggedIn.vue +++ b/assets/vue/components/layout/TopbarLoggedIn.vue @@ -5,7 +5,7 @@
@@ -121,7 +121,7 @@ const userSubmenuItems = computed(() => { }, ] - const tabs = platformConfigStore.getSetting("platform.show_tabs") || "" + const tabs = platformConfigStore.getSetting("display.show_tabs") || "" if (tabs.indexOf("topbar_certificate") > -1) { items[0].items.push({ label: t("My General Certificate"), diff --git a/assets/vue/composables/sidebarMenu.js b/assets/vue/composables/sidebarMenu.js index c158b4602c7..1d114456474 100644 --- a/assets/vue/composables/sidebarMenu.js +++ b/assets/vue/composables/sidebarMenu.js @@ -17,14 +17,14 @@ export function useSidebarMenu() { const allowSocialTool = computed(() => platformConfigStore.getSetting("social.allow_social_tool") !== "false") const showTabs = computed(() => { - const defaultTabs = platformConfigStore.getSetting("platform.show_tabs") || [] - const tabsPerRoleJson = platformConfigStore.getSetting("platform.show_tabs_per_role") || "" + const defaultTabs = platformConfigStore.getSetting("display.show_tabs") || [] + const tabsPerRoleJson = platformConfigStore.getSetting("display.show_tabs_per_role") || "" let tabsPerRole = {} try { tabsPerRole = JSON.parse(tabsPerRoleJson) } catch (e) { - console.warn("[Sidebar] Invalid JSON in platform.show_tabs_per_role", e) + console.warn("[Sidebar] Invalid JSON in display.show_tabs_per_role", e) } const roleMap = { diff --git a/assets/vue/pages/Home.vue b/assets/vue/pages/Home.vue index 1f24662dae5..2575781173e 100644 --- a/assets/vue/pages/Home.vue +++ b/assets/vue/pages/Home.vue @@ -51,7 +51,7 @@ import * as userRelCourseVoteService from "../services/userRelCourseVoteService" const router = useRouter() const platformConfigStore = usePlatformConfig() -const redirectValue = platformConfigStore.getSetting("platform.redirect_index_to_url_for_logged_users") +const redirectValue = platformConfigStore.getSetting("workflows.redirect_index_to_url_for_logged_users") if (typeof redirectValue === "string" && redirectValue.trim() !== "") { router.replace(`/${redirectValue}`) diff --git a/assets/vue/views/course/CourseHome.vue b/assets/vue/views/course/CourseHome.vue index 364f75cd75c..71cd7c5a652 100644 --- a/assets/vue/views/course/CourseHome.vue +++ b/assets/vue/views/course/CourseHome.vue @@ -455,6 +455,6 @@ const onStudentViewChanged = async () => { const allowEditToolVisibilityInSession = computed(() => { const isInASession = session.value?.id - return isInASession ? "true" === getSetting.value("course.allow_edit_tool_visibility_in_session") : true + return isInASession ? "true" === getSetting.value("session.allow_edit_tool_visibility_in_session") : true }) diff --git a/assets/vue/views/documents/DocumentsList.vue b/assets/vue/views/documents/DocumentsList.vue index 4727742286f..e3e4baaa6f8 100644 --- a/assets/vue/views/documents/DocumentsList.vue +++ b/assets/vue/views/documents/DocumentsList.vue @@ -512,7 +512,7 @@ const securityStore = useSecurityStore() const platformConfigStore = usePlatformConfig() const allowAccessUrlFiles = computed( - () => "false" !== platformConfigStore.getSetting("course.access_url_specific_files"), + () => "false" !== platformConfigStore.getSetting("document.access_url_specific_files"), ) const { t } = useI18n() @@ -579,7 +579,7 @@ const defaultCertificateId = ref(null) const isCurrentTeacher = computed(() => securityStore.isCurrentTeacher) function resolveDefaultRows(total = 0) { - const raw = platformConfigStore.getSetting("platform.table_default_row", 10) + const raw = platformConfigStore.getSetting("display.table_default_row", 10) const def = Number(raw) if (def === 0) return total || Number.MAX_SAFE_INTEGER // “All” return Number.isFinite(def) && def > 0 ? def : 10 @@ -624,7 +624,7 @@ onMounted(async () => { }) watch(totalItems, (n) => { - const def = Number(platformConfigStore.getSetting("platform.table_default_row", 10)) + const def = Number(platformConfigStore.getSetting("display.table_default_row", 10)) if (def === 0 && n) { options.value.itemsPerPage = n onUpdateOptions(options.value) diff --git a/assets/vue/views/lp/LpList.vue b/assets/vue/views/lp/LpList.vue index 84a2a58f625..054115c18dd 100644 --- a/assets/vue/views/lp/LpList.vue +++ b/assets/vue/views/lp/LpList.vue @@ -239,12 +239,12 @@ const showExportDialog = ref(false) const exportTarget = ref(null) const canExportScorm = computed(() => { - const isScormEnabled = platformConfig.getSetting("hide_scorm_export_link") !== "true" + const isScormEnabled = platformConfig.getSetting("lp.hide_scorm_export_link") !== "true" return canEdit.value && isScormEnabled }) const canExportPdf = computed(() => { - const hidden = platformConfig.getSetting("course.hide_scorm_pdf_link") === "true" + const hidden = platformConfig.getSetting("lp.hide_scorm_pdf_link") === "true" return !hidden }) diff --git a/assets/vue/views/sessionadmin/RegisterStudent.vue b/assets/vue/views/sessionadmin/RegisterStudent.vue index 43f1a8bb847..5e46f2ce54b 100644 --- a/assets/vue/views/sessionadmin/RegisterStudent.vue +++ b/assets/vue/views/sessionadmin/RegisterStudent.vue @@ -239,7 +239,7 @@ const PLACEHOLDER = "/img/session_default.svg" const dynamicExtraField = ref("") const platformConfigStore = usePlatformConfig() const extraFieldKey = platformConfigStore.getSetting( - "platform.session_admin_user_subscription_search_extra_field_to_search", + "workflows.session_admin_user_subscription_search_extra_field_to_search", ) const isFetching = ref(true) diff --git a/public/main/admin/add_users_to_usergroup.php b/public/main/admin/add_users_to_usergroup.php index 8c0ab3e5c72..98d6f2b04c0 100644 --- a/public/main/admin/add_users_to_usergroup.php +++ b/public/main/admin/add_users_to_usergroup.php @@ -218,7 +218,7 @@ function change_select(val) { $order = ['firstname']; } -$orderListByOfficialCode = api_get_setting('order_user_list_by_official_code'); +$orderListByOfficialCode = api_get_setting('display.order_user_list_by_official_code'); if ('true' === $orderListByOfficialCode) { $order = ['official_code', 'lastname']; } @@ -263,7 +263,7 @@ function change_select(val) { $item['lastname'] ) . ' (' . $item['username'] . ') ' . $officialCode; - $orderListByOfficialCode = api_get_setting('order_user_list_by_official_code'); + $orderListByOfficialCode = api_get_setting('display.order_user_list_by_official_code'); if ('true' === $orderListByOfficialCode) { $officialCode = !empty($item['official_code']) ? $item['official_code'] . ' - ' : '? - '; $person_name = $officialCode . api_get_person_name( @@ -310,7 +310,7 @@ function change_select(val) { $item['lastname'] ).' ('.$item['username'].') '.$officialCode; - $orderListByOfficialCode = api_get_setting('order_user_list_by_official_code'); + $orderListByOfficialCode = api_get_setting('display.order_user_list_by_official_code'); if ('true' === $orderListByOfficialCode) { $officialCode = !empty($item['official_code']) ? $item['official_code'].' - ' : '? - '; $person_name = $officialCode.api_get_person_name( diff --git a/public/main/admin/career_diagram.php b/public/main/admin/career_diagram.php index b5fd2953a99..19f71d2929d 100644 --- a/public/main/admin/career_diagram.php +++ b/public/main/admin/career_diagram.php @@ -14,7 +14,7 @@ $cidReset = true; require_once __DIR__.'/../inc/global.inc.php'; -if ('false' === api_get_setting('profile.allow_career_diagram')) { +if ('false' === api_get_setting('session.allow_career_diagram')) { api_not_allowed(true); } diff --git a/public/main/admin/careers.php b/public/main/admin/careers.php index 5c8cf358bee..e6715ed79c1 100644 --- a/public/main/admin/careers.php +++ b/public/main/admin/careers.php @@ -76,7 +76,7 @@ $extra_params['height'] = 'auto'; $diagramLink = ''; -$allow = ('true' === api_get_setting('profile.allow_career_diagram')); +$allow = ('true' === api_get_setting('session.allow_career_diagram')); if ($allow) { $diagramLink = ''. diff --git a/public/main/admin/course_add.php b/public/main/admin/course_add.php index b18ac3eec4f..c88b8ec621e 100644 --- a/public/main/admin/course_add.php +++ b/public/main/admin/course_add.php @@ -112,7 +112,7 @@ $form->addSelectLanguage('course_language', get_lang('Language')); } -if ('true' === api_get_setting('teacher_can_select_course_template')) { +if ('true' === api_get_setting('workflows.teacher_can_select_course_template')) { $form->addSelectAjax( 'course_template', [ diff --git a/public/main/admin/course_edit.php b/public/main/admin/course_edit.php index e4580a122f9..cdee0d191ec 100644 --- a/public/main/admin/course_edit.php +++ b/public/main/admin/course_edit.php @@ -192,7 +192,7 @@ ); } -$allowEditSessionCoaches = ('false' === api_get_setting('course.disabled_edit_session_coaches_course_editing_course')); +$allowEditSessionCoaches = ('false' === api_get_setting('workflows.disabled_edit_session_coaches_course_editing_course')); $coursesInSession = SessionManager::get_session_by_course($courseInfo['real_id']); if (!empty($coursesInSession) && $allowEditSessionCoaches) { foreach ($coursesInSession as $session) { diff --git a/public/main/admin/index.php b/public/main/admin/index.php index 5445f33be0f..6b5b70ac926 100644 --- a/public/main/admin/index.php +++ b/public/main/admin/index.php @@ -100,7 +100,7 @@ } $items[] = ['url' => 'extra_fields.php?type=user', 'label' => get_lang('Profiling')]; $items[] = ['url' => 'usergroups.php', 'label' => get_lang('Classes')]; - if ('true' !== api_get_setting('profile.disable_gdpr')) { + if ('true' !== api_get_setting('privacy.disable_gdpr')) { $items[] = ['url' => 'user_list_consent.php', 'label' => get_lang('Users in consent list')]; } if ('true' === api_get_setting('admin.show_link_request_hrm_user')) { diff --git a/public/main/admin/subscribe_user2course.php b/public/main/admin/subscribe_user2course.php index c9e5b38c8be..8a9d10f158c 100644 --- a/public/main/admin/subscribe_user2course.php +++ b/public/main/admin/subscribe_user2course.php @@ -199,7 +199,7 @@ function validate_filter() { $target_name = 'lastname'; $orderBy = $target_name; $showOfficialCode = false; -$orderListByOfficialCode = api_get_setting('order_user_list_by_official_code'); +$orderListByOfficialCode = api_get_setting('display.order_user_list_by_official_code'); if ('true' === $orderListByOfficialCode) { $showOfficialCode = true; $orderBy = " official_code, lastname, firstname"; diff --git a/public/main/admin/user_import.php b/public/main/admin/user_import.php index bfcabe01158..6f00aaaec60 100644 --- a/public/main/admin/user_import.php +++ b/public/main/admin/user_import.php @@ -748,7 +748,7 @@ function reload() { } } -if ('true' === api_get_setting('admin.plugin_redirection_enabled')) { +if ('true' === api_get_setting('workflows.plugin_redirection_enabled')) { $list[] = 'Redirection'; $list_reponse[] = api_get_path(WEB_PATH); } diff --git a/public/main/admin/user_information.php b/public/main/admin/user_information.php index a86a8e5ea29..4e4b1e446eb 100644 --- a/public/main/admin/user_information.php +++ b/public/main/admin/user_information.php @@ -694,7 +694,7 @@ 0, 0 ); -if ('true' === api_get_setting('profile.allow_career_users')) { +if ('true' === api_get_setting('session.allow_career_users')) { $careers = UserManager::getUserCareers($userId); if (!empty($careers)) { echo Display::page_subheader(get_lang('Careers'), null, 'h3', ['class' => 'section-title']); diff --git a/public/main/auth/my_progress.php b/public/main/auth/my_progress.php index 4fd92d10a79..b00e5d93a16 100644 --- a/public/main/auth/my_progress.php +++ b/public/main/auth/my_progress.php @@ -12,7 +12,7 @@ api_block_anonymous_users(); -if (('true' === api_get_setting('platform.block_my_progress_page'))) { +if (('true' === api_get_setting('tracking.block_my_progress_page'))) { api_not_allowed(true); } @@ -110,7 +110,7 @@ $message = Display::return_message(get_lang('No data available'), 'warning'); } -$show = ('true' === api_get_setting('profile.allow_career_users')); +$show = ('true' === api_get_setting('session.allow_career_users')); if ($show) { $careers = UserManager::getUserCareers($user_id); diff --git a/public/main/auth/registration.php b/public/main/auth/registration.php index 669779262f8..fbee99669d9 100644 --- a/public/main/auth/registration.php +++ b/public/main/auth/registration.php @@ -186,7 +186,7 @@ if ('true' === api_get_setting('allow_terms_conditions')) { $userAlreadyRegisteredShowTerms = isset($termRegistered['user_id']); // Ofaj change - if (true === api_is_anonymous() && 'course' === api_get_setting('load_term_conditions_section')) { + if (true === api_is_anonymous() && 'course' === api_get_setting('workflows.load_term_conditions_section')) { $userAlreadyRegisteredShowTerms = false; } } @@ -663,7 +663,7 @@ function ($email) { false ); } else { - $allow = ('true' === api_get_setting('platform.allow_double_validation_in_registration')); + $allow = ('true' === api_get_setting('registration.allow_double_validation_in_registration')); ChamiloHelper::addLegalTermsFields($form, $userAlreadyRegisteredShowTerms); if ($allow && !$termActivated) { $htmlHeadXtra[] = '