diff --git a/documentation/%D0%9A%D0%BE%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D0%BE%D1%80%20%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0%20DropDown.html b/documentation/%D0%9A%D0%BE%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D0%BE%D1%80%20%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0%20DropDown.html
index 3f3f9f3..4bf47c8 100644
--- a/documentation/%D0%9A%D0%BE%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D0%BE%D1%80%20%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0%20DropDown.html
+++ b/documentation/%D0%9A%D0%BE%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D0%BE%D1%80%20%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0%20DropDown.html
@@ -6,11 +6,13 @@
+
+
@@ -77,10 +79,14 @@
Example
options = {
- selector: 'Уникальный селектор',
+ selector: 'Уникальный селектор',
selected: 'Выбранный элемент',
placeholder: '...',
items: [string|number|object],
+ darkTheme: true/false,
+ searchMode: true/false,
+ closeOnSelect: true/false,
+ lenguage: 'ru/en',
styles: {
head: {
background: '...',
@@ -89,6 +95,7 @@
chips: {...},
caret: {...},
placeholder: {...},
+ lable: {..},
},
event: '...',
url: 'http/...',
@@ -97,6 +104,79 @@
}
+
+ Описание всех параметров селекта
+
+
+
+ selector - *обязательный параметр(индефикатор) ,
+ который задаеться при создании селекта.
+
+
+ selected - необязательный параметр, в который передается элемент
+ который будет выбран изначально в селекте.
+
+
+ placeholder - необязательный параметр, в который передается текст
+ плейсхолдера селекта.
+
+
+ items -
+ *обязательный параметр(эсли не указан другой способ получения данных (url)) , это массив елементов, которые будут отображаться в селекте при выборе.
+
+
+ darkTheme - необязательный параметр, который отвечает за включение
+ светлой/темной темы по умолчанию, стоит темная тема(darkTheme == true).
+
+
+ searchMode - необязательный параметр, который добавляет живой поиск
+ по элеметам селекта.
+
+
+ closeOnSelect - необязательный параметр, который отвечает за
+ поведения селекта при открытии, если closeOnSelect: false, тогда при выборе елемента в
+ селекте закрытия не происходит, и можно выбрать другой элемент по умолчанию,
+ closeOnSelect:true.
+
+
+
+ lenguage - необязательный параметр, отвечающий за локализацию
+ некоторых текстовых элементов. по умолчанию стоит 'en'. Можно добавить свою
+ локализацию, с помощью функции addLanguage() ,
+ передав туда объект с полями для текста.
+
+
+ event - необязательный параметр, который отвечает за поведения
+ селекта, передавая в этот параметр, евент по типу 'mouseenter', селект будет
+ открываться при наведении.
+
+
+ url -
+ *обязательный параметр(эсли не указан другой способ получения данных
+ (items)),
+ htylthbn данные которые приходят с бекэнда в формате {id:"", title: "", value: ""}.
+
+
+ multiselect - необязательный параметр, который отвечает за поведения
+ селекта, добавляет возможность выбирать несколько элементов. Выбранные элементы
+ отрисовываются как обычный текст, через запятую.
+
+
+ multiselectTag - необязательный параметр, который отвечает за
+ поведения селекта, для него,
+ ***работает только в месте с подключением multiselect.
+
+
+ styles - необязательный параметр, который отвечает за кастомизацию
+ элементов селекта, в него передаются обьекты с CSS свойствами для кастомизируемых
+ элементов.
+
+
+
@@ -121,6 +201,8 @@
Public methods
+ addLenguage
addItem
buttonControl
deleteItem
diff --git a/documentation/DropDown.html b/documentation/DropDown.html
index b178481..6c4b60a 100644
--- a/documentation/DropDown.html
+++ b/documentation/DropDown.html
@@ -22,7 +22,7 @@
DropDown() (options)
@@ -34,7 +34,8 @@
Constructor
- new DropDown() new DropDown(options)
@@ -62,13 +63,6 @@
- Classes
-
-
- DropDown
-
-
-
Members
@@ -131,6 +125,8 @@
Public methods
+ addLenguage
addItem
buttonControl
deleteItem
diff --git a/documentation/cg-dropdown.js.html b/documentation/cg-dropdown.js.html
index 4142af4..4b7f4dc 100644
--- a/documentation/cg-dropdown.js.html
+++ b/documentation/cg-dropdown.js.html
@@ -23,9 +23,11 @@
createSelected,
customStyles,
getFormatItem,
+ getSelectText,
customStylesFormat,
nativOptionMultiple,
nativOptionOrdinary,
+ clearSelect,
} from './components/utils';
import {
createBreadcrumb,
@@ -33,6 +35,7 @@
createNativSelectOption,
createNativeSelect,
} from './components/create-element';
+ import { ru, en } from './language/language';
/**
* @class Описание класса DropDown
@@ -110,6 +113,10 @@
selected: 'Выбранный элемент',
placeholder: '...',
items: [string|number|object],
+ darkTheme: true/false,
+ searchMode: true/false,
+ closeOnSelect: true/false,
+ lenguage: 'ru/en',
styles: {
head: {
background: '...',
@@ -118,6 +125,7 @@
chips: {...},
caret: {...},
placeholder: {...},
+ lable: {..},
},
event: '...',
url: 'http/...',
@@ -130,6 +138,7 @@
this.#init(options);
this.#render();
this.#initEvent();
+ this.#closeSelectClick();
}
/**
@@ -246,6 +255,7 @@
* @method buttonControl
*/
buttonControl(button, method) {
+ this.btn = button;
button.addEventListener('click', () => {
if (method === 'open') {
this.#open(true);
@@ -257,6 +267,29 @@
});
}
+ /**
+ * Метод экземпляра класса DropDown
+ * @param {object} lenguage объект в котором находятся поля для подключения языка имеет два обязательных поля placeholder, textInListSearch
+ * @description метод позволяющий заменить плейсхолдер в поиске и текст который выводится если нет результата
+ * @method addLenguage
+ */
+ addLenguage(lenguage) {
+ const { placeholder, textInListSearch } = lenguage;
+ const { searchMode } = this.#options;
+
+ if (searchMode && searchMode == true) {
+ const search = this.#element.querySelector('.inputSearch');
+ const textNoRezult = this.#element.querySelector('.noRezult');
+ const textNode = document.createTextNode(textInListSearch);
+
+ search.setAttribute('placeholder', placeholder);
+ search.setAttribute('placeholder', placeholder);
+
+ textNoRezult.innerText = '';
+ textNoRezult.appendChild(textNode);
+ }
+ }
+
/**
* Приватный метод инициализации экземпляра класса DropDown
* @method #init
@@ -279,6 +312,7 @@
'MAN',
'max',
],
+ darkTheme: true,
multiselect: true,
multiselectTag: true,
}
@@ -295,13 +329,14 @@
this.#element = elem;
- this.#element.addEventListener('click', () => {
+ this.#element.addEventListener('click', (e) => {
+ e.preventDefault();
this.#open();
});
this.#items = [];
- if (multiselect) {
+ if (multiselect && multiselect == true) {
this.#selectedItems = [];
}
@@ -333,7 +368,7 @@
* @protected
*/
#initSelected(select) {
- const { styles, selected, placeholder } = this.#options;
+ const { styles, selected, placeholder, lable } = this.#options;
if (selected) {
createSelected(this.#element, selected);
@@ -343,13 +378,23 @@
createSelected(this.#element, 'Select...');
}
- if (styles) {
- customStyles(this.#element, styles);
- }
-
if (select) {
createSelected(this.#element, select, styles);
}
+
+ if (lable) {
+ const lableItem = document.createElement('h1');
+ const textLable = document.createTextNode(lable);
+
+ lableItem.appendChild(textLable);
+ lableItem.classList.add('label');
+
+ this.#element.insertAdjacentElement('beforebegin', lableItem);
+ }
+
+ if (styles) {
+ customStyles(this.#element, styles);
+ }
}
/**
@@ -360,7 +405,7 @@
* @description Рендер елементов в селекте.
*/
#render(select) {
- const { styles, multiselect, searchMode } = this.#options;
+ const { styles, multiselect, searchMode, multiselectTag, darkTheme, lenguage } = this.#options;
const random = Math.random().toString(36).substring(2, 10);
if (select || (select && styles)) {
@@ -371,16 +416,23 @@
}
const ulList = document.createElement('ul');
- const intputSearch = createInputSearch(random);
- this.random = random;
-
const nativSelect = createNativeSelect();
- ulList.classList.add('list');
+ let intputSearch = '';
+ this.random = random;
+
if (searchMode) {
+ if (lenguage === 'ru') {
+ intputSearch = createInputSearch(random, ru.placeholder);
+ } else {
+ intputSearch = createInputSearch(random, en.placeholder);
+ }
+
ulList.appendChild(intputSearch);
}
+ ulList.classList.add('list');
+
if (styles) {
const { list } = styles;
customStylesFormat(list, ulList);
@@ -398,12 +450,16 @@
liItem.classList.add('list__item');
strongItem.classList.add('category');
- if (multiselect) {
+ if (multiselect && multiselect == true) {
const checkBox = document.createElement('input');
checkBox.type = 'checkbox';
checkBox.setAttribute('id', `chbox-${dataItem.id}`);
-
liItem.appendChild(checkBox);
+
+ if (multiselectTag && multiselectTag == true) {
+ checkBox.classList.add('displayHide');
+ }
+
nativSelect.setAttribute('multiple', 'multiple');
}
@@ -431,9 +487,45 @@
return item;
});
+ if (darkTheme == false) {
+ this.#checkTheme();
+ }
+
+ this.#list = this.#element.querySelector('.list');
+ this.#caret = this.#element.querySelector('.caret');
+
this.#addOptionsBehaviour();
}
+ /**
+ * Приватный метод рендера экземпляра класса DropDown
+ * @protected
+ * @method #checkTheme
+ * @description Изменяет цветовую схему с темной на светлую.
+ */
+ #checkTheme() {
+ const { darkTheme, searchMode } = this.#options;
+
+ const select = this.#element.querySelector('.cg-select');
+ const caret = this.#element.querySelector('.caret');
+ const list = this.#element.querySelector('ul.list');
+ const search = this.#element.querySelector('.inputSearch');
+
+ if (darkTheme == false) {
+ select.classList.add('selectWhite');
+ caret.classList.add('caretWhite');
+ list.classList.add('listWhite');
+
+ if (searchMode == true) {
+ search.classList.add('inputWhite');
+ }
+ } else if (darkTheme == true || !darkTheme) {
+ return;
+ } else {
+ throw new Error('Styles error or invalid value entered!');
+ }
+ }
+
/**
* Приватный метод рендера экземпляра класса DropDown
*@protected
@@ -441,7 +533,7 @@
* @description Рендер елементов в селекте переданных с URL и их настойка
*/
async #renderUrl() {
- const { url, items, multiselect } = this.#options;
+ const { url, items, multiselect, multiselectTag } = this.#options;
if (items) {
return;
@@ -468,9 +560,12 @@
const liUrl = document.createElement('li');
const textUrl = document.createTextNode(item.title);
- if (multiselect) {
+ if (multiselect && multiselect == true) {
const checkBox = document.createElement('input');
checkBox.type = 'checkbox';
+ if (multiselectTag && multiselectTag == true) {
+ checkBox.classList.add('displayHide');
+ }
checkBox.setAttribute('id', `chbox-${item.id}`);
nativSelect.setAttribute('multiple', 'multiple');
@@ -509,9 +604,6 @@
* @method #open
*/
#open(oneClick) {
- this.#list = this.#element.querySelector('.list');
- this.#caret = this.#element.querySelector('.caret');
-
if (oneClick === true) {
this.#list.classList.add('open');
this.#caret.classList.add('caret_rotate');
@@ -539,14 +631,23 @@
* @method #addOptionsBehaviour
*/
#addOptionsBehaviour() {
- const { multiselect, placeholder, selected, multiselectTag, searchMode } = this.#options;
+ const {
+ multiselect,
+ placeholder,
+ selected,
+ multiselectTag,
+ searchMode,
+ closeOnSelect,
+ darkTheme,
+ } = this.#options;
const options = this.#element.querySelectorAll('.list__item');
const select = this.#element.querySelector('.selected');
const nativOption = this.#element.querySelectorAll('.nativSelect__nativOption');
+
const ulMultipul = document.createElement('ul');
- if (multiselect) {
+ if (multiselect && multiselect == true) {
ulMultipul.classList.add('multiselect-tag');
select.classList.add('overflow-hidden');
}
@@ -557,12 +658,26 @@
options.forEach((option, index) => {
option.addEventListener('click', (event) => {
+ const dataSelectText = {
+ placeholder,
+ selected,
+ selectedItems: this.#selectedItems,
+ indexes: this.#indexes,
+ darkTheme,
+ multiselectTag,
+ };
+
const item = this.#items[index];
- if (multiselect) {
+ if (closeOnSelect == false || (multiselect && multiselect == true)) {
event.stopPropagation();
- option.classList.toggle('active');
+ event.preventDefault();
+ }
+ const checkIndex = this.#indexes.indexOf(index);
+
+ if (multiselect && multiselect == true) {
+ option.classList.toggle('active');
const checkBox = option.querySelector('input[type="checkbox"]');
if (checkBox) {
@@ -570,16 +685,12 @@
checkBox.checked = !checkBox.checked;
}
- const checkIndex = this.#indexes.indexOf(index);
-
if (checkIndex === -1) {
nativOptionMultiple(nativOption, item.title, true);
-
this.#indexes.push(index);
-
select.innerText = '';
- if (multiselectTag) {
+ if (multiselectTag && multiselectTag == true) {
this.#selectedItems.push(item);
select.appendChild(ulMultipul);
@@ -596,25 +707,20 @@
select.innerText = this.#selectedItems;
}
} else {
- if (multiselectTag) {
+ if (multiselectTag && multiselectTag == true) {
const tagItem = document.getElementById(`tag-${index}-${item.id}`);
ulMultipul.removeChild(tagItem);
}
+
this.#indexes.splice(checkIndex, 1);
this.#selectedItems.splice(checkIndex, 1);
nativOptionMultiple(nativOption, item.title, false);
}
if (!this.#selectedItems.length) {
- if (placeholder) {
- select.innerText = placeholder;
- } else if (selected) {
- select.innerText = selected;
- } else {
- select.innerText = 'Select...';
- }
+ getSelectText(dataSelectText, select);
} else {
- if (multiselectTag) {
+ if (multiselectTag && multiselectTag == true) {
select.appendChild(ulMultipul);
} else {
select.innerText = this.#selectedItems;
@@ -624,6 +730,7 @@
} else {
select.innerText = item.title;
this.#selectedItems = item;
+
nativOptionOrdinary(nativOption, item.title);
options.forEach((option) => {
@@ -631,6 +738,8 @@
});
option.classList.add('active');
}
+
+ clearSelect(select, this.#element, dataSelectText);
});
});
}
@@ -642,13 +751,22 @@
* @method #searchMode
*/
#searchMode(random) {
+ const { lenguage } = this.#options;
+
const input = this.#element.querySelector(`#searchSelect-${random}`);
const searchSelect = this.#element.querySelectorAll('.list__item');
const result = document.createElement('p');
- const textNode = document.createTextNode('No matches...');
+
+ let textNode = '';
+ if (lenguage === 'ru') {
+ textNode = document.createTextNode(`${ru.textInListSearch}`);
+ } else {
+ textNode = document.createTextNode(`${en.textInListSearch}`);
+ }
result.appendChild(textNode);
result.classList.add('displayHide');
+ result.classList.add('noRezult');
input.parentElement.appendChild(result);
input.addEventListener('click', (e) => {
@@ -699,6 +817,27 @@
}
}
}
+
+ /**
+ * Приватный метод экземпляра класса DropDown
+ * @protected
+ * @description Закрывает список по клику вне элемента
+ * @method #closeSelectClick
+ */
+ #closeSelectClick() {
+ const dropdown = document.querySelector(`${this.#options.selector}`);
+
+ document.addEventListener('click', (e) => {
+ const withinBoundaries = e.composedPath().includes(dropdown);
+ if (!withinBoundaries) {
+ if (this.btn) {
+ return;
+ } else {
+ this.#close();
+ }
+ }
+ });
+ }
}
@@ -726,6 +865,8 @@
Public methods
+ addLenguage
addItem
buttonControl
deleteItem
diff --git a/documentation/create-element.js.html b/documentation/create-element.js.html
index 0bd657a..beb0d06 100644
--- a/documentation/create-element.js.html
+++ b/documentation/create-element.js.html
@@ -65,6 +65,7 @@
}
svgIcon.addEventListener('click', (event) => {
+ event.preventDefault();
event.stopPropagation();
nativOptionMultiple(nativOption, title, false);
@@ -100,7 +101,6 @@
export function createNativeSelect() {
const nativSelect = document.createElement('select');
- nativSelect.setAttribute('form', 'data');
nativSelect.setAttribute('name', 'dataSelect');
nativSelect.classList.add('nativSelect');
return nativSelect;
@@ -120,15 +120,25 @@
/**
* Метод который создает поиск элементов в селекте
* @param {string} random уникальное значение для input элемента.
+ * @param {string} lenguage текст на определенном языке переданный из файла language.js
* @returns {HTMLInputElement} Возвращает сформированный input елемент.
*/
- export function createInputSearch(random) {
+ export function createInputSearch(random, lenguage) {
const intputSearch = document.createElement('input');
intputSearch.type = 'text';
intputSearch.classList.add('inputSearch');
intputSearch.setAttribute('id', `searchSelect-${random}`);
- intputSearch.setAttribute('placeholder', 'Search...');
+
+ if (lenguage) {
+ intputSearch.setAttribute('placeholder', `${lenguage}`);
+ } else {
+ intputSearch.setAttribute('placeholder', 'Search...');
+ }
+
+ intputSearch.addEventListener('click', (e) => {
+ e.preventDefault();
+ });
return intputSearch;
}
@@ -158,6 +168,8 @@
Public methods
+ addLenguage
addItem
buttonControl
deleteItem
diff --git a/documentation/global.html b/documentation/global.html
index 8e3aa6c..f768fe3 100644
--- a/documentation/global.html
+++ b/documentation/global.html
@@ -46,7 +46,7 @@
@@ -68,6 +68,7 @@
'MAN',
'max',
],
+ darkTheme: true,
multiselect: true,
multiselectTag: true,
}
@@ -92,7 +93,27 @@
+
+
+
+
+ (protected) #checkTheme()
+
+
+ Изменяет цветовую схему с темной на светлую.
+
+
+ Source:
+
+
@@ -111,7 +132,27 @@
+
+
+
+
+ (protected) #closeSelectClick()
+
+
+ Закрывает список по клику вне элемента
+
+
+ Source:
+
+
@@ -131,7 +172,7 @@
@@ -179,7 +220,7 @@
@@ -227,7 +268,7 @@
@@ -275,7 +316,7 @@
@@ -295,7 +336,7 @@
@@ -341,7 +382,7 @@
@@ -392,7 +433,58 @@
+
+
+
+
+ addLenguage(lenguage)
+
+
+
+ метод позволяющий заменить плейсхолдер в поиске и текст который выводится если нет
+ результата
+
+
+ Parameters:
+
+
+
+
+ Name
+
+ Type
+
+ Description
+
+
+
+
+
+ lenguage
+
+
+ object
+
+
+
+ объект в котором находятся поля для подключения языка имеет два обязательных поля
+ placeholder, textInListSearch
+
+
+
+
+
+
+ Source:
+
+
@@ -450,7 +542,7 @@
@@ -498,7 +590,7 @@
@@ -517,7 +609,7 @@
@@ -564,7 +656,7 @@
@@ -609,7 +701,7 @@
@@ -667,7 +759,7 @@
@@ -697,6 +789,8 @@
Public methods