VDateInput.mjs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. import { createVNode as _createVNode, mergeProps as _mergeProps } from "vue";
  2. // Components
  3. import { makeVConfirmEditProps, VConfirmEdit } from "../../components/VConfirmEdit/VConfirmEdit.mjs";
  4. import { makeVDatePickerProps, VDatePicker } from "../../components/VDatePicker/VDatePicker.mjs";
  5. import { VMenu } from "../../components/VMenu/VMenu.mjs";
  6. import { makeVTextFieldProps, VTextField } from "../../components/VTextField/VTextField.mjs"; // Composables
  7. import { useDate } from "../../composables/date/index.mjs";
  8. import { makeFocusProps, useFocus } from "../../composables/focus.mjs";
  9. import { useLocale } from "../../composables/locale.mjs";
  10. import { useProxiedModel } from "../../composables/proxiedModel.mjs"; // Utilities
  11. import { computed, shallowRef } from 'vue';
  12. import { genericComponent, omit, propsFactory, useRender, wrapInArray } from "../../util/index.mjs"; // Types
  13. export const makeVDateInputProps = propsFactory({
  14. hideActions: Boolean,
  15. ...makeFocusProps(),
  16. ...makeVConfirmEditProps(),
  17. ...makeVTextFieldProps({
  18. placeholder: 'mm/dd/yyyy',
  19. prependIcon: '$calendar'
  20. }),
  21. ...omit(makeVDatePickerProps({
  22. weeksInMonth: 'dynamic',
  23. hideHeader: true
  24. }), ['active'])
  25. }, 'VDateInput');
  26. export const VDateInput = genericComponent()({
  27. name: 'VDateInput',
  28. props: makeVDateInputProps(),
  29. emits: {
  30. 'update:modelValue': val => true
  31. },
  32. setup(props, _ref) {
  33. let {
  34. slots
  35. } = _ref;
  36. const {
  37. t
  38. } = useLocale();
  39. const adapter = useDate();
  40. const {
  41. isFocused,
  42. focus,
  43. blur
  44. } = useFocus(props);
  45. const model = useProxiedModel(props, 'modelValue', props.multiple ? [] : null);
  46. const menu = shallowRef(false);
  47. const display = computed(() => {
  48. const value = wrapInArray(model.value);
  49. if (!value.length) return null;
  50. if (props.multiple === true) {
  51. return t('$vuetify.datePicker.itemsSelected', value.length);
  52. }
  53. if (props.multiple === 'range') {
  54. const start = value[0];
  55. const end = value[value.length - 1];
  56. return adapter.isValid(start) && adapter.isValid(end) ? `${adapter.format(start, 'keyboardDate')} - ${adapter.format(end, 'keyboardDate')}` : '';
  57. }
  58. return adapter.isValid(model.value) ? adapter.format(model.value, 'keyboardDate') : '';
  59. });
  60. const isInteractive = computed(() => !props.disabled && !props.readonly);
  61. function onKeydown(e) {
  62. if (e.key !== 'Enter') return;
  63. if (!menu.value || !isFocused.value) {
  64. menu.value = true;
  65. return;
  66. }
  67. const target = e.target;
  68. model.value = adapter.date(target.value);
  69. }
  70. function onClick(e) {
  71. e.preventDefault();
  72. e.stopPropagation();
  73. menu.value = true;
  74. }
  75. function onSave() {
  76. menu.value = false;
  77. }
  78. useRender(() => {
  79. const confirmEditProps = VConfirmEdit.filterProps(props);
  80. const datePickerProps = VDatePicker.filterProps(omit(props, ['active']));
  81. const textFieldProps = VTextField.filterProps(props);
  82. return _createVNode(VTextField, _mergeProps(textFieldProps, {
  83. "class": props.class,
  84. "style": props.style,
  85. "modelValue": display.value,
  86. "onKeydown": isInteractive.value ? onKeydown : undefined,
  87. "focused": menu.value || isFocused.value,
  88. "onFocus": focus,
  89. "onBlur": blur,
  90. "onClick:control": isInteractive.value ? onClick : undefined,
  91. "onClick:prepend": isInteractive.value ? onClick : undefined
  92. }), {
  93. default: () => [_createVNode(VMenu, {
  94. "modelValue": menu.value,
  95. "onUpdate:modelValue": $event => menu.value = $event,
  96. "activator": "parent",
  97. "min-width": "0",
  98. "closeOnContentClick": false,
  99. "openOnClick": false
  100. }, {
  101. default: () => [_createVNode(VConfirmEdit, _mergeProps(confirmEditProps, {
  102. "modelValue": model.value,
  103. "onUpdate:modelValue": $event => model.value = $event,
  104. "onSave": onSave
  105. }), {
  106. default: _ref2 => {
  107. let {
  108. actions,
  109. model: proxyModel
  110. } = _ref2;
  111. return _createVNode(VDatePicker, _mergeProps(datePickerProps, {
  112. "modelValue": props.hideActions ? model.value : proxyModel.value,
  113. "onUpdate:modelValue": val => {
  114. if (!props.hideActions) {
  115. proxyModel.value = val;
  116. } else {
  117. model.value = val;
  118. if (!props.multiple) menu.value = false;
  119. }
  120. },
  121. "onMousedown": e => e.preventDefault()
  122. }), {
  123. actions: !props.hideActions ? actions : undefined
  124. });
  125. }
  126. })]
  127. }), slots.default?.()]
  128. });
  129. });
  130. }
  131. });
  132. //# sourceMappingURL=VDateInput.mjs.map