From 545b5eee5f9bd42cafead46dd3dd2b189763aea6 Mon Sep 17 00:00:00 2001 From: Curtis Conard Date: Thu, 16 Oct 2025 11:47:32 -0400 Subject: [PATCH 1/4] lazy load uncommon cfg_glpi values --- ajax/config.php | 48 ++++++++++++++++++ .../Extension/FrontEndAssetsExtension.php | 50 +++++++++++++++++-- 2 files changed, 93 insertions(+), 5 deletions(-) create mode 100644 ajax/config.php diff --git a/ajax/config.php b/ajax/config.php new file mode 100644 index 00000000000..19bfd6bbd42 --- /dev/null +++ b/ajax/config.php @@ -0,0 +1,48 @@ +. + * + * --------------------------------------------------------------------- + */ + +use Glpi\Exception\Http\NotFoundHttpException; +use function Safe\json_encode; + +Session::checkLoginUser(); +Session::writeClose(); + +header("Content-Type: application/json; charset=UTF-8"); +$safe_config = Config::getSafeConfig(true); +if (!isset($_GET['key']) || !array_key_exists($_GET['key'], $safe_config)) { + throw new NotFoundHttpException(); +} + +echo json_encode($safe_config[$_GET['key']]); diff --git a/src/Glpi/Application/View/Extension/FrontEndAssetsExtension.php b/src/Glpi/Application/View/Extension/FrontEndAssetsExtension.php index 1d75f696f9b..f4d03102e21 100644 --- a/src/Glpi/Application/View/Extension/FrontEndAssetsExtension.php +++ b/src/Glpi/Application/View/Extension/FrontEndAssetsExtension.php @@ -293,14 +293,54 @@ public function configJs(): string $cfg_glpi += Config::getSafeConfig(true); } + // Common config keys used by front-end code. + // These will be immediately available while others will be lazy-loaded via a proxy handler. + $common_configs = [ + 'root_doc', 'url_base', 'planning_begin', 'planning_end', 'planning_work_days', 'toast_location', + 'is_demo_dashboards', 'priority_1', 'priority_2', 'priority_3', 'priority_4', 'priority_5', 'priority_6', + 'date_format' + ]; + $common_config = array_filter( + $cfg_glpi, + static fn($key) => in_array($key, $common_configs, true), + ARRAY_FILTER_USE_KEY + ); + $common_config = json_encode($common_config); + $plugins_path = \array_combine( Plugin::getPlugins(), - \array_map(fn(string $plugin_key) => "/plugins/{$plugin_key}", Plugin::getPlugins()) + \array_map(static fn(string $plugin_key) => "/plugins/{$plugin_key}", Plugin::getPlugins()) ); - - $script = sprintf('window.CFG_GLPI = %s;', json_encode($cfg_glpi, JSON_PRETTY_PRINT)) - . "\n" - . sprintf('window.GLPI_PLUGINS_PATH = %s;', json_encode($plugins_path, JSON_PRETTY_PRINT)); + $plugins_path = json_encode($plugins_path); + + $script = << { + if (prop in target) { + return Reflect.get(target, prop, receiver); + } + // Note there was a request for a config not in the common set to indicate a potential optimization + console.debug("Lazy loading a CFG_GLPI property that was not available by default: " + prop + '. This may be an optimization opportunity.'); + // Hydrate the missing config via a synchronous AJAX call + $.ajax({ + type: 'GET', + url: CFG_GLPI.root_doc + '/ajax/config.php', + async: false, + dataType: 'json', + data: { key: prop }, + success: (value) => { + target[prop] = value; + }, + error: () => { + console.warn('Failed to load config property ' + prop); + target[prop] = undefined; + } + }); + return Reflect.get(target, prop, receiver); + } + }); + window.GLPI_PLUGINS_PATH = $plugins_path; +JS; return Html::scriptBlock($script); } From bf5eeb6a00ff874b39d14d8afab7288c2895814b Mon Sep 17 00:00:00 2001 From: Curtis Conard Date: Fri, 17 Oct 2025 08:48:12 -0400 Subject: [PATCH 2/4] lint --- src/Glpi/Application/View/Extension/FrontEndAssetsExtension.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Glpi/Application/View/Extension/FrontEndAssetsExtension.php b/src/Glpi/Application/View/Extension/FrontEndAssetsExtension.php index f4d03102e21..a723af93b0a 100644 --- a/src/Glpi/Application/View/Extension/FrontEndAssetsExtension.php +++ b/src/Glpi/Application/View/Extension/FrontEndAssetsExtension.php @@ -298,7 +298,7 @@ public function configJs(): string $common_configs = [ 'root_doc', 'url_base', 'planning_begin', 'planning_end', 'planning_work_days', 'toast_location', 'is_demo_dashboards', 'priority_1', 'priority_2', 'priority_3', 'priority_4', 'priority_5', 'priority_6', - 'date_format' + 'date_format', ]; $common_config = array_filter( $cfg_glpi, From 4627efbcdf08e84349db66d4768aa7ddd408a5df Mon Sep 17 00:00:00 2001 From: Curtis Conard Date: Sat, 18 Oct 2025 17:18:20 -0400 Subject: [PATCH 3/4] add refresh_views --- src/Glpi/Application/View/Extension/FrontEndAssetsExtension.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Glpi/Application/View/Extension/FrontEndAssetsExtension.php b/src/Glpi/Application/View/Extension/FrontEndAssetsExtension.php index a723af93b0a..ec4e683ff16 100644 --- a/src/Glpi/Application/View/Extension/FrontEndAssetsExtension.php +++ b/src/Glpi/Application/View/Extension/FrontEndAssetsExtension.php @@ -298,7 +298,7 @@ public function configJs(): string $common_configs = [ 'root_doc', 'url_base', 'planning_begin', 'planning_end', 'planning_work_days', 'toast_location', 'is_demo_dashboards', 'priority_1', 'priority_2', 'priority_3', 'priority_4', 'priority_5', 'priority_6', - 'date_format', + 'date_format', 'refresh_views', ]; $common_config = array_filter( $cfg_glpi, From 82180f980abc2b2063957e06f0386fa92ec1336d Mon Sep 17 00:00:00 2001 From: Curtis Conard Date: Sat, 18 Oct 2025 17:43:21 -0400 Subject: [PATCH 4/4] lint --- ajax/config.php | 1 + 1 file changed, 1 insertion(+) diff --git a/ajax/config.php b/ajax/config.php index 19bfd6bbd42..baa8f11eaf1 100644 --- a/ajax/config.php +++ b/ajax/config.php @@ -34,6 +34,7 @@ */ use Glpi\Exception\Http\NotFoundHttpException; + use function Safe\json_encode; Session::checkLoginUser();