|
|
@@ -9,6 +9,9 @@ import voluptuous as vol
|
|
|
from homeassistant.config_entries import ConfigEntry, ConfigFlow, ConfigFlowResult, OptionsFlow
|
|
|
from homeassistant.core import callback
|
|
|
from homeassistant.helpers.selector import (
|
|
|
+ NumberSelector,
|
|
|
+ NumberSelectorConfig,
|
|
|
+ NumberSelectorMode,
|
|
|
SelectSelector,
|
|
|
SelectSelectorConfig,
|
|
|
SelectSelectorMode,
|
|
|
@@ -21,8 +24,10 @@ from .const import (
|
|
|
CONF_CALDAV_URL,
|
|
|
CONF_CALENDAR_NAME,
|
|
|
CONF_PASSWORD,
|
|
|
+ CONF_REFRESH_INTERVAL,
|
|
|
CONF_SYNC_MODE,
|
|
|
CONF_USERNAME,
|
|
|
+ DEFAULT_REFRESH_INTERVAL,
|
|
|
DEFAULT_ROOM_STATE_NAME,
|
|
|
DOMAIN,
|
|
|
SYNC_MODE_CALDAV,
|
|
|
@@ -89,65 +94,83 @@ class RoomCalConfigFlow(ConfigFlow, domain=DOMAIN):
|
|
|
class RoomCalOptionsFlow(OptionsFlow):
|
|
|
|
|
|
def __init__(self) -> None:
|
|
|
- self._username: str = ""
|
|
|
+ self._selected_mode: str = SYNC_MODE_MANUAL
|
|
|
|
|
|
async def async_step_init(
|
|
|
self, user_input: dict[str, Any] | None = None
|
|
|
) -> ConfigFlowResult:
|
|
|
- self._username = self.config_entry.data.get(CONF_USERNAME, "")
|
|
|
- return await self.async_step_sync()
|
|
|
+ return await self.async_step_sync_mode()
|
|
|
|
|
|
- async def async_step_sync(
|
|
|
+ async def async_step_sync_mode(
|
|
|
+ self, user_input: dict[str, Any] | None = None
|
|
|
+ ) -> ConfigFlowResult:
|
|
|
+ if user_input is not None:
|
|
|
+ self._selected_mode = user_input[CONF_SYNC_MODE]
|
|
|
+ if self._selected_mode == SYNC_MODE_CALDAV:
|
|
|
+ return await self.async_step_caldav()
|
|
|
+ merged = {**self.config_entry.options, CONF_SYNC_MODE: self._selected_mode}
|
|
|
+ return self.async_create_entry(data=merged)
|
|
|
+
|
|
|
+ opts = self.config_entry.options
|
|
|
+ return self.async_show_form(
|
|
|
+ step_id="sync_mode",
|
|
|
+ data_schema=vol.Schema({
|
|
|
+ vol.Required(CONF_SYNC_MODE, default=opts.get(CONF_SYNC_MODE, SYNC_MODE_MANUAL)): SelectSelector(
|
|
|
+ SelectSelectorConfig(
|
|
|
+ options=[
|
|
|
+ {"value": SYNC_MODE_MANUAL, "label": "Manual"},
|
|
|
+ {"value": SYNC_MODE_CALDAV, "label": "CalDAV"},
|
|
|
+ ],
|
|
|
+ mode=SelectSelectorMode.LIST,
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ }),
|
|
|
+ )
|
|
|
+
|
|
|
+ async def async_step_caldav(
|
|
|
self, user_input: dict[str, Any] | None = None
|
|
|
) -> ConfigFlowResult:
|
|
|
errors: dict[str, str] = {}
|
|
|
|
|
|
if user_input is not None:
|
|
|
- self._username = user_input.pop(CONF_USERNAME, "") or self.config_entry.data.get(CONF_USERNAME, "")
|
|
|
+ username = user_input.pop(CONF_USERNAME, "") or self.config_entry.data.get(CONF_USERNAME, "")
|
|
|
password = user_input.pop(CONF_PASSWORD, "") or self.config_entry.data.get(CONF_PASSWORD, "")
|
|
|
|
|
|
- new_data = {**self.config_entry.data, CONF_USERNAME: self._username}
|
|
|
-
|
|
|
- if user_input.get(CONF_SYNC_MODE) == SYNC_MODE_CALDAV and user_input.get(CONF_CALDAV_URL):
|
|
|
+ if user_input.get(CONF_CALDAV_URL):
|
|
|
try:
|
|
|
await self.hass.async_add_executor_job(
|
|
|
_test_caldav_auth,
|
|
|
user_input[CONF_CALDAV_URL],
|
|
|
- self._username,
|
|
|
+ username,
|
|
|
password,
|
|
|
)
|
|
|
except caldav_error.AuthorizationError:
|
|
|
errors["base"] = "invalid_auth"
|
|
|
except Exception:
|
|
|
errors["base"] = "cannot_connect"
|
|
|
- else:
|
|
|
- new_data[CONF_PASSWORD] = password
|
|
|
|
|
|
if not errors:
|
|
|
+ new_data = {**self.config_entry.data, CONF_USERNAME: username, CONF_PASSWORD: password}
|
|
|
self.hass.config_entries.async_update_entry(self.config_entry, data=new_data)
|
|
|
- merged = {**self.config_entry.options, **user_input}
|
|
|
+ merged = {**self.config_entry.options, CONF_SYNC_MODE: self._selected_mode, **user_input}
|
|
|
return self.async_create_entry(data=merged)
|
|
|
|
|
|
opts = self.config_entry.options
|
|
|
return self.async_show_form(
|
|
|
- step_id="sync",
|
|
|
+ step_id="caldav",
|
|
|
data_schema=vol.Schema({
|
|
|
- vol.Required(CONF_SYNC_MODE, default=opts.get(CONF_SYNC_MODE, SYNC_MODE_MANUAL)): SelectSelector(
|
|
|
- SelectSelectorConfig(
|
|
|
- options=[
|
|
|
- {"value": "caldav", "label": "CalDAV"},
|
|
|
- {"value": "api", "label": "API"},
|
|
|
- {"value": "manual", "label": "Manual"},
|
|
|
- ],
|
|
|
- mode=SelectSelectorMode.LIST,
|
|
|
- )
|
|
|
- ),
|
|
|
vol.Optional(CONF_CALDAV_URL, default=opts.get(CONF_CALDAV_URL, "")): str,
|
|
|
vol.Optional(CONF_CALENDAR_NAME, default=opts.get(CONF_CALENDAR_NAME, "")): str,
|
|
|
- vol.Optional(CONF_USERNAME, default=self._username): str,
|
|
|
+ vol.Optional(CONF_USERNAME, default=self.config_entry.data.get(CONF_USERNAME, "")): str,
|
|
|
vol.Optional(CONF_PASSWORD, default=""): TextSelector(
|
|
|
TextSelectorConfig(type=TextSelectorType.PASSWORD)
|
|
|
),
|
|
|
+ vol.Optional(
|
|
|
+ CONF_REFRESH_INTERVAL,
|
|
|
+ default=opts.get(CONF_REFRESH_INTERVAL, DEFAULT_REFRESH_INTERVAL),
|
|
|
+ ): NumberSelector(
|
|
|
+ NumberSelectorConfig(min=1, max=1440, unit_of_measurement="min", mode=NumberSelectorMode.BOX)
|
|
|
+ ),
|
|
|
}),
|
|
|
errors=errors,
|
|
|
)
|