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;
direction: var(--direction);
}
.mdc-deprecated-list-item__meta {
display: var(--mdc-list-item-meta-display);
}
:host([multiline-secondary]) {
height: auto;
}

View File

@ -221,7 +221,10 @@ export const runAssistPipeline = (
};
export const fetchAssistPipelines = (hass: HomeAssistant) =>
hass.callWS<AssistPipeline[]>({
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<AssistPipelineMutableParams>
) =>
hass.callWS<AssistPipeline>({
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<void>({
type: "assist_pipeline/pipeline/delete",

View File

@ -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}
<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-list-item>
`
@ -112,6 +123,7 @@ export class AssistPref extends LitElement {
private async _openDialog(pipeline?: AssistPipeline): Promise<void> {
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;
}

View File

@ -22,6 +22,8 @@ export class DialogVoiceAssistantPipelineDetail extends LitElement {
@state() private _data?: Partial<AssistPipeline>;
@state() private _preferred?: boolean;
@state() private _error?: Record<string, string>;
@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")}
</ha-button>
<ha-button
.disabled=${this._preferred}
slot="secondaryAction"
@click=${this._setPreferred}
>Set as default</ha-button
>
`
: nothing}
<ha-button
@ -181,6 +190,11 @@ export class DialogVoiceAssistantPipelineDetail extends LitElement {
}
}
private async _setPreferred() {
await this._params!.setPipelinePreferred();
this._preferred = true;
}
private async _deletePipeline() {
this._submitting = true;
try {

View File

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