Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/LiveComponent/assets/dist/live_controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -377,7 +377,7 @@ function getValueFromElement(element, valueStore) {
}
return element.value;
}
if (element.dataset.value) {
if (element.hasAttribute("data-value")) {
return element.dataset.value;
}
if ("value" in element) {
Expand Down
2 changes: 1 addition & 1 deletion src/LiveComponent/assets/src/dom_utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ export function getValueFromElement(element: HTMLElement, valueStore: ValueStore
}

// element is some other element
if (element.dataset.value) {
if (element.hasAttribute('data-value')) {
return element.dataset.value;
}

Expand Down
34 changes: 34 additions & 0 deletions src/LiveComponent/assets/test/unit/dom_utils.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,40 @@ describe('getValueFromElement', () => {

expect(getValueFromElement(div, createStore())).toEqual('the_value_from_attribute');
});

it('Returns empty string for data-value=""', () => {
const btn = document.createElement('button');
// simulate the attribute explicitly present but empty
btn.dataset.value = '';
// also set a value on the button to ensure data-value takes precedence
btn.value = 'should_not_be_used';
expect(getValueFromElement(btn, createStore())).toBe('');
});

it('Returns "0" for data-value="0" (falsy but valid)', () => {
const el = document.createElement('div');
el.dataset.value = '0';
expect(getValueFromElement(el, createStore())).toBe('0');
});

it('Prefers data-value over value attribute when both are present', () => {
const el = document.createElement('div');
el.dataset.value = 'from_data_value';
el.setAttribute('value', 'from_value_attribute');
expect(getValueFromElement(el, createStore())).toBe('from_data_value');
});

it('Falls back to value attribute when data-value is absent', () => {
const el = document.createElement('div');
el.setAttribute('value', '');
// No data-value set
expect(getValueFromElement(el, createStore())).toBe('');
});

it('Returns null when neither data-value nor value attribute nor value property is present', () => {
const el = document.createElement('div');
expect(getValueFromElement(el, createStore())).toBe(null);
});
});

describe('setValueOnElement', () => {
Expand Down
Loading