-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathcontrol_segmented.vue
More file actions
94 lines (86 loc) · 1.98 KB
/
control_segmented.vue
File metadata and controls
94 lines (86 loc) · 1.98 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
<template>
<dt-text
kind="label"
:size="100"
tone="secondary"
class="d-input__label-text d-c-default"
>
<slot />
</dt-text>
<dt-segmented-control
:model-value="String(value)"
:size="100"
:disabled="disabled"
@change="onInput"
>
<dt-segmented-control-item
v-for="option in options"
:key="option.value"
v-dt-tooltip="option.resolved ?? undefined"
:value="String(option.value)"
>
{{ option.label }}
</dt-segmented-control-item>
</dt-segmented-control>
</template>
<script setup>
import { DtSegmentedControl, DtSegmentedControlItem, DtText } from '@dialpad/dialtone-vue';
import { VALUE_UPDATE_EVENT } from '@/src/lib/constants';
import { resolveTokenValue } from '@/src/lib/tokens';
import { computed } from 'vue';
const props = defineProps({
value: {
type: undefined,
required: true,
},
validValues: {
type: Array,
default: undefined,
},
disabled: {
type: Boolean,
default: false,
},
generateLabel: {
type: Function,
default: (value) => value.toString(),
},
tokenCategory: {
type: String,
default: undefined,
},
propValues: {
type: Object,
default: undefined,
},
});
const emit = defineEmits([VALUE_UPDATE_EVENT]);
const options = computed(() => {
return props.validValues?.map(v => ({
value: v,
label: props.generateLabel(v),
resolved: props.tokenCategory
? resolveTokenValue(props.tokenCategory, v, props.propValues)
: null,
})) ?? [];
});
// DtSegmentedControl coerces values to strings — map back to original types on selection
const valueMap = computed(() => {
const map = {};
props.validValues?.forEach(v => {
map[String(v)] = v;
});
return map;
});
function onInput (stringValue) {
emit(VALUE_UPDATE_EVENT, valueMap.value[stringValue]);
}
</script>
<script>
/**
* Control that renders a segmented control for enum props with few, short options.
*/
export default {
name: 'DtcControlSegmented',
};
</script>