aboutsummaryrefslogtreecommitdiff
path: root/src/ui/c-buttons-select/c-buttons-select.vue
diff options
context:
space:
mode:
authorGravatar Corentin THOMASSET <corentin.thomasset74@gmail.com> 2023-09-12 00:57:42 +0200
committerGravatar GitHub <noreply@github.com> 2023-09-11 22:57:42 +0000
commit5c4d775e2d0f2aaf0a7e427ec2eab774ae19ec07 (patch)
tree14da28a2bcfc7ef52ee5bf33f6426f590b514cbc /src/ui/c-buttons-select/c-buttons-select.vue
parent557b30426fbcfd2a7e0fe99ed5c86a0756a1b1ba (diff)
downloadit-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.vue59
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>