@@ -11246,13 +11246,30 @@ class FastSearchCard extends HTMLElement {
1124611246 loadingDiv.style.display = 'block';
1124711247 resultsDiv.style.display = 'none';
1124811248
11249- // ✅ SAMMLE ALLE RELEVANTEN ACTIONS
11249+ // ✅ SAMMLE ALLE RELEVANTEN ACTIONS (Auto-Discovery + Favoriten)
1125011250 const relatedActions = {
11251- scenes: this.findRelatedScenes(deviceId, deviceArea),
11252- scripts: this.findRelatedScripts(deviceId, deviceArea),
11253- automations: this.findRelatedAutomations(deviceId, deviceArea)
11251+ scenes: [
11252+ ...this.findRelatedScenes(deviceId, deviceArea),
11253+ ...this.getFavoriteScenes(deviceId)
11254+ ],
11255+ scripts: [
11256+ ...this.findRelatedScripts(deviceId, deviceArea),
11257+ ...this.getFavoriteScripts(deviceId)
11258+ ],
11259+ automations: [
11260+ ...this.findRelatedAutomations(deviceId, deviceArea),
11261+ ...this.getFavoriteAutomations(deviceId)
11262+ ]
1125411263 };
1125511264
11265+ // ✅ DUPLIKATE ENTFERNEN
11266+ relatedActions.scenes = this.removeDuplicateActions(relatedActions.scenes);
11267+ relatedActions.scripts = this.removeDuplicateActions(relatedActions.scripts);
11268+ relatedActions.automations = this.removeDuplicateActions(relatedActions.automations);
11269+
11270+ // ✅ FAVORITEN MARKIEREN
11271+ this.markFavoriteActions(relatedActions, deviceId);
11272+
1125611273 console.log('🎯 Found actions:', relatedActions);
1125711274
1125811275 // Update counts
@@ -11272,20 +11289,65 @@ class FastSearchCard extends HTMLElement {
1127211289 }
1127311290 }
1127411291
11275- // 🎯 UPDATE ACTION COUNTS
11292+ // 🌟 REMOVE DUPLICATE ACTIONS
11293+ removeDuplicateActions(actions) {
11294+ const seen = new Set();
11295+ return actions.filter(action => {
11296+ if (seen.has(action.id)) {
11297+ return false;
11298+ }
11299+ seen.add(action.id);
11300+ return true;
11301+ });
11302+ }
11303+
11304+ // 🌟 MARK FAVORITE ACTIONS
11305+ markFavoriteActions(relatedActions, deviceId) {
11306+ const favorites = this._config.action_favorites[deviceId];
11307+ if (!favorites) return;
11308+
11309+ ['scenes', 'scripts', 'automations'].forEach(type => {
11310+ if (favorites[type]) {
11311+ relatedActions[type].forEach(action => {
11312+ if (favorites[type].includes(action.id)) {
11313+ action.isFavorite = true;
11314+ action.favoriteReason = 'manual';
11315+ }
11316+ });
11317+ }
11318+ });
11319+ }
11320+
11321+ // 🌟 UPDATE ACTION COUNTS - Mit Favoriten
1127611322 updateActionCounts(relatedActions, container) {
11277- const totalCount = Object.values(relatedActions).flat().length;
11323+ const allActions = Object.values(relatedActions).flat();
11324+ const totalCount = allActions.length;
11325+ const favoritesCount = allActions.filter(action => action.isFavorite).length;
1127811326
1127911327 // Update chip counts
1128011328 const allChip = container.querySelector('#actions-all-count');
11329+ const favoritesChip = container.querySelector('#actions-favorites-count');
1128111330 const scenesChip = container.querySelector('#actions-scenes-count');
1128211331 const scriptsChip = container.querySelector('#actions-scripts-count');
1128311332 const automationsChip = container.querySelector('#actions-automations-count');
1128411333
1128511334 if (allChip) allChip.textContent = totalCount;
11335+ if (favoritesChip) {
11336+ favoritesChip.textContent = favoritesCount;
11337+
11338+ // Zeige Favoriten-Chip nur wenn Favoriten vorhanden
11339+ const favoritesButton = favoritesChip.parentElement;
11340+ if (favoritesCount > 0) {
11341+ favoritesButton.style.display = 'inline-block';
11342+ } else {
11343+ favoritesButton.style.display = 'none';
11344+ }
11345+ }
1128611346 if (scenesChip) scenesChip.textContent = relatedActions.scenes.length;
1128711347 if (scriptsChip) scriptsChip.textContent = relatedActions.scripts.length;
1128811348 if (automationsChip) automationsChip.textContent = relatedActions.automations.length;
11349+
11350+ console.log(`📊 Action counts: Total(${totalCount}), Favorites(${favoritesCount})`);
1128911351 }
1129011352
1129111353 // 🎯 FIND RELATED SCENES
@@ -11378,14 +11440,28 @@ class FastSearchCard extends HTMLElement {
1137811440 ...relatedActions.scripts,
1137911441 ...relatedActions.automations
1138011442 ];
11443+ } else if (filter === 'favorites') {
11444+ // 🌟 NUR FAVORITEN anzeigen
11445+ actionsToShow = [
11446+ ...relatedActions.scenes.filter(a => a.isFavorite),
11447+ ...relatedActions.scripts.filter(a => a.isFavorite),
11448+ ...relatedActions.automations.filter(a => a.isFavorite)
11449+ ];
1138111450 } else {
1138211451 actionsToShow = relatedActions[filter] || [];
1138311452 }
1138411453
11385- // Sort by area, then by name
11454+ // Sort: Favoriten zuerst, dann nach Area, dann nach Name
1138611455 actionsToShow.sort((a, b) => {
11456+ // Favoriten zuerst
11457+ if (a.isFavorite && !b.isFavorite) return -1;
11458+ if (!a.isFavorite && b.isFavorite) return 1;
11459+
11460+ // Dann nach Area
1138711461 const areaCompare = (a.area || 'Ohne Raum').localeCompare(b.area || 'Ohne Raum');
1138811462 if (areaCompare !== 0) return areaCompare;
11463+
11464+ // Dann nach Name
1138911465 return a.name.localeCompare(b.name);
1139011466 });
1139111467
@@ -11401,19 +11477,28 @@ class FastSearchCard extends HTMLElement {
1140111477 this.setupActionClickHandlers(container);
1140211478 }
1140311479
11404- // 🎯 RENDER ACTION ITEM
11480+ // 🎯 RENDER ACTION ITEM - Mit Favoriten-Kennzeichnung
1140511481 renderActionItem(action) {
1140611482 const state = this._hass.states[action.id];
1140711483 const isActive = this.isEntityActive(state);
1140811484 const icon = this.getEntityIcon(action.domain);
1140911485
11486+ // 🌟 Favoriten-Kennzeichnung
11487+ const favoriteClass = action.isFavorite ? 'favorite-action' : '';
11488+ const favoriteIcon = action.isFavorite ? '<div class="favorite-star">⭐</div>' : '';
11489+ const favoriteLabel = action.isFavorite ? '<span class="favorite-label">Favorit</span>' : '';
11490+
1141011491 return `
11411- <div class="action-item ${isActive ? 'active' : ''}" data-action-id="${action.id}">
11492+ <div class="action-item ${isActive ? 'active' : ''} ${favoriteClass} " data-action-id="${action.id}">
1141211493 <div class="action-icon">${icon}</div>
1141311494 <div class="action-info">
11414- <div class="action-name">${action.name}</div>
11495+ <div class="action-name">
11496+ ${action.name}
11497+ ${favoriteIcon}
11498+ </div>
1141511499 <div class="action-meta">
1141611500 <span class="action-type">${this.getActionTypeLabel(action.domain)}</span>
11501+ ${favoriteLabel}
1141711502 ${action.area !== 'Ohne Raum' ? `<span class="action-area">${action.area}</span>` : ''}
1141811503 </div>
1141911504 </div>
@@ -11478,6 +11563,61 @@ class FastSearchCard extends HTMLElement {
1147811563 console.warn(`❌ Unknown action domain: ${domain}`);
1147911564 }
1148011565 }
11566+
11567+ // 🌟 GET FAVORITE SCENES
11568+ getFavoriteScenes(deviceId) {
11569+ const favorites = this._config.action_favorites[deviceId];
11570+ if (!favorites || !favorites.scenes) return [];
11571+
11572+ return favorites.scenes.map(sceneId => {
11573+ const sceneItem = this.allItems.find(item => item.id === sceneId);
11574+ if (sceneItem) {
11575+ return {
11576+ ...sceneItem,
11577+ isFavorite: true,
11578+ favoriteReason: 'manual'
11579+ };
11580+ }
11581+ return null;
11582+ }).filter(Boolean);
11583+ }
11584+
11585+ // 🌟 GET FAVORITE SCRIPTS
11586+ getFavoriteScripts(deviceId) {
11587+ const favorites = this._config.action_favorites[deviceId];
11588+ if (!favorites || !favorites.scripts) return [];
11589+
11590+ return favorites.scripts.map(scriptId => {
11591+ const scriptItem = this.allItems.find(item => item.id === scriptId);
11592+ if (scriptItem) {
11593+ return {
11594+ ...scriptItem,
11595+ isFavorite: true,
11596+ favoriteReason: 'manual'
11597+ };
11598+ }
11599+ return null;
11600+ }).filter(Boolean);
11601+ }
11602+
11603+ // 🌟 GET FAVORITE AUTOMATIONS
11604+ getFavoriteAutomations(deviceId) {
11605+ const favorites = this._config.action_favorites[deviceId];
11606+ if (!favorites || !favorites.automations) return [];
11607+
11608+ return favorites.automations.map(autoId => {
11609+ const autoItem = this.allItems.find(item => item.id === autoId);
11610+ if (autoItem) {
11611+ return {
11612+ ...autoItem,
11613+ isFavorite: true,
11614+ favoriteReason: 'manual'
11615+ };
11616+ }
11617+ return null;
11618+ }).filter(Boolean);
11619+ }
11620+
1148111621
1148211622
1148311623 initializeTimerTab(item, container) {
0 commit comments