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 {