Skip to content
Snippets Groups Projects
DividerSettings.vue 4.87 KiB
Newer Older
import { changeEntitiesOrder, deleteEntity, editEntity } from '@/app/helpers';
import type { IDivider } from '@/app/interfaces/entities';
import { useVModel } from '@vueuse/core';
import type { IEntity } from '@/app/interfaces/environment';
import { useDataStore } from '@/app/stores/data';

interface Props {
  entityData: IDivider;
}
const props = defineProps<Props>();
const emit = defineEmits(['update:entityData']);
const entityData = useVModel(props, 'entityData', emit);

const dataStore = useDataStore();
const entities = computed(() => dataStore.entities);
const entityIndex = computed(() =>
  entities.value.findIndex((entity: IEntity) => entity.entity_uuid === props.entityData.entity_uuid)
const changeHeight = (height: number) => {
  entityData.value.divider_height = height;
  editEntity({ ...entityData.value, divider_height: height });
};
const changeType = (type: 'solid' | 'dashed' | 'dotted') => {
  entityData.value.divider_type = type;
  editEntity({ ...entityData.value, divider_type: type });
};
const speedDialSettings = computed(() => {
  const state = [];
  if (props.entityData?.divider_height !== 0) {
    const solid = {
      label: 'Solid',
      command: () => changeType('solid')
    };
    const dashed = {
      label: 'Dashed',
      command: () => changeType('dashed')
    };
    const dotted = {
      label: 'Dotted',
      command: () => changeType('dotted')
    };
    if (props.entityData?.divider_type === 'solid') {
      state.push(dashed, dotted);
    } else if (props.entityData?.divider_type === 'dashed') {
      state.push(solid, dotted);
    } else {
      state.push(solid, dashed);
    }
  const clear = {
    label: 'Clear',
    command: () => changeHeight(0)
  };
  const smallHeight = {
    label: 'Small',
    command: () => changeHeight(1)
  };
  const mediumHeight = {
    label: 'Medium',
    command: () => changeHeight(2)
  };
  const largeHeight = {
    label: 'Large',
    command: () => changeHeight(4)
  };
  const extraLargeHeight = {
    label: 'Extra large',
    command: () => changeHeight(8)
  };
  if (props.entityData?.divider_height === 0) {
    state.push(smallHeight, mediumHeight, largeHeight, extraLargeHeight);
  } else if (props.entityData?.divider_height === 1) {
    state.push(clear, mediumHeight, largeHeight, extraLargeHeight);
  } else if (props.entityData?.divider_height === 2) {
    state.push(clear, smallHeight, largeHeight, extraLargeHeight);
  } else if (props.entityData?.divider_height === 4) {
    state.push(clear, smallHeight, mediumHeight, extraLargeHeight);
    state.push(clear, smallHeight, mediumHeight, largeHeight);
  if (entityIndex.value !== 0) {
    state.push({
      label: 'Up',
      icon: 'pi pi-arrow-up',
      command: () => changeEntitiesOrder(props.entityData.entity_uuid, 'up')
  if (entityIndex.value !== entities.value.length - 1) {
    state.push({
      label: 'Down',
      icon: 'pi pi-arrow-down',
      command: () => changeEntitiesOrder(props.entityData.entity_uuid, 'down')
  state.push({
    label: 'Delete',
    icon: 'pi pi-trash',
    command: () => deleteEntity(props.entityData.entity_uuid)
  });
  return state;
});
</script>

<template>
  <div class="speedDial absolute left-2 top-0 transition-all select-none">
    <div class="relative z-40">
      <SpeedDial :model="speedDialSettings" direction="right" pt:root:class="speedDialRoot size-12">
        <template #button="{ toggleCallback }">
          <button
            class="border p-6 size-10 rounded-full bg-blue-500 flex items-center justify-center"
            @click="toggleCallback"
          >
            <i class="pi pi-cog"></i>
          </button>
        </template>
        <template #item="{ item, toggleCallback }">
          <div
            :class="[
              'flex flex-col bg-black bg-opacity-80 items-center justify-between -translate-8 gap-2 p-2 border rounded border-surface-200 dark:border-surface-700 w-20 cursor-pointer',
              {
                'text-red-400 font-semibold': item?.icon?.includes('trash'),
                'bg-violet-500': item.label === 'Extra large',
                'bg-red-500': item.label === 'Large',
                'bg-yellow-500': item.label === 'Medium',
                'bg-green-500': item.label === 'Small',
                'bg-blue-500': item.label === 'Clear'
              }
            ]"
            @click="toggleCallback"
          >
            <span :class="item?.icon" />
            <span v-show="item.label === 'Solid'"><SolidIcon /></span>
            <span v-show="item.label === 'Dashed'">
            </span>
            <span v-show="item.label === 'Dotted'">
            </span>
            <span class="text-center">
              {{ item.label }}
            </span>
          </div>
        </template>
      </SpeedDial>
    </div>
  </div>
</template>

<style scoped></style>