diff --git a/src/components/ha-list-item.ts b/src/components/ha-list-item.ts index 0331381a0c..8107ae4f2a 100644 --- a/src/components/ha-list-item.ts +++ b/src/components/ha-list-item.ts @@ -30,6 +30,9 @@ export class HaListItem extends ListItemBase { margin-inline-end: 0px !important; direction: var(--direction); } + .mdc-deprecated-list-item__meta { + display: var(--mdc-list-item-meta-display); + } :host([multiline-secondary]) { height: auto; } diff --git a/src/data/assist_pipeline.ts b/src/data/assist_pipeline.ts index 49cd6f76bc..7e442bf271 100644 --- a/src/data/assist_pipeline.ts +++ b/src/data/assist_pipeline.ts @@ -221,7 +221,10 @@ export const runAssistPipeline = ( }; export const fetchAssistPipelines = (hass: HomeAssistant) => - hass.callWS({ + hass.callWS<{ + pipelines: AssistPipeline[]; + preferred_pipeline: string | null; + }>({ type: "assist_pipeline/pipeline/list", }); @@ -236,15 +239,24 @@ export const createAssistPipeline = ( export const updateAssistPipeline = ( hass: HomeAssistant, - pipelineId: string, + pipeline_id: string, pipeline: Partial ) => hass.callWS({ type: "assist_pipeline/pipeline/update", - pipeline_id: pipelineId, + pipeline_id, ...pipeline, }); +export const setAssistPipelinePreferred = ( + hass: HomeAssistant, + pipeline_id: string +) => + hass.callWS({ + type: "assist_pipeline/pipeline/set_preferred", + pipeline_id, + }); + export const deleteAssistPipeline = (hass: HomeAssistant, pipelineId: string) => hass.callWS({ type: "assist_pipeline/pipeline/delete", diff --git a/src/panels/config/voice-assistants/assist-pref.ts b/src/panels/config/voice-assistants/assist-pref.ts index d5165e1f06..daeb92d895 100644 --- a/src/panels/config/voice-assistants/assist-pref.ts +++ b/src/panels/config/voice-assistants/assist-pref.ts @@ -1,10 +1,11 @@ import "@material/mwc-list/mwc-list"; -import { mdiHelpCircle, mdiPlus } from "@mdi/js"; +import { mdiHelpCircle, mdiPlus, mdiStar } from "@mdi/js"; import { css, CSSResultGroup, html, LitElement, PropertyValues } from "lit"; import { property, state } from "lit/decorators"; import "../../../components/ha-alert"; import "../../../components/ha-card"; import "../../../components/ha-icon-next"; +import "../../../components/ha-svg-icon"; import "../../../components/ha-list-item"; import "../../../components/ha-switch"; import "../../../components/ha-button"; @@ -14,6 +15,7 @@ import { fetchAssistPipelines, updateAssistPipeline, AssistPipeline, + setAssistPipelinePreferred, } from "../../../data/assist_pipeline"; import { showConfirmationDialog } from "../../../dialogs/generic/show-dialog-box"; import type { HomeAssistant } from "../../../types"; @@ -25,11 +27,14 @@ export class AssistPref extends LitElement { @state() private _pipelines: AssistPipeline[] = []; + @state() private _preferred: string | null = null; + protected firstUpdated(changedProps: PropertyValues) { super.firstUpdated(changedProps); fetchAssistPipelines(this.hass).then((pipelines) => { - this._pipelines = pipelines; + this._pipelines = pipelines.pipelines; + this._preferred = pipelines.preferred_pipeline; }); } @@ -72,6 +77,12 @@ export class AssistPref extends LitElement { > ${pipeline.name} ${pipeline.language} + ${this._preferred === pipeline.id + ? html`` + : ""} ` @@ -112,6 +123,7 @@ export class AssistPref extends LitElement { private async _openDialog(pipeline?: AssistPipeline): Promise { showVoiceAssistantPipelineDetailDialog(this, { pipeline, + preferred: pipeline?.id === this._preferred, createPipeline: async (values) => { const created = await createAssistPipeline(this.hass!, values); this._pipelines = this._pipelines!.concat(created); @@ -126,6 +138,10 @@ export class AssistPref extends LitElement { res === pipeline ? updated : res ); }, + setPipelinePreferred: async () => { + await setAssistPipelinePreferred(this.hass!, pipeline!.id); + this._preferred = pipeline!.id; + }, deletePipeline: async () => { if ( !(await showConfirmationDialog(this, { @@ -174,6 +190,14 @@ export class AssistPref extends LitElement { direction: var(--direction); color: var(--secondary-text-color); } + ha-list-item { + --mdc-list-item-meta-size: auto; + --mdc-list-item-meta-display: flex; + } + ha-svg-icon, + ha-icon-next { + width: 24px; + } .add { margin: 0 16px 16px; } diff --git a/src/panels/config/voice-assistants/dialog-voice-assistant-pipeline-detail.ts b/src/panels/config/voice-assistants/dialog-voice-assistant-pipeline-detail.ts index d5d723854b..64b4b9efb5 100644 --- a/src/panels/config/voice-assistants/dialog-voice-assistant-pipeline-detail.ts +++ b/src/panels/config/voice-assistants/dialog-voice-assistant-pipeline-detail.ts @@ -22,6 +22,8 @@ export class DialogVoiceAssistantPipelineDetail extends LitElement { @state() private _data?: Partial; + @state() private _preferred?: boolean; + @state() private _error?: Record; @state() private _submitting = false; @@ -31,6 +33,7 @@ export class DialogVoiceAssistantPipelineDetail extends LitElement { this._error = undefined; if (this._params.pipeline) { this._data = this._params.pipeline; + this._preferred = this._params.preferred; } else { this._data = {}; } @@ -82,6 +85,12 @@ export class DialogVoiceAssistantPipelineDetail extends LitElement { > ${this.hass.localize("ui.common.delete")} + Set as default ` : nothing} Promise; updatePipeline: ( updates: Partial ) => Promise; + setPipelinePreferred: () => Promise; deletePipeline: () => Promise; }