number-field-item.vue 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. <script setup lang="ts">
  2. import type { SelectOption } from '@vben-core/typings';
  3. import { useSlots } from 'vue';
  4. import { CircleHelp } from '@vben-core/icons';
  5. import {
  6. NumberField,
  7. NumberFieldContent,
  8. NumberFieldDecrement,
  9. NumberFieldIncrement,
  10. NumberFieldInput,
  11. VbenTooltip,
  12. } from '@vben-core/shadcn-ui';
  13. defineOptions({
  14. name: 'PreferenceSelectItem',
  15. });
  16. withDefaults(
  17. defineProps<{
  18. disabled?: boolean;
  19. items?: SelectOption[];
  20. placeholder?: string;
  21. }>(),
  22. {
  23. disabled: false,
  24. placeholder: '',
  25. items: () => [],
  26. },
  27. );
  28. const inputValue = defineModel<number>();
  29. const slots = useSlots();
  30. </script>
  31. <template>
  32. <div
  33. :class="{
  34. 'hover:bg-accent': !slots.tip,
  35. 'pointer-events-none opacity-50': disabled,
  36. }"
  37. class="my-1 flex w-full items-center justify-between rounded-md px-2 py-1"
  38. >
  39. <span class="flex items-center text-sm">
  40. <slot></slot>
  41. <VbenTooltip v-if="slots.tip" side="bottom">
  42. <template #trigger>
  43. <CircleHelp class="ml-1 size-3 cursor-help" />
  44. </template>
  45. <slot name="tip"></slot>
  46. </VbenTooltip>
  47. </span>
  48. <NumberField v-model="inputValue" v-bind="$attrs" class="w-[165px]">
  49. <NumberFieldContent>
  50. <NumberFieldDecrement />
  51. <NumberFieldInput />
  52. <NumberFieldIncrement />
  53. </NumberFieldContent>
  54. </NumberField>
  55. </div>
  56. </template>