diff --git a/src/dialogs/voice-assistant-setup/voice-assistant-setup-step-success.ts b/src/dialogs/voice-assistant-setup/voice-assistant-setup-step-success.ts index d4336e4cb8..991a86aef9 100644 --- a/src/dialogs/voice-assistant-setup/voice-assistant-setup-step-success.ts +++ b/src/dialogs/voice-assistant-setup/voice-assistant-setup-step-success.ts @@ -8,7 +8,6 @@ import "../../components/ha-tts-voice-picker"; import { AssistPipeline, listAssistPipelines, - setAssistPipelinePreferred, updateAssistPipeline, } from "../../data/assist_pipeline"; import { @@ -17,13 +16,13 @@ import { setWakeWords, } from "../../data/assist_satellite"; import { fetchCloudStatus } from "../../data/cloud"; +import { InputSelectEntity } from "../../data/input_select"; +import { setSelectOption } from "../../data/select"; import { showVoiceAssistantPipelineDetailDialog } from "../../panels/config/voice-assistants/show-dialog-voice-assistant-pipeline-detail"; import "../../panels/lovelace/entity-rows/hui-select-entity-row"; import { HomeAssistant } from "../../types"; import { AssistantSetupStyles } from "./styles"; import { STEP } from "./voice-assistant-setup-dialog"; -import { setSelectOption } from "../../data/select"; -import { InputSelectEntity } from "../../data/input_select"; @customElement("ha-voice-assistant-setup-step-success") export class HaVoiceAssistantSetupStepSuccess extends LitElement { @@ -233,7 +232,7 @@ export class HaVoiceAssistantSetupStepSuccess extends LitElement { } private async _openPipeline() { - const [pipeline, preferred_pipeline] = await this._getPipeline(); + const [pipeline] = await this._getPipeline(); if (!pipeline) { return; @@ -245,13 +244,9 @@ export class HaVoiceAssistantSetupStepSuccess extends LitElement { cloudActiveSubscription: cloudStatus.logged_in && cloudStatus.active_subscription, pipeline, - preferred: pipeline.id === preferred_pipeline, updatePipeline: async (values) => { await updateAssistPipeline(this.hass!, pipeline!.id, values); }, - setPipelinePreferred: async () => { - await setAssistPipelinePreferred(this.hass!, pipeline!.id); - }, hideWakeWord: true, }); } diff --git a/src/panels/config/voice-assistants/assist-pref.ts b/src/panels/config/voice-assistants/assist-pref.ts index e1f0546319..bb8ff29008 100644 --- a/src/panels/config/voice-assistants/assist-pref.ts +++ b/src/panels/config/voice-assistants/assist-pref.ts @@ -1,13 +1,22 @@ import "@material/mwc-list/mwc-list"; -import { mdiHelpCircle, mdiPlus, mdiStar } from "@mdi/js"; +import { + mdiBug, + mdiCommentProcessingOutline, + mdiDotsVertical, + mdiHelpCircle, + mdiPlus, + mdiStar, + mdiTrashCan, +} from "@mdi/js"; import { CSSResultGroup, LitElement, PropertyValues, css, html } from "lit"; import { customElement, property, state } from "lit/decorators"; import memoizeOne from "memoize-one"; import { formatLanguageCode } from "../../../common/language/format_language"; import "../../../components/ha-alert"; import "../../../components/ha-button"; +import "../../../components/ha-button-menu"; import "../../../components/ha-card"; -import "../../../components/ha-icon-next"; +import "../../../components/ha-icon-button"; import "../../../components/ha-list-item"; import "../../../components/ha-svg-icon"; import "../../../components/ha-switch"; @@ -23,11 +32,16 @@ import { } from "../../../data/assist_pipeline"; import { CloudStatus } from "../../../data/cloud"; import { ExposeEntitySettings } from "../../../data/expose"; -import { showConfirmationDialog } from "../../../dialogs/generic/show-dialog-box"; +import { + showAlertDialog, + showConfirmationDialog, +} from "../../../dialogs/generic/show-dialog-box"; import type { HomeAssistant } from "../../../types"; import { brandsUrl } from "../../../util/brands-url"; import { documentationUrl } from "../../../util/documentation-url"; import { showVoiceAssistantPipelineDetailDialog } from "./show-dialog-voice-assistant-pipeline-detail"; +import { showVoiceCommandDialog } from "../../../dialogs/voice-command-dialog/show-ha-voice-command-dialog"; +import { stopPropagation } from "../../../common/dom/stop_propagation"; @customElement("assist-pref") export class AssistPref extends LitElement { @@ -101,20 +115,71 @@ export class AssistPref extends LitElement { twoline hasMeta role="button" - @click=${this._editPipeline} .id=${pipeline.id} + @click=${this._editPipeline} > - ${pipeline.name} + + ${pipeline.name} + ${this._preferred === pipeline.id + ? html`` + : ""} + ${formatLanguageCode(pipeline.language, this.hass.locale)} - ${this._preferred === pipeline.id - ? html`` - : ""} - + + + + ${this.hass!.localize( + "ui.panel.config.voice_assistants.assistants.pipeline.start_conversation" + )} + + + + ${this.hass.localize( + "ui.panel.config.voice_assistants.assistants.pipeline.detail.set_as_preferred" + )} + + + + + ${this.hass.localize( + "ui.panel.config.voice_assistants.assistants.pipeline.detail.debug" + )} + + + + + ${this.hass.localize("ui.common.delete")} + + + ` )} @@ -157,6 +222,49 @@ export class AssistPref extends LitElement { `; } + private _talkWithPipeline(ev) { + const id = ev.currentTarget.id as string; + showVoiceCommandDialog(this, this.hass, { pipeline_id: id }); + } + + private async _setPreferredPipeline(ev) { + const id = ev.currentTarget.id as string; + await setAssistPipelinePreferred(this.hass!, id); + this._preferred = id; + } + + private async _deletePipeline(ev) { + const id = ev.currentTarget.id as string; + if (this._preferred === id) { + showAlertDialog(this, { + text: this.hass!.localize( + "ui.panel.config.voice_assistants.assistants.pipeline.delete.error_preferred" + ), + }); + return; + } + const pipeline = this._pipelines.find((res) => res.id === id); + if ( + !(await showConfirmationDialog(this, { + title: this.hass!.localize( + "ui.panel.config.voice_assistants.assistants.pipeline.delete.confirm_title", + { name: pipeline!.name } + ), + text: this.hass!.localize( + "ui.panel.config.voice_assistants.assistants.pipeline.delete.confirm_text", + { name: pipeline!.name } + ), + confirmText: this.hass!.localize("ui.common.delete"), + destructive: true, + })) + ) { + return; + } + + await deleteAssistPipeline(this.hass!, pipeline!.id); + this._pipelines = this._pipelines!.filter((res) => res !== pipeline); + } + private _editPipeline(ev) { const id = ev.currentTarget.id as string; @@ -173,7 +281,6 @@ export class AssistPref extends LitElement { cloudActiveSubscription: this.cloudStatus?.logged_in && this.cloudStatus.active_subscription, pipeline, - preferred: pipeline?.id === this._preferred, createPipeline: async (values) => { const created = await createAssistPipeline(this.hass!, values); this._pipelines = this._pipelines!.concat(created); @@ -188,32 +295,6 @@ 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, { - title: this.hass!.localize( - "ui.panel.config.voice_assistants.assistants.pipeline.delete.confirm_title", - { name: pipeline!.name } - ), - text: this.hass!.localize( - "ui.panel.config.voice_assistants.assistants.pipeline.delete.confirm_text", - { name: pipeline!.name } - ), - confirmText: this.hass!.localize("ui.common.delete"), - destructive: true, - })) - ) { - return false; - } - - await deleteAssistPipeline(this.hass!, pipeline!.id); - this._pipelines = this._pipelines!.filter((res) => res !== pipeline); - return true; - }, }); } @@ -242,11 +323,23 @@ export class AssistPref extends LitElement { ha-list-item { --mdc-list-item-meta-size: auto; --mdc-list-item-meta-display: flex; + --mdc-list-side-padding-right: 8px; } - ha-svg-icon, - ha-icon-next { - width: 24px; + + ha-list-item.danger { + color: var(--error-color); + border-top: 1px solid var(--divider-color); } + + ha-button-menu a { + text-decoration: none; + } + + ha-svg-icon { + color: currentColor; + width: 16px; + } + .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 fca855ec9d..94d345ba5e 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 @@ -1,16 +1,7 @@ -import { - mdiBug, - mdiClose, - mdiDotsVertical, - mdiStar, - mdiStarOutline, -} from "@mdi/js"; +import { mdiClose } from "@mdi/js"; import { css, CSSResultGroup, html, LitElement, nothing } from "lit"; import { customElement, property, state } from "lit/decorators"; import { fireEvent } from "../../../common/dom/fire_event"; -import { stopPropagation } from "../../../common/dom/stop_propagation"; -import { shouldHandleRequestSelectedEvent } from "../../../common/mwc/handle-request-selected-event"; -import { navigate } from "../../../common/navigate"; import "../../../components/ha-button"; import "../../../components/ha-dialog-header"; import "../../../components/ha-form/ha-form"; @@ -38,8 +29,6 @@ export class DialogVoiceAssistantPipelineDetail extends LitElement { @state() private _data?: Partial; - @state() private _preferred?: boolean; - @state() private _cloudActive?: boolean; @state() private _error?: Record; @@ -54,7 +43,6 @@ export class DialogVoiceAssistantPipelineDetail extends LitElement { this._cloudActive = this._params.cloudActiveSubscription; if (this._params.pipeline) { this._data = this._params.pipeline; - this._preferred = this._params.preferred; return; } @@ -129,39 +117,6 @@ export class DialogVoiceAssistantPipelineDetail extends LitElement { .path=${mdiClose} > ${title} - ${this._params.pipeline?.id - ? html` - - - - - - ${this.hass.localize( - "ui.panel.config.voice_assistants.assistants.pipeline.detail.debug" - )} - - - - ` - : nothing}
${this._error @@ -173,7 +128,7 @@ export class DialogVoiceAssistantPipelineDetail extends LitElement { .supportedLanguages=${this._supportedLanguages} keys="name,language" @value-changed=${this._valueChanged} - dialogInitialFocus + ?dialogInitialFocus=${!this._params.pipeline?.id} > `}
- ${this._params.pipeline?.id && this._params.deletePipeline - ? html` - - ${this.hass.localize("ui.common.delete")} - - ` - : nothing} Promise; - setPipelinePreferred: () => Promise; createPipeline?: (values: AssistPipelineMutableParams) => Promise; - deletePipeline?: () => Promise; } export const loadVoiceAssistantPipelineDetailDialog = () => diff --git a/src/translations/en.json b/src/translations/en.json index cc08d701a6..0220a4d7e0 100644 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -2616,8 +2616,10 @@ "assist_devices": "{number} Assist {number, plural,\n one {device}\n other {devices}\n}", "delete": { "confirm_title": "Delete {name}?", - "confirm_text": "{name} will be permanently deleted." + "confirm_text": "{name} will be permanently deleted.", + "error_preferred": "You cannot delete the preferred assistant" }, + "start_conversation": "Start conversation", "devices": { "title": "Assist devices", "device": "Device",