diff --git a/src/dialogs/config-flow/dialog-data-entry-flow.ts b/src/dialogs/config-flow/dialog-data-entry-flow.ts index 1d84b6efed..18de3e81d9 100644 --- a/src/dialogs/config-flow/dialog-data-entry-flow.ts +++ b/src/dialogs/config-flow/dialog-data-entry-flow.ts @@ -29,6 +29,7 @@ import { DeviceRegistryEntry, subscribeDeviceRegistry, } from "../../data/device_registry"; +import { fetchIntegrationManifest } from "../../data/integration"; import { haStyleDialog } from "../../resources/styles"; import type { HomeAssistant } from "../../types"; import { documentationUrl } from "../../util/documentation-url"; @@ -43,10 +44,10 @@ import "./step-flow-create-entry"; import "./step-flow-external"; import "./step-flow-form"; import "./step-flow-loading"; +import "./step-flow-menu"; import "./step-flow-pick-flow"; import "./step-flow-pick-handler"; import "./step-flow-progress"; -import "./step-flow-menu"; let instance = 0; @@ -237,22 +238,32 @@ class DataEntryFlowDialog extends LitElement { "" : html`
- ${["form", "menu", "external"].includes( - this._step?.type as any - ) + ${([ + "form", + "menu", + "external", + "progress", + "data_entry_flow_progressed", + ].includes(this._step?.type as any) && + this._params.manifest?.is_built_in) || + this._params.manifest?.documentation ? html` + + ` : ""} @@ -427,6 +438,17 @@ class DataEntryFlowDialog extends LitElement { this._handler = undefined; } this._processStep(step); + if (this._params!.manifest === undefined) { + try { + this._params!.manifest = await fetchIntegrationManifest( + this.hass, + this._params?.domain || step.handler + ); + } catch (_) { + // No manifest + this._params!.manifest = null; + } + } } else { this._step = null; this._flowsInProgress = flowsInProgress; diff --git a/src/dialogs/config-flow/show-dialog-data-entry-flow.ts b/src/dialogs/config-flow/show-dialog-data-entry-flow.ts index 35f6630216..ca57038f8b 100644 --- a/src/dialogs/config-flow/show-dialog-data-entry-flow.ts +++ b/src/dialogs/config-flow/show-dialog-data-entry-flow.ts @@ -10,6 +10,7 @@ import { DataEntryFlowStepMenu, DataEntryFlowStepProgress, } from "../../data/data_entry_flow"; +import { IntegrationManifest } from "../../data/integration"; import { HomeAssistant } from "../../types"; export interface FlowHandlers { @@ -122,6 +123,8 @@ export interface DataEntryFlowDialogParams { startFlowHandler?: string; searchQuery?: string; continueFlowId?: string; + manifest?: IntegrationManifest | null; + domain?: string; dialogClosedCallback?: (params: { flowFinished: boolean; entryId?: string; diff --git a/src/dialogs/config-flow/show-dialog-options-flow.ts b/src/dialogs/config-flow/show-dialog-options-flow.ts index 4a90b08889..14adfcb9e4 100644 --- a/src/dialogs/config-flow/show-dialog-options-flow.ts +++ b/src/dialogs/config-flow/show-dialog-options-flow.ts @@ -1,6 +1,6 @@ import { html } from "lit"; import { ConfigEntry } from "../../data/config_entries"; -import { domainToName } from "../../data/integration"; +import { domainToName, IntegrationManifest } from "../../data/integration"; import { createOptionsFlow, deleteOptionsFlow, @@ -16,12 +16,15 @@ export const loadOptionsFlowDialog = loadDataEntryFlowDialog; export const showOptionsFlowDialog = ( element: HTMLElement, - configEntry: ConfigEntry + configEntry: ConfigEntry, + manifest?: IntegrationManifest | null ): void => showFlowDialog( element, { startFlowHandler: configEntry.entry_id, + domain: configEntry.domain, + manifest, }, { loadDevicesAndAreas: false, diff --git a/src/dialogs/config-flow/step-flow-form.ts b/src/dialogs/config-flow/step-flow-form.ts index e88128b326..5ec2e499d8 100644 --- a/src/dialogs/config-flow/step-flow-form.ts +++ b/src/dialogs/config-flow/step-flow-form.ts @@ -190,6 +190,10 @@ class StepFlowForm extends LitElement { margin-top: 24px; display: block; } + h2 { + word-break: break-word; + padding-right: 72px; + } `, ]; } diff --git a/src/panels/config/entities/entity-registry-settings.ts b/src/panels/config/entities/entity-registry-settings.ts index 782c4a466f..eabbf8fbaf 100644 --- a/src/panels/config/entities/entity-registry-settings.ts +++ b/src/panels/config/entities/entity-registry-settings.ts @@ -730,7 +730,7 @@ export class EntityRegistrySettings extends SubscribeMixin(LitElement) { } private async _showOptionsFlow() { - showOptionsFlowDialog(this, this._helperConfigEntry!); + showOptionsFlowDialog(this, this._helperConfigEntry!, null); } private _switchAsDomainsSorted = memoizeOne( diff --git a/src/panels/config/integrations/ha-config-integrations.ts b/src/panels/config/integrations/ha-config-integrations.ts index a78eb0e94b..79cd2d7828 100644 --- a/src/panels/config/integrations/ha-config-integrations.ts +++ b/src/panels/config/integrations/ha-config-integrations.ts @@ -700,6 +700,7 @@ class HaConfigIntegrations extends SubscribeMixin(LitElement) { this._handleFlowUpdated(); }, startFlowHandler: domain, + manifest: this._manifests[domain], showAdvanced: this.hass.userData?.showAdvanced, }); } diff --git a/src/panels/config/integrations/ha-integration-card.ts b/src/panels/config/integrations/ha-integration-card.ts index 28154e279c..d2790ec98f 100644 --- a/src/panels/config/integrations/ha-integration-card.ts +++ b/src/panels/config/integrations/ha-integration-card.ts @@ -482,7 +482,11 @@ export class HaIntegrationCard extends LitElement { ); private _showOptions(ev) { - showOptionsFlowDialog(this, ev.target.closest("ha-card").configEntry); + showOptionsFlowDialog( + this, + ev.target.closest("ha-card").configEntry, + this.manifest + ); } private _handleRename(ev: CustomEvent): void {