Skip to content

Commit 24b1004

Browse files
authored
Update fast-search-card.js
1 parent 153f29c commit 24b1004

File tree

1 file changed

+127
-10
lines changed

1 file changed

+127
-10
lines changed

dist/fast-search-card.js

Lines changed: 127 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)