mirror of
https://github.com/home-assistant/developers.home-assistant.git
synced 2025-06-19 00:26:28 +00:00
Improve data entry flow show progress docs (#725)
This commit is contained in:
parent
0a77d46fad
commit
0e2ebe957e
@ -290,9 +290,9 @@ _The example is about config entries, but works with other parts that use data e
|
|||||||
|
|
||||||
The flow works as follows:
|
The flow works as follows:
|
||||||
|
|
||||||
1. The user starts config flow in Home Assistant.
|
1. The user starts the config flow in Home Assistant.
|
||||||
2. The config flow prompts the user that a task in progress and will take some time to finish.
|
2. The config flow prompts the user that a task is in progress and will take some time to finish by calling `async_show_progress`. The flow should pass a task specific string as `progress_action` parameter to represent the translated text string for the prompt.
|
||||||
3. The flow is responsible to manage the background task and continue the flow when the task is done or canceled.
|
3. The flow is responsible for managing the background task and continuing the flow when the task is done or canceled. Continue the flow by calling the `FlowManager.async_configure` method, e.g. via `hass.config_entries.flow.async_configure`. Create a new task that does this to avoid a deadlock.
|
||||||
4. When the task or tasks are done, the flow should mark the progress to be done with the `async_show_progress_done` method.
|
4. When the task or tasks are done, the flow should mark the progress to be done with the `async_show_progress_done` method.
|
||||||
5. The frontend will update each time we call show progress or show progress done.
|
5. The frontend will update each time we call show progress or show progress done.
|
||||||
6. The config flow will automatically advance to the next step when the progress was marked as done. The user is prompted with the next step.
|
6. The config flow will automatically advance to the next step when the progress was marked as done. The user is prompted with the next step.
|
||||||
@ -307,15 +307,29 @@ from .const import DOMAIN # pylint:disable=unused-import
|
|||||||
|
|
||||||
class TestFlow(config_entries.ConfigFlow, domain=DOMAIN):
|
class TestFlow(config_entries.ConfigFlow, domain=DOMAIN):
|
||||||
VERSION = 1
|
VERSION = 1
|
||||||
data = None
|
task_one = None
|
||||||
task_one_done = False
|
task_two = None
|
||||||
|
|
||||||
|
async def _async_do_task(self, task):
|
||||||
|
await task # A task that take some time to complete.
|
||||||
|
|
||||||
|
# Continue the flow after show progress when the task is done.
|
||||||
|
# To avoid a potential deadlock we create a new task that continues the flow.
|
||||||
|
# The task must be completely done so the flow can await the task
|
||||||
|
# if needed and get the task result.
|
||||||
|
self.hass.async_create_task(
|
||||||
|
self.hass.config_entries.flow.async_configure(flow_id=self.flow_id)
|
||||||
|
)
|
||||||
|
|
||||||
async def async_step_user(self, user_input=None):
|
async def async_step_user(self, user_input=None):
|
||||||
if not user_input:
|
if not self.task_one or not self.task_two:
|
||||||
if not self.task_one_done:
|
if not self.task_one:
|
||||||
self.task_one_done = True
|
task = asyncio.sleep(10)
|
||||||
|
self.task_one = self.hass.async_create_task(self._async_do_task(task))
|
||||||
progress_action = "task_one"
|
progress_action = "task_one"
|
||||||
else:
|
else:
|
||||||
|
task = asyncio.sleep(10)
|
||||||
|
self.task_two = self.hass.async_create_task(self._async_do_task(task))
|
||||||
progress_action = "task_two"
|
progress_action = "task_two"
|
||||||
return self.async_show_progress(
|
return self.async_show_progress(
|
||||||
step_id="user",
|
step_id="user",
|
||||||
@ -325,7 +339,9 @@ class TestFlow(config_entries.ConfigFlow, domain=DOMAIN):
|
|||||||
return self.async_show_progress_done(next_step_id="finish")
|
return self.async_show_progress_done(next_step_id="finish")
|
||||||
|
|
||||||
async def async_step_finish(self, user_input=None):
|
async def async_step_finish(self, user_input=None):
|
||||||
return self.async_create_entry(title=self.data["title"], data=self.data)
|
if not user_input:
|
||||||
|
return self.async_show_form(step_id="finish")
|
||||||
|
return self.async_create_entry(title="Some title", data={})
|
||||||
```
|
```
|
||||||
|
|
||||||
## Translations
|
## Translations
|
||||||
|
Loading…
x
Reference in New Issue
Block a user