Fixed styles(TODO: styles in search mode)

This commit is contained in:
MaxOvs 2023-01-10 18:12:38 +03:00
parent d4eb4c20d0
commit 5b7b9c041e
5 changed files with 248 additions and 21 deletions

View File

@ -4,16 +4,41 @@ const dropdn = new CGSelect({
selector: '.cg-dropdown_one', selector: '.cg-dropdown_one',
placeholder: 'Выберите авто', placeholder: 'Выберите авто',
items: [ items: [
'BMW',
{ {
id: '213sade', category: 'Russia',
title: 'Opel', categoryItems: [
value: 'ds', {
id: '28qwds',
title: 'Москва',
value: 0,
}, },
'Mersedes', ,
'MAN', 'Ростов-на-дону',
'Ferari', 'Саратов',
'Волгоград',
'Донецк',
], ],
},
{
category: 'USA',
categoryItems: ['Alabama', 'Texas', 'Colorado', 'Klirens', 'Los-Angeles'],
},
{
category: 'France',
categoryItems: ['Paris'],
},
],
styles: {
head: {
width: '830px',
},
list: {
width: '824px',
},
placeholder: {
maxWidth: '500px ',
},
},
multiselect: true, multiselect: true,
multiselectTag: true, multiselectTag: true,
}); });

View File

@ -548,7 +548,7 @@ export class DropDown {
/** /**
* Приватный метод рендера экземпляра класса DropDown * Приватный метод рендера экземпляра класса DropDown
*@protected * @protected
* @method #renderUrl * @method #renderUrl
* @description Рендер елементов в селекте переданных с URL и их настойка * @description Рендер елементов в селекте переданных с URL и их настойка
*/ */

View File

@ -8,6 +8,8 @@ import { ICreateBreadCrumb } from './components/create-element/create-element.in
import { import {
clearSelect, clearSelect,
createSelected, createSelected,
customStyles,
customStylesFormat,
getFormatItem, getFormatItem,
getSelectText, getSelectText,
nativeOptionMultiple, nativeOptionMultiple,
@ -15,7 +17,7 @@ import {
} from './components/utils/utilsTs'; } from './components/utils/utilsTs';
import { IDataItem, ISelectedItems } from './components/utils/urils.interface'; import { IDataItem, ISelectedItems } from './components/utils/urils.interface';
import { ICgSelect } 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 './main.scss'; import './main.scss';
@ -32,7 +34,7 @@ export class CGSelect implements ICgSelect {
listDisplayMode?: boolean; listDisplayMode?: boolean;
language?: string; language?: string;
lable?: string; lable?: string;
styles?: object; styles?: IStyle;
event?: string; event?: string;
url?: string; url?: string;
multiselect?: boolean; multiselect?: boolean;
@ -104,15 +106,25 @@ export class CGSelect implements ICgSelect {
items.forEach((dataItem: any, index: number) => { items.forEach((dataItem: any, index: number) => {
let itemInputs: IDataItem = { let itemInputs: IDataItem = {
ItemValue: dataItem, ItemValue: dataItem,
// category: dataItem.category,
// categoryItems: dataItem.categoryItems,
}; };
if (dataItem.category && dataItem.categoryItems) {
this.category = dataItem.category!;
this.itemsSelect.push(this.category);
dataItem.categoryItems.forEach((categoryItem, indexCategory) => {
this.itemsSelect.push(getFormatItem(categoryItem, indexCategory));
});
} else {
this.itemsSelect.push(getFormatItem(itemInputs.ItemValue, index)); this.itemsSelect.push(getFormatItem(itemInputs.ItemValue, index));
}
}); });
} }
/** /**
* Приватный метод рендера экземпляра класса DropDown * Приватный метод рендера экземпляра класса DropDown
*@protected * @protected
* @method render * @method render
* @param {string} select необязательный елемент. Передаеться в метод initSelected * @param {string} select необязательный елемент. Передаеться в метод initSelected
* @description Рендер елементов в селекте. * @description Рендер елементов в селекте.
@ -131,7 +143,12 @@ export class CGSelect implements ICgSelect {
const random = Math.random().toString(36).substring(2, 10); const random = Math.random().toString(36).substring(2, 10);
if (select || (select && styles)) {
this.initSelected(select);
customStyles(this.element!, styles);
} else {
this.initSelected(); this.initSelected();
}
const ulList = document.createElement('ul'); const ulList = document.createElement('ul');
const nativeSelect = createNativeSelect(); const nativeSelect = createNativeSelect();
@ -143,6 +160,11 @@ export class CGSelect implements ICgSelect {
ulList.classList.add('list'); ulList.classList.add('list');
if (styles) {
const { list } = styles;
customStylesFormat(list!, ulList);
}
this.element?.appendChild(ulList); this.element?.appendChild(ulList);
this.itemsSelect.forEach((dataItem: IItems | any) => { this.itemsSelect.forEach((dataItem: IItems | any) => {
@ -184,13 +206,98 @@ export class CGSelect implements ICgSelect {
} }
}); });
this.itemsSelect.filter((item, index) => {
if (typeof item !== 'object') {
this.itemsSelect.splice(index, 1);
}
return item;
});
if (darkTheme == false) {
this.checkTheme();
}
if (nativeSelectMode === true) {
// this.#selectMode(nativeSelectMode);
}
this.list = this.element?.querySelector('.list'); this.list = this.element?.querySelector('.list');
this.caret = this.element?.querySelector('.caret'); this.caret = this.element?.querySelector('.caret');
this.addOptionsBehaviour(); this.addOptionsBehaviour();
} }
private renderUrl() {} /**
* Приватный метод рендера экземпляра класса DropDown
* @protected
* @method renderUrl
* @description Рендер елементов в селекте переданных с URL и их настойка
*/
private async renderUrl() {
const { url, items, multiselect, multiselectTag } = this.options;
if (items) {
return;
}
if (!url) {
return;
}
const response = await fetch(url);
const dataUrl = await response.json();
const nativeSelect = createNativeSelect();
dataUrl.forEach((dataItem: IItems, index: number) => {
const item = {
id: dataItem.id,
title: dataItem.title,
value: index,
};
const ulUrl = this.element!.querySelector('.list');
const nativeOption = createNativeSelectOption();
const liUrl = document.createElement('li');
const textUrl = document.createTextNode(item.title);
if (multiselect) {
const checkBox = document.createElement('input');
checkBox.type = 'checkbox';
if (multiselectTag) {
checkBox.classList.add('displayHide');
}
checkBox.setAttribute('id', `chbox-${item.id}`);
nativeSelect.setAttribute('multiple', 'multiple');
liUrl.appendChild(checkBox);
}
liUrl.classList.add('list__item');
nativeOption.value = item.title;
nativeOption.text = item.title;
nativeSelect.appendChild(nativeOption);
liUrl.appendChild(textUrl);
ulUrl!.appendChild(liUrl);
this.itemsSelect.push(item);
});
this.element!.appendChild(nativeSelect);
this.itemsSelect.filter((item, index) => {
if (typeof item !== 'object') {
this.itemsSelect.splice(index, 1);
}
return item;
});
this.addOptionsBehaviour();
}
/** /**
* Привaтный метод экземпляра класса DropDown * Привaтный метод экземпляра класса DropDown
@ -208,11 +315,29 @@ export class CGSelect implements ICgSelect {
} else if (placeholder) { } else if (placeholder) {
createSelected(this.element, placeholder); createSelected(this.element, placeholder);
} else { } else {
// if (language && language === 'ru') { if (language && language === 'ru') {
// createSelected(this.#element, ru.selectPlaceholder); // createSelected(this.#element, ru.selectPlaceholder);
// } else { } else {
// createSelected(this.#element, en.selectPlaceholder); // createSelected(this.#element, en.selectPlaceholder);
// } }
}
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);
} }
} }
@ -237,7 +362,7 @@ export class CGSelect implements ICgSelect {
* Приватный метод экземпляра класса DropDown * Приватный метод экземпляра класса DropDown
* @protected * @protected
* @description Закрывает список * @description Закрывает список
* @method #close * @method close
*/ */
private close(): void { private close(): void {
this.list?.classList.remove('open'); this.list?.classList.remove('open');
@ -396,4 +521,33 @@ export class CGSelect implements ICgSelect {
}); });
}); });
} }
/**
* Приватный метод рендера экземпляра класса DropDown
* @protected
* @method #checkTheme
* @description Изменяет цветовую схему с темной на светлую.
*/
private checkTheme(): void {
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!');
}
}
} }

View File

@ -204,3 +204,42 @@ export function nativeOptionMultiple(
} }
}); });
} }
/**
* Поиск и стилизация елементов полученных из styles экземпляра DropDown
* @param {Element} element созданный экземпляр класса DropDown
* @param {object} styles объект в котором находяться настройки кастомизации частей селекта
*/
export function customStyles(element: Element, styles: any) {
if (!styles) {
return;
}
const { head, caret, placeholder, lable } = styles;
const cgSelect = element.querySelector('.cg-select');
const caretSelect = element.querySelector('.caret');
const placeholderSelect = element.querySelector('.selected');
const lableItem = element.parentElement!.querySelector('h1.label');
customStylesFormat(head, cgSelect!);
customStylesFormat(caret, caretSelect!);
customStylesFormat(lable, lableItem!);
if (placeholderSelect) {
customStylesFormat(placeholder, placeholderSelect);
}
}
/**
* Универсальный метод для стилизации селекта
* @param {object} elemOption объект полученное из объекта styles у которого мы получаем ключ-значение стилей
* @param {HTMLElement} selector HTMLElement подвергающиеся кастомизации
*/
export function customStylesFormat(elemOption: object, selector: any) {
if (elemOption) {
Object.entries(elemOption).forEach(([key, value]) => {
selector.style[key] = value;
});
}
}

View File

@ -12,9 +12,18 @@ export interface ICgSelect {
listDisplayMode?: boolean; listDisplayMode?: boolean;
language?: string; language?: string;
lable?: string; lable?: string;
styles?: object; styles?: IStyle;
event?: string; event?: string;
url?: string; url?: string;
multiselect?: boolean; multiselect?: boolean;
multiselectTag?: boolean; multiselectTag?: boolean;
} }
export interface IStyle {
head?: object;
caret?: object;
placeholder?: object;
lable?: object;
list?: object;
search?: object;
}