More Z-Wave UI fixes [WIP]

This commit is contained in:
Fabio Manganiello 2021-02-14 19:16:10 +01:00
parent b922f29bb8
commit 80aa9b968d
10 changed files with 103 additions and 88 deletions

View File

@ -1 +1 @@
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="/favicon.ico"><title>platypush</title><link href="/static/css/chunk-134ec1dc.849ccfd5.css" rel="prefetch"><link href="/static/css/chunk-13b07ca5.029dd736.css" rel="prefetch"><link href="/static/css/chunk-1653b664.5b949e24.css" rel="prefetch"><link href="/static/css/chunk-23726328.7e460329.css" rel="prefetch"><link href="/static/css/chunk-283aacba.f186cc51.css" rel="prefetch"><link href="/static/css/chunk-2ca39dde.efa1eae8.css" rel="prefetch"><link href="/static/css/chunk-2f304dee.a8a2d99a.css" rel="prefetch"><link href="/static/css/chunk-3b435dde.f186cc51.css" rel="prefetch"><link href="/static/css/chunk-487896e7.b7730bd4.css" rel="prefetch"><link href="/static/css/chunk-49211740.43a25f0f.css" rel="prefetch"><link href="/static/css/chunk-4dae396b.92b3713e.css" rel="prefetch"><link href="/static/css/chunk-5145872a.197de139.css" rel="prefetch"><link href="/static/css/chunk-53e279b3.f186cc51.css" rel="prefetch"><link href="/static/css/chunk-595ffc05.678c9c97.css" rel="prefetch"><link href="/static/css/chunk-597b35e6.4a81cf33.css" rel="prefetch"><link href="/static/css/chunk-5a1e13e4.f186cc51.css" rel="prefetch"><link href="/static/css/chunk-5d5c4530.75269c9b.css" rel="prefetch"><link href="/static/css/chunk-64076603.e451beea.css" rel="prefetch"><link href="/static/css/chunk-675c7703.75b51be7.css" rel="prefetch"><link href="/static/css/chunk-7fae0422.c233115f.css" rel="prefetch"><link href="/static/css/chunk-d22da0c0.7c71cffb.css" rel="prefetch"><link href="/static/css/chunk-d28a86c4.cdd32c08.css" rel="prefetch"><link href="/static/css/chunk-da9476ec.f1965e2d.css" rel="prefetch"><link href="/static/css/chunk-ee62c128.44bbe779.css" rel="prefetch"><link href="/static/js/chunk-134ec1dc.87638287.js" rel="prefetch"><link href="/static/js/chunk-13b07ca5.11833bcd.js" rel="prefetch"><link href="/static/js/chunk-1653b664.4bba37ff.js" rel="prefetch"><link href="/static/js/chunk-23726328.7a638dfb.js" rel="prefetch"><link href="/static/js/chunk-283aacba.52472391.js" rel="prefetch"><link href="/static/js/chunk-2ca39dde.bfb67629.js" rel="prefetch"><link href="/static/js/chunk-2d0cc2be.71e3fcd8.js" rel="prefetch"><link href="/static/js/chunk-2d2091df.90a98553.js" rel="prefetch"><link href="/static/js/chunk-2d21da1a.707bd994.js" rel="prefetch"><link href="/static/js/chunk-2d237d41.b4b87abb.js" rel="prefetch"><link href="/static/js/chunk-2f304dee.649e4dc7.js" rel="prefetch"><link href="/static/js/chunk-3b435dde.bd4904a1.js" rel="prefetch"><link href="/static/js/chunk-487896e7.69cdcafb.js" rel="prefetch"><link href="/static/js/chunk-49211740.e4dea096.js" rel="prefetch"><link href="/static/js/chunk-4dae396b.0ee6bb40.js" rel="prefetch"><link href="/static/js/chunk-5145872a.f0bd0577.js" rel="prefetch"><link href="/static/js/chunk-53e279b3.cf489a46.js" rel="prefetch"><link href="/static/js/chunk-595ffc05.8affd7fe.js" rel="prefetch"><link href="/static/js/chunk-597b35e6.122f119a.js" rel="prefetch"><link href="/static/js/chunk-5a1e13e4.287f68a0.js" rel="prefetch"><link href="/static/js/chunk-5d5c4530.f0675a96.js" rel="prefetch"><link href="/static/js/chunk-64076603.2c344ed9.js" rel="prefetch"><link href="/static/js/chunk-675c7703.7c7378cd.js" rel="prefetch"><link href="/static/js/chunk-7fae0422.0d9be069.js" rel="prefetch"><link href="/static/js/chunk-d22da0c0.da01e99e.js" rel="prefetch"><link href="/static/js/chunk-d28a86c4.d0c1f74e.js" rel="prefetch"><link href="/static/js/chunk-da9476ec.f8c15985.js" rel="prefetch"><link href="/static/js/chunk-ee62c128.c11fb53e.js" rel="prefetch"><link href="/static/css/app.a59326af.css" rel="preload" as="style"><link href="/static/css/chunk-vendors.5dad8b00.css" rel="preload" as="style"><link href="/static/js/app.a6638873.js" rel="preload" as="script"><link href="/static/js/chunk-vendors.32426ed3.js" rel="preload" as="script"><link href="/static/css/chunk-vendors.5dad8b00.css" rel="stylesheet"><link href="/static/css/app.a59326af.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but platypush doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div><script src="/static/js/chunk-vendors.32426ed3.js"></script><script src="/static/js/app.a6638873.js"></script></body></html>
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="/favicon.ico"><title>platypush</title><link href="/static/css/chunk-134ec1dc.849ccfd5.css" rel="prefetch"><link href="/static/css/chunk-13b07ca5.029dd736.css" rel="prefetch"><link href="/static/css/chunk-1653b664.5b949e24.css" rel="prefetch"><link href="/static/css/chunk-23726328.7e460329.css" rel="prefetch"><link href="/static/css/chunk-283aacba.f186cc51.css" rel="prefetch"><link href="/static/css/chunk-2ad4c3a6.1e014b2b.css" rel="prefetch"><link href="/static/css/chunk-2ca39dde.efa1eae8.css" rel="prefetch"><link href="/static/css/chunk-2f304dee.a8a2d99a.css" rel="prefetch"><link href="/static/css/chunk-3b435dde.f186cc51.css" rel="prefetch"><link href="/static/css/chunk-487896e7.b7730bd4.css" rel="prefetch"><link href="/static/css/chunk-49211740.43a25f0f.css" rel="prefetch"><link href="/static/css/chunk-4dae396b.92b3713e.css" rel="prefetch"><link href="/static/css/chunk-5145872a.197de139.css" rel="prefetch"><link href="/static/css/chunk-53e279b3.f186cc51.css" rel="prefetch"><link href="/static/css/chunk-595ffc05.678c9c97.css" rel="prefetch"><link href="/static/css/chunk-5a1e13e4.f186cc51.css" rel="prefetch"><link href="/static/css/chunk-5d5c4530.75269c9b.css" rel="prefetch"><link href="/static/css/chunk-64076603.e451beea.css" rel="prefetch"><link href="/static/css/chunk-675c7703.75b51be7.css" rel="prefetch"><link href="/static/css/chunk-7fae0422.c233115f.css" rel="prefetch"><link href="/static/css/chunk-d22da0c0.7c71cffb.css" rel="prefetch"><link href="/static/css/chunk-d28a86c4.cdd32c08.css" rel="prefetch"><link href="/static/css/chunk-da9476ec.f1965e2d.css" rel="prefetch"><link href="/static/css/chunk-ee62c128.44bbe779.css" rel="prefetch"><link href="/static/js/chunk-134ec1dc.87638287.js" rel="prefetch"><link href="/static/js/chunk-13b07ca5.11833bcd.js" rel="prefetch"><link href="/static/js/chunk-1653b664.4bba37ff.js" rel="prefetch"><link href="/static/js/chunk-23726328.7a638dfb.js" rel="prefetch"><link href="/static/js/chunk-283aacba.52472391.js" rel="prefetch"><link href="/static/js/chunk-2ad4c3a6.3d409968.js" rel="prefetch"><link href="/static/js/chunk-2ca39dde.bfb67629.js" rel="prefetch"><link href="/static/js/chunk-2d0cc2be.71e3fcd8.js" rel="prefetch"><link href="/static/js/chunk-2d2091df.90a98553.js" rel="prefetch"><link href="/static/js/chunk-2d21da1a.707bd994.js" rel="prefetch"><link href="/static/js/chunk-2d237d41.b4b87abb.js" rel="prefetch"><link href="/static/js/chunk-2f304dee.649e4dc7.js" rel="prefetch"><link href="/static/js/chunk-3b435dde.bd4904a1.js" rel="prefetch"><link href="/static/js/chunk-487896e7.69cdcafb.js" rel="prefetch"><link href="/static/js/chunk-49211740.e4dea096.js" rel="prefetch"><link href="/static/js/chunk-4dae396b.0ee6bb40.js" rel="prefetch"><link href="/static/js/chunk-5145872a.f0bd0577.js" rel="prefetch"><link href="/static/js/chunk-53e279b3.cf489a46.js" rel="prefetch"><link href="/static/js/chunk-595ffc05.8affd7fe.js" rel="prefetch"><link href="/static/js/chunk-5a1e13e4.287f68a0.js" rel="prefetch"><link href="/static/js/chunk-5d5c4530.f0675a96.js" rel="prefetch"><link href="/static/js/chunk-64076603.2c344ed9.js" rel="prefetch"><link href="/static/js/chunk-675c7703.7c7378cd.js" rel="prefetch"><link href="/static/js/chunk-7fae0422.0d9be069.js" rel="prefetch"><link href="/static/js/chunk-d22da0c0.da01e99e.js" rel="prefetch"><link href="/static/js/chunk-d28a86c4.d0c1f74e.js" rel="prefetch"><link href="/static/js/chunk-da9476ec.f8c15985.js" rel="prefetch"><link href="/static/js/chunk-ee62c128.c11fb53e.js" rel="prefetch"><link href="/static/css/app.a59326af.css" rel="preload" as="style"><link href="/static/css/chunk-vendors.5dad8b00.css" rel="preload" as="style"><link href="/static/js/app.15e9cea6.js" rel="preload" as="script"><link href="/static/js/chunk-vendors.32426ed3.js" rel="preload" as="script"><link href="/static/css/chunk-vendors.5dad8b00.css" rel="stylesheet"><link href="/static/css/app.a59326af.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but platypush doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div><script src="/static/js/chunk-vendors.32426ed3.js"></script><script src="/static/js/app.15e9cea6.js"></script></body></html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -53,7 +53,7 @@
</Modal>
<div class="view-options">
<div class="view-selector col-s-9 col-m-10 col-l-11">
<div class="view-selector col-s-8 col-m-9 col-l-10">
<label>
<select @change="selected.view = $event.target.value">
<option v-for="(id, view) in views" :key="id"
@ -63,7 +63,7 @@
</label>
</div>
<div class="buttons">
<div class="buttons col-s-4 col-m-3 col-l-2">
<Dropdown title="Network commands" icon-class="fa fa-cog">
<DropdownItem text="Network Info" :disabled="commandRunning" icon-class="fa fa-info"
@click="networkInfoModalOpen" />
@ -93,102 +93,104 @@
</div>
</div>
<div class="view nodes" v-if="selected.view === 'nodes'">
<Loading v-if="loading.nodes" />
<div class="no-items" v-else-if="!Object.keys(nodes || {}).length">
<div class="empty">No nodes available on the network</div>
<div class="view-container">
<div class="view nodes" v-if="selected.view === 'nodes'">
<Loading v-if="loading.nodes" />
<div class="no-items" v-else-if="!Object.keys(nodes || {}).length">
<div class="empty">No nodes available on the network</div>
</div>
<Node v-for="(node, nodeId) in nodes" :key="nodeId" :node="node" :selected="selected.nodeId === nodeId"
@select="onNodeClick(nodeId)" />
</div>
<Node v-for="(node, nodeId) in nodes" :key="nodeId" :node="node" :selected="selected.nodeId === nodeId"
@select="onNodeClick(nodeId)" />
</div>
<div class="view groups" v-else-if="selected.view === 'groups'">
<Loading v-if="loading.groups" />
<div class="no-items" v-else-if="!Object.keys(groups || {}).length">
<div class="empty">No groups available on the network</div>
</div>
<div class="view groups" v-else-if="selected.view === 'groups'">
<Loading v-if="loading.groups" />
<div class="no-items" v-else-if="!Object.keys(groups || {}).length">
<div class="empty">No groups available on the network</div>
</div>
<Group v-for="(group, groupId) in groups" :key="groupId" :group="group" :selected="selected.groupId === groupId"
:nodes="groupId in groups ? groups[groupId].associations.map((node) => nodes[node]).
<Group v-for="(group, groupId) in groups" :key="groupId" :group="group" :selected="selected.groupId === groupId"
:nodes="groupId in groups ? groups[groupId].associations.map((node) => nodes[node]).
reduce((nodes, node) => {nodes[node.node_id] = node; return nodes}, {}) : {}"
@select="selected.groupId = groupId === selected.groupId ? undefined : groupId"
@open-add-nodes-to-group="$refs.addNodesToGroupModal.show()" />
</div>
<div class="view scenes" v-else-if="selected.view === 'scenes'">
<Loading v-if="loading.scenes" />
<div class="no-items" v-else-if="!Object.keys(scenes || {}).length">
<div class="empty">No scenes configured on the network</div>
@select="selected.groupId = groupId === selected.groupId ? undefined : groupId"
@open-add-nodes-to-group="$refs.addNodesToGroupModal.show()" />
</div>
<div class="item scene" :class="{selected: selected.sceneId === sceneId}"
v-for="(scene, sceneId) in scenes" :key="sceneId">
<div class="row name header vertical-center" :class="{selected: selected.sceneId === sceneId}" v-text="scene.label"
@click="selected.sceneId = sceneId === selected.sceneId ? undefined : sceneId" />
<div class="view scenes" v-else-if="selected.view === 'scenes'">
<Loading v-if="loading.scenes" />
<div class="no-items" v-else-if="!Object.keys(scenes || {}).length">
<div class="empty">No scenes configured on the network</div>
</div>
<div class="params" v-if="selected.sceneId === sceneId">
<div class="row">
<div class="param-name">Activate</div>
<div class="param-value">
<ToggleSwitch :value="false" @input="activateScene(sceneId)" />
</div>
</div>
<div class="item scene" :class="{selected: selected.sceneId === sceneId}"
v-for="(scene, sceneId) in scenes" :key="sceneId">
<div class="row name header vertical-center" :class="{selected: selected.sceneId === sceneId}" v-text="scene.label"
@click="selected.sceneId = sceneId === selected.sceneId ? undefined : sceneId" />
<div class="section actions">
<div class="header">
<div class="title">Actions</div>
<div class="params" v-if="selected.sceneId === sceneId">
<div class="row">
<div class="param-name">Activate</div>
<div class="param-value">
<ToggleSwitch :value="false" @input="activateScene(sceneId)" />
</div>
</div>
<div class="body">
<div class="row" @click="removeScene(sceneId)">
<div class="param-name">Remove Scene</div>
<div class="param-value">
<i class="fa fa-trash"></i>
</div>
<div class="section actions">
<div class="header">
<div class="title">Actions</div>
</div>
<div class="row" @click="renameScene(sceneId)">
<div class="param-name">Rename Scene</div>
<div class="param-value">
<i class="fa fa-edit"></i>
<div class="body">
<div class="row" @click="removeScene(sceneId)">
<div class="param-name">Remove Scene</div>
<div class="param-value">
<i class="fa fa-trash"></i>
</div>
</div>
<div class="row" @click="renameScene(sceneId)">
<div class="param-name">Rename Scene</div>
<div class="param-value">
<i class="fa fa-edit"></i>
</div>
</div>
</div>
</div>
</div>
<div class="section values" v-if="scene.values?.length">
<div class="value-container" v-for="(value, valueId) in valuesMap" :key="valueId">
<div class="value-display"
v-if="value.valueId && value.valueId in scenes.values[sceneId]" :scenes="scenes">
<Value :value="value" :node="node" :sceneId="sceneId" @add-to-scene="addValueToScene"
@remove-from-scene="removeValueFromScene" @refresh="refreshNodes" />
<div class="section values" v-if="scene.values?.length">
<div class="value-container" v-for="(value, valueId) in valuesMap" :key="valueId">
<div class="value-display"
v-if="value.valueId && value.valueId in scenes.values[sceneId]" :scenes="scenes">
<Value :value="value" :node="node" :sceneId="sceneId" @add-to-scene="addValueToScene"
@remove-from-scene="removeValueFromScene" @refresh="refreshNodes" />
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="view values" v-else>
<Loading v-if="loading.nodes" />
<div class="no-items" v-else-if="!Object.keys(nodes || {}).length">
<div class="empty">No nodes found on the network</div>
</div>
<div class="view values" v-else>
<Loading v-if="loading.nodes" />
<div class="no-items" v-else-if="!Object.keys(nodes || {}).length">
<div class="empty">No nodes found on the network</div>
</div>
<div class="node-container" v-for="(node, nodeId) in nodes" :key="nodeId">
<div class="item node"
:class="{selected: selected.nodeId === nodeId}"
v-if="selected.view === 'values' || Object.values(node.values).filter((value) => value.id_on_network in values[selected.view]).length > 0">
<div class="row name header vertical-center" :class="{selected: selected.nodeId === nodeId}" v-text="node.name"
@click="onNodeClick(nodeId)"></div>
<div class="node-container" v-for="(node, nodeId) in nodes" :key="nodeId">
<div class="item node"
:class="{selected: selected.nodeId === nodeId}"
v-if="selected.view === 'values' || Object.values(node.values).filter((value) => value.id_on_network in values[selected.view]).length > 0">
<div class="row name header vertical-center" :class="{selected: selected.nodeId === nodeId}" v-text="node.name"
@click="onNodeClick(nodeId)"></div>
<div class="params" v-if="selected.nodeId === nodeId">
<div class="value-container" v-for="(value, valueId) in node.values" :key="valueId">
<div class="value-display"
v-if="valueId && (selected.view === 'values' || value.valueId in values[selected.view])">
<Value :value="value" :node="node" :scenes="scenes" @add-to-scene="addValueToScene"
@remove-from-scene="removeValueFromScene" @refresh="refreshNodes" />
<div class="params" v-if="selected.nodeId === nodeId">
<div class="value-container" v-for="(value, valueId) in node.values" :key="valueId">
<div class="value-display"
v-if="valueId && (selected.view === 'values' || value.valueId in values[selected.view])">
<Value :value="value" :node="node" :scenes="scenes" @add-to-scene="addValueToScene"
@remove-from-scene="removeValueFromScene" @refresh="refreshNodes" />
</div>
</div>
</div>
</div>
@ -727,5 +729,10 @@ export default {
.network-info {
margin: -1em;
}
button {
border: none;
background: none;
}
}
</style>

View File

@ -274,12 +274,17 @@
text-align: right;
}
.view-container {
width: 100%;
height: calc(100% - #{$header-height});
overflow: auto;
display: flex;
justify-content: center;
}
.view {
min-width: 400pt;
max-width: 750pt;
background: $view-bg;
border: $view-border;
border-radius: 1.5em;
box-shadow: $view-box-shadow;
}
@ -293,6 +298,9 @@
@media screen and (min-width: $desktop) {
.view {
min-width: 400pt;
max-width: 750pt;
border-radius: 1.5em;
margin-top: 1em;
}
}