diff options
author | 2023-09-12 00:57:42 +0200 | |
---|---|---|
committer | 2023-09-11 22:57:42 +0000 | |
commit | 5c4d775e2d0f2aaf0a7e427ec2eab774ae19ec07 (patch) | |
tree | 14da28a2bcfc7ef52ee5bf33f6426f590b514cbc /src/ui/c-buttons-select/c-buttons-select.vue | |
parent | 557b30426fbcfd2a7e0fe99ed5c86a0756a1b1ba (diff) | |
download | it-tools-5c4d775e2d0f2aaf0a7e427ec2eab774ae19ec07.tar.gz it-tools-5c4d775e2d0f2aaf0a7e427ec2eab774ae19ec07.tar.zst it-tools-5c4d775e2d0f2aaf0a7e427ec2eab774ae19ec07.zip |
feat(new tool): ULID generator (#623)
Diffstat (limited to 'src/ui/c-buttons-select/c-buttons-select.vue')
-rw-r--r-- | src/ui/c-buttons-select/c-buttons-select.vue | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/src/ui/c-buttons-select/c-buttons-select.vue b/src/ui/c-buttons-select/c-buttons-select.vue new file mode 100644 index 0000000..38fff66 --- /dev/null +++ b/src/ui/c-buttons-select/c-buttons-select.vue @@ -0,0 +1,59 @@ +<script setup lang="ts" generic="T extends unknown"> +import type { CLabelProps } from '../c-label/c-label.types'; +import type { CButtonSelectOption } from './c-buttons-select.types'; + +const props = withDefaults( + defineProps<{ + options?: CButtonSelectOption<T>[] | string[] + value?: T + size?: 'small' | 'medium' | 'large' + } & CLabelProps >(), + { + options: () => [], + value: undefined, + labelPosition: 'left', + size: 'medium', + }, +); + +const emits = defineEmits(['update:value']); + +const { options: rawOptions, size } = toRefs(props); + +const options = computed(() => { + return rawOptions.value.map((option: string | CButtonSelectOption<T>) => { + if (typeof option === 'string') { + return { label: option, value: option }; + } + + return option; + }); +}); + +const value = useVModel(props, 'value', emits); + +function selectOption(option: CButtonSelectOption<T>) { + // @ts-expect-error vue template generic is a bit flacky thanks to withDefaults + value.value = option.value; +} +</script> + +<template> + <c-label v-bind="props"> + <div class="flex gap-2"> + <c-tooltip + v-for="option in options" :key="option.value" + :tooltip="option.tooltip" + > + <c-button + :test-id="option.value" + :size="size" + :type="option.value === value ? 'primary' : 'default'" + @click="selectOption(option)" + > + {{ option.label }} + </c-button> + </c-tooltip> + </div> + </c-label> +</template> |