p-select can be integrated into a form in two ways: controlled or uncontrolled, depending on your needs.value property and change event to
keep it in sync with your application logic. This approach is ideal for complex forms or when using a form library. Note
that the component will still always update its internal value automatically when interacted with.<select>, automatically managing its own
state and including its value in form submissions through the
p-select does not use a native select internally. As a result, it lacks access to native
ValidityState
properties and validationMessage, and it cannot display the native validation popover. This means
validation behavior and error display will need to be implemented separately if required.Form section in the
<!doctype html>
<html lang="en" class="auto">
<head>
<title></title>
</head>
<body class="bg-canvas">
<form class="flex flex-col gap-fluid-sm">
<p-select name="mySelect" label="Some Label" value="a">
<p-select-option value="a">Option A</p-select-option>
<p-select-option value="b">Option B</p-select-option>
<p-select-option value="c">Option C</p-select-option>
<p-select-option value="d">Option D</p-select-option>
<p-select-option value="e">Option E</p-select-option>
<p-select-option value="f">Option F</p-select-option>
</p-select>
<div class="flex gap-fluid-sm">
<p-button type="submit">Submit</p-button>
<p-button type="reset">Reset</p-button>
</div>
<p-text>Last submitted data: </p-text>
</form>
<script>
const debugElement = document.querySelector('p-text');
const form = document.querySelector('form');
form.addEventListener('submit', (e) => {
e.preventDefault();
const formData = new FormData(form);
debugElement.innerText = `Last submitted data: ${formData.get('mySelect') || 'none'}`;
});
</script>
</body>
</html>undefined of the value property. If you want to
give the user the choice to deselect the current option, you can provide an option without a value
<p-select-option></p-select-option>. If you don't want the user to be able to deselect the current option, but still
want to show a placeholder text you can set the option disabled like this
<p-select-option disabled>Please choose an option</p-select-option>.<!doctype html>
<html lang="en" class="auto">
<head>
<title></title>
</head>
<body class="bg-canvas">
<p-checkbox label="Required" id="required" name="required" checked="true"></p-checkbox>
<p-checkbox label="Allow deselection" id="deselection" name="deselection"></p-checkbox>
<form>
<p-select name="options" label="Some Label" required>
<p-select-option value="1">Option 1</p-select-option>
<p-select-option value="2">Option 2</p-select-option>
<p-select-option value="3">Option 3</p-select-option>
</p-select>
<p-button type="submit">Submit</p-button>
</form>
<p-text>Last submitted data: none</p-text>
<script>
const select = document.querySelector('p-select');
const required = document.querySelector('#required');
const deselection = document.querySelector('#deselection');
required.addEventListener('update', (e) => {
select.toggleAttribute('required', e.detail.checked);
});
deselection.addEventListener('update', (e) => {
if (e.detail.checked) {
select.prepend(document.createElement('p-select-option'));
} else {
document.querySelector('p-select-option:not([value])').remove();
}
});
const debugElement = document.querySelector('p-text');
const form = document.querySelector('form');
form.addEventListener('submit', (e) => {
e.preventDefault();
const formData = new FormData(form);
debugElement.innerText = `Last submitted data: ${formData.get('options')}`;
});
</script>
</body>
</html>img tag within the p-select-option. Be aware
that the p-select-option can only contain a #text and an img node.Some description
718
911
taycan
macan
cayenne
panamera<!doctype html>
<html lang="en" class="auto">
<head>
<title></title>
</head>
<body class="bg-canvas">
<p-select name="options" label="Some Label" description="Some description">
<p-select-option value="718">
<img src="assets/718.png" />
718
</p-select-option>
<p-select-option value="911">
<img src="assets/911.png" />
911
</p-select-option>
<p-select-option value="taycan">
<img src="assets/taycan.png" />
taycan
</p-select-option>
<p-select-option value="macan">
<img src="assets/macan.png" />
macan
</p-select-option>
<p-select-option value="cayenne">
<img src="assets/cayenne.png" />
cayenne
</p-select-option>
<p-select-option value="panamera">
<img src="assets/panamera.png" />
panamera
</p-select-option>
</p-select>
<script>
</script>
</body>
</html>p-select component behaves like regular form elements. It updates its value automatically based on user choices,
but can also be changed manually by using the value property. This property takes a string that represent the selected
option value.<!doctype html>
<html lang="en" class="auto">
<head>
<title></title>
</head>
<body class="bg-canvas">
<p-text-field-wrapper label="Value:"><input name="input-value" type="text" placeholder="e.g. 1" /></p-text-field-wrapper>
<p-button id="btn-input-value" type="button" compact="true">Set Value</p-button>
<p-button id="btn-reset" type="button" compact="true">Reset value</p-button>
<p-select name="options" label="Some Label" value="1">
<p-select-option value="1">Option 1</p-select-option>
<p-select-option value="2">Option 2</p-select-option>
<p-select-option value="3">Option 3</p-select-option>
</p-select>
<p-button id="btn-add" type="button" compact="true">Add option</p-button>
<p-button id="btn-remove" type="button" compact="true">Remove last option</p-button>
<script>
const input = document.querySelector('input');
const select = document.querySelector('p-select');
select.addEventListener('change', (e) => {
input.value = select.value;
});
document.querySelector('#btn-input-value').addEventListener('click', () => {
select.value = input.value;
});
document.querySelector('#btn-reset').addEventListener('click', () => {
input.value = '';
select.value = '1';
});
document.querySelector('#btn-add').addEventListener('click', () => {
addOption();
});
document.querySelector('#btn-remove').addEventListener('click', () => {
if (select.children.length > 0) {
select.lastChild.remove();
}
});
function addOption() {
const child = document.createElement('p-select-option');
child.innerText = `Option ${select.children.length + 1}`;
child.setAttribute('value', `${select.children.length + 1}`);
select.append(child);
}
</script>
</body>
</html>Some description
Some optgroup label 1
Some optgroup label 2
<!doctype html>
<html lang="en" class="auto">
<head>
<title></title>
</head>
<body class="bg-canvas">
<p-select name="options" label="Some Label" description="Some description">
<p-optgroup label="Some optgroup label 1">
<p-select-option value="a">
Option A
</p-select-option>
<p-select-option value="b">
Option B
</p-select-option>
<p-select-option value="c">
Option C
</p-select-option>
<p-select-option value="d">
Option D
</p-select-option>
<p-select-option value="e">
Option E
</p-select-option>
<p-select-option value="f">
Option F
</p-select-option>
</p-optgroup>
<p-optgroup label="Some optgroup label 2">
<p-select-option value="g">
Option G
</p-select-option>
<p-select-option value="h">
Option H
</p-select-option>
<p-select-option value="i">
Option I
</p-select-option>
</p-optgroup>
</p-select>
<script>
</script>
</body>
</html>