forked from platypush/platypush
Support for nested configuration objects on entity modals
This commit is contained in:
parent
13eb515f87
commit
7868d6fe37
2 changed files with 82 additions and 8 deletions
|
@ -15,9 +15,12 @@
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
<div class="groups-canvas">
|
<div class="groups-canvas">
|
||||||
<EntityModal :entity="entities[modalEntityId]"
|
<EntityModal
|
||||||
:visible="modalVisible" @close="onEntityModal"
|
:entity="entities[modalEntityId]"
|
||||||
v-if="modalEntityId"
|
:visible="modalVisible"
|
||||||
|
:config-values="configValuesByParentId(modalEntityId)"
|
||||||
|
@close="onEntityModal"
|
||||||
|
v-if="modalEntityId && entities[modalEntityId]"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<NoItems v-if="!Object.keys(displayGroups || {})?.length">No entities found</NoItems>
|
<NoItems v-if="!Object.keys(displayGroups || {})?.length">No entities found</NoItems>
|
||||||
|
@ -240,6 +243,19 @@ export default {
|
||||||
}, {})
|
}, {})
|
||||||
},
|
},
|
||||||
|
|
||||||
|
configValuesByParentId(parentId) {
|
||||||
|
return Object.values(this.entities).
|
||||||
|
filter(
|
||||||
|
(entity) => entity
|
||||||
|
&& entity.parent_id === parentId
|
||||||
|
&& entity.is_configuration
|
||||||
|
).
|
||||||
|
reduce((obj, entity) => {
|
||||||
|
obj[entity.id] = entity
|
||||||
|
return obj
|
||||||
|
}, {})
|
||||||
|
},
|
||||||
|
|
||||||
clearEntityTimeouts(entityId) {
|
clearEntityTimeouts(entityId) {
|
||||||
if (this.errorEntities[entityId])
|
if (this.errorEntities[entityId])
|
||||||
delete this.errorEntities[entityId]
|
delete this.errorEntities[entityId]
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
<template>
|
<template>
|
||||||
<Modal :visible="visible" class="entity-modal" :title="entity.name || entity.external_id">
|
<Modal :visible="visible" class="entity-modal" :title="entity.name || entity.external_id" v-if="entity">
|
||||||
<ConfirmDialog ref="deleteConfirmDiag" title="Confirm entity deletion" @input="onDelete">
|
<ConfirmDialog ref="deleteConfirmDiag" title="Confirm entity deletion" @input="onDelete">
|
||||||
Are you <b>sure</b> that you want to delete this entity? <br/><br/>
|
Are you <b>sure</b> that you want to delete this entity? <br/><br/>
|
||||||
Note: you should only delete an entity if its plugin has been disabled
|
Note: you should only delete an entity if its plugin has been disabled
|
||||||
|
@ -101,6 +101,30 @@
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="config-container"
|
||||||
|
v-if="computedConfig.length">
|
||||||
|
<div class="title"
|
||||||
|
@click="configCollapsed = !configCollapsed">
|
||||||
|
<div class="col-11">
|
||||||
|
<i class="fas fa-screwdriver-wrench" />
|
||||||
|
Configuration
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-1 pull-right">
|
||||||
|
<i class="fas"
|
||||||
|
:class="{'fa-chevron-down': configCollapsed, 'fa-chevron-up': !configCollapsed}" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="entities" v-if="!configCollapsed">
|
||||||
|
<Entity
|
||||||
|
v-for="entity in computedConfig"
|
||||||
|
:key="entity.id"
|
||||||
|
:value="entity"
|
||||||
|
@input="$emit('input', entity)" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</Modal>
|
</Modal>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
@ -111,11 +135,12 @@ import ConfirmDialog from "@/components/elements/ConfirmDialog";
|
||||||
import EditButton from "@/components/elements/EditButton";
|
import EditButton from "@/components/elements/EditButton";
|
||||||
import NameEditor from "@/components/elements/NameEditor";
|
import NameEditor from "@/components/elements/NameEditor";
|
||||||
import Utils from "@/Utils";
|
import Utils from "@/Utils";
|
||||||
import meta from './meta.json'
|
import Entity from "./Entity";
|
||||||
|
import meta from './meta.json';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "Entity",
|
name: "EntityModal",
|
||||||
components: {Modal, EditButton, NameEditor, Icon, ConfirmDialog},
|
components: {Entity, Modal, EditButton, NameEditor, Icon, ConfirmDialog},
|
||||||
mixins: [Utils],
|
mixins: [Utils],
|
||||||
emits: ['input', 'loading'],
|
emits: ['input', 'loading'],
|
||||||
props: {
|
props: {
|
||||||
|
@ -128,6 +153,19 @@ export default {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: false,
|
default: false,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
configValues: {
|
||||||
|
type: Object,
|
||||||
|
default: () => {},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
computed: {
|
||||||
|
computedConfig() {
|
||||||
|
return Object.values(this.configValues).sort(
|
||||||
|
(a, b) => (a.name || '').localeCompare(b.name || '')
|
||||||
|
)
|
||||||
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
data() {
|
data() {
|
||||||
|
@ -135,6 +173,7 @@ export default {
|
||||||
loading: false,
|
loading: false,
|
||||||
editName: false,
|
editName: false,
|
||||||
editIcon: false,
|
editIcon: false,
|
||||||
|
configCollapsed: true,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -211,10 +250,11 @@ export default {
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
:deep(.modal) {
|
:deep(.modal) {
|
||||||
.body {
|
.body {
|
||||||
padding: .5em !important;
|
padding: 0;
|
||||||
|
|
||||||
.table-row {
|
.table-row {
|
||||||
box-shadow: none;
|
box-shadow: none;
|
||||||
|
padding: 0.5em;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -256,5 +296,23 @@ export default {
|
||||||
color: $error-fg;
|
color: $error-fg;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.config-container {
|
||||||
|
margin: 0;
|
||||||
|
|
||||||
|
.title {
|
||||||
|
display: flex;
|
||||||
|
padding: 1em;
|
||||||
|
text-transform: uppercase;
|
||||||
|
letter-spacing: 0.033em;
|
||||||
|
border-top: $default-border;
|
||||||
|
box-shadow: $border-shadow-bottom;
|
||||||
|
cursor: pointer;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background: $hover-bg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
Loading…
Reference in a new issue