Files
DiceCloud/app/imports/client/ui/components/propertyToolbar.vue
2023-06-21 14:30:48 +02:00

254 lines
6.7 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template lang="html">
<v-toolbar
:color="color || 'secondary'"
:dark="isDark"
:light="!isDark"
:flat="flat"
>
<v-btn
v-if="!embedded"
icon
@click="back"
>
<v-icon>mdi-arrow-left</v-icon>
</v-btn>
<property-icon
:model="model"
class="mr-2"
/>
<v-toolbar-title v-if="model">
{{ title }}
</v-toolbar-title>
<v-spacer />
<v-slide-y-transition
hide-on-leave
>
<v-layout
v-if="editing && model"
key="edit-buttons"
style="flex-shrink: 0;"
>
<v-spacer />
<v-menu
v-if="$listeners && (
$listeners.move ||
$listeners.duplicate ||
$listeners.remove
)"
bottom
left
transition="slide-y-transition"
>
<template #activator="{ on }">
<v-btn
icon
data-id="property-toolbar-menu-button"
v-on="on"
>
<v-icon>mdi-dots-vertical</v-icon>
</v-btn>
</template>
<v-list>
<v-list-item
v-if="docsPath"
@click="helpDialog"
>
<v-list-item-content>
<v-list-item-title>
Help
</v-list-item-title>
</v-list-item-content>
<v-list-item-action>
<v-icon>mdi-help</v-icon>
</v-list-item-action>
</v-list-item>
<v-list-item
v-if="$listeners && $listeners.duplicate"
:disabled="context.editPermission === false"
@click="$emit('duplicate')"
>
<v-list-item-content>
<v-list-item-title>
Duplicate
</v-list-item-title>
</v-list-item-content>
<v-list-item-action>
<v-icon>mdi-content-copy</v-icon>
</v-list-item-action>
</v-list-item>
<v-list-item
v-if="$listeners && $listeners.copy"
:disabled="context.copyPermission === false"
@click="$emit('copy')"
>
<v-list-item-content>
<v-list-item-title>
Copy To
</v-list-item-title>
</v-list-item-content>
<v-list-item-action>
<v-icon>mdi-content-duplicate</v-icon>
</v-list-item-action>
</v-list-item>
<v-list-item
v-if="$listeners && $listeners.move"
:disabled="context.editPermission === false"
@click="$emit('move')"
>
<v-list-item-content>
<v-list-item-title>
Move
</v-list-item-title>
</v-list-item-content>
<v-list-item-action>
<v-icon>mdi-send</v-icon>
</v-list-item-action>
</v-list-item>
<v-list-item
v-if="$listeners && $listeners['copy-to-library'] && userPaid"
:disabled="context.editPermission === false"
@click="$emit('copy-to-library')"
>
<v-list-item-content>
<v-list-item-title>
Copy to library
</v-list-item-title>
</v-list-item-content>
<v-list-item-action>
<v-icon>mdi-content-duplicate</v-icon>
</v-list-item-action>
</v-list-item>
<v-list-item
v-if="$listeners && $listeners.remove"
:disabled="context.editPermission === false"
@click="$emit('remove')"
>
<v-list-item-content>
<v-list-item-title>
Delete
</v-list-item-title>
</v-list-item-content>
<v-list-item-action>
<v-icon>mdi-delete</v-icon>
</v-list-item-action>
</v-list-item>
</v-list>
</v-menu>
</v-layout>
<v-layout
v-else
key="blank"
/>
</v-slide-y-transition>
<v-btn
tile
outlined
@click="$emit('toggle-editing')"
>
<span style="width: 44px;">
{{ editing ? 'Done' : 'Edit' }}
</span>
<v-slide-y-transition
hide-on-leave
>
<v-icon
v-if="editing"
key="doneIcon"
right
>
mdi-check
</v-icon>
<v-icon
v-else
key="createIcon"
right
>
mdi-pencil
</v-icon>
</v-slide-y-transition>
</v-btn>
</v-toolbar>
</template>
<script lang="js">
import isDarkColor from '/imports/client/ui/utility/isDarkColor.js';
import PropertyIcon from '/imports/client/ui/properties/shared/PropertyIcon.vue';
import { getPropertyName } from '/imports/constants/PROPERTIES.js';
import getThemeColor from '/imports/client/ui/utility/getThemeColor.js';
import PROPERTIES from '/imports/constants/PROPERTIES.js';
import { assertUserHasPaidBenefits } from '/imports/api/users/patreon/tiers.js';
export default {
components: {
PropertyIcon,
},
inject: {
context: { default: {} }
},
props: {
model: {
type: Object,
default: undefined,
},
flat: Boolean,
editing: Boolean,
embedded: Boolean,
},
computed: {
isDark(){
return isDarkColor(this.color);
},
color(){
return this.model && this.model.color || getThemeColor('secondary');
},
title(){
let model = this.model;
if (model.quantity !== 1 && model.quantity !== undefined){
if (model.plural){
return `${model.quantity} ${model.plural}`;
} else if (model.name) {
return `${model.quantity} ${model.name}`;
} else {
return `${model.quantity} × ${getPropertyName(model.type)}`
}
}
return model.name || getPropertyName(model.type);
},
docsPath() {
const propDef = PROPERTIES[this.model.type];
return propDef && propDef.docsPath;
},
},
meteor: {
userPaid() {
try {
assertUserHasPaidBenefits(Meteor.user())
return true;
} catch (e) {
return false;
}
},
},
methods: {
colorChanged(value){
this.$emit('color-changed', value);
},
back(){
this.$store.dispatch('popDialogStack');
},
helpDialog() {
this.$store.commit('pushDialogStack', {
component: 'help-dialog',
elementId: 'property-toolbar-menu-button',
data: {
path: this.docsPath,
},
});
},
}
}
</script>
<style lang="css" scoped>
</style>