From bb80cdf5a6157ca1f3a276e12e9faae9a4739cb7 Mon Sep 17 00:00:00 2001
From: dh_ackergaul <dh_ackergaul@dh-software.de>
Date: Di, 23 Jun 2026 11:16:18 +0200
Subject: [PATCH] Update emvheya - 23.6.2026, 11:16:10 [JD]

---
 manufacturer/_furnview/_global/html/h/generic-katatree/js/classes/katapage.js |   85 +++++++++++++++++++++++++++++++++++-------
 1 files changed, 70 insertions(+), 15 deletions(-)

diff --git a/manufacturer/_furnview/_global/html/h/generic-katatree/js/classes/katapage.js b/manufacturer/_furnview/_global/html/h/generic-katatree/js/classes/katapage.js
index f41ddd2..b8961f0 100644
--- a/manufacturer/_furnview/_global/html/h/generic-katatree/js/classes/katapage.js
+++ b/manufacturer/_furnview/_global/html/h/generic-katatree/js/classes/katapage.js
@@ -32,7 +32,7 @@
             }
         } catch (e) {
 
-        }    
+        }
 
         var selectedProgGroup = dh_TempGetJSONData("currentManuCat", "");
         var blacklist = dh_TempGetJSONData("blackListVzPos", "[]");
@@ -102,15 +102,19 @@
                                 mod.pdfFile = info.pdf;
                             }
                         });
+                        timeline(Date.now(), " Start PrePareData");
                         self.prepareModuleData(mod, module, {
                             selectedProgGroup: selectedProgGroup,
                             blacklist: blacklist,
                             separatelist: separatelist
                         });
+                        timeline(Date.now(), " End PrePareData");
                         mod.endLessScroll = mod.articles.length > 20 && rawData.Modules.length === 1 && !mod.cfg["noEndlessScroll"];
                         mod.articlesToShow = [];
                         mod.currentScrollIndex = 0;
                         mod.singleArticlePage = mod.articles.length === 1;
+                        
+                        mod.setEquipmentCache();
 
                         setDimensionsData(mod, self);
 
@@ -244,6 +248,9 @@
     mod.labelTextT = module.labelTextT;
     mod.infoText = module.infoText;
 
+    mod.modProg = module.modProg;
+    mod.modManu = module.modManu;
+
     this.setModuleConfig(mod, userVal);
 
 };
@@ -356,8 +363,8 @@
     //Im Prinzip wird eine Liste aller Javascriptaufrufnummer angezeigt in der für jedes Element der Anzeige die erste passende Artikelnummer angezigt wird
 
     module.Articles[0].forEach(function (equipment) {
-        var tmpArticleDhCats = Article.registeredCategoriesAndSections(equipment.ArtCategories);    
-        var tmpArticleInfoText = Article.registeredInfoTexts(equipment.CatString);
+        var tmpArticleDhCats = equipment.ArtCategories;
+        var tmpArticleInfoText = equipment.ArtInfoCategories;
 
         var tmpArtCats = [];
         var tmpArtInfoCats = [];
@@ -386,7 +393,7 @@
             p.artText = equipment.artText;
             p.artNo = equipment.ArtNr;
             p.hideDelete = equipment.hideDelete;
-            p.hideFront = equipment.hideFront;        
+            p.hideFront = equipment.hideFront;
             p.ptm = equipment.ptm;
             var foundP = propTransInfo.find(function (pti) {
                 return p.id === pti.id;
@@ -450,7 +457,7 @@
     var selectedProgGroup = options.selectedProgGroup || "";
     // var articlesWithHinge = [];
     var blacklist = options.blacklist || [];
-    var separatelist = options.separatelist || [];
+    var separatelist = options.separatelist || [];    
 
     mod.catConfigGlobal = mod.catConfig.filter(function (cfg) {
         return cfg.defaultArt === ""
@@ -460,6 +467,18 @@
         return cfg.defaultArt !== ""
     });
 
+    // Performance: einmalig O(1)-Lookups/Mengen aufbauen statt je Artikel/Equipment linear zu suchen.
+    var propTransInfoByArtNo = buildIndexMap(propTransInfo, "artNo"); // ersetzt propTransInfo.find() je PropTrans-Artikel
+    var categoriesToHide = mod.cfg["CategoriesToHide"] || [];
+    var categoriesToHideSet = {};                                     // ersetzt CategoriesToHide.indexOf()
+    for (var chIdx = 0; chIdx < categoriesToHide.length; chIdx++) {
+        categoriesToHideSet["$" + categoriesToHide[chIdx]] = true;
+    }
+    var equipSeen = {};                                               // ersetzt equipmentArtNumbersOnPage.indexOf() (O(n^2) -> O(n))
+    for (var eqIdx = 0; eqIdx < mod.equipmentArtNumbersOnPage.length; eqIdx++) {
+        equipSeen["$" + mod.equipmentArtNumbersOnPage[eqIdx]] = true;
+    }    
+    timeline(Date.now(), "Start PrePareDataArticlesForEach");
     module.Articles[0].forEach(function (article, index) {
         // if (index == 0 || index == 1) {
         if ((mod.cfg["ignoreVzPos"] === false) || (mod.cfg["ignoreVzPos"] && blacklist.indexOf(article.ArtNr) < 0)) {
@@ -486,27 +505,55 @@
                     }
                     if ((category.priority === 10 || category.priority === 100) && art.isPropTrans()) {
 
-                        var foundP = propTransInfo.find(function (pti) {
-                            return art.artNo === pti.artNo;
-                        });
+                        var foundP = propTransInfoByArtNo["$" + art.artNo];
                         if (foundP) {
                             art.ptId = foundP.id;
                             art.showPropTransControls = true;
                         }
                     }
                     if (category.priority >= 1000 && mod.moduleFilterCategories.indexOf(category) < 0) {
-                        if (mod.cfg["CategoriesToHide"].indexOf(category.id) < 0) {
+                        if (!categoriesToHideSet["$" + category.id]) {
                             mod.moduleFilterCategories.push(category);
                         }
                     }
                 });
                 mod.articles.push(art);
+                // Alle Artikelnummern von Fittings auf der Katapage in eindeutige Liste packen
+                art.artFittings.forEach(function (f, index) {
+                    if (!f.hideFittingbyAN) {
+                        if (!equipSeen["$" + f.artNoFitting]) {
+                            equipSeen["$" + f.artNoFitting] = true;
+                            mod.equipmentArtNumbersOnPage.push(f.artNoFitting);
+                        }
+                    }
+                });
+                // Alle Artikelnummern von Eigenschaftsübertragungen auf der Katapage in eindeutige Liste packen
+                art.artPropTrans.forEach(function (pt, index) {
+                    if (pt.artNo !== "") {
+                        if (!equipSeen["$" + pt.artNo]) {
+                            equipSeen["$" + pt.artNo] = true;
+                            mod.equipmentArtNumbersOnPage.push(pt.artNo);
+                        }
+                    }
+                });
+                // Alle Artikelnummern von Warenkorbartikeln auf der Katapage in eindeutige Liste packen
+                art.artShoppingCartArticles.forEach(function (sc, index) {
+                    if (!equipSeen["$" + sc.artNo]) {
+                        equipSeen["$" + sc.artNo] = true;
+                        mod.equipmentArtNumbersOnPage.push(sc.artNo);
+                    }
+                });
+                // Alle Artikelnummern von PO-Artikeln auf der Katapage in eindeutige Liste packen
+                art.artPoEquipment.forEach(function (poe, index) {
+                    if (!equipSeen["$" + poe.artNo]) {
+                        equipSeen["$" + poe.artNo] = true;
+                        mod.equipmentArtNumbersOnPage.push(poe.artNo);
+                    }
+                });
             }
         }
-        // }
     });
-
-
+    timeline(Date.now(), "Stop PrePareDataArticlesForEach");
 
     var articleModes = {};
     mod.articles.forEach(function (article) {
@@ -516,6 +563,7 @@
             articleModes[article.subHingeArticle.artNo] = searchMode;
         }
     });
+    
 
 
     DoSyncFPSAction("ArticleEquipmentObserverAction", {
@@ -523,6 +571,7 @@
         filterList: mod.cfg["ArtPropsToShow"].length > 0 ? mod.cfg["ArtPropsToShow"] : mod.cfg["ArtPropsToHide"],
         articleModes: articleModes
     });
+    
 
     if (mod.cfg["sortArticleByArtNo"]) {
         mod.articles.sort(function (b, a) {
@@ -549,7 +598,8 @@
     mod.filteredArticles = mod.articles.slice();
     mod.moduleFilterCategories.sort(function (a, b) {
         return a.order - b.order;
-    });
+    }); 
+
 };
 
 KataPage.prototype.prepareModuleDataAccessoires = function (mod, module) {
@@ -561,7 +611,7 @@
 
         var art = new Article(article, ArticleType.ACCESS, mod, "", []);
 
-        var tmpArticleDhAcces = Article.registeredAccessoiresCategories(article.CatString);
+        var tmpArticleDhAcces = article.ArtAccessCategories;
         tmpArticleDhAcces.forEach(function (tmpCat) {
             var foundCategory = definedAccessoiresCategories.find(function (cat) {
                 return cat.id === tmpCat;
@@ -627,7 +677,6 @@
     }
 }
 
-
 KataPage.prototype.build = function () {
     var self = this;
     var container = $("#kataPage");
@@ -640,6 +689,7 @@
                 //Wenn es nur einen Artikel in dem Modul gibt und der Schalter "showFirstArtNoAsModTitle" gesetzt ist dann wir der Artikeltext des Artikels im Accordion als Modultitel benutzt
                 mod.titel = mod.articles[0].getArtText();
             }
+
             modTitel.html(mod.titel);
 
             modTitel.on("click", function () {
@@ -687,8 +737,13 @@
             self.preSelectFilter(mod);
         })
     }
+
+
 };
 
+
+
+
 /**
  * Stellt den Suchmodus (Flag) eines Artikels fuer das dynamische Zubehoer ein.
  * @param {string} article

--
Gitblit v1.9.3