@@ -7150,22 +7150,61 @@ class FastSearchCard extends HTMLElement {
71507150 return;
71517151 }
71527152
7153+ // 🌟 NEU: Stars sammeln
7154+ const starredItems = this.getUserStarredItems();
7155+
7156+ // Items ohne Stars für Raum-Sektionen
7157+ const nonStarredItems = this.filteredItems.filter(item =>
7158+ !starredItems.some(star => star.id === item.id)
7159+ );
7160+
71537161 if (this.currentViewMode === 'grid') {
7154- this.renderGridResults(resultsGrid);
7162+ this.renderGridResults(resultsGrid, starredItems, nonStarredItems );
71557163 } else {
7156- this.renderListResults(resultsList);
7164+ this.renderListResults(resultsList, starredItems, nonStarredItems );
71577165 }
71587166 }
71597167
7160- renderGridResults(resultsGrid) {
7168+ renderGridResults(resultsGrid, starredItems, nonStarredItems ) {
71617169 resultsGrid.innerHTML = '';
7162- const groupedItems = this.groupItemsByArea();
71637170
71647171 let cardIndex = 0;
7172+
7173+ // 🌟 STARS-SEKTION (nur wenn Stars vorhanden)
7174+ if (starredItems.length > 0) {
7175+ const starHeader = document.createElement('div');
7176+ starHeader.className = 'area-header stars-header';
7177+ starHeader.innerHTML = `
7178+ <div class="area-icon">⭐</div>
7179+ <span class="area-name">Meine Stars</span>
7180+ <span class="area-count">(${starredItems.length})</span>
7181+ `;
7182+ resultsGrid.appendChild(starHeader);
7183+
7184+ starredItems.forEach((item) => {
7185+ const card = this.createDeviceCard(item);
7186+ resultsGrid.appendChild(card);
7187+ if (!this.hasAnimated) {
7188+ const timeout = setTimeout(() => {
7189+ this.animateElementIn(card, { opacity: [0, 1], transform: ['translateY(20px) scale(0.9)', 'translateY(0) scale(1)'] });
7190+ }, cardIndex * 50);
7191+ this.animationTimeouts.push(timeout);
7192+ }
7193+ cardIndex++;
7194+ });
7195+ }
7196+
7197+ // 🏠 RAUM-SEKTIONEN (bestehende Logik mit nonStarredItems)
7198+ const groupedItems = this.groupItemsByArea(nonStarredItems);
7199+
71657200 Object.keys(groupedItems).sort().forEach(area => {
71667201 const areaHeader = document.createElement('div');
71677202 areaHeader.className = 'area-header';
7168- areaHeader.textContent = area;
7203+ areaHeader.innerHTML = `
7204+ <div class="area-icon">${this.getAreaIcon(area)}</div>
7205+ <span class="area-name">${area}</span>
7206+ <span class="area-count">(${groupedItems[area].length})</span>
7207+ `;
71697208 resultsGrid.appendChild(areaHeader);
71707209
71717210 groupedItems[area].forEach((item) => {
@@ -7183,15 +7222,49 @@ class FastSearchCard extends HTMLElement {
71837222 this.hasAnimated = true;
71847223 }
71857224
7186- renderListResults(resultsList) {
7225+ renderListResults(resultsList, starredItems, nonStarredItems ) {
71877226 resultsList.innerHTML = '';
7188- const groupedItems = this.groupItemsByArea();
71897227
71907228 let itemIndex = 0;
7229+
7230+ // 🌟 STARS-SEKTION (nur wenn Stars vorhanden)
7231+ if (starredItems.length > 0) {
7232+ const starHeader = document.createElement('div');
7233+ starHeader.className = 'area-header stars-header';
7234+ starHeader.innerHTML = `
7235+ <div class="area-icon">⭐</div>
7236+ <span class="area-name">Meine Stars</span>
7237+ <span class="area-count">(${starredItems.length})</span>
7238+ `;
7239+ resultsList.appendChild(starHeader);
7240+
7241+ starredItems.forEach((item) => {
7242+ const listItem = this.createDeviceListItem(item);
7243+ resultsList.appendChild(listItem);
7244+ if (!this.hasAnimated) {
7245+ const timeout = setTimeout(() => {
7246+ this.animateElementIn(listItem, {
7247+ opacity: [0, 1],
7248+ transform: ['translateX(-20px)', 'translateX(0)']
7249+ });
7250+ }, itemIndex * 30);
7251+ this.animationTimeouts.push(timeout);
7252+ }
7253+ itemIndex++;
7254+ });
7255+ }
7256+
7257+ // 🏠 RAUM-SEKTIONEN (bestehende Logik mit nonStarredItems)
7258+ const groupedItems = this.groupItemsByArea(nonStarredItems);
7259+
71917260 Object.keys(groupedItems).sort().forEach(area => {
71927261 const areaHeader = document.createElement('div');
71937262 areaHeader.className = 'area-header';
7194- areaHeader.textContent = area;
7263+ areaHeader.innerHTML = `
7264+ <div class="area-icon">${this.getAreaIcon(area)}</div>
7265+ <span class="area-name">${area}</span>
7266+ <span class="area-count">(${groupedItems[area].length})</span>
7267+ `;
71957268 resultsList.appendChild(areaHeader);
71967269
71977270 groupedItems[area].forEach((item) => {
@@ -7212,8 +7285,11 @@ class FastSearchCard extends HTMLElement {
72127285 this.hasAnimated = true;
72137286 }
72147287
7215- groupItemsByArea() {
7216- return this.filteredItems.reduce((groups, item) => {
7288+ groupItemsByArea(items = null) {
7289+ // Falls keine Items übergeben werden, nutze this.filteredItems (für Rückwärtskompatibilität)
7290+ const itemsToGroup = items || this.filteredItems;
7291+
7292+ return itemsToGroup.reduce((groups, item) => {
72177293 const area = item.area || 'Ohne Raum';
72187294 if (!groups[area]) { groups[area] = []; }
72197295 groups[area].push(item);
@@ -11232,6 +11308,47 @@ class FastSearchCard extends HTMLElement {
1123211308 console.log('=== END DEBUG ===');
1123311309 }
1123411310
11311+ // 🌟 NEUE METHODE: Star-Items für Suchergebnisse sammeln
11312+ getUserStarredItems() {
11313+ try {
11314+ const userId = this._hass.user?.id || 'unknown_user';
11315+ const favoritesHelper = this._hass.states['input_text.fast_search_favorites'];
11316+
11317+ if (!favoritesHelper || !favoritesHelper.state) {
11318+ return [];
11319+ }
11320+
11321+ const parsed = JSON.parse(favoritesHelper.state);
11322+ let allUserStars = {};
11323+
11324+ if (typeof parsed === 'object' && !Array.isArray(parsed)) {
11325+ allUserStars = parsed;
11326+ } else if (Array.isArray(parsed)) {
11327+ allUserStars = { [userId]: parsed };
11328+ }
11329+
11330+ const userStars = allUserStars[userId] || [];
11331+
11332+ // Stars aus aktuell gefilterten Items sammeln
11333+ return this.filteredItems.filter(item => userStars.includes(item.id));
11334+
11335+ } catch (error) {
11336+ console.error('❌ Fehler beim Laden der User-Stars:', error);
11337+ return [];
11338+ }
11339+ }
11340+
11341+
11342+
11343+
11344+
11345+
11346+
11347+
11348+
11349+
11350+
11351+
1123511352
1123611353
1123711354 getCustomBackgroundImage(item) {
0 commit comments