mirror of
https://github.com/Choices-js/Choices.git
synced 2024-05-03 14:23:12 +02:00
feat: implemented improved additional choices
This commit is contained in:
parent
4df9e31c09
commit
80a95b21f1
|
@ -295,6 +295,13 @@ Pass an array of objects:
|
|||
}]
|
||||
```
|
||||
|
||||
### choicesContainer
|
||||
|
||||
You can't place HTML directly inside option or select tags.
|
||||
This is a security feature, as it prevents XSS (cross-site scripting) attacks.
|
||||
If you want to do it regardless, you can set `allowHTML` to `true`, and set the choicesContainer to a valid query selector string or html element.
|
||||
The children of the `choicesContainer` will be used instead of the option tags inside the select.
|
||||
|
||||
### renderChoiceLimit
|
||||
|
||||
**Type:** `Number` **Default:** `-1`
|
||||
|
|
|
@ -346,26 +346,30 @@ var Choices = /** @class */function () {
|
|||
* data-choices-container
|
||||
* is the attribute that defines the id of the additional option container
|
||||
*/
|
||||
var additionalOptionContainer = this.passedElement.element.getAttribute('data-choices-container');
|
||||
if (additionalOptionContainer) {
|
||||
var optionContainer_1 = document.getElementById(additionalOptionContainer);
|
||||
if (optionContainer_1) {
|
||||
Array.from(optionContainer_1.children).forEach(function (option) {
|
||||
var value = option.getAttribute("value") || "";
|
||||
_this._presetChoices.push({
|
||||
value: value,
|
||||
label: option.innerHTML.trim(),
|
||||
selected: option.hasAttribute("selected"),
|
||||
disabled: option.hasAttribute("disabled") || optionContainer_1.hasAttribute("disabled"),
|
||||
placeholder: value === '' || option.hasAttribute('placeholder'),
|
||||
customProperties: (0, utils_1.parseCustomProperties)(option.dataset.customProperties)
|
||||
});
|
||||
});
|
||||
optionContainer_1.remove();
|
||||
var choicesContainer = null;
|
||||
var choiceContainerQuery = this.passedElement.element.dataset.choicesContainer || userConfig.choicesContainer;
|
||||
if (choiceContainerQuery) {
|
||||
if (choiceContainerQuery instanceof HTMLElement) {
|
||||
choicesContainer = choiceContainerQuery;
|
||||
} else {
|
||||
console.warn("Could not find a container with id of ".concat(additionalOptionContainer, ", that is defined in the data-choices-container attribute"));
|
||||
choicesContainer = this.passedElement.element.closest(choiceContainerQuery) || document.getElementById(choiceContainerQuery) || document.querySelector(choiceContainerQuery);
|
||||
}
|
||||
}
|
||||
if (choicesContainer) {
|
||||
var disableAll_1 = choicesContainer.hasAttribute("disabled");
|
||||
Array.from(choicesContainer.children).forEach(function (option) {
|
||||
var value = option.getAttribute("value") || "";
|
||||
_this._presetChoices.push({
|
||||
value: value,
|
||||
label: option.innerHTML.trim(),
|
||||
selected: option.hasAttribute("selected"),
|
||||
disabled: option.hasAttribute("disabled") || disableAll_1,
|
||||
placeholder: value === '' || option.hasAttribute('placeholder'),
|
||||
customProperties: (0, utils_1.parseCustomProperties)(option.dataset.customProperties)
|
||||
});
|
||||
});
|
||||
choicesContainer.remove();
|
||||
}
|
||||
this._render = this._render.bind(this);
|
||||
this._onFocus = this._onFocus.bind(this);
|
||||
this._onBlur = this._onBlur.bind(this);
|
||||
|
@ -2900,6 +2904,7 @@ exports.DEFAULT_CLASSNAMES = {
|
|||
exports.DEFAULT_CONFIG = {
|
||||
items: [],
|
||||
choices: [],
|
||||
choicesContainer: null,
|
||||
silent: false,
|
||||
renderChoiceLimit: -1,
|
||||
maxItemCount: -1,
|
||||
|
|
2
public/assets/scripts/choices.min.js
vendored
2
public/assets/scripts/choices.min.js
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -1 +1 @@
|
|||
{"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../../../src/scripts/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAG/C,eAAO,MAAM,kBAAkB,EAAE,UA2BhC,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,OA+C5B,CAAC"}
|
||||
{"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../../../src/scripts/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAG/C,eAAO,MAAM,kBAAkB,EAAE,UA2BhC,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,OAgD5B,CAAC"}
|
|
@ -80,6 +80,13 @@ export interface Options {
|
|||
* @default []
|
||||
*/
|
||||
choices: Choice[];
|
||||
/**
|
||||
* You can't place HTML directly inside option or select tags.
|
||||
* This is a security feature, as it prevents XSS (cross-site scripting) attacks.
|
||||
* If you want to do it regardless, you can set `allowHTML` to `true`, and set the choicesContainer to a valid query selector string or html element.
|
||||
* The children of the `choicesContainer` will be used instead of the option tags inside the select.
|
||||
*/
|
||||
choicesContainer: HTMLElement | string | null;
|
||||
/**
|
||||
* The amount of choices to be rendered within the dropdown list `("-1" indicates no limit)`. This is useful if you have a lot of choices where it is easier for a user to use the search area to find a choice.
|
||||
*
|
||||
|
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../../../../src/scripts/interfaces/options.ts"],"names":[],"mappings":"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"}
|
||||
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../../../../src/scripts/interfaces/options.ts"],"names":[],"mappings":"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"}
|
|
@ -312,33 +312,36 @@ class Choices implements Choices {
|
|||
* is the attribute that defines the id of the additional option container
|
||||
*/
|
||||
|
||||
const additionalOptionContainer = this.passedElement.element.getAttribute('data-choices-container');
|
||||
let choicesContainer: null | HTMLElement = null;
|
||||
|
||||
if (additionalOptionContainer) {
|
||||
const optionContainer = document.getElementById(additionalOptionContainer);
|
||||
|
||||
if (optionContainer) {
|
||||
Array.from(optionContainer.children).forEach((option: HTMLElement) => {
|
||||
let value = option.getAttribute("value") || "";
|
||||
|
||||
this._presetChoices.push({
|
||||
value: value,
|
||||
label: option.innerHTML.trim(),
|
||||
selected: option.hasAttribute("selected"),
|
||||
disabled: option.hasAttribute("disabled") || optionContainer.hasAttribute("disabled"),
|
||||
placeholder: value === '' || option.hasAttribute('placeholder'),
|
||||
customProperties: parseCustomProperties(option.dataset.customProperties),
|
||||
});
|
||||
});
|
||||
|
||||
optionContainer.remove();
|
||||
let choiceContainerQuery = this.passedElement.element.dataset.choicesContainer || userConfig.choicesContainer;
|
||||
if (choiceContainerQuery) {
|
||||
if (choiceContainerQuery instanceof HTMLElement) {
|
||||
choicesContainer = choiceContainerQuery;
|
||||
} else {
|
||||
console.warn(
|
||||
`Could not find a container with id of ${additionalOptionContainer}, that is defined in the data-choices-container attribute`,
|
||||
);
|
||||
choicesContainer = this.passedElement.element.closest(choiceContainerQuery) || document.getElementById(choiceContainerQuery) || document.querySelector(choiceContainerQuery);
|
||||
}
|
||||
}
|
||||
|
||||
if (choicesContainer ) {
|
||||
const disableAll = choicesContainer.hasAttribute("disabled");
|
||||
|
||||
Array.from(choicesContainer.children).forEach((option: HTMLElement) => {
|
||||
let value = option.getAttribute("value") || "";
|
||||
|
||||
this._presetChoices.push({
|
||||
value: value,
|
||||
label: option.innerHTML.trim(),
|
||||
selected: option.hasAttribute("selected"),
|
||||
disabled: option.hasAttribute("disabled") || disableAll,
|
||||
placeholder: value === '' || option.hasAttribute('placeholder'),
|
||||
customProperties: parseCustomProperties(option.dataset.customProperties),
|
||||
});
|
||||
});
|
||||
|
||||
choicesContainer.remove();
|
||||
}
|
||||
|
||||
this._render = this._render.bind(this);
|
||||
this._onFocus = this._onFocus.bind(this);
|
||||
this._onBlur = this._onBlur.bind(this);
|
||||
|
|
|
@ -34,6 +34,7 @@ export const DEFAULT_CLASSNAMES: ClassNames = {
|
|||
export const DEFAULT_CONFIG: Options = {
|
||||
items: [],
|
||||
choices: [],
|
||||
choicesContainer: null,
|
||||
silent: false,
|
||||
renderChoiceLimit: -1,
|
||||
maxItemCount: -1,
|
||||
|
|
|
@ -84,6 +84,14 @@ export interface Options {
|
|||
*/
|
||||
choices: Choice[];
|
||||
|
||||
/**
|
||||
* You can't place HTML directly inside option or select tags.
|
||||
* This is a security feature, as it prevents XSS (cross-site scripting) attacks.
|
||||
* If you want to do it regardless, you can set `allowHTML` to `true`, and set the choicesContainer to a valid query selector string or html element.
|
||||
* The children of the `choicesContainer` will be used instead of the option tags inside the select.
|
||||
*/
|
||||
choicesContainer: HTMLElement | string | null;
|
||||
|
||||
/**
|
||||
* The amount of choices to be rendered within the dropdown list `("-1" indicates no limit)`. This is useful if you have a lot of choices where it is easier for a user to use the search area to find a choice.
|
||||
*
|
||||
|
|
Loading…
Reference in a new issue