Allow to set a default pipeline (#16209)

This commit is contained in:
Bram Kragten 2023-04-17 16:51:17 +02:00 committed by GitHub
parent dae107d3e3
commit 0f622589a3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 60 additions and 5 deletions

View File

@ -30,6 +30,9 @@ export class HaListItem extends ListItemBase {
margin-inline-end: 0px !important; margin-inline-end: 0px !important;
direction: var(--direction); direction: var(--direction);
} }
.mdc-deprecated-list-item__meta {
display: var(--mdc-list-item-meta-display);
}
:host([multiline-secondary]) { :host([multiline-secondary]) {
height: auto; height: auto;
} }

View File

@ -221,7 +221,10 @@ export const runAssistPipeline = (
}; };
export const fetchAssistPipelines = (hass: HomeAssistant) => export const fetchAssistPipelines = (hass: HomeAssistant) =>
hass.callWS<AssistPipeline[]>({ hass.callWS<{
pipelines: AssistPipeline[];
preferred_pipeline: string | null;
}>({
type: "assist_pipeline/pipeline/list", type: "assist_pipeline/pipeline/list",
}); });
@ -236,15 +239,24 @@ export const createAssistPipeline = (
export const updateAssistPipeline = ( export const updateAssistPipeline = (
hass: HomeAssistant, hass: HomeAssistant,
pipelineId: string, pipeline_id: string,
pipeline: Partial<AssistPipelineMutableParams> pipeline: Partial<AssistPipelineMutableParams>
) => ) =>
hass.callWS<AssistPipeline>({ hass.callWS<AssistPipeline>({
type: "assist_pipeline/pipeline/update", type: "assist_pipeline/pipeline/update",
pipeline_id: pipelineId, pipeline_id,
...pipeline, ...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) => export const deleteAssistPipeline = (hass: HomeAssistant, pipelineId: string) =>
hass.callWS<void>({ hass.callWS<void>({
type: "assist_pipeline/pipeline/delete", type: "assist_pipeline/pipeline/delete",

View File

@ -1,10 +1,11 @@
import "@material/mwc-list/mwc-list"; 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 { css, CSSResultGroup, html, LitElement, PropertyValues } from "lit";
import { property, state } from "lit/decorators"; import { property, state } from "lit/decorators";
import "../../../components/ha-alert"; import "../../../components/ha-alert";
import "../../../components/ha-card"; import "../../../components/ha-card";
import "../../../components/ha-icon-next"; import "../../../components/ha-icon-next";
import "../../../components/ha-svg-icon";
import "../../../components/ha-list-item"; import "../../../components/ha-list-item";
import "../../../components/ha-switch"; import "../../../components/ha-switch";
import "../../../components/ha-button"; import "../../../components/ha-button";
@ -14,6 +15,7 @@ import {
fetchAssistPipelines, fetchAssistPipelines,
updateAssistPipeline, updateAssistPipeline,
AssistPipeline, AssistPipeline,
setAssistPipelinePreferred,
} from "../../../data/assist_pipeline"; } from "../../../data/assist_pipeline";
import { showConfirmationDialog } from "../../../dialogs/generic/show-dialog-box"; import { showConfirmationDialog } from "../../../dialogs/generic/show-dialog-box";
import type { HomeAssistant } from "../../../types"; import type { HomeAssistant } from "../../../types";
@ -25,11 +27,14 @@ export class AssistPref extends LitElement {
@state() private _pipelines: AssistPipeline[] = []; @state() private _pipelines: AssistPipeline[] = [];
@state() private _preferred: string | null = null;
protected firstUpdated(changedProps: PropertyValues) { protected firstUpdated(changedProps: PropertyValues) {
super.firstUpdated(changedProps); super.firstUpdated(changedProps);
fetchAssistPipelines(this.hass).then((pipelines) => { 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.name}
<span slot="secondary">${pipeline.language}</span> <span slot="secondary">${pipeline.language}</span>
${this._preferred === pipeline.id
? html`<ha-svg-icon
slot="meta"
.path=${mdiStar}
></ha-svg-icon>`
: ""}
<ha-icon-next slot="meta"></ha-icon-next> <ha-icon-next slot="meta"></ha-icon-next>
</ha-list-item> </ha-list-item>
` `
@ -112,6 +123,7 @@ export class AssistPref extends LitElement {
private async _openDialog(pipeline?: AssistPipeline): Promise<void> { private async _openDialog(pipeline?: AssistPipeline): Promise<void> {
showVoiceAssistantPipelineDetailDialog(this, { showVoiceAssistantPipelineDetailDialog(this, {
pipeline, pipeline,
preferred: pipeline?.id === this._preferred,
createPipeline: async (values) => { createPipeline: async (values) => {
const created = await createAssistPipeline(this.hass!, values); const created = await createAssistPipeline(this.hass!, values);
this._pipelines = this._pipelines!.concat(created); this._pipelines = this._pipelines!.concat(created);
@ -126,6 +138,10 @@ export class AssistPref extends LitElement {
res === pipeline ? updated : res res === pipeline ? updated : res
); );
}, },
setPipelinePreferred: async () => {
await setAssistPipelinePreferred(this.hass!, pipeline!.id);
this._preferred = pipeline!.id;
},
deletePipeline: async () => { deletePipeline: async () => {
if ( if (
!(await showConfirmationDialog(this, { !(await showConfirmationDialog(this, {
@ -174,6 +190,14 @@ export class AssistPref extends LitElement {
direction: var(--direction); direction: var(--direction);
color: var(--secondary-text-color); 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 { .add {
margin: 0 16px 16px; margin: 0 16px 16px;
} }

View File

@ -22,6 +22,8 @@ export class DialogVoiceAssistantPipelineDetail extends LitElement {
@state() private _data?: Partial<AssistPipeline>; @state() private _data?: Partial<AssistPipeline>;
@state() private _preferred?: boolean;
@state() private _error?: Record<string, string>; @state() private _error?: Record<string, string>;
@state() private _submitting = false; @state() private _submitting = false;
@ -31,6 +33,7 @@ export class DialogVoiceAssistantPipelineDetail extends LitElement {
this._error = undefined; this._error = undefined;
if (this._params.pipeline) { if (this._params.pipeline) {
this._data = this._params.pipeline; this._data = this._params.pipeline;
this._preferred = this._params.preferred;
} else { } else {
this._data = {}; this._data = {};
} }
@ -82,6 +85,12 @@ export class DialogVoiceAssistantPipelineDetail extends LitElement {
> >
${this.hass.localize("ui.common.delete")} ${this.hass.localize("ui.common.delete")}
</ha-button> </ha-button>
<ha-button
.disabled=${this._preferred}
slot="secondaryAction"
@click=${this._setPreferred}
>Set as default</ha-button
>
` `
: nothing} : nothing}
<ha-button <ha-button
@ -181,6 +190,11 @@ export class DialogVoiceAssistantPipelineDetail extends LitElement {
} }
} }
private async _setPreferred() {
await this._params!.setPipelinePreferred();
this._preferred = true;
}
private async _deletePipeline() { private async _deletePipeline() {
this._submitting = true; this._submitting = true;
try { try {

View File

@ -6,10 +6,12 @@ import {
export interface VoiceAssistantPipelineDetailsDialogParams { export interface VoiceAssistantPipelineDetailsDialogParams {
pipeline?: AssistPipeline; pipeline?: AssistPipeline;
preferred?: boolean;
createPipeline: (values: AssistPipelineMutableParams) => Promise<unknown>; createPipeline: (values: AssistPipelineMutableParams) => Promise<unknown>;
updatePipeline: ( updatePipeline: (
updates: Partial<AssistPipelineMutableParams> updates: Partial<AssistPipelineMutableParams>
) => Promise<unknown>; ) => Promise<unknown>;
setPipelinePreferred: () => Promise<unknown>;
deletePipeline: () => Promise<boolean>; deletePipeline: () => Promise<boolean>;
} }