Skip to content

Commit 1fb582e

Browse files
committed
refactor: boolean HTML attributes are removed from DOM when the value is false (resolves #1191)
1 parent e8db1a8 commit 1fb582e

File tree

9 files changed

+47
-18
lines changed

9 files changed

+47
-18
lines changed

src/VueDatePicker/components/ActionRow.vue

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,12 @@
1212
/>
1313
</template>
1414
<template v-else>
15-
<div v-if="actionRow.showPreview" class="dp__selection_preview" :title="formatValue" :style="previewStyle">
15+
<div
16+
v-if="actionRow.showPreview"
17+
class="dp__selection_preview"
18+
:title="formatValue || undefined"
19+
:style="previewStyle"
20+
>
1621
<slot v-if="$slots['action-preview'] && showPreview" name="action-preview" :value="modelValue" />
1722
<template v-if="!$slots['action-preview'] && showPreview">
1823
{{ formatValue }}
@@ -45,7 +50,7 @@
4550
ref="select-btn"
4651
type="button"
4752
class="dp__action_button dp__action_select"
48-
:disabled="disabled"
53+
:disabled="boolHtmlAttribute(disabled)"
4954
data-test-id="select-button"
5055
@keydown="checkKeyDown($event, () => selectDate())"
5156
@click="selectDate"
@@ -62,7 +67,7 @@
6267
import { computed, onUnmounted, onMounted, ref, useTemplateRef } from 'vue';
6368
import { unrefElement } from '@vueuse/core';
6469
65-
import { useArrowNavigation, useContext, useFormatter, useHelperFns, useValidation } from '@/composables';
70+
import { useArrowNavigation, useContext, useFormatter, useHelperFns, useValidation, useUtils } from '@/composables';
6671
6772
interface ActionRowEmits {
6873
'close-picker': [];
@@ -93,6 +98,7 @@
9398
const { buildMatrix } = useArrowNavigation();
9499
const { formatPreview } = useFormatter();
95100
const { checkKeyDown, convertType } = useHelperFns();
101+
const { boolHtmlAttribute } = useUtils();
96102
97103
const cancelButtonRef = useTemplateRef('cancel-btn');
98104
const selectButtonRef = useTemplateRef('select-btn');

src/VueDatePicker/components/Common/ArrowBtn.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
defineProps<{
3131
ariaLabel?: string;
3232
elName?: string;
33-
disabled: boolean;
33+
disabled?: boolean;
3434
}>();
3535
3636
const elRef = useTemplateRef('arrow-btn');

src/VueDatePicker/components/DatePicker/DpHeader.vue

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
<ArrowBtn
2626
v-if="showLeftIcon(instance) && !rootProps.vertical"
2727
:aria-label="ariaLabels?.prevMonth"
28-
:disabled="isDisabled(false)"
28+
:disabled="boolHtmlAttribute(isDisabled(false))"
2929
:class="ui?.navBtnPrev"
3030
el-name="action-prev"
3131
@activate="handleMonthYearChange(false, true)"
@@ -94,7 +94,7 @@
9494
v-if="showLeftIcon(instance) && rootProps.vertical"
9595
:aria-label="ariaLabels?.prevMonth"
9696
el-name="action-prev"
97-
:disabled="isDisabled(false)"
97+
:disabled="boolHtmlAttribute(isDisabled(false))"
9898
:class="ui?.navBtnPrev"
9999
@activate="handleMonthYearChange(false, true)"
100100
>
@@ -105,7 +105,7 @@
105105
v-if="showRightIcon(instance)"
106106
ref="rightIcon"
107107
el-name="action-next"
108-
:disabled="isDisabled(true)"
108+
:disabled="boolHtmlAttribute(isDisabled(true))"
109109
:aria-label="ariaLabels?.nextMonth"
110110
:class="ui?.navBtnNext"
111111
@activate="handleMonthYearChange(true, true)"
@@ -147,6 +147,7 @@
147147
useContext,
148148
useFormatter,
149149
useValidation,
150+
useUtils,
150151
} from '@/composables';
151152
import { useMonthYearPick } from '@/components/shared/useMonthYearPick.ts';
152153
import { useNavigationDisplay } from '@/components/shared/useNavigationDisplay.ts';
@@ -187,6 +188,7 @@
187188
const { checkKeyDown } = useHelperFns();
188189
const { formatYear } = useFormatter();
189190
const { checkMinMaxValue } = useValidation();
191+
const { boolHtmlAttribute } = useUtils();
190192
191193
const showMonthPicker = ref(false);
192194
const showYearPicker = ref(false);

src/VueDatePicker/components/DatePickerInput/DatepickerInput.vue

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,9 @@
2828
:class="inputClass"
2929
:inputmode="inputAttrs.inputmode"
3030
:placeholder="rootProps.placeholder"
31-
:disabled="rootProps.disabled"
32-
:readonly="rootProps.readonly"
33-
:required="inputAttrs.required"
31+
:disabled="boolHtmlAttribute(rootProps.disabled)"
32+
:readonly="boolHtmlAttribute(rootProps.readonly)"
33+
:required="boolHtmlAttribute(inputAttrs.required)"
3434
:value="inputValue"
3535
:autocomplete="inputAttrs.autocomplete"
3636
:aria-label="ariaLabels.input"
@@ -92,7 +92,7 @@
9292
9393
import { CalendarIcon, CancelIcon } from '@/components/Icons';
9494
95-
import { useContext, useHelperFns, useValidation } from '@/composables';
95+
import { useContext, useHelperFns, useValidation, useUtils } from '@/composables';
9696
import { useInput } from '@/components/DatePickerInput/useInput.ts';
9797
9898
import { EventKey } from '@/constants';
@@ -124,6 +124,7 @@
124124
const { checkMinMaxRange, isValidDate } = useValidation();
125125
const { parseFreeInput, textPasted, createMaskedValue, applyMaxValues } = useInput();
126126
const { checkKeyDown, checkStopPropagation } = useHelperFns();
127+
const { boolHtmlAttribute } = useUtils();
127128
128129
const inputRef = useTemplateRef('dp-input');
129130
const parsedDate = ref<InputParsedDate>(null);

src/VueDatePicker/components/QuarterPicker/QuarterPicker.vue

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
'dp--highlighted': quarter.highlighted,
3232
}"
3333
:data-test-id="quarter.value"
34-
:disabled="quarter.disabled"
34+
:disabled="boolHtmlAttribute(quarter.disabled)"
3535
@click="selectQuarter(quarter.value, instance, quarter.disabled)"
3636
@mouseover="setHoverDate(quarter.value)"
3737
>
@@ -56,7 +56,7 @@
5656
import YearModePicker from '@/components/shared/YearModePicker.vue';
5757
5858
import { type QuarterPickerEmits, useQuarterPicker } from '@/components/QuarterPicker/useQuarterPicker.ts';
59-
import { useContext, useSlotsMapper } from '@/composables';
59+
import { useContext, useSlotsMapper, useUtils } from '@/composables';
6060
import type { BaseProps } from '@/types';
6161
6262
const emit = defineEmits<QuarterPickerEmits>();
@@ -67,6 +67,7 @@
6767
} = useContext();
6868
const slots = useSlots();
6969
const { mapSlots } = useSlotsMapper();
70+
const { boolHtmlAttribute } = useUtils();
7071
7172
const yearModeSlots = mapSlots(slots, 'yearMode');
7273

src/VueDatePicker/components/TimePicker/TimeInput.vue

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@
5656
'dp--time-overlay-btn': !disabledBox(timeInput.type),
5757
'dp--hidden-el': timeOverlayOpen,
5858
}"
59-
:disabled="checkOverlayDisabled(timeInput.type)"
59+
:disabled="boolHtmlAttribute(checkOverlayDisabled(timeInput.type))"
6060
tabindex="0"
6161
:data-test-id="`${timeInput.type}-toggle-overlay-btn-${props.order}`"
6262
@keydown="checkKeyDown($event, () => toggleOverlay(timeInput.type), true)"
@@ -177,7 +177,14 @@
177177
import { ChevronUpIcon, ChevronDownIcon, ClockIcon, CalendarIcon } from '@/components/Icons';
178178
import SelectionOverlay from '@/components/Common/SelectionOverlay.vue';
179179
180-
import { useTransitions, useArrowNavigation, useContext, useHelperFns, useDateUtils } from '@/composables';
180+
import {
181+
useTransitions,
182+
useArrowNavigation,
183+
useContext,
184+
useHelperFns,
185+
useDateUtils,
186+
useUtils,
187+
} from '@/composables';
181188
import type {
182189
DynamicClass,
183190
Hour12,
@@ -224,6 +231,7 @@
224231
defaults: { ariaLabels, filters, config, range, multiCalendars, timeConfig },
225232
} = useContext();
226233
const { checkKeyDown, hoursToAmPmHours } = useHelperFns();
234+
const { boolHtmlAttribute } = useUtils();
227235
228236
const { sanitizeTime, groupListAndMap } = useDateUtils();
229237
const { transitionName, showTransition } = useTransitions();

src/VueDatePicker/components/shared/YearModePicker.vue

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
v-if="showLeftIcon(instance)"
55
ref="mpPrevIconRef"
66
:aria-label="ariaLabels?.prevYear"
7-
:disabled="isDisabled(false)"
7+
:disabled="boolHtmlAttribute(isDisabled(false))"
88
:class="ui?.navBtnPrev"
99
@activate="handleYear(false)"
1010
>
@@ -27,7 +27,7 @@
2727
v-if="showRightIcon(instance)"
2828
ref="mpNextIconRef"
2929
:aria-label="ariaLabels?.nextYear"
30-
:disabled="isDisabled(true)"
30+
:disabled="boolHtmlAttribute(isDisabled(true))"
3131
:class="ui?.navBtnNext"
3232
@activate="handleYear(true)"
3333
>
@@ -64,7 +64,7 @@
6464
import ArrowBtn from '@/components/Common/ArrowBtn.vue';
6565
import { CalendarIcon, ChevronLeftIcon, ChevronRightIcon } from '@/components/Icons';
6666
67-
import { useContext, useFormatter, useTransitions } from '@/composables';
67+
import { useContext, useFormatter, useTransitions, useUtils } from '@/composables';
6868
import { useNavigationDisplay } from '@/components/shared/useNavigationDisplay.ts';
6969
7070
import type { OverlayGridItem } from '@/types';
@@ -94,6 +94,7 @@
9494
} = useContext();
9595
const { showTransition, transitionName } = useTransitions();
9696
const { formatYear } = useFormatter();
97+
const { boolHtmlAttribute } = useUtils();
9798
9899
const overlayOpen = ref(false);
99100

src/VueDatePicker/composables/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,4 @@ export { useFormatter } from './useFormatter.ts';
1414
export { useUtilsWithContext } from './useUtilsWithContext.ts';
1515
export { useExposed } from './useExposed.ts';
1616
export { useHelperFns } from './useHelperFns.ts';
17+
export { useUtils } from './useUtils.ts';
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
export const useUtils = () => {
2+
const boolHtmlAttribute = (value: boolean | undefined) => {
3+
return value ? true : undefined;
4+
};
5+
6+
return {
7+
boolHtmlAttribute,
8+
};
9+
};

0 commit comments

Comments
 (0)