Added initevent, displayMode etc. Fixed searchMode
This commit is contained in:
parent
5b7b9c041e
commit
7b057ab486
@ -39,6 +39,11 @@ const dropdn = new CGSelect({
|
|||||||
maxWidth: '500px ',
|
maxWidth: '500px ',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
// url
|
||||||
|
// listDisplayMode: true,
|
||||||
|
// searchMode: true,
|
||||||
|
// nativeSelectMode: true
|
||||||
|
// event: 'mouseenter',
|
||||||
multiselect: true,
|
multiselect: true,
|
||||||
multiselectTag: true,
|
multiselectTag: true,
|
||||||
});
|
});
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
import {
|
import {
|
||||||
createBreadCrumb,
|
createBreadCrumb,
|
||||||
|
createInputSearch,
|
||||||
createNativeSelect,
|
createNativeSelect,
|
||||||
createNativeSelectOption,
|
createNativeSelectOption,
|
||||||
} from './components/create-element/create-elementTs';
|
} from './components/create-element/create-elementTs';
|
||||||
@ -19,6 +20,7 @@ import { IDataItem, ISelectedItems } from './components/utils/urils.interface';
|
|||||||
|
|
||||||
import { ICgSelect, IStyle } from './interfaces/cg-select.interface';
|
import { ICgSelect, IStyle } from './interfaces/cg-select.interface';
|
||||||
import { IItems } from './interfaces/items.interface';
|
import { IItems } from './interfaces/items.interface';
|
||||||
|
import { ru, en } from './language/language';
|
||||||
|
|
||||||
import './main.scss';
|
import './main.scss';
|
||||||
|
|
||||||
@ -54,6 +56,7 @@ export class CGSelect implements ICgSelect {
|
|||||||
this.init(setting);
|
this.init(setting);
|
||||||
this.render();
|
this.render();
|
||||||
this.closeSelectClick();
|
this.closeSelectClick();
|
||||||
|
this.initEvent();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -153,7 +156,7 @@ export class CGSelect implements ICgSelect {
|
|||||||
const ulList = document.createElement('ul');
|
const ulList = document.createElement('ul');
|
||||||
const nativeSelect = createNativeSelect();
|
const nativeSelect = createNativeSelect();
|
||||||
|
|
||||||
let inputSearch: string = '';
|
let inputSearch: HTMLInputElement;
|
||||||
let textNode: Text;
|
let textNode: Text;
|
||||||
|
|
||||||
this.randomId = random;
|
this.randomId = random;
|
||||||
@ -165,6 +168,18 @@ export class CGSelect implements ICgSelect {
|
|||||||
customStylesFormat(list!, ulList);
|
customStylesFormat(list!, ulList);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (searchMode) {
|
||||||
|
if (language === 'ru') {
|
||||||
|
inputSearch = createInputSearch(random, ru.placeholder);
|
||||||
|
} else {
|
||||||
|
inputSearch = createInputSearch(random, en.placeholder);
|
||||||
|
}
|
||||||
|
|
||||||
|
const { search } = styles!;
|
||||||
|
customStylesFormat(search!, inputSearch);
|
||||||
|
ulList.appendChild(inputSearch);
|
||||||
|
}
|
||||||
|
|
||||||
this.element?.appendChild(ulList);
|
this.element?.appendChild(ulList);
|
||||||
|
|
||||||
this.itemsSelect.forEach((dataItem: IItems | any) => {
|
this.itemsSelect.forEach((dataItem: IItems | any) => {
|
||||||
@ -213,16 +228,20 @@ export class CGSelect implements ICgSelect {
|
|||||||
return item;
|
return item;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
this.list = this.element!.querySelector('.list');
|
||||||
|
this.caret = this.element!.querySelector('.caret');
|
||||||
|
|
||||||
if (darkTheme == false) {
|
if (darkTheme == false) {
|
||||||
this.checkTheme();
|
this.checkTheme();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nativeSelectMode === true) {
|
if (nativeSelectMode === true) {
|
||||||
// this.#selectMode(nativeSelectMode);
|
this.selectMode(nativeSelectMode);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.list = this.element?.querySelector('.list');
|
if (listDisplayMode) {
|
||||||
this.caret = this.element?.querySelector('.caret');
|
this.displayMode(listDisplayMode);
|
||||||
|
}
|
||||||
|
|
||||||
this.addOptionsBehaviour();
|
this.addOptionsBehaviour();
|
||||||
}
|
}
|
||||||
@ -341,6 +360,30 @@ export class CGSelect implements ICgSelect {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Приватный метод экземпляра класса DropDown
|
||||||
|
* @protected
|
||||||
|
* @description Открывает и закрывает список по переданному эвенту
|
||||||
|
* @method initEvent
|
||||||
|
*/
|
||||||
|
private initEvent() {
|
||||||
|
const { event } = this.options;
|
||||||
|
if (!event) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event) {
|
||||||
|
if (event === 'mouseenter') {
|
||||||
|
this.element!.addEventListener(event, () => {
|
||||||
|
this.open();
|
||||||
|
});
|
||||||
|
this.element!.addEventListener('mouseleave', () => {
|
||||||
|
this.close();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Приватный метод экземпляра класса DropDown
|
* Приватный метод экземпляра класса DropDown
|
||||||
* @protected
|
* @protected
|
||||||
@ -422,6 +465,10 @@ export class CGSelect implements ICgSelect {
|
|||||||
select?.classList.add('overflow-hidden');
|
select?.classList.add('overflow-hidden');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (searchMode) {
|
||||||
|
this.searchModeSelect(this.randomId);
|
||||||
|
}
|
||||||
|
|
||||||
options?.forEach((option: Element, index: number) => {
|
options?.forEach((option: Element, index: number) => {
|
||||||
option.addEventListener('click', (event) => {
|
option.addEventListener('click', (event) => {
|
||||||
if (Array.isArray(this.selectedItems)) {
|
if (Array.isArray(this.selectedItems)) {
|
||||||
@ -550,4 +597,117 @@ export class CGSelect implements ICgSelect {
|
|||||||
throw new Error('Styles error or invalid value entered!');
|
throw new Error('Styles error or invalid value entered!');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Приватный метод экземпляра класса DropDown
|
||||||
|
* @protected
|
||||||
|
* @param {boolean} nativeSelectMode параметр отвечающий за добавления нативного селекта.
|
||||||
|
* @description Изменяет отображение селекта на мобильных устройствах
|
||||||
|
* @method selectMode
|
||||||
|
*/
|
||||||
|
private selectMode(nativeSelectMode: boolean) {
|
||||||
|
let win = window.outerWidth;
|
||||||
|
|
||||||
|
if (nativeSelectMode === true) {
|
||||||
|
const select = this.element!.querySelector('.cg-select');
|
||||||
|
const list = this.element!.querySelector('.list');
|
||||||
|
const nativeSelect = this.element!.querySelector('.nativeSelect');
|
||||||
|
|
||||||
|
if (win < 576) {
|
||||||
|
select!.classList.add('displayHide');
|
||||||
|
list!.classList.add('displayHide');
|
||||||
|
nativeSelect!.classList.add('nativeSelectActive');
|
||||||
|
} else if (win > 576) {
|
||||||
|
select!.classList.remove('displayHide');
|
||||||
|
list!.classList.remove('displayHide');
|
||||||
|
nativeSelect!.classList.remove('nativeSelectActive');
|
||||||
|
nativeSelect!.classList.add('displayHide');
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Приватный метод экземпляра класса DropDown
|
||||||
|
* @protected
|
||||||
|
* @param {boolean} listDisplayMode параметр отвечающий за отображение выбора в виде модального окна.
|
||||||
|
* @description Изменяет отображение листа с выбором в виде модального окна.
|
||||||
|
* @method displayMode
|
||||||
|
*/
|
||||||
|
private displayMode(listDisplayMode: boolean): void {
|
||||||
|
if (listDisplayMode) {
|
||||||
|
const modal = document.createElement('div');
|
||||||
|
const body = document.querySelector('body');
|
||||||
|
const list = this.list!;
|
||||||
|
|
||||||
|
modal.appendChild(list);
|
||||||
|
this.element!.appendChild(modal);
|
||||||
|
|
||||||
|
this.element!.addEventListener('click', () => {
|
||||||
|
modal.classList.toggle('modal');
|
||||||
|
list.classList.toggle('listModal');
|
||||||
|
body!.classList.toggle('overflowHide');
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Метод который реализует поиск элементов в селекте
|
||||||
|
* @protected
|
||||||
|
* @param {string} random уникальное значение для input элемента.
|
||||||
|
* @method searchMode
|
||||||
|
*/
|
||||||
|
private searchModeSelect(random: string) {
|
||||||
|
const { language } = this.options;
|
||||||
|
|
||||||
|
const input = this.element!.querySelector(`#searchSelect-${random}`) as HTMLInputElement;
|
||||||
|
const searchSelect = this.element!.querySelectorAll('.list__item');
|
||||||
|
const result = document.createElement('p');
|
||||||
|
|
||||||
|
let textNode: Text;
|
||||||
|
if (language && language === '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) => {
|
||||||
|
e.stopPropagation();
|
||||||
|
});
|
||||||
|
|
||||||
|
if (input instanceof HTMLInputElement) {
|
||||||
|
input!.oninput = function () {
|
||||||
|
let valueSearch: string = input.value.trim().toLowerCase();
|
||||||
|
let anyMatch = false;
|
||||||
|
|
||||||
|
if (valueSearch != '') {
|
||||||
|
searchSelect.forEach((elem) => {
|
||||||
|
let isMatching = new RegExp(valueSearch, 'gi').test(elem.textContent!);
|
||||||
|
anyMatch = anyMatch || isMatching;
|
||||||
|
|
||||||
|
if (elem.textContent!.toLowerCase().search(valueSearch) == -1) {
|
||||||
|
elem.classList.add('displayHide');
|
||||||
|
} else {
|
||||||
|
elem.classList.remove('displayHide');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
result.classList.toggle('displayHide', anyMatch);
|
||||||
|
} else {
|
||||||
|
searchSelect.forEach((elem) => {
|
||||||
|
elem.classList.remove('displayHide');
|
||||||
|
result.classList.add('displayHide');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -96,3 +96,29 @@ export function createBreadCrumb(
|
|||||||
|
|
||||||
return liChip;
|
return liChip;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Метод который создает поиск элементов в селекте
|
||||||
|
* @param {string} random уникальное значение для input элемента.
|
||||||
|
* @param {string} lenguage текст на определенном языке переданный из файла language.js
|
||||||
|
* @returns {HTMLInputElement} Возвращает сформированный input елемент.
|
||||||
|
*/
|
||||||
|
export function createInputSearch(random: string, lenguage: string): HTMLInputElement {
|
||||||
|
const inputSearch = document.createElement('input');
|
||||||
|
|
||||||
|
inputSearch.type = 'text';
|
||||||
|
inputSearch.classList.add('inputSearch');
|
||||||
|
inputSearch.setAttribute('id', `searchSelect-${random}`);
|
||||||
|
|
||||||
|
if (lenguage) {
|
||||||
|
inputSearch.setAttribute('placeholder', `${lenguage}`);
|
||||||
|
} else {
|
||||||
|
inputSearch.setAttribute('placeholder', 'Search...');
|
||||||
|
}
|
||||||
|
|
||||||
|
inputSearch.addEventListener('click', (e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
});
|
||||||
|
|
||||||
|
return inputSearch;
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user