forked from platypush/platypush
[UI] Added ActionTile
component.
This commit is contained in:
parent
7fcffe899e
commit
63767cb87c
1 changed files with 195 additions and 0 deletions
|
@ -0,0 +1,195 @@
|
||||||
|
<template>
|
||||||
|
<div class="action-tile" @click="$refs.actionEditor.show">
|
||||||
|
<div class="action-delete" title="Remove" v-if="withDelete" @click.stop="$emit('delete')">
|
||||||
|
<i class="icon fas fa-xmark" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="action-name" v-if="name?.length">
|
||||||
|
{{ name }}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="new-action" v-else>
|
||||||
|
<i class="icon fas fa-plus" /> New Action
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="action-args" v-if="Object.keys(value.args || {})?.length">
|
||||||
|
<div class="arg" v-for="(arg, name) in value.args" :key="name">
|
||||||
|
<div class="arg-name">
|
||||||
|
{{ name }}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="arg-value">
|
||||||
|
{{ arg }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="action-editor-container">
|
||||||
|
<Modal ref="actionEditor" title="Edit Action">
|
||||||
|
<ActionEditor :value="value" with-save @input="onInput"
|
||||||
|
v-if="this.$refs.actionEditor?.$data?.isVisible" />
|
||||||
|
</Modal>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import ActionEditor from "@/components/Action/ActionEditor"
|
||||||
|
import Modal from "@/components/Modal";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
emits: ['input', 'delete'],
|
||||||
|
components: {
|
||||||
|
ActionEditor,
|
||||||
|
Modal,
|
||||||
|
},
|
||||||
|
|
||||||
|
props: {
|
||||||
|
value: {
|
||||||
|
type: Object,
|
||||||
|
default: () => ({
|
||||||
|
name: undefined,
|
||||||
|
args: {},
|
||||||
|
extraArgs: [],
|
||||||
|
supportsExtraArgs: true,
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
|
||||||
|
withDelete: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
computed: {
|
||||||
|
name() {
|
||||||
|
return this.value.name || this.value.action
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
onInput(value) {
|
||||||
|
this.$emit('input', {
|
||||||
|
...this.value,
|
||||||
|
name: value.action,
|
||||||
|
args: value.args,
|
||||||
|
extraArgs: value.extraArgs,
|
||||||
|
supportsExtraArgs: value.supportsExtraArgs,
|
||||||
|
})
|
||||||
|
|
||||||
|
this.$refs.actionEditor.close()
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
@import "common";
|
||||||
|
|
||||||
|
.action-tile {
|
||||||
|
min-width: 20em;
|
||||||
|
max-height: 7.5em;
|
||||||
|
background: $action-tile-bg;
|
||||||
|
color: $action-tile-fg;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
padding: 0.5em 1em;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
content: "";
|
||||||
|
position: relative;
|
||||||
|
border-radius: 1em;
|
||||||
|
cursor: pointer;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: $default-hover-fg;
|
||||||
|
}
|
||||||
|
|
||||||
|
.action-delete {
|
||||||
|
width: 1.5em;
|
||||||
|
height: 1.5em;
|
||||||
|
font-size: 1.25em;
|
||||||
|
position: absolute;
|
||||||
|
top: 0.25em;
|
||||||
|
right: 0;
|
||||||
|
opacity: 0.7;
|
||||||
|
transition: opacity 0.25s ease-in-out;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.action-name {
|
||||||
|
font-size: 1.1em;
|
||||||
|
font-weight: bold;
|
||||||
|
font-family: monospace;
|
||||||
|
}
|
||||||
|
|
||||||
|
.new-action {
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
.action-args {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
margin-top: 0.5em;
|
||||||
|
|
||||||
|
.arg {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
align-items: center;
|
||||||
|
margin-bottom: 0.5em;
|
||||||
|
|
||||||
|
.arg-name {
|
||||||
|
font-weight: bold;
|
||||||
|
margin-right: 0.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.arg-value {
|
||||||
|
font-family: monospace;
|
||||||
|
font-size: 0.9em;
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.action-editor-container {
|
||||||
|
:deep(.modal-container) {
|
||||||
|
@include until($tablet) {
|
||||||
|
.modal {
|
||||||
|
width: calc(100vw - 1em);
|
||||||
|
|
||||||
|
.content {
|
||||||
|
width: 100%;
|
||||||
|
|
||||||
|
.body {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.content .body {
|
||||||
|
width: 80vw;
|
||||||
|
height: 80vh;
|
||||||
|
max-width: 800px;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tabs {
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.action-editor {
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
form {
|
||||||
|
height: calc(100% - $tab-height);
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
Loading…
Reference in a new issue