Compare commits

...

636 Commits

Author SHA1 Message Date
Bram Kragten
73be0fef75 Merge pull request #7422 from home-assistant/dev
20201021.0
2020-10-21 19:21:45 +02:00
Bram Kragten
611202c905 Fix no focus on first item when switching mode (#7421) 2020-10-21 18:50:08 +02:00
Bram Kragten
e553f35a68 Merge branch 'master' into dev 2020-10-21 18:41:18 +02:00
Bram Kragten
673649a603 Bumped version to 20201021.0 2020-10-21 18:36:59 +02:00
Bram Kragten
c4ed743370 Fix mwc list items icon color (#7420) 2020-10-21 18:21:58 +02:00
Joakim Sørensen
682fa0d3eb Haos update button (#7419) 2020-10-21 10:30:41 -05:00
On Freund
30f34eee22 Add context to event trigger (#7182)
Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-10-21 17:26:45 +02:00
Bram Kragten
eab76bf85b Fix position edit card dialog (#7418) 2020-10-21 15:26:08 +02:00
Donnie
bcf405bf9d Fix Firefox quick bar issue by allowing Ctrl+P to toggle modes (#7413)
Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-10-21 14:19:16 +02:00
Ryan Meek
3c4b0d4a74 Compact header (#7369)
Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-10-21 14:18:33 +02:00
Zack Barett
fb9bd0eb7d Fix prettier that keeps messing with merging dev (#7412) 2020-10-21 13:14:10 +02:00
Ian Richardson
7e2dc04123 Fix icon for unavailable buttons (#7416) 2020-10-21 13:12:28 +02:00
Bram Kragten
54ec37994c Improve performance of quick bar (#7359)
Co-authored-by: Donnie <donniekarnsinsb@hotmail.com>
2020-10-21 13:07:44 +02:00
Gilson Marquato Júnior
4a5935ee36 Add onClick listener to dismiss toast notification. (#7268) 2020-10-21 13:03:31 +02:00
Joakim Sørensen
01b9a07320 Change logic for the new version handling (#7405) 2020-10-21 12:40:06 +02:00
Zack Barett
0fcf0dcd18 Fix Yarn lock (#7411) 2020-10-20 19:37:26 -05:00
HomeAssistant Azure
80481f142a [ci skip] Translation update 2020-10-21 00:32:23 +00:00
Philip Allgaier
2be08ce7ab Light hui & more-info card fixes (#7397) 2020-10-20 23:52:10 +02:00
Bram Kragten
37eb5af3d4 Pass updated cards and badges to view element (#7407) 2020-10-20 23:51:15 +02:00
Philip Allgaier
8c8151be92 Add entity filter to history panel (#7401) 2020-10-20 23:02:59 +02:00
Philip Allgaier
baf31d1c1e Fix alignments in integration card (#7404) 2020-10-20 22:59:20 +02:00
Donnie
af2250835a Only admins can launch quick bar (#7388)
Co-authored-by: Zack Barett <zackbarett@hey.com>
2020-10-20 22:24:48 +02:00
Donnie
6f2a759ba3 Add scoring and sorting to sequence matcher (#7367)
* Replace sequence matcher with VS Code's score-based implementation

* Remove everything not related to fuzzyScore and matchSubstring

* Fix bug when filter length <= 3

* Add licensing and credit to Microsoft

* Remove unnecessary character codes

* Remove old sequence matcher, update tests, fix issue with not finding best score in list of words

* Remove unnecessary sequence precheck, refactor client api to remove array

* Fix issue with score sorting not implemented correctly and thus not actually sorting by score

* Update src/common/string/filter/sequence-matching.ts

Co-authored-by: Bram Kragten <mail@bramkragten.nl>

* Remove unnecessary string return from fuzzy matcher. Clean up code

* Remove globals from filter. Move sorting logic into matcher

* Update function description, make score property optional.

Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-10-20 09:01:16 -07:00
Jaroslav Hanslík
5065901196 Modified icons of binary sensors: gas, problem, safety, smoke (#7403) 2020-10-20 17:43:01 +02:00
Philip Allgaier
41b59e6e11 Bump round-slider to 0.5.2 (#7399) 2020-10-20 08:58:35 -05:00
onagurna
43afdaadc6 Fix syntax error (#7402) 2020-10-20 15:09:27 +02:00
Tomasz
83c5151792 bump node-vibrant to 3.1.6 (#7400) 2020-10-20 12:42:51 +02:00
HomeAssistant Azure
0880ab67c6 [ci skip] Translation update 2020-10-20 00:32:22 +00:00
Donnie
c0b2143c7c Quick Bar dark mode, ignore leading white space (#7387) 2020-10-19 22:10:44 +02:00
Philip Allgaier
c1de162c99 Visual alignment between PR 7364 & 7220 (#7396) 2020-10-19 22:09:15 +02:00
Philip Allgaier
a7ef8aba68 Add dialog-box warning support (#7356) 2020-10-19 22:08:35 +02:00
Philip Allgaier
3ee4c11a99 Move error log <ha-card> + color in log entries (#7382) 2020-10-19 22:05:19 +02:00
Philip Allgaier
990ae10dc2 Detect Lovelace resource type based on file extension (#7354) 2020-10-19 22:03:59 +02:00
Philip Allgaier
52b2fd046b Improved automation & script menus + show errors in toast (#7371)
* Improved automation & script menus + show errors in toast

* Changes from review

* Re-added old error display

* Toast back to default duration + remove action
2020-10-19 19:55:36 +02:00
J. Nick Koston
9f41f80a91 Add support for displaying time listeners (#7220) 2020-10-19 19:43:04 +02:00
Joakim Sørensen
eec4a91ad8 Fixes for snapshot upload during onboarding (#7390)
Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-10-19 15:24:25 +02:00
Joakim Sørensen
7c51001c3c Move valid so we don't cache an empty element for add-on config (#7394) 2020-10-19 15:23:13 +02:00
Daniel Martin Gonzalez
a4ea4b1f5f Add Timer to Helpers (#7366) 2020-10-19 14:45:20 +02:00
Philip Allgaier
19fc37539e Fix alignment / padding of ha-switch (#7349) 2020-10-19 14:44:54 +02:00
Philip Allgaier
ce7acb0feb Clean up general config page code (#7383) 2020-10-19 14:40:01 +02:00
Philip Allgaier
105b7678b8 Make error texts of device automation picker translatable (#7370) 2020-10-19 14:30:40 +02:00
Philip Allgaier
b67575586e Add option to copy system info into clipboard (#7323) 2020-10-19 14:29:10 +02:00
Ing. Jaroslav Šafka
3dc6898673 Enable volume up/down for media player (#7376)
Always show volume up/down buttons in media player
if SUPPORT_VOLUME_BUTTONS is supported.
And slider if supported

Previous impl. shows slider or up/down buttons.
2020-10-19 11:16:20 +02:00
Philip Allgaier
a73754c1b5 Use ha-card for dev tool "Services" + visual tweaks (#7364) 2020-10-19 11:15:12 +02:00
Charles Garwood
1ebf1c00d6 Initial OZW Node Config Panel (#7377) 2020-10-19 11:13:55 +02:00
HomeAssistant Azure
7dac7d757e [ci skip] Translation update 2020-10-19 00:32:45 +00:00
HomeAssistant Azure
b1f3192b95 [ci skip] Translation update 2020-10-18 00:32:21 +00:00
Donnie
16984d18bb Refactor quick bar to use a common interface for future commands and easier sorting (#7368) 2020-10-17 15:48:48 -07:00
Philip Allgaier
e603893d77 Fix navigation links for "script/edit" (#7363) 2020-10-17 17:28:05 -05:00
Bram Kragten
a7998b30c6 Fix hls player (#7362) 2020-10-17 23:43:00 +02:00
Philip Allgaier
3277a4e8c3 Minor tweaks for when media player has no items (#7374) 2020-10-17 23:34:11 +02:00
Philip Allgaier
7e769d0e14 Make <ha-card> use <h1> for header (#7373)
Co-authored-by: Zack Barett <zackbarett@hey.com>
2020-10-17 23:22:56 +02:00
Philip Allgaier
713e0579f8 Entity registry settings: Remove "Override" string + use domain icon as fallback (#7320) 2020-10-17 22:46:34 +02:00
Philip Allgaier
6e130cc020 Properly wrap integration title / device names (#7355) 2020-10-17 22:28:40 +02:00
Villhellm
eb036a12d9 add help button to tags config panel (#7278)
* add help button to tags config panel

* Update src/panels/config/tags/ha-config-tags.ts

Co-authored-by: Bram Kragten <mail@bramkragten.nl>

Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-10-17 22:21:03 +02:00
Joakim Sørensen
534d1f5055 Add dialog and links for unsupported supervisor installation (#7332) 2020-10-17 22:18:17 +02:00
Daniel Martin Gonzalez
cbef909657 Add Counter to Helpers (#7346)
Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-10-17 22:15:37 +02:00
Philip Allgaier
874f3b32b3 Harmonize the font sizes on area and device page (#7357) 2020-10-17 22:10:52 +02:00
Bram Kragten
2fd017cf73 Fix more info group (#7345)
Co-authored-by: Zack Barett <arnett.zackary@gmail.com>
2020-10-17 22:05:04 +02:00
Bram Kragten
5740b018a7 Prevent old more info control to be created (#7324) 2020-10-17 22:04:44 +02:00
Tomasz
288bf6805a Sort persistent notifications ascending (#7195)
Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-10-17 22:03:33 +02:00
HomeAssistant Azure
02d37a369a [ci skip] Translation update 2020-10-17 00:32:29 +00:00
Philip Allgaier
1d316c3258 Remove query caching to get YAML editor toggle working again (#7365) 2020-10-16 23:27:00 +02:00
Joakim Sørensen
a56ce62f1a Add docker registry management (#7269)
Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-10-16 17:25:23 +02:00
Zack Barett
c268f42851 Entity Picker: undo fuzzy algorithm (#7360) 2020-10-16 09:45:58 -05:00
HomeAssistant Azure
7251e802ab [ci skip] Translation update 2020-10-16 00:32:27 +00:00
Matt
5b1a2d10c2 Add button that dismisses all notifications (#7223) 2020-10-15 16:22:47 -05:00
Charles Garwood
2dd7f292b1 Add product picture to ozw node dashboard (#7203) 2020-10-15 16:20:54 -05:00
Santobert
213c53e307 Add the options dark_mode_filter and dark_mode_image to the picture elements card (#7304) 2020-10-15 16:16:15 -05:00
Bram Kragten
ce07dfd8ac Little clean up in data table (#7352) 2020-10-15 18:46:55 +02:00
Zack Barett
c1dba462e8 Lovelace Cards: Update size calcs and add height fixes for horizontal stacks (#7177) 2020-10-15 17:46:29 +02:00
Philip Allgaier
47f0d74812 New "clickable" property for <ha-data-table> (#7351) 2020-10-15 15:57:05 +02:00
Ryan Meek
ce80285f8d Header styling & paper-tabs improvements (#7238)
Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-10-15 15:08:53 +02:00
Philip Allgaier
d2dd1a43dd Fix attribute picker suffix (#7348) 2020-10-15 14:56:10 +02:00
Zack Barett
12d73fe90d Add Friendly Name to the Entity Picker + FuzzySeq Algo (#7291) 2020-10-14 20:20:21 -05:00
HomeAssistant Azure
c2741638b2 [ci skip] Translation update 2020-10-15 00:32:32 +00:00
Philip Allgaier
4a7fb3d509 Use attribute picker for sec. info in weather card editor (#7335) 2020-10-15 00:57:30 +02:00
Bram Kragten
f6ff652ca4 Fix es5 build (#7319) 2020-10-14 22:20:39 +02:00
Donnie
6165cb0f83 Make enter key execute first filtered item in Quick Bar (#7288)
* Make enter key execute first filtered item in quick open dialog

* Add support for arrow up and down moving in and out of list

* Add support for typing letters even when arrowing around the list

* Address review comments and clean up the single-character keyboard event logic

* Address comments. Move activated index along with arrow keys

* Add loading spinner and remove memoization
2020-10-14 19:01:44 +02:00
Bram Kragten
1f361b7b10 Update entity picker (#7343) 2020-10-14 17:01:23 +02:00
Tomasz
5269ff978b New component: ha-expansion-panel (#6789)
Co-authored-by: Zack Barett <zackbarett@hey.com>
Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-10-14 16:28:46 +02:00
Bram Kragten
55595493a9 Update config.yml 2020-10-14 13:57:48 +02:00
Bram Kragten
ad3ff0aba7 Delete FEATURE_REQUEST.md 2020-10-14 12:04:24 +02:00
Bram Kragten
ce48546cef Move feature requests to discussions 2020-10-14 12:04:07 +02:00
HomeAssistant Azure
35b3bc995e [ci skip] Translation update 2020-10-14 00:32:30 +00:00
Donnie
63f60019d1 Add friendly name to quick bar list and filter (#7306)
Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-10-13 17:26:12 -05:00
Philip Allgaier
0d741b6275 Add warning to badge preview in "Panel Mode" (#7331) 2020-10-13 13:49:02 +02:00
uvjustin
0df9080bbb Check if video el still exists before exoplayer resize in ha-hls-player (#7317)
Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-10-13 12:15:30 +02:00
Donnie
ddcf89e6a2 Add tests for fuzzy sequence matcher (#7328) 2020-10-13 11:50:36 +02:00
Donnie
5de225d5d4 Fix: Quick Bar not launching on windows (#7293) 2020-10-13 11:23:18 +02:00
Donnie
5cddb482f1 Fix issue with enter key not executing selected item in quick bar list (#7283) 2020-10-13 11:16:46 +02:00
HomeAssistant Azure
c000d724de [ci skip] Translation update 2020-10-13 00:32:16 +00:00
Philip Allgaier
504055f331 Add documentation link to "customize" dialog (#7321) 2020-10-12 22:09:34 +02:00
Philip Allgaier
7f6880f40e Show disabled entities for a config_entry by default + number of hidden entities (#7300)
Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-10-12 22:00:21 +02:00
Zack Barett
02e4e3c892 Weather Card: add icons instead of text (#7305)
Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-10-12 11:52:17 -05:00
Tobias Kündig
993d73c359 Added entity_id to history graph tooltip (#7310)
Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-10-12 14:12:54 +02:00
Philip Allgaier
97ca0b818e Capitalize first character of attributes (#7313) 2020-10-12 11:43:46 +02:00
Thomas Lovén
44166f76d4 Scriptomation yaml editor (#7273) 2020-10-12 11:26:16 +02:00
Nico Hirsch
557d6d37a1 Fix charts tooltip (#7216) 2020-10-12 11:12:20 +02:00
Paulus Schoutsen
d3ad56a307 Update compatibility and fix polyfills for ES5 (#7298) 2020-10-12 10:48:33 +02:00
Mischa Gruber
0641022ec5 Use translations for alexa (#7301) 2020-10-12 10:28:11 +02:00
Zack Barett
80c7a8473a Fix Entity Toggle not working for Type Row (#7289) 2020-10-12 10:26:23 +02:00
Matt
d9a954ca91 Close notification drawer after dismissing last notification (#7229)
* Close notification drawer after dismissing last

This change adds a listener to any changes of the notifications property once the drawer opens. After the last notification is dismissed, the notification drawer closes automatically, and the listener is removed.

* Use observer instead event for notification change

Using the observer pattern instead subscribing to change events for notification changes simplifies the implementation noticeably.
2020-10-12 10:25:04 +02:00
Donnie
c219f64322 Rename 'quick open dialog' to 'quick bar' (#7286) 2020-10-12 10:18:18 +02:00
HomeAssistant Azure
f7a9ecff21 [ci skip] Translation update 2020-10-12 00:32:48 +00:00
Jonas Bröms
2b3126ae04 hassio-addon-info.ts: Fix spelling (#7311) 2020-10-11 15:21:02 -05:00
Kyle Niewiada
934c227545 Sort profile refresh tokens by 'last used at' date (#4484) (#7199) 2020-10-11 01:17:05 -05:00
Villhellm
cc0515c217 Add help link on automations picker and updated links for scripts and scenes (#7129)
Co-authored-by: Zack Barett <zackbarett@hey.com>
2020-10-11 01:14:22 -05:00
HomeAssistant Azure
55ba75f2bc [ci skip] Translation update 2020-10-11 00:32:41 +00:00
alex6480
c220228566 Add link to documentation for persons (#7205)
Co-authored-by: Zack Barett <zackbarett@hey.com>
2020-10-10 16:19:59 -05:00
Daniel Martin Gonzalez
26b476ab3c Weather card: Add wind speed direction (#7202)
Co-authored-by: Zack Barett <zackbarett@hey.com>
2020-10-10 16:19:40 -05:00
Paulus Schoutsen
b8a67d530f Update translations 2020-10-10 16:41:36 +02:00
HomeAssistant Azure
b08c96d2db [ci skip] Translation update 2020-10-10 00:32:54 +00:00
Philip Allgaier
4773c39a57 Ensure ha-dialog uses correct <a> color (#7255) 2020-10-09 11:29:47 +02:00
Ryan Meek
892843b290 Supervisor disk usage more info (#7247)
Co-authored-by: Joakim Sørensen <ludeeus@gmail.com>
2020-10-09 10:15:55 +02:00
HomeAssistant Azure
733244531e [ci skip] Translation update 2020-10-09 00:32:37 +00:00
Bram Kragten
66633273e2 Fix history chart fetching changes (#7235) 2020-10-08 16:41:25 +02:00
Spencer Williams
0405adcd16 Edit Person button in the Person "more info" dialog (fixes #4706) (#7208)
Co-authored-by: Zack Barett <zackbarett@hey.com>
2020-10-08 16:40:55 +02:00
Ian Richardson
426a7ac8dd Show moon phase icon in state-label-badge (#7194)
Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-10-08 16:37:51 +02:00
Thomas Lovén
3bf6205ff7 Display qr code in tag properties (#7092) 2020-10-08 16:37:17 +02:00
Thomas Lovén
c7f4986e61 Put automation/script editor actions in a menu (#7250)
* Put automation/script editor actions in a menu

* Use disabled property instead of attribute
2020-10-08 16:37:01 +02:00
Gilson Marquato Júnior
0f0a3fdaf7 Add keyboard shortcut to save automation/scene/script (#7207) 2020-10-08 16:24:08 +02:00
Bram Kragten
7d6911b140 Replace mdc circular progress with mwc (#7248) 2020-10-08 16:17:20 +02:00
Jaroslav Hanslík
b8777539d7 Fixed localization of relative time (#7256) 2020-10-08 15:53:59 +02:00
Bram Kragten
b5b1849ab3 Bumped version to 20201001.2 2020-10-08 15:12:18 +02:00
Bram Kragten
0e10c81025 Fix cloud webhooks (#7261) 2020-10-08 15:12:05 +02:00
Joakim Sørensen
5fc0eaef1a Warn about slow snapshot downloads (#7265) 2020-10-08 15:06:42 +02:00
Paulus Schoutsen
113718c3c1 Do not show weather forecast in generated UI (#7251) 2020-10-08 13:29:13 +02:00
Ryan Meek
701bea6cae Fix tab focus issue in entity picker and password form. (#7252) 2020-10-08 13:24:58 +02:00
Donnie
8d516ed12a Add "quick open" style dialog for selecting entities and running reload commands (#7230)
Co-authored-by: Zack Barett <zackbarett@hey.com>
Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-10-08 13:20:57 +02:00
Joakim Sørensen
667c5744f2 Fix ha-bar display issue on firefox (#7263) 2020-10-08 12:29:21 +02:00
Bram Kragten
80b7c840e2 Fix cloud webhooks (#7261) 2020-10-08 10:33:06 +02:00
HomeAssistant Azure
919c86796f [ci skip] Translation update 2020-10-08 00:32:28 +00:00
Bram Kragten
c90c88ecbf Bump typescript (4) and babel (#7249) 2020-10-07 17:58:56 +02:00
Paulus Schoutsen
d9ba0e2c46 Upgrade to Webpack 5 (#6200) 2020-10-07 10:54:42 +02:00
HomeAssistant Azure
45b2fc590b [ci skip] Translation update 2020-10-07 00:32:14 +00:00
Daniel
17ffdb0247 Update script editor panel tooltips (#7204) 2020-10-06 20:44:20 +02:00
J. Nick Koston
c2fba15fc6 Avoid fetching logbook when there will never be entries (#7239) 2020-10-06 11:22:38 -05:00
Bram Kragten
5937be695f Bump Lit, use cache for query (#7245) 2020-10-06 15:55:55 +02:00
Tomasz
a076fcde84 replace ha-icon_button and ha-icon in stack card editor (#7233) 2020-10-06 12:50:06 +02:00
Bram Kragten
ede9931903 Only do 1 token update a time (#7236) 2020-10-06 10:55:12 +02:00
Paul Klingelhuber
722e01608c Fix flickering scrollbar when using progress-spinner (#7237) 2020-10-06 09:47:25 +02:00
HomeAssistant Azure
af926370d6 [ci skip] Translation update 2020-10-06 00:32:53 +00:00
Tomasz
5971aee02e dot notation for path property of ha-svg-icon (#7197) 2020-10-05 19:51:14 +02:00
Bram Kragten
cce7ad449a Set hass when creating card (#7187) 2020-10-05 16:04:25 +02:00
Bram Kragten
d437dd5919 Bumped version to 20201001.1 2020-10-05 16:00:40 +02:00
Bram Kragten
f1980730d2 Fix Apple not showing cards (#7232) 2020-10-05 16:00:27 +02:00
Zack Barett
47773e9cae Fix entities Card toggle (#7192) 2020-10-05 16:00:12 +02:00
Ryan Meek
60969b0916 Styling fixes for hui-masonry-view (#7226) 2020-10-05 15:59:53 +02:00
Zack Barett
ecc7925d03 Warning Element: Fix Overflow in Entity Row (#7193) 2020-10-05 15:59:38 +02:00
Zack Barett
6d3010dcc7 Logbook: Fix for no state obj (#7191) 2020-10-05 15:59:19 +02:00
J. Nick Koston
0164bafbf1 Fix reversal in power icon (#7188) 2020-10-05 15:58:57 +02:00
Bram Kragten
3940606167 Fix Apple not showing cards (#7232) 2020-10-05 15:54:32 +02:00
David Beitey
da9faccada Allow viewport scaling (zooming) of frontend (#7180)
The inclusion of the `user-scalable=no` value in the viewport meta tag
prevented viewport scaling, disabling the ability to zoom the webpage.
This most typically affects mobile devices, given the nature of the
`<meta name="viewport">` tag.

Removing the restriction allows a user to zoom in to see small and fine
detail in the UI -- such as zooming in on particular areas of a home
security camera streams or other images, inspecting detail in state and
other graphs, and so on.

For users with accessibility requirements, such as low vision
conditions, being able to zoom the frontend means they can enlarge UI
elements to suit them (MDN explains several accessibility concerns at
https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta/name#Accessibility_concerns_with_viewport_scaling)

This change has no effect on users that choose not to use it (for
example, only those that engage zooming such as via pinch-to-zoom on
mobile devices will see the change) -- the frontend remains the same
otherwise.  Elements of the frontend that do use pinch-to-zoom (e.g. the
Map) continue to work as expected, with pinches on that screen area
being captured by the map.
2020-10-05 13:29:07 +02:00
Ryan Meek
7e708b3bf7 Use consistent title case for headers in Supervisor (#7227) 2020-10-05 12:05:57 +02:00
Ryan Meek
05630c9896 Use client_id if no client_name in delete dialog (#7228) 2020-10-05 10:24:23 +02:00
HomeAssistant Azure
369c56db73 [ci skip] Translation update 2020-10-05 00:32:49 +00:00
Ryan Meek
9873459169 Styling fixes for hui-masonry-view (#7226) 2020-10-04 15:15:14 -05:00
HomeAssistant Azure
7776b3766b [ci skip] Translation update 2020-10-04 00:32:25 +00:00
HomeAssistant Azure
29c9004654 [ci skip] Translation update 2020-10-03 00:32:26 +00:00
Zack Barett
601c909004 Warning Element: Fix Overflow in Entity Row (#7193) 2020-10-02 11:29:29 -05:00
Tomasz
72aa9a3b62 use ha-svg-icon in more-info-weather (#7196) 2020-10-02 15:12:54 +02:00
Bram Kragten
2ecf7bca97 Set hass when creating card (#7187) 2020-10-02 15:09:27 +02:00
Zack Barett
cbdfaccdb2 Logbook: Fix for no state obj (#7191) 2020-10-02 14:57:42 +02:00
Zack Barett
93d1b9a2d5 Fix entities Card toggle (#7192) 2020-10-02 10:12:55 +02:00
HomeAssistant Azure
bfb5ee794e [ci skip] Translation update 2020-10-02 00:32:24 +00:00
J. Nick Koston
9ae8bd238b Fix reversal in power icon (#7188) 2020-10-01 11:24:13 -05:00
Bram Kragten
98a64e3114 Merge pull request #7185 from home-assistant/dev 2020-10-01 16:05:08 +02:00
Bram Kragten
0171f3aec7 Bumped version to 20201001.0 2020-10-01 15:42:07 +02:00
Zack Barett
2c827bab9a Logbook: fix custom Icon (#7175) 2020-10-01 13:55:27 +02:00
Bram Kragten
ec920093d4 Fix panel view and backgrounds (#7181) 2020-10-01 13:54:54 +02:00
HomeAssistant Azure
4289ff6652 [ci skip] Translation update 2020-10-01 00:32:20 +00:00
Charles Garwood
cd32ef60da Show error if no OZW instances are detected (#7176) 2020-09-30 23:09:48 +02:00
Bram Kragten
6ef3d091e1 Merge pull request #7174 from home-assistant/dev 2020-09-30 17:28:42 +02:00
Bram Kragten
0f59496778 Revert "Bumped version to 20200930.1"
This reverts commit 795b670b3c.
2020-09-30 17:14:44 +02:00
Bram Kragten
795b670b3c Bumped version to 20200930.1 2020-09-30 17:12:07 +02:00
Zack Barett
4ad65e3d69 Set correct type for setConfig (#7173) 2020-09-30 17:08:10 +02:00
Bram Kragten
f48b1150cf Set logbook border to divider color (#7172) 2020-09-30 17:06:52 +02:00
Zack Barett
198db8bc68 Update lovelace.ts 2020-09-30 09:59:09 -05:00
Bram Kragten
3ae447ca44 Fix updating columns (#7171)
Co-authored-by: Zack Barett <arnett.zackary@gmail.com>
2020-09-30 16:57:31 +02:00
Zack Barett
a2ec878ef0 Entities Card: Entity Row Editor (#7134)
Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-09-30 16:20:10 +02:00
Bram Kragten
d43b5d3337 Integrate user management in person (#7170) 2020-09-30 15:22:40 +02:00
uvjustin
11e3503dc2 Change exoplayer payload type (#7010)
Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-09-30 14:00:19 +02:00
Joakim Sørensen
accf44b769 Remove scooter from icon deprecation (#7169) 2020-09-30 11:48:41 +02:00
Bram Kragten
b612c0e0d6 Merge pull request #7168 from home-assistant/dev 2020-09-30 11:45:31 +02:00
Zack Barett
771c7518e6 Custom Lovelace View Layouts (#6557)
Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-09-30 11:06:03 +02:00
Bram Kragten
4f2bad034a Fix safari issues and move scrollable to own container (#7029) 2020-09-30 11:05:45 +02:00
Bram Kragten
0456669aeb Bumped version to 20200930.0 2020-09-30 11:03:49 +02:00
Bram Kragten
2eb71321e7 Merge branch 'master' into dev 2020-09-30 10:59:57 +02:00
Bram Kragten
d2e9e22e4e Add media player to cast app (#7160)
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2020-09-30 10:24:38 +02:00
Zack Barett
e2427c8dce Logbook: Localize Message & Style updates (#6978)
Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-09-30 10:24:04 +02:00
Marc Randolph
26162815c8 Expand error msg on why yaml defined entities can't be changed from UI (#6689) 2020-09-30 10:21:24 +02:00
Alexei Chetroi
d0c86ea2f7 Use ieee for zha.remove service data (#7163) 2020-09-30 10:20:01 +02:00
Zack Barett
4f5b4d4472 Calendar Card: Fix Calendar not updating events on config change (#7165) 2020-09-30 09:54:24 +02:00
HomeAssistant Azure
10d71587e7 [ci skip] Translation update 2020-09-30 00:32:25 +00:00
Zack Barett
9ac777d687 Add default to action editor (#7006)
* Add default to action editor

* only select default when action undefined

* Update action to actuall default when selecting default

* import type

* Tooltip and lokalize

* comments

* wording

* Comments

Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-09-29 22:45:13 +02:00
Bram Kragten
7d1f9f3981 Add LocalizeMixin to state-info 2020-09-29 22:15:44 +02:00
Pawel
a214ab463e Add last_updated tooltip to more info dialog (#6926) 2020-09-29 22:10:29 +02:00
Joakim Sørensen
2f21f6ef8a Add unit_of_measurement to input-number-entity-row (#6965) 2020-09-29 21:55:20 +02:00
Joakim Sørensen
590cd8500d Restore snapshot from onboarding (#7132)
Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-09-29 20:30:25 +02:00
Bashir
f48a28264f More-Info Dialog Logbook Bug Fix (#7152) 2020-09-29 17:04:01 +02:00
Sam Pierce Lolla
51953bce09 Change "persons" to "people" (#7037)
People is the more common word in English
2020-09-29 17:00:41 +02:00
Paulus Schoutsen
c445d4b839 Update supported browsers for Cast 2020-09-29 11:31:03 +02:00
HomeAssistant Azure
9dabce1dd7 [ci skip] Translation update 2020-09-29 00:32:52 +00:00
Martin Hjelmare
6b77f08d86 Hide rpi_power entry during onboarding (#7001)
Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-09-28 23:23:52 +02:00
J. Nick Koston
50e03d41ab Add timeout to dev template renders (#7141) 2020-09-28 08:45:38 -05:00
Bram Kragten
4759c89628 Bring back lazy load more info + helper (#7131) 2020-09-28 13:29:02 +02:00
Kendell R
458ab9b1e0 Add --ha-card-border-width (#7021) 2020-09-28 13:08:57 +02:00
Tomasz
dfb2a7153b Add weekday to time contidion editor (#6848) 2020-09-28 12:28:43 +02:00
Zack Barett
e9141d82f3 Calendar Card: Initial View Editor (#7135) 2020-09-28 11:59:39 +02:00
HomeAssistant Azure
d9f42712e4 [ci skip] Translation update 2020-09-28 00:32:37 +00:00
HomeAssistant Azure
da0658f3d9 [ci skip] Translation update 2020-09-27 00:32:45 +00:00
HomeAssistant Azure
412a5a6d8e [ci skip] Translation update 2020-09-26 00:32:36 +00:00
Zack Barett
9cf9e6edd8 Allow initial View in Calendar Card (#6982) 2020-09-25 09:58:25 +02:00
Joakim Sørensen
28050fc9fb Add upload snapshot dialog (#7115)
Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-09-25 09:55:02 +02:00
HomeAssistant Azure
ea9f227fa8 [ci skip] Translation update 2020-09-25 00:32:27 +00:00
Bram Kragten
05164e90fb Revert lazy loading more info controls (#7123) 2020-09-24 20:36:05 +02:00
Bram Kragten
97156ccf8a Bumped version to 20200918.2 2020-09-24 20:35:25 +02:00
Simone Chemelli
003d55968e Added icon for power on/off (#7124) 2020-09-24 19:37:50 +02:00
Bram Kragten
98dd21b75c Revert lazy loading more info controls (#7123) 2020-09-24 19:31:38 +02:00
Zack Barett
a349e34bc2 Card Editor: Special Row doesn't show warning (#7093) 2020-09-24 11:36:43 -05:00
Shulyaka
245c825cbf Add humidifier entity row (#6213)
Co-authored-by: Zack Barett <zackbarett@hey.com>
2020-09-24 16:45:33 +02:00
rajlaud
4ba6698c4b Support twice daily forecasts in weather-forecast-card (#6065)
Co-authored-by: Zack Arnett <arnett.zackary@gmail.com>
2020-09-24 15:18:38 +02:00
Shulyaka
dac6edea90 Humidifier icon for off state (#7113) 2020-09-24 14:18:30 +02:00
Thomas Lovén
b2e2dbe0c2 Merge ha-paper-slider into ha-slider (#7114) 2020-09-24 14:16:28 +02:00
Simone Chemelli
f822fa0d57 Added icon for timestamp device class (#7117) 2020-09-24 14:03:42 +02:00
Joakim Sørensen
bbee94edba Prevent deletion of the owner user (#7116) 2020-09-24 13:45:07 +02:00
Joakim Sørensen
c39c408332 cloud-webhooks cleanup (#7118) 2020-09-24 13:28:44 +02:00
HomeAssistant Azure
dde4a40e69 [ci skip] Translation update 2020-09-24 00:32:23 +00:00
Bram Kragten
1afa4d2868 Bumped version to 20200918.1 2020-09-23 12:10:59 +02:00
Zack Arnett
d25f371d6c make the browser load 2020-09-23 12:09:25 +02:00
Brenden Crowie
948261d1d1 Corrected password changed message in User panel (#7111) 2020-09-23 12:05:55 +02:00
Zack Barett
04b7749f85 Fix Calendar Title from not removing (#7058) 2020-09-23 12:04:55 +02:00
Zack Barett
8668f0ff5b Progress circle when loading data (#7059) 2020-09-23 11:55:24 +02:00
Brenden Crowie
b7d8ff6c99 Corrected password changed message in User panel (#7111) 2020-09-23 09:52:32 +02:00
HomeAssistant Azure
0894a30f13 [ci skip] Translation update 2020-09-23 00:32:42 +00:00
Joakim Sørensen
bd511887a7 Adds hassio-system-metrics (#7105) 2020-09-22 21:58:31 +02:00
Zack Barett
0304c0eca0 Fix sensor card from not working with detail (#7060)
* Fix sensor card from not working with detail

* comments
2020-09-22 12:06:42 -05:00
Joakim Sørensen
6d5c6e2fbc Show message when there are no add-ons (#7101) 2020-09-22 13:15:06 +02:00
Bram Kragten
e7e7912519 Fix wait for trigger (#7089) 2020-09-22 10:58:43 +02:00
Andrew Rabert
b9c41d8f99 Optimize images (#7091) 2020-09-22 10:49:43 +02:00
Thomas Lovén
25a2264ac3 Use absolute URL for background image in media-control card (#7100) 2020-09-22 10:45:27 +02:00
HomeAssistant Azure
ad64657c74 [ci skip] Translation update 2020-09-22 00:32:23 +00:00
Michael Irigoyen
106f18a73a Update Material Design Icons to v5.6.55 (#7081) 2020-09-21 17:49:25 +02:00
Zack Barett
0fb38140a6 fix media icon diff (#7071) 2020-09-21 17:44:56 +02:00
b3nj1
60133941ae Fix for NOT IN / IN Operators (#7061) 2020-09-21 14:05:28 +02:00
Zack Barett
76db64c073 Fix Calendar Title from not removing (#7058) 2020-09-21 13:27:50 +02:00
Zack Barett
24b390ba03 Add actions to entities config struct (#7063) 2020-09-21 13:26:08 +02:00
Zack Barett
b4d34d9085 Add Hours to show to the cache key (#7072) 2020-09-21 13:15:07 +02:00
Thomas Lovén
f80bea27a9 Fix outline on mouseover in firefox (#7052) 2020-09-21 13:10:33 +02:00
Kendell R
4b846964be Adopt --code-font-family (#6997) 2020-09-21 09:56:42 +02:00
HomeAssistant Azure
e6357e2eef [ci skip] Translation update 2020-09-21 00:32:34 +00:00
Zack Barett
d538b6145f Media Player Browser: Fix child names add tooltip (#7020) 2020-09-20 11:34:56 +02:00
HomeAssistant Azure
229ba3a75c [ci skip] Translation update 2020-09-20 00:32:36 +00:00
HomeAssistant Azure
672b867847 [ci skip] Translation update 2020-09-19 00:32:53 +00:00
Zack Arnett
ca1dacd621 Update to actually set loading 2020-09-18 14:51:02 -05:00
Bram Kragten
26abb4301d Merge pull request #7055 from home-assistant/dev 2020-09-18 17:48:37 +02:00
Bram Kragten
045dac59af Bumped version to 20200918.0 2020-09-18 17:30:02 +02:00
Bram Kragten
1ffa87ea23 Fix duplicate items in sortables (#7053) 2020-09-18 17:28:19 +02:00
Kendell R
357df2bf68 Default colon color to primary text color (#7044)
Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-09-18 17:23:41 +02:00
Bram Kragten
24f3db3e3f Add hold action to buttons (#7051) 2020-09-18 17:20:31 +02:00
Zack Barett
4bb51b0120 fix log copy (#7048) 2020-09-18 12:53:26 +02:00
Bram Kragten
32b9c1eba1 Fix tap to toggle sidebar (#7049) 2020-09-18 12:17:10 +02:00
HomeAssistant Azure
40bffc1d25 [ci skip] Translation update 2020-09-18 00:32:23 +00:00
Bram Kragten
ed2c4e2642 Merge pull request #7034 from home-assistant/dev 2020-09-17 13:26:49 +02:00
Bram Kragten
b3353e220a Bumped version to 20200917.1 2020-09-17 13:02:52 +02:00
Bram Kragten
7dc917babf Adjust local source path (#7033) 2020-09-17 12:59:24 +02:00
Bram Kragten
00dbba04a2 Merge pull request #7032 from home-assistant/dev 2020-09-17 11:06:18 +02:00
Bram Kragten
3efd1a0451 Bumped version to 20200917.0 2020-09-17 10:52:36 +02:00
Bram Kragten
b7d7ca4014 Monkey patch for bug in safari 14 (#7031) 2020-09-17 10:49:37 +02:00
HomeAssistant Azure
854a54e9c6 [ci skip] Translation update 2020-09-17 00:32:34 +00:00
Bram Kragten
4f4edb109f Merge pull request #7028 from home-assistant/dev 2020-09-16 21:58:42 +02:00
Bram Kragten
265bfeb889 Bumped version to 20200916.0 2020-09-16 21:39:35 +02:00
Joakim Sørensen
96110637d9 Remove deprecated icons (#6818) 2020-09-16 21:38:40 +02:00
Bram Kragten
ad34f98e6d Add default actions to button row (#7026) 2020-09-16 21:38:08 +02:00
Bram Kragten
a8a1563586 Fix safari not rendering history graph (#7025) 2020-09-16 17:20:49 +02:00
Zack Barett
9b25a54a47 Fix sidebar from not displaying (#7022)
Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-09-16 11:09:25 +02:00
HomeAssistant Azure
4b8c96c769 [ci skip] Translation update 2020-09-16 00:33:16 +00:00
Tomasz
c62ff85e73 Fix package.json for windows (errors when runing yarn run lint and yarn run format) (#6762) 2020-09-15 21:15:05 +02:00
Bram Kragten
7d5a27ec0f Merge pull request #7019 from home-assistant/dev 2020-09-15 14:59:48 +02:00
Bram Kragten
d6aba040dd revert remove tap action from button stub (#7018) 2020-09-15 14:45:38 +02:00
Bram Kragten
ca4757db5b Bumped version to 20200915.0 2020-09-15 14:44:55 +02:00
Bram Kragten
c917b67cbd Adjust local media error messages (#7017) 2020-09-15 14:43:13 +02:00
Zack Barett
9659c97978 Update Error handling (#7007)
Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-09-15 14:32:02 +02:00
Joakim Sørensen
7d862d6f2a Use helper to generate documentation URL (#7012) 2020-09-15 13:20:43 +02:00
Joakim Sørensen
9c80776d8c Refresh snapshots on first update (#7014) 2020-09-15 13:20:17 +02:00
uvjustin
d5cd288fe8 Temporarily remove exoplayer (#7015) 2020-09-15 13:18:11 +02:00
Joakim Sørensen
239e817779 Rename upgrade -> update (#7013) 2020-09-15 11:15:58 +02:00
Joakim Sørensen
1986215919 Remove version check (#6984) 2020-09-15 11:15:22 +02:00
Franck Nijhof
239f5f1a2f Add snapshot support for new media folder (#6889) 2020-09-15 11:14:25 +02:00
Bram Kragten
3bca32c6d5 Disable cloud expose controls when yaml filter (#6990) 2020-09-15 08:42:09 +02:00
HomeAssistant Azure
183eff745d [ci skip] Translation update 2020-09-15 00:32:23 +00:00
uvjustin
4392d78ff6 Allow ExoPlayer only from more-info-camera (#6974)
Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-09-15 00:26:26 +02:00
Bram Kragten
858196ab53 Update en.json 2020-09-15 00:19:23 +02:00
Bram Kragten
fb75d8c1f2 Fix hex to rgb conversion (#6999) 2020-09-15 00:08:16 +02:00
Bram Kragten
7628569579 Cleanup more info styling (#7004) 2020-09-15 00:07:45 +02:00
Joakim Sørensen
8a9d5f7753 mwc-button -> mwc-icon-button (#6993) 2020-09-15 00:07:11 +02:00
Charles Garwood
cdcccf5089 Pass ozw instance to ozw panel call service buttons (#6992) 2020-09-14 23:50:03 +02:00
Bram Kragten
de95c92e2d Sidebar tweaks (#6994) 2020-09-14 23:46:40 +02:00
Bram Kragten
3030b8d476 Fix input number helper (#6988) 2020-09-14 17:00:56 +02:00
Joakim Sørensen
92ed14c0e4 Merge pull request #6983 from home-assistant/fix-mnuted
Fix muted on video
2020-09-14 11:29:14 +02:00
Bram Kragten
5b94a4de9a Fix muted on video 2020-09-14 11:14:32 +02:00
Kendell R
709112c498 Do safety check before detecting hex value and handle YAML numbers better (#6956)
Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-09-14 09:40:35 +02:00
Kendell R
e465ec8835 Make code editor font family follow theme (#6958) 2020-09-14 09:39:47 +02:00
Kendell R
f6eb31bf9d Use --error-color instead of a fixed color (#6961)
Co-authored-by: Zack Barett <zackbarett@hey.com>
2020-09-14 09:37:59 +02:00
Thomas Lovén
426f939982 Add Execute button to script editor (#6957) 2020-09-14 09:34:59 +02:00
Zack Barett
fab6cebf0d fix hard to read text (#6980) 2020-09-14 09:33:23 +02:00
HomeAssistant Azure
ff081dd0f1 [ci skip] Translation update 2020-09-14 00:32:37 +00:00
Zack Barett
868399ed6f HA Logs: Copy log (#6945) 2020-09-13 15:27:16 -05:00
Kendell R
1bc9b95289 Remove useless "My Title" (#6970) 2020-09-13 21:43:54 +02:00
Kendell R
9af805ab5e Make moon icon more readable (#6969) 2020-09-13 21:43:17 +02:00
HomeAssistant Azure
6b88081360 [ci skip] Translation update 2020-09-13 00:32:53 +00:00
Joakim Sørensen
667c828359 Merge pull request #6963 from home-assistant/dev 2020-09-12 22:17:44 +02:00
Joakim Sørensen
50d37ce4f6 Remove icon slot (#6964) 2020-09-12 21:25:40 +02:00
Joakim Sørensen
af0246cd27 convert ha-refresh-tokens-card (#6962) 2020-09-12 21:05:01 +02:00
Ludeeus
857e4e49d8 Bumped version to 20200912.0 2020-09-12 18:58:49 +00:00
Joakim Sørensen
c1afed7f98 Sort media sources (#6960)
Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-09-12 20:34:34 +02:00
Bram Kragten
5480e54185 Mute stream outside of more info (#6959) 2020-09-12 20:07:22 +02:00
Bram Kragten
99d0a0a6fd Lazy load more info content, split logbook and history (#6936) 2020-09-12 19:39:54 +02:00
Joakim Sørensen
8a998369d6 Add padding to rendered template result (#6954) 2020-09-12 19:15:00 +02:00
Zack Barett
8b490c5047 Media Browser: Use Media Class (#6904)
Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-09-12 11:59:19 -05:00
Bram Kragten
7e70ba6ab2 FIx entities picker (#6951)
Fixes #6947 ?
2020-09-12 18:18:57 +02:00
Bram Kragten
90e09fc384 Add default hold actions (#6952)
Fixes #6942
2020-09-12 18:07:14 +02:00
Bram Kragten
266f2e763d Sort listening entity and domain in template dev tools (#6953) 2020-09-12 17:48:40 +02:00
Bram Kragten
c979cfb912 Fix sidebar for not existing hidden panel (#6944)
Fixes #6940
2020-09-12 12:52:37 +02:00
HomeAssistant Azure
8ee29b1e43 [ci skip] Translation update 2020-09-12 00:32:19 +00:00
Bram Kragten
26fbc07cac Add edit sidebar button to profile (#6943) 2020-09-12 00:04:25 +02:00
Bram Kragten
f01fe65be4 Show title and name for default panels (#6941)
Fixes #6927
2020-09-11 22:42:11 +02:00
Bram Kragten
3fdd6a80f9 Update codeql-analysis.yml 2020-09-11 22:15:08 +02:00
Bram Kragten
da1de8db1d Create codeql-analysis.yml 2020-09-11 22:13:57 +02:00
Ian Richardson
dd1bf7b49d show first visible view on default (#6567)
Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-09-11 22:10:36 +02:00
J. Nick Koston
f18913b5a0 Show which state changed events a template listeners for in dev tools (#6939)
* Show which state changed events a template listeners for in dev tools

* Update src/data/ws-templates.ts

Co-authored-by: Bram Kragten <mail@bramkragten.nl>

* Update src/data/ws-templates.ts

Co-authored-by: Bram Kragten <mail@bramkragten.nl>

* Update src/panels/developer-tools/template/developer-tools-template.ts

Co-authored-by: Bram Kragten <mail@bramkragten.nl>

* Update src/panels/developer-tools/template/developer-tools-template.ts

Co-authored-by: Bram Kragten <mail@bramkragten.nl>

* Update src/panels/developer-tools/template/developer-tools-template.ts

Co-authored-by: Bram Kragten <mail@bramkragten.nl>

* Update src/panels/developer-tools/template/developer-tools-template.ts

Co-authored-by: Bram Kragten <mail@bramkragten.nl>

* merge

* Update src/panels/lovelace/cards/hui-markdown-card.ts

Co-authored-by: Bram Kragten <mail@bramkragten.nl>

* fix string reversal

* Update src/panels/lovelace/cards/hui-markdown-card.ts

Co-authored-by: Bram Kragten <mail@bramkragten.nl>

* Update src/panels/developer-tools/template/developer-tools-template.ts

Co-authored-by: Bram Kragten <mail@bramkragten.nl>

* error to string

* cleanup

* cleanup

* no listeners is probably worth warning about as well

* handle unknown error

* fix error alignment in pre

* fix error alignment in pre

* fix error alignment in pre

* fix error alignment in pre

* reformat

* reformat

* reformat

* fix accidential revert

* Update src/panels/developer-tools/template/developer-tools-template.ts

Co-authored-by: Bram Kragten <mail@bramkragten.nl>

* Update src/panels/developer-tools/template/developer-tools-template.ts

Co-authored-by: Bram Kragten <mail@bramkragten.nl>

* clear error on success

* tweak to not error if listeners are not returned

* Update src/panels/developer-tools/template/developer-tools-template.ts

Co-authored-by: Bram Kragten <mail@bramkragten.nl>

Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-09-11 21:36:39 +02:00
Bram Kragten
a2cd227f1a Remove backpath in ozw (#6937)
Fixes #6934
2020-09-11 17:31:04 +02:00
Bram Kragten
78e64e1f60 Show brigtness slider when light is off (#6935)
Fixes #6928
2020-09-11 17:07:46 +02:00
Joakim Sørensen
23a9b79320 Expand groups in entitry row to check toggle (#6930) 2020-09-11 15:46:41 +02:00
Joakim Sørensen
76394ce341 Use secondary text color for no entries (#6931) 2020-09-11 14:52:12 +02:00
Arielpod
1935df1faa Fixed height of circular progress in history (#6929) 2020-09-11 14:45:47 +02:00
Bram Kragten
5af4ce28ab Restrict long press to header of sidebar (#6933) 2020-09-11 14:42:39 +02:00
Bram Kragten
ce8ee569c4 Check if history and logbook are loaded (#6908) 2020-09-11 10:17:05 +02:00
HomeAssistant Azure
b0508f430e [ci skip] Translation update 2020-09-11 00:32:26 +00:00
Philip Allgaier
2139a80a7a Use proper constants for "unavailable" checks (#6922)
* Use proper constants for "unavailable"

* Additional usage of constants
2020-09-10 22:59:45 +02:00
Bram Kragten
aa4bc2ce03 Make logbook a bit smaller in more info (#6921) 2020-09-10 15:40:54 -05:00
Joakim Sørensen
fa65f84e09 Ignore disconnect codes for shutdown and reboot (#6901)
Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-09-10 22:04:16 +02:00
Bram Kragten
c06357a351 Only show what triggered a change if it wasn't a user (#6919)
* Only show what triggered a change if it wasn't a user

* Update ha-logbook.ts
2020-09-10 21:47:18 +02:00
Joakim Sørensen
092a02a624 Convert ha-long-lived-access-tokens-card (#6917)
Co-authored-by: Zack Barett <arnett.zackary@gmail.com>
Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-09-10 20:51:23 +02:00
J. Nick Koston
b9699f745f Avoid watching all states in the default template (#6918) 2020-09-10 20:50:24 +02:00
Bram Kragten
7fa9f10c30 Don't add space on the bottom when not showing tabs (#6913) 2020-09-10 17:24:01 +02:00
Bram Kragten
7bf0655dae Diable tts inputs when entities is unavailable (#6909)
Fixes #6890
2020-09-10 16:59:12 +02:00
Bram Kragten
96c5fdcbeb Fix some lovelace editors (#6911)
* Fix some lovelace editors

* let -> const
2020-09-10 15:17:32 +02:00
dependabot[bot]
c2e6d40382 Bump http-proxy from 1.17.0 to 1.18.1 (#6914)
Bumps [http-proxy](https://github.com/http-party/node-http-proxy) from 1.17.0 to 1.18.1.
- [Release notes](https://github.com/http-party/node-http-proxy/releases)
- [Changelog](https://github.com/http-party/node-http-proxy/blob/master/CHANGELOG.md)
- [Commits](https://github.com/http-party/node-http-proxy/compare/1.17.0...1.18.1)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2020-09-10 15:16:03 +02:00
Bram Kragten
810d2a1ceb Fix onboarding dark mode (#6910)
Fixes #6882
2020-09-10 13:11:27 +02:00
Bram Kragten
af74f21af9 Dont virtualize logbook in more info (#6907) 2020-09-10 11:12:05 +02:00
HomeAssistant Azure
cdf7558a8e [ci skip] Translation update 2020-09-10 00:32:03 +00:00
Zack Barett
41b86e6c10 Fix media browse item width (#6870) 2020-09-09 17:03:11 -05:00
Joakim Sørensen
085c6f8bdd Merge pull request #6900 from home-assistant/dev
20200909.0
2020-09-09 23:22:01 +02:00
Bram Kragten
3039c678a5 Fix check 2020-09-09 23:08:16 +02:00
Joakim Sørensen
498882d014 Remove mobile_app from generated Lovelace (#6873)
* Hide mobile_app from generated Lovelace

* simplify

* Move to computeDefaultViewStates

* removed -> hidden

* Update src/panels/lovelace/common/generate-lovelace-config.ts

Co-authored-by: Bram Kragten <mail@bramkragten.nl>

* Adjust for Set

* Review comments

Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-09-09 23:01:50 +02:00
Bram Kragten
6c2b8c2abb Bumped version to 20200909.0 2020-09-09 23:00:48 +02:00
Bram Kragten
e955cc4378 Check for hass when setting themes (#6897) 2020-09-09 22:57:44 +02:00
Bram Kragten
eb96dd4803 Handle not defined entities (#6898) 2020-09-09 22:55:43 +02:00
Bram Kragten
e0bdef98a6 Only show history tabs for certain domains (#6895)
Co-authored-by: Zack Barett <arnett.zackary@gmail.com>
2020-09-09 22:10:23 +02:00
Bram Kragten
1130007d14 Fix mjpeg player (#6896) 2020-09-09 22:09:56 +02:00
Bram Kragten
d99d092784 Enlarge touch target delete button (#6893) 2020-09-09 21:02:14 +02:00
Philip Allgaier
e3b18a33ca Disable "Execute" if automation is unavailable (#6866) 2020-09-09 20:49:56 +02:00
Philip Allgaier
1890aab1e6 Color all deletion options consistenly red (#6891)
* Color all deletion options consistenly red

* CSS cleanup

* Color the "Remove Selected" entity config button

* Make eslint happy

* Getting rid of a wayward bracket
2020-09-09 20:48:51 +02:00
Joakim Sørensen
42bf350034 Add ha-user-badge to view visibility editor (#6885) 2020-09-09 17:26:22 +02:00
epenet
5ff52ea113 Update constant name to make it clearer (#6881) 2020-09-09 17:24:13 +02:00
Bram Kragten
432e3ba636 Fix entity drag (#6884) 2020-09-09 17:23:03 +02:00
Zack Barett
f7ab52fe9a Remove sort from frontend for now (#6886) 2020-09-09 17:22:34 +02:00
Bram Kragten
ad8430049d Merge pull request #6878 from home-assistant/external-header-fallback 2020-09-09 17:02:24 +02:00
epenet
2dffe7ba9e Add binary sensor icon for DEVICE_CLASS_BATTERY_CHARGING (#6876)
* Add binary sensor icon for DEVICE_CLASS_BATTERY_CHARGING

* Update icons for DEVICE_CLASS_BATTERY_CHARGING
2020-09-09 13:27:54 +02:00
Ludeeus
5b8f97e0f6 fix missing step 2020-09-09 10:17:57 +00:00
Ludeeus
b3a763a48d Add fallback for renderExternalStepHeader 2020-09-09 10:16:54 +00:00
HomeAssistant Azure
07569f10b5 [ci skip] Translation update 2020-09-09 00:32:22 +00:00
Philip Allgaier
7c5a78a1cf Media player visual improvements (#6817)
Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-09-08 16:36:44 -05:00
Bram Kragten
5cca5bfe86 Merge pull request #6865 from home-assistant/dev 2020-09-08 21:33:22 +02:00
Bram Kragten
0e021e7d7d Bumped version to 20200908.0 2020-09-08 20:58:47 +02:00
Zack Barett
b30ee884a7 Fix for Camera streams that don't support stream (#6863) 2020-09-08 20:57:17 +02:00
J. Nick Koston
869b7c85ca Ensure we pickup all the reloadable domains (#6861) 2020-09-08 20:56:45 +02:00
Zack Barett
4d0d1ed2a1 Undo my commit into dev (#6864) 2020-09-08 20:52:21 +02:00
Zack Arnett
291983e4c3 Merge branch 'dev' of https://github.com/home-assistant/frontend into dev 2020-09-08 10:25:50 -05:00
Bram Kragten
909cff2158 Fix timer entity display (#6849) 2020-09-08 17:01:04 +02:00
Bram Kragten
4e676b1dba Fix light more info (#6855) 2020-09-08 09:17:01 -05:00
Paulus Schoutsen
9149bb9333 Remove deprecated HTML support (#6858) 2020-09-08 15:41:17 +02:00
Bram Kragten
4631994f20 Fix sidebar issues (#6853)
* Fix sidebar issues

* fix navigate in demo
2020-09-08 14:10:34 +02:00
Joakim Sørensen
82e9178320 Add warning class to delete (#6852)
* Add error class to delete

* Apply suggestions from code review

Co-authored-by: Bram Kragten <mail@bramkragten.nl>

* Add missing haStyle

Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-09-08 13:56:51 +02:00
Bram Kragten
67b4688168 Make time wider in logbook (#6854)
Fixes #6842
2020-09-08 13:28:29 +02:00
Joakim Sørensen
6e0e169b6e Add reload for platforms with reload service (#6851) 2020-09-08 13:27:59 +02:00
Zack Barett
100ba8edfa Add allowed options to entities struct so UI editor can still be used (#6823) 2020-09-08 11:37:49 +02:00
Zack Barett
d7448ecb95 Fix Calendar Card in Add Card dialog (#6833) 2020-09-08 09:17:49 +02:00
Zack Barett
8b1801f378 Fix header on media browser in safari (#6838) 2020-09-08 09:14:34 +02:00
Bram Kragten
01a4d57566 Merge pull request #6835 from home-assistant/fix-more-info
Fix More info content from having space on right
2020-09-08 09:13:52 +02:00
Zack Arnett
7edc9064d9 Fix light extra attributes start fix for history 2020-09-07 20:49:53 -05:00
Zack Arnett
30c47a65f4 fix more info content 2020-09-07 19:47:25 -05:00
HomeAssistant Azure
0889f42a00 [ci skip] Translation update 2020-09-08 00:32:39 +00:00
Bram Kragten
4999f1ad51 Merge pull request #6821 from home-assistant/dev 2020-09-07 20:53:40 +02:00
Bram Kragten
f15fbe53cf Bumped version to 20200907.0 2020-09-07 20:40:03 +02:00
Bram Kragten
046f7b5153 Handle media browser errors (#6813)
Co-authored-by: Joakim Sørensen <joasoe@gmail.com>
2020-09-07 20:39:26 +02:00
Zack Barett
5339fe6e06 Updates to correct zindexs on new dialogs (#6816) 2020-09-07 20:11:49 +02:00
Bram Kragten
de7ffb10cb Automation editor tweaks (#6713)
Co-authored-by: Joakim Sørensen <joasoe@gmail.com>
2020-09-07 19:53:10 +02:00
Bram Kragten
80224e6974 Fix onboarding styling (#6819) 2020-09-07 19:48:19 +02:00
Joakim Sørensen
0c7c536f73 Fixes issues with channel toggle (#6812) 2020-09-07 19:30:16 +02:00
Bram Kragten
e5c386c39a Fix white flash in dark mode (#6815) 2020-09-07 18:19:28 +02:00
Zack Barett
bb2462483e Use Sortable to move entities in entities editor (#6810) 2020-09-07 13:47:24 +02:00
Bram Kragten
d5bc498373 Fix action handler bugs (#6811) 2020-09-07 13:41:59 +02:00
Bram Kragten
979b7ae651 Add attention required for config flows in progress (#6808) 2020-09-07 09:09:42 +02:00
HomeAssistant Azure
c73330a466 [ci skip] Translation update 2020-09-07 00:32:51 +00:00
Zack Barett
efe8eca4e3 Media browser updates (#6801) 2020-09-06 18:28:15 -05:00
Sean Mooney
a37aad18b7 Minor typo fix (#6809)
Unkown = Unknown
2020-09-06 23:53:00 +02:00
Philip Allgaier
cfa0c45213 Fix media browser panel title + selection header color (#6807) 2020-09-06 22:17:34 +02:00
Joakim Sørensen
509481ef06 Ignore more proxy disconnect codes (#6805)
Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-09-06 20:29:02 +02:00
Bram Kragten
9aa8175e23 Update ha-logbook.ts 2020-09-06 19:59:29 +02:00
Joakim Sørensen
76f59d99a2 Remove extra > from button (#6804) 2020-09-06 18:29:39 +02:00
Joakim Sørensen
bd66bd6cf0 Add color to hass-error-screen (#6803) 2020-09-06 18:29:22 +02:00
HomeAssistant Azure
d69333dea4 [ci skip] Translation update 2020-09-06 00:32:31 +00:00
Joakim Sørensen
3fd7899b93 Display services as services and not devices (#6798)
* Display services as services and not devices

* remove seperator

* Add comma

* Update src/panels/config/integrations/ha-integration-card.ts

Co-authored-by: Bram Kragten <mail@bramkragten.nl>

* Fix spacing

* Remove check

Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-09-06 02:16:50 +02:00
Pawel
8f8a2cea56 Don't show source select dialog when media player Unavailable. (#6799) 2020-09-05 17:35:34 -05:00
Donnie
879011c8e9 Fix incorrect link to mode documentation in automation editor (#6793) 2020-09-05 15:51:52 +02:00
HomeAssistant Azure
d5794c3e2e [ci skip] Translation update 2020-09-05 00:32:46 +00:00
Bram Kragten
61dbae8b8b Merge pull request #6792 from home-assistant/dev 2020-09-04 23:26:27 +02:00
Charles Garwood
fcc22ba560 Add node details shortcut to OZW device pages (#6791)
Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-09-04 23:14:15 +02:00
Bram Kragten
2adeb88fe6 Bumped version to 20200904.0 2020-09-04 23:02:24 +02:00
Zack Arnett
e63a78bcdb Media Browser Panel (#6772)
Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-09-04 23:01:20 +02:00
Bram Kragten
b065f002a4 Allow local storage decorator to register as property (#6776) 2020-09-04 22:22:55 +02:00
Zack Arnett
349a5f52b1 More Info History: Scrollbar Style (#6790) 2020-09-04 20:56:48 +02:00
Charles Garwood
aa5e20df05 Add basic nodes list & node metadata to OZW config panel (#6719)
Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-09-04 20:55:40 +02:00
Bram Kragten
793b9f238c Tweak card create dialog a bit (#6787) 2020-09-04 18:30:04 +02:00
Philip Allgaier
9c4fdaa4f3 Minor EN text improvements / fixes (#6788) 2020-09-04 16:21:15 +02:00
Bram Kragten
d1a9cb488a Add person badge (#6785)
* Add person badge

* Update src/components/user/ha-person-badge.ts

Co-authored-by: Joakim Sørensen <joasoe@gmail.com>

* Revert screwup by @ludeeus

Co-authored-by: Joakim Sørensen <joasoe@gmail.com>
Co-authored-by: Ludeeus <ludeeus@ludeeus.dev>
2020-09-04 15:54:42 +02:00
Bram Kragten
faee2c3e1b Fix gauge editor (#6783) 2020-09-04 15:18:01 +02:00
Joakim Sørensen
b7845c318e Error extraction and target cleanup (#6782) 2020-09-04 15:08:30 +02:00
Bram Kragten
426a0727c3 Add person picture to user badge (#6784)
* Use person picture ha-user-badge

* Fix missing import

* lint

* User person picture in user-badge

Co-authored-by: Ludeeus <ludeeus@ludeeus.dev>
2020-09-04 14:52:21 +02:00
HomeAssistant Azure
584e509a9c [ci skip] Translation update 2020-09-04 00:32:27 +00:00
Zack Arnett
f3639c2663 Card Picker: Entity Picker (#6693) 2020-09-03 18:28:53 -05:00
Zack Arnett
1431e75f8b More Info: Add History Tab (#6758)
Co-authored-by: J. Nick Koston <nick@koston.org>
2020-09-03 18:28:10 -05:00
Bram Kragten
be8812e0af Add input field to ha form integer when it has a min and max (#6781) 2020-09-03 23:23:10 +02:00
J. Nick Koston
fd6436d490 Update reloadables to include telegram/smtp/mqtt (#6759) 2020-09-03 17:47:08 +02:00
Tomasz
fd1342f9d1 add rpi_gpio translation (#6778) 2020-09-03 16:55:31 +02:00
Joakim Sørensen
5fa0012195 hassio-addon-info feedback (#6734)
* hassio-addon-info feedback

* lint

* init config validation

* better error

* Finish

* sort imports

* Use startup type for watchdog

* Only show error if issue with config

* Adjust
2020-09-03 16:38:59 +02:00
Bram Kragten
9dbb67ef01 Fix shouldHandleRequestSelectedEvent (#6777) 2020-09-03 15:36:15 +02:00
Bram Kragten
d16e2f37d4 Generalize reloadableDomains (#6773)
* Generalize reloadableDomains

* Add back translations
2020-09-03 15:24:43 +02:00
Florian Gareis
d9e8b53ffe Add static color for home and not_home states (#6700)
Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-09-03 14:39:11 +02:00
Bram Kragten
1997e63b7c Fix action handler for touch (#6775)
* Fix action handler for touch

* Console
2020-09-03 14:09:25 +02:00
Joakim Sørensen
6f673359ff hassio-supervisor-log feedback (#6736)
* hassio-supervisor-log feedback

* Update hassio/src/system/hassio-supervisor-log.ts

Co-authored-by: Bram Kragten <mail@bramkragten.nl>

Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-09-03 11:49:10 +02:00
Joakim Sørensen
45dfbff10a hassio-addon-config feedback (#6732)
* hassio-addon-config feedback

* Update hassio/src/addon-view/config/hassio-addon-config.ts

Co-authored-by: Bram Kragten <mail@bramkragten.nl>

* Update hassio/src/addon-view/config/hassio-addon-config.ts

Co-authored-by: Bram Kragten <mail@bramkragten.nl>

Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-09-03 11:03:08 +02:00
Joakim Sørensen
348ee96274 hassio-addon-audio feedback (#6731) 2020-09-03 10:45:18 +02:00
Joakim Sørensen
8edee32e77 hassio-supervisor-info feedback (#6737) 2020-09-03 10:44:53 +02:00
Joakim Sørensen
6d8d263ca6 hassio-addon-network feedback (#6733) 2020-09-03 10:33:45 +02:00
Joakim Sørensen
35923709e2 hassio-snapshots feedback (#6735) 2020-09-03 10:32:21 +02:00
Joakim Sørensen
fdd4d53448 hassio-host-info feedback (#6738)
* hassio-host-info feedback

* lint
2020-09-03 10:27:34 +02:00
HomeAssistant Azure
06419f662e [ci skip] Translation update 2020-09-03 00:32:39 +00:00
Bram Kragten
57763ef032 Fix layout of domain toggler dialog (#6771) 2020-09-02 20:46:38 +02:00
Joakim Sørensen
8e506f7749 Handle connection drops when upgrading (#6767) 2020-09-02 16:21:59 +02:00
Joakim Sørensen
c7f8fe1468 Don't show NM before 115 (#6768) 2020-09-02 15:58:14 +02:00
HomeAssistant Azure
4156a4e36d [ci skip] Translation update 2020-09-02 00:32:17 +00:00
Bram Kragten
ba3cc7df0f Merge pull request #6765 from home-assistant/dev 2020-09-01 23:44:41 +02:00
Bram Kragten
0c212d39eb Bumped version to 20200901.0 2020-09-01 23:31:59 +02:00
Bram Kragten
3bd2e8dbf5 Allow to move and hide sidebar items (#6755) 2020-09-01 23:28:03 +02:00
Bram Kragten
5292119e6e Allow exposing domains in cloud (#6696)
* Allow exposing domains in cloud

https://github.com/home-assistant/core/pull/39216

* Update styles

* Lint

* Apply suggestions from code review

Co-authored-by: Joakim Sørensen <joasoe@gmail.com>

* Comments

* Add translations

* Apply suggestions from code review

Co-authored-by: Joakim Sørensen <joasoe@gmail.com>

Co-authored-by: Joakim Sørensen <joasoe@gmail.com>
2020-09-01 10:23:59 +02:00
HomeAssistant Azure
994a397231 [ci skip] Translation update 2020-09-01 00:32:43 +00:00
Aidan Timson
353b71f803 Stop image from rendering for camera when disconnected and update when reconnected (#6677)
Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-08-31 23:54:57 +02:00
Bram Kragten
eb12afe8cc Media browser tweaks (#6720)
Co-authored-by: Zack Arnett <arnett.zackary@gmail.com>
2020-08-31 23:30:41 +02:00
Joakim Sørensen
4a176f1b43 Call service button feedback (#6752) 2020-08-31 14:38:24 -05:00
Kendell R
8e228baa82 Change spot clean icon (#6750)
* Change spot clean icon

* Switch to target-variant

Co-authored-by: Bram Kragten <mail@bramkragten.nl>

Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-08-31 09:38:32 -05:00
Pascal Roeleven
154b53b0d8 Fix automation modes documentation link (#6754) 2020-08-31 16:04:02 +02:00
Tomasz
a3f680d80c Fix render modifiers - public to protected (#6753) 2020-08-31 14:59:12 +02:00
HomeAssistant Azure
0d75fe6b81 [ci skip] Translation update 2020-08-31 00:32:41 +00:00
Paulus Schoutsen
4070380ded Remove credentials for load module (#6746)
Fixes #6745
2020-08-30 16:42:02 +02:00
Bram Kragten
41195dcef0 Remove animation delay from paper tooltip (#6716) 2020-08-30 10:03:04 +02:00
Joakim Sørensen
78a1e45be2 Dismiss dialog if the user clicks outside it or hit the escape button (#6741)
Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-08-30 09:42:58 +02:00
Joakim Sørensen
d8e88bc58d Ignore 504 errors while updating (#6743) 2020-08-30 09:39:34 +02:00
HomeAssistant Azure
448e9b71b8 [ci skip] Translation update 2020-08-30 00:32:28 +00:00
HomeAssistant Azure
2e178164cc [ci skip] Translation update 2020-08-29 00:32:29 +00:00
Zack Arnett
9f2e3f05a1 Entities & Glance Card: Add state color to editors (#6723) 2020-08-29 00:09:42 +02:00
Joakim Sørensen
405bd29ebd Convert ha-progress-button to lit (#6728) 2020-08-29 00:08:56 +02:00
Bram Kragten
b39b54e0ac Enable filtering on hidden columns (#6717) 2020-08-28 15:50:32 +02:00
J. Nick Koston
119c5c9071 Add generic/generic_thermostat/homekit/min_max/history_stats/trend/ping/filesize to the list of reloadables (#6721)
* Add generic/generic_thermostat/homekit/min_max/history_stats/trend/ping/filesize to the list of reloadables

* Update src/translations/en.json

Co-authored-by: Zack Arnett <arnett.zackary@gmail.com>

* Update src/translations/en.json

Co-authored-by: Zack Arnett <arnett.zackary@gmail.com>

* Update src/translations/en.json

Co-authored-by: Zack Arnett <arnett.zackary@gmail.com>

* Update src/translations/en.json

Co-authored-by: Zack Arnett <arnett.zackary@gmail.com>

Co-authored-by: Zack Arnett <arnett.zackary@gmail.com>
2020-08-28 08:31:54 -05:00
Bram Kragten
7a4c9b128c Allow owner users to change password of any user (#6698)
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2020-08-28 14:30:42 +02:00
Joakim Sørensen
dc5b92030f Use ha-progress-button for update cards (#6725) 2020-08-28 14:16:55 +02:00
Zack Arnett
db0a010d7c Graph Footer: Fix Editor Warning (#6724) 2020-08-28 13:20:23 +02:00
HomeAssistant Azure
a117a19bdf [ci skip] Translation update 2020-08-28 00:32:05 +00:00
dklemm
5f46fdb406 Restored card margin for narrow viewports (#6454) 2020-08-27 16:13:21 +02:00
Joakim Sørensen
f0201de4cc Round with 1 decimal (#6715) 2020-08-27 07:52:57 -05:00
HomeAssistant Azure
6cd51a318b [ci skip] Translation update 2020-08-27 00:32:23 +00:00
Joakim Sørensen
c1a4b27bc7 Adds confirmation dialog to updates (#6709) 2020-08-26 18:13:22 +02:00
Joakim Sørensen
5113222050 Adds ha-bar component (#6708)
* Adds ha-bar component

* Move calculate logic to util

* Add test

* Prove overshot with test

* Remove stuff

* remove unused styles

* commit correct file

* remove root style

* Move to CSS

* html -> svg
2020-08-26 11:08:21 -05:00
Joakim Sørensen
90f12eea5e Limit changing network to systems that have that support (#6711) 2020-08-26 17:41:02 +02:00
Bram Kragten
2403743701 Fix more info media player dropdowns (#6712) 2020-08-26 17:34:00 +02:00
Joakim Sørensen
3e6a759309 Changes to add-on options (#6706) 2020-08-26 15:53:25 +02:00
Joakim Sørensen
35a430e9f4 Add watchdog toggle (#6703) 2020-08-26 15:27:19 +02:00
Bram Kragten
b644f7d23d Theme tweaks (#6701) 2020-08-26 12:38:48 +02:00
Bram Kragten
7702a05464 Filter attributes in more info light (#6707) 2020-08-26 11:13:29 +02:00
J. Nick Koston
493af5fe82 Add rest/command_line/filter/statistics to the list of reloadables (#6705)
* Add rest and command_line to the list of reloadables

* Update src/translations/en.json

* Add the latest ones
2020-08-25 21:33:29 -05:00
HomeAssistant Azure
ac66a59cec [ci skip] Translation update 2020-08-26 00:35:17 +00:00
J. Nick Koston
e10c8faa47 Add UI control to reload a config entry (integration) (#6656)
* Add UI control to reload an integration

* Refactor to move reload above delete and check supports_unload

* Avoid index switch

* Update src/panels/config/integrations/ha-integration-card.ts
2020-08-25 18:00:50 -05:00
Bram Kragten
9b7d17433c Add aria roles to data table (#6702) 2020-08-26 00:38:02 +02:00
J. Nick Koston
a40eb1ff43 Add universal to the list of reloadables (#6697)
* Add universal to the list of reloadables

* Update src/translations/en.json

Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-08-26 00:30:02 +02:00
Joakim Sørensen
04df6c3e9e Supervisor system (#6699)
Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-08-25 23:34:02 +02:00
Bram Kragten
1b970e5a66 No background repeat media browser (#6695) 2020-08-25 14:06:03 +02:00
Bram Kragten
75406c2d01 Add disabled text color to dark mode (#6694) 2020-08-25 11:09:23 +02:00
HomeAssistant Azure
64d3511fbc [ci skip] Translation update 2020-08-25 00:32:10 +00:00
Paulus Schoutsen
c610f54977 Add methods for new trigger/condition commands (#6675) 2020-08-24 23:02:04 +02:00
Bram Kragten
090ad34f78 Merge pull request #6692 from home-assistant/dev 2020-08-24 20:48:44 +02:00
Bram Kragten
358c5205d2 Fix calendar (#6691) 2020-08-24 13:32:55 -05:00
Bram Kragten
5503cd0589 Bumped version to 20200824.0 2020-08-24 20:01:54 +02:00
Zack Arnett
dae42b1bd9 Calendar Card: New Card (#5813)
Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-08-24 19:59:50 +02:00
fabiocastagnino
06a25284e8 Add icons for new sensor device classes (#6193)
Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-08-24 19:50:47 +02:00
J. Nick Koston
5989560f15 Show the entity id that first used the context in logbook 2020-08-24 12:45:04 -05:00
J. Nick Koston
63c995e5da cleanups 2020-08-24 12:24:24 -05:00
Charles Garwood
dc5607f554 Beginning pages for OZW Config Panel (#6670) 2020-08-24 19:21:25 +02:00
J. Nick Koston
d49302c032 typo 2020-08-24 12:20:48 -05:00
J. Nick Koston
63fef9bd4b Adjust to handle service calls and described events 2020-08-24 11:46:16 -05:00
Bram Kragten
6599351d45 Replace confirm with confirmation dialogs in snapshots (#6690) 2020-08-24 18:36:47 +02:00
Joakim Sørensen
47e9531972 Use media query for darkmode on login and onboarding (#6625)
Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-08-24 18:29:16 +02:00
Bram Kragten
3ba31483f4 Convert dev tools template to Lit and store last used template (#6669) 2020-08-24 18:26:41 +02:00
Bram Kragten
f4ca94f2e1 Move click listener (#6688)
* Move click listener

* Move label
2020-08-24 10:52:04 -05:00
Zack Arnett
67f9be2b77 Media Browser: Fix dark mode (#6687) 2020-08-24 17:31:16 +02:00
Bram Kragten
e2fd155e1b Fix updating history card + only update when entity changed (#6647) 2020-08-24 17:03:42 +02:00
Bram Kragten
931068dede Use default panel if panel in settings doesn't exist (#6667) 2020-08-24 16:49:32 +02:00
Bram Kragten
bc4c9cc40d Adjust tags just scanned time display (#6663) 2020-08-24 16:48:00 +02:00
Bram Kragten
294665fbe8 Fix time format in charts (#6671) 2020-08-24 16:45:30 +02:00
Bram Kragten
e8f6a79c8f Fix create write tag (#6679) 2020-08-24 16:34:55 +02:00
Zack Arnett
5fd8b5c5b9 Media browser (#6672)
* Add media browser stub

* Updates from first night

* Visual updates

* First pr push?

* Updates

* Add to dialog Havent tested it idk where to put it

* comments - Add overflow menu

* change to flex end

* lint

* Refresh the previous item

* simplify child render logic

* Add show media browser dialog func (thanks bram)

* Add to more info dialog. Not perfect. Visual bugs

* Change play/picked event to callback

* Don't use data table

* Move play button

* Fix dialog getting too wide

* Style tweaks

* tweaks

* Fix padding mobile

* Update ha-media-player-browse.ts

* Remove Color on folder icon

* Leave dialog open on play

* Move more info icon

* Remove unneeded files

Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-08-24 09:31:25 -05:00
Bram Kragten
226b2a73af Update mocha and eslint-import-resolver-webpack (#6497) 2020-08-24 14:35:50 +02:00
J. Nick Koston
42d421a6fc Add template to the list of reloadables (#6673)
Make reloadable check to see if the service
is loaded instead of the component
2020-08-24 14:32:52 +02:00
Joakim Sørensen
a90203f256 Use secure cookie if https (#6644) 2020-08-24 14:21:57 +02:00
Aidan Timson
c3ef79caa9 Improve messaging of empty device info cards (#6628) 2020-08-24 14:20:32 +02:00
Joakim Sørensen
1439afcd9c Update MDI to 5.5.55 (#6598) 2020-08-24 13:59:31 +02:00
uvjustin
d263b19910 Play HLS with Exoplayer on Android (#6606) 2020-08-24 11:50:40 +02:00
HomeAssistant Azure
1e477226ea [ci skip] Translation update 2020-08-24 00:32:13 +00:00
J. Nick Koston
026fc1d2e3 Show the entity id that first used the context in logbook 2020-08-23 17:00:27 -05:00
HomeAssistant Azure
2d4bd9857a [ci skip] Translation update 2020-08-23 00:32:24 +00:00
HomeAssistant Azure
8f48f5b45c [ci skip] Translation update 2020-08-22 00:32:43 +00:00
Bram Kragten
22210b7400 Clarify renaming entity ids (#6668) 2020-08-21 16:25:33 +02:00
HomeAssistant Azure
7d05855ee0 [ci skip] Translation update 2020-08-21 00:32:24 +00:00
Bram Kragten
b2460cbc3d Merge pull request #6662 from home-assistant/dev 2020-08-20 16:10:18 +02:00
Bram Kragten
4561957e56 Merge branch 'master' into dev 2020-08-20 15:53:59 +02:00
Bram Kragten
3367fadc3a Bumped version to 20200820.0 2020-08-20 15:52:06 +02:00
Paulus Schoutsen
d7e409b042 Add tag config panel (#6601)
Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-08-20 15:34:52 +02:00
HomeAssistant Azure
a0b28e8ad1 [ci skip] Translation update 2020-08-20 00:32:18 +00:00
Paulus Schoutsen
f928a8e58e Add picture upload component (#6646)
Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-08-19 11:33:18 +02:00
Bram Kragten
0bc4b3d0fa Adds theming and dark mode to code editor (#6547) 2020-08-19 11:04:05 +02:00
Zack Arnett
e352768388 Save Config Dialog - Convert to MWC (#6590) 2020-08-19 11:02:21 +02:00
HomeAssistant Azure
6835b73e49 [ci skip] Translation update 2020-08-19 00:33:28 +00:00
HomeAssistant Azure
f1503f871b [ci skip] Translation update 2020-08-18 00:32:11 +00:00
Charles Garwood
c4d8aba5c8 Add OZW Refresh Node Dialog (#6530) 2020-08-17 19:54:03 +02:00
Zack Arnett
39f24c41ad Media More Info: Convert to Lit Element (#6619)
* lit element

* Remove Properties

* review comments

* This should be somewhat better.
2020-08-17 11:24:19 -05:00
Zack Arnett
21644ec889 Light More Info: Convert to Lit Element (#6592)
* Update more info

* Remove is unavailable

* Remove divs

* updates

* Update src/dialogs/more-info/controls/more-info-light.ts

* Update src/dialogs/more-info/controls/more-info-light.ts

Co-authored-by: Bram Kragten <mail@bramkragten.nl>

Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-08-17 09:07:29 -05:00
Joakim Sørensen
613470b44d Set SameSite=Strict attribute for ingress_session (#6556) 2020-08-17 15:16:28 +02:00
David F. Mulcahey
6c918e346b Fix navigation after ZHA device removal (#6638) 2020-08-17 14:17:18 +02:00
Joakim Sørensen
bce8539572 Add style to combobox (#6630) 2020-08-17 12:00:06 +02:00
HomeAssistant Azure
aab86e00ec [ci skip] Translation update 2020-08-17 00:32:14 +00:00
gibwar
2a58726caf Fix exceptional weither icon size (#6425) (#6634)
The weather icon for the `exceptional` state uses a different DOM layout
than the other icons, using a `.weather-icon` class that sets the size
to 64px (52px on narrow). This updates the `forecast-icon > *` class to
set the correct variable to match the expected `40px` and works on all
sizes from `veryverynarrow` to normal.
2020-08-16 17:51:50 -05:00
HomeAssistant Azure
4163b35b32 [ci skip] Translation update 2020-08-15 00:32:27 +00:00
HomeAssistant Azure
9c6dac8180 [ci skip] Translation update 2020-08-14 00:32:15 +00:00
HomeAssistant Azure
80fc37724b [ci skip] Translation update 2020-08-13 00:32:21 +00:00
Joakim Sørensen
77b25f5132 Merge pull request #6603 from home-assistant/supervisor-theme-legacy-backendselected 2020-08-12 15:40:48 +02:00
Joakim Sørensen
684f098450 Merge pull request #6597 from home-assistant/show-if-healthy 2020-08-12 15:40:18 +02:00
Ludeeus
d09f74d30f console.die 2020-08-12 13:15:39 +00:00
Ludeeus
3d973b112e Use default as fallback theme for older versions 2020-08-12 13:15:24 +00:00
Ludeeus
96986164a4 Show error if not supported 2020-08-11 14:12:38 +00:00
Joakim Sørensen
78152c20a9 Merge pull request #6596 from home-assistant/202008110 2020-08-11 14:49:12 +02:00
Ludeeus
2bb64e9e2f Use supported instead 2020-08-11 12:28:35 +00:00
Ludeeus
746844dfc8 Only show diagnostics if healthy 2020-08-11 12:15:08 +00:00
Joakim Sørensen
41b613a2d7 Fix wrapping for diagnostics row (#6595) 2020-08-11 14:01:20 +02:00
Ludeeus
3b3aeea224 Bumped version to 20200811.0 2020-08-11 12:00:48 +00:00
Joakim Sørensen
71c592a0ce Use primary-background-color when it exists (#6594) 2020-08-11 12:00:36 +00:00
Joakim Sørensen
15193fcf5f Set header and tab color (#6582) 2020-08-11 12:00:14 +00:00
Joakim Sørensen
a31f53395f Set min width (#6583) 2020-08-11 11:59:27 +00:00
Ludeeus
283b134d84 Bumped version to 20200811.0 2020-08-11 11:57:03 +00:00
Joakim Sørensen
271eb614cd Use primary-background-color when it exists (#6594) 2020-08-11 13:22:46 +02:00
HomeAssistant Azure
16167bef07 [ci skip] Translation update 2020-08-11 00:32:11 +00:00
Joakim Sørensen
1eac9fa1cd Set header and tab color (#6582) 2020-08-10 16:42:55 +02:00
Joakim Sørensen
7f819f0020 Set min width (#6583) 2020-08-10 16:23:14 +02:00
Bram Kragten
dec1f99a5f Fix hassio panel dark mode (#6569) 2020-08-10 09:36:01 +02:00
HomeAssistant Azure
c705e74fc8 [ci skip] Translation update 2020-08-10 00:32:35 +00:00
HomeAssistant Azure
01df10f93e [ci skip] Translation update 2020-08-09 00:32:33 +00:00
HomeAssistant Azure
9877f08cf4 [ci skip] Translation update 2020-08-08 00:32:34 +00:00
Joakim Sørensen
3dc4b1d775 Merge to master for 20200807.1 (#6566)
* Reorder to not break jinja templates (#6564)

* Bumped version to 20200807.1
2020-08-07 16:36:49 +02:00
Ludeeus
02791c51ae Bumped version to 20200807.1 2020-08-07 14:00:10 +00:00
Joakim Sørensen
49683326e6 Reorder to not break jinja templates (#6564) 2020-08-07 15:59:22 +02:00
Joakim Sørensen
947773a82e Add diagnostics toggle (#6525)
* Add diagnostics toggle

* No need to check

* Expected blank line between class members

* Mimic the profile page

* Move settings-row to components and use button

* Update src/components/ha-settings-row.ts

Co-authored-by: Bram Kragten <mail@bramkragten.nl>

Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-08-07 08:47:25 -05:00
Zack Arnett
2a229df624 Change English/default naming of configure ui (#6555) 2020-08-07 08:42:38 -05:00
Bram Kragten
e605ad5e46 Merge pull request #6562 from home-assistant/dev
Merge dev to master for 20200807.0
2020-08-07 14:20:30 +02:00
Ludeeus
0d4f43472b Bumped version to 20200807.0 2020-08-07 10:47:19 +00:00
Bram Kragten
b30e467685 Fix z-index light and thermostat more info button (#6561) 2020-08-07 11:43:20 +02:00
HomeAssistant Azure
a56c0b52d5 [ci skip] Translation update 2020-08-07 00:32:18 +00:00
Bram Kragten
c17ebfd279 Show small header on ingress panels when the sidebar is hidden (#6488) 2020-08-06 23:42:10 +02:00
Joakim Sørensen
5400b1da96 Fixes display issues with longer dates (#6540)
* Fixes display issues with longer dates

* review

* Remove size
2020-08-06 19:42:27 +02:00
Joakim Sørensen
69f4a618b2 Fix color and overlap in close dialog header (#6539)
* Fix color and overlap in close dialog header

* Use haStyleDialog instead
2020-08-06 17:51:41 +02:00
Joakim Sørensen
16b8b6698c Fixes display issues with the new darkmode (#6532)
Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-08-06 17:51:14 +02:00
Joakim Sørensen
b29a700d40 Only show stage bage if not stable (#6546) 2020-08-06 17:50:46 +02:00
Bram Kragten
bbb1468439 Mark card editor dirty on prefilled create (#6545) 2020-08-06 15:18:08 +02:00
Joakim Sørensen
72f9d6a8d3 Open more info on top (#6543) 2020-08-06 14:28:53 +02:00
Joakim Sørensen
3ec8da1f17 Fix theme loading on earlier versions (#6521) 2020-08-06 14:04:22 +02:00
Joakim Sørensen
dbea3848df Remove !important from h2 (#6541) 2020-08-06 14:02:49 +02:00
HomeAssistant Azure
33871435e1 [ci skip] Translation update 2020-08-06 00:32:16 +00:00
Bram Kragten
f1f22b43dc Merge pull request #6524 from home-assistant/dev
20200805.0
2020-08-05 13:11:08 +02:00
Ludeeus
2fb9a56e0b Bumped version to 20200805.0 2020-08-05 10:49:41 +00:00
Joakim Sørensen
14e8f66ed7 Fix allignment in integration badge during onboarding (#6523) 2020-08-05 12:20:32 +02:00
HomeAssistant Azure
e6f5072462 [ci skip] Translation update 2020-08-05 00:32:16 +00:00
Bram Kragten
a64f50fa72 Bump mwc to 0.18 (#6517) 2020-08-04 20:52:05 +02:00
Bram Kragten
bb5f6e88d0 Close entity registry dialog when navigation away (#6511) 2020-08-04 11:13:55 +02:00
Bram Kragten
6991403203 Fix location editor in onboarding (#6512) 2020-08-03 23:26:41 +02:00
Bram Kragten
410bd22f8a Punycode client id on auth page (#6513) 2020-08-03 22:44:20 +02:00
Charles Garwood
b81d823602 Add Z-Wave device info to OZW device pages (#6508)
* Add basic device info to devices page for OZW devices

* Remove unused HassEntity

* connection -> identifier

* async fetch

* Cleanup fetch call
2020-08-03 18:53:41 +02:00
Bram Kragten
bd5115f9aa Merge pull request #6510 from home-assistant/dev 2020-08-03 16:48:29 +02:00
Bram Kragten
7bcbed80d7 Bumped version to 20200803.0 2020-08-03 16:35:40 +02:00
Bram Kragten
8fb62ebf5f Fix gauge when safari is zoomed (#6492)
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2020-08-03 16:32:23 +02:00
Bram Kragten
209dd9923f Allow to select a different dashboard when adding entities / moving cards (#6478) 2020-08-03 16:29:26 +02:00
Charles Garwood
c75207e391 Add identifiers to DeviceRegistryEntry (#6507) 2020-08-03 15:35:52 +02:00
HomeAssistant Azure
d957f36927 [ci skip] Translation update 2020-08-03 00:33:23 +00:00
Bram Kragten
9ac459b6d9 Update lint rules (#6490) 2020-08-03 02:11:28 +02:00
Bram Kragten
e08b2817ba Move view edit dialog to mwc (#6479) 2020-08-03 02:08:05 +02:00
Bram Kragten
4ca13c409b Introduce dark mode and primary color picker (#6430)
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2020-08-03 02:07:12 +02:00
Bram Kragten
0d515e2303 Replace createValidEntityId with slugify (#6505) 2020-08-03 02:06:08 +02:00
Bram Kragten
a2153bc6aa Add UI for new script functions (#6491) 2020-08-02 20:56:26 +02:00
HomeAssistant Azure
ca171afe6f [ci skip] Translation update 2020-08-02 00:33:15 +00:00
HomeAssistant Azure
bf4e97bd48 [ci skip] Translation update 2020-08-01 00:33:31 +00:00
dependabot[bot]
8c59a12a03 Bump elliptic from 6.4.1 to 6.5.3 (#6502)
Bumps [elliptic](https://github.com/indutny/elliptic) from 6.4.1 to 6.5.3.
- [Release notes](https://github.com/indutny/elliptic/releases)
- [Commits](https://github.com/indutny/elliptic/compare/v6.4.1...v6.5.3)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2020-07-31 20:54:52 +02:00
Bram Kragten
89569355be Don't add undefined values to extra data in device automations (#6499) 2020-07-31 19:07:11 +02:00
MeIchthys
3a41b3bdcf standardize config menu descriptions (#6495) 2020-07-31 11:27:38 +02:00
HomeAssistant Azure
12bd7037b3 [ci skip] Translation update 2020-07-31 00:33:23 +00:00
Bram Kragten
ca4f573be0 Add support for safe area insets (#6473) 2020-07-30 18:27:27 +02:00
Andrey Kupreychik
07fceeab5a Using entity_picture_local for entity card and badge (#6489)
Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-07-30 16:33:08 +02:00
HomeAssistant Azure
3aa376e912 [ci skip] Translation update 2020-07-30 00:34:00 +00:00
Michael Irigoyen
92d30a8896 Update Material Design Icons to v5.4.55 (#6485) 2020-07-29 16:19:45 +02:00
Bram Kragten
83876fb9da Nullish coalescing entity card (#6484)
Fixes #6483
2020-07-29 08:40:28 -05:00
HomeAssistant Azure
29bdf7877c [ci skip] Translation update 2020-07-29 00:32:28 +00:00
Bram Kragten
29199e2782 Fix scroll to top dev tools (#6455)
Fixes https://github.com/home-assistant/frontend/issues/6448
2020-07-28 11:16:47 +02:00
Bram Kragten
68e1378615 Fix automation/scripts dirty on start edit (#6474) 2020-07-28 11:12:58 +02:00
HomeAssistant Azure
cf7efb5bfc [ci skip] Translation update 2020-07-28 00:32:36 +00:00
Bram Kragten
e8254f9aae Merge pull request #6411 from home-assistant/dev 2020-07-16 18:38:27 +02:00
Bram Kragten
2e198af8c3 Merge pull request #6399 from home-assistant/dev 2020-07-15 20:19:11 +02:00
Bram Kragten
ec36d396d9 Merge pull request #6396 from home-assistant/dev 2020-07-15 16:23:49 +02:00
Bram Kragten
78914091b1 Merge pull request #6389 from home-assistant/dev 2020-07-14 23:53:51 +02:00
706 changed files with 51510 additions and 14462 deletions

View File

@@ -1,7 +1,7 @@
{
"extends": [
"plugin:@typescript-eslint/recommended",
"airbnb-typescript/base",
"plugin:@typescript-eslint/recommended",
"plugin:wc/recommended",
"plugin:lit/recommended",
"prettier",
@@ -45,16 +45,16 @@
"func-names": 0,
"prefer-arrow-callback": 0,
"no-underscore-dangle": 0,
"no-var": 0,
"strict": 0,
"prefer-spread": 0,
"no-plusplus": 0,
"no-bitwise": 0,
"no-bitwise": 2,
"comma-dangle": 0,
"vars-on-top": 0,
"no-continue": 0,
"no-param-reassign": 0,
"no-multi-assign": 0,
"no-console": 2,
"radix": 0,
"no-alert": 0,
"no-return-await": 0,
@@ -75,13 +75,16 @@
"object-curly-newline": 0,
"default-case": 0,
"wc/no-self-class": 0,
"no-shadow": 0,
"@typescript-eslint/camelcase": 0,
"@typescript-eslint/ban-ts-ignore": 0,
"@typescript-eslint/ban-ts-comment": 0,
"@typescript-eslint/no-use-before-define": 0,
"@typescript-eslint/no-non-null-assertion": 0,
"@typescript-eslint/no-explicit-any": 0,
"@typescript-eslint/no-unused-vars": 0,
"@typescript-eslint/explicit-function-return-type": 0
"@typescript-eslint/explicit-function-return-type": 0,
"@typescript-eslint/explicit-module-boundary-types": 0,
"@typescript-eslint/no-shadow": ["error"]
},
"plugins": ["disable", "import", "lit", "prettier", "@typescript-eslint"],
"processor": "disable/disable"

View File

@@ -1,26 +0,0 @@
---
name: Request a feature for the UI, Frontend or Lovelace
about: Request an new feature for the Home Assistant frontend.
labels: feature request
---
<!--
DO NOT DELETE ANY TEXT from this template!
Otherwise, your request may be closed without comment.
-->
## The request
<!--
Describe to our maintainers, the feature you would like to be added.
Please be clear and concise and, if possible, provide a screenshot or mockup.
-->
## The alternatives
<!--
Are you currently using, or have you considered alternatives?
If so, could you please describe those?
-->
## Additional information

View File

@@ -1,5 +1,8 @@
blank_issues_enabled: false
contact_links:
- name: Request a feature for the UI, Frontend or Lovelace
url: https://github.com/home-assistant/frontend/discussions/category_choices
about: Request an new feature for the Home Assistant frontend.
- name: Report a bug that is NOT related to the UI, Frontend or Lovelace
url: https://github.com/home-assistant/core/issues
about: This is the issue tracker for our frontend. Please report other issues with the backend repository.

60
.github/workflows/codeql-analysis.yml vendored Normal file
View File

@@ -0,0 +1,60 @@
name: "CodeQL"
on:
push:
branches: [dev, master]
pull_request:
# The branches below must be a subset of the branches above
branches: [dev]
jobs:
analyze:
name: Analyze
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
# Override automatic language detection by changing the below list
# Supported options are ['csharp', 'cpp', 'go', 'java', 'javascript', 'python']
language: ['javascript']
# Learn more...
# https://docs.github.com/en/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#overriding-automatic-language-detection
steps:
- name: Checkout repository
uses: actions/checkout@v2
with:
# We must fetch at least the immediate parents so that if this is
# a pull request then we can checkout the head.
fetch-depth: 2
# If this run was triggered by a pull request event, then checkout
# the head of the pull request instead of the merge commit.
- run: git checkout HEAD^2
if: ${{ github.event_name == 'pull_request' }}
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v1
with:
languages: ${{ matrix.language }}
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
uses: github/codeql-action/autobuild@v1
# Command-line programs to run using the OS shell.
# 📚 https://git.io/JvXDl
# ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
# and modify them (or add more) to build your code if your project
# uses a compiled language
#- run: |
# make bootstrap
# make release
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v1

View File

@@ -26,4 +26,4 @@ A complete guide can be found at the following [link](https://www.home-assistant
Home Assistant is open-source and Apache 2 licensed. Feel free to browse the repository, learn and reuse parts in your own projects.
We use [BrowserStack](https://www.browserstack.com) to test Home Assistant on a large variation of devices.
We use [BrowserStack](https://www.browserstack.com) to test Home Assistant on a large variety of devices.

View File

@@ -52,7 +52,14 @@ module.exports.terserOptions = (latestBuild) => ({
module.exports.babelOptions = ({ latestBuild }) => ({
babelrc: false,
presets: [
!latestBuild && [require("@babel/preset-env").default, { modules: false }],
!latestBuild && [
require("@babel/preset-env").default,
{
modules: false,
useBuiltIns: "entry",
corejs: "3.6",
},
],
require("@babel/preset-typescript").default,
].filter(Boolean),
plugins: [
@@ -62,7 +69,9 @@ module.exports.babelOptions = ({ latestBuild }) => ({
{ loose: true, useBuiltIns: true },
],
// Only support the syntax, Webpack will handle it.
"@babel/syntax-dynamic-import",
"@babel/plugin-syntax-import-meta",
"@babel/plugin-syntax-dynamic-import",
"@babel/plugin-syntax-top-level-await",
"@babel/plugin-proposal-optional-chaining",
"@babel/plugin-proposal-nullish-coalescing-operator",
[

View File

@@ -1,263 +1 @@
[
{
"path": "M17.5,15.61C17.33,15.37 9.53,5.4 9.27,5.08C9,4.75 9.08,4.65 9.13,4.59C9.22,4.5 9.36,4.5 9.93,4.5C10.26,4.5 13.59,4.5 13.94,4.47C14.66,4.47 14.78,4.53 14.85,4.56C14.93,4.58 15.13,4.75 15.26,4.92C15.33,5 22.32,13.36 22.39,13.45C22.46,13.54 22.59,13.69 22.67,13.84C22.76,14 22.77,14.18 22.64,14.25C22.56,14.3 18.7,15.89 18.59,15.93C18.5,16 18.27,16.06 18.11,16.04C18,16 17.77,15.92 17.5,15.61M21.47,15.42L21.75,15.47C21.75,15.47 22.68,15.65 22.77,15.67C22.87,15.69 22.96,15.76 22.95,15.79C22.94,15.87 22.9,15.91 22.83,15.95C22.77,16 18.58,18.58 18.5,18.62C18.43,18.66 18.33,18.72 18.11,18.75C17.7,18.83 16.91,18.61 16.66,18.56C16.41,18.5 6.15,16.23 6.06,16.2C5.97,16.17 5.91,16.16 5.9,16.08C5.89,15.94 6.11,15.88 6.28,15.81C6.46,15.75 11.28,14 11.45,13.93C11.62,13.86 11.84,13.84 11.95,13.83C12.06,13.82 12.73,13.93 13.03,13.97C13.34,14 14.2,14.15 14.2,14.15L16.16,16.7C16.5,17.09 16.72,17.25 17,17.28C17.15,17.29 17.31,17.25 17.42,17.2C17.5,17.16 21.47,15.42 21.47,15.42M10.25,9.18L11.96,11.37L12,11.45V11.5C11.96,11.54 8.93,14.32 8.91,14.35L5.72,15.5C5.72,15.5 5.63,15.55 5.58,15.58C5.53,15.61 5.47,15.67 5.5,15.82C5.5,15.87 5.5,16.59 5.5,16.79L1.56,18.04C1.37,18.1 1,18.23 0.95,18.19C0.88,18.14 0.97,18.03 1,17.97C1.06,17.91 9.08,10 9.39,9.7C9.84,9.24 10.25,9.18 10.25,9.18",
"name": "accusoft"
},
{
"path": "M4.94,11.12C5.23,11.12 5.5,11.16 5.76,11.23C5.77,9.09 7.5,7.35 9.65,7.35C11.27,7.35 12.67,8.35 13.24,9.77C13.83,9 14.74,8.53 15.76,8.53C17.5,8.53 18.94,9.95 18.94,11.71C18.94,11.95 18.91,12.2 18.86,12.43C19.1,12.34 19.37,12.29 19.65,12.29C20.95,12.29 22,13.35 22,14.65C22,15.95 20.95,17 19.65,17C18.35,17 6.36,17 4.94,17C3.32,17 2,15.68 2,14.06C2,12.43 3.32,11.12 4.94,11.12Z",
"name": "amazon-drive"
},
{
"path": "M8,11.5A1.25,1.25 0 0,0 6.75,12.75A1.25,1.25 0 0,0 8,14A1.25,1.25 0 0,0 9.25,12.75A1.25,1.25 0 0,0 8,11.5M16,11.5A1.25,1.25 0 0,0 14.75,12.75A1.25,1.25 0 0,0 16,14A1.25,1.25 0 0,0 17.25,12.75A1.25,1.25 0 0,0 16,11.5M12,7C13.5,7 14.9,7.33 16.18,7.91L18.34,5.75C18.73,5.36 19.36,5.36 19.75,5.75C20.14,6.14 20.14,6.77 19.75,7.16L17.95,8.96C20.41,10.79 22,13.71 22,17H2C2,13.71 3.59,10.79 6.05,8.96L4.25,7.16C3.86,6.77 3.86,6.14 4.25,5.75C4.64,5.36 5.27,5.36 5.66,5.75L7.82,7.91C9.1,7.33 10.5,7 12,7Z",
"name": "android-head"
},
{
"path": "M2,16.25C2,16.25 4,3.75 12,3.75C20,3.75 22,16.25 22,16.25C22,16.25 20,20.25 12,20.25C4,20.25 2,16.25 2,16.25M3.35,15.65C3.35,15.65 4.3,19 12,19C17,19 20,17.8 20.65,15.85C21.3,13.9 15.65,7.6 14.65,7.6C13.65,7.6 11.2,12 10.45,12C8.45,12 8.9,10 7.15,10C5.4,10 3.35,15.65 3.35,15.65Z",
"name": "basecamp"
},
{
"path": "M7,12A5,5 0 0,0 12,17A5,5 0 0,0 17,12A5,5 0 0,0 12,7C10.87,7 9.84,7.37 9,8V2.46C9.95,2.16 10.95,2 12,2A10,10 0 0,1 22,12A10,10 0 0,1 12,22A10,10 0 0,1 2,12C2,8.3 4,5.07 7,3.34V12M12,9A3,3 0 0,1 15,12A3,3 0 0,1 12,15A3,3 0 0,1 9,12A3,3 0 0,1 12,9Z",
"name": "beats"
},
{
"path": "M19.58,12.27C19.54,11.65 19.33,11.18 18.96,10.86C18.59,10.54 18.13,10.38 17.58,10.38C17,10.38 16.5,10.55 16.19,10.89C15.86,11.23 15.65,11.69 15.57,12.27M21.92,12.04C22,12.45 22,13.04 22,13.81H15.5C15.55,14.71 15.85,15.33 16.44,15.69C16.79,15.92 17.22,16.03 17.73,16.03C18.26,16.03 18.69,15.89 19,15.62C19.2,15.47 19.36,15.27 19.5,15H21.88C21.82,15.54 21.53,16.07 21,16.62C20.22,17.5 19.1,17.92 17.66,17.92C16.47,17.92 15.43,17.55 14.5,16.82C13.62,16.09 13.16,14.9 13.16,13.25C13.16,11.7 13.57,10.5 14.39,9.7C15.21,8.87 16.27,8.46 17.58,8.46C18.35,8.46 19.05,8.6 19.67,8.88C20.29,9.16 20.81,9.59 21.21,10.2C21.58,10.73 21.81,11.34 21.92,12.04M9.58,14.07C9.58,13.42 9.31,12.97 8.79,12.73C8.5,12.6 8.08,12.53 7.54,12.5H4.87V15.84H7.5C8.04,15.84 8.46,15.77 8.76,15.62C9.31,15.35 9.58,14.83 9.58,14.07M4.87,10.46H7.5C8.04,10.46 8.5,10.36 8.82,10.15C9.16,9.95 9.32,9.58 9.32,9.06C9.32,8.5 9.1,8.1 8.66,7.91C8.27,7.78 7.78,7.72 7.19,7.72H4.87M11.72,12.42C12.04,12.92 12.2,13.53 12.2,14.24C12.2,15 12,15.64 11.65,16.23C11.41,16.62 11.12,16.94 10.77,17.21C10.37,17.5 9.9,17.72 9.36,17.83C8.82,17.94 8.24,18 7.61,18H2V5.55H8C9.53,5.58 10.6,6 11.23,6.88C11.61,7.41 11.8,8.04 11.8,8.78C11.8,9.54 11.61,10.15 11.23,10.61C11,10.87 10.7,11.11 10.28,11.32C10.91,11.55 11.39,11.92 11.72,12.42M20.06,7.32H15.05V6.07H20.06V7.32Z",
"name": "behance"
},
{
"path": "M5.45,10.28C6.4,10.28 7.5,11.05 7.5,12C7.5,12.95 6.4,13.72 5.45,13.72H2L2.69,10.28H5.45M6.14,4.76C7.09,4.76 8.21,5.53 8.21,6.5C8.21,7.43 7.09,8.21 6.14,8.21H2.69L3.38,4.76H6.14M13.03,4.76C14,4.76 15.1,5.53 15.1,6.5C15.1,7.43 14,8.21 13.03,8.21H9.41L10.1,4.76H13.03M12.34,10.28C13.3,10.28 14.41,11.05 14.41,12C14.41,12.95 13.3,13.72 12.34,13.72H8.72L9.41,10.28H12.34M10.97,15.79C11.92,15.79 13.03,16.57 13.03,17.5C13.03,18.47 11.92,19.24 10.97,19.24H7.5L8.21,15.79H10.97M18.55,13.72C19.5,13.72 20.62,14.5 20.62,15.45C20.62,16.4 19.5,17.17 18.55,17.17H15.1L15.79,13.72H18.55M19.93,8.21C20.88,8.21 22,9 22,9.93C22,10.88 20.88,11.66 19.93,11.66H16.5L17.17,8.21H19.93Z",
"name": "blackberry"
},
{
"path": "M12,3A9,9 0 0,1 21,12A9,9 0 0,1 12,21A9,9 0 0,1 3,12A9,9 0 0,1 12,3M5.94,8.5C4,11.85 5.15,16.13 8.5,18.06C11.85,20 18.85,7.87 15.5,5.94C12.15,4 7.87,5.15 5.94,8.5Z",
"name": "cisco-webex"
},
{
"path": "M11.9,14.5H10.8V9.5H11.9C13.5,9.5 14.6,10.4 14.6,12C14.6,13.6 13.5,14.5 11.9,14.5M11.9,7H8.1V17H11.8C15.3,17 17.4,14.9 17.4,12V12C17.4,9.1 15.4,7 11.9,7M12,20C10.1,20 8.3,19.3 6.9,18.1L6.2,17.5L4.5,17.7L5.2,16.1L4.9,15.3C4.4,14.2 4.2,13.1 4.2,11.9C4.2,7.5 7.8,3.9 12.1,3.9C16.4,3.9 19.9,7.6 19.9,12C19.9,16.4 16.3,20 12,20M12,2C6.5,2 2.1,6.5 2.1,12C2.1,13.5 2.4,14.9 3,16.2L1.4,20.3L5.7,19.7C7.4,21.2 9.7,22.1 12.1,22.1C17.6,22.1 22,17.6 22,12.1C22,6.6 17.5,2 12,2Z",
"name": "disqus-outline"
},
{
"path": "M16.42,18.42C16,16.5 15.5,14.73 15,13.17C15.5,13.1 16,13.06 16.58,13.06H16.6V13.06H16.6C17.53,13.06 18.55,13.18 19.66,13.43C19.28,15.5 18.08,17.27 16.42,18.42M12,19.8C10.26,19.8 8.66,19.23 7.36,18.26C7.64,17.81 8.23,16.94 9.18,16.04C10.14,15.11 11.5,14.15 13.23,13.58C13.82,15.25 14.36,17.15 14.77,19.29C13.91,19.62 13,19.8 12,19.8M4.2,12C4.2,11.96 4.2,11.93 4.2,11.89C4.42,11.9 4.71,11.9 5.05,11.9H5.06C6.62,11.89 9.36,11.76 12.14,10.89C12.29,11.22 12.44,11.56 12.59,11.92C10.73,12.54 9.27,13.53 8.19,14.5C7.16,15.46 6.45,16.39 6.04,17C4.9,15.66 4.2,13.91 4.2,12M8.55,5C9.1,5.65 10.18,7.06 11.34,9.25C9,9.96 6.61,10.12 5.18,10.12C5.14,10.12 5.1,10.12 5.06,10.12H5.05C4.81,10.12 4.6,10.12 4.43,10.11C5,7.87 6.5,6 8.55,5M12,4.2C13.84,4.2 15.53,4.84 16.86,5.91C15.84,7.14 14.5,8 13.03,8.65C12,6.67 11,5.25 10.34,4.38C10.88,4.27 11.43,4.2 12,4.2M18.13,7.18C19.1,8.42 19.71,9.96 19.79,11.63C18.66,11.39 17.6,11.28 16.6,11.28V11.28H16.59C15.79,11.28 15.04,11.35 14.33,11.47C14.16,11.05 14,10.65 13.81,10.26C15.39,9.57 16.9,8.58 18.13,7.18M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2Z",
"name": "dribbble"
},
{
"path": "M5,3H19A2,2 0 0,1 21,5V19A2,2 0 0,1 19,21H5A2,2 0 0,1 3,19V5A2,2 0 0,1 5,3M15.09,16.5C14.81,15.14 14.47,13.91 14.08,12.82L15.2,12.74H15.22V12.74C15.87,12.74 16.59,12.82 17.36,13C17.09,14.44 16.26,15.69 15.09,16.5M12,17.46C10.79,17.46 9.66,17.06 8.76,16.39C8.95,16.07 9.36,15.46 10,14.83C10.7,14.18 11.64,13.5 12.86,13.11C13.28,14.27 13.65,15.6 13.94,17.1C13.33,17.33 12.68,17.46 12,17.46M6.54,12V11.92L7.14,11.93V11.93C8.24,11.93 10.15,11.83 12.1,11.22L12.41,11.94C11.11,12.38 10.09,13.07 9.34,13.76C8.61,14.42 8.12,15.08 7.83,15.5C7.03,14.56 6.54,13.34 6.54,12M9.59,7.11C9.97,7.56 10.73,8.54 11.54,10.08C9.89,10.57 8.23,10.68 7.22,10.68H7.14V10.68H6.7C7.09,9.11 8.17,7.81 9.59,7.11M12,6.54C13.29,6.54 14.47,7 15.41,7.74C14.69,8.6 13.74,9.22 12.72,9.66C12,8.27 11.31,7.28 10.84,6.67C11.21,6.59 11.6,6.54 12,6.54M16.29,8.63C16.97,9.5 17.4,10.57 17.45,11.74C16.66,11.58 15.92,11.5 15.22,11.5V11.5C14.66,11.5 14.13,11.54 13.63,11.63L13.27,10.78C14.37,10.3 15.43,9.61 16.29,8.63M12,5A7,7 0 0,0 5,12A7,7 0 0,0 12,19A7,7 0 0,0 19,12A7,7 0 0,0 12,5Z",
"name": "dribbble-box"
},
{
"path": "M6.72,20.78C8.23,20.71 10.07,20.78 11.87,20.78C13.72,20.78 15.62,20.66 17.12,20.78C17.72,20.83 18.28,21.19 18.77,20.87C19.16,20.38 18.87,19.71 18.96,19.05C19.12,17.78 20.28,16.27 18.59,15.95C17.87,16.61 18.35,17.23 17.95,18.05C17.45,19.03 15.68,19.37 14,19.5C12.54,19.62 10,19.76 9.5,18.77C9.04,17.94 9.29,16.65 9.29,15.58C9.29,14.38 9.16,13.22 9.5,12.3C11.32,12.43 13.7,11.69 15,12.5C15.87,13 15.37,14.06 16.38,14.4C17.07,14.21 16.7,13.32 16.66,12.5C16.63,11.94 16.63,11.19 16.66,10.57C16.69,9.73 17,8.76 16.1,8.74C15.39,9.3 15.93,10.23 15.18,10.75C14.95,10.92 14.43,11 14.08,11C12.7,11.17 10.54,11.05 9.38,10.84C9.23,9.16 9.24,6.87 9.38,5.19C10,4.57 11.45,4.54 12.42,4.55C14.13,4.55 16.79,4.7 17.3,5.55C17.58,6 17.36,7 17.85,7.1C18.85,7.33 18.36,5.55 18.41,4.73C18.44,4.11 18.71,3.72 18.59,3.27C18.27,2.83 17.79,3.05 17.5,3.09C14.35,3.5 9.6,3.27 6.26,3.27C5.86,3.27 5.16,3.07 4.88,3.54C4.68,4.6 6.12,4.16 6.62,4.73C6.79,4.91 7.03,5.73 7.08,6.28C7.23,7.74 7.08,9.97 7.08,12.12C7.08,14.38 7.26,16.67 7.08,18.05C7,18.53 6.73,19.3 6.62,19.41C6,20.04 4.34,19.35 4.5,20.69C5.09,21.08 5.93,20.82 6.72,20.78Z",
"name": "etsy"
},
{
"path": "M12,17.5C10.15,17.5 8.42,16.56 7.41,15L17.41,12.75L22.08,11.75C22.05,10.32 21.71,8.92 21.08,7.64C18.66,2.61 12.62,0.5 7.58,2.92C2.55,5.34 0.44,11.38 2.86,16.41C5.29,21.44 11.33,23.56 16.36,21.14C18.5,20.09 20.25,18.31 21.22,16.11L16.61,15C15.6,16.57 13.86,17.5 12,17.5M12,6.5C13.76,6.5 15.41,7.34 16.44,8.77L6.57,11.19C6.96,8.5 9.28,6.5 12,6.5Z",
"name": "eventbrite"
},
{
"path": "M5,3H19A2,2 0 0,1 21,5V19A2,2 0 0,1 19,21H5A2,2 0 0,1 3,19V5A2,2 0 0,1 5,3M18,5H15.5A3.5,3.5 0 0,0 12,8.5V11H10V14H12V21H15V14H18V11H15V9A1,1 0 0,1 16,8H18V5Z",
"name": "facebook-box"
},
{
"path": "M21,12A9,9 0 0,1 12,21H4.5L9.74,15.76L11.16,17.17L9.33,19H12A7,7 0 0,0 19,12V7L21,5V12M3,12A9,9 0 0,1 12,3H19.5L14.26,8.24L12.84,6.83L14.67,5H12A7,7 0 0,0 5,12V17L3,19V12Z",
"name": "flattr"
},
{
"path": "M11,12C11,14.5 9,16.5 6.5,16.5C4,16.5 2,14.5 2,12C2,9.5 4,7.5 6.5,7.5C9,7.5 11,9.5 11,12M17.5,7.5C15,7.5 13,9.5 13,12C13,14.5 15,16.5 17.5,16.5C20,16.5 22,14.5 22,12C22,9.5 20,7.5 17.5,7.5Z",
"name": "flickr"
},
{
"path": "M17,5L16.57,7.5C16.5,7.73 16.2,8 15.91,8C15.61,8 12,8 12,8C11.53,8 10.95,8.32 10.95,8.79V9.2C10.95,9.67 11.53,10 12,10C12,10 14.95,10 15.28,10C15.61,10 15.93,10.36 15.86,10.71C15.79,11.07 14.94,13.28 14.9,13.5C14.86,13.67 14.64,14 14.25,14C13.92,14 11.37,14 11.37,14C10.85,14 10.69,14.07 10.34,14.5C10,14.94 7.27,18.1 7.27,18.1C7.24,18.13 7,18.04 7,18V5C7,4.7 7.61,4 8,4C8,4 16.17,4 16.5,4C16.82,4 17.08,4.61 17,5M17,14.45C17.11,13.97 18.78,6.72 19.22,4.55M17.58,2C17.58,2 8.38,2 6.91,2C5.43,2 5,3.11 5,3.8C5,4.5 5,20.76 5,20.76C5,21.54 5.42,21.84 5.66,21.93C5.9,22.03 6.55,22.11 6.94,21.66C6.94,21.66 11.65,16.22 11.74,16.13C11.87,16 11.87,16 12,16C12.26,16 14.2,16 15.26,16C16.63,16 16.85,15 17,14.45C17.11,13.97 18.78,6.72 19.22,4.55C19.56,2.89 19.14,2 17.58,2Z",
"name": "foursquare"
},
{
"path": "M5,3H19A2,2 0 0,1 21,5V19A2,2 0 0,1 19,21H14.56C14.24,20.93 14.23,20.32 14.23,20.11L14.24,17.64C14.24,16.8 13.95,16.25 13.63,15.97C15.64,15.75 17.74,15 17.74,11.53C17.74,10.55 17.39,9.74 16.82,9.11C16.91,8.89 17.22,7.97 16.73,6.73C16.73,6.73 15.97,6.5 14.25,7.66C13.53,7.46 12.77,7.36 12,7.35C11.24,7.36 10.46,7.46 9.75,7.66C8.03,6.5 7.27,6.73 7.27,6.73C6.78,7.97 7.09,8.89 7.18,9.11C6.61,9.74 6.26,10.55 6.26,11.53C6.26,15 8.36,15.75 10.36,16C10.1,16.2 9.87,16.6 9.79,17.18C9.27,17.41 7.97,17.81 7.17,16.43C7.17,16.43 6.69,15.57 5.79,15.5C5.79,15.5 4.91,15.5 5.73,16.05C5.73,16.05 6.32,16.33 6.73,17.37C6.73,17.37 7.25,19.12 9.76,18.58L9.77,20.11C9.77,20.32 9.75,20.93 9.43,21H5A2,2 0 0,1 3,19V5A2,2 0 0,1 5,3Z",
"name": "github-box"
},
{
"path": "M20.38,8.53C20.54,8.13 21.06,6.54 20.21,4.39C20.21,4.39 18.9,4 15.91,6C14.66,5.67 13.33,5.62 12,5.62C10.68,5.62 9.34,5.67 8.09,6C5.1,3.97 3.79,4.39 3.79,4.39C2.94,6.54 3.46,8.13 3.63,8.53C2.61,9.62 2,11 2,12.72C2,19.16 6.16,20.61 12,20.61C17.79,20.61 22,19.16 22,12.72C22,11 21.39,9.62 20.38,8.53M12,19.38C7.88,19.38 4.53,19.19 4.53,15.19C4.53,14.24 5,13.34 5.8,12.61C7.14,11.38 9.43,12.03 12,12.03C14.59,12.03 16.85,11.38 18.2,12.61C19,13.34 19.5,14.23 19.5,15.19C19.5,19.18 16.13,19.38 12,19.38M8.86,13.12C8.04,13.12 7.36,14.12 7.36,15.34C7.36,16.57 8.04,17.58 8.86,17.58C9.69,17.58 10.36,16.58 10.36,15.34C10.36,14.11 9.69,13.12 8.86,13.12M15.14,13.12C14.31,13.12 13.64,14.11 13.64,15.34C13.64,16.58 14.31,17.58 15.14,17.58C15.96,17.58 16.64,16.58 16.64,15.34C16.64,14.11 16,13.12 15.14,13.12Z",
"name": "github-face"
},
{
"path": "M8,2A3,3 0 0,0 5,5V16.5H8V5H19A3,3 0 0,0 16,2H8M16,7.5V19H5A3,3 0 0,0 8,22H16A3,3 0 0,0 19,19V7.5H16Z",
"name": "glassdoor"
},
{
"path": "M2,22L8.5,2H15.4L9.2,20C9.2,20 8.6,22 7,22C5.9,22 2,22 2,22M16.4,5L13,15L15,20.7C15,20.7 15.4,22 17,22C18.3,22 22,22 22,22L16.4,5Z",
"name": "google-adwords"
},
{
"path": "M19,3H13V8L17,7L16,11H21V5C21,3.89 20.1,3 19,3M17,17L13,16V21H19A2,2 0 0,0 21,19V13H16M8,13H3V19A2,2 0 0,0 5,21H11V16L7,17M3,5V11H8L7,7L11,8V3H5C3.89,3 3,3.89 3,5Z",
"name": "google-pages"
},
{
"path": "M12,1.5A9,9 0 0,1 21,10.5C21,13.11 19.89,15.47 18.11,17.11L17.05,16.05C18.55,14.68 19.5,12.7 19.5,10.5A7.5,7.5 0 0,0 12,3A7.5,7.5 0 0,0 4.5,10.5C4.5,12.7 5.45,14.68 6.95,16.05L5.89,17.11C4.11,15.47 3,13.11 3,10.5A9,9 0 0,1 12,1.5M12,4.5A6,6 0 0,1 18,10.5C18,12.28 17.22,13.89 16,15L14.92,13.92C15.89,13.1 16.5,11.87 16.5,10.5C16.5,8 14.5,6 12,6C9.5,6 7.5,8 7.5,10.5C7.5,11.87 8.11,13.1 9.08,13.92L8,15C6.78,13.89 6,12.28 6,10.5A6,6 0 0,1 12,4.5M8.11,17.65L11.29,14.46C11.68,14.07 12.32,14.07 12.71,14.46L15.89,17.65C16.28,18.04 16.28,18.67 15.89,19.06L12.71,22.24C12.32,22.63 11.68,22.63 11.29,22.24L8.11,19.06C7.72,18.67 7.72,18.04 8.11,17.65Z",
"name": "google-physical-web"
},
{
"path": "M5,3H19A2,2 0 0,1 21,5V19A2,2 0 0,1 19,21H5A2,2 0 0,1 3,19V5A2,2 0 0,1 5,3M19.5,12H18V10.5H17V12H15.5V13H17V14.5H18V13H19.5V12M9.65,11.36V12.9H12.22C12.09,13.54 11.45,14.83 9.65,14.83C8.11,14.83 6.89,13.54 6.89,12C6.89,10.46 8.11,9.17 9.65,9.17C10.55,9.17 11.13,9.56 11.45,9.88L12.67,8.72C11.9,7.95 10.87,7.5 9.65,7.5C7.14,7.5 5.15,9.5 5.15,12C5.15,14.5 7.14,16.5 9.65,16.5C12.22,16.5 13.96,14.7 13.96,12.13C13.96,11.81 13.96,11.61 13.89,11.36H9.65Z",
"name": "google-plus-box"
},
{
"path": "M14,20.95H20V10.78L8,7.34V3.05H4V20.95H10V15.31H14V20.95Z",
"name": "houzz"
},
{
"path": "M5,3H19A2,2 0 0,1 21,5V19A2,2 0 0,1 19,21H5A2,2 0 0,1 3,19V5A2,2 0 0,1 5,3M13.5,18.71H18V11.09L9,8.5V5.29H6V18.71H10.5V14.5H13.5V18.71Z",
"name": "houzz-box"
},
{
"path": "M10,5A1,1 0 0,0 9,4H8V2H16V4H15A1,1 0 0,0 14,5V19A1,1 0 0,0 15,20H16V22H8V20H9A1,1 0 0,0 10,19V5Z",
"name": "instapaper"
},
{
"path": "M7.85,17.07C7.03,17.17 3.5,17.67 4.06,20.26C4.69,23.3 9.87,22.59 9.83,19C9.81,16.57 9.83,9.2 9.83,9.2C9.83,9.2 9.76,8.53 10.43,8.39L18.19,6.79C18.19,6.79 18.83,6.65 18.83,7.29C18.83,7.89 18.83,14.2 18.83,14.2C18.83,14.2 18.9,14.83 18.12,15C17.34,15.12 13.91,15.4 14.19,18C14.5,21.07 20,20.65 20,17.07V2.61C20,2.61 20.04,1.62 18.9,1.87L9.5,3.78C9.5,3.78 8.66,3.96 8.66,4.77C8.66,5.5 8.66,16.11 8.66,16.11C8.66,16.11 8.66,16.96 7.85,17.07Z",
"name": "itunes"
},
{
"path": "M2,5.69C8.92,1.07 11.1,7 11.28,10.27C11.46,13.53 8.29,17.64 4.31,14.92V20.3L2,18.77V5.69M4.22,7.4V12.78C7.84,14.95 9.08,13.17 9.08,10.09C9.08,5.74 6.57,5.59 4.22,7.4M15.08,4.15C15.08,4.15 14.9,7.64 15.08,11.07C15.44,14.5 19.69,11.84 19.69,11.84V4.92L22,5.2V14.44C22,20.6 15.85,20.3 15.85,20.3L15.08,18C20.46,18 19.78,14.43 19.78,14.43C13.27,16.97 12.77,12.61 12.77,12.61V5.69L15.08,4.15Z",
"name": "language-python-text"
},
{
"path": "M18,17.93C15.92,17.92 14.81,16.9 14.04,15.09L13.82,14.6L11.92,10.23C11.29,8.69 9.72,7.64 7.96,7.64C5.57,7.64 3.63,9.59 3.63,12C3.63,14.41 5.57,16.36 7.96,16.36C9.62,16.36 11.08,15.41 11.8,14L12.57,15.81C11.5,17.15 9.82,18 7.96,18C4.67,18 2,15.32 2,12C2,8.69 4.67,6 7.96,6C10.44,6 12.45,7.34 13.47,9.7C13.54,9.89 14.54,12.24 15.42,14.24C15.96,15.5 16.42,16.31 17.91,16.36C19.38,16.41 20.39,15.5 20.39,14.37C20.39,13.26 19.62,13 18.32,12.56C16,11.79 14.79,11 14.79,9.15C14.79,7.33 16,6.12 18,6.12C19.31,6.12 20.24,6.7 20.89,7.86L19.62,8.5C19.14,7.84 18.61,7.57 17.94,7.57C17,7.57 16.33,8.23 16.33,9.1C16.33,10.34 17.43,10.53 18.97,11.03C21.04,11.71 22,12.5 22,14.42C22,16.45 20.27,17.93 18,17.93Z",
"name": "lastfm"
},
{
"path": "M19,3A2,2 0 0,1 21,5V19A2,2 0 0,1 19,21H5A2,2 0 0,1 3,19V5A2,2 0 0,1 5,3H19M18.5,18.5V13.2A3.26,3.26 0 0,0 15.24,9.94C14.39,9.94 13.4,10.46 12.92,11.24V10.13H10.13V18.5H12.92V13.57C12.92,12.8 13.54,12.17 14.31,12.17A1.4,1.4 0 0,1 15.71,13.57V18.5H18.5M6.88,8.56A1.68,1.68 0 0,0 8.56,6.88C8.56,5.95 7.81,5.19 6.88,5.19A1.69,1.69 0 0,0 5.19,6.88C5.19,7.81 5.95,8.56 6.88,8.56M8.27,18.5V10.13H5.5V18.5H8.27Z",
"name": "linkedin-box"
},
{
"path": "M9.56,12.5C9.56,12.6 9.5,12.72 9.4,12.79C9.2,12.97 8.89,12.94 8.71,12.74C8.63,12.65 8.59,12.53 8.59,12.41V8.5H5.66V13.39A2.44,2.44 0 0,0 8.1,15.83C8.68,15.83 9.24,15.62 9.68,15.24C9.64,15.6 9.43,15.93 9.11,16.11C8.75,16.31 8.35,16.42 7.94,16.41C7.46,16.41 7,16.3 6.56,16.09L6.39,16V18.6C7.04,18.86 7.74,19 8.44,19C9.47,19 10.46,18.66 11.25,18C12.08,17.25 12.54,16.18 12.5,15.06V8.5H9.56V12.5M4.93,13.39V5.59H2V12.9C1.84,14.35 2.88,15.65 4.33,15.81C4.41,15.82 4.5,15.83 4.56,15.83V15.83C4.93,15.83 5.29,15.74 5.63,15.59L5.75,15.5L5.65,15.41C5.17,14.85 4.91,14.13 4.93,13.39M22,11.39V8.5H21C20.59,6.38 18.53,5 16.41,5.41C16.17,5.45 15.94,5.5 15.71,5.61C14.28,6.24 13.33,7.62 13.26,9.18V15.83H13.39C14.95,15.76 16.19,14.47 16.19,12.9H17.41V10H16.15V9.17C16.15,8.86 16.32,8.57 16.59,8.41C17.06,8.13 17.68,8.28 17.96,8.76C18.05,8.91 18.09,9.07 18.1,9.24V11.93C18.07,14.05 19.75,15.79 21.87,15.83H22V12.9H22A1,1 0 0,1 21,11.9V11.41L22,11.39Z",
"name": "lyft"
},
{
"path": "M15.45,11.91C15.34,9.7 13.7,8.37 11.72,8.37H11.64C9.35,8.37 8.09,10.17 8.09,12.21C8.09,14.5 9.62,15.95 11.63,15.95C13.88,15.95 15.35,14.3 15.46,12.36M11.65,6.39C13.18,6.39 14.62,7.07 15.67,8.13V8.13C15.67,7.62 16,7.24 16.5,7.24H16.61C17.35,7.24 17.5,7.94 17.5,8.16V16.06C17.46,16.58 18.04,16.84 18.37,16.5C19.64,15.21 21.15,9.81 17.58,6.69C14.25,3.77 9.78,4.25 7.4,5.89C4.88,7.63 3.26,11.5 4.83,15.11C6.54,19.06 11.44,20.24 14.35,19.06C15.83,18.47 16.5,20.46 15,21.11C12.66,22.1 6.23,22 3.22,16.79C1.19,13.27 1.29,7.08 6.68,3.87C10.81,1.42 16.24,2.1 19.5,5.5C22.95,9.1 22.75,15.8 19.4,18.41C17.89,19.59 15.64,18.44 15.66,16.71L15.64,16.15C14.59,17.2 13.18,17.81 11.65,17.81C8.63,17.81 6,15.15 6,12.13C6,9.08 8.63,6.39 11.65,6.39Z",
"name": "mail-ru"
},
{
"path": "M20.93,14C20.66,15.4 18.5,16.95 15.97,17.25C14.66,17.4 13.38,17.55 12,17.5C9.76,17.38 8,16.95 8,16.95L8.03,17.57C8.32,19.78 10.22,19.92 12.03,20C13.85,20.04 15.47,19.53 15.47,19.53L15.55,21.17C15.55,21.17 14.27,21.86 12,22C10.75,22.05 9.2,21.95 7.39,21.47C3.47,20.43 2.79,16.25 2.69,12L2.68,8.57C2.68,4.23 5.5,2.96 5.5,2.96C6.95,2.3 9.41,2 11.97,2H12.03C14.59,2 17.05,2.3 18.5,2.96C18.5,2.96 21.33,4.23 21.33,8.57C21.33,8.57 21.36,11.77 20.93,14M8.33,10.32C8.33,9.54 7.7,8.91 6.93,8.91C6.15,8.91 5.5,9.54 5.5,10.32C5.5,11.09 6.15,11.72 6.93,11.72A1.4,1.4 0 0,0 8.33,10.32M13.41,10.32A1.41,1.41 0 0,0 12,8.91A1.41,1.41 0 0,0 10.59,10.32C10.59,11.09 11.22,11.72 12,11.72C12.78,11.72 13.41,11.09 13.41,10.32M18.5,10.32C18.5,9.54 17.85,8.91 17.07,8.91C16.3,8.91 15.67,9.54 15.67,10.32A1.4,1.4 0 0,0 17.07,11.72C17.85,11.72 18.5,11.09 18.5,10.32Z",
"name": "mastodon-variant"
},
{
"path": "M4.37,7.3C4.4,7.05 4.3,6.81 4.12,6.65L2.25,4.4V4.06H8.05L12.53,13.89L16.47,4.06H22V4.4L20.4,5.93C20.27,6.03 20.2,6.21 20.23,6.38V17.62C20.2,17.79 20.27,17.97 20.4,18.07L21.96,19.6V19.94H14.12V19.6L15.73,18.03C15.89,17.88 15.89,17.83 15.89,17.59V8.5L11.4,19.9H10.8L5.57,8.5V16.14C5.5,16.46 5.63,16.78 5.86,17L7.96,19.57V19.9H2V19.57L4.1,17C4.33,16.78 4.43,16.46 4.37,16.14V7.3Z",
"name": "medium"
},
{
"path": "M19.61,14.86C19.61,16.68 18.3,18.25 16.5,18.55C16.29,18.59 16.07,18.62 15.84,18.61C15.76,18.61 15.73,18.64 15.71,18.71C15.35,19.74 14.64,20.35 13.57,20.5C12.86,20.6 12.22,20.41 11.65,19.97C11.57,19.9 11.5,19.9 11.44,19.96C10.78,20.43 10.04,20.64 9.23,20.59C7.66,20.5 6.33,19.29 6.08,17.74C6.06,17.63 6.04,17.5 6.04,17.41C6.04,17.32 6,17.29 5.92,17.27C5.44,17.18 5,17 4.63,16.68C3.92,16.13 3.5,15.41 3.4,14.5C3.29,13.5 3.61,12.62 4.32,11.89C4.38,11.83 4.38,11.79 4.34,11.72C4.07,11.24 3.94,10.72 3.96,10.17C4,8.79 4.97,7.65 6.31,7.37C6.46,7.33 6.54,7.27 6.61,7.13C7.27,5.71 8.37,4.85 9.91,4.56C11,4.36 12,4.58 12.94,5.13C13,5.18 13.08,5.18 13.17,5.16C14.67,4.72 16,5.04 17.12,6.11C17.78,6.74 18.15,7.54 18.26,8.46C18.28,8.66 18.29,8.86 18.28,9.06C18.27,9.14 18.29,9.17 18.37,9.19C19.04,9.44 19.5,9.91 19.71,10.6C19.96,11.45 19.75,12.21 19.11,12.83C19.05,12.89 19.07,12.92 19.1,12.97C19.44,13.56 19.61,14.18 19.61,14.86M12.93,14.57C12.93,15.34 13.43,16 14.14,16.26C14.5,16.37 14.85,16.43 15.22,16.45C15.5,16.46 15.75,16.44 16,16.32C16.19,16.22 16.28,16.06 16.27,15.85C16.26,15.64 16.16,15.5 15.96,15.4C15.89,15.37 15.82,15.34 15.74,15.33C15.5,15.29 15.3,15.26 15.07,15.21C14.71,15.14 14.55,14.95 14.55,14.57C14.54,14.24 14.63,13.93 14.73,13.63C14.92,13.07 15.17,12.53 15.41,12C15.64,11.47 15.88,10.95 16.04,10.4C16.13,10.1 16.18,9.8 16.09,9.5C15.97,9 15.69,8.7 15.2,8.61C14.75,8.5 14.3,8.5 13.9,8.78C13.76,8.87 13.63,8.85 13.5,8.74C13.43,8.67 13.34,8.58 13.26,8.5C12.84,8.12 12.3,8.1 11.85,8.45C11.67,8.59 11.5,8.76 11.33,8.89C11.16,9 11,9.03 10.79,8.92C10.6,8.83 10.42,8.74 10.23,8.65C10.03,8.57 9.85,8.46 9.63,8.44C8.95,8.38 8.24,8.79 7.94,9.41C7.8,9.68 7.69,9.96 7.59,10.25C7.11,11.57 6.72,12.91 6.32,14.26C6.14,14.86 6.35,15.45 6.86,15.77C7.26,16 7.69,16.09 8.14,15.95C8.5,15.84 8.71,15.55 8.85,15.22C9.31,14.13 9.73,13 10.17,11.91C10.29,11.61 10.41,11.3 10.54,11C10.67,10.7 11.04,10.6 11.26,10.8C11.4,10.92 11.44,11.09 11.42,11.26C11.41,11.45 11.34,11.62 11.27,11.79C11,12.5 10.69,13.24 10.4,13.97C10.34,14.11 10.28,14.26 10.25,14.42C10.21,14.69 10.31,14.93 10.54,15C10.76,15.12 11,15.14 11.23,15.05C11.5,14.95 11.67,14.74 11.79,14.5C12.22,13.65 12.65,12.8 13.08,11.95C13.28,11.56 13.5,11.17 13.68,10.78C13.76,10.64 13.85,10.5 14,10.41C14.12,10.33 14.25,10.33 14.38,10.4C14.5,10.47 14.5,10.6 14.5,10.73C14.5,10.8 14.5,10.87 14.47,10.93C14.41,11.07 14.36,11.2 14.3,11.33C13.94,12.09 13.57,12.84 13.22,13.59C13.07,13.91 12.91,14.23 12.93,14.57M17.96,20.12C17.96,19.62 17.54,19.2 17.04,19.2C16.5,19.2 16.1,19.61 16.1,20.12A0.93,0.93 0 0,0 17.03,21.05A0.93,0.93 0 0,0 17.96,20.12M2.38,12.46C2.86,12.46 3.27,12.05 3.27,11.57C3.27,11.09 2.87,10.69 2.39,10.69C1.89,10.69 1.5,11.08 1.5,11.57C1.5,12.06 1.89,12.46 2.38,12.46M13.26,2.55C12.77,2.55 12.37,2.94 12.37,3.42C12.37,3.91 12.77,4.3 13.25,4.3C13.74,4.3 14.13,3.92 14.13,3.43C14.13,2.95 13.74,2.55 13.26,2.55M20.45,8.03C20.45,7.63 20.11,7.29 19.71,7.29C19.3,7.28 18.95,7.63 18.95,8.04C18.95,8.45 19.28,8.78 19.7,8.78C20.12,8.78 20.46,8.45 20.45,8.03M5.04,5.89C5.04,6.27 5.34,6.56 5.71,6.56C6.09,6.56 6.39,6.26 6.38,5.88C6.38,5.5 6.09,5.22 5.72,5.22C5.33,5.22 5.04,5.5 5.04,5.89M12.06,21.44C12.06,21.12 11.81,20.86 11.5,20.86C11.16,20.86 10.91,21.11 10.91,21.44C10.91,21.75 11.16,22 11.5,22C11.8,22 12.06,21.75 12.06,21.44M21,12.5C20.71,12.5 20.45,12.78 20.45,13.08A0.55,0.55 0 0,0 21,13.63C21.33,13.63 21.57,13.4 21.57,13.08C21.57,12.77 21.33,12.5 21,12.5M7.62,2C7.35,2 7.14,2.2 7.14,2.47C7.14,2.73 7.35,2.94 7.62,2.94A0.47,0.47 0 0,0 8.09,2.47C8.09,2.2 7.89,2 7.62,2M22.08,10C21.86,10 21.67,10.17 21.66,10.4C21.66,10.63 21.85,10.82 22.08,10.82C22.32,10.82 22.5,10.64 22.5,10.41C22.5,10.17 22.32,10 22.08,10M5.5,18.26C5.5,18.04 5.29,17.85 5.06,17.84C4.84,17.84 4.65,18.03 4.65,18.27C4.65,18.5 4.84,18.68 5.07,18.68C5.3,18.68 5.5,18.5 5.5,18.26Z",
"name": "meetup"
},
{
"path": "M21.11,18.5C20.97,18.5 20.83,18.44 20.71,18.36C20.37,18.13 20.28,17.68 20.5,17.34C21.18,16.34 21.54,15.16 21.54,13.93C21.54,12.71 21.18,11.53 20.5,10.5C20.28,10.18 20.37,9.73 20.71,9.5C21.04,9.28 21.5,9.37 21.72,9.7C22.56,10.95 23,12.41 23,13.93C23,15.45 22.56,16.91 21.72,18.16C21.58,18.37 21.35,18.5 21.11,18.5M19,17.29C18.88,17.29 18.74,17.25 18.61,17.17C18.28,16.94 18.19,16.5 18.42,16.15C18.86,15.5 19.1,14.73 19.1,13.93C19.1,13.14 18.86,12.37 18.42,11.71C18.19,11.37 18.28,10.92 18.61,10.69C18.95,10.47 19.4,10.55 19.63,10.89C20.24,11.79 20.56,12.84 20.56,13.93C20.56,15 20.24,16.07 19.63,16.97C19.5,17.18 19.25,17.29 19,17.29M14.9,15.73C15.89,15.73 16.7,14.92 16.7,13.93C16.7,13.17 16.22,12.5 15.55,12.25C15.5,12.55 15.43,12.85 15.34,13.14C15.23,13.44 14.95,13.64 14.64,13.64C14.57,13.64 14.5,13.62 14.41,13.6C14.03,13.47 13.82,13.06 13.95,12.67C14.09,12.24 14.17,11.78 14.17,11.32C14.17,8.93 12.22,7 9.82,7C8.1,7 6.56,8 5.87,9.5C6.54,9.7 7.16,10.04 7.66,10.54C7.95,10.83 7.95,11.29 7.66,11.58C7.38,11.86 6.91,11.86 6.63,11.58C6.17,11.12 5.56,10.86 4.9,10.86C3.56,10.86 2.46,11.96 2.46,13.3C2.46,14.64 3.56,15.73 4.9,15.73H14.9M15.6,10.75C17.06,11.07 18.17,12.37 18.17,13.93C18.17,15.73 16.7,17.19 14.9,17.19H4.9C2.75,17.19 1,15.45 1,13.3C1,11.34 2.45,9.73 4.33,9.45C5.12,7.12 7.33,5.5 9.82,5.5C12.83,5.5 15.31,7.82 15.6,10.75Z",
"name": "mixcloud"
},
{
"path": "M3.25,4.03L19.95,20.73L18.7,22L14.86,18.13C14.77,18.12 14.68,18.09 14.59,18.05C14.26,17.89 14.14,17.62 14.11,17.38L12.18,15.45C12.14,15.53 12.09,15.6 12.05,15.66C11.62,16.26 11.19,16.26 10.86,16.04C10.54,15.83 5.5,12 5.23,11.87C4.95,11.76 4.85,12.03 5.12,13.5C5.39,15 4.95,15.39 4.57,15.45C4.2,15.5 3.06,15.18 3,12.14C2.95,9.11 3.76,8.62 4.14,8.62C4.6,8.62 7.08,10.69 8.84,12.12L2,5.28L3.25,4.03M18.38,16.56C18.75,15.4 19.12,13.8 19.1,12.03V12C19.14,8.5 17.66,5.58 17.66,5.58C17.66,5.58 17.42,4.72 18.12,4.39C18.83,4.06 19.3,4.61 19.3,4.61C21.12,8.22 21,11.64 21,12C21,12.27 21.09,14.96 19.88,18.05L18.38,16.56M15.14,13.31C15.19,12.92 15.22,12.5 15.24,12.03V12C15.14,8.5 14.13,7.21 14.13,7.21C14.13,7.21 13.89,6.34 14.59,6C15.3,5.69 15.77,6.23 15.77,6.23C17.26,8.94 17.16,11.64 17.14,12C17.15,12.2 17.2,13.38 16.82,15L15.14,13.31M10.2,8.38C10.23,7.77 10.59,7.64 10.59,7.64C10.59,7.64 11.19,7.37 11.57,7.8C11.91,8.19 12.72,9.57 12.89,11.07L10.2,8.38Z",
"name": "nfc-off"
},
{ "path": "M20,4H4V20H12V8H16V20H20V4", "name": "npm-variant" },
{
"path": "M3,3V21H21V3H3M6,6H18V18H15V9H12V18H6V6Z",
"name": "npm-variant-outline"
},
{
"path": "M8.32,21.97C8.21,21.92 8.08,21.76 8.06,21.65C8.03,21.5 8,21.76 8.66,17.56C9.26,13.76 9.25,13.82 9.33,13.71C9.46,13.54 9.44,13.54 10.94,13.53C12.26,13.5 12.54,13.5 13.13,13.41C16.38,12.96 18.39,11.05 19.09,7.75C19.13,7.53 19.17,7.34 19.18,7.34C19.18,7.33 19.25,7.38 19.33,7.44C20.36,8.22 20.71,9.66 20.32,11.58C19.86,13.87 18.64,15.39 16.74,16.04C15.93,16.32 15.25,16.43 14.05,16.46C13.25,16.5 13.23,16.5 13,16.65C12.83,16.82 12.84,16.79 12.45,19.2C12.18,20.9 12.08,21.45 12.04,21.55C11.97,21.71 11.83,21.85 11.67,21.93L11.56,22H10C8.71,22 8.38,22 8.32,21.97V21.97M3.82,19.74C3.63,19.64 3.5,19.47 3.5,19.27C3.5,19 6.11,2.68 6.18,2.5C6.27,2.32 6.5,2.13 6.68,2.06L6.83,2H10.36C14.27,2 14.12,2 15,2.2C17.62,2.75 18.82,4.5 18.37,7.13C17.87,10.06 16.39,11.8 13.87,12.43C13,12.64 12.39,12.7 10.73,12.7C9.42,12.7 9.32,12.71 9.06,12.85C8.8,13 8.59,13.27 8.5,13.6C8.46,13.67 8.23,15.07 7.97,16.7C7.71,18.33 7.5,19.69 7.5,19.72L7.47,19.78H5.69C4.11,19.78 3.89,19.78 3.82,19.74V19.74Z",
"name": "paypal"
},
{
"path": "M12,7A2,2 0 0,1 10,9A2,2 0 0,1 8,7C7.37,7.84 7,8.87 7,10A5,5 0 0,0 12,15A5,5 0 0,0 17,10A5,5 0 0,0 12,5C11.57,5 11.16,5.05 10.77,5.15C11.5,5.45 12,6.17 12,7M12,2A8,8 0 0,1 20,10C20,11.05 19.8,12.04 19.43,12.96C17.89,17.38 13.63,22 12,22C10.37,22 6.11,17.38 4.57,12.96C4.2,12.04 4,11.05 4,10A8,8 0 0,1 12,2Z",
"name": "periscope"
},
{
"path": "M5,3H19A2,2 0 0,1 21,5V19A2,2 0 0,1 19,21H9.29C9.69,20.33 10.19,19.38 10.39,18.64L11.05,16.34C11.36,16.95 12.28,17.45 13.22,17.45C16.17,17.45 18.22,14.78 18.22,11.45C18.22,8.28 15.64,5.89 12.3,5.89C8.14,5.89 5.97,8.67 5.97,11.72C5.97,13.14 6.69,14.89 7.91,15.45C8.08,15.56 8.19,15.5 8.19,15.34L8.47,14.28C8.5,14.14 8.5,14.06 8.41,14C7.97,13.45 7.69,12.61 7.69,11.78C7.69,9.64 9.3,7.61 12.03,7.61C14.42,7.61 16.08,9.19 16.08,11.5C16.08,14.11 14.75,15.95 13.03,15.95C12.05,15.95 11.39,15.11 11.55,14.17C11.83,13.03 12.39,11.83 12.39,11C12.39,10.22 12,9.61 11.16,9.61C10.22,9.61 9.39,10.61 9.39,11.95C9.39,12.83 9.66,13.39 9.66,13.39L8.55,18.17C8.39,19 8.47,20.25 8.55,21H5A2,2 0 0,1 3,19V5A2,2 0 0,1 5,3Z",
"name": "pinterest-box"
},
{
"path": "M21.9,4.26C21.64,3.55 20.96,3.07 20.2,3.07H20.19L18.46,3.07H3.81C3.07,3.07 2.39,3.54 2.12,4.24C2.04,4.45 2,4.66 2,4.88V10.92L2.07,12.12C2.36,14.85 3.78,17.23 5.97,18.9C6,18.93 6.05,18.96 6.09,19H6.11C7.29,19.86 8.6,20.44 10,20.73C10.68,20.86 11.35,20.93 12,20.93C12.63,20.93 13.25,20.87 13.85,20.76C13.93,20.75 14,20.73 14.07,20.72C14.09,20.71 14.11,20.7 14.14,20.69C15.5,20.4 16.76,19.83 17.89,19H17.91C17.95,18.96 18,18.93 18.03,18.9C20.22,17.23 21.64,14.85 21.93,12.12L22,10.92V4.88C22,4.68 21.97,4.47 21.9,4.26M17.67,10.55L12.96,15.06C12.7,15.32 12.35,15.44 12,15.44C11.67,15.44 11.33,15.32 11.06,15.06L6.36,10.55C5.81,10.03 5.79,9.16 6.32,8.61C6.84,8.06 7.71,8.05 8.26,8.57L12,12.17L15.77,8.57C16.31,8.05 17.18,8.07 17.71,8.61C18.23,9.16 18.21,10.03 17.67,10.55Z",
"name": "pocket"
},
{
"path": "M12,3A9,9 0 0,1 21,12C21,13.76 20.5,15.4 19.62,16.79L21,18.17V20A1,1 0 0,1 20,21H18.18L16.79,19.62C15.41,20.5 13.76,21 12,21A9,9 0 0,1 3,12A9,9 0 0,1 12,3M12,7A5,5 0 0,0 7,12A5,5 0 0,0 12,17C12.65,17 13.26,16.88 13.83,16.65L10.95,13.77C10.17,13 10.17,11.72 10.95,10.94C11.73,10.16 13,10.16 13.78,10.94L16.66,13.82C16.88,13.26 17,12.64 17,12A5,5 0 0,0 12,7Z",
"name": "quicktime"
},
{
"path": "M18.61,5.89C18.6,5.79 18.5,5.73 18.44,5.73C18.37,5.72 16.83,5.61 16.83,5.61C16.83,5.61 15.76,4.55 15.65,4.43C15.53,4.31 15.3,4.35 15.21,4.37C15.2,4.37 15,4.44 14.61,4.55C14.25,3.5 13.62,2.58 12.43,2.58C12.11,2.18 11.72,2 11.38,2C8.8,2 7.57,5.22 7.18,6.86C6.18,7.17 5.47,7.39 5.37,7.42C4.82,7.6 4.8,7.62 4.73,8.14C4.67,8.54 3.21,19.86 3.21,19.86L14.61,22L20.79,20.66C20.79,20.66 18.62,6 18.61,5.89M14,4.76C13.69,4.85 13.37,4.95 13,5.06C13,5 13,4.93 13,4.85C13,4.21 12.93,3.7 12.79,3.29C13.35,3.36 13.73,4 14,4.76M12.08,3.42C12.24,3.82 12.34,4.39 12.34,5.16C12.34,5.2 12.34,5.24 12.34,5.27C11.71,5.46 11.03,5.68 10.35,5.89C10.73,4.4 11.45,3.69 12.08,3.42M11.31,2.69C11.42,2.69 11.53,2.73 11.64,2.8C10.81,3.19 9.93,4.17 9.55,6.12C9,6.3 8.47,6.46 8,6.62C8.42,5.12 9.46,2.69 11.31,2.69M12.5,9.15L11.76,11.42C11.76,11.42 11.09,11.06 10.27,11.06C9.07,11.06 9,11.81 9,12C9,13.04 11.71,13.43 11.71,15.86C11.71,17.77 10.5,19 8.87,19C6.91,19 5.91,17.78 5.91,17.78L6.43,16.05C6.43,16.05 7.46,16.93 8.33,16.93C8.9,16.93 9.13,16.5 9.13,16.16C9.13,14.81 6.92,14.75 6.92,12.53C6.92,10.66 8.26,8.85 10.97,8.85C12,8.85 12.5,9.15 12.5,9.15M15.43,5.29L16.75,6.6L17.71,6.68C18.05,9 19.19,16.73 19.66,19.88L14.66,20.97L15.43,5.29Z",
"name": "shopify"
},
{
"path": "M7.47,17.19C7.37,17.95 7.08,18.21 6.19,18.21C5.27,18.21 4.87,17.79 4.81,16.87L4.61,13.65C4.61,12.91 4.87,12.55 5.86,12.55C7.21,12.55 7.04,13.54 7.64,14.5C8.33,15.62 10,16.35 12.31,16.35C15.17,16.35 17,15.14 17,13.57C17,12.23 15.89,11.39 13.85,11.16L11.5,10.89C7.21,10.42 5.1,9.19 5.1,6.62C5.1,4.07 8.06,2 12.21,2C13.5,2 14.81,2.29 16.29,2.76C16.29,2.26 16.58,2.1 17.3,2.1C18.46,2.1 18.55,2.39 18.62,3.08L18.85,5.88C18.85,6.5 18.39,6.83 17.63,6.83C16.35,6.83 16.55,5.88 15.86,5.07C15.17,4.26 13.79,3.73 12.08,3.73C9.44,3.73 7.7,4.89 7.7,6.5C7.7,7.8 8.92,8.56 11.38,8.82L13.95,9.08C17.7,9.5 19.61,10.92 19.61,13.33C19.61,16.17 16.71,18.08 12.21,18.08C10.56,18.08 9.08,17.77 7.47,17.19M1,16H2V21H23V22H1V16Z",
"name": "slackware"
},
{
"path": "M6,3H18A3,3 0 0,1 21,6V18A3,3 0 0,1 18,21H6A3,3 0 0,1 3,18V6A3,3 0 0,1 6,3M7,6A1,1 0 0,0 6,7V17A1,1 0 0,0 7,18H17A1,1 0 0,0 18,17V7A1,1 0 0,0 17,6H7M9.5,9H14.5A0.5,0.5 0 0,1 15,9.5V14.5A0.5,0.5 0 0,1 14.5,15H9.5A0.5,0.5 0 0,1 9,14.5V9.5A0.5,0.5 0 0,1 9.5,9Z",
"name": "square-inc"
},
{
"path": "M5.5,0H18.5A5.5,5.5 0 0,1 24,5.5V18.5A5.5,5.5 0 0,1 18.5,24H5.5A5.5,5.5 0 0,1 0,18.5V5.5A5.5,5.5 0 0,1 5.5,0M15.39,15.18C15.39,16.76 14.5,17.81 12.85,17.95V12.61C14.55,13.13 15.39,13.66 15.39,15.18M11.65,6V10.88C10.34,10.5 9.03,9.93 9.03,8.43C9.03,6.94 10.18,6.12 11.65,6M15.5,7.6L16.5,6.8C15.62,5.66 14.4,4.92 12.85,4.77V3.8H11.65V3.8L11.65,4.75C9.5,4.89 7.68,6.17 7.68,8.5C7.68,11 9.74,11.78 11.65,12.29V17.96C10.54,17.84 9.29,17.31 8.43,16.03L7.3,16.78C8.2,18.12 9.76,19 11.65,19.14V20.2H12.07L12.85,20.2V19.16C15.35,19 16.7,17.34 16.7,15.14C16.7,12.58 14.81,11.76 12.85,11.19V6.05C14,6.22 14.85,6.76 15.5,7.6Z",
"name": "square-inc-cash"
},
{
"path": "M19,3A2,2 0 0,1 21,5V19A2,2 0 0,1 19,21H5A2,2 0 0,1 3,19V15L6.19,16.31C6.45,17.6 7.6,18.58 8.97,18.58C10.53,18.58 11.8,17.31 11.8,15.75V15.62L15.2,13.19H15.28C17.36,13.19 19.05,11.5 19.05,9.42C19.05,7.34 17.36,5.65 15.28,5.65C13.2,5.65 11.5,7.34 11.5,9.42V9.47L9.13,12.93L8.97,12.92C8.38,12.92 7.83,13.1 7.38,13.41L3,11.6V5A2,2 0 0,1 5,3H19M8.28,17.17C9.08,17.5 10,17.13 10.33,16.33C10.66,15.53 10.28,14.62 9.5,14.29L8.22,13.76C8.71,13.58 9.26,13.57 9.78,13.79C10.31,14 10.72,14.41 10.93,14.94C11.15,15.46 11.15,16.04 10.93,16.56C10.5,17.64 9.23,18.16 8.15,17.71C7.65,17.5 7.27,17.12 7.06,16.67L8.28,17.17M17.8,9.42C17.8,10.81 16.67,11.94 15.28,11.94C13.9,11.94 12.77,10.81 12.77,9.42A2.51,2.51 0 0,1 15.28,6.91C16.67,6.91 17.8,8.04 17.8,9.42M13.4,9.42C13.4,10.46 14.24,11.31 15.29,11.31C16.33,11.31 17.17,10.46 17.17,9.42C17.17,8.38 16.33,7.53 15.29,7.53C14.24,7.53 13.4,8.38 13.4,9.42Z",
"name": "steam-box"
},
{
"path": "M14.92,17.16L16.75,13.53H19.45L14.94,22.5L10.37,13.53H13.07L14.92,17.16M10.63,8.66L8.18,13.55H4.55L10.61,1.5L16.74,13.55H13.11L10.63,8.66Z",
"name": "strava"
},
{
"path": "M12,14C11,14 9,15 9,16C9,18 12,18 12,18V17A1,1 0 0,1 11,16A1,1 0 0,1 12,15V14M12,19C12,19 8,18.5 8,16.5C8,13.5 11,12.75 12,12.75V11.5C11,11.5 7,13 7,16C7,20 12,20 12,20V19M10.07,7.03L11.26,7.56C11.69,5.12 12.84,3.5 12.84,3.5C12.41,4.53 12.13,5.38 11.95,6.05C13.16,3.55 15.61,2 15.61,2C14.43,3.18 13.56,4.46 12.97,5.53C14.55,3.85 16.74,2.75 16.74,2.75C14.05,4.47 12.84,7.2 12.54,7.96L13.09,8.04C13.09,8.56 13.09,9.04 13.34,9.42C14.1,11.31 18,11.47 18,16C18,20.53 13.97,22 11.83,22C9.69,22 5,21.03 5,16C5,10.97 9.95,10.93 10.83,8.92C10.95,8.54 10.07,7.03 10.07,7.03Z",
"name": "tor"
},
{
"path": "M17,11H13V15.5C13,16.44 13.28,17 14.5,17H17V21C17,21 15.54,21.05 14.17,21.05C10.8,21.05 9.5,19 9.5,16.75V11H7V7C10.07,6.74 10.27,4.5 10.5,3H13V7H17",
"name": "tumblr"
},
{
"path": "M16,11H13V14.9C13,15.63 13.14,16 14.1,16H16V19C16,19 14.97,19.1 13.9,19.1C11.25,19.1 10,17.5 10,15.7V11H8V8.2C10.41,8 10.62,6.16 10.8,5H13V8H16M20,2H4C2.89,2 2,2.89 2,4V20A2,2 0 0,0 4,22H20A2,2 0 0,0 22,20V4C22,2.89 21.1,2 20,2Z",
"name": "tumblr-box"
},
{
"path": "M3.75,17L8,12.75V16H18V11.5L20,9.5V16A2,2 0 0,1 18,18H8V21.25L3.75,17M20.25,7L16,11.25V8H6V12.5L4,14.5V8A2,2 0 0,1 6,6H16V2.75L20.25,7Z",
"name": "tumblr-reblog"
},
{
"path": "M5,3H19A2,2 0 0,1 21,5V19A2,2 0 0,1 19,21H5A2,2 0 0,1 3,19V5A2,2 0 0,1 5,3M17.71,9.33C18.19,8.93 18.75,8.45 19,7.92C18.59,8.13 18.1,8.26 17.56,8.33C18.06,7.97 18.47,7.5 18.68,6.86C18.16,7.14 17.63,7.38 16.97,7.5C15.42,5.63 11.71,7.15 12.37,9.95C9.76,9.79 8.17,8.61 6.85,7.16C6.1,8.38 6.75,10.23 7.64,10.74C7.18,10.71 6.83,10.57 6.5,10.41C6.54,11.95 7.39,12.69 8.58,13.09C8.22,13.16 7.82,13.18 7.44,13.12C7.81,14.19 8.58,14.86 9.9,15C9,15.76 7.34,16.29 6,16.08C7.15,16.81 8.46,17.39 10.28,17.31C14.69,17.11 17.64,13.95 17.71,9.33Z",
"name": "twitter-box"
},
{
"path": "M17.71,9.33C18.19,8.93 18.75,8.45 19,7.92C18.59,8.13 18.1,8.26 17.56,8.33C18.06,7.97 18.47,7.5 18.68,6.86C18.16,7.14 17.63,7.38 16.97,7.5C15.42,5.63 11.71,7.15 12.37,9.95C9.76,9.79 8.17,8.61 6.85,7.16C6.1,8.38 6.75,10.23 7.64,10.74C7.18,10.71 6.83,10.57 6.5,10.41C6.54,11.95 7.39,12.69 8.58,13.09C8.22,13.16 7.82,13.18 7.44,13.12C7.81,14.19 8.58,14.86 9.9,15C9,15.76 7.34,16.29 6,16.08C7.15,16.81 8.46,17.39 10.28,17.31C14.69,17.11 17.64,13.95 17.71,9.33M12,2A10,10 0 0,1 22,12A10,10 0 0,1 12,22A10,10 0 0,1 2,12A10,10 0 0,1 12,2Z",
"name": "twitter-circle"
},
{
"path": "M6.38,13.24V13.24C6.38,11.84 6.38,10.44 6.38,9.04H7.4V15.84H6.39C6.39,15.63 6.39,15.42 6.39,15.21C5.93,15.68 5.29,15.96 4.58,15.96C3.12,15.96 2,14.9 2,13.3V9.04H3V13.24C3,14.33 3.74,15.04 4.7,15.04C5.64,15.04 6.38,14.31 6.38,13.24M9.14,9.04V11.5C9.37,11.29 9.65,11.1 9.95,10.97C10.25,10.85 10.58,10.78 10.91,10.78C12.37,10.78 13.5,11.94 13.5,13.37C13.5,14.8 12.37,15.96 10.91,15.96C10.58,15.96 10.25,15.89 9.95,15.77C9.64,15.64 9.37,15.45 9.13,15.22C9.13,15.43 9.13,15.63 9.13,15.84C8.81,15.84 8.5,15.84 8.16,15.84V9.04H9.14M12.55,13.37V13.37C12.55,12.41 11.77,11.65 10.84,11.65C9.89,11.65 9.13,12.41 9.13,13.37C9.13,14.32 9.88,15.09 10.84,15.09C11.77,15.09 12.55,14.32 12.55,13.37M16.46,10.79C17.9,10.79 18.95,11.89 18.95,13.36V13.69H14.91C15.04,14.5 15.71,15.09 16.55,15.09C17.13,15.09 17.61,14.86 18,14.36L18.7,14.89C18.2,15.55 17.46,15.95 16.55,15.95C15.06,15.95 13.91,14.84 13.91,13.36C13.91,11.97 15,10.79 16.46,10.79M14.92,12.91H17.95C17.79,12.15 17.18,11.65 16.44,11.65C15.71,11.65 15.1,12.15 14.92,12.91M20.5,13V15.84H19.5V10.89C19.82,10.89 20.14,10.89 20.47,10.89V11.5C20.71,11.1 21.11,10.85 21.66,10.85H22V11.76H21.59C20.95,11.76 20.5,12.26 20.5,13",
"name": "uber"
},
{
"path": "M19.5,3C20.14,4.08 20.44,5.19 20.44,6.6C20.44,11.08 16.61,16.91 13.5,21H6.41L3.56,4L9.77,3.39L11.28,15.5C12.69,13.21 14.42,9.61 14.42,7.16C14.42,5.81 14.19,4.9 13.83,4.15L19.5,3Z",
"name": "venmo"
},
{
"path": "M5,3A2,2 0 0,0 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V5A2,2 0 0,0 19,3H5M5.5,8.5H7C7.36,8.5 7.5,8.66 7.64,9.07C8.36,11.17 9.57,13 10.07,13C10.26,13 10.35,12.92 10.35,12.45V10.28C10.29,9.28 9.76,9.19 9.76,8.84C9.76,8.67 9.9,8.5 10.14,8.5H12.45C12.77,8.5 12.87,8.67 12.87,9.04V11.96C12.87,12.27 13,12.38 13.1,12.38C13.29,12.38 13.45,12.27 13.79,11.93C14.85,10.74 15.6,8.92 15.6,8.92C15.7,8.7 15.87,8.5 16.24,8.5H17.71C18.16,8.5 18.26,8.73 18.16,9.04C17.97,9.9 16.18,12.43 16.18,12.43C16,12.68 15.96,12.8 16.18,13.09C16.33,13.3 16.85,13.74 17.19,14.15C17.83,14.86 18.3,15.46 18.44,15.87C18.56,16.29 18.35,16.5 17.93,16.5H16.45C15.89,16.5 15.73,16.05 14.73,15.05C13.85,14.21 13.5,14.1 13.26,14.1C12.96,14.1 12.87,14.18 12.87,14.61V15.93C12.87,16.29 12.76,16.5 11.82,16.5C10.26,16.5 8.54,15.55 7.33,13.8C5.5,11.24 5,9.31 5,8.92C5,8.7 5.08,8.5 5.5,8.5Z",
"name": "vk-box"
},
{
"path": "M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2M5.5,8.5H7C7.36,8.5 7.5,8.66 7.64,9.07C8.36,11.17 9.57,13 10.07,13C10.26,13 10.35,12.92 10.35,12.45V10.28C10.29,9.28 9.76,9.19 9.76,8.84C9.76,8.67 9.9,8.5 10.14,8.5H12.45C12.77,8.5 12.87,8.67 12.87,9.04V11.96C12.87,12.27 13,12.38 13.1,12.38C13.29,12.38 13.45,12.27 13.79,11.93C14.85,10.74 15.6,8.92 15.6,8.92C15.7,8.7 15.87,8.5 16.24,8.5H17.71C18.16,8.5 18.26,8.73 18.16,9.04C17.97,9.9 16.18,12.43 16.18,12.43C16,12.68 15.96,12.8 16.18,13.09C16.33,13.3 16.85,13.74 17.19,14.15C17.83,14.86 18.3,15.46 18.44,15.87C18.56,16.29 18.35,16.5 17.93,16.5H16.45C15.89,16.5 15.73,16.05 14.73,15.05C13.85,14.21 13.5,14.1 13.26,14.1C12.96,14.1 12.87,14.18 12.87,14.61V15.93C12.87,16.29 12.76,16.5 11.82,16.5C10.26,16.5 8.54,15.55 7.33,13.8C5.5,11.24 5,9.31 5,8.92C5,8.7 5.08,8.5 5.5,8.5Z",
"name": "vk-circle"
},
{
"path": "M17,17.5L12,15L7,17.5V5H5V19H19V5H17V17.5M12,12.42L14.25,13.77L13.65,11.22L15.64,9.5L13,9.27L12,6.86L11,9.27L8.36,9.5L10.35,11.22L9.75,13.77L12,12.42M5,3H19A2,2 0 0,1 21,5V19A2,2 0 0,1 19,21H5A2,2 0 0,1 3,19V5A2,2 0 0,1 5,3Z",
"name": "wunderlist"
},
{
"path": "M0 16.7L3.2 12.9L0 9.1L1.5 7.8L4.5 11.3L7.5 7.8L9 9.1L5.8 12.9L9 16.7L7.5 18L4.5 14.4L1.5 18L0 16.7M24 16.9C24 17.4 23.6 17.9 23 17.9H20C18.9 17.9 18 17 18 15.9V13.9C18 12.8 18.9 11.9 20 11.9H22V9.9H18V8H23C23.5 8 24 8.4 24 9M22 14H20V16H22V14M16 16.9C16 17.4 15.6 17.9 15 17.9H12C10.9 17.9 10 17 10 15.9V9.9C10 8.8 10.9 7.9 12 7.9H14V5H16V16.9M14 15.9V9.9H12V15.9H14Z",
"name": "xda"
},
{
"path": "M4.8,3C3.8,3 3,3.8 3,4.8V19.2C3,20.2 3.8,21 4.8,21H19.2C20.2,21 21,20.2 21,19.2V4.8C21,3.8 20.2,3 19.2,3M16.07,5H18.11C18.23,5 18.33,5.04 18.37,5.13C18.43,5.22 18.43,5.33 18.37,5.44L13.9,13.36L16.75,18.56C16.81,18.67 16.81,18.78 16.75,18.87C16.7,18.95 16.61,19 16.5,19H14.47C14.16,19 14,18.79 13.91,18.61L11.04,13.35C11.18,13.1 15.53,5.39 15.53,5.39C15.64,5.19 15.77,5 16.07,5M7.09,7.76H9.1C9.41,7.76 9.57,7.96 9.67,8.15L11.06,10.57C10.97,10.71 8.88,14.42 8.88,14.42C8.77,14.61 8.63,14.81 8.32,14.81H6.3C6.18,14.81 6.09,14.76 6.04,14.67C6,14.59 6,14.47 6.04,14.36L8.18,10.57L6.82,8.2C6.77,8.09 6.75,8 6.81,7.89C6.86,7.81 6.96,7.76 7.09,7.76Z",
"name": "xing-box"
},
{
"path": "M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2M15.85,6H17.74C17.86,6 17.94,6.04 18,6.12C18.04,6.2 18.04,6.3 18,6.41L13.84,13.76L16.5,18.59C16.53,18.69 16.53,18.8 16.5,18.88C16.43,18.96 16.35,19 16.24,19H14.36C14.07,19 13.93,18.81 13.84,18.64L11.17,13.76C11.31,13.5 15.35,6.36 15.35,6.36C15.45,6.18 15.57,6 15.85,6M7.5,8.57H9.39C9.67,8.57 9.81,8.75 9.9,8.92L11.19,11.17C11.12,11.3 9.17,14.75 9.17,14.75C9.07,14.92 8.94,15.11 8.66,15.11H6.78C6.67,15.11 6.59,15.06 6.54,15C6.5,14.9 6.5,14.8 6.54,14.69L8.53,11.17L7.27,9C7.21,8.87 7.2,8.77 7.25,8.69C7.3,8.61 7.39,8.57 7.5,8.57Z",
"name": "xing-circle"
},
{
"path": "M10.59,2C11.23,2 11.5,2.27 11.58,2.97L11.79,6.14L12.03,10.29C12.05,10.64 12,11 11.86,11.32C11.64,11.77 11.14,11.89 10.73,11.58C10.5,11.39 10.31,11.14 10.15,10.87L6.42,4.55C6.06,3.94 6.17,3.54 6.77,3.16C7.5,2.68 9.73,2 10.59,2M14.83,14.85L15.09,14.91L18.95,16.31C19.61,16.55 19.79,16.92 19.5,17.57C19.06,18.7 18.34,19.66 17.42,20.45C16.96,20.85 16.5,20.78 16.21,20.28L13.94,16.32C13.55,15.61 14.03,14.8 14.83,14.85M4.5,14C4.5,13.26 4.5,12.55 4.75,11.87C4.97,11.2 5.33,11 6,11.27L9.63,12.81C10.09,13 10.35,13.32 10.33,13.84C10.3,14.36 9.97,14.58 9.53,14.73L5.85,15.94C5.15,16.17 4.79,15.96 4.64,15.25C4.55,14.83 4.47,14.4 4.5,14M11.97,21C11.95,21.81 11.6,22.12 10.81,22C9.77,21.8 8.81,21.4 7.96,20.76C7.54,20.44 7.45,19.95 7.76,19.53L10.47,15.97C10.7,15.67 11.03,15.6 11.39,15.74C11.77,15.88 11.97,16.18 11.97,16.59V21M14.45,13.32C13.73,13.33 13.23,12.5 13.64,11.91C14.47,10.67 15.35,9.46 16.23,8.26C16.5,7.85 16.94,7.82 17.31,8.16C18.24,9 18.91,10 19.29,11.22C19.43,11.67 19.25,12.08 18.83,12.2L15.09,13.17L14.45,13.32Z",
"name": "yelp"
}
]
[]

View File

@@ -2,7 +2,6 @@ const webpack = require("webpack");
const path = require("path");
const TerserPlugin = require("terser-webpack-plugin");
const ManifestPlugin = require("webpack-manifest-plugin");
const WorkerPlugin = require("worker-plugin");
const paths = require("./paths.js");
const bundle = require("./bundle");
@@ -30,7 +29,7 @@ const createWebpackConfig = ({
module: {
rules: [
{
test: /\.js$|\.ts$/,
test: /\.m?js$|\.ts$/,
exclude: bundle.babelExclude(),
use: {
loader: "babel-loader",
@@ -54,8 +53,10 @@ const createWebpackConfig = ({
}),
],
},
experiments: {
topLevelAwait: true,
},
plugins: [
new WorkerPlugin(),
new ManifestPlugin({
// Only include the JS of entrypoints
filter: (file) => file.isInitial && !file.name.endsWith(".map"),
@@ -110,6 +111,22 @@ const createWebpackConfig = ({
}
return `${chunk.name}.${chunk.hash.substr(0, 8)}.js`;
},
environment: {
// The environment supports arrow functions ('() => { ... }').
arrowFunction: latestBuild,
// The environment supports BigInt as literal (123n).
bigIntLiteral: false,
// The environment supports const and let for variable declarations.
const: latestBuild,
// The environment supports destructuring ('{ a, b } = obj').
destructuring: latestBuild,
// The environment supports an async import() function to import EcmaScript modules.
dynamicImport: latestBuild,
// The environment supports 'for of' iteration ('for (const x of array) { ... }').
forOf: latestBuild,
// The environment supports ECMAScript Module syntax to import ECMAScript modules (import ... from '...').
module: latestBuild,
},
chunkFilename:
isProdBuild && !isStatsBuild
? "chunk.[chunkhash].js"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 186 KiB

After

Width:  |  Height:  |  Size: 186 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

After

Width:  |  Height:  |  Size: 68 KiB

View File

@@ -212,13 +212,8 @@
Chromecast is a technology developed by Google, and is available on:
</p>
<ul>
<li>Google Chrome (all platforms except on iOS)</li>
<li>
Microsoft Edge (all platforms,
<a href="https://www.microsoftedgeinsider.com" target="_blank"
>dev and canary builds only</a
>)
</li>
<li>Google Chrome (all platforms except iOS)</li>
<li>Microsoft Edge (all platforms)</li>
</ul>
</div>

View File

@@ -1,3 +1,4 @@
import "../../../src/resources/safari-14-attachshadow-patch";
import "../../../src/resources/ha-style";
import "../../../src/resources/roboto";
import "./layout/hc-connect";

View File

@@ -30,7 +30,7 @@ class HcLayout extends LitElement {
<ha-card>
<div class="layout">
<img class="hero" src="/images/google-nest-hub.png" />
<div class="card-header">
<h1 class="card-header">
Home Assistant Cast${this.subtitle ? ` ${this.subtitle}` : ""}
${this.auth
? html`
@@ -44,7 +44,7 @@ class HcLayout extends LitElement {
</div>
`
: ""}
</div>
</h1>
<slot></slot>
</div>
</ha-card>

View File

@@ -6,13 +6,60 @@ import { castContext } from "./cast_context";
import { HcMain } from "./layout/hc-main";
import { ReceivedMessage } from "./types";
const controller = new HcMain();
document.body.append(controller);
const lovelaceController = new HcMain();
document.body.append(lovelaceController);
const mediaPlayer = document.createElement("cast-media-player");
mediaPlayer.style.display = "none";
document.body.append(mediaPlayer);
const playerStylesAdded = false;
let controls: HTMLElement | null;
const setTouchControlsVisibility = (visible: boolean) => {
if (!castContext.getDeviceCapabilities().touch_input_supported) {
return;
}
controls =
controls ||
(document.body.querySelector("touch-controls") as HTMLElement | null);
if (controls) {
controls.style.display = visible ? "initial" : "none";
}
};
const showLovelaceController = () => {
mediaPlayer.style.display = "none";
lovelaceController.style.display = "initial";
document.body.setAttribute("style", "overflow-y: auto !important");
setTouchControlsVisibility(false);
};
const showMediaPlayer = () => {
lovelaceController.style.display = "none";
mediaPlayer.style.display = "initial";
document.body.removeAttribute("style");
setTouchControlsVisibility(true);
if (!playerStylesAdded) {
const style = document.createElement("style");
style.innerHTML = `
body {
--logo-image: url('https://www.home-assistant.io/images/home-assistant-logo.svg');
--logo-repeat: no-repeat;
--playback-logo-image: url('https://www.home-assistant.io/images/home-assistant-logo.svg');
--theme-hue: 200;
--progress-color: #03a9f4;
--splash-image: url('https://home-assistant.io/images/cast/splash.png');
--splash-size: cover;
}
`;
document.head.appendChild(style);
}
};
const options = new cast.framework.CastReceiverOptions();
options.disableIdleTimeout = true;
options.customNamespaces = {
// @ts-ignore
[CAST_NS]: cast.framework.system.MessageType.JSON,
};
@@ -30,13 +77,61 @@ options.uiConfig = new cast.framework.ui.UiConfig();
// @ts-ignore
options.uiConfig.touchScreenOptimizedApp = true;
castContext.setInactivityTimeout(86400); // 1 day
castContext.addCustomMessageListener(
CAST_NS,
// @ts-ignore
(ev: ReceivedMessage<HassMessage>) => {
// We received a show Lovelace command, stop media from playing, hide media player and show Lovelace controller
if (
playerManager.getPlayerState() !==
cast.framework.messages.PlayerState.IDLE
) {
playerManager.stop();
} else {
showLovelaceController();
}
const msg = ev.data;
msg.senderId = ev.senderId;
controller.processIncomingMessage(msg);
lovelaceController.processIncomingMessage(msg);
}
);
const playerManager = castContext.getPlayerManager();
playerManager.setMessageInterceptor(
cast.framework.messages.MessageType.LOAD,
(loadRequestData) => {
// We received a play media command, hide Lovelace and show media player
showMediaPlayer();
const media = loadRequestData.media;
// Special handling if it came from Google Assistant
if (media.entity) {
media.contentId = media.entity;
media.streamType = cast.framework.messages.StreamType.LIVE;
media.contentType = "application/vnd.apple.mpegurl";
// @ts-ignore
media.hlsVideoSegmentFormat =
cast.framework.messages.HlsVideoSegmentFormat.FMP4;
}
return loadRequestData;
}
);
playerManager.addEventListener(
cast.framework.events.EventType.MEDIA_STATUS,
(event) => {
if (
event.mediaStatus?.playerState ===
cast.framework.messages.PlayerState.IDLE &&
event.mediaStatus?.idleReason &&
event.mediaStatus?.idleReason !==
cast.framework.messages.IdleReason.INTERRUPTED
) {
// media finished or stopped, return to default Lovelace
showLovelaceController();
}
}
);

View File

@@ -9,7 +9,6 @@ import {
} from "lit-element";
import { LovelaceConfig } from "../../../../src/data/lovelace";
import { Lovelace } from "../../../../src/panels/lovelace/types";
import "../../../../src/panels/lovelace/views/hui-panel-view";
import "../../../../src/panels/lovelace/views/hui-view";
import { HomeAssistant } from "../../../../src/types";
import "./hc-launch-screen";
@@ -22,6 +21,8 @@ class HcLovelace extends LitElement {
@property() public viewPath?: string | number;
public urlPath?: string | null;
protected render(): TemplateResult {
const index = this._viewIndex;
if (index === undefined) {
@@ -35,6 +36,7 @@ class HcLovelace extends LitElement {
const lovelace: Lovelace = {
config: this.lovelaceConfig,
editMode: false,
urlPath: this.urlPath!,
enableFullEditMode: () => undefined,
mode: "storage",
language: "en",
@@ -42,22 +44,13 @@ class HcLovelace extends LitElement {
deleteConfig: async () => undefined,
setEditMode: () => undefined,
};
return this.lovelaceConfig.views[index].panel
? html`
<hui-panel-view
.hass=${this.hass}
.lovelace=${lovelace}
.config=${this.lovelaceConfig.views[index]}
></hui-panel-view>
`
: html`
<hui-view
.hass=${this.hass}
.lovelace=${lovelace}
.index=${index}
columns="2"
></hui-view>
`;
return html`
<hui-view
.hass=${this.hass}
.lovelace=${lovelace}
.index=${index}
></hui-view>
`;
}
protected updated(changedProps) {
@@ -73,7 +66,7 @@ class HcLovelace extends LitElement {
if (configBackground) {
(this.shadowRoot!.querySelector(
"hui-view, hui-panel-view"
"hui-view"
) as HTMLElement)!.style.setProperty(
"--lovelace-background",
configBackground

View File

@@ -87,6 +87,7 @@ export class HcMain extends HassElement {
.hass=${this.hass}
.lovelaceConfig=${this._lovelaceConfig}
.viewPath=${this._lovelacePath}
.urlPath=${this._urlPath}
@config-refresh=${this._generateLovelaceConfig}
></hc-lovelace>
`;
@@ -215,9 +216,7 @@ export class HcMain extends HassElement {
}
this._showDemo = false;
this._lovelacePath = msg.viewPath;
if (castContext.getDeviceCapabilities().touch_input_supported) {
this._breakFree();
}
this._sendStatus();
}
@@ -240,9 +239,6 @@ export class HcMain extends HassElement {
this._showDemo = true;
this._lovelacePath = "overview";
this._sendStatus();
if (castContext.getDeviceCapabilities().touch_input_supported) {
this._breakFree();
}
});
}
@@ -263,14 +259,6 @@ export class HcMain extends HassElement {
}
}
private _breakFree() {
const controls = document.body.querySelector("touch-controls");
if (controls) {
controls.remove();
}
document.body.setAttribute("style", "overflow-y: auto !important");
}
private sendMessage(senderId: string, response: any) {
castContext.sendCustomMessage(CAST_NS, senderId, response);
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.4 KiB

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.3 KiB

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.1 KiB

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.7 KiB

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.5 KiB

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.9 KiB

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.9 KiB

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.5 KiB

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.2 KiB

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.5 KiB

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.9 KiB

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 767 B

After

Width:  |  Height:  |  Size: 532 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 803 B

After

Width:  |  Height:  |  Size: 535 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 75 KiB

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 71 KiB

After

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.2 KiB

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 106 KiB

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 57 KiB

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 83 KiB

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 375 B

After

Width:  |  Height:  |  Size: 184 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 111 KiB

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 19 KiB

View File

@@ -1,3 +1,4 @@
import "../../src/resources/safari-14-attachshadow-patch";
import "@polymer/polymer/lib/elements/dom-if";
import "@polymer/polymer/lib/elements/dom-repeat";
import "../../src/resources/ha-style";

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 111 KiB

After

Width:  |  Height:  |  Size: 110 KiB

View File

@@ -2,8 +2,8 @@ import { html } from "@polymer/polymer/lib/utils/html-tag";
/* eslint-plugin-disable lit */
import { PolymerElement } from "@polymer/polymer/polymer-element";
import "../../../src/components/ha-card";
import "../../../src/dialogs/more-info/more-info-content";
import "../../../src/state-summary/state-card-content";
import "./more-info-content";
class DemoMoreInfo extends PolymerElement {
static get template() {

View File

@@ -0,0 +1,73 @@
import { HassEntity } from "home-assistant-js-websocket";
import { property, PropertyValues, UpdatingElement } from "lit-element";
import dynamicContentUpdater from "../../../src/common/dom/dynamic_content_updater";
import { stateMoreInfoType } from "../../../src/dialogs/more-info/state_more_info_control";
import "../../../src/dialogs/more-info/controls/more-info-alarm_control_panel";
import "../../../src/dialogs/more-info/controls/more-info-automation";
import "../../../src/dialogs/more-info/controls/more-info-camera";
import "../../../src/dialogs/more-info/controls/more-info-climate";
import "../../../src/dialogs/more-info/controls/more-info-configurator";
import "../../../src/dialogs/more-info/controls/more-info-counter";
import "../../../src/dialogs/more-info/controls/more-info-cover";
import "../../../src/dialogs/more-info/controls/more-info-default";
import "../../../src/dialogs/more-info/controls/more-info-fan";
import "../../../src/dialogs/more-info/controls/more-info-group";
import "../../../src/dialogs/more-info/controls/more-info-humidifier";
import "../../../src/dialogs/more-info/controls/more-info-input_datetime";
import "../../../src/dialogs/more-info/controls/more-info-light";
import "../../../src/dialogs/more-info/controls/more-info-lock";
import "../../../src/dialogs/more-info/controls/more-info-media_player";
import "../../../src/dialogs/more-info/controls/more-info-person";
import "../../../src/dialogs/more-info/controls/more-info-script";
import "../../../src/dialogs/more-info/controls/more-info-sun";
import "../../../src/dialogs/more-info/controls/more-info-timer";
import "../../../src/dialogs/more-info/controls/more-info-vacuum";
import "../../../src/dialogs/more-info/controls/more-info-water_heater";
import "../../../src/dialogs/more-info/controls/more-info-weather";
import { HomeAssistant } from "../../../src/types";
class MoreInfoContent extends UpdatingElement {
@property({ attribute: false }) public hass?: HomeAssistant;
@property() public stateObj?: HassEntity;
private _detachedChild?: ChildNode;
protected firstUpdated(): void {
this.style.position = "relative";
this.style.display = "block";
}
// This is not a lit element, but an updating element, so we implement update
protected update(changedProps: PropertyValues): void {
super.update(changedProps);
const stateObj = this.stateObj;
const hass = this.hass;
if (!stateObj || !hass) {
if (this.lastChild) {
this._detachedChild = this.lastChild;
// Detach child to prevent it from doing work.
this.removeChild(this.lastChild);
}
return;
}
if (this._detachedChild) {
this.appendChild(this._detachedChild);
this._detachedChild = undefined;
}
const moreInfoType =
stateObj.attributes && "custom_ui_more_info" in stateObj.attributes
? stateObj.attributes.custom_ui_more_info
: "more-info-" + stateMoreInfoType(stateObj);
dynamicContentUpdater(this, moreInfoType.toUpperCase(), {
hass,
stateObj,
});
}
}
customElements.define("more-info-content", MoreInfoContent);

View File

@@ -3,10 +3,10 @@ import { html } from "@polymer/polymer/lib/utils/html-tag";
import { PolymerElement } from "@polymer/polymer/polymer-element";
import "../../../src/components/ha-card";
import { SUPPORT_BRIGHTNESS } from "../../../src/data/light";
import "../../../src/dialogs/more-info/more-info-content";
import { getEntity } from "../../../src/fake_data/entity";
import { provideHass } from "../../../src/fake_data/provide_hass";
import "../components/demo-more-infos";
import "../components/more-info-content";
const ENTITIES = [
getEntity("light", "bed_light", "on", {

View File

@@ -1,16 +1,17 @@
import "@polymer/app-layout/app-header-layout/app-header-layout";
import "@polymer/app-layout/app-header/app-header";
import "@polymer/app-layout/app-toolbar/app-toolbar";
import "../../src/components/ha-icon-button";
import "../../src/components/ha-icon";
import "@polymer/paper-item/paper-item";
import "@polymer/paper-item/paper-item-body";
import { html } from "@polymer/polymer/lib/utils/html-tag";
/* eslint-plugin-disable lit */
import { PolymerElement } from "@polymer/polymer/polymer-element";
import "../../src/components/ha-card";
import "../../src/components/ha-icon";
import "../../src/components/ha-icon-button";
import "../../src/managers/notification-manager";
import "../../src/styles/polymer-ha-style";
// eslint-disable-next-line import/extensions
import { DEMOS } from "../build/import-demos";
const fixPath = (path) => path.substr(2, path.length - 5);

View File

@@ -23,9 +23,9 @@ import { hassioStyle } from "../resources/hassio-style";
class HassioAddonRepositoryEl extends LitElement {
@property({ attribute: false }) public hass!: HomeAssistant;
@property() public repo!: HassioAddonRepository;
@property({ attribute: false }) public repo!: HassioAddonRepository;
@property() public addons!: HassioAddonInfo[];
@property({ attribute: false }) public addons!: HassioAddonInfo[];
@property() public filter!: string;
@@ -78,18 +78,18 @@ class HassioAddonRepositoryEl extends LitElement {
.title=${addon.name}
.description=${addon.description}
.available=${addon.available}
.icon=${addon.installed && addon.installed !== addon.version
.icon=${addon.installed && addon.update_available
? mdiArrowUpBoldCircle
: mdiPuzzle}
.iconTitle=${addon.installed
? addon.installed !== addon.version
? addon.update_available
? "New version available"
: "Add-on is installed"
: addon.available
? "Add-on is not installed"
: "Add-on is not available on your system"}
.iconClass=${addon.installed
? addon.installed !== addon.version
? addon.update_available
? "update"
: "installed"
: !addon.available
@@ -104,7 +104,7 @@ class HassioAddonRepositoryEl extends LitElement {
: undefined}
.showTopbar=${addon.installed || !addon.available}
.topbarClass=${addon.installed
? addon.installed !== addon.version
? addon.update_available
? "update"
: "installed"
: !addon.available

View File

@@ -1,15 +1,17 @@
import "@material/mwc-icon-button/mwc-icon-button";
import { ActionDetail } from "@material/mwc-list/mwc-list-foundation";
import "@material/mwc-list/mwc-list-item";
import { mdiDotsVertical } from "@mdi/js";
import {
css,
CSSResult,
internalProperty,
LitElement,
property,
internalProperty,
PropertyValues,
} from "lit-element";
import { html, TemplateResult } from "lit-html";
import { atLeastVersion } from "../../../src/common/config/version";
import "../../../src/common/search/search-input";
import "../../../src/components/ha-button-menu";
import "../../../src/components/ha-svg-icon";
@@ -19,13 +21,14 @@ import {
HassioAddonRepository,
reloadHassioAddons,
} from "../../../src/data/hassio/addon";
import "../../../src/layouts/hass-tabs-subpage";
import { extractApiErrorMessage } from "../../../src/data/hassio/common";
import "../../../src/layouts/hass-loading-screen";
import "../../../src/layouts/hass-tabs-subpage";
import { HomeAssistant, Route } from "../../../src/types";
import { showRegistriesDialog } from "../dialogs/registries/show-dialog-registries";
import { showRepositoriesDialog } from "../dialogs/repositories/show-dialog-repositories";
import { supervisorTabs } from "../hassio-tabs";
import "./hassio-addon-repository";
import { ActionDetail } from "@material/mwc-list/mwc-list-foundation";
const sortRepos = (a: HassioAddonRepository, b: HassioAddonRepository) => {
if (a.slug === "local") {
@@ -97,14 +100,14 @@ class HassioAddonStore extends LitElement {
main-page
.tabs=${supervisorTabs}
>
<span slot="header">Add-on store</span>
<span slot="header">Add-on Store</span>
<ha-button-menu
corner="BOTTOM_START"
slot="toolbar-icon"
@action=${this._handleAction}
>
<mwc-icon-button slot="trigger" alt="menu">
<ha-svg-icon path=${mdiDotsVertical}></ha-svg-icon>
<ha-svg-icon .path=${mdiDotsVertical}></ha-svg-icon>
</mwc-icon-button>
<mwc-list-item>
Repositories
@@ -112,6 +115,12 @@ class HassioAddonStore extends LitElement {
<mwc-list-item>
Reload
</mwc-list-item>
${this.hass.userData?.showAdvanced &&
atLeastVersion(this.hass.config.version, 0, 117)
? html`<mwc-list-item>
Registries
</mwc-list-item>`
: ""}
</ha-button-menu>
${repos.length === 0
? html`<hass-loading-screen no-toolbar></hass-loading-screen>`
@@ -156,6 +165,9 @@ class HassioAddonStore extends LitElement {
case 1:
this.refreshData();
break;
case 2:
this._manageRegistries();
break;
}
}
@@ -172,6 +184,10 @@ class HassioAddonStore extends LitElement {
});
}
private async _manageRegistries() {
showRegistriesDialog(this);
}
private async _loadData() {
try {
const addonsInfo = await fetchHassioAddonsInfo(this.hass);
@@ -179,7 +195,7 @@ class HassioAddonStore extends LitElement {
this._repos.sort(sortRepos);
this._addons = addonsInfo.addons;
} catch (err) {
alert("Failed to fetch add-on info");
alert(extractApiErrorMessage(err));
}
}

View File

@@ -28,6 +28,7 @@ import { haStyle } from "../../../../src/resources/styles";
import { HomeAssistant } from "../../../../src/types";
import { suggestAddonRestart } from "../../dialogs/suggestAddonRestart";
import { hassioStyle } from "../../resources/hassio-style";
import "../../../../src/components/buttons/ha-progress-button";
@customElement("hassio-addon-audio")
class HassioAddonAudio extends LitElement {
@@ -91,7 +92,9 @@ class HassioAddonAudio extends LitElement {
</paper-dropdown-menu>
</div>
<div class="card-actions">
<mwc-button @click=${this._saveSettings}>Save</mwc-button>
<ha-progress-button @click=${this._saveSettings}>
Save
</ha-progress-button>
</div>
</ha-card>
`;
@@ -172,7 +175,10 @@ class HassioAddonAudio extends LitElement {
}
}
private async _saveSettings(): Promise<void> {
private async _saveSettings(ev: CustomEvent): Promise<void> {
const button = ev.currentTarget as any;
button.progress = true;
this._error = undefined;
const data: HassioAddonSetOptionParams = {
audio_input:
@@ -182,12 +188,14 @@ class HassioAddonAudio extends LitElement {
};
try {
await setHassioAddonOption(this.hass, this.addon.slug, data);
if (this.addon?.state === "started") {
await suggestAddonRestart(this, this.hass, this.addon);
}
} catch {
this._error = "Failed to set addon audio device";
}
if (!this._error && this.addon?.state === "started") {
await suggestAddonRestart(this, this.hass, this.addon);
}
button.progress = false;
}
}

View File

@@ -5,14 +5,15 @@ import {
CSSResult,
customElement,
html,
internalProperty,
LitElement,
property,
internalProperty,
PropertyValues,
query,
TemplateResult,
} from "lit-element";
import { fireEvent } from "../../../../src/common/dom/fire_event";
import "../../../../src/components/buttons/ha-progress-button";
import "../../../../src/components/ha-card";
import "../../../../src/components/ha-yaml-editor";
import type { HaYamlEditor } from "../../../../src/components/ha-yaml-editor";
@@ -21,6 +22,7 @@ import {
HassioAddonSetOptionParams,
setHassioAddonOption,
} from "../../../../src/data/hassio/addon";
import { extractApiErrorMessage } from "../../../../src/data/hassio/common";
import { showConfirmationDialog } from "../../../../src/dialogs/generic/show-dialog-box";
import { haStyle } from "../../../../src/resources/styles";
import type { HomeAssistant } from "../../../../src/types";
@@ -37,13 +39,11 @@ class HassioAddonConfig extends LitElement {
@property({ type: Boolean }) private _configHasChanged = false;
@query("ha-yaml-editor") private _editor!: HaYamlEditor;
@property({ type: Boolean }) private _valid = true;
@query("ha-yaml-editor", true) private _editor!: HaYamlEditor;
protected render(): TemplateResult {
const editor = this._editor;
// If editor not rendered, don't show the error.
const valid = editor ? editor.isValid : true;
return html`
<h1>${this.addon.name}</h1>
<ha-card header="Configuration">
@@ -52,23 +52,106 @@ class HassioAddonConfig extends LitElement {
@value-changed=${this._configChanged}
></ha-yaml-editor>
${this._error ? html` <div class="errors">${this._error}</div> ` : ""}
${valid ? "" : html` <div class="errors">Invalid YAML</div> `}
${this._valid ? "" : html` <div class="errors">Invalid YAML</div> `}
</div>
<div class="card-actions">
<mwc-button class="warning" @click=${this._resetTapped}>
<ha-progress-button class="warning" @click=${this._resetTapped}>
Reset to defaults
</mwc-button>
<mwc-button
</ha-progress-button>
<ha-progress-button
@click=${this._saveTapped}
.disabled=${!this._configHasChanged || !valid}
.disabled=${!this._configHasChanged || !this._valid}
>
Save
</mwc-button>
</ha-progress-button>
</div>
</ha-card>
`;
}
protected updated(changedProperties: PropertyValues): void {
super.updated(changedProperties);
if (changedProperties.has("addon")) {
this._editor.setValue(this.addon.options);
}
}
private _configChanged(ev): void {
this._configHasChanged = true;
this._valid = ev.detail.isValid;
}
private async _resetTapped(ev: CustomEvent): Promise<void> {
const button = ev.currentTarget as any;
button.progress = true;
const confirmed = await showConfirmationDialog(this, {
title: this.addon.name,
text: "Are you sure you want to reset all your options?",
confirmText: "reset options",
dismissText: "no",
});
if (!confirmed) {
button.progress = false;
return;
}
this._error = undefined;
const data: HassioAddonSetOptionParams = {
options: null,
};
try {
await setHassioAddonOption(this.hass, this.addon.slug, data);
this._configHasChanged = false;
const eventdata = {
success: true,
response: undefined,
path: "options",
};
fireEvent(this, "hass-api-called", eventdata);
} catch (err) {
this._error = `Failed to reset addon configuration, ${extractApiErrorMessage(
err
)}`;
}
button.progress = false;
}
private async _saveTapped(ev: CustomEvent): Promise<void> {
const button = ev.currentTarget as any;
button.progress = true;
let data: HassioAddonSetOptionParams;
this._error = undefined;
try {
data = {
options: this._editor.value,
};
} catch (err) {
this._error = err;
return;
}
try {
await setHassioAddonOption(this.hass, this.addon.slug, data);
this._configHasChanged = false;
const eventdata = {
success: true,
response: undefined,
path: "options",
};
fireEvent(this, "hass-api-called", eventdata);
if (this.addon?.state === "started") {
await suggestAddonRestart(this, this.hass, this.addon);
}
} catch (err) {
this._error = `Failed to save addon configuration, ${extractApiErrorMessage(
err
)}`;
}
button.progress = false;
}
static get styles(): CSSResult[] {
return [
haStyle,
@@ -90,7 +173,7 @@ class HassioAddonConfig extends LitElement {
}
iron-autogrow-textarea {
width: 100%;
font-family: monospace;
font-family: var(--code-font-family, monospace);
}
.syntaxerror {
color: var(--error-color);
@@ -98,80 +181,6 @@ class HassioAddonConfig extends LitElement {
`,
];
}
protected updated(changedProperties: PropertyValues): void {
super.updated(changedProperties);
if (changedProperties.has("addon")) {
this._editor.setValue(this.addon.options);
}
}
private _configChanged(): void {
this._configHasChanged = true;
this.requestUpdate();
}
private async _resetTapped(): Promise<void> {
const confirmed = await showConfirmationDialog(this, {
title: this.addon.name,
text: "Are you sure you want to reset all your options?",
confirmText: "reset options",
dismissText: "no",
});
if (!confirmed) {
return;
}
this._error = undefined;
const data: HassioAddonSetOptionParams = {
options: null,
};
try {
await setHassioAddonOption(this.hass, this.addon.slug, data);
this._configHasChanged = false;
const eventdata = {
success: true,
response: undefined,
path: "options",
};
fireEvent(this, "hass-api-called", eventdata);
} catch (err) {
this._error = `Failed to reset addon configuration, ${
err.body?.message || err
}`;
}
}
private async _saveTapped(): Promise<void> {
let data: HassioAddonSetOptionParams;
this._error = undefined;
try {
data = {
options: this._editor.value,
};
} catch (err) {
this._error = err;
return;
}
try {
await setHassioAddonOption(this.hass, this.addon.slug, data);
this._configHasChanged = false;
const eventdata = {
success: true,
response: undefined,
path: "options",
};
fireEvent(this, "hass-api-called", eventdata);
} catch (err) {
this._error = `Failed to save addon configuration, ${
err.body?.message || err
}`;
}
if (!this._error && this.addon?.state === "started") {
await suggestAddonRestart(this, this.hass, this.addon);
}
}
}
declare global {

View File

@@ -4,19 +4,21 @@ import {
CSSResult,
customElement,
html,
internalProperty,
LitElement,
property,
internalProperty,
PropertyValues,
TemplateResult,
} from "lit-element";
import { fireEvent } from "../../../../src/common/dom/fire_event";
import "../../../../src/components/buttons/ha-progress-button";
import "../../../../src/components/ha-card";
import {
HassioAddonDetails,
HassioAddonSetOptionParams,
setHassioAddonOption,
} from "../../../../src/data/hassio/addon";
import { extractApiErrorMessage } from "../../../../src/data/hassio/common";
import { haStyle } from "../../../../src/resources/styles";
import { HomeAssistant } from "../../../../src/types";
import { suggestAddonRestart } from "../../dialogs/suggestAddonRestart";
@@ -85,38 +87,17 @@ class HassioAddonNetwork extends LitElement {
</table>
</div>
<div class="card-actions">
<mwc-button class="warning" @click=${this._resetTapped}>
<ha-progress-button class="warning" @click=${this._resetTapped}>
Reset to defaults
</mwc-button>
<mwc-button @click=${this._saveTapped}>Save</mwc-button>
</ha-progress-button>
<ha-progress-button @click=${this._saveTapped}>
Save
</ha-progress-button>
</div>
</ha-card>
`;
}
static get styles(): CSSResult[] {
return [
haStyle,
hassioStyle,
css`
:host {
display: block;
}
ha-card {
display: block;
}
.errors {
color: var(--error-color);
margin-bottom: 16px;
}
.card-actions {
display: flex;
justify-content: space-between;
}
`,
];
}
protected update(changedProperties: PropertyValues): void {
super.update(changedProperties);
if (changedProperties.has("addon")) {
@@ -149,7 +130,10 @@ class HassioAddonNetwork extends LitElement {
});
}
private async _resetTapped(): Promise<void> {
private async _resetTapped(ev: CustomEvent): Promise<void> {
const button = ev.currentTarget as any;
button.progress = true;
const data: HassioAddonSetOptionParams = {
network: null,
};
@@ -162,17 +146,22 @@ class HassioAddonNetwork extends LitElement {
path: "option",
};
fireEvent(this, "hass-api-called", eventdata);
if (this.addon?.state === "started") {
await suggestAddonRestart(this, this.hass, this.addon);
}
} catch (err) {
this._error = `Failed to set addon network configuration, ${
err.body?.message || err
}`;
}
if (!this._error && this.addon?.state === "started") {
await suggestAddonRestart(this, this.hass, this.addon);
this._error = `Failed to set addon network configuration, ${extractApiErrorMessage(
err
)}`;
}
button.progress = false;
}
private async _saveTapped(): Promise<void> {
private async _saveTapped(ev: CustomEvent): Promise<void> {
const button = ev.currentTarget as any;
button.progress = true;
this._error = undefined;
const networkconfiguration = {};
this._config!.forEach((item) => {
@@ -191,14 +180,38 @@ class HassioAddonNetwork extends LitElement {
path: "option",
};
fireEvent(this, "hass-api-called", eventdata);
if (this.addon?.state === "started") {
await suggestAddonRestart(this, this.hass, this.addon);
}
} catch (err) {
this._error = `Failed to set addon network configuration, ${
err.body?.message || err
}`;
}
if (!this._error && this.addon?.state === "started") {
await suggestAddonRestart(this, this.hass, this.addon);
this._error = `Failed to set addon network configuration, ${extractApiErrorMessage(
err
)}`;
}
button.progress = false;
}
static get styles(): CSSResult[] {
return [
haStyle,
hassioStyle,
css`
:host {
display: block;
}
ha-card {
display: block;
}
.errors {
color: var(--error-color);
margin-bottom: 16px;
}
.card-actions {
display: flex;
justify-content: space-between;
}
`,
];
}
}

View File

@@ -3,18 +3,19 @@ import {
CSSResult,
customElement,
html,
internalProperty,
LitElement,
property,
internalProperty,
TemplateResult,
} from "lit-element";
import "../../../../src/components/ha-circular-progress";
import "../../../../src/components/ha-markdown";
import {
fetchHassioAddonDocumentation,
HassioAddonDetails,
} from "../../../../src/data/hassio/addon";
import { extractApiErrorMessage } from "../../../../src/data/hassio/common";
import "../../../../src/layouts/hass-loading-screen";
import "../../../../src/components/ha-circular-progress";
import { haStyle } from "../../../../src/resources/styles";
import { HomeAssistant } from "../../../../src/types";
import { hassioStyle } from "../../resources/hassio-style";
@@ -80,9 +81,9 @@ class HassioAddonDocumentationDashboard extends LitElement {
this.addon!.slug
);
} catch (err) {
this._error = `Failed to get addon documentation, ${
err.body?.message || err
}`;
this._error = `Failed to get addon documentation, ${extractApiErrorMessage(
err
)}`;
}
}
}

View File

@@ -9,21 +9,19 @@ import {
mdiExclamationThick,
mdiFlask,
mdiHomeAssistant,
mdiInformation,
mdiKey,
mdiNetwork,
mdiPound,
mdiShield,
} from "@mdi/js";
import "@polymer/paper-tooltip/paper-tooltip";
import {
css,
CSSResult,
customElement,
html,
internalProperty,
LitElement,
property,
internalProperty,
TemplateResult,
} from "lit-element";
import { classMap } from "lit-html/directives/class-map";
@@ -35,19 +33,27 @@ import "../../../../src/components/buttons/ha-progress-button";
import "../../../../src/components/ha-card";
import "../../../../src/components/ha-label-badge";
import "../../../../src/components/ha-markdown";
import "../../../../src/components/ha-settings-row";
import "../../../../src/components/ha-svg-icon";
import "../../../../src/components/ha-switch";
import {
fetchHassioAddonChangelog,
fetchHassioAddonInfo,
HassioAddonDetails,
HassioAddonSetOptionParams,
HassioAddonSetSecurityParams,
installHassioAddon,
setHassioAddonOption,
setHassioAddonSecurity,
startHassioAddon,
uninstallHassioAddon,
validateHassioAddonOption,
} from "../../../../src/data/hassio/addon";
import { showConfirmationDialog } from "../../../../src/dialogs/generic/show-dialog-box";
import { extractApiErrorMessage } from "../../../../src/data/hassio/common";
import {
showAlertDialog,
showConfirmationDialog,
} from "../../../../src/dialogs/generic/show-dialog-box";
import { haStyle } from "../../../../src/resources/styles";
import { HomeAssistant } from "../../../../src/types";
import "../../components/hassio-card-content";
@@ -63,7 +69,7 @@ const STAGE_ICON = {
const PERMIS_DESC = {
stage: {
title: "Add-on Stage",
description: `Add-ons can have one of three stages:\n\n<ha-svg-icon path='${STAGE_ICON.stable}'></ha-svg-icon> **Stable**: These are add-ons ready to be used in production.\n\n<ha-svg-icon path='${STAGE_ICON.experimental}'></ha-svg-icon> **Experimental**: These may contain bugs, and may be unfinished.\n\n<ha-svg-icon path='${STAGE_ICON.deprecated}'></ha-svg-icon> **Deprecated**: These add-ons will no longer receive any updates.`,
description: `Add-ons can have one of three stages:\n\n<ha-svg-icon .path='${STAGE_ICON.stable}'></ha-svg-icon> **Stable**: These are add-ons ready to be used in production.\n\n<ha-svg-icon .path='${STAGE_ICON.experimental}'></ha-svg-icon> **Experimental**: These may contain bugs, and may be unfinished.\n\n<ha-svg-icon .path='${STAGE_ICON.deprecated}'></ha-svg-icon> **Deprecated**: These add-ons will no longer receive any updates.`,
},
rating: {
title: "Add-on Security Rating",
@@ -127,11 +133,9 @@ class HassioAddonInfo extends LitElement {
@internalProperty() private _error?: string;
@property({ type: Boolean }) private _installing = false;
protected render(): TemplateResult {
return html`
${this._computeUpdateAvailable
${this.addon.update_available
? html`
<ha-card header="Update available! 🎉">
<div class="card-content">
@@ -174,7 +178,7 @@ class HassioAddonInfo extends LitElement {
${!this.addon.protected
? html`
<ha-card class="warning">
<div class="card-header">Warning: Protection mode is disabled!</div>
<h1 class="card-header">Warning: Protection mode is disabled!</h1>
<div class="card-content">
Protection mode on this add-on is disabled! This gives the add-on full access to the entire system, which adds security risks, and could damage your system when used incorrectly. Only disable the protection mode if you know, need AND trust the source of this add-on.
</div>
@@ -198,14 +202,14 @@ class HassioAddonInfo extends LitElement {
<ha-svg-icon
title="Add-on is running"
class="running"
path=${mdiCircle}
.path=${mdiCircle}
></ha-svg-icon>
`
: html`
<ha-svg-icon
title="Add-on is stopped"
class="stopped"
path=${mdiCircle}
.path=${mdiCircle}
></ha-svg-icon>
`}
`
@@ -242,19 +246,23 @@ class HassioAddonInfo extends LitElement {
`
: ""}
<div class="security">
<ha-label-badge
class=${classMap({
green: this.addon.stage === "stable",
yellow: this.addon.stage === "experimental",
red: this.addon.stage === "deprecated",
})}
@click=${this._showMoreInfo}
id="stage"
label="stage"
description=""
>
<ha-svg-icon .path=${STAGE_ICON[this.addon.stage]}></ha-svg-icon>
</ha-label-badge>
${this.addon.stage !== "stable"
? html` <ha-label-badge
class=${classMap({
yellow: this.addon.stage === "experimental",
red: this.addon.stage === "deprecated",
})}
@click=${this._showMoreInfo}
id="stage"
label="stage"
description=""
>
<ha-svg-icon
.path=${STAGE_ICON[this.addon.stage]}
></ha-svg-icon>
</ha-label-badge>`
: ""}
<ha-label-badge
class=${classMap({
green: [5, 6].includes(Number(this.addon.rating)),
@@ -275,7 +283,7 @@ class HassioAddonInfo extends LitElement {
label="host"
description=""
>
<ha-svg-icon path=${mdiNetwork}></ha-svg-icon>
<ha-svg-icon .path=${mdiNetwork}></ha-svg-icon>
</ha-label-badge>
`
: ""}
@@ -287,7 +295,7 @@ class HassioAddonInfo extends LitElement {
label="hardware"
description=""
>
<ha-svg-icon path=${mdiChip}></ha-svg-icon>
<ha-svg-icon .path=${mdiChip}></ha-svg-icon>
</ha-label-badge>
`
: ""}
@@ -299,7 +307,7 @@ class HassioAddonInfo extends LitElement {
label="hass"
description=""
>
<ha-svg-icon path=${mdiHomeAssistant}></ha-svg-icon>
<ha-svg-icon .path=${mdiHomeAssistant}></ha-svg-icon>
</ha-label-badge>
`
: ""}
@@ -311,7 +319,7 @@ class HassioAddonInfo extends LitElement {
label="hassio"
.description=${this.addon.hassio_role}
>
<ha-svg-icon path=${mdiHomeAssistant}></ha-svg-icon>
<ha-svg-icon .path=${mdiHomeAssistant}></ha-svg-icon>
</ha-label-badge>
`
: ""}
@@ -323,7 +331,7 @@ class HassioAddonInfo extends LitElement {
label="docker"
description=""
>
<ha-svg-icon path=${mdiDocker}></ha-svg-icon>
<ha-svg-icon .path=${mdiDocker}></ha-svg-icon>
</ha-label-badge>
`
: ""}
@@ -335,7 +343,7 @@ class HassioAddonInfo extends LitElement {
label="host pid"
description=""
>
<ha-svg-icon path=${mdiPound}></ha-svg-icon>
<ha-svg-icon .path=${mdiPound}></ha-svg-icon>
</ha-label-badge>
`
: ""}
@@ -348,7 +356,7 @@ class HassioAddonInfo extends LitElement {
label="apparmor"
description=""
>
<ha-svg-icon path=${mdiShield}></ha-svg-icon>
<ha-svg-icon .path=${mdiShield}></ha-svg-icon>
</ha-label-badge>
`
: ""}
@@ -360,7 +368,7 @@ class HassioAddonInfo extends LitElement {
label="auth"
description=""
>
<ha-svg-icon path=${mdiKey}></ha-svg-icon>
<ha-svg-icon .path=${mdiKey}></ha-svg-icon>
</ha-label-badge>
`
: ""}
@@ -373,7 +381,7 @@ class HassioAddonInfo extends LitElement {
description=""
>
<ha-svg-icon
path=${mdiCursorDefaultClickOutline}
.path=${mdiCursorDefaultClickOutline}
></ha-svg-icon>
</ha-label-badge>
`
@@ -382,67 +390,94 @@ class HassioAddonInfo extends LitElement {
${this.addon.version
? html`
<div class="state">
<div>Start on boot</div>
<ha-switch
@change=${this._startOnBootToggled}
.checked=${this.addon.boot === "auto"}
haptic
></ha-switch>
</div>
${this.addon.auto_update || this.hass.userData?.showAdvanced
? html`
<div class="state">
<div>Auto update</div>
<ha-switch
@change=${this._autoUpdateToggled}
.checked=${this.addon.auto_update}
haptic
></ha-switch>
</div>
`
: ""}
${this.addon.ingress
? html`
<div class="state">
<div>Show in sidebar</div>
<ha-switch
@change=${this._panelToggled}
.checked=${this.addon.ingress_panel}
.disabled=${this._computeCannotIngressSidebar}
haptic
></ha-switch>
${this._computeCannotIngressSidebar
? html`
<span>
This option requires Home Assistant 0.92 or
later.
</span>
`
: ""}
</div>
`
: ""}
${this._computeUsesProtectedOptions
? html`
<div class="state">
<div>
Protection mode
<span>
<ha-svg-icon path=${mdiInformation}></ha-svg-icon>
<paper-tooltip>
Grant the add-on elevated system access.
</paper-tooltip>
<div class="addon-options">
<ha-settings-row ?three-line=${this.narrow}>
<span slot="heading">
Start on boot
</span>
<span slot="description">
Make the add-on start during a system boot
</span>
<ha-switch
@change=${this._startOnBootToggled}
.checked=${this.addon.boot === "auto"}
haptic
></ha-switch>
</ha-settings-row>
${this.addon.startup !== "once"
? html`
<ha-settings-row ?three-line=${this.narrow}>
<span slot="heading">
Watchdog
</span>
</div>
<ha-switch
@change=${this._protectionToggled}
.checked=${this.addon.protected}
haptic
></ha-switch>
</div>
`
: ""}
<span slot="description">
This will start the add-on if it crashes
</span>
<ha-switch
@change=${this._watchdogToggled}
.checked=${this.addon.watchdog}
haptic
></ha-switch>
</ha-settings-row>
`
: ""}
${this.addon.auto_update || this.hass.userData?.showAdvanced
? html`
<ha-settings-row ?three-line=${this.narrow}>
<span slot="heading">
Auto update
</span>
<span slot="description">
Auto update the add-on when there is a new version
available
</span>
<ha-switch
@change=${this._autoUpdateToggled}
.checked=${this.addon.auto_update}
haptic
></ha-switch>
</ha-settings-row>
`
: ""}
${this.addon.ingress
? html`
<ha-settings-row ?three-line=${this.narrow}>
<span slot="heading">
Show in sidebar
</span>
<span slot="description">
${this._computeCannotIngressSidebar
? "This option requires Home Assistant 0.92 or later."
: "Add this add-on to your sidebar"}
</span>
<ha-switch
@change=${this._panelToggled}
.checked=${this.addon.ingress_panel}
.disabled=${this._computeCannotIngressSidebar}
haptic
></ha-switch>
</ha-settings-row>
`
: ""}
${this._computeUsesProtectedOptions
? html`
<ha-settings-row ?three-line=${this.narrow}>
<span slot="heading">
Protection mode
</span>
<span slot="description">
Blocks elevated system access from the add-on
</span>
<ha-switch
@change=${this._protectionToggled}
.checked=${this.addon.protected}
haptic
></ha-switch>
</ha-settings-row>
`
: ""}
</div>
`
: ""}
${this._error ? html` <div class="errors">${this._error}</div> ` : ""}
@@ -468,12 +503,9 @@ class HassioAddonInfo extends LitElement {
</ha-call-api-button>
`
: html`
<ha-call-api-button
.hass=${this.hass}
.path="hassio/addons/${this.addon.slug}/start"
>
<ha-progress-button @click=${this._startClicked}>
Start
</ha-call-api-button>
</ha-progress-button>
`}
${this._computeShowWebUI
? html`
@@ -497,12 +529,12 @@ class HassioAddonInfo extends LitElement {
</mwc-button>
`
: ""}
<mwc-button
<ha-progress-button
class=" right warning"
@click=${this._uninstallClicked}
>
Uninstall
</mwc-button>
</ha-progress-button>
${this.addon.build
? html`
<ha-call-api-button
@@ -524,8 +556,7 @@ class HassioAddonInfo extends LitElement {
`
: ""}
<ha-progress-button
.disabled=${!this.addon.available || this._installing}
.progress=${this._installing}
.disabled=${!this.addon.available}
@click=${this._installClicked}
>
Install
@@ -548,6 +579,284 @@ class HassioAddonInfo extends LitElement {
`;
}
private get _computeHassioApi(): boolean {
return (
this.addon.hassio_api &&
(this.addon.hassio_role === "manager" ||
this.addon.hassio_role === "admin")
);
}
private get _computeApparmorClassName(): string {
if (this.addon.apparmor === "profile") {
return "green";
}
if (this.addon.apparmor === "disable") {
return "red";
}
return "";
}
private _showMoreInfo(ev): void {
const id = ev.currentTarget.id;
showHassioMarkdownDialog(this, {
title: PERMIS_DESC[id].title,
content: PERMIS_DESC[id].description,
});
}
private get _computeIsRunning(): boolean {
return this.addon?.state === "started";
}
private get _pathWebui(): string | null {
return (
this.addon.webui &&
this.addon.webui.replace("[HOST]", document.location.hostname)
);
}
private get _computeShowWebUI(): boolean | "" | null {
return !this.addon.ingress && this.addon.webui && this._computeIsRunning;
}
private _openIngress(): void {
navigate(this, `/hassio/ingress/${this.addon.slug}`);
}
private get _computeShowIngressUI(): boolean {
return this.addon.ingress && this._computeIsRunning;
}
private get _computeCannotIngressSidebar(): boolean {
return (
!this.addon.ingress || !atLeastVersion(this.hass.config.version, 0, 92)
);
}
private get _computeUsesProtectedOptions(): boolean {
return (
this.addon.docker_api || this.addon.full_access || this.addon.host_pid
);
}
private async _startOnBootToggled(): Promise<void> {
this._error = undefined;
const data: HassioAddonSetOptionParams = {
boot: this.addon.boot === "auto" ? "manual" : "auto",
};
try {
await setHassioAddonOption(this.hass, this.addon.slug, data);
const eventdata = {
success: true,
response: undefined,
path: "option",
};
fireEvent(this, "hass-api-called", eventdata);
} catch (err) {
this._error = `Failed to set addon option, ${extractApiErrorMessage(
err
)}`;
}
}
private async _watchdogToggled(): Promise<void> {
this._error = undefined;
const data: HassioAddonSetOptionParams = {
watchdog: !this.addon.watchdog,
};
try {
await setHassioAddonOption(this.hass, this.addon.slug, data);
const eventdata = {
success: true,
response: undefined,
path: "option",
};
fireEvent(this, "hass-api-called", eventdata);
} catch (err) {
this._error = `Failed to set addon option, ${extractApiErrorMessage(
err
)}`;
}
}
private async _autoUpdateToggled(): Promise<void> {
this._error = undefined;
const data: HassioAddonSetOptionParams = {
auto_update: !this.addon.auto_update,
};
try {
await setHassioAddonOption(this.hass, this.addon.slug, data);
const eventdata = {
success: true,
response: undefined,
path: "option",
};
fireEvent(this, "hass-api-called", eventdata);
} catch (err) {
this._error = `Failed to set addon option, ${extractApiErrorMessage(
err
)}`;
}
}
private async _protectionToggled(): Promise<void> {
this._error = undefined;
const data: HassioAddonSetSecurityParams = {
protected: !this.addon.protected,
};
try {
await setHassioAddonSecurity(this.hass, this.addon.slug, data);
const eventdata = {
success: true,
response: undefined,
path: "security",
};
fireEvent(this, "hass-api-called", eventdata);
} catch (err) {
this._error = `Failed to set addon security option, ${extractApiErrorMessage(
err
)}`;
}
}
private async _panelToggled(): Promise<void> {
this._error = undefined;
const data: HassioAddonSetOptionParams = {
ingress_panel: !this.addon.ingress_panel,
};
try {
await setHassioAddonOption(this.hass, this.addon.slug, data);
const eventdata = {
success: true,
response: undefined,
path: "option",
};
fireEvent(this, "hass-api-called", eventdata);
} catch (err) {
this._error = `Failed to set addon option, ${extractApiErrorMessage(
err
)}`;
}
}
private async _openChangelog(): Promise<void> {
try {
const content = await fetchHassioAddonChangelog(
this.hass,
this.addon.slug
);
showHassioMarkdownDialog(this, {
title: "Changelog",
content,
});
} catch (err) {
showAlertDialog(this, {
title: "Failed to get addon changelog",
text: extractApiErrorMessage(err),
});
}
}
private async _installClicked(ev: CustomEvent): Promise<void> {
const button = ev.currentTarget as any;
button.progress = true;
try {
await installHassioAddon(this.hass, this.addon.slug);
const eventdata = {
success: true,
response: undefined,
path: "install",
};
fireEvent(this, "hass-api-called", eventdata);
} catch (err) {
showAlertDialog(this, {
title: "Failed to install addon",
text: extractApiErrorMessage(err),
});
}
button.progress = false;
}
private async _startClicked(ev: CustomEvent): Promise<void> {
const button = ev.currentTarget as any;
button.progress = true;
try {
const validate = await validateHassioAddonOption(
this.hass,
this.addon.slug
);
if (!validate.data.valid) {
await showConfirmationDialog(this, {
title: "Failed to start addon - configuration validation failed!",
text: validate.data.message.split(" Got ")[0],
confirm: () => this._openConfiguration(),
confirmText: "Go to configuration",
dismissText: "Cancel",
});
button.progress = false;
return;
}
} catch (err) {
showAlertDialog(this, {
title: "Failed to validate addon configuration",
text: extractApiErrorMessage(err),
});
button.progress = false;
return;
}
try {
await startHassioAddon(this.hass, this.addon.slug);
this.addon = await fetchHassioAddonInfo(this.hass, this.addon.slug);
} catch (err) {
showAlertDialog(this, {
title: "Failed to start addon",
text: extractApiErrorMessage(err),
});
}
button.progress = false;
}
private _openConfiguration(): void {
navigate(this, `/hassio/addon/${this.addon.slug}/config`);
}
private async _uninstallClicked(ev: CustomEvent): Promise<void> {
const button = ev.currentTarget as any;
button.progress = true;
const confirmed = await showConfirmationDialog(this, {
title: this.addon.name,
text: "Are you sure you want to uninstall this add-on?",
confirmText: "uninstall add-on",
dismissText: "no",
});
if (!confirmed) {
button.progress = false;
return;
}
this._error = undefined;
try {
await uninstallHassioAddon(this.hass, this.addon.slug);
const eventdata = {
success: true,
response: undefined,
path: "uninstall",
};
fireEvent(this, "hass-api-called", eventdata);
} catch (err) {
showAlertDialog(this, {
title: "Failed to uninstall addon",
text: extractApiErrorMessage(err),
});
}
button.progress = false;
}
static get styles(): CSSResult[] {
return [
haStyle,
@@ -602,19 +911,7 @@ class HassioAddonInfo extends LitElement {
margin: 16px 0;
display: block;
}
.state {
display: flex;
margin: 33px 0;
}
.state div {
width: 180px;
display: inline-block;
}
.state ha-svg-icon {
width: 16px;
height: 16px;
color: var(--secondary-text-color);
}
ha-switch {
display: flex;
}
@@ -675,214 +972,30 @@ class HassioAddonInfo extends LitElement {
ha-markdown {
padding: 16px;
}
ha-settings-row {
padding: 0;
height: 54px;
width: 100%;
}
ha-settings-row > span[slot="description"] {
white-space: normal;
color: var(--secondary-text-color);
}
ha-settings-row[three-line] {
height: 74px;
}
.addon-options {
max-width: 50%;
}
@media (max-width: 720px) {
.addon-options {
max-width: 100%;
}
}
`,
];
}
private get _computeHassioApi(): boolean {
return (
this.addon.hassio_api &&
(this.addon.hassio_role === "manager" ||
this.addon.hassio_role === "admin")
);
}
private get _computeApparmorClassName(): string {
if (this.addon.apparmor === "profile") {
return "green";
}
if (this.addon.apparmor === "disable") {
return "red";
}
return "";
}
private _showMoreInfo(ev): void {
const id = ev.currentTarget.id;
showHassioMarkdownDialog(this, {
title: PERMIS_DESC[id].title,
content: PERMIS_DESC[id].description,
});
}
private get _computeIsRunning(): boolean {
return this.addon?.state === "started";
}
private get _computeUpdateAvailable(): boolean | "" {
return (
this.addon &&
!this.addon.detached &&
this.addon.version &&
this.addon.version !== this.addon.version_latest
);
}
private get _pathWebui(): string | null {
return (
this.addon.webui &&
this.addon.webui.replace("[HOST]", document.location.hostname)
);
}
private get _computeShowWebUI(): boolean | "" | null {
return !this.addon.ingress && this.addon.webui && this._computeIsRunning;
}
private _openIngress(): void {
navigate(this, `/hassio/ingress/${this.addon.slug}`);
}
private get _computeShowIngressUI(): boolean {
return this.addon.ingress && this._computeIsRunning;
}
private get _computeCannotIngressSidebar(): boolean {
return (
!this.addon.ingress || !atLeastVersion(this.hass.config.version, 0, 92)
);
}
private get _computeUsesProtectedOptions(): boolean {
return (
this.addon.docker_api || this.addon.full_access || this.addon.host_pid
);
}
private async _startOnBootToggled(): Promise<void> {
this._error = undefined;
const data: HassioAddonSetOptionParams = {
boot: this.addon.boot === "auto" ? "manual" : "auto",
};
try {
await setHassioAddonOption(this.hass, this.addon.slug, data);
const eventdata = {
success: true,
response: undefined,
path: "option",
};
fireEvent(this, "hass-api-called", eventdata);
} catch (err) {
this._error = `Failed to set addon option, ${err.body?.message || err}`;
}
}
private async _autoUpdateToggled(): Promise<void> {
this._error = undefined;
const data: HassioAddonSetOptionParams = {
auto_update: !this.addon.auto_update,
};
try {
await setHassioAddonOption(this.hass, this.addon.slug, data);
const eventdata = {
success: true,
response: undefined,
path: "option",
};
fireEvent(this, "hass-api-called", eventdata);
} catch (err) {
this._error = `Failed to set addon option, ${err.body?.message || err}`;
}
}
private async _protectionToggled(): Promise<void> {
this._error = undefined;
const data: HassioAddonSetSecurityParams = {
protected: !this.addon.protected,
};
try {
await setHassioAddonSecurity(this.hass, this.addon.slug, data);
const eventdata = {
success: true,
response: undefined,
path: "security",
};
fireEvent(this, "hass-api-called", eventdata);
} catch (err) {
this._error = `Failed to set addon security option, ${
err.body?.message || err
}`;
}
}
private async _panelToggled(): Promise<void> {
this._error = undefined;
const data: HassioAddonSetOptionParams = {
ingress_panel: !this.addon.ingress_panel,
};
try {
await setHassioAddonOption(this.hass, this.addon.slug, data);
const eventdata = {
success: true,
response: undefined,
path: "option",
};
fireEvent(this, "hass-api-called", eventdata);
} catch (err) {
this._error = `Failed to set addon option, ${err.body?.message || err}`;
}
}
private async _openChangelog(): Promise<void> {
this._error = undefined;
try {
const content = await fetchHassioAddonChangelog(
this.hass,
this.addon.slug
);
showHassioMarkdownDialog(this, {
title: "Changelog",
content,
});
} catch (err) {
this._error = `Failed to get addon changelog, ${
err.body?.message || err
}`;
}
}
private async _installClicked(): Promise<void> {
this._error = undefined;
this._installing = true;
try {
await installHassioAddon(this.hass, this.addon.slug);
const eventdata = {
success: true,
response: undefined,
path: "install",
};
fireEvent(this, "hass-api-called", eventdata);
} catch (err) {
this._error = `Failed to install addon, ${err.body?.message || err}`;
}
this._installing = false;
}
private async _uninstallClicked(): Promise<void> {
const confirmed = await showConfirmationDialog(this, {
title: this.addon.name,
text: "Are you sure you want to uninstall this add-on?",
confirmText: "uninstall add-on",
dismissText: "no",
});
if (!confirmed) {
return;
}
this._error = undefined;
try {
await uninstallHassioAddon(this.hass, this.addon.slug);
const eventdata = {
success: true,
response: undefined,
path: "uninstall",
};
fireEvent(this, "hass-api-called", eventdata);
} catch (err) {
this._error = `Failed to uninstall addon, ${err.body?.message || err}`;
}
}
}
declare global {
interface HTMLElementTagNameMap {

View File

@@ -4,9 +4,9 @@ import {
CSSResult,
customElement,
html,
internalProperty,
LitElement,
property,
internalProperty,
TemplateResult,
} from "lit-element";
import "../../../../src/components/ha-card";
@@ -14,6 +14,7 @@ import {
fetchHassioAddonLogs,
HassioAddonDetails,
} from "../../../../src/data/hassio/addon";
import { extractApiErrorMessage } from "../../../../src/data/hassio/common";
import { haStyle } from "../../../../src/resources/styles";
import { HomeAssistant } from "../../../../src/types";
import "../../components/hassio-ansi-to-html";
@@ -75,7 +76,7 @@ class HassioAddonLogs extends LitElement {
try {
this._content = await fetchHassioAddonLogs(this.hass, this.addon.slug);
} catch (err) {
this._error = `Failed to get addon logs, ${err.body?.message || err}`;
this._error = `Failed to get addon logs, ${extractApiErrorMessage(err)}`;
}
}

View File

@@ -21,7 +21,7 @@ interface State {
class HassioAnsiToHtml extends LitElement {
@property() public content!: string;
public render(): TemplateResult | void {
protected render(): TemplateResult | void {
return html`${this._parseTextToColoredPre(this.content)}`;
}

View File

@@ -50,7 +50,7 @@ class HassioCardContent extends LitElement {
`
: html`
<ha-svg-icon
class=${this.iconClass}
class=${this.iconClass!}
.path=${this.icon}
.title=${this.iconTitle}
></ha-svg-icon>

View File

@@ -0,0 +1,82 @@
import "@material/mwc-icon-button/mwc-icon-button";
import { mdiFolderUpload } from "@mdi/js";
import "@polymer/iron-input/iron-input";
import "@polymer/paper-input/paper-input-container";
import {
customElement,
html,
internalProperty,
LitElement,
TemplateResult,
} from "lit-element";
import { fireEvent } from "../../../src/common/dom/fire_event";
import "../../../src/components/ha-circular-progress";
import "../../../src/components/ha-file-upload";
import "../../../src/components/ha-svg-icon";
import { extractApiErrorMessage } from "../../../src/data/hassio/common";
import {
HassioSnapshot,
uploadSnapshot,
} from "../../../src/data/hassio/snapshot";
import { showAlertDialog } from "../../../src/dialogs/generic/show-dialog-box";
import { HomeAssistant } from "../../../src/types";
declare global {
interface HASSDomEvents {
"snapshot-uploaded": { snapshot: HassioSnapshot };
}
}
@customElement("hassio-upload-snapshot")
export class HassioUploadSnapshot extends LitElement {
public hass!: HomeAssistant;
@internalProperty() public value: string | null = null;
@internalProperty() private _uploading = false;
public render(): TemplateResult {
return html`
<ha-file-upload
.uploading=${this._uploading}
.icon=${mdiFolderUpload}
accept="application/x-tar"
label="Upload snapshot"
@file-picked=${this._uploadFile}
auto-open-file-dialog
></ha-file-upload>
`;
}
private async _uploadFile(ev) {
const file = ev.detail.files[0];
if (!["application/x-tar"].includes(file.type)) {
showAlertDialog(this, {
title: "Unsupported file format",
text: "Please choose a Home Assistant snapshot file (.tar)",
confirmText: "ok",
});
return;
}
this._uploading = true;
try {
const snapshot = await uploadSnapshot(this.hass, file);
fireEvent(this, "snapshot-uploaded", { snapshot: snapshot.data });
} catch (err) {
showAlertDialog(this, {
title: "Upload failed",
text: extractApiErrorMessage(err),
confirmText: "ok",
});
} finally {
this._uploading = false;
}
}
}
declare global {
interface HTMLElementTagNameMap {
"hassio-upload-snapshot": HassioUploadSnapshot;
}
}

View File

@@ -10,6 +10,7 @@ import {
} from "lit-element";
import { atLeastVersion } from "../../../src/common/config/version";
import { navigate } from "../../../src/common/navigate";
import { compare } from "../../../src/common/string/compare";
import "../../../src/components/ha-card";
import { HassioAddonInfo } from "../../../src/data/hassio/addon";
import { haStyle } from "../../../src/resources/styles";
@@ -21,25 +22,27 @@ import { hassioStyle } from "../resources/hassio-style";
class HassioAddons extends LitElement {
@property({ attribute: false }) public hass!: HomeAssistant;
@property() public addons?: HassioAddonInfo[];
@property({ attribute: false }) public addons?: HassioAddonInfo[];
protected render(): TemplateResult {
return html`
<div class="content">
<h1>Add-ons</h1>
<div class="card-group">
${!this.addons
${!this.addons?.length
? html`
<ha-card>
<div class="card-content">
You don't have any add-ons installed yet. Head over to
<a href="#" @click=${this._openStore}>the add-on store</a>
<button class="link" @click=${this._openStore}>
the add-on store
</button>
to get started!
</div>
</ha-card>
`
: this.addons
.sort((a, b) => (a.name > b.name ? 1 : -1))
.sort((a, b) => compare(a.name, b.name))
.map(
(addon) => html`
<ha-card .addon=${addon} @click=${this._addonTapped}>
@@ -49,22 +52,21 @@ class HassioAddons extends LitElement {
.title=${addon.name}
.description=${addon.description}
available
.showTopbar=${addon.installed !== addon.version}
.showTopbar=${addon.update_available}
topbarClass="update"
.icon=${addon.installed !== addon.version
.icon=${addon.update_available!
? mdiArrowUpBoldCircle
: mdiPuzzle}
.iconTitle=${addon.state !== "started"
? "Add-on is stopped"
: addon.installed !== addon.version
: addon.update_available!
? "New version available"
: "Add-on is running"}
.iconClass=${addon.installed &&
addon.installed !== addon.version
.iconClass=${addon.update_available
? addon.state === "started"
? "update"
: "update stopped"
: addon.installed && addon.state === "started"
: addon.state === "started"
? "running"
: "stopped"}
.iconImage=${atLeastVersion(

View File

@@ -7,17 +7,26 @@ import {
html,
LitElement,
property,
internalProperty,
TemplateResult,
} from "lit-element";
import "../../../src/components/buttons/ha-call-api-button";
import memoizeOne from "memoize-one";
import "../../../src/components/buttons/ha-progress-button";
import "../../../src/components/ha-card";
import "../../../src/components/ha-svg-icon";
import {
extractApiErrorMessage,
HassioResponse,
ignoredStatusCodes,
} from "../../../src/data/hassio/common";
import { HassioHassOSInfo } from "../../../src/data/hassio/host";
import {
HassioHomeAssistantInfo,
HassioSupervisorInfo,
} from "../../../src/data/hassio/supervisor";
import {
showAlertDialog,
showConfirmationDialog,
} from "../../../src/dialogs/generic/show-dialog-box";
import { haStyle } from "../../../src/resources/styles";
import { HomeAssistant } from "../../../src/types";
import { hassioStyle } from "../resources/hassio-style";
@@ -26,29 +35,30 @@ import { hassioStyle } from "../resources/hassio-style";
export class HassioUpdate extends LitElement {
@property({ attribute: false }) public hass!: HomeAssistant;
@property({ attribute: false }) public hassInfo: HassioHomeAssistantInfo;
@property({ attribute: false }) public hassInfo?: HassioHomeAssistantInfo;
@property({ attribute: false }) public hassOsInfo?: HassioHassOSInfo;
@property() public supervisorInfo: HassioSupervisorInfo;
@property({ attribute: false }) public supervisorInfo?: HassioSupervisorInfo;
@internalProperty() private _error?: string;
private _pendingUpdates = memoizeOne(
(
core?: HassioHomeAssistantInfo,
supervisor?: HassioSupervisorInfo,
os?: HassioHassOSInfo
): number => {
return [core, supervisor, os].filter(
(value) => !!value && value?.update_available
).length;
}
);
protected render(): TemplateResult {
const updatesAvailable: number = [
const updatesAvailable = this._pendingUpdates(
this.hassInfo,
this.supervisorInfo,
this.hassOsInfo,
].filter((value) => {
return (
!!value &&
(value.version_latest
? value.version !== value.version_latest
: value.version_latest
? value.version !== value.version_latest
: false)
);
}).length;
this.hassOsInfo
);
if (!updatesAvailable) {
return html``;
@@ -56,9 +66,6 @@ export class HassioUpdate extends LitElement {
return html`
<div class="content">
${this._error
? html` <div class="error">Error: ${this._error}</div> `
: ""}
<h1>
${updatesAvailable > 1
? "Updates Available 🎉"
@@ -67,26 +74,24 @@ export class HassioUpdate extends LitElement {
<div class="card-group">
${this._renderUpdateCard(
"Home Assistant Core",
this.hassInfo.version,
this.hassInfo.version_latest,
this.hassInfo!,
"hassio/homeassistant/update",
`https://${
this.hassInfo.version_latest.includes("b") ? "rc" : "www"
}.home-assistant.io/latest-release-notes/`,
mdiHomeAssistant
this.hassInfo?.version_latest.includes("b") ? "rc" : "www"
}.home-assistant.io/latest-release-notes/`
)}
${this._renderUpdateCard(
"Supervisor",
this.supervisorInfo.version,
this.supervisorInfo.version_latest,
this.supervisorInfo!,
"hassio/supervisor/update",
`https://github.com//home-assistant/hassio/releases/tag/${this.supervisorInfo.version_latest}`
`https://github.com//home-assistant/hassio/releases/tag/${
this.supervisorInfo!.version_latest
}`
)}
${this.hassOsInfo
? this._renderUpdateCard(
"Operating System",
this.hassOsInfo.version,
this.hassOsInfo.version_latest,
this.hassOsInfo,
"hassio/os/update",
`https://github.com//home-assistant/hassos/releases/tag/${this.hassOsInfo.version_latest}`
)
@@ -98,59 +103,68 @@ export class HassioUpdate extends LitElement {
private _renderUpdateCard(
name: string,
curVersion: string,
lastVersion: string,
object: HassioHomeAssistantInfo | HassioSupervisorInfo | HassioHassOSInfo,
apiPath: string,
releaseNotesUrl: string,
icon?: string
releaseNotesUrl: string
): TemplateResult {
if (!lastVersion || lastVersion === curVersion) {
if (!object.update_available) {
return html``;
}
return html`
<ha-card>
<div class="card-content">
${icon
? html`
<div class="icon">
<ha-svg-icon .path=${icon}></ha-svg-icon>
</div>
`
: ""}
<div class="update-heading">${name} ${lastVersion}</div>
<div class="icon">
<ha-svg-icon .path=${mdiHomeAssistant}></ha-svg-icon>
</div>
<div class="update-heading">${name} ${object.version_latest}</div>
<div class="warning">
You are currently running version ${curVersion}
You are currently running version ${object.version}
</div>
</div>
<div class="card-actions">
<a href="${releaseNotesUrl}" target="_blank" rel="noreferrer">
<mwc-button>Release notes</mwc-button>
</a>
<ha-call-api-button
.hass=${this.hass}
.path=${apiPath}
@hass-api-called=${this._apiCalled}
<ha-progress-button
.apiPath=${apiPath}
.name=${name}
.version=${object.version_latest}
@click=${this._confirmUpdate}
>
Update
</ha-call-api-button>
</ha-progress-button>
</div>
</ha-card>
`;
}
private _apiCalled(ev): void {
if (ev.detail.success) {
this._error = "";
private async _confirmUpdate(ev): Promise<void> {
const item = ev.currentTarget;
item.progress = true;
const confirmed = await showConfirmationDialog(this, {
title: `Update ${item.name}`,
text: `Are you sure you want to update ${item.name} to version ${item.version}?`,
confirmText: "update",
dismissText: "cancel",
});
if (!confirmed) {
item.progress = false;
return;
}
const response = ev.detail.response;
if (typeof response.body === "object") {
this._error = response.body.message || "Unknown error";
} else {
this._error = response.body;
try {
await this.hass.callApi<HassioResponse<void>>("POST", item.apiPath);
} catch (err) {
// Only show an error if the status code was not expected (user behind proxy)
// or no status at all(connection terminated)
if (err.status_code && !ignoredStatusCodes.has(err.status_code)) {
showAlertDialog(this, {
title: "Update failed",
text: extractApiErrorMessage(err),
});
}
}
item.progress = false;
}
static get styles(): CSSResult[] {

View File

@@ -31,6 +31,10 @@ class HassioMarkdownDialog extends LitElement {
this._opened = true;
}
public closeDialog() {
this._opened = false;
}
protected render(): TemplateResult {
if (!this._opened) {
return html``;
@@ -38,7 +42,7 @@ class HassioMarkdownDialog extends LitElement {
return html`
<ha-dialog
open
@closing=${this._closeDialog}
@closed=${this.closeDialog}
.heading=${createCloseHeading(this.hass, this.title)}
>
<ha-markdown .content=${this.content || ""}></ha-markdown>
@@ -46,10 +50,6 @@ class HassioMarkdownDialog extends LitElement {
`;
}
private _closeDialog(): void {
this._opened = false;
}
static get styles(): CSSResult[] {
return [
haStyleDialog,

View File

@@ -0,0 +1,334 @@
import "@material/mwc-button/mwc-button";
import "@material/mwc-icon-button";
import "@material/mwc-tab";
import "@material/mwc-tab-bar";
import { mdiClose } from "@mdi/js";
import { PaperInputElement } from "@polymer/paper-input/paper-input";
import {
css,
CSSResult,
customElement,
html,
internalProperty,
LitElement,
property,
TemplateResult,
} from "lit-element";
import { cache } from "lit-html/directives/cache";
import { fireEvent } from "../../../../src/common/dom/fire_event";
import "../../../../src/components/ha-circular-progress";
import "../../../../src/components/ha-dialog";
import "../../../../src/components/ha-formfield";
import "../../../../src/components/ha-header-bar";
import "../../../../src/components/ha-radio";
import type { HaRadio } from "../../../../src/components/ha-radio";
import "../../../../src/components/ha-related-items";
import "../../../../src/components/ha-svg-icon";
import { extractApiErrorMessage } from "../../../../src/data/hassio/common";
import {
NetworkInterface,
updateNetworkInterface,
} from "../../../../src/data/hassio/network";
import {
showAlertDialog,
showConfirmationDialog,
} from "../../../../src/dialogs/generic/show-dialog-box";
import { HassDialog } from "../../../../src/dialogs/make-dialog-manager";
import { haStyleDialog } from "../../../../src/resources/styles";
import type { HomeAssistant } from "../../../../src/types";
import { HassioNetworkDialogParams } from "./show-dialog-network";
@customElement("dialog-hassio-network")
export class DialogHassioNetwork extends LitElement
implements HassDialog<HassioNetworkDialogParams> {
@property({ attribute: false }) public hass!: HomeAssistant;
@internalProperty() private _prosessing = false;
@internalProperty() private _params?: HassioNetworkDialogParams;
@internalProperty() private _network!: {
interface: string;
data: NetworkInterface;
}[];
@internalProperty() private _curTabIndex = 0;
@internalProperty() private _device?: {
interface: string;
data: NetworkInterface;
};
@internalProperty() private _dirty = false;
public async showDialog(params: HassioNetworkDialogParams): Promise<void> {
this._params = params;
this._dirty = false;
this._curTabIndex = 0;
this._network = Object.keys(params.network?.interfaces)
.map((device) => ({
interface: device,
data: params.network.interfaces[device],
}))
.sort((a, b) => {
return a.data.primary > b.data.primary ? -1 : 1;
});
this._device = this._network[this._curTabIndex];
this._device.data.nameservers = String(this._device.data.nameservers);
await this.updateComplete;
}
public closeDialog(): void {
this._params = undefined;
this._prosessing = false;
fireEvent(this, "dialog-closed", { dialog: this.localName });
}
protected render(): TemplateResult {
if (!this._params || !this._network) {
return html``;
}
return html`
<ha-dialog
open
scrimClickAction
escapeKeyAction
.heading=${true}
hideActions
@closed=${this.closeDialog}
>
<div slot="heading">
<ha-header-bar>
<span slot="title">
Network settings
</span>
<mwc-icon-button slot="actionItems" dialogAction="cancel">
<ha-svg-icon .path=${mdiClose}></ha-svg-icon>
</mwc-icon-button>
</ha-header-bar>
${this._network.length > 1
? html` <mwc-tab-bar
.activeIndex=${this._curTabIndex}
@MDCTabBar:activated=${this._handleTabActivated}
>${this._network.map(
(device) =>
html`<mwc-tab
.id=${device.interface}
.label=${device.interface}
>
</mwc-tab>`
)}
</mwc-tab-bar>`
: ""}
</div>
${cache(this._renderTab())}
</ha-dialog>
`;
}
private _renderTab() {
return html` <div class="form container">
<ha-formfield label="DHCP">
<ha-radio
@change=${this._handleRadioValueChanged}
value="dhcp"
name="method"
?checked=${this._device!.data.method === "dhcp"}
>
</ha-radio>
</ha-formfield>
<ha-formfield label="Static">
<ha-radio
@change=${this._handleRadioValueChanged}
value="static"
name="method"
?checked=${this._device!.data.method === "static"}
>
</ha-radio>
</ha-formfield>
${this._device!.data.method !== "dhcp"
? html` <paper-input
class="flex-auto"
id="ip_address"
label="IP address/Netmask"
.value="${this._device!.data.ip_address}"
@value-changed=${this._handleInputValueChanged}
></paper-input>
<paper-input
class="flex-auto"
id="gateway"
label="Gateway address"
.value="${this._device!.data.gateway}"
@value-changed=${this._handleInputValueChanged}
></paper-input>
<paper-input
class="flex-auto"
id="nameservers"
label="DNS servers"
.value="${this._device!.data.nameservers as string}"
@value-changed=${this._handleInputValueChanged}
></paper-input>
NB!: If you are changing IP or gateway addresses, you might lose
the connection.`
: ""}
</div>
<div class="buttons">
<mwc-button label="close" @click=${this.closeDialog}> </mwc-button>
<mwc-button @click=${this._updateNetwork} ?disabled=${!this._dirty}>
${this._prosessing
? html`<ha-circular-progress active></ha-circular-progress>`
: "Update"}
</mwc-button>
</div>`;
}
private async _updateNetwork() {
this._prosessing = true;
let options: Partial<NetworkInterface> = {
method: this._device!.data.method,
};
if (options.method !== "dhcp") {
options = {
...options,
address: this._device!.data.ip_address,
gateway: this._device!.data.gateway,
dns: String(this._device!.data.nameservers).split(","),
};
}
try {
await updateNetworkInterface(this.hass, this._device!.interface, options);
} catch (err) {
showAlertDialog(this, {
title: "Failed to change network settings",
text: extractApiErrorMessage(err),
});
this._prosessing = false;
return;
}
this._params?.loadData();
this.closeDialog();
}
private async _handleTabActivated(ev: CustomEvent): Promise<void> {
if (this._dirty) {
const confirm = await showConfirmationDialog(this, {
text:
"You have unsaved changes, these will get lost if you change tabs, do you want to continue?",
confirmText: "yes",
dismissText: "no",
});
if (!confirm) {
this.requestUpdate("_device");
return;
}
}
this._curTabIndex = ev.detail.index;
this._device = this._network[ev.detail.index];
this._device.data.nameservers = String(this._device.data.nameservers);
}
private _handleRadioValueChanged(ev: CustomEvent): void {
const value = (ev.target as HaRadio).value as "dhcp" | "static";
if (!value || !this._device || this._device!.data.method === value) {
return;
}
this._dirty = true;
this._device!.data.method = value;
this.requestUpdate("_device");
}
private _handleInputValueChanged(ev: CustomEvent): void {
const value: string | null | undefined = (ev.target as PaperInputElement)
.value;
const id = (ev.target as PaperInputElement).id;
if (!value || !this._device || this._device.data[id] === value) {
return;
}
this._dirty = true;
this._device.data[id] = value;
}
static get styles(): CSSResult[] {
return [
haStyleDialog,
css`
ha-header-bar {
--mdc-theme-on-primary: var(--primary-text-color);
--mdc-theme-primary: var(--mdc-theme-surface);
flex-shrink: 0;
}
mwc-tab-bar {
border-bottom: 1px solid
var(--mdc-dialog-scroll-divider-color, rgba(0, 0, 0, 0.12));
}
ha-dialog {
--dialog-content-position: static;
--dialog-content-padding: 0;
--dialog-z-index: 6;
}
@media all and (min-width: 451px) and (min-height: 501px) {
.container {
width: 400px;
}
}
.content {
display: block;
padding: 20px 24px;
}
/* overrule the ha-style-dialog max-height on small screens */
@media all and (max-width: 450px), all and (max-height: 500px) {
ha-header-bar {
--mdc-theme-primary: var(--app-header-background-color);
--mdc-theme-on-primary: var(--app-header-text-color, white);
}
}
mwc-button.warning {
--mdc-theme-primary: var(--error-color);
}
:host([rtl]) app-toolbar {
direction: rtl;
text-align: right;
}
.container {
padding: 20px 24px;
}
.form {
margin-bottom: 53px;
}
.buttons {
position: absolute;
bottom: 0;
width: 100%;
box-sizing: border-box;
border-top: 1px solid
var(--mdc-dialog-scroll-divider-color, rgba(0, 0, 0, 0.12));
display: flex;
justify-content: space-between;
padding: 8px;
padding-bottom: max(env(safe-area-inset-bottom), 8px);
background-color: var(--mdc-theme-surface, #fff);
}
`,
];
}
}
declare global {
interface HTMLElementTagNameMap {
"dialog-hassio-network": DialogHassioNetwork;
}
}

View File

@@ -0,0 +1,22 @@
import { fireEvent } from "../../../../src/common/dom/fire_event";
import { NetworkInfo } from "../../../../src/data/hassio/network";
import "./dialog-hassio-network";
export interface HassioNetworkDialogParams {
network: NetworkInfo;
loadData: () => Promise<void>;
}
export const showNetworkDialog = (
element: HTMLElement,
dialogParams: HassioNetworkDialogParams
): void => {
fireEvent(element, "show-dialog", {
dialogTag: "dialog-hassio-network",
dialogImport: () =>
import(
/* webpackChunkName: "dialog-hassio-network" */ "./dialog-hassio-network"
),
dialogParams,
});
};

View File

@@ -0,0 +1,245 @@
import "@material/mwc-button/mwc-button";
import "@material/mwc-icon-button/mwc-icon-button";
import "@material/mwc-list/mwc-list-item";
import { mdiDelete } from "@mdi/js";
import { PaperInputElement } from "@polymer/paper-input/paper-input";
import {
css,
CSSResult,
customElement,
html,
internalProperty,
LitElement,
property,
TemplateResult,
} from "lit-element";
import "../../../../src/components/ha-circular-progress";
import { createCloseHeading } from "../../../../src/components/ha-dialog";
import "../../../../src/components/ha-svg-icon";
import { extractApiErrorMessage } from "../../../../src/data/hassio/common";
import {
addHassioDockerRegistry,
fetchHassioDockerRegistries,
removeHassioDockerRegistry,
} from "../../../../src/data/hassio/docker";
import { showAlertDialog } from "../../../../src/dialogs/generic/show-dialog-box";
import { haStyle, haStyleDialog } from "../../../../src/resources/styles";
import type { HomeAssistant } from "../../../../src/types";
@customElement("dialog-hassio-registries")
class HassioRegistriesDialog extends LitElement {
@property({ attribute: false }) public hass!: HomeAssistant;
@property({ attribute: false }) private _registries?: {
registry: string;
username: string;
}[];
@internalProperty() private _registry?: string;
@internalProperty() private _username?: string;
@internalProperty() private _password?: string;
@internalProperty() private _opened = false;
@internalProperty() private _addingRegistry = false;
protected render(): TemplateResult {
return html`
<ha-dialog
.open=${this._opened}
@closing=${this.closeDialog}
scrimClickAction
escapeKeyAction
.heading=${createCloseHeading(
this.hass,
this._addingRegistry
? "Add New Docker Registry"
: "Manage Docker Registries"
)}
>
<div class="form">
${this._addingRegistry
? html`
<paper-input
@value-changed=${this._inputChanged}
class="flex-auto"
name="registry"
label="Registry"
required
auto-validate
></paper-input>
<paper-input
@value-changed=${this._inputChanged}
class="flex-auto"
name="username"
label="Username"
required
auto-validate
></paper-input>
<paper-input
@value-changed=${this._inputChanged}
class="flex-auto"
name="password"
label="Password"
type="password"
required
auto-validate
></paper-input>
<mwc-button
?disabled=${Boolean(
!this._registry || !this._username || !this._password
)}
@click=${this._addNewRegistry}
>
Add registry
</mwc-button>
`
: html`${this._registries?.length
? this._registries.map((entry) => {
return html`
<mwc-list-item class="option" hasMeta twoline>
<span>${entry.registry}</span>
<span slot="secondary"
>Username: ${entry.username}</span
>
<mwc-icon-button
.entry=${entry}
title="Remove"
slot="meta"
@click=${this._removeRegistry}
>
<ha-svg-icon .path=${mdiDelete}></ha-svg-icon>
</mwc-icon-button>
</mwc-list-item>
`;
})
: html`
<mwc-list-item>
<span>No registries configured</span>
</mwc-list-item>
`}
<mwc-button @click=${this._addRegistry}>
Add new registry
</mwc-button> `}
</div>
</ha-dialog>
`;
}
private _inputChanged(ev: Event) {
const target = ev.currentTarget as PaperInputElement;
this[`_${target.name}`] = target.value;
}
public async showDialog(_dialogParams: any): Promise<void> {
this._opened = true;
await this._loadRegistries();
await this.updateComplete;
}
public closeDialog(): void {
this._addingRegistry = false;
this._opened = false;
}
public focus(): void {
this.updateComplete.then(() =>
(this.shadowRoot?.querySelector(
"[dialogInitialFocus]"
) as HTMLElement)?.focus()
);
}
private async _loadRegistries(): Promise<void> {
const registries = await fetchHassioDockerRegistries(this.hass);
this._registries = Object.keys(registries!.registries).map((key) => ({
registry: key,
username: registries.registries[key].username,
}));
}
private _addRegistry(): void {
this._addingRegistry = true;
}
private async _addNewRegistry(): Promise<void> {
const data = {};
data[this._registry!] = {
username: this._username,
password: this._password,
};
try {
await addHassioDockerRegistry(this.hass, data);
await this._loadRegistries();
this._addingRegistry = false;
} catch (err) {
showAlertDialog(this, {
title: "Failed to add registry",
text: extractApiErrorMessage(err),
});
}
}
private async _removeRegistry(ev: Event): Promise<void> {
const entry = (ev.currentTarget as any).entry;
try {
await removeHassioDockerRegistry(this.hass, entry.registry);
await this._loadRegistries();
} catch (err) {
showAlertDialog(this, {
title: "Failed to remove registry",
text: extractApiErrorMessage(err),
});
}
}
static get styles(): CSSResult[] {
return [
haStyle,
haStyleDialog,
css`
ha-dialog.button-left {
--justify-action-buttons: flex-start;
}
paper-icon-item {
cursor: pointer;
}
.form {
color: var(--primary-text-color);
}
.option {
border: 1px solid var(--divider-color);
border-radius: 4px;
margin-top: 4px;
}
mwc-button {
margin-left: 8px;
}
mwc-icon-button {
color: var(--error-color);
margin: -10px;
}
mwc-list-item {
cursor: default;
}
mwc-list-item span[slot="secondary"] {
color: var(--secondary-text-color);
}
ha-paper-dropdown-menu {
display: block;
}
`,
];
}
}
declare global {
interface HTMLElementTagNameMap {
"dialog-hassio-registries": HassioRegistriesDialog;
}
}

View File

@@ -0,0 +1,13 @@
import { fireEvent } from "../../../../src/common/dom/fire_event";
import "./dialog-hassio-registries";
export const showRegistriesDialog = (element: HTMLElement): void => {
fireEvent(element, "show-dialog", {
dialogTag: "dialog-hassio-registries",
dialogImport: () =>
import(
/* webpackChunkName: "dialog-hassio-registries" */ "./dialog-hassio-registries"
),
dialogParams: {},
});
};

View File

@@ -5,25 +5,26 @@ import "@polymer/paper-input/paper-input";
import type { PaperInputElement } from "@polymer/paper-input/paper-input";
import "@polymer/paper-item/paper-item";
import "@polymer/paper-item/paper-item-body";
import "../../../../src/components/ha-circular-progress";
import {
css,
CSSResult,
customElement,
html,
internalProperty,
LitElement,
property,
internalProperty,
query,
TemplateResult,
} from "lit-element";
import memoizeOne from "memoize-one";
import "../../../../src/components/ha-circular-progress";
import "../../../../src/components/ha-dialog";
import "../../../../src/components/ha-svg-icon";
import {
fetchHassioAddonsInfo,
HassioAddonRepository,
} from "../../../../src/data/hassio/addon";
import { extractApiErrorMessage } from "../../../../src/data/hassio/common";
import { setSupervisorOption } from "../../../../src/data/hassio/supervisor";
import { haStyle, haStyleDialog } from "../../../../src/resources/styles";
import type { HomeAssistant } from "../../../../src/types";
@@ -38,7 +39,7 @@ class HassioRepositoriesDialog extends LitElement {
@property({ attribute: false })
private _dialogParams?: HassioRepositoryDialogParams;
@query("#repository_input") private _optionInput?: PaperInputElement;
@query("#repository_input", true) private _optionInput?: PaperInputElement;
@internalProperty() private _opened = false;
@@ -90,7 +91,7 @@ class HassioRepositoriesDialog extends LitElement {
title="Remove"
@click=${this._removeRepository}
>
<ha-svg-icon path=${mdiDelete}></ha-svg-icon>
<ha-svg-icon .path=${mdiDelete}></ha-svg-icon>
</mwc-icon-button>
</paper-item>
`;
@@ -190,7 +191,7 @@ class HassioRepositoriesDialog extends LitElement {
input.value = "";
} catch (err) {
this._error = err.message;
this._error = extractApiErrorMessage(err);
}
this._prosessing = false;
}
@@ -222,7 +223,7 @@ class HassioRepositoriesDialog extends LitElement {
await this._dialogParams!.loadData();
} catch (err) {
this._error = err.message;
this._error = extractApiErrorMessage(err);
}
}
}

View File

@@ -0,0 +1,107 @@
import { mdiClose } from "@mdi/js";
import {
css,
CSSResult,
customElement,
html,
internalProperty,
LitElement,
property,
TemplateResult,
} from "lit-element";
import { fireEvent } from "../../../../src/common/dom/fire_event";
import "../../../../src/components/ha-header-bar";
import { HassDialog } from "../../../../src/dialogs/make-dialog-manager";
import { haStyleDialog } from "../../../../src/resources/styles";
import type { HomeAssistant } from "../../../../src/types";
import "../../components/hassio-upload-snapshot";
import { HassioSnapshotUploadDialogParams } from "./show-dialog-snapshot-upload";
@customElement("dialog-hassio-snapshot-upload")
export class DialogHassioSnapshotUpload extends LitElement
implements HassDialog<HassioSnapshotUploadDialogParams> {
@property({ attribute: false }) public hass!: HomeAssistant;
@internalProperty() private _params?: HassioSnapshotUploadDialogParams;
public async showDialog(
params: HassioSnapshotUploadDialogParams
): Promise<void> {
this._params = params;
await this.updateComplete;
}
public closeDialog(): void {
if (this._params && !this._params.onboarding) {
if (this._params.reloadSnapshot) {
this._params.reloadSnapshot();
}
}
this._params = undefined;
fireEvent(this, "dialog-closed", { dialog: this.localName });
}
protected render(): TemplateResult {
if (!this._params) {
return html``;
}
return html`
<ha-dialog
open
scrimClickAction
escapeKeyAction
hideActions
.heading=${true}
@closed=${this.closeDialog}
>
<div slot="heading">
<ha-header-bar>
<span slot="title">
Upload snapshot
</span>
<mwc-icon-button slot="actionItems" dialogAction="cancel">
<ha-svg-icon .path=${mdiClose}></ha-svg-icon>
</mwc-icon-button>
</ha-header-bar>
</div>
<hassio-upload-snapshot
@snapshot-uploaded=${this._snapshotUploaded}
.hass=${this.hass}
></hassio-upload-snapshot>
</ha-dialog>
`;
}
private _snapshotUploaded(ev) {
const snapshot = ev.detail.snapshot;
this._params?.showSnapshot(snapshot.slug);
this.closeDialog();
}
static get styles(): CSSResult[] {
return [
haStyleDialog,
css`
ha-header-bar {
--mdc-theme-on-primary: var(--primary-text-color);
--mdc-theme-primary: var(--mdc-theme-surface);
flex-shrink: 0;
}
/* overrule the ha-style-dialog max-height on small screens */
@media all and (max-width: 450px), all and (max-height: 500px) {
ha-header-bar {
--mdc-theme-primary: var(--app-header-background-color);
--mdc-theme-on-primary: var(--app-header-text-color, white);
}
}
`,
];
}
}
declare global {
interface HTMLElementTagNameMap {
"dialog-hassio-snapshot-upload": DialogHassioSnapshotUpload;
}
}

View File

@@ -1,26 +1,30 @@
import "@material/mwc-button";
import { mdiDelete, mdiDownload, mdiHistory } from "@mdi/js";
import { PaperCheckboxElement } from "@polymer/paper-checkbox/paper-checkbox";
import { mdiClose, mdiDelete, mdiDownload, mdiHistory } from "@mdi/js";
import "@polymer/paper-checkbox/paper-checkbox";
import type { PaperCheckboxElement } from "@polymer/paper-checkbox/paper-checkbox";
import "@polymer/paper-input/paper-input";
import {
css,
CSSResult,
customElement,
html,
internalProperty,
LitElement,
property,
internalProperty,
TemplateResult,
} from "lit-element";
import { createCloseHeading } from "../../../../src/components/ha-dialog";
import { fireEvent } from "../../../../src/common/dom/fire_event";
import "../../../../src/components/ha-header-bar";
import "../../../../src/components/ha-svg-icon";
import { getSignedPath } from "../../../../src/data/auth";
import { extractApiErrorMessage } from "../../../../src/data/hassio/common";
import {
fetchHassioSnapshotInfo,
HassioSnapshotDetail,
} from "../../../../src/data/hassio/snapshot";
import { showConfirmationDialog } from "../../../../src/dialogs/generic/show-dialog-box";
import { PolymerChangedEvent } from "../../../../src/polymer-types";
import { haStyleDialog } from "../../../../src/resources/styles";
import { haStyle, haStyleDialog } from "../../../../src/resources/styles";
import { HomeAssistant } from "../../../../src/types";
import { HassioSnapshotDialogParams } from "./show-dialog-hassio-snapshot";
@@ -73,6 +77,8 @@ class HassioSnapshotDialog extends LitElement {
@internalProperty() private _error?: string;
@internalProperty() private _onboarding = false;
@internalProperty() private _snapshot?: HassioSnapshotDetail;
@internalProperty() private _folders!: FolderItem[];
@@ -88,13 +94,14 @@ class HassioSnapshotDialog extends LitElement {
public async showDialog(params: HassioSnapshotDialogParams) {
this._snapshot = await fetchHassioSnapshotInfo(this.hass, params.slug);
this._folders = _computeFolders(
this._snapshot.folders
this._snapshot?.folders
).sort((a: FolderItem, b: FolderItem) => (a.name > b.name ? 1 : -1));
this._addons = _computeAddons(
this._snapshot.addons
this._snapshot?.addons
).sort((a: AddonItem, b: AddonItem) => (a.name > b.name ? 1 : -1));
this._dialogParams = params;
this._onboarding = params.onboarding ?? false;
}
protected render(): TemplateResult {
@@ -102,12 +109,17 @@ class HassioSnapshotDialog extends LitElement {
return html``;
}
return html`
<ha-dialog
open
stacked
@closing=${this._closeDialog}
.heading=${createCloseHeading(this.hass, this._computeName)}
>
<ha-dialog open stacked @closing=${this._closeDialog} .heading=${true}>
<div slot="heading">
<ha-header-bar>
<span slot="title">
${this._computeName}
</span>
<mwc-icon-button slot="actionItems" dialogAction="cancel">
<ha-svg-icon .path=${mdiClose}></ha-svg-icon>
</mwc-icon-button>
</ha-header-bar>
</div>
<div class="details">
${this._snapshot.type === "full"
? "Full snapshot"
@@ -180,17 +192,21 @@ class HassioSnapshotDialog extends LitElement {
${this._error ? html` <p class="error">Error: ${this._error}</p> ` : ""}
<div>Actions:</div>
<mwc-button @click=${this._downloadClicked} slot="primaryAction">
<ha-svg-icon path=${mdiDownload} class="icon"></ha-svg-icon>
Download Snapshot
</mwc-button>
${!this._onboarding
? html`<mwc-button
@click=${this._downloadClicked}
slot="primaryAction"
>
<ha-svg-icon .path=${mdiDownload} class="icon"></ha-svg-icon>
Download Snapshot
</mwc-button>`
: ""}
<mwc-button
@click=${this._partialRestoreClicked}
slot="secondaryAction"
>
<ha-svg-icon path=${mdiHistory} class="icon"></ha-svg-icon>
<ha-svg-icon .path=${mdiHistory} class="icon"></ha-svg-icon>
Restore Selected
</mwc-button>
${this._snapshot.type === "full"
@@ -199,21 +215,30 @@ class HassioSnapshotDialog extends LitElement {
@click=${this._fullRestoreClicked}
slot="secondaryAction"
>
<ha-svg-icon path=${mdiHistory} class="icon"></ha-svg-icon>
<ha-svg-icon .path=${mdiHistory} class="icon"></ha-svg-icon>
Wipe &amp; restore
</mwc-button>
`
: ""}
<mwc-button @click=${this._deleteClicked} slot="secondaryAction">
<ha-svg-icon path=${mdiDelete} class="icon warning"></ha-svg-icon>
<span class="warning">Delete Snapshot</span>
</mwc-button>
${!this._onboarding
? html`<mwc-button
@click=${this._deleteClicked}
slot="secondaryAction"
>
<ha-svg-icon
.path=${mdiDelete}
class="icon warning"
></ha-svg-icon>
<span class="warning">Delete Snapshot</span>
</mwc-button>`
: ""}
</ha-dialog>
`;
}
static get styles(): CSSResult[] {
return [
haStyle,
haStyleDialog,
css`
paper-checkbox {
@@ -240,6 +265,18 @@ class HassioSnapshotDialog extends LitElement {
.no-margin-top {
margin-top: 0;
}
ha-header-bar {
--mdc-theme-on-primary: var(--primary-text-color);
--mdc-theme-primary: var(--mdc-theme-surface);
flex-shrink: 0;
}
/* overrule the ha-style-dialog max-height on small screens */
@media all and (max-width: 450px), all and (max-height: 500px) {
ha-header-bar {
--mdc-theme-primary: var(--app-header-background-color);
--mdc-theme-on-primary: var(--app-header-text-color, white);
}
}
`,
];
}
@@ -266,8 +303,14 @@ class HassioSnapshotDialog extends LitElement {
this._snapshotPassword = ev.detail.value;
}
private _partialRestoreClicked() {
if (!confirm("Are you sure you want to restore this snapshot?")) {
private async _partialRestoreClicked() {
if (
!(await showConfirmationDialog(this, {
title: "Are you sure you want partially to restore this snapshot?",
confirmText: "restore",
dismissText: "cancel",
}))
) {
return;
}
@@ -294,52 +337,82 @@ class HassioSnapshotDialog extends LitElement {
data.password = this._snapshotPassword;
}
this.hass
.callApi(
"POST",
if (!this._onboarding) {
this.hass
.callApi(
"POST",
`hassio/snapshots/${this._snapshot!.slug}/restore/partial`,
data
)
.then(
() => {
alert("Snapshot restored!");
this._closeDialog();
},
(error) => {
this._error = error.body.message;
}
);
`hassio/snapshots/${this._snapshot!.slug}/restore/partial`,
data
)
.then(
() => {
alert("Snapshot restored!");
this._closeDialog();
},
(error) => {
this._error = error.body.message;
}
);
} else {
fireEvent(this, "restoring");
fetch(`/api/hassio/snapshots/${this._snapshot!.slug}/restore/partial`, {
method: "POST",
body: JSON.stringify(data),
});
this._closeDialog();
}
}
private _fullRestoreClicked() {
if (!confirm("Are you sure you want to restore this snapshot?")) {
private async _fullRestoreClicked() {
if (
!(await showConfirmationDialog(this, {
title:
"Are you sure you want to wipe your system and restore this snapshot?",
confirmText: "restore",
dismissText: "cancel",
}))
) {
return;
}
const data = this._snapshot!.protected
? { password: this._snapshotPassword }
: undefined;
this.hass
.callApi(
"POST",
`hassio/snapshots/${this._snapshot!.slug}/restore/full`,
data
)
.then(
() => {
alert("Snapshot restored!");
this._closeDialog();
},
(error) => {
this._error = error.body.message;
}
);
if (!this._onboarding) {
this.hass
.callApi(
"POST",
`hassio/snapshots/${this._snapshot!.slug}/restore/full`,
data
)
.then(
() => {
alert("Snapshot restored!");
this._closeDialog();
},
(error) => {
this._error = error.body.message;
}
);
} else {
fireEvent(this, "restoring");
fetch(`/api/hassio/snapshots/${this._snapshot!.slug}/restore/full`, {
method: "POST",
body: JSON.stringify(data),
});
this._closeDialog();
}
}
private _deleteClicked() {
if (!confirm("Are you sure you want to delete this snapshot?")) {
private async _deleteClicked() {
if (
!(await showConfirmationDialog(this, {
title: "Are you sure you want to delete this snapshot?",
confirmText: "delete",
dismissText: "cancel",
}))
) {
return;
}
@@ -348,7 +421,9 @@ class HassioSnapshotDialog extends LitElement {
.callApi("POST", `hassio/snapshots/${this._snapshot!.slug}/remove`)
.then(
() => {
this._dialogParams!.onDelete();
if (this._dialogParams!.onDelete) {
this._dialogParams!.onDelete();
}
this._closeDialog();
},
(error) => {
@@ -365,10 +440,23 @@ class HassioSnapshotDialog extends LitElement {
`/api/hassio/snapshots/${this._snapshot!.slug}/download`
);
} catch (err) {
alert(`Error: ${err.message}`);
alert(`Error: ${extractApiErrorMessage(err)}`);
return;
}
if (window.location.href.includes("ui.nabu.casa")) {
const confirm = await showConfirmationDialog(this, {
title: "Potential slow download",
text:
"Downloading snapshots over the Nabu Casa URL will take some time, it is recomended to use your local URL instead, do you want to continue?",
confirmText: "continue",
dismissText: "cancel",
});
if (!confirm) {
return;
}
}
const name = this._computeName.replace(/[^a-z0-9]+/gi, "_");
const a = document.createElement("a");
a.href = signedPath.path;

View File

@@ -2,7 +2,8 @@ import { fireEvent } from "../../../../src/common/dom/fire_event";
export interface HassioSnapshotDialogParams {
slug: string;
onDelete: () => void;
onDelete?: () => void;
onboarding?: boolean;
}
export const showHassioSnapshotDialog = (

View File

@@ -0,0 +1,22 @@
import { fireEvent } from "../../../../src/common/dom/fire_event";
import "./dialog-hassio-snapshot-upload";
export interface HassioSnapshotUploadDialogParams {
showSnapshot: (slug: string) => void;
reloadSnapshot?: () => Promise<void>;
onboarding?: boolean;
}
export const showSnapshotUploadDialog = (
element: HTMLElement,
dialogParams: HassioSnapshotUploadDialogParams
): void => {
fireEvent(element, "show-dialog", {
dialogTag: "dialog-hassio-snapshot-upload",
dialogImport: () =>
import(
/* webpackChunkName: "dialog-hassio-snapshot-upload" */ "./dialog-hassio-snapshot-upload"
),
dialogParams,
});
};

Some files were not shown because too many files have changed in this diff Show More