Fixed styles(TODO: styles in search mode)
This commit is contained in:
parent
d4eb4c20d0
commit
5b7b9c041e
@ -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,
|
||||||
|
},
|
||||||
|
,
|
||||||
|
'Ростов-на-дону',
|
||||||
|
'Саратов',
|
||||||
|
'Волгоград',
|
||||||
|
'Донецк',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
category: 'USA',
|
||||||
|
categoryItems: ['Alabama', 'Texas', 'Colorado', 'Klirens', 'Los-Angeles'],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
category: 'France',
|
||||||
|
categoryItems: ['Paris'],
|
||||||
},
|
},
|
||||||
'Mersedes',
|
|
||||||
'MAN',
|
|
||||||
'Ferari',
|
|
||||||
],
|
],
|
||||||
|
styles: {
|
||||||
|
head: {
|
||||||
|
width: '830px',
|
||||||
|
},
|
||||||
|
list: {
|
||||||
|
width: '824px',
|
||||||
|
},
|
||||||
|
placeholder: {
|
||||||
|
maxWidth: '500px ',
|
||||||
|
},
|
||||||
|
},
|
||||||
multiselect: true,
|
multiselect: true,
|
||||||
multiselectTag: true,
|
multiselectTag: true,
|
||||||
});
|
});
|
||||||
|
@ -548,7 +548,7 @@ export class DropDown {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Приватный метод рендера экземпляра класса DropDown
|
* Приватный метод рендера экземпляра класса DropDown
|
||||||
*@protected
|
* @protected
|
||||||
* @method #renderUrl
|
* @method #renderUrl
|
||||||
* @description Рендер елементов в селекте переданных с URL и их настойка
|
* @description Рендер елементов в селекте переданных с URL и их настойка
|
||||||
*/
|
*/
|
||||||
|
@ -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,
|
||||||
};
|
};
|
||||||
|
|
||||||
this.itemsSelect.push(getFormatItem(itemInputs.ItemValue, index));
|
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));
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Приватный метод рендера экземпляра класса 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);
|
||||||
|
|
||||||
this.initSelected();
|
if (select || (select && styles)) {
|
||||||
|
this.initSelected(select);
|
||||||
|
customStyles(this.element!, styles);
|
||||||
|
} else {
|
||||||
|
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!');
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user