From 4c25e85a482b5175336d98114a385205e2edc84d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20B=C3=B6hmer?= Date: Sun, 25 Sep 2022 02:08:54 +0200 Subject: [PATCH] Automatically update the sidebar trees for all users if the trees are changed somehow. --- .../elements/sidebar_tree_controller.js | 26 +++++++++++++ config/packages/twig.yaml | 1 + .../TreeCacheInvalidationListener.php | 5 +++ src/Services/Trees/SidebarTreeUpdater.php | 38 +++++++++++++++++++ templates/_turbo_control.html.twig | 3 ++ 5 files changed, 73 insertions(+) create mode 100644 src/Services/Trees/SidebarTreeUpdater.php diff --git a/assets/controllers/elements/sidebar_tree_controller.js b/assets/controllers/elements/sidebar_tree_controller.js index 228bbe40..1801b42a 100644 --- a/assets/controllers/elements/sidebar_tree_controller.js +++ b/assets/controllers/elements/sidebar_tree_controller.js @@ -6,6 +6,8 @@ export default class extends TreeController { _storage_key; + _lastUpdate; + connect() { //Check if the tree is already initialized, if so then skip initialization (useful when going back) to in history using Turbo if(this._isInitialized()) { @@ -31,6 +33,25 @@ export default class extends TreeController { } else { this.setMode(default_mode); } + + //Register an event listener which checks if the tree needs to be updated + document.addEventListener('turbo:render', this.doUpdateIfNeeded.bind(this)); + } + + doUpdateIfNeeded() + { + const info_element = document.getElementById('sidebar-last-time-updated'); + const date_str = info_element.dataset.lastUpdate; + const server_last_update = new Date(date_str); + + if(this._lastUpdate < server_last_update) { + console.log("Sidebar tree is outdated, reloading (last update: " + this._lastUpdate + ", server update: " + server_last_update + ")"); + this._lastUpdate = new Date(); + + + + this.reinitTree(); + } } setMode(mode) { @@ -47,6 +68,9 @@ export default class extends TreeController { this.sourceTextTarget.innerText = text; this.setURL(url); + + //Update the last update time + this._lastUpdate = new Date(); } changeDataSource(event) @@ -61,5 +85,7 @@ export default class extends TreeController { //Save the mode in local storage localStorage.setItem(this._storage_key, mode); + + this._lastUpdate = new Date(); } } diff --git a/config/packages/twig.yaml b/config/packages/twig.yaml index 0c4492af..1e2104c2 100644 --- a/config/packages/twig.yaml +++ b/config/packages/twig.yaml @@ -16,6 +16,7 @@ twig: error_page_admin_email: '%partdb.error_pages.admin_email%' error_page_show_help: '%partdb.error_pages.show_help%' sidebar_items: '%partdb.sidebar.items%' + sidebar_tree_updater: '@App\Services\Trees\SidebarTreeUpdater' when@test: twig: diff --git a/src/EntityListeners/TreeCacheInvalidationListener.php b/src/EntityListeners/TreeCacheInvalidationListener.php index cb49c09f..09377be1 100644 --- a/src/EntityListeners/TreeCacheInvalidationListener.php +++ b/src/EntityListeners/TreeCacheInvalidationListener.php @@ -75,6 +75,11 @@ class TreeCacheInvalidationListener if ($element instanceof AbstractStructuralDBElement || $element instanceof LabelProfile) { $secure_class_name = str_replace('\\', '_', get_class($element)); $this->cache->invalidateTags([$secure_class_name]); + + //Trigger a sidebar reload for all users (see SidebarTreeUpdater service) + if(!$element instanceof LabelProfile) { + $this->cache->invalidateTags(['sidebar_tree_update']); + } } //If a user change, then invalidate all cached trees for him diff --git a/src/Services/Trees/SidebarTreeUpdater.php b/src/Services/Trees/SidebarTreeUpdater.php new file mode 100644 index 00000000..f02ce088 --- /dev/null +++ b/src/Services/Trees/SidebarTreeUpdater.php @@ -0,0 +1,38 @@ +cache = $treeCache; + } + + /** + * Returns the time when the sidebar tree was updated the last time. + * The frontend uses this information to reload the sidebar tree. + * @return \DateTimeInterface + * @throws \Psr\SimpleCache\InvalidArgumentException + */ + public function getLastTreeUpdate(): \DateTimeInterface + { + return $this->cache->get(self::CACHE_KEY, function (ItemInterface $item) { + $item->expiresAfter(self::TTL); + + //This tag and therfore this whole cache gets cleared by TreeCacheInvalidationListener when a structural element is changed + $item->tag('sidebar_tree_update'); + + return new \DateTime(); + }); + } +} \ No newline at end of file diff --git a/templates/_turbo_control.html.twig b/templates/_turbo_control.html.twig index e110c472..ec203884 100644 --- a/templates/_turbo_control.html.twig +++ b/templates/_turbo_control.html.twig @@ -15,6 +15,9 @@
{% endif %} +{# Insert info about when the sidebar trees were updated last time, so the sidebar_tree_controller can decide if it needs to reload the tree #} + +