Update Hass.io panel with store details page

This commit is contained in:
Paulus Schoutsen 2017-06-28 22:46:00 -07:00
parent af8b10e06a
commit b64c9548bc
6 changed files with 345 additions and 119 deletions

View File

@ -51,7 +51,13 @@ Polymer({
addons: { addons: {
type: Array, type: Array,
} },
selectedAddon: {
type: String,
value: null,
notify: true,
},
}, },
computeShowIntro: function (repo) { computeShowIntro: function (repo) {
@ -63,7 +69,7 @@ Polymer({
}, },
addonTapped: function (ev) { addonTapped: function (ev) {
this.fire('hassio-select-addon', { addon: this.addons[ev.model.index].slug }); this.selectedAddon = this.addons[ev.model.index].slug;
ev.target.blur(); ev.target.blur();
}, },
}); });

View File

@ -0,0 +1,105 @@
<link rel="import" href="../../../bower_components/polymer/polymer.html">
<link rel="import" href="../../../bower_components/app-layout/app-header-layout/app-header-layout.html">
<link rel="import" href="../../../bower_components/app-layout/app-header/app-header.html">
<link rel="import" href="../../../bower_components/app-layout/app-toolbar/app-toolbar.html">
<link rel="import" href="../../../bower_components/paper-icon-button/paper-icon-button.html">
<link rel="import" href="../../../src/components/ha-menu-button.html">
<link rel="import" href="./hassio-repositories-editor.html">
<link rel="import" href="./hassio-addon-repository.html">
<dom-module id="hassio-addon-store-overview">
<template>
<style include="iron-flex ha-style">
paper-card {
display: block;
}
.content {
padding: 24px 0 32px;
max-width: 600px;
margin: 0 auto;
}
hassio-addon-repository {
margin-top: 24px;
}
</style>
<app-header-layout has-scrolling-region>
<app-header slot="header" fixed>
<app-toolbar>
<paper-icon-button
icon='mdi:arrow-left'
on-tap='backTapped'
></paper-icon-button>
<div main-title>Hass.io Add-Ons</div>
<paper-icon-button
icon="mdi:refresh"
on-tap="refreshTapped"
></paper-icon-button>
</app-toolbar>
</app-header>
<div class='content'>
<hassio-repositories-editor
hass='[[hass]]'
repos='[[supervisorInfo.addons_repositories]]'
></hassio-repositories-editor>
<template is='dom-repeat' items='[[repos]]' as='repo'>
<hassio-addon-repository
repo='[[repo]]'
addons='[[computeAddOns(repo.slug)]]'
selected-addon='{{selectedAddon}}'
></hassio-addon-repository>
</template>
</div>
</app-header-layout>
</template>
</dom-module>
<script>
Polymer({
is: 'hassio-addon-store-overview',
properties: {
hass: {
type: Object,
},
selectedAddon: {
type: String,
value: null,
notify: true,
},
addons: {
type: Array,
value: [],
},
repos: {
type: Array,
value: []
},
supervisorInfo: {
type: Object,
}
},
computeAddOns: function (repo) {
return this.addons.filter(function (addon) {
return addon.repository === repo;
});
},
refreshTapped: function () {
this.fire('hassio-store-refresh');
},
backTapped: function () {
// Closes the store. Needs to be done with app-route.
this.fire('hassio-select-addon', { addon: null });
},
});
</script>

View File

@ -0,0 +1,138 @@
<link rel="import" href="../../../bower_components/polymer/polymer.html">
<link rel="import" href="../../../bower_components/app-layout/app-header-layout/app-header-layout.html">
<link rel="import" href="../../../bower_components/app-layout/app-header/app-header.html">
<link rel="import" href="../../../bower_components/app-layout/app-toolbar/app-toolbar.html">
<link rel="import" href="../../../bower_components/paper-card/paper-card.html">
<link rel="import" href="../../../src/components/buttons/ha-call-api-button.html">
<dom-module id="hassio-addon-store-view">
<template>
<style include="iron-flex ha-style">
paper-card {
display: block;
margin-bottom: 32px;
}
.content {
padding: 24px 0 32px;
max-width: 600px;
margin: 0 auto;
}
.addon-header {
@apply --paper-font-headline;
}
.addon-light {
color: var(--secondary-text-color);
}
.addon-version {
float: right;
font-size: 15px;
vertical-align: middle;
}
</style>
<app-header-layout has-scrolling-region>
<app-header slot="header" fixed>
<app-toolbar>
<paper-icon-button
icon='mdi:arrow-left'
on-tap='backTapped'
></paper-icon-button>
<div main-title>[[addon.name]]</div>
</app-toolbar>
</app-header>
<div class='content'>
<paper-card>
<div class="card-content">
<div class="addon-header">[[addon.name]]
<div class="addon-version addon-light">
v[[addon.version]]
</div>
</div>
<p>[[addon.description]]</p>
<p class='addon-light'>
Made available via repository [[addon.repository]].
</p>
<template is='dom-if' if='[[addon.url]]'>
<p><a target='_blank' href='[[addon.url]]'>Visit website</a></p>
</template>
<template is='dom-if' if='[[addon.build]]'>
<p class='addon-light'>
This add-on will built locally on the device.
</p>
</template>
</div>
<div class="card-actions">
<template is='dom-if' if='[[addon.installed]]'>
<paper-button on-tap='openAddon'>Open</paper-button>
</template>
<template is='dom-if' if='[[!addon.installed]]'>
<ha-call-api-button
hass='[[hass]]'
path="[[pathInstall(addon)]]"
>Install</ha-call-api-button>
</template>
</div>
</paper-card>
<paper-card>
<div class='card-content'>
<div class='addon-header'>Repository: [[repo.name]]</div>
<p>Maintainer: [[repo.maintainer]]</p>
<p><a target='_blank' href='[[repo.url]]'>Visit website</a></p>
</div>
</paper-card>
</div>
</app-header-layout>
</template>
</dom-module>
<script>
Polymer({
is: 'hassio-addon-store-view',
properties: {
hass: {
type: Object,
},
selectedAddon: {
type: String,
value: null,
notify: true,
},
addon: {
type: Object,
},
repo: {
type: Object,
},
},
listeners: {
'hass-api-called': 'apiCalled',
},
pathInstall: function (addon) {
return addon && 'hassio/addons/' + addon.slug + '/install';
},
apiCalled: function (ev) {
if (ev.detail.success) {
this.openAddon();
}
},
openAddon: function () {
this.fire('hassio-select-addon', { addon: this.addon.slug });
},
backTapped: function () {
this.selectedAddon = null;
},
});
</script>

View File

@ -8,51 +8,28 @@
<link rel="import" href="./hassio-repositories-editor.html"> <link rel="import" href="./hassio-repositories-editor.html">
<link rel="import" href="./hassio-addon-repository.html"> <link rel="import" href="./hassio-addon-repository.html">
<link rel="import" href="./hassio-addon-store-view.html">
<link rel="import" href="./hassio-addon-store-overview.html">
<dom-module id="hassio-addon-store"> <dom-module id="hassio-addon-store">
<template> <template>
<style include="iron-flex ha-style"> <template is='dom-if' if='[[selectedAddon]]' restamp>
paper-card { <hassio-addon-store-view
display: block;
}
.content {
padding: 24px 0 32px;
max-width: 600px;
margin: 0 auto;
}
hassio-addon-repository {
margin-top: 24px;
}
</style>
<app-header-layout has-scrolling-region>
<app-header slot="header" fixed>
<app-toolbar>
<paper-icon-button
icon='mdi:arrow-left'
on-tap='backTapped'
></paper-icon-button>
<div main-title>Hass.io Add-Ons</div>
<paper-icon-button
icon="mdi:refresh"
on-tap="refreshTapped"
></paper-icon-button>
</app-toolbar>
</app-header>
<div class='content'>
<hassio-repositories-editor
hass='[[hass]]' hass='[[hass]]'
repos='[[supervisorInfo.addons_repositories]]' selected-addon='{{selectedAddon}}'
></hassio-repositories-editor> addon='[[selectedAddonObject]]'
<template is='dom-repeat' items='[[repos]]' as='repo'> repo='[[computeActiveRepo(repos, selectedAddonObject)]]'
<hassio-addon-repository ></hassio-addon-store-view>
repo='[[repo]]' </template>
addons='[[computeAddOns(repo.slug)]]'
></hassio-addon-repository> <template is='dom-if' if='[[!selectedAddon]]'>
<hassio-addon-store-overview
hass='[[hass]]'
selected-addon='{{selectedAddon}}'
addons='[[addons]]'
repos='[[repos]]'
></hassio-addon-store-overview>
</template> </template>
</div>
</app-header-layout>
</template> </template>
</dom-module> </dom-module>
@ -65,13 +42,14 @@ Polymer({
type: Object, type: Object,
}, },
narrow: { selectedAddon: {
type: Boolean, type: String,
value: null,
}, },
showMenu: { selectedAddonObject: {
type: Boolean, type: Object,
value: false, computed: 'computeActiveAddon(addons, selectedAddon)',
}, },
addons: { addons: {
@ -91,6 +69,7 @@ Polymer({
listeners: { listeners: {
'hass-api-called': 'apiCalled', 'hass-api-called': 'apiCalled',
'hassio-store-refresh': 'refreshData',
}, },
apiCalled: function (ev) { apiCalled: function (ev) {
@ -114,21 +93,31 @@ Polymer({
}.bind(this)); }.bind(this));
}, },
computeAddOns: function (repo) { computeActiveAddon: function (addons, selectedAddon) {
return this.addons.filter(function (addon) { for (var i = 0; i < addons.length; i++) {
return addon.repository === repo; if (addons[i].slug === selectedAddon) {
}); return addons[i];
}
}
return null;
}, },
refreshTapped: function () { computeActiveRepo: function (repos, selectedAddonObject) {
if (!selectedAddonObject) return null;
for (var i = 0; i < repos.length; i++) {
if (repos[i].slug === selectedAddonObject.repository) {
return repos[i];
}
}
return null;
},
refreshData: function () {
this.hass.callApi('post', 'hassio/supervisor/reload') this.hass.callApi('post', 'hassio/supervisor/reload')
.then(function () { .then(function () {
this.loadData(); this.loadData();
}.bind(this)); }.bind(this));
}, },
backTapped: function () {
this.fire('hassio-select-addon', { addon: null });
},
}); });
</script> </script>

View File

@ -14,19 +14,6 @@
} }
</style> </style>
<paper-card heading='Installed'> <paper-card heading='Installed'>
<template is='dom-if' if='[[!addonState]]'>
<div class="card-content">
<div>Add-on is not installed.</div>
</div>
<div class="card-actions">
<ha-call-api-button
hass='[[hass]]'
path="[[pathInstall(addon)]]"
>Install</ha-call-api-button>
</div>
</template>
<template is='dom-if' if='[[addonState]]'>
<div class="card-content"> <div class="card-content">
<table class='info'> <table class='info'>
<tr> <tr>
@ -74,7 +61,6 @@
path="[[pathUninstall(addon)]]" path="[[pathUninstall(addon)]]"
>Uninstall</ha-call-api-button> >Uninstall</ha-call-api-button>
</div> </div>
</template>
</paper-card> </paper-card>
</template> </template>
</dom-module> </dom-module>
@ -128,10 +114,6 @@ Polymer({
return 'hassio/addons/' + addon + '/restart'; return 'hassio/addons/' + addon + '/restart';
}, },
pathInstall: function (addon) {
return 'hassio/addons/' + addon + '/install';
},
pathUninstall: function (addon) { pathUninstall: function (addon) {
return 'hassio/addons/' + addon + '/uninstall'; return 'hassio/addons/' + addon + '/uninstall';
}, },

View File

@ -128,8 +128,14 @@ Polymer({
'hass-api-called': 'apiCalled', 'hass-api-called': 'apiCalled',
}, },
apiCalled: function () { apiCalled: function (ev) {
var path = ev.detail.path;
if (path.substr(path.lastIndexOf('/') + 1) === 'uninstall') {
this.backTapped();
} else {
this.addonChanged(this.addon); this.addonChanged(this.addon);
}
}, },
addonChanged: function (addon) { addonChanged: function (addon) {