From 3d958d04119d5a303f4e8f5070a42ff4d8c40d9d Mon Sep 17 00:00:00 2001 From: veenm Date: Mon, 26 Oct 2026 23:20:55 +0100 Subject: [PATCH] Dashboard Studio 2.0.0: Admin, Builder and Dashboard screens, roles, Haven - Home Assistant administrators are admins: Dashboard, Builder and Admin screens - Everyone else only sees the dashboards an admin chose, always in kiosk mode; the server enforces it (saving, people, devices, history are admin-only, and the websocket only allows reading states and controlling devices) - Admin screen: dashboards, people and what each sees (with preview), devices, messages to the screens, the Haven app, activity, about - Haven: new Android app (haven/) that only shows dashboards; replaces the Dashboard Studio Android app and signs in through Home Assistant's page - Screens pick up dashboard and access changes within a minute - Version history records who made each change; panel visible to all users Co-Authored-By: Claude Opus 5.5 --- android/assets/icon.png | Bin 19944 -> 0 bytes android/assets/setup.html | 63 --- android/res/drawable-xxxhdpi/ic_fg.png | Bin 26710 -> 0 bytes android/res/mipmap-hdpi/ic_launcher.png | Bin 6906 -> 0 bytes android/res/mipmap-mdpi/ic_launcher.png | Bin 4085 -> 0 bytes android/res/mipmap-xhdpi/ic_launcher.png | Bin 10672 -> 0 bytes android/res/mipmap-xxhdpi/ic_launcher.png | Bin 19944 -> 0 bytes android/res/mipmap-xxxhdpi/ic_launcher.png | Bin 31751 -> 0 bytes dashboard_studio/CHANGELOG.md | 10 + dashboard_studio/DOCS.md | 84 ++- dashboard_studio/config.yaml | 4 +- dashboard_studio/server/main.py | 257 ++++++++- dashboard_studio/server/mock_ha.py | 18 +- dashboard_studio/web/app.js | 511 +++++++++++++++--- dashboard_studio/web/dashboard-studio.apk | Bin 124057 -> 0 bytes dashboard_studio/web/haven-icon.svg | 15 + dashboard_studio/web/haven.apk | Bin 0 -> 70879 bytes dashboard_studio/web/i18n.js | 79 +++ dashboard_studio/web/index.html | 23 +- dashboard_studio/web/style.css | 108 ++++ dashboard_studio/web/sw.js | 4 +- {android => haven}/.gitignore | 0 {android => haven}/AndroidManifest.xml | 8 +- haven/assets/icon.png | Bin 0 -> 5994 bytes haven/assets/setup.html | 66 +++ {android => haven}/build.sh | 12 +- haven/res/drawable-xxxhdpi/ic_fg.png | Bin 0 -> 14045 bytes {android => haven}/res/drawable/ic_bg.xml | 2 +- haven/res/drawable/loading.xml | 5 + .../res/mipmap-anydpi-v26/ic_launcher.xml | 0 haven/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 2714 bytes haven/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1770 bytes haven/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 3818 bytes haven/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 5994 bytes haven/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 8354 bytes {android => haven}/res/values/values.xml | 8 +- .../nl/melvanveen/haven}/MainActivity.java | 67 ++- 37 files changed, 1096 insertions(+), 248 deletions(-) delete mode 100644 android/assets/icon.png delete mode 100644 android/assets/setup.html delete mode 100644 android/res/drawable-xxxhdpi/ic_fg.png delete mode 100644 android/res/mipmap-hdpi/ic_launcher.png delete mode 100644 android/res/mipmap-mdpi/ic_launcher.png delete mode 100644 android/res/mipmap-xhdpi/ic_launcher.png delete mode 100644 android/res/mipmap-xxhdpi/ic_launcher.png delete mode 100644 android/res/mipmap-xxxhdpi/ic_launcher.png delete mode 100644 dashboard_studio/web/dashboard-studio.apk create mode 100644 dashboard_studio/web/haven-icon.svg create mode 100644 dashboard_studio/web/haven.apk rename {android => haven}/.gitignore (100%) rename {android => haven}/AndroidManifest.xml (85%) create mode 100644 haven/assets/icon.png create mode 100644 haven/assets/setup.html rename {android => haven}/build.sh (78%) create mode 100644 haven/res/drawable-xxxhdpi/ic_fg.png rename {android => haven}/res/drawable/ic_bg.xml (55%) create mode 100644 haven/res/drawable/loading.xml rename {android => haven}/res/mipmap-anydpi-v26/ic_launcher.xml (100%) create mode 100644 haven/res/mipmap-hdpi/ic_launcher.png create mode 100644 haven/res/mipmap-mdpi/ic_launcher.png create mode 100644 haven/res/mipmap-xhdpi/ic_launcher.png create mode 100644 haven/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 haven/res/mipmap-xxxhdpi/ic_launcher.png rename {android => haven}/res/values/values.xml (57%) rename {android/src/nl/melvanveen/dashboardstudio => haven/src/nl/melvanveen/haven}/MainActivity.java (77%) diff --git a/android/assets/icon.png b/android/assets/icon.png deleted file mode 100644 index 99486d4e4fa49128176465eb641e3c1f92108e36..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19944 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 Y0cy;k&o3Wi - - - - - - - -
- -

Connect to Home Assistant

-

Enter the address you use to open Home Assistant. You sign in once; the app remembers it.

-

-
- - -

You can also paste the link from Dashboard Studio: Install as an app, Open in the app.

- -
-
- - - diff --git a/android/res/drawable-xxxhdpi/ic_fg.png b/android/res/drawable-xxxhdpi/ic_fg.png deleted file mode 100644 index 276a6f2d6dce10cdce2a5be329da7418d5d05e15..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26710 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 diff --git a/android/res/mipmap-hdpi/ic_launcher.png b/android/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index c5432e1e62804a8f3ab38da1aea48fc5806133c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6906 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 M*Nt=uaHr`10iEtxa{vGU diff --git a/android/res/mipmap-xhdpi/ic_launcher.png b/android/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index 4525c5721cadc384f02ce5cab67a018b1d1cd891..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10672 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 diff --git a/android/res/mipmap-xxhdpi/ic_launcher.png b/android/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index 99486d4e4fa49128176465eb641e3c1f92108e36..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19944 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 Y0cy;k&o3Wi^>=8E`QF?kbzMu>U4#3o&^y0H8h& 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 X$BxdI9x6uM00000NkvXXu0mjf<|D}E diff --git a/dashboard_studio/CHANGELOG.md b/dashboard_studio/CHANGELOG.md index 5e1d35f..d6c7d1d 100644 --- a/dashboard_studio/CHANGELOG.md +++ b/dashboard_studio/CHANGELOG.md @@ -1,5 +1,15 @@ # Changelog +## 2.0.0 + +- **Admins and everyone else:** Home Assistant's administrators are admins in Dashboard Studio; everyone else only sees the dashboards an admin chose for them, full screen in kiosk mode, and can't change anything. Dashboard Studio enforces this itself: only admins can save, and everyone else can only read states and control devices, as in Home Assistant. +- **Three screens for admins:** Dashboard, Builder and Admin, switched at the top right. **Edit** is now **Builder**. +- **Admin screen:** dashboards as cards with who sees them; people and what each may see, with **Preview** to see it as they do; every device that opened Dashboard Studio, to give it a dashboard; a message to the screens; setting up Haven; and who changed which dashboard. +- **Haven:** a new Android app for everyone in your home. It only shows dashboards, opens full screen and keeps you signed in. Download it with the QR code under **Admin → Haven app**. It replaces the earlier Dashboard Studio Android app. +- **Live updates:** screens pick up a changed dashboard, or a change in who sees what, within a minute, without reloading. +- **Everyone in the sidebar:** Dashboard Studio is now in the sidebar for everyone with a Home Assistant login, not only for administrators. +- The version history now remembers who made each change. + ## 1.14.1 - **Android app:** Dashboard Studio as a real app for Android phones and tablets. Download it from **Install as an app**, sign in to Home Assistant once, and it opens full screen on your dashboard from then on, with its own icon. It works with plain http addresses too. diff --git a/dashboard_studio/DOCS.md b/dashboard_studio/DOCS.md index b10dff8..84f241e 100644 --- a/dashboard_studio/DOCS.md +++ b/dashboard_studio/DOCS.md @@ -1,16 +1,51 @@ # Dashboard Studio -A drag-and-drop dashboard builder that lives in its own sidebar tab. +A drag-and-drop dashboard builder that lives in its own sidebar tab, with **Haven**, an Android app that shows the dashboards to everyone in your home. -## Using it +## Admins and everyone else + +Dashboard Studio follows Home Assistant's own **Administrator** setting (Settings, People): + +- **Admins** (Home Assistant administrators) get three screens, switched at the top right: + - **Dashboard:** use your dashboards. + - **Builder:** build and change them. + - **Admin:** manage the dashboards, choose who sees what, name devices, set up Haven and see who changed what. +- **Everyone else** only sees the dashboards an admin chose for them, full screen in kiosk mode, on every device. They can't change anything. Tapping the kiosk corner five times switches between their dashboards (and turns guest mode on or off); there's no way out of kiosk mode. Someone with no dashboard chosen yet sees a short note saying so, which updates by itself once an admin picks one. + +This is enforced by Dashboard Studio itself, not just hidden: only administrators can save, see the people and devices or the history, and the connection to Home Assistant only lets everyone else read states and control devices, as Home Assistant itself would. Home Assistant's settings, other apps and its own dashboards stay out of reach. + +Everyone with a login sees Dashboard Studio in the Home Assistant sidebar. + +## The Admin screen + +- **Dashboards:** every dashboard as a card, with who sees it. **Open** shows it, **Build** opens it in the builder, and **⋯** renames, duplicates, shows the version history, shares, exports or deletes it. At the top: a new dashboard, one made from your devices, importing a file, and importing one of Home Assistant's own dashboards. +- **People:** everyone with a Home Assistant login. Admins see everything. For everyone else, choose **All dashboards** or **Only these** and tick the dashboards, plus the one that **Opens first**. **Everyone else** at the top sets this for people without their own choice, and for anyone added to Home Assistant later. **Preview** shows the dashboards exactly as that person gets them; **Stop preview** brings you back. +- **Devices:** every phone, tablet and computer that opened Dashboard Studio, with who used it, whether it was Haven or a browser, and when. Name a device, give it its own dashboard (that comes before the person's choice, handy for a wall tablet), have admins start it in kiosk mode, or forget it. **Send a message to the screens** puts a full-screen message on all screens in kiosk mode, or on one named device. +- **Haven app:** a QR code to download Haven on a phone, the address to enter in it, and how signing in works. +- **Activity:** who changed which dashboard, and when, with a shortcut to its versions. +- **About:** the version, what's new and the source code. + +Screens pick up what an admin changes, a dashboard or who sees what, within a minute, without reloading. + +## Haven, the Android app + +Haven shows the dashboards and nothing else: no builder and no Admin screen, for admins too. + +1. On the phone, scan the QR code under **Admin → Haven app** (or tap **Download Haven** on the phone itself), open the file and allow installing apps from that source when Android asks (once). +2. Open Haven and enter the address you use for Home Assistant. On the phone itself, **Open in Haven** fills it in. +3. Sign in with your own Home Assistant login, once. + +From then on Haven opens straight on your dashboard, full screen with its own icon, and keeps you signed in. It works with plain http addresses too. Kiosk mode keeps the screen on and hides Android's bars. To connect to another Home Assistant: tap the phone button in the top bar (admins) or the kiosk corner five times (everyone else), then **Change address**. Haven needs Android 7 or newer. The earlier *Dashboard Studio* Android app is replaced by Haven; you can uninstall it. + +## Building 1. Open **Dashboard Studio** in the Home Assistant sidebar. -2. Press **Edit**. Pick widgets from the left panel, drag them anywhere on the grid, and resize from the bottom-right corner. Other widgets move out of the way. +2. Switch to **Builder**. Pick widgets from the left panel, drag them anywhere on the grid, and resize from the bottom-right corner. Other widgets move out of the way. 3. Set up the selected widget in the right panel: entity, labels, icon, thresholds, colors. 4. With nothing selected, the right panel holds dashboard settings: theme, tile style, colors, background image, grid and kiosk options. -5. Press **Done**. Changes save automatically. +5. Switch back to **Dashboard**. Changes save automatically. -Keyboard shortcuts in edit mode: arrow keys move, Shift+arrows resize, ⌘D or Ctrl+D duplicates, Delete removes, ⌘Z or Ctrl+Z undoes, and ⇧⌘Z or Ctrl+Shift+Z redoes. +Keyboard shortcuts in the builder: arrow keys move, Shift+arrows resize, ⌘D or Ctrl+D duplicates, Delete removes, ⌘Z or Ctrl+Z undoes, and ⇧⌘Z or Ctrl+Shift+Z redoes. More editing tools: @@ -68,7 +103,7 @@ Pick a weather entity in the clock's settings to show the current conditions and ### Horizontal scroll and swipe cards -These cards hold other cards. Select one in edit mode, pick a card type under **Cards** and press **Add**. The new card opens straight away so you can set it up; **←** takes you back. Use the arrows to reorder cards, and open a card to change or remove it. +These cards hold other cards. Select one in the builder, pick a card type under **Cards** and press **Add**. The new card opens straight away so you can set it up; **←** takes you back. Use the arrows to reorder cards, and open a card to change or remove it. - **Horizontal scroll** puts its cards in a row you can scroll sideways, by touch, trackpad or the arrow buttons that appear on hover. Set the card width in pixels, or as the number of cards visible at once (2.5 lets half a card peek out, so it's clear the row scrolls). A single card can get its own width in its settings. Add an optional title. The row keeps its scroll position when something inside it changes. - **Swipe cards** shows one card at a time, filling the whole card. Swipe with a finger or drag with the mouse: the card follows along, resists at the first and last card, and a quick flick is enough. The left and right arrow keys work too. Small dots appear at the bottom while you swipe or hover, and hide again after a few seconds; tap one to jump to that card. It can also move to the next card automatically every few seconds. Touching it pauses that for 20 seconds, and it stops completely when the system's "reduce motion" setting is on. @@ -206,35 +241,32 @@ The card follows the style of the Tesla app, with two designs: ## Conditional widgets -Any widget can be shown only under certain conditions. Select it in edit mode, then under **Visibility** choose **Add condition**. Pick an entity, a comparison (*is*, *is not*, *above*, *below*) and a value. For example: *switch.coffee_machine is on*, or *sensor.washer_power above 5*. With several conditions, choose whether all of them or just one must be true. +Any widget can be shown only under certain conditions. Select it in the builder, then under **Visibility** choose **Add condition**. Pick an entity, a comparison (*is*, *is not*, *above*, *below*) and a value. For example: *switch.coffee_machine is on*, or *sensor.washer_power above 5*. With several conditions, choose whether all of them or just one must be true. -In edit mode, hidden widgets stay visible but faded, with a **Hidden now** label, so you can still edit them. On the dashboard they disappear, and rows that only held hidden widgets close up so no gaps are left. Changes happen live as the entities change. +In the builder, hidden widgets stay visible but faded, with a **Hidden now** label, so you can still edit them. On the dashboard they disappear, and rows that only held hidden widgets close up so no gaps are left. Changes happen live as the entities change. ## Phone dashboards Turn on **Designed for phones** under **Grid** in the dashboard settings. The dashboard switches to a 4-column layout that you design at phone width, so what you see while editing is what the phone shows. Existing widgets are converted: small tiles become half width, larger cards full width, and nothing overlaps. Turning it off converts back to 12 columns. -On a phone, such a dashboard fills the whole screen, without the top bar with the dashboard picker and **Edit**. To bring the bar back, tap the round **⋯** button in the top right corner (or touch and hold an empty spot); it hides again after 15 seconds or when you tap **⋯** again. On a computer, a phone dashboard shows as a phone-width column. Dashboards that aren't designed for phones keep reflowing into two columns on phones, with the top bar. With the phone on its side, a phone dashboard shows two columns of its layout next to each other. +On a phone, such a dashboard fills the whole screen, without the top bar with the dashboard picker and the screen switcher. To bring the bar back, tap the round **⋯** button in the top right corner (or touch and hold an empty spot); it hides again after 15 seconds or when you tap **⋯** again. On a computer, a phone dashboard shows as a phone-width column. Dashboards that aren't designed for phones keep reflowing into two columns on phones, with the top bar. With the phone on its side, a phone dashboard shows two columns of its layout next to each other. ### On phones -- **Install as an app:** tap the phone button in the top bar (or **⋯ → Install as an app…** in edit mode). What it offers depends on the phone: - - **Android:** the Dashboard Studio app. Tap **Download the app**, open the downloaded file and allow installing apps from that source when Android asks (once). Then come back and tap **Open in the app**, or open the app and enter the address you use for Home Assistant. Sign in to Home Assistant once in the app; after that it opens straight on Dashboard Studio, full screen with its own icon and the dashboard's colors in the status bar, and keeps you signed in. Kiosk mode keeps the screen on and hides Android's bars. To connect to another Home Assistant, choose **Install as an app → Change address** in the app. The app finds Dashboard Studio by itself if you sign in as an administrator; other people can tap **Open in the app** on their phone instead. - - **From the browser** (Android and computers): the browser can also install Dashboard Studio as a web app, but only when Home Assistant is opened over **https** (for example Home Assistant Cloud or your own certificate). Home Assistant's own page can't be installed, so open Dashboard Studio in its own tab first (the dialog has a button for it). - - **iPhone and iPad:** apps on the home screen get their own storage there, without Home Assistant's sign-in, so they can't open an app that runs inside Home Assistant. Use Dashboard Studio from the sidebar in the Home Assistant app. -- **Shortcuts:** tick **Shortcut on the app icon** in the settings of a button, tile, light, thermostat or garage card. When Dashboard Studio is installed from the browser on Android, long-press its icon to run one straight away (up to four shortcuts; the Android app and iPhones don't support this). +- **Install as an app:** on Android, use **Haven** (see above). The phone button in the top bar explains the other options: browsers can install Dashboard Studio as a web app when Home Assistant is opened over **https** (open Dashboard Studio in its own tab first); on iPhone and iPad, apps on the home screen can't use Home Assistant's sign-in, so use the sidebar in the Home Assistant app. +- **Shortcuts:** tick **Shortcut on the app icon** in the settings of a button, tile, light, thermostat or garage card. When Dashboard Studio is installed from the browser on Android, long-press its icon to run one straight away (up to four shortcuts; Haven and iPhones don't support this). - **Offline:** each device keeps the last known states of its dashboard. When the connection drops, the dashboard keeps showing them with a small note saying from when, and catches up when it reconnects. - **Swipe** left or right over the dashboard to go to the next or previous tab (not over cards that swipe or scroll themselves). - **Pull down** at the top of the dashboard to reload every state. - **Popups** open as sheets from the bottom; drag one down to close it. - **Vibration:** buttons, switches and sliders give a short tick on phones that support it (not iPhones). Turn this off under **This device**. Wall tablets can play a soft click instead: turn on **A soft click when something is pressed** in the **Kiosk** settings. - **Show on:** under **Visibility**, a widget can be shown on all screens, only on phones, or only on larger screens. -- **Editing on the phone:** **Edit** works on a phone too. The bar at the bottom opens the widget list (**Add**) and the settings as sheets. Tap a widget to select it, then drag it or its corner; tap it again for its settings. +- **Building on the phone:** the **Builder** works on a phone too. The bar at the bottom opens the widget list (**Add**) and the settings as sheets. Tap a widget to select it, then drag it or its corner; tap it again for its settings. - **Away from home:** in the **Tabs** settings, **When you're away from home, open** picks a tab, such as cameras, the garage or the alarm, that opens while you're away, and the dashboard goes back when you're home. It follows the person signed in on the device, or a person you choose. Not used in kiosk mode. ## Tabs and side menu -A dashboard can have several tabs, each with its own widgets, for example *Overview*, *Household* and *Cameras*. To set them up, deselect all widgets in edit mode and use the **Tabs** section of the dashboard settings: +A dashboard can have several tabs, each with its own widgets, for example *Overview*, *Household* and *Cameras*. To set them up, deselect all widgets in the builder and use the **Tabs** section of the dashboard settings: - **Add tab** creates a tab and turns on the menu. - Each tab has a name and an icon (an icon name or an emoji). Use the arrows to reorder tabs and the bin to delete one; ⌘Z undoes this. @@ -287,30 +319,24 @@ Dashboard Studio is available in English and Dutch (Nederlands). By default it f ## Several dashboards -Use **+** for a new dashboard. You can start empty, from your devices, or from a template that fills itself with your devices: *Wall tablet* (clock, weather, calendar, rooms and cameras), *Phone* (people, lights, climate and media in the phone layout), *Energy* (power flow, solar forecast, water and gas, graphs) or *Family* (who's home, calendar, shopping list, parcels and weather). +Use **+** (or **New dashboard** on the Admin screen) for a new dashboard. You can start empty, from your devices, or from a template that fills itself with your devices: *Wall tablet* (clock, weather, calendar, rooms and cameras), *Phone* (people, lights, climate and media in the phone layout), *Energy* (power flow, solar forecast, water and gas, graphs) or *Family* (who's home, calendar, shopping list, parcels and weather). -The **⋯** menu (in edit mode) can rename, duplicate, export, import or delete a dashboard. Exported JSON files can be imported on another Home Assistant install. +On the Admin screen, a dashboard's **⋯** renames, duplicates, exports or deletes it; **Import file** brings an exported one back. Exported JSON files can be imported on another Home Assistant install. In the builder, the **⋯** menu keeps what concerns the dashboard you're building: rename, devices not on a dashboard, version history, undo history, share and export. -**Import from Home Assistant…** turns one of your existing Home Assistant dashboards into a new dashboard here, with a tab for each view. Entities, tile, button, light, thermostat, sensor, gauge, graph, weather, media, camera, calendar, to-do, alarm, area and markdown cards become matching widgets, and stacks and grids are taken apart; other cards are skipped and counted. The original stays as it is. Dashboards that Home Assistant generates itself (without cards of their own) can't be imported. +**Import from Home Assistant** (on the Admin screen) turns one of your existing Home Assistant dashboards into a new dashboard here, with a tab for each view. Entities, tile, button, light, thermostat, sensor, gauge, graph, weather, media, camera, calendar, to-do, alarm, area and markdown cards become matching widgets, and stacks and grids are taken apart; other cards are skipped and counted. The original stays as it is. Dashboards that Home Assistant generates itself (without cards of their own) can't be imported. **Share…** shows a link and a QR code for the dashboard, optionally opening in kiosk mode. It opens on any device that is signed in to Home Assistant. -**Version history…** in the **⋯** menu lists the earlier saves of the dashboard, up to 30, with the time and the number of widgets. Changes made within five minutes of each other count as one version. **Restore** brings a version back; ⌘Z undoes that. +**Version history…** (in the builder's **⋯** menu, or a dashboard's **⋯** on the Admin screen) lists the earlier saves of the dashboard, up to 30, with the time and the number of widgets. Changes made within five minutes of each other count as one version. **Restore** brings a version back; ⌘Z undoes that. ## Which dashboard opens where -Use **⋯ → Who sees which dashboard…** in edit mode to choose the dashboard that opens first: - -- **This device:** give the device a name, for example *Kitchen tablet*, and pick its dashboard. Tick **Kiosk** to have it start in kiosk mode. -- **Other devices** you have named appear in the list too, so you can change them from anywhere. -- **People:** pick a dashboard per Home Assistant user. People appear once they've opened Dashboard Studio, or when they have a person entity. - -A device's choice comes before a person's. Without either, the last dashboard used on that device opens. A link with `#view=…` or a shared link always wins. You can still switch dashboards at any time. +The first dashboard to open on a device is, in this order: one from a link (`#view=…` or a shared link), the device's own dashboard (**Admin → Devices**), the person's **Opens first** (**Admin → People**), and otherwise the last one used on that device. People who aren't admins only ever get dashboards they may see, plus the one an admin gave their device. ## Version and updates -The version you're running is shown at the bottom of the dashboard settings, under **About** (deselect all widgets in edit mode). **What's new** there shows the changelog, which is also on the app's **Changelog** tab in Home Assistant. After an update, a short message points you to it. After Home Assistant installs an update, screens that are open reload themselves within a few minutes, which is handy for wall tablets. While you're editing, you get a message instead, so nothing you're working on is interrupted. +The version you're running is shown under **Admin → About**, and at the bottom of the dashboard settings in the builder. **What's new** there shows the changelog, which is also on the app's **Changelog** tab in Home Assistant. After an update, a short message points you to it. After Home Assistant installs an update, screens that are open reload themselves within a few minutes, which is handy for wall tablets. While you're editing, you get a message instead, so nothing you're working on is interrupted. ## Data -Dashboards and presets are stored in the app's `/data/dashboards.json`, and their version history in `/data/history/`, so both are included in Home Assistant backups. Night mode, guest mode started with the button, vibration and the last known states are kept on each device. +Dashboards, presets and who sees what are stored in the app's `/data/dashboards.json`, their version history (with who made each change) in `/data/history/`, and the devices that opened Dashboard Studio in `/data/devices.json`, so all of it is included in Home Assistant backups. Night mode, guest mode started with the button, vibration and the last known states are kept on each device. diff --git a/dashboard_studio/config.yaml b/dashboard_studio/config.yaml index b28e56b..c5ecdcc 100644 --- a/dashboard_studio/config.yaml +++ b/dashboard_studio/config.yaml @@ -1,5 +1,5 @@ name: Dashboard Studio -version: "1.14.1" +version: "2.0.0" slug: dashboard_studio description: Drag-and-drop dashboard builder with a free-form grid, live entity widgets and themes. url: https://git.melvanveen.nl/veenm/ha-dashboard-studio @@ -15,6 +15,8 @@ ingress_port: 8099 ingress_stream: true panel_icon: mdi:view-dashboard-edit panel_title: Dashboard Studio +# Everyone with a login gets it in the sidebar; Dashboard Studio itself decides what each person sees. +panel_admin: false homeassistant_api: true options: immich_url: "" diff --git a/dashboard_studio/server/main.py b/dashboard_studio/server/main.py index 0b53888..68cabea 100644 --- a/dashboard_studio/server/main.py +++ b/dashboard_studio/server/main.py @@ -119,7 +119,7 @@ def load_history(dash_id): return [] -def record_history(old, new): +def record_history(old, new, by=""): """Add every dashboard that changed in this save to its history.""" before = {d.get("id"): d for d in old.get("dashboards", []) if isinstance(d, dict)} now = time.time() @@ -134,10 +134,10 @@ def record_history(old, new): except OSError: saved_at = now - HISTORY_MERGE_S - 1 entries.append({"at": saved_at, "data": before[dash_id]}) - if entries and now - entries[-1]["at"] < HISTORY_MERGE_S: - entries[-1] = {"at": now, "data": d} + if entries and now - entries[-1]["at"] < HISTORY_MERGE_S and entries[-1].get("by", "") == by: + entries[-1] = {"at": now, "data": d, "by": by} else: - entries.append({"at": now, "data": d}) + entries.append({"at": now, "data": d, "by": by}) HISTORY_DIR.mkdir(parents=True, exist_ok=True) tmp = history_file(dash_id).with_suffix(".tmp") tmp.write_text(json.dumps(entries[-HISTORY_MAX:])) @@ -155,37 +155,152 @@ async def index(request): USERS_FILE = DATA_DIR / "users.json" +DEVICES_FILE = DATA_DIR / "devices.json" def who(request): """The Home Assistant user, from the headers the Supervisor's ingress proxy adds.""" - if MOCK: - return {"id": os.environ.get("MOCK_USER_ID", "mock-user-alex"), "name": "alex", "display": "Alex"} + if MOCK: # locally, a cookie picks one of the mock users, to try the app as someone else + uid = request.cookies.get("mock_user") or os.environ.get("MOCK_USER_ID", "mock-user-alex") + u = MockHA.USERS.get(uid) or MockHA.USERS["mock-user-alex"] + return {"id": uid if uid in MockHA.USERS else "mock-user-alex", "name": u["username"], "display": u["name"]} h = request.headers uid = h.get("X-Remote-User-Id") return {"id": uid, "name": h.get("X-Remote-User-Name", ""), "display": h.get("X-Remote-User-Display-Name", "")} if uid else None -def load_users(): +async def ha_call(app, msg): + """One request to Home Assistant's websocket API with the Supervisor token.""" + async with app["http"].ws_connect(HA_WS_URL, max_msg_size=0) as ws: + await ws.receive_json() # auth_required + await ws.send_json({"type": "auth", "access_token": SUPERVISOR_TOKEN}) + if (await ws.receive_json()).get("type") != "auth_ok": + raise RuntimeError("Home Assistant rejected the Supervisor token") + await ws.send_json({"id": 1, **msg}) + while True: + r = await ws.receive_json() + if r.get("id") == 1: + break + if not r.get("success"): + raise RuntimeError((r.get("error") or {}).get("message", "request failed")) + return r["result"] + + +USERS_TTL = 60 + + +async def ha_users(app): + """Home Assistant's people (not its system users), with whether each is an administrator. Cached for a minute.""" + cached = app.get("users_cache") + if cached and time.time() - cached[0] < USERS_TTL: + return cached[1] + rows = MockHA.USERS_LIST() if MOCK else await ha_call(app, {"type": "config/auth/list"}) + users = {u["id"]: {"id": u["id"], "name": u.get("name") or u.get("username") or "", "username": u.get("username") or "", + "admin": bool(u.get("is_owner")) or "system-admin" in (u.get("group_ids") or []), + "active": u.get("is_active", True)} + for u in rows if not u.get("system_generated")} + app["users_cache"] = (time.time(), users) + return users + + +async def role_of(request): + """"admin" for Home Assistant administrators, "basic" for everyone else.""" + if "role" in request: + return request["role"] + me = who(request) + role = "basic" + if me: + try: + role = "admin" if (await ha_users(request.app)).get(me["id"], {}).get("admin") else "basic" + except Exception: # noqa: BLE001 - never let a failed lookup make someone an admin + LOG.exception("Could not look up Home Assistant's users") + request["role"] = role + return role + + +def admin_only(handler): + async def wrapped(request): + if await role_of(request) != "admin": + return web.json_response({"error": "Only Home Assistant administrators can do this"}, status=403) + return await handler(request) + return wrapped + + +def load_json(path, default): try: - return json.loads(USERS_FILE.read_text()) + return json.loads(path.read_text()) except (OSError, json.JSONDecodeError): - return {} + return default + + +def save_json(path, data): + DATA_DIR.mkdir(parents=True, exist_ok=True) + tmp = path.with_suffix(".tmp") + tmp.write_text(json.dumps(data, indent=2)) + tmp.replace(path) + + +def load_users(): + return load_json(USERS_FILE, {}) async def whoami(request): me = who(request) - if me: # remember who has used the app, so dashboards can be assigned to them + if me: # remember who has used the app and when users = load_users() - if users.get(me["id"], {}).get("display") != me["display"] or me["id"] not in users: - users[me["id"]] = {"name": me["name"], "display": me["display"]} - DATA_DIR.mkdir(parents=True, exist_ok=True) - USERS_FILE.write_text(json.dumps(users, indent=2)) - return web.json_response(me or {}, headers={"Cache-Control": "no-store"}) + prev = users.get(me["id"], {}) + if prev.get("display") != me["display"] or time.time() - prev.get("seen", 0) > 300: + users[me["id"]] = {"name": me["name"], "display": me["display"], "seen": time.time()} + save_json(USERS_FILE, users) + return web.json_response({**(me or {}), "admin": await role_of(request) == "admin"}, headers={"Cache-Control": "no-store"}) -async def users(request): - return web.json_response([{"id": k, **v} for k, v in load_users().items()], headers={"Cache-Control": "no-store"}) +@admin_only +async def people(request): + """Everyone with a Home Assistant login, for choosing what they see.""" + seen = load_users() + try: + users = await ha_users(request.app) + except Exception as err: # noqa: BLE001 + return web.json_response({"error": f"Couldn't read Home Assistant's users: {err}"}, status=502) + out = [{**u, "seen": seen.get(u["id"], {}).get("seen")} for u in users.values() if u["active"]] + return web.json_response(sorted(out, key=lambda u: (not u["admin"], u["name"].lower())), headers={"Cache-Control": "no-store"}) + + +SAFE_DEVICE = re.compile(r"^[\w-]{4,64}$") + + +async def device_seen(request): + """Every device reports in when it opens, so an admin can give it a dashboard.""" + try: + body = await request.json() + except json.JSONDecodeError: + return web.Response(status=400) + dev = str(body.get("device", "")) + if not SAFE_DEVICE.match(dev): + return web.Response(status=400) + me = who(request) or {} + devices = load_json(DEVICES_FILE, {}) + devices[dev] = {"user": me.get("id"), "display": me.get("display", ""), "seen": time.time(), + "app": "haven" if body.get("app") == "haven" else "browser", "kind": str(body.get("kind", ""))[:20]} + if len(devices) > 200: # forget the longest-unseen ones + devices = dict(sorted(devices.items(), key=lambda kv: kv[1].get("seen", 0))[-200:]) + save_json(DEVICES_FILE, devices) + return web.json_response({"ok": True}) + + +@admin_only +async def get_devices(request): + return web.json_response(load_json(DEVICES_FILE, {}), headers={"Cache-Control": "no-store"}) + + +@admin_only +async def forget_device(request): + dev = request.match_info["device"] + devices = load_json(DEVICES_FILE, {}) + devices.pop(dev, None) + save_json(DEVICES_FILE, devices) + return web.json_response({"ok": True}) async def changelog(request): @@ -234,17 +349,46 @@ async def service_worker(request): return web.Response(text=js, content_type="application/javascript", headers={"Cache-Control": "no-store"}) -async def android_app(request): - """The Android app (built from android/ in the repository), to download on a phone.""" - return web.FileResponse(WEB_DIR / "dashboard-studio.apk", headers={ +async def haven_app(request): + """Haven, the Android app for dashboards (built from haven/ in the repository), to download on a phone.""" + return web.FileResponse(WEB_DIR / "haven.apk", headers={ "Content-Type": "application/vnd.android.package-archive", - "Content-Disposition": 'attachment; filename="Dashboard Studio.apk"', "Cache-Control": "no-store"}) + "Content-Disposition": 'attachment; filename="Haven.apk"', "Cache-Control": "no-store"}) + + +def access_of(store, uid): + """What a person may see: {"all": true} or {"dashboards": [...]}, plus the one to open first ("home").""" + acc = store.get("access") or {} + mine = (acc.get("users") or {}).get(uid) if uid else None + return mine if isinstance(mine, dict) else acc.get("everyone") or {"all": True} + + +def visible_ids(store, uid, device): + ids = [d.get("id") for d in store.get("dashboards", []) if isinstance(d, dict)] + entry = access_of(store, uid) + seen = ids if entry.get("all") else [i for i in ids if i in (entry.get("dashboards") or [])] + dev = ((store.get("assign") or {}).get("devices") or {}).get(device or "") or {} + if dev.get("dashboard") in ids and dev["dashboard"] not in seen: # an admin put it on this screen + seen.append(dev["dashboard"]) + return seen, dev async def get_dashboards(request): - return web.json_response(load_store()) + store = load_store() + if await role_of(request) == "admin": + return web.json_response({**store, "role": "admin"}, headers={"Cache-Control": "no-store"}) + me = who(request) or {} + ids, dev = visible_ids(store, me.get("id"), request.query.get("device")) + return web.json_response({ + "version": store.get("version", 1), + "dashboards": [d for d in store.get("dashboards", []) if d.get("id") in ids], + "assign": {"devices": {request.query["device"]: dev} if dev else {}, "users": {}}, + "access": {"me": access_of(store, me.get("id"))}, + "role": "basic", + }, headers={"Cache-Control": "no-store"}) +@admin_only async def put_dashboards(request): try: data = await request.json() @@ -252,8 +396,9 @@ async def put_dashboards(request): return web.json_response({"error": "invalid json"}, status=400) if not isinstance(data, dict) or not isinstance(data.get("dashboards"), list): return web.json_response({"error": "expected {dashboards: [...]}"}, status=400) + data.pop("role", None) try: - record_history(load_store(), data) + record_history(load_store(), data, (who(request) or {}).get("display", "")) except OSError: LOG.exception("Could not write the version history") save_store(data) @@ -264,17 +409,19 @@ def widget_count(d): return sum(len(t.get("widgets", [])) for t in d.get("tabs", []) if isinstance(t, dict)) +@admin_only async def get_history(request): dash_id = request.match_info["dash_id"] if not SAFE_ID.match(dash_id): return web.Response(status=400) entries = load_history(dash_id) return web.json_response([ - {"at": e["at"], "name": e["data"].get("name", ""), "tabs": len(e["data"].get("tabs", [])), "widgets": widget_count(e["data"])} + {"at": e["at"], "name": e["data"].get("name", ""), "tabs": len(e["data"].get("tabs", [])), "widgets": widget_count(e["data"]), "by": e.get("by", "")} for e in reversed(entries) ], headers={"Cache-Control": "no-store"}) +@admin_only async def get_history_version(request): dash_id = request.match_info["dash_id"] if not SAFE_ID.match(dash_id): @@ -289,6 +436,19 @@ async def get_history_version(request): return web.Response(status=404) +@admin_only +async def activity(request): + """Who changed which dashboard, newest first, from the version history.""" + names = {d.get("id"): d.get("name", "") for d in load_store().get("dashboards", []) if isinstance(d, dict)} + rows = [] + for f in HISTORY_DIR.glob("*.json") if HISTORY_DIR.is_dir() else []: + for e in load_json(f, [])[1:]: # the first entry is how it was before history started + rows.append({"at": e["at"], "dashboard": f.stem, "name": names.get(f.stem) or e["data"].get("name", ""), + "by": e.get("by", ""), "deleted": f.stem not in names}) + rows.sort(key=lambda r: r["at"], reverse=True) + return web.json_response(rows[:60], headers={"Cache-Control": "no-store"}) + + async def camera(request): entity_id = request.match_info["entity_id"] if not entity_id.startswith("camera.") or "/" in entity_id: @@ -309,12 +469,39 @@ async def camera(request): ) +# What people who aren't administrators may ask Home Assistant through this app: reading states and +# controlling devices, as they could in Home Assistant itself, but nothing that changes its setup. +BASIC_WS = {"get_states", "get_config", "get_services", "unsubscribe_events", "persistent_notification/subscribe", + "config/area_registry/list", "config/entity_registry/list", "config/device_registry/list", "todo/item/list", + "history/history_during_period", "recorder/statistics_during_period", "energy/solar_forecast", "ping"} +BASIC_EVENTS = {"state_changed", "dashboard_studio_announce"} +BLOCKED_DOMAINS = {"hassio", "recorder", "logger", "system_log", "backup", "lovelace", "frontend", "cloud", "auth", "zone", "person"} + + +def allowed_for_basic(req): + t = req.get("type") + if t == "subscribe_events": + return req.get("event_type") in BASIC_EVENTS + if t == "call_service": + domain, service = req.get("domain"), req.get("service") + if domain in BLOCKED_DOMAINS: + return False + return service in {"toggle", "turn_on", "turn_off", "update_entity"} if domain == "homeassistant" else True + return t in BASIC_WS + + +def denied(req): + return {"id": req.get("id"), "type": "result", "success": False, + "error": {"code": "unauthorized", "message": "Only Home Assistant administrators can do this"}} + + async def websocket(request): client = web.WebSocketResponse(heartbeat=30, max_msg_size=0) await client.prepare(request) + allow = None if await role_of(request) == "admin" else allowed_for_basic if MOCK: - await request.app["mock"].serve(client) + await request.app["mock"].serve(client, allow) return client if not SUPERVISOR_TOKEN: await client.send_json({"type": "error", "message": "Dashboard Studio has no access to Home Assistant (SUPERVISOR_TOKEN is missing). Restart the app; if this stays, reinstall it."}) @@ -340,14 +527,22 @@ async def websocket(request): return client await client.send_json({"type": "ready", "ha_version": msg.get("ha_version")}) - async def pump(src, dst): + async def pump(src, dst, check=None): async for m in src: if m.type == aiohttp.WSMsgType.TEXT: + if check: + try: + req = json.loads(m.data) + except json.JSONDecodeError: + continue + if not isinstance(req, dict) or not check(req): + await client.send_json(denied(req if isinstance(req, dict) else {})) + continue await dst.send_str(m.data) elif m.type in (aiohttp.WSMsgType.ERROR, aiohttp.WSMsgType.CLOSE): break - tasks = [asyncio.create_task(pump(client, upstream)), asyncio.create_task(pump(upstream, client))] + tasks = [asyncio.create_task(pump(client, upstream, allow)), asyncio.create_task(pump(upstream, client))] _, pending = await asyncio.wait(tasks, return_when=asyncio.FIRST_COMPLETED) for t in pending: t.cancel() @@ -379,10 +574,14 @@ def make_app(): app.router.add_get("/api/version", version) app.router.add_get("/manifest.webmanifest", manifest) app.router.add_get("/sw.js", service_worker) - app.router.add_get("/android.apk", android_app) + app.router.add_get("/haven.apk", haven_app) app.router.add_get("/api/changelog", changelog) app.router.add_get("/api/whoami", whoami) - app.router.add_get("/api/users", users) + app.router.add_get("/api/people", people) + app.router.add_post("/api/devices/seen", device_seen) + app.router.add_get("/api/devices", get_devices) + app.router.add_delete("/api/devices/{device}", forget_device) + app.router.add_get("/api/activity", activity) app.router.add_get("/api/dashboards", get_dashboards) app.router.add_put("/api/dashboards", put_dashboards) app.router.add_get("/api/history/{dash_id}", get_history) diff --git a/dashboard_studio/server/mock_ha.py b/dashboard_studio/server/mock_ha.py index d0f2846..e1b881b 100644 --- a/dashboard_studio/server/mock_ha.py +++ b/dashboard_studio/server/mock_ha.py @@ -469,7 +469,19 @@ class MockHA: # -- websocket ---------------------------------------------------------- - async def serve(self, ws): + # Home Assistant's logins, as config/auth/list returns them. Alex is the owner; the others aren't administrators. + USERS = { + "mock-user-alex": {"id": "mock-user-alex", "name": "Alex", "username": "alex", "is_owner": True, "is_active": True, "system_generated": False, "group_ids": ["system-admin"]}, + "mock-user-sam": {"id": "mock-user-sam", "name": "Sam", "username": "sam", "is_owner": False, "is_active": True, "system_generated": False, "group_ids": ["system-users"]}, + "mock-user-noor": {"id": "mock-user-noor", "name": "Noor", "username": "noor", "is_owner": False, "is_active": True, "system_generated": False, "group_ids": ["system-users"]}, + "mock-user-tablet": {"id": "mock-user-tablet", "name": "Kitchen tablet", "username": "tablet", "is_owner": False, "is_active": True, "system_generated": False, "group_ids": ["system-users"]}, + } + + @staticmethod + def USERS_LIST(): # noqa: N802 - mirrors USERS + return [*MockHA.USERS.values(), {"id": "mock-supervisor", "name": "Supervisor", "is_owner": False, "is_active": True, "system_generated": True, "group_ids": ["system-admin"]}] + + async def serve(self, ws, allow=None): subs = set() entry = (ws, frozenset()) await ws.send_json({"type": "ready", "ha_version": "mock"}) @@ -479,7 +491,9 @@ class MockHA: continue req = json.loads(msg.data) mid, typ = req.get("id"), req.get("type") - if typ == "get_states": + if allow and not allow(req): + await ws.send_json({"id": mid, "type": "result", "success": False, "error": {"code": "unauthorized", "message": "Only Home Assistant administrators can do this"}}) + elif typ == "get_states": await ws.send_json({"id": mid, "type": "result", "success": True, "result": list(self.states.values())}) elif typ == "subscribe_events": subs.add(mid) diff --git a/dashboard_studio/web/app.js b/dashboard_studio/web/app.js index a7d33ce..f3111f2 100644 --- a/dashboard_studio/web/app.js +++ b/dashboard_studio/web/app.js @@ -246,9 +246,14 @@ let installPrompt = null; window.addEventListener("beforeinstallprompt", (e) => { e.preventDefault(); installPrompt = e; }); const standalone = () => matchMedia("(display-mode: standalone)").matches || navigator.standalone === true; - // The Android app (android/ in the repository) shows this page in its own window and adds window.DSApp. - const IN_APP = !!window.DSApp; - const APK_ID = "nl.melvanveen.dashboardstudio"; + // Haven, the Android app (haven/ in the repository), shows this page in its own window and adds window.HavenApp. + // It only ever shows dashboards: no builder and no admin screen, for admins too. + const IN_APP = !!window.HavenApp; + const HAVEN_ID = "nl.melvanveen.haven"; + // The public download in the repository, so a phone can get Haven before it is signed in to Home Assistant. + const HAVEN_DOWNLOAD = `${REPO_URL}/raw/branch/main/dashboard_studio/web/haven.apk`; + const havenLink = () => new URL("./", BASE).href; + const havenIntent = () => `intent://open?url=${encodeURIComponent(havenLink())}#Intent;scheme=haven;package=${HAVEN_ID};end`; async function installDialog() { let inFrame = false; try { inFrame = window.top !== window; } catch { inFrame = true; } @@ -260,17 +265,17 @@ const p = (t, cls = "") => `${esc(t)}

`; let body, actions = ``; if (IN_APP) { - body = p(tr("This is the Dashboard Studio app, connected to {0}.", location.host)); + body = p(tr("This is Haven, connected to {0}.", location.host)); actions += ``; } else if (android) { - // A home screen app from the browser needs https, and Home Assistant's own app can't make one at all: the Android app always works. - body = p(tr("Get the Dashboard Studio app for Android. It opens full screen with its own icon and keeps you signed in.")) - + `
  1. ${esc(tr("Download the app and open the file to install it. Android asks once to allow apps from this source."))}
  2. -
  3. ${esc(tr("Come back here and tap Open in the app. Or open the app and enter the address of Home Assistant."))}
` - + (browserInstall ? p(tr("Or install it from the browser, without the app."), "muted small") : ""); + // A home screen app from the browser needs https, and Home Assistant's own app can't make one at all: Haven always works. + body = p(tr("Get Haven, the Android app for your dashboards. It opens full screen with its own icon and keeps you signed in.")) + + `
  1. ${esc(tr("Download Haven and open the file to install it. Android asks once to allow apps from this source."))}
  2. +
  3. ${esc(tr("Come back here and tap Open in Haven. Or open Haven and enter the address of Home Assistant."))}
` + + (browserInstall ? p(tr("Or install it from the browser, without Haven."), "muted small") : ""); actions += (browserInstall ? `` : "") - + `${tr("Download the app")}` - + `${tr("Open in the app")}`; + + `${tr("Download Haven")}` + + `${tr("Open in Haven")}`; } else if (ios) { // Home screen web apps on iPhone get their own storage, without Home Assistant's sign-in: they can't open an app inside Home Assistant. body = p(tr("On iPhone and iPad, apps added to the home screen can’t use Home Assistant’s sign-in, so Dashboard Studio can’t run on its own there. Open it from the sidebar in the Home Assistant app instead.")); @@ -283,18 +288,34 @@ body = p(browserInstall ? tr("Your browser can install Dashboard Studio as an app with its own icon. It opens full screen, without the browser’s bars.") : tr("In your browser’s menu, choose Install app or Add to Home screen.")); if (browserInstall) actions += ``; } + if (!IN_APP && !android && isAdmin()) body += p(tr("For Android phones there is Haven: see Admin, Haven app."), "muted small"); const choice = await openModal(`

${tr("Install as an app")}

${body} ${IN_APP || ios ? "" : p(tr("It opens on the dashboard chosen for that device. Mark buttons as a shortcut to use them from the app icon."), "muted small")} `, (e, close) => { const x = e.target.closest("[data-x], a.btn"); if (x) close(x.dataset.x || "link"); }); if (choice === "tab") window.open(link, "_blank", "noopener"); if (choice === "install" && installPrompt) { installPrompt.prompt(); installPrompt = null; } - if (choice === "reset") window.DSApp.reset(); + if (choice === "reset") window.HavenApp.reset(); } /** Opened on its own (as an app, or in a tab), nobody renews Home Assistant's ingress session, so * after a while requests would fail. Renew it the way Home Assistant's own page does, with the * login that page saved in this browser. Inside Home Assistant this isn't needed. */ + function wsSession(token) { + return new Promise((resolve) => { + const ws = new WebSocket(`${location.protocol === "https:" ? "wss:" : "ws:"}//${location.host}/api/websocket`); + const done = (v) => { clearTimeout(t); try { ws.close(); } catch { /* closed */ } resolve(v); }; + const t = setTimeout(() => done(null), 10000); + ws.onmessage = (ev) => { + const m = JSON.parse(ev.data); + if (m.type === "auth_required") ws.send(JSON.stringify({ type: "auth", access_token: token })); + else if (m.type === "auth_ok") ws.send(JSON.stringify({ id: 1, type: "supervisor/api", endpoint: "/ingress/session", method: "post" })); + else if (m.id === 1) done(m.success ? m.result?.session : null); + else if (m.type === "auth_invalid") done(null); + }; + ws.onerror = () => done(null); + }); + } async function keepIngressSession() { let top = true; try { top = window.top === window; } catch { top = false; } @@ -311,8 +332,8 @@ localStorage.setItem("hassTokens", JSON.stringify(tokens)); } const r = await fetch("/api/hassio/ingress/session", { method: "POST", headers: { Authorization: `Bearer ${tokens.access_token}` } }); - if (!r.ok) return; - const session = (await r.json())?.data?.session; + // Only administrators may use that address; Home Assistant's websocket gives everyone a session. + const session = r.ok ? (await r.json())?.data?.session : await wsSession(tokens.access_token); if (session) document.cookie = `ingress_session=${session};path=/api/hassio_ingress/;SameSite=Strict${location.protocol === "https:" ? ";Secure" : ""}`; }; try { await renew(); } catch { /* offline: the cached page carries on */ } @@ -647,6 +668,16 @@ // Each browser gets its own id, so a wall tablet can be told which dashboard to open. const DEVICE_ID = lsGet("ds.device") || (() => { const id = uid() + uid(); lsSet("ds.device", id); return id; })(); let me = null; // the signed-in Home Assistant user, from the server + // Admins (Home Assistant's administrators) get three screens: Dashboard, Builder and Admin. Everyone else + // only sees the dashboards an admin chose for them, always in kiosk mode. The server enforces the same. + let role = lsGet("ds.role") === "basic" ? "basic" : "admin"; + const isAdmin = () => role === "admin"; + let mode = "dashboard"; // dashboard, builder or admin + let previewAs = null; // Admin → People → Preview: { id, name, ids } + let lockedKiosk = false; // people who aren't admins can't leave kiosk mode + /** What a person may see: { all: true } or { dashboards: [...] }, plus the one that opens first (home). */ + const accessFor = (uid) => store.access?.users?.[uid] || store.access?.everyone || { all: true }; + const visibleFor = (uid) => { const a = accessFor(uid); return store.dashboards.filter((d) => a.all || (a.dashboards || []).includes(d.id)).map((d) => d.id); }; let current = null; let editMode = lsGet("ds.edit") === "1"; let selectedId = null; @@ -681,6 +712,7 @@ // ------------------------------------------------------------ persistence let saveTimer = null, savePending = false; function scheduleSave() { + if (!isAdmin()) return; // the server refuses it anyway savePending = true; $("#save-status").textContent = tr("Saving…"); clearTimeout(saveTimer); @@ -801,7 +833,7 @@ s.setProperty("--d-radius", `${t.radius ?? 20}px`); const bar = /^#[0-9a-f]{3,8}$/i.test(t.bg || "") && t.preset !== "System" ? t.bg : prefersDark() ? "#000000" : "#f2f2f7"; document.querySelector('meta[name="theme-color"]')?.setAttribute("content", bar); - window.DSApp?.setBarColor(bar); + window.HavenApp?.setBarColor(bar); s.setProperty("--d-gap", `${Number(current.grid.gap) || 14}px`); stageEl.classList.toggle("theme-outline", !!t.outline && t.preset !== "System"); s.setProperty("--d-blur", `${t.blur || 0}px`); @@ -1051,7 +1083,7 @@ } function renderDashSelect() { - $("#dash-select").innerHTML = store.dashboards.map((d) => ``).join(""); + $("#dash-select").innerHTML = store.dashboards.filter((d) => !previewAs || previewAs.ids.includes(d.id)).map((d) => ``).join(""); } // ------------------------------------------------------------ suggestions @@ -1129,7 +1161,7 @@ function renderAll() { document.body.classList.toggle("editing", editMode); - $("#btn-edit").textContent = editMode ? tr("Done") : tr("Edit"); + renderModeSeg(); renderDashSelect(); renderGrid(); if (editMode) renderInspector(); @@ -2372,50 +2404,6 @@ }); } - /** Who sees which dashboard: this device, other known devices, and people. */ - async function assignDialog() { - const users = await api("api/users").catch(() => []); - const people = new Map(); - for (const s of Object.values(ha.states)) if (s.entity_id.startsWith("person.") && s.attributes.user_id) people.set(s.attributes.user_id, friendly(s)); - for (const u of users) if (!people.has(u.id)) people.set(u.id, u.display || u.name || u.id); - const a = store.assign; - const opts = (val) => `` + store.dashboards.map((d) => ``).join(""); - const devRow = (id, d, mine) => `
- - - - ${mine ? "" : ``}
`; - const others = Object.entries(a.devices).filter(([id]) => id !== DEVICE_ID); - const html = `

${tr("Who sees which dashboard")}

-

${tr("Choose the dashboard that opens first. A device’s choice comes before a person’s; otherwise the last dashboard used on that device opens.")}

-
${tr("This device")}
${devRow(DEVICE_ID, a.devices[DEVICE_ID], true)} - ${others.length ? `
${tr("Other devices")}
${others.map(([id, d]) => devRow(id, d, false)).join("")}` : ""} -
${tr("People")}
- ${people.size ? [...people].map(([id, name]) => `
${esc(name)}${me?.id === id ? ` (${tr("you")})` : ""} -
`).join("") : `

${tr("People appear here once they have opened Dashboard Studio, or when they have a person entity.")}

`} - `; - const card = $("#modal .modal-card"); - const done = openModal(html, (e, close) => { - const x = e.target.closest("[data-x]")?.dataset.x; - if (x === "forget") { delete a.devices[e.target.closest("[data-dev]").dataset.dev]; e.target.closest(".assign-row").remove(); scheduleSave(); } - if (x === "done") close(); - }); - card.classList.add("wide"); - const update = (e) => { - const f = e.target, key = f.dataset.a, row = f.closest(".assign-row"); - if (!key || !row) return; - const v = f.type === "checkbox" ? f.checked : f.value; - if (row.dataset.user) { if (v) a.users[row.dataset.user] = v; else delete a.users[row.dataset.user]; } - else { const d = (a.devices[row.dataset.dev] ||= {}); d[key] = v; } - scheduleSave(); - }; - card.addEventListener("change", update); - card.addEventListener("input", (e) => { if (e.target.dataset.a === "name") update(e); }); - await done; - card.classList.remove("wide"); - card.removeEventListener("change", update); - } - /** The changelog in a dialog. A small Markdown subset: ## headings, - bullets, **bold** and *italic*. */ async function whatsNew() { let md = ""; @@ -2481,7 +2469,7 @@ async function requestWakeLock() { try { wakeLock = await navigator.wakeLock?.request("screen"); } catch { wakeLock = null; } - window.DSApp?.keepAwake(true); // the Android app has no wake lock: it keeps the screen on itself + window.HavenApp?.keepAwake(true); // the Android app has no wake lock: it keeps the screen on itself } const cornerName = () => (current.kiosk.exitCorner || "top-right").replace("-", " "); @@ -2496,17 +2484,18 @@ history.replaceState(null, "", `#kiosk&view=${current.id}`); renderGrid(); poke(); - toast(tr("Kiosk mode is on. To leave, tap the {0} corner {1} times.", tr(cornerName()), CORNER_TAPS)); + if (!lockedKiosk) toast(tr("Kiosk mode is on. To leave, tap the {0} corner {1} times.", tr(cornerName()), CORNER_TAPS)); } function exitKiosk() { + if (lockedKiosk) return; kiosk = false; document.body.classList.remove("kiosk", "idle"); hideSaver(); closeDoorbell(); clearTimeout(idleTimer); clearTimeout(saverTimer); wakeLock?.release?.(); wakeLock = null; - window.DSApp?.keepAwake(false); + window.HavenApp?.keepAwake(false); if (document.fullscreenElement) document.exitFullscreen?.(); history.replaceState(null, "", location.pathname); renderGrid(); @@ -2523,13 +2512,20 @@ async function kioskPrompt() { if (promptOpen || modalClose) return; promptOpen = true; - const timer = setTimeout(() => modalClose?.(null), PROMPT_MS); - const choice = await openModal(`

${tr("Leave kiosk mode?")}

${tr("This closes by itself in a few seconds.")}

+ const timer = setTimeout(() => modalClose?.(null), PROMPT_MS * (lockedKiosk ? 2 : 1)); + // People who aren't admins stay in kiosk mode: the corner switches between the dashboards they may see. + const others = lockedKiosk ? store.dashboards.filter((d) => d.id !== current.id) : []; + const choice = await openModal(lockedKiosk + ? `

${tr("Dashboards")}

${others.length ? `
${others.map((d) => ``).join("")}
` : `

${tr("This is the only dashboard you can see. An admin can add more for you.")}

`} + ` + : `

${tr("Leave kiosk mode?")}

${tr("This closes by itself in a few seconds.")}

`, (e, close) => { const x = e.target.closest("[data-x]")?.dataset.x; if (x) close(x); }); clearTimeout(timer); promptOpen = false; - if (choice === "exit") exitKiosk(); + if (choice?.startsWith("dash:")) { setCurrent(choice.slice(5)); lsSet("ds.current", current.id); } + else if (choice === "exit") exitKiosk(); + else if (choice === "haven") window.HavenApp.reset(); else if (choice === "full") toggleFullscreen(false); else if (choice === "guest") guestOn ? endGuest() : setGuestManual(true); } @@ -2938,10 +2934,60 @@ renderAll(); checkGuest(true); checkAway(); + if (mode === "admin") renderAdmin(); + } + + // ------------------------------------------------------------ screens + function renderModeSeg() { + const seg = $("#mode-seg"); + seg.hidden = !isAdmin() || IN_APP || !!previewAs; + seg.querySelectorAll("[data-mode]").forEach((b) => { const on = b.dataset.mode === mode; b.classList.toggle("on", on); b.setAttribute("aria-selected", String(on)); }); + } + function syncMode() { + document.body.classList.toggle("admin-mode", mode === "admin"); + $("#admin").hidden = mode !== "admin"; + if (!previewAs) lsSet("ds.mode", mode); + } + function setMode(m) { + if (!isAdmin() || IN_APP || previewAs) m = "dashboard"; + if (m === "admin") { + if (kiosk) exitKiosk(); + if (editMode) { editMode = false; openSheet(null); selectedId = null; multi.clear(); } + mode = "admin"; + syncMode(); + renderAll(); + renderAdmin(); + return; + } + mode = m; + setEdit(m === "builder"); + } + + /** Dashboards from before 2.0 had "opens first" per person in assign.users; that's now part of access. */ + function migrateAccess() { + store.access ||= { everyone: { all: true }, users: {} }; + store.access.users ||= {}; + const old = store.assign?.users || {}; + if (!Object.keys(old).length) return; + for (const [u, id] of Object.entries(old)) store.access.users[u] ||= { all: true, home: id }; + store.assign.users = {}; + scheduleSave(); + } + + /** People who aren't admins, with no dashboard chosen for them yet. */ + function showEmpty() { + const el = $("#empty-note"); + el.querySelector(".en-ico").innerHTML = Icons.svg("layout"); + el.querySelector(".en-text").textContent = tr("An admin hasn’t chosen a dashboard for you yet. Ask someone who manages Home Assistant to pick one for you on the Admin screen in Dashboard Studio."); + el.hidden = false; + document.body.classList.add("empty"); } function setEdit(on) { editMode = on; + if (on) mode = "builder"; + else if (mode === "builder") mode = "dashboard"; + syncMode(); if (!on) openSheet(null); else renderPalette(); // the suggestions count needs the states lsSet("ds.edit", on ? "1" : "0"); @@ -2985,10 +3031,10 @@ if (open) $("#menu button")?.focus(); } - $("#btn-edit").onclick = () => setEdit(!editMode); + $("#mode-seg").onclick = (e) => { const b = e.target.closest("[data-mode]"); if (b) setMode(b.dataset.mode); }; $("#btn-kiosk").onclick = () => enterKiosk(); $("#btn-app").onclick = () => installDialog(); - $("#btn-app").hidden = IN_APP || standalone(); + $("#btn-app").hidden = standalone() && !IN_APP; // in Haven it holds Change address $("#btn-undo").onclick = undo; $("#btn-redo").onclick = redo; $("#dash-select").onchange = (e) => setCurrent(e.target.value); @@ -3009,11 +3055,14 @@ const act = e.target.closest("[data-menu]")?.dataset.menu; if (!act) return; setMenu(false); + dashboardAction(act); + }); + + /** What can be done with the current dashboard, from the builder's ⋯ menu or a card on the Admin screen. */ + async function dashboardAction(act) { if (act === "rename") { const n = await askText(tr("Rename dashboard"), current.name, tr("Rename")); if (n) { mutate(() => { current.name = n; }, null, { rerender: false }); renderAll(); } - } else if (act === "assign") { - assignDialog(); } else if (act === "history") { historyDialog(); } else if (act === "undo-history") { @@ -3051,7 +3100,7 @@ store.dashboards = store.dashboards.filter((d) => d.id !== current.id); scheduleSave(); setCurrent(store.dashboards[0].id); } - }); + } $("#import-file").onchange = async (e) => { const file = e.target.files[0]; @@ -3227,6 +3276,273 @@ setInterval(() => { applyNight(); checkGuest(); }, 60000); setInterval(() => { if (!editMode && current) tab().widgets.filter((w) => w.type === "graph" || w.type === "calendar" || w.cfg.showChanged).forEach((w) => renderWidget(w)); }, 60000); + // ------------------------------------------------------------ admin screen + // Dashboards, the people who use them and what each may see, devices, Haven, and who changed what. + const ADMIN_SECTIONS = [ + ["dashboards", "layout", "Dashboards"], ["people", "people", "People"], ["devices", "tv", "Devices"], + ["haven", "phone", "Haven app"], ["activity", "history", "Activity"], ["about", "sparkles", "About"], + ]; + let adminSection = ADMIN_SECTIONS.some(([k]) => k === lsGet("ds.admin")) ? lsGet("ds.admin") : "dashboards"; + let peopleList = null, devicesSeen = null; + const ago = (at) => (at ? relTime(new Date(at * 1000).toISOString()) : tr("never")); + const initials = (n) => esc((n || "?").trim().slice(0, 1).toUpperCase()); + async function loadPeople(force) { + if (!peopleList || force) peopleList = await api("api/people").catch(() => []); + return peopleList; + } + + /** Who may see a dashboard, in a few words. */ + function seenByText(d) { + const basics = (peopleList || []).filter((p) => !p.admin); + const who = basics.filter((p) => visibleFor(p.id).includes(d.id)); + if (!basics.length) return tr("Admins"); + if (who.length === basics.length) return tr("Everyone"); + if (!who.length) return tr("Admins only"); + return who.map((p) => p.name).join(", "); + } + + const ADMIN = { + async dashboards() { + await loadPeople(); + const cards = store.dashboards.map((d) => { + const widgets = d.tabs.reduce((n, t) => n + t.widgets.length, 0); + const bg = /^#|gradient/.test(d.theme?.bg || "") && d.theme.preset !== "System" ? d.theme.bg : "var(--fill)"; + return `
+
${Icons.svg(d.mobile ? "phone" : "layout")}
+

${esc(d.name)}

${d.tabs.length === 1 ? tr("1 tab") : tr("{0} tabs", d.tabs.length)} · ${widgets === 1 ? tr("1 widget") : tr("{0} widgets", widgets)}${d.mobile ? ` · ${tr("Phone")}` : ""}
+
${Icons.svg("people")}${esc(seenByText(d))}
+
+
+
`; + }).join(""); + return `

${tr("Dashboards")}

${tr("Build a dashboard, then choose under People who sees it.")}

+
+ + +
+
${cards}
`; + }, + + async people() { + const list = await loadPeople(true); + const acc = store.access; + const dashChecks = (key, entry) => store.dashboards.map((d) => ``).join(""); + const homeSel = (key, entry) => ``; + const accessBlock = (key, entry, own) => `
+
+ ${key !== "everyone" ? `` : ""} + +
+ ${(own || key === "everyone") && !entry.all ? `
${dashChecks(key, entry)}
` : ""} + ${own || key === "everyone" ? `` : ""} +
`; + const rows = list.map((p) => { + const own = acc.users[p.id]; + const entry = own || acc.everyone || { all: true }; + return `
+
${initials(p.name)} +
${esc(p.name)} ${p.admin ? `${tr("Admin")}` : ""}${me?.id === p.id ? ` (${tr("you")})` : ""}
+
${p.admin ? tr("Home Assistant administrator · sees and builds everything") : tr("Sees {0} · always in kiosk mode", visibleFor(p.id).length === store.dashboards.length ? tr("all dashboards") : tr("{0} of {1} dashboards", visibleFor(p.id).length, store.dashboards.length))} · ${esc(tr("last opened {0}", ago(p.seen)))}
+ ${p.admin ? "" : ``}
+ ${p.admin ? "" : accessBlock(p.id, entry, !!own)} +
`; + }).join(""); + return `

${tr("People")}

+

${tr("Home Assistant’s administrators are admins here: they see every dashboard and can build. Everyone else only sees the dashboards chosen here, full screen in kiosk mode, on any device.")}

+
${Icons.svg("people")} +
${tr("Everyone else")}
${tr("People without their own choice below, and anyone added to Home Assistant later.")}
+ ${accessBlock("everyone", acc.everyone || { all: true }, true)}
+ ${rows || `

${tr("Couldn’t read Home Assistant’s people.")}

`} +

${tr("To add someone, create a person with a login in Home Assistant (Settings, People). Turn off Administrator there to make them a basic user.")}

`; + }, + + async devices() { + [devicesSeen] = await Promise.all([api("api/devices").catch(() => ({})), loadPeople()]); + const a = store.assign.devices; + const ids = [...new Set([DEVICE_ID, ...Object.keys(devicesSeen), ...Object.keys(a)])] + .sort((x, y) => (x === DEVICE_ID ? -1 : y === DEVICE_ID ? 1 : (devicesSeen[y]?.seen || 0) - (devicesSeen[x]?.seen || 0))); + const opts = (val) => `` + store.dashboards.map((d) => ``).join(""); + const rows = ids.map((id) => { + const seen = devicesSeen[id] || {}, set = a[id] || {}; + const icon = { phone: "phone", tablet: "tv", computer: "laptop" }[seen.kind] || "laptop"; + const what = [seen.display || (id === DEVICE_ID ? me?.display : ""), seen.app === "haven" ? "Haven" : seen.app ? tr("Browser") : "", seen.seen ? ago(seen.seen) : ""].filter(Boolean).join(" · "); + return `
${Icons.svg(icon)} +
+
${id === DEVICE_ID ? `${tr("This device")} · ` : ""}${esc(what)}
+ + + ${id === DEVICE_ID ? `` : ``}
`; + }).join(""); + const named = ids.filter((id) => a[id]?.name); + return `

${tr("Devices")}

+

${tr("Every phone, tablet and computer that opened Dashboard Studio. Give a wall tablet its own dashboard: that comes before the person’s choice.")}

+
${rows}
+

${Icons.svg("megaphone")}${tr("Send a message to the screens")}

+

${tr("It shows full screen on dashboards in kiosk mode, like an announcement from an automation.")}

+
+ + +
`; + }, + + async haven() { + const addr = location.origin; + return `

${tr("Haven app")}

+

${tr("Haven is the Android app for the people in your home. It only shows dashboards: no builder and no settings. Everyone sees what you chose for them under People.")}

+
+
1

${tr("Install Haven on the phone")}

+

${tr("Scan this code with the phone’s camera, or download it on the phone itself. Android asks once to allow apps from this source.")}

+ + ${Icons.svg("arrow-down")}${tr("Download Haven")}
+
2

${tr("Connect to Home Assistant")}

+

${tr("Open Haven and enter this address. It is the address you use for Home Assistant; on other networks use its outside address, for example Home Assistant Cloud.")}

+ +

${tr("On the phone itself, Open in Haven fills it in.")}

+ ${tr("Open in Haven")}
+
3

${tr("Sign in")}

+

${tr("Everyone signs in with their own Home Assistant login, once. Haven then opens straight on their dashboard and stays signed in.")}

+
+

${tr("Haven needs Android 7 or newer. On iPhone, use the Home Assistant app instead.")}

`; + }, + + async activity() { + const rows = await api("api/activity").catch(() => []); + const when = (at) => new Date(at * 1000).toLocaleString(LOCALE, { weekday: "short", day: "numeric", month: "short", hour: "2-digit", minute: "2-digit" }); + return `

${tr("Activity")}

${tr("Who changed which dashboard. Restore an earlier version from the dashboard’s version history.")}

+
${rows.map((r) => `
+ ${r.by ? initials(r.by) : Icons.svg("edit")} +
${r.by ? tr("{0} changed {1}", `${esc(r.by)}`, `${esc(r.name)}`) : tr("{0} was changed", `${esc(r.name)}`)}${r.deleted ? ` (${tr("deleted")})` : ""}
+
${esc(when(r.at))} · ${esc(ago(r.at))}
+ ${r.deleted ? "" : ``}
`).join("") || `

${tr("No changes yet.")}

`}
`; + }, + + async about() { + return `

${tr("About")}

+

Dashboard Studio ${esc(APP_VERSION)}

+

${tr("You’re signed in as {0}, a Home Assistant administrator, so you can use the Dashboard, Builder and Admin screens.", esc(me?.display || me?.name || ""))}

+
`; + }, + }; + + async function renderAdmin(section = adminSection) { + adminSection = section; + lsSet("ds.admin", section); + $("#admin .adm-nav").innerHTML = ADMIN_SECTIONS.map(([k, icon, label]) => ``).join(""); + const body = $("#admin .adm-body"); + const html = await ADMIN[section](); + if (adminSection !== section || mode !== "admin") return; // moved on while it loaded + const y = body.scrollTop; + body.innerHTML = html; + body.scrollTop = y; + } + + /** Change what a person (or "everyone") may see. */ + function setAccess(who, fn) { + const acc = store.access; + if (who === "everyone") acc.everyone = fn({ all: true, ...(acc.everyone || {}) }); + else { const v = fn(acc.users[who] ? { ...acc.users[who] } : { ...(acc.everyone || { all: true }) }); if (v) acc.users[who] = v; else delete acc.users[who]; } + scheduleSave(); + renderAdmin("people"); + } + + /** Admin → People → Preview: the dashboards this person sees, as they see them. */ + function startPreview(p) { + const ids = visibleFor(p.id); + if (!ids.length) { toast(tr("{0} can’t see any dashboard yet.", p.name), true); return; } + const home = accessFor(p.id).home; + previewAs = { ...p, ids }; + mode = "dashboard"; + syncMode(); + setCurrent(ids.includes(home) ? home : ids[0]); + setEdit(false); + const bar = $("#preview-bar"); + bar.querySelector(".pv-text").textContent = tr("Previewing as {0}: {1} dashboards. On their devices it’s full screen, in kiosk mode.", p.name, ids.length); + bar.hidden = false; + document.body.classList.add("previewing"); + } + $("#pv-stop").onclick = () => { + previewAs = null; + $("#preview-bar").hidden = true; + document.body.classList.remove("previewing"); + setMode("admin"); + renderAdmin("people"); + }; + + $("#admin").addEventListener("click", async (e) => { + const sec = e.target.closest("[data-sec]"); + if (sec) { renderAdmin(sec.dataset.sec); $("#admin .adm-body").scrollTop = 0; return; } + const k = e.target.closest("button[data-k]"); + if (k?.dataset.k === "mode") { + const v = k.dataset.v; + setAccess(k.dataset.who, (cur) => (v === "same" ? null : v === "all" ? { all: true, home: cur.home } : { all: false, dashboards: cur.all ? store.dashboards.map((d) => d.id) : cur.dashboards || [], home: cur.home })); + return; + } + const b = e.target.closest("[data-a]"); + if (!b) return; + const act = b.dataset.a, card = b.closest("[data-dash]"), dash = card?.dataset.dash; + if (act === "open" || act === "edit") { setCurrent(dash); setMode(act === "edit" ? "builder" : "dashboard"); return; } + if (act === "more") { + const d = store.dashboards.find((x) => x.id === dash); + const pick = await openModal(`

${esc(d.name)}

+ ${[["rename", "edit", "Rename…"], ["duplicate", "copy", "Duplicate"], ["history", "history", "Version history…"], ["share", "share", "Share…"], ["export", "exit", "Export as JSON"], ["delete", "trash", "Delete dashboard…"]] + .map(([a, i, l]) => ``).join("")}
+ `, + (ev, close) => { const x = ev.target.closest("[data-x]")?.dataset.x; if (x) close(x === "close" ? null : x); }); + if (!pick) return; + setCurrent(dash); + await dashboardAction(pick); + if (mode === "admin") renderAdmin(); + return; + } + if (act === "new") { $("#btn-new").click(); return; } + if (["starter", "import", "lovelace"].includes(act)) { await dashboardAction(act); if (act === "starter") renderAdmin(); return; } + if (act === "preview") { const p = peopleList.find((x) => x.id === b.closest("[data-user]").dataset.user); if (p) startPreview(p); return; } + if (act === "forget") { + const id = b.closest("[data-dev]").dataset.dev; + delete store.assign.devices[id]; + scheduleSave(); + await fetch(new URL(`api/devices/${encodeURIComponent(id)}`, BASE), { method: "DELETE" }).catch(() => {}); + renderAdmin("devices"); + return; + } + if (act === "announce") { + const message = $("#an-msg").value.trim(); + if (!message) { $("#an-msg").focus(); return; } + const to = $("#an-to").value; + await ha.send({ type: "fire_event", event_type: "dashboard_studio_announce", event_data: { title: $("#an-title").value.trim() || undefined, message, ...(to ? { device: to } : {}) } }) + .then(() => { toast(tr("Sent.")); $("#an-msg").value = ""; }) + .catch((err) => toast(tr("Couldn’t send it: {0}", err.message), true)); + return; + } + if (act === "copy-addr") { navigator.clipboard?.writeText($("#haven-addr").value).then(() => toast(tr("Copied."))).catch(() => $("#haven-addr").select()); return; } + if (act === "history") { setCurrent(b.closest("[data-dash]").dataset.dash); await historyDialog(); return; } + if (act === "whatsnew") whatsNew(); + }); + + $("#admin").addEventListener("change", (e) => { + const f = e.target, k = f.dataset.k; + if (f.closest("[data-dev]")) { + const id = f.closest("[data-dev]").dataset.dev, d = (store.assign.devices[id] ||= {}); + d[k] = f.type === "checkbox" ? f.checked : f.value; + if (!d.name && !d.dashboard && !d.kiosk) delete store.assign.devices[id]; + scheduleSave(); + return; + } + if (k === "dash") { + const boxes = [...f.closest(".adm-chips").querySelectorAll("input:checked")].map((x) => x.value); + setAccess(f.dataset.who, (cur) => ({ ...cur, all: false, dashboards: boxes, home: boxes.includes(cur.home) ? cur.home : undefined })); + } else if (k === "home") setAccess(f.dataset.who, (cur) => ({ ...cur, home: f.value || undefined })); + }); + // device names save while typing + $("#admin").addEventListener("input", (e) => { + const f = e.target; + if (f.dataset.k !== "name" || !f.closest("[data-dev]")) return; + const id = f.closest("[data-dev]").dataset.dev; + (store.assign.devices[id] ||= {}).name = f.value; + scheduleSave(); + }); + // ------------------------------------------------------------ boot function paintChromeIcons() { $("#btn-new").innerHTML = Icons.svg("plus"); @@ -3237,7 +3553,7 @@ $("#btn-kiosk").insertAdjacentHTML("afterbegin", Icons.svg("kiosk")); $("#btn-app").innerHTML = Icons.svg("phone"); $("#phone-menu").innerHTML = Icons.svg("more"); - document.querySelectorAll("#menu [data-icon]").forEach((b) => b.insertAdjacentHTML("afterbegin", Icons.svg(b.dataset.icon))); + document.querySelectorAll("#menu [data-icon], #mode-seg [data-icon]").forEach((b) => b.insertAdjacentHTML("afterbegin", Icons.svg(b.dataset.icon))); } ha.onStatus = (ok) => { @@ -3266,6 +3582,26 @@ setTimeout(() => location.reload(), 2500); } setInterval(checkVersion, 5 * 60 * 1000); + + // Screens pick up what an admin changes (a dashboard, or who sees what) within a minute, without a reload. + let storeKey = ""; + const keyOf = (s) => JSON.stringify([s.dashboards, s.access, s.assign?.devices]); + async function refreshStore() { + if (editMode || mode === "admin" || savePending || previewAs || modalClose) return; + let next; + try { next = await api(`api/dashboards?device=${DEVICE_ID}`); } catch { return; } + const key = keyOf(next); + if (key === storeKey) return; + storeKey = key; + if (!$("#empty-note").hidden || (!isAdmin() && !next.dashboards?.length)) { location.reload(); return; } + next.dashboards = next.dashboards.map(migrate); + next.assign = { devices: {}, users: {}, ...(next.assign || {}) }; + store = next; + const home = isAdmin() ? store.access?.users?.[me?.id]?.home : store.access?.me?.home; + const keep = [current?.id, store.assign.devices[DEVICE_ID]?.dashboard, home].find((id) => id && store.dashboards.some((d) => d.id === id)); + setCurrent(keep); + } + setInterval(refreshStore, 60 * 1000); ha.onChange = onStateChange; ha.onRegistry = () => { renderGrid(); if (editMode) { renderInspector(); renderPalette(); } }; @@ -3276,18 +3612,27 @@ } async function boot() { + document.body.classList.toggle("in-haven", IN_APP); translateStatic(); paintChromeIcons(); renderPalette(); await keepIngressSession(); + // In Haven, a session that couldn't be renewed means signing in again on Home Assistant's page. + if (IN_APP && (await fetch(new URL("api/version", BASE)).then((r) => r.status === 401).catch(() => false))) { window.HavenApp.reconnect?.(); return; } loadCachedStates(); if ("serviceWorker" in navigator && APP_VERSION !== "dev") navigator.serviceWorker.register(new URL("sw.js", BASE), { scope: BASE.pathname }).catch(() => {}); + me = await api("api/whoami").catch(() => null); + if (me) { role = me.admin ? "admin" : "basic"; lsSet("ds.role", role); } try { - const r = await fetch(new URL("api/dashboards", BASE)); + const r = await fetch(new URL(`api/dashboards?device=${DEVICE_ID}`, BASE)); store = await r.json(); + if (store.role) role = store.role; store.dashboards = (store.dashboards || []).map(migrate); store.assign = { devices: {}, users: {}, ...(store.assign || {}) }; } catch { toast(tr("Couldn’t load your dashboards. Check that the app is running."), true); } + // Let admins see this device on the Admin screen, to give it a dashboard. + fetch(new URL("api/devices/seen", BASE), { method: "POST", headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ device: DEVICE_ID, app: IN_APP ? "haven" : "browser", kind: phoneScreen.matches ? "phone" : matchMedia("(pointer: coarse)").matches ? "tablet" : "computer" }) }).catch(() => {}); const firstReady = new Promise((res) => { const prev = ha.onStatus; @@ -3296,19 +3641,27 @@ }); ha.connect(); + if (isAdmin()) migrateAccess(); + storeKey = keyOf(store); if (!store.dashboards?.length) { + if (!isAdmin()) { showEmpty(); return; } await firstReady; - store = { version: 1, dashboards: [starterDashboard()], assign: { devices: {}, users: {} } }; + store = { ...store, version: 1, dashboards: [starterDashboard()] }; save(); } - me = await api("api/whoami").catch(() => null); const shared = sharedParams(); const hashId = (location.hash.match(/view=([\w-]+)/) || [])[1] || shared.get("ds"); // Which dashboard to open: a link wins, then this device's choice, then this person's, then the last one used here. - const dev = store.assign.devices[DEVICE_ID], forUser = me?.id && store.assign.users[me.id]; + const dev = store.assign.devices[DEVICE_ID], home = isAdmin() ? store.access?.users?.[me?.id]?.home : store.access?.me?.home; const exists = (id) => id && store.dashboards.some((d) => d.id === id); - setCurrent([hashId, dev?.dashboard, forUser, lsGet("ds.current")].find(exists)); - if (location.hash.includes("kiosk") || shared.get("ds_kiosk") === "1" || (dev?.kiosk && !hashId)) enterKiosk({ fullscreen: false }); + // The screen it was on last time; people who aren't admins, and Haven, only get the dashboard. + const lastMode = lsGet("ds.mode") || (lsGet("ds.edit") === "1" ? "builder" : "dashboard"); + mode = isAdmin() && !IN_APP ? lastMode : "dashboard"; + editMode = mode === "builder"; + setCurrent([hashId, dev?.dashboard, home, lsGet("ds.current")].find(exists)); + if (!isAdmin()) { lockedKiosk = true; enterKiosk({ fullscreen: false }); } + else if (location.hash.includes("kiosk") || shared.get("ds_kiosk") === "1" || (dev?.kiosk && !hashId)) enterKiosk({ fullscreen: false }); + else setMode(mode); const action = shared.get("ds_action"); if (action) { history.replaceState(null, "", location.pathname + location.hash); runShortcut(action); } // After an update, point at what changed (once per device). diff --git a/dashboard_studio/web/dashboard-studio.apk b/dashboard_studio/web/dashboard-studio.apk deleted file mode 100644 index f744a4bbcd42eee35e427a5e64003be40d2ba2e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 124057 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 + + + + + + + + + + + + + + diff --git a/dashboard_studio/web/haven.apk b/dashboard_studio/web/haven.apk new file mode 100644 index 0000000000000000000000000000000000000000..32fe1184eea9af7f054e99f4c507cb1c7483aec6 GIT binary patch literal 70879 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 literal 0 HcmV?d00001 diff --git a/dashboard_studio/web/i18n.js b/dashboard_studio/web/i18n.js index 90b529d..ee96a64 100644 --- a/dashboard_studio/web/i18n.js +++ b/dashboard_studio/web/i18n.js @@ -625,6 +625,85 @@ "Open in the app": "Openen in de app", "On iPhone and iPad, apps added to the home screen can’t use Home Assistant’s sign-in, so Dashboard Studio can’t run on its own there. Open it from the sidebar in the Home Assistant app instead.": "Op iPhone en iPad kunnen apps op het beginscherm de inlog van Home Assistant niet gebruiken, dus daar kan Dashboard Studio niet los draaien. Open het in plaats daarvan via de zijbalk in de Home Assistant-app.", "Browsers only install apps from a secure address (https), and Home Assistant is open over http here. Open Home Assistant through its https address, for example Home Assistant Cloud, and try again.": "Browsers installeren alleen apps vanaf een beveiligd adres (https), en Home Assistant is hier via http geopend. Open Home Assistant via het https-adres, bijvoorbeeld Home Assistant Cloud, en probeer het opnieuw.", + "This is Haven, connected to {0}.": "Dit is Haven, verbonden met {0}.", + "Get Haven, the Android app for your dashboards. It opens full screen with its own icon and keeps you signed in.": "Gebruik Haven, de Android-app voor je dashboards. Hij opent schermvullend met een eigen pictogram en houdt je ingelogd.", + "Download Haven and open the file to install it. Android asks once to allow apps from this source.": "Download Haven en open het bestand om het te installeren. Android vraagt één keer of apps uit deze bron zijn toegestaan.", + "Come back here and tap Open in Haven. Or open Haven and enter the address of Home Assistant.": "Kom hier terug en tik op Openen in Haven. Of open Haven en vul het adres van Home Assistant in.", + "Or install it from the browser, without Haven.": "Of installeer het vanuit de browser, zonder Haven.", + "Download Haven": "Haven downloaden", + "Open in Haven": "Openen in Haven", + "For Android phones there is Haven: see Admin, Haven app.": "Voor Android-telefoons is er Haven: zie Beheer, Haven-app.", + "Dashboards": "Dashboards", + "This is the only dashboard you can see. An admin can add more for you.": "Dit is het enige dashboard dat je kunt zien. Een beheerder kan er meer voor je toevoegen.", + "An admin hasn’t chosen a dashboard for you yet. Ask someone who manages Home Assistant to pick one for you on the Admin screen in Dashboard Studio.": "Een beheerder heeft nog geen dashboard voor je gekozen. Vraag iemand die Home Assistant beheert om er een voor je te kiezen op het beheerscherm van Dashboard Studio.", + "never": "nooit", + "Admins": "Beheerders", + "Everyone": "Iedereen", + "Admins only": "Alleen beheerders", + "1 tab": "1 tabblad", + "1 widget": "1 widget", + "Build": "Bouwen", + "More for {0}": "Meer voor {0}", + "Build a dashboard, then choose under People who sees it.": "Bouw een dashboard en kies daarna onder Personen wie het ziet.", + "Import file": "Bestand importeren", + "Opens first": "Opent eerst", + "The first one": "Het eerste", + "Sees": "Ziet", + "Like everyone else": "Zoals iedereen", + "All dashboards": "Alle dashboards", + "Only these": "Alleen deze", + "Admin": "Beheer", + "Home Assistant administrator · sees and builds everything": "Beheerder in Home Assistant · ziet en bouwt alles", + "Sees {0} · always in kiosk mode": "Ziet {0} · altijd in kioskmodus", + "all dashboards": "alle dashboards", + "{0} of {1} dashboards": "{0} van {1} dashboards", + "last opened {0}": "laatst geopend {0}", + "Preview": "Voorbeeld", + "Home Assistant’s administrators are admins here: they see every dashboard and can build. Everyone else only sees the dashboards chosen here, full screen in kiosk mode, on any device.": "De beheerders van Home Assistant zijn hier beheerder: ze zien elk dashboard en kunnen bouwen. Alle anderen zien alleen de dashboards die je hier kiest, schermvullend in kioskmodus, op elk apparaat.", + "Everyone else": "Alle anderen", + "People without their own choice below, and anyone added to Home Assistant later.": "Mensen zonder eigen keuze hieronder, en iedereen die later aan Home Assistant wordt toegevoegd.", + "Couldn’t read Home Assistant’s people.": "De mensen in Home Assistant konden niet worden gelezen.", + "To add someone, create a person with a login in Home Assistant (Settings, People). Turn off Administrator there to make them a basic user.": "Om iemand toe te voegen maak je in Home Assistant een persoon met een account (Instellingen, Personen). Zet Beheerder daar uit om er een gewone gebruiker van te maken.", + "The person’s choice": "Keuze van de persoon", + "Browser": "Browser", + "Admins on this device start in kiosk mode too": "Beheerders starten op dit apparaat ook in kioskmodus", + "Every phone, tablet and computer that opened Dashboard Studio. Give a wall tablet its own dashboard: that comes before the person’s choice.": "Elke telefoon, tablet en computer die Dashboard Studio heeft geopend. Geef een wandtablet een eigen dashboard: dat gaat voor de keuze van de persoon.", + "Send a message to the screens": "Een bericht naar de schermen sturen", + "It shows full screen on dashboards in kiosk mode, like an announcement from an automation.": "Het verschijnt schermvullend op dashboards in kioskmodus, net als een aankondiging uit een automatisering.", + "Title, e.g. Dinner": "Titel, bijv. Eten", + "Message, e.g. Dinner is ready!": "Bericht, bijv. Het eten is klaar!", + "Message": "Bericht", + "To": "Aan", + "Send": "Versturen", + "Haven app": "Haven-app", + "Haven is the Android app for the people in your home. It only shows dashboards: no builder and no settings. Everyone sees what you chose for them under People.": "Haven is de Android-app voor de mensen in je huis. Het toont alleen dashboards: geen bouwer en geen instellingen. Iedereen ziet wat je onder Personen voor ze hebt gekozen.", + "Install Haven on the phone": "Haven op de telefoon installeren", + "Scan this code with the phone’s camera, or download it on the phone itself. Android asks once to allow apps from this source.": "Scan deze code met de camera van de telefoon, of download het op de telefoon zelf. Android vraagt één keer of apps uit deze bron zijn toegestaan.", + "QR code to download Haven": "QR-code om Haven te downloaden", + "Connect to Home Assistant": "Verbinden met Home Assistant", + "Open Haven and enter this address. It is the address you use for Home Assistant; on other networks use its outside address, for example Home Assistant Cloud.": "Open Haven en vul dit adres in. Het is het adres waarmee je Home Assistant opent; gebruik buitenshuis het externe adres, bijvoorbeeld Home Assistant Cloud.", + "Address": "Adres", + "On the phone itself, Open in Haven fills it in.": "Op de telefoon zelf vult Openen in Haven het in.", + "Sign in": "Inloggen", + "Everyone signs in with their own Home Assistant login, once. Haven then opens straight on their dashboard and stays signed in.": "Iedereen logt één keer in met zijn eigen Home Assistant-account. Haven opent daarna meteen op het eigen dashboard en blijft ingelogd.", + "Haven needs Android 7 or newer. On iPhone, use the Home Assistant app instead.": "Haven werkt op Android 7 of nieuwer. Gebruik op een iPhone de Home Assistant-app.", + "Activity": "Activiteit", + "Who changed which dashboard. Restore an earlier version from the dashboard’s version history.": "Wie welk dashboard heeft gewijzigd. Zet een eerdere versie terug via de versiegeschiedenis van het dashboard.", + "{0} changed {1}": "{0} wijzigde {1}", + "{0} was changed": "{0} is gewijzigd", + "deleted": "verwijderd", + "Versions": "Versies", + "No changes yet.": "Nog geen wijzigingen.", + "You’re signed in as {0}, a Home Assistant administrator, so you can use the Dashboard, Builder and Admin screens.": "Je bent ingelogd als {0}, beheerder in Home Assistant, dus je kunt de schermen Dashboard, Bouwer en Beheer gebruiken.", + "{0} can’t see any dashboard yet.": "{0} kan nog geen enkel dashboard zien.", + "Previewing as {0}: {1} dashboards. On their devices it’s full screen, in kiosk mode.": "Voorbeeld als {0}: {1} dashboards. Op hun apparaten is het schermvullend, in kioskmodus.", + "Sent.": "Verstuurd.", + "Couldn’t send it: {0}": "Versturen lukte niet: {0}", + "Copied.": "Gekopieerd.", + "Builder": "Bouwer", + "Stop preview": "Voorbeeld stoppen", + "Nothing to show yet": "Nog niets te zien", + "Screen": "Scherm", "Today": "Vandaag", "Tomorrow": "Morgen", "All day": "Hele dag", "Busy": "Bezet", }; diff --git a/dashboard_studio/web/index.html b/dashboard_studio/web/index.html index 5d1075c..f052b4b 100644 --- a/dashboard_studio/web/index.html +++ b/dashboard_studio/web/index.html @@ -40,24 +40,19 @@ - +

@@ -77,6 +72,12 @@ + + +
@@ -84,6 +85,8 @@ + + diff --git a/dashboard_studio/web/style.css b/dashboard_studio/web/style.css index cc5206f..257014d 100644 --- a/dashboard_studio/web/style.css +++ b/dashboard_studio/web/style.css @@ -1418,3 +1418,111 @@ body.kiosk.idle, body.kiosk.idle * { cursor: none !important; } .hist-row { display: flex; align-items: center; gap: 12px; padding: 8px 4px; border-bottom: 1px solid var(--separator); } .hist-row:last-child { border-bottom: 0; } .hist-when { font-weight: 500; } + +/* ============================================================ screens: Dashboard, Builder, Admin */ +.mode-seg { display: flex; gap: 2px; padding: 2px; border-radius: 11px; background: var(--fill); } +.mode-seg[hidden] { display: none; } +.mode-seg button { display: inline-flex; align-items: center; gap: 6px; border: 0; background: transparent; border-radius: 9px; min-height: 32px; padding: 0 12px; cursor: pointer; font-weight: 500; color: var(--text-2); } +.mode-seg button .i { font-size: 17px; } +.mode-seg button:hover { color: var(--text); } +.mode-seg button.on { background: var(--surface); color: var(--text); font-weight: 650; box-shadow: 0 1px 3px rgba(0, 0, 0, .14); } +.mode-seg button[data-mode="builder"].on { background: var(--accent); color: var(--on-accent); } +@media (max-width: 760px) { .mode-seg button span { display: none; } .mode-seg button { padding: 0 9px; } } + +body.admin-mode #workspace, body.admin-mode #topbar .picker, body.admin-mode #btn-new, body.admin-mode #topbar .view-only, body.admin-mode #topbar .edit-only { display: none !important; } +body.admin-mode #topbar::before { content: "Dashboard Studio"; font-weight: 650; font-size: 17px; padding-left: 8px; } + +/* ============================================================ admin */ +#admin { position: absolute; inset: 0; display: flex; padding-top: 72px; background: var(--canvas); } +#admin[hidden] { display: none; } +.adm-nav { flex: none; width: 220px; padding: 14px 10px; display: flex; flex-direction: column; gap: 2px; border-right: 1px solid var(--separator); background: var(--surface); overflow-y: auto; } +.adm-nav button { display: flex; align-items: center; gap: 10px; border: 0; background: transparent; border-radius: 10px; padding: 9px 12px; min-height: 40px; cursor: pointer; font-size: 15px; text-align: left; color: var(--text); } +.adm-nav button .i { font-size: 19px; color: var(--text-2); } +.adm-nav button:hover { background: var(--fill); } +.adm-nav button.on { background: color-mix(in srgb, var(--accent) 14%, transparent); color: var(--accent); font-weight: 650; } +.adm-nav button.on .i { color: var(--accent); } +.adm-body { flex: 1; min-width: 0; overflow-y: auto; padding: 22px 28px 60px; } +.adm-body > * { max-width: 1040px; margin-left: auto; margin-right: auto; } +.adm-head { display: flex; align-items: flex-end; justify-content: space-between; gap: 16px; flex-wrap: wrap; margin-bottom: 18px; } +.adm-head h2 { font-size: 28px; font-weight: 700; margin: 0 0 4px; letter-spacing: -.01em; } +.adm-head p { margin: 0; max-width: 640px; } +.adm-actions { display: flex; gap: 8px; flex-wrap: wrap; } +.adm-cards { display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: 14px; } +.adm-card { background: var(--surface); border-radius: 16px; padding: 16px; display: flex; flex-direction: column; gap: 12px; box-shadow: var(--shadow); border: 1px solid var(--separator); } +.ac-top { display: flex; gap: 12px; align-items: center; } +.ac-top h3 { margin: 0 0 2px; font-size: 17px; overflow-wrap: anywhere; } +.ac-swatch { width: 52px; height: 52px; flex: none; border-radius: 12px; display: grid; place-items: center; color: #fff; box-shadow: inset 0 0 0 1px rgba(0, 0, 0, .08); } +.ac-swatch .i { font-size: 22px; filter: drop-shadow(0 1px 2px rgba(0, 0, 0, .35)); } +.ac-who { display: flex; align-items: center; gap: 8px; font-size: 13px; color: var(--text-2); } +.ac-who .i { font-size: 16px; flex: none; } +.ac-actions { display: flex; gap: 8px; margin-top: auto; } +.ac-actions .btn:not(.icon) { flex: 1; } +.adm-list { display: flex; flex-direction: column; gap: 10px; } +#admin .grow { flex: 1; min-width: 0; } +.person { background: var(--surface); border-radius: 16px; padding: 14px 16px; margin-bottom: 10px; border: 1px solid var(--separator); } +.person.everyone { border-style: dashed; } +.p-head { display: flex; align-items: center; gap: 12px; } +.p-name { font-weight: 650; font-size: 16px; } +.p-badge { display: inline-block; font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: .04em; padding: 2px 7px; border-radius: 6px; background: color-mix(in srgb, var(--accent) 16%, transparent); color: var(--accent); vertical-align: 2px; margin-left: 4px; } +.adm-avatar { width: 40px; height: 40px; flex: none; border-radius: 50%; display: grid; place-items: center; background: var(--fill); font-weight: 700; color: var(--text-2); } +.adm-avatar.admin { background: color-mix(in srgb, var(--accent) 18%, transparent); color: var(--accent); } +.adm-avatar .i { font-size: 19px; } +.p-access { margin: 12px 0 0 52px; display: flex; flex-direction: column; gap: 10px; } +.p-access .seg { max-width: 460px; } +.p-access .field { display: flex; align-items: center; gap: 10px; margin: 0; font-size: 13px; color: var(--text-2); } +.p-access .field .input { max-width: 240px; } +.adm-chips { display: flex; flex-wrap: wrap; gap: 6px; } +.chip-check { position: relative; } +.chip-check input { position: absolute; opacity: 0; pointer-events: none; } +.chip-check span { display: inline-flex; align-items: center; min-height: 32px; padding: 0 13px; border-radius: 99px; background: var(--fill); font-size: 13px; font-weight: 500; cursor: pointer; } +.chip-check input:checked + span { background: var(--accent); color: var(--on-accent); } +.chip-check input:checked + span::before { content: "✓"; margin-right: 6px; font-weight: 700; } +.chip-check input:disabled + span { opacity: .55; cursor: default; } +.chip-check input:focus-visible + span { box-shadow: var(--focus); } +.dev-row, .act-row { display: flex; align-items: center; gap: 12px; background: var(--surface); border-radius: 14px; padding: 10px 14px; border: 1px solid var(--separator); } +.dev-row .grow .input { max-width: 320px; font-weight: 600; } +.dev-row select.input { width: 200px; flex: none; } +.dev-gap { width: 36px; flex: none; } +.adm-panel { background: var(--surface); border-radius: 16px; padding: 18px; border: 1px solid var(--separator); margin-top: 18px; } +.adm-panel h3 { display: flex; align-items: center; gap: 8px; margin: 0 0 6px; font-size: 17px; } +.adm-panel h3 .i { color: var(--accent); } +.an-form { display: grid; grid-template-columns: 1fr 2fr 180px auto; gap: 8px; margin-top: 12px; } +.haven-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); gap: 14px; } +.haven-grid .adm-panel { margin-top: 0; display: flex; flex-direction: column; gap: 6px; } +.haven-step .btn { align-self: flex-start; } +.hs-num { width: 30px; height: 30px; border-radius: 50%; background: var(--accent); color: var(--on-accent); display: grid; place-items: center; font-weight: 700; } +.act-list { display: flex; flex-direction: column; gap: 6px; } +.act-list .btn { justify-content: flex-start; } +.kp-dashes { display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: 8px; margin: 6px 0 4px; } +.kp-dashes .btn { min-height: 56px; justify-content: flex-start; font-size: 16px; font-weight: 600; } +@media (max-width: 760px) { + #admin { flex-direction: column; } + .adm-nav { width: auto; flex-direction: row; overflow-x: auto; border-right: 0; border-bottom: 1px solid var(--separator); padding: 8px; } + .adm-nav button { flex: none; padding: 8px 12px; } + .adm-body { padding: 18px 14px 60px; } + .adm-head h2 { font-size: 24px; } + .p-access { margin-left: 0; } + .dev-row { flex-wrap: wrap; } + .dev-row .grow { flex-basis: calc(100% - 52px); } + .dev-row select.input { flex: 1; width: auto; } + .an-form { grid-template-columns: 1fr; } +} + +/* preview as someone else, and nothing to show */ +#preview-bar { position: fixed; z-index: 70; left: 50%; bottom: calc(16px + env(safe-area-inset-bottom)); transform: translateX(-50%); display: flex; align-items: center; gap: 12px; + padding: 8px 8px 8px 16px; border-radius: 14px; background: rgba(28, 28, 30, .9); color: #fff; backdrop-filter: blur(16px); -webkit-backdrop-filter: blur(16px); box-shadow: 0 8px 30px rgba(0, 0, 0, .3); max-width: calc(100% - 24px); font-size: 14px; } +#preview-bar[hidden] { display: none; } +#preview-bar .btn { background: rgba(255, 255, 255, .16); color: #fff; flex: none; } +body.previewing #btn-new { display: none; } +#empty-note { position: fixed; inset: 0; z-index: 90; display: grid; place-items: center; padding: 24px; background: var(--canvas); } +#empty-note[hidden] { display: none; } +.en-card { max-width: 420px; text-align: center; } +.en-ico { width: 72px; height: 72px; margin: 0 auto 16px; border-radius: 20px; display: grid; place-items: center; background: var(--fill); } +.en-ico .i { font-size: 34px; color: var(--text-2); } +.en-card h2 { margin: 0 0 8px; } +.en-card p { color: var(--text-2); margin: 0; } +body.empty #app { display: none; } +body.in-haven #btn-new { display: none; } +.haven-head { justify-content: flex-start; align-items: center; } +.haven-head img { width: 64px; height: 64px; border-radius: 16px; flex: none; box-shadow: 0 6px 18px rgba(0, 0, 0, .2); } +.haven-head > div { flex: 1; min-width: 240px; } diff --git a/dashboard_studio/web/sw.js b/dashboard_studio/web/sw.js index 7705392..a84448d 100644 --- a/dashboard_studio/web/sw.js +++ b/dashboard_studio/web/sw.js @@ -21,7 +21,9 @@ self.addEventListener("fetch", (e) => { return res; } if (!page) return res; - throw new Error(String(res.status)); + // Signed out of Home Assistant: the last good copy renews the session itself. Without one, pass + // the refusal on, so Haven knows to sign in again. + return (await cache.match(new URL("./", self.registration.scope).href)) || res; } catch (err) { const hit = page ? await cache.match(new URL("./", self.registration.scope).href) : await cache.match(req); if (hit) return hit; diff --git a/android/.gitignore b/haven/.gitignore similarity index 100% rename from android/.gitignore rename to haven/.gitignore diff --git a/android/AndroidManifest.xml b/haven/AndroidManifest.xml similarity index 85% rename from android/AndroidManifest.xml rename to haven/AndroidManifest.xml index 2768dcc..bd16e3d 100644 --- a/android/AndroidManifest.xml +++ b/haven/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionName="2.0.0"> @@ -25,12 +25,12 @@ - + - + diff --git a/haven/assets/icon.png b/haven/assets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..773f1a9bac44f218cb4109f97cc6ffa634257059 GIT binary patch literal 5994 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 Y4_!j}riQ33%m4rY07*qoM6N<$g0&`FRR910 literal 0 HcmV?d00001 diff --git a/haven/assets/setup.html b/haven/assets/setup.html new file mode 100644 index 0000000..611656d --- /dev/null +++ b/haven/assets/setup.html @@ -0,0 +1,66 @@ + + + + + + + + +
+ +

Haven

+

Your home’s dashboards

+

Enter the address you use to open Home Assistant, then sign in with your own login. You only do this once.

+

+
+ + +

Ask whoever set up Home Assistant: it’s on the Admin screen of Dashboard Studio, under Haven app.

+ +
+
+ + + diff --git a/android/build.sh b/haven/build.sh similarity index 78% rename from android/build.sh rename to haven/build.sh index 75caf48..b53a639 100755 --- a/android/build.sh +++ b/haven/build.sh @@ -1,6 +1,6 @@ #!/bin/sh -# Builds the Android app without Gradle, with the Android SDK's own tools, and copies it into the -# Home Assistant app, which offers it for download (Install as an app on an Android phone). +# Builds Haven, the Android app, without Gradle, with the Android SDK's own tools, and copies it into the +# Home Assistant app, which offers it for download (Admin, Haven app; and Install as an app on Android). # ./build.sh the release build, signed with ~/.android/dashboard-studio.jks (made the first time) # ./build.sh debug a debuggable build, for testing in the emulator (Chrome can inspect its pages) # Keep the key: Android only installs an update that is signed with the same key as the installed app. @@ -29,10 +29,10 @@ if [ ! -f "$KEY" ]; then -keyalg RSA -keysize 4096 -validity 36500 -dname "CN=Dashboard Studio" >/dev/null echo "Made a new signing key: $KEY (keep it, updates need the same key)" fi -"$BT/apksigner" sign --ks "$KEY" --ks-pass pass:dashboard-studio --ks-key-alias app --out "$OUT/dashboard-studio.apk" "$OUT/app.aligned.apk" +"$BT/apksigner" sign --ks "$KEY" --ks-pass pass:dashboard-studio --ks-key-alias app --out "$OUT/haven.apk" "$OUT/app.aligned.apk" if [ -z "$DEBUG" ]; then - cp "$OUT/dashboard-studio.apk" ../dashboard_studio/web/dashboard-studio.apk - echo "Built and copied to dashboard_studio/web/dashboard-studio.apk" + cp "$OUT/haven.apk" ../dashboard_studio/web/haven.apk + echo "Built and copied to dashboard_studio/web/haven.apk" else - echo "Built $OUT/dashboard-studio.apk (debug)" + echo "Built $OUT/haven.apk (debug)" fi diff --git a/haven/res/drawable-xxxhdpi/ic_fg.png b/haven/res/drawable-xxxhdpi/ic_fg.png new file mode 100644 index 0000000000000000000000000000000000000000..714e1ca9052ad23e477d0f2b8f5806e0ad88ca40 GIT binary patch literal 14045 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 - + diff --git a/haven/res/drawable/loading.xml b/haven/res/drawable/loading.xml new file mode 100644 index 0000000..105be8c --- /dev/null +++ b/haven/res/drawable/loading.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/android/res/mipmap-anydpi-v26/ic_launcher.xml b/haven/res/mipmap-anydpi-v26/ic_launcher.xml similarity index 100% rename from android/res/mipmap-anydpi-v26/ic_launcher.xml rename to haven/res/mipmap-anydpi-v26/ic_launcher.xml diff --git a/haven/res/mipmap-hdpi/ic_launcher.png b/haven/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..415441f267c98a68cd2b8e093ebe090dbca5d46d GIT binary patch literal 2714 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 M07*qoM6N<$g6~R0U;qFB literal 0 HcmV?d00001 diff --git a/haven/res/mipmap-xhdpi/ic_launcher.png b/haven/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..31c1e11aa71b39c6f5ed0ed09850b47f05c92bb6 GIT binary patch literal 3818 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 literal 0 HcmV?d00001 diff --git a/haven/res/mipmap-xxhdpi/ic_launcher.png b/haven/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..773f1a9bac44f218cb4109f97cc6ffa634257059 GIT binary patch literal 5994 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 Y4_!j}riQ33%m4rY07*qoM6N<$g0&`FRR910 literal 0 HcmV?d00001 diff --git a/haven/res/mipmap-xxxhdpi/ic_launcher.png b/haven/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..c70990ce3ad312f4bdeffb73d0fee2644bbd2ffe GIT binary patch literal 8354 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 literal 0 HcmV?d00001 diff --git a/android/res/values/values.xml b/haven/res/values/values.xml similarity index 57% rename from android/res/values/values.xml rename to haven/res/values/values.xml index dbd0745..7ec7702 100644 --- a/android/res/values/values.xml +++ b/haven/res/values/values.xml @@ -1,11 +1,11 @@ - Dashboards + Haven - #0f1526 + #0d1d29 diff --git a/android/src/nl/melvanveen/dashboardstudio/MainActivity.java b/haven/src/nl/melvanveen/haven/MainActivity.java similarity index 77% rename from android/src/nl/melvanveen/dashboardstudio/MainActivity.java rename to haven/src/nl/melvanveen/haven/MainActivity.java index 5f4a7f9..2ca438b 100644 --- a/android/src/nl/melvanveen/dashboardstudio/MainActivity.java +++ b/haven/src/nl/melvanveen/haven/MainActivity.java @@ -1,4 +1,4 @@ -package nl.melvanveen.dashboardstudio; +package nl.melvanveen.haven; import android.app.Activity; import android.content.ActivityNotFoundException; @@ -22,7 +22,8 @@ import android.webkit.WebView; import android.webkit.WebViewClient; /** - * Dashboard Studio as an Android app: a full-screen window on the Dashboard Studio app inside Home Assistant. + * Haven: the dashboards of Dashboard Studio as an Android app, for everyone in the home. Full screen, and only + * the dashboards: Dashboard Studio leaves out its builder and admin screen when window.HavenApp is there. * * Home Assistant only lets a signed-in browser into an app's page (its "ingress"). So the app first opens * Home Assistant itself, where you sign in once; then, on Home Assistant's page, it asks for an ingress @@ -44,7 +45,7 @@ public class MainActivity extends Activity { (function () { if (window.__dsConnect) return; window.__dsConnect = true; - const known = DSApp.appUrl(); + const known = HavenApp.appUrl(); let tries = 0; const tick = async () => { const hass = document.querySelector("home-assistant")?.hass; @@ -58,19 +59,21 @@ public class MainActivity extends Activity { let url = known; if (!url) { const panel = Object.values(hass.panels).find((p) => /(^|_)dashboard_studio$/.test(p.config?.ingress || "")); - if (!panel) return DSApp.fail("notfound", ""); + if (!panel) return HavenApp.fail("notfound", ""); let info; try { info = await hass.callWS({ type: "supervisor/api", endpoint: `/addons/${panel.config.ingress}/info`, method: "get" }); } catch { info = (await hass.callApi("GET", `hassio/addons/${panel.config.ingress}/info`).catch(() => null))?.data; } - if (!info?.ingress_url) return DSApp.fail("noaddress", ""); + if (!info?.ingress_url) return HavenApp.fail("noaddress", ""); url = location.origin + info.ingress_url; } - const res = await hass.callApi("POST", "hassio/ingress/session"); - const session = res?.data?.session || res?.session; + // The websocket gives everyone a session; the REST address only works for administrators. + let session; + try { session = (await hass.callWS({ type: "supervisor/api", endpoint: "/ingress/session", method: "post" }))?.session; } + catch { const res = await hass.callApi("POST", "hassio/ingress/session"); session = res?.data?.session || res?.session; } document.cookie = `ingress_session=${session};path=/api/hassio_ingress/;SameSite=Strict${location.protocol === "https:" ? ";Secure" : ""}`; - DSApp.open(url); + HavenApp.open(url); } catch (e) { - DSApp.fail("error", String(e?.message || e?.body?.message || e?.code || e)); + HavenApp.fail("error", String(e?.message || e?.body?.message || e?.code || e)); } }; tick(); @@ -84,7 +87,7 @@ public class MainActivity extends Activity { if ((getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) WebView.setWebContentsDebuggingEnabled(true); web = new WebView(this); - web.setBackgroundColor(Color.parseColor("#0f1526")); + web.setBackgroundColor(Color.TRANSPARENT); // the loading screen shows through until a page is ready setContentView(web); WebSettings s = web.getSettings(); s.setJavaScriptEnabled(true); @@ -92,9 +95,9 @@ public class MainActivity extends Activity { s.setDatabaseEnabled(true); s.setMediaPlaybackRequiresUserGesture(false); // camera streams and the doorbell sound s.setMixedContentMode(WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE); - s.setUserAgentString(s.getUserAgentString() + " DashboardStudioApp/1.0"); + s.setUserAgentString(s.getUserAgentString() + " HavenApp/2.0"); CookieManager.getInstance().setAcceptCookie(true); - web.addJavascriptInterface(new Bridge(), "DSApp"); + web.addJavascriptInterface(new Bridge(), "HavenApp"); web.setWebViewClient(new Client()); web.setWebChromeClient(new Chrome()); @@ -107,10 +110,10 @@ public class MainActivity extends Activity { fromLink(intent); } - /** "Open in the app" in Dashboard Studio: dashboardstudio://open?url=... */ + /** "Open in Haven" in Dashboard Studio: haven://open?url=... */ private boolean fromLink(Intent intent) { Uri data = intent == null ? null : intent.getData(); - if (data == null || !"dashboardstudio".equals(data.getScheme())) return false; + if (data == null || !"haven".equals(data.getScheme())) return false; String url = data.getQueryParameter("url"); if (url == null || !url.matches("(?i)https?://.+")) return false; save(origin(Uri.parse(url)), url); @@ -127,11 +130,13 @@ public class MainActivity extends Activity { } private static boolean isIngress(String url) { return url != null && url.contains("/api/hassio_ingress/"); } + /** Always through Home Assistant's own page: it gets a fresh session first, so Dashboard Studio's page + * never opens signed out (its offline copy can't help then, and the WebView wouldn't say it failed). */ private void start() { message = ""; detail = ""; + offlineTried = false; if (ha().isEmpty()) { web.loadUrl(SETUP); return; } - // With the address known, try it straight away: a session may still be valid, or the page is cached for offline use. - web.loadUrl(app().isEmpty() ? ha() + "/" : app()); + connect(); } private void connect() { @@ -139,14 +144,32 @@ public class MainActivity extends Activity { web.loadUrl(ha() + "/"); } + /** While Home Assistant's page does its work, the loading screen (the window background) shows instead. */ + private void hidePage() { + web.setAlpha(0f); + reveal.removeCallbacks(showPage); + reveal.postDelayed(showPage, 6000); // still there after a while: probably something to read or answer + } + private final android.os.Handler reveal = new android.os.Handler(android.os.Looper.getMainLooper()); + private final Runnable showPage = () -> web.animate().alpha(1f).setDuration(150); + private boolean offlineTried = false; + private void showSetup(String why, String more) { message = why; detail = more == null ? "" : more; web.loadUrl(SETUP); } private class Client extends WebViewClient { + @Override + public void onPageStarted(WebView view, String url, android.graphics.Bitmap icon) { + boolean haPage = url != null && !ha().isEmpty() && url.startsWith(ha()) && !isIngress(url) && !url.equals(app().isEmpty() ? "-" : app()); + if (haPage && !url.contains("/auth/")) hidePage(); + else if (url != null && url.contains("/auth/")) { reveal.removeCallbacks(showPage); web.setAlpha(1f); } // signing in + } + @Override public void onPageFinished(WebView view, String url) { + if (url != null && (isIngress(url) || url.startsWith("file:"))) { reveal.removeCallbacks(showPage); web.animate().alpha(1f).setDuration(150); } if (url == null || ha().isEmpty() || !url.startsWith(ha())) return; String page = app().replaceAll("[?#].*", ""); if (isIngress(url) || (!page.isEmpty() && url.startsWith(page))) view.clearHistory(); // back leaves the app instead of going to Home Assistant @@ -165,7 +188,10 @@ public class MainActivity extends Activity { @Override public void onReceivedError(WebView view, WebResourceRequest req, WebResourceError err) { - if (req.isForMainFrame() && !req.getUrl().toString().startsWith("file:")) showSetup("offline", ""); + if (!req.isForMainFrame() || req.getUrl().toString().startsWith("file:")) return; + // Home Assistant can't be reached: Dashboard Studio's offline copy may still open, with the last known states. + if (!isIngress(req.getUrl().toString()) && !app().isEmpty() && !offlineTried) { offlineTried = true; web.loadUrl(app()); } + else { reveal.removeCallbacks(showPage); web.setAlpha(1f); showSetup("offline", ""); } } @Override @@ -229,7 +255,7 @@ public class MainActivity extends Activity { if (web.restoreState(state) == null) start(); } - /** What the pages can call, as window.DSApp. */ + /** What the pages can call, as window.HavenApp. */ private class Bridge { @JavascriptInterface public String address() { return ha(); } @JavascriptInterface public String appUrl() { return app(); } @@ -259,7 +285,10 @@ public class MainActivity extends Activity { @JavascriptInterface public void fail(String why, String more) { runOnUiThread(() -> showSetup(why, more)); } - /** Dashboard Studio: Install as an app, Change address. */ + /** Dashboard Studio couldn't renew its session: sign in again on Home Assistant's page. */ + @JavascriptInterface public void reconnect() { runOnUiThread(MainActivity.this::connect); } + + /** Dashboard Studio, in Haven: Install as an app, Change address. */ @JavascriptInterface public void reset() { runOnUiThread(() -> { message = ""; detail = ""; web.loadUrl(SETUP); }); } /** Kiosk mode: keep the screen on and hide the system bars. */