mirror of
https://github.com/home-assistant/frontend.git
synced 2025-07-26 02:36:37 +00:00
Add support for sections
This commit is contained in:
parent
561107250d
commit
811de0a3fa
@ -20,7 +20,7 @@
|
|||||||
"author": "Paulus Schoutsen <Paulus@PaulusSchoutsen.nl> (http://paulusschoutsen.nl)",
|
"author": "Paulus Schoutsen <Paulus@PaulusSchoutsen.nl> (http://paulusschoutsen.nl)",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"home-assistant-js": "git+https://github.com/balloob/home-assistant-js.git#a6ba8f88f5f0cfc09a4472fbda8d08e752358cee",
|
"home-assistant-js": "git+https://github.com/balloob/home-assistant-js.git#25db573e8534c41f21d0a25392cf4c2c47eec646",
|
||||||
"lodash": "^3.10.0",
|
"lodash": "^3.10.0",
|
||||||
"moment": "^2.11.1"
|
"moment": "^2.11.1"
|
||||||
},
|
},
|
||||||
|
@ -50,11 +50,11 @@ export default new Polymer({
|
|||||||
|
|
||||||
cards: {
|
cards: {
|
||||||
type: Object,
|
type: Object,
|
||||||
computed: 'computeDomains(columns, states, showIntroduction)',
|
computed: 'computeCards(columns, states, showIntroduction)',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
computeDomains(columns, states, showIntroduction) {
|
computeCards(columns, states, showIntroduction) {
|
||||||
const byDomain = states.groupBy(entity => entity.domain);
|
const byDomain = states.groupBy(entity => entity.domain);
|
||||||
const hasGroup = {};
|
const hasGroup = {};
|
||||||
|
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
<link rel="import" href="../../bower_components/polymer/polymer.html">
|
<link rel="import" href="../../bower_components/polymer/polymer.html">
|
||||||
|
<link rel="import" href="../../bower_components/iron-icon/iron-icon.html">
|
||||||
<link rel="import" href="../../bower_components/paper-header-panel/paper-header-panel.html">
|
<link rel="import" href="../../bower_components/paper-header-panel/paper-header-panel.html">
|
||||||
<link rel="import" href="../../bower_components/paper-icon-button/paper-icon-button.html">
|
<link rel="import" href="../../bower_components/paper-icon-button/paper-icon-button.html">
|
||||||
|
<link rel="import" href="../../bower_components/paper-tabs/paper-tabs.html">
|
||||||
|
|
||||||
<link rel="import" href="../components/ha-zone-cards.html">
|
<link rel="import" href="../components/ha-zone-cards.html">
|
||||||
|
|
||||||
@ -13,13 +15,39 @@
|
|||||||
-webkit-user-select: none;
|
-webkit-user-select: none;
|
||||||
-moz-user-select: none;
|
-moz-user-select: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
paper-tab {
|
||||||
|
text-transform: uppercase;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<paper-header-panel mode="waterfall">
|
<paper-header-panel mode="waterfall">
|
||||||
<paper-toolbar>
|
<paper-toolbar class='medium'>
|
||||||
<paper-icon-button icon='mdi:menu' class$='[[computeMenuButtonClass(narrow, showMenu)]]' on-tap='toggleMenu'></paper-icon-button>
|
<paper-icon-button icon='mdi:menu' class$='[[computeMenuButtonClass(narrow, showMenu)]]' on-tap='toggleMenu'></paper-icon-button>
|
||||||
|
|
||||||
|
<template is='dom-if' if='[[!hasSections]]'>
|
||||||
<div class='title'>[[locationName]]</div>
|
<div class='title'>[[locationName]]</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<template is='dom-if' if='[[hasSections]]'>
|
||||||
|
<div class='flex'>
|
||||||
|
<paper-tabs selected='[[currentSection]]' attr-for-selected='data-entity'
|
||||||
|
on-iron-select='sectionSelected' scrollable='true'>
|
||||||
|
<paper-tab data-entity=''>[[locationName]]</paper-tab>
|
||||||
|
<template is='dom-repeat' items='[[sections]]'>
|
||||||
|
<paper-tab data-entity$='[[item.entityId]]'>
|
||||||
|
<template is='dom-if' if='[[item.attributes.icon]]'>
|
||||||
|
<iron-icon icon='[[item.attributes.icon]]'></iron-icon>
|
||||||
|
</template>
|
||||||
|
<template is='dom-if' if='[[!item.attributes.icon]]'>
|
||||||
|
[[item.entityDisplay]]
|
||||||
|
</template>
|
||||||
|
</paper-tab>
|
||||||
|
</template>
|
||||||
|
</paper-tabs>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
<paper-icon-button
|
<paper-icon-button
|
||||||
icon="mdi:refresh"
|
icon="mdi:refresh"
|
||||||
@ -33,7 +61,7 @@
|
|||||||
|
|
||||||
<div class='fit'>
|
<div class='fit'>
|
||||||
<ha-zone-cards
|
<ha-zone-cards
|
||||||
show-introduction='[[computeShowIntroduction(introductionLoaded, states)]]'
|
show-introduction='[[computeShowIntroduction(currentSection, introductionLoaded, states)]]'
|
||||||
states='[[states]]' columns='[[columns]]'></ha-zone-cards>
|
states='[[states]]' columns='[[columns]]'></ha-zone-cards>
|
||||||
</div>
|
</div>
|
||||||
</paper-header-panel>
|
</paper-header-panel>
|
||||||
|
@ -8,7 +8,8 @@ require('../components/ha-zone-cards');
|
|||||||
|
|
||||||
const {
|
const {
|
||||||
configGetters,
|
configGetters,
|
||||||
entityGetters,
|
sectionActions,
|
||||||
|
sectionGetters,
|
||||||
voiceGetters,
|
voiceGetters,
|
||||||
streamGetters,
|
streamGetters,
|
||||||
syncGetters,
|
syncGetters,
|
||||||
@ -62,9 +63,32 @@ export default new Polymer({
|
|||||||
observer: 'windowChange',
|
observer: 'windowChange',
|
||||||
},
|
},
|
||||||
|
|
||||||
|
currentSection: {
|
||||||
|
type: String,
|
||||||
|
bindNuclear: [
|
||||||
|
sectionGetters.currentSection,
|
||||||
|
section => section || '',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
|
||||||
|
sections: {
|
||||||
|
type: Array,
|
||||||
|
bindNuclear: [
|
||||||
|
sectionGetters.sections,
|
||||||
|
sections => sections.valueSeq()
|
||||||
|
.sortBy(section => section.attributes.order)
|
||||||
|
.toArray(),
|
||||||
|
],
|
||||||
|
},
|
||||||
|
|
||||||
|
hasSections: {
|
||||||
|
type: Boolean,
|
||||||
|
computed: 'computeHasSections(sections)',
|
||||||
|
},
|
||||||
|
|
||||||
states: {
|
states: {
|
||||||
type: Object,
|
type: Object,
|
||||||
bindNuclear: entityGetters.visibleEntityMap,
|
bindNuclear: sectionGetters.currentSectionEntities,
|
||||||
},
|
},
|
||||||
|
|
||||||
columns: {
|
columns: {
|
||||||
@ -103,29 +127,30 @@ export default new Polymer({
|
|||||||
voiceActions.listen();
|
voiceActions.listen();
|
||||||
},
|
},
|
||||||
|
|
||||||
computeDomains(states) {
|
|
||||||
return states.keySeq().toArray();
|
|
||||||
},
|
|
||||||
|
|
||||||
computeMenuButtonClass(narrow, showMenu) {
|
computeMenuButtonClass(narrow, showMenu) {
|
||||||
return !narrow && showMenu ? 'invisible' : '';
|
return !narrow && showMenu ? 'invisible' : '';
|
||||||
},
|
},
|
||||||
|
|
||||||
computeStatesOfDomain(states, domain) {
|
|
||||||
return states.get(domain).toArray();
|
|
||||||
},
|
|
||||||
|
|
||||||
computeRefreshButtonClass(isFetching) {
|
computeRefreshButtonClass(isFetching) {
|
||||||
if (isFetching) {
|
if (isFetching) {
|
||||||
return 'ha-spin';
|
return 'ha-spin';
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
computeShowIntroduction(introductionLoaded, states) {
|
computeShowIntroduction(currentSection, introductionLoaded, states) {
|
||||||
return introductionLoaded || states.size === 0;
|
return currentSection === '' && (introductionLoaded || states.size === 0);
|
||||||
|
},
|
||||||
|
|
||||||
|
computeHasSections(sections) {
|
||||||
|
return sections.length > 0;
|
||||||
},
|
},
|
||||||
|
|
||||||
toggleMenu() {
|
toggleMenu() {
|
||||||
this.fire('open-menu');
|
this.fire('open-menu');
|
||||||
},
|
},
|
||||||
|
|
||||||
|
sectionSelected(ev) {
|
||||||
|
const section = ev.detail.item.getAttribute('data-entity') || null;
|
||||||
|
this.async(() => sectionActions.selectSection(section), 0);
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
Loading…
x
Reference in New Issue
Block a user