Added methods in open and fix problems
This commit is contained in:
parent
55c4bfaa7c
commit
2f64f9f3a6
15
package-lock.json
generated
15
package-lock.json
generated
@ -1,15 +1,16 @@
|
|||||||
{
|
{
|
||||||
"name": "cg-select",
|
"name": "cg-select",
|
||||||
"version": "0.1.171",
|
"version": "0.2.1",
|
||||||
"lockfileVersion": 2,
|
"lockfileVersion": 2,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "cg-select",
|
"name": "cg-select",
|
||||||
"version": "0.1.171",
|
"version": "0.2.1",
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@parcel/optimizer-css": "^2.8.0",
|
"@parcel/optimizer-css": "^2.8.0",
|
||||||
|
"@types/prettier": "^2.7.2",
|
||||||
"gh-pages": "^4.0.0",
|
"gh-pages": "^4.0.0",
|
||||||
"typescript": "^4.9.4"
|
"typescript": "^4.9.4"
|
||||||
},
|
},
|
||||||
@ -2081,6 +2082,11 @@
|
|||||||
"integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==",
|
"integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"node_modules/@types/prettier": {
|
||||||
|
"version": "2.7.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz",
|
||||||
|
"integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg=="
|
||||||
|
},
|
||||||
"node_modules/abortcontroller-polyfill": {
|
"node_modules/abortcontroller-polyfill": {
|
||||||
"version": "1.7.3",
|
"version": "1.7.3",
|
||||||
"resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.3.tgz",
|
"resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.3.tgz",
|
||||||
@ -5404,6 +5410,11 @@
|
|||||||
"integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==",
|
"integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"@types/prettier": {
|
||||||
|
"version": "2.7.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz",
|
||||||
|
"integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg=="
|
||||||
|
},
|
||||||
"abortcontroller-polyfill": {
|
"abortcontroller-polyfill": {
|
||||||
"version": "1.7.3",
|
"version": "1.7.3",
|
||||||
"resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.3.tgz",
|
"resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.3.tgz",
|
||||||
|
@ -29,6 +29,7 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@parcel/optimizer-css": "^2.8.0",
|
"@parcel/optimizer-css": "^2.8.0",
|
||||||
|
"@types/prettier": "^2.7.2",
|
||||||
"gh-pages": "^4.0.0",
|
"gh-pages": "^4.0.0",
|
||||||
"typescript": "^4.9.4"
|
"typescript": "^4.9.4"
|
||||||
},
|
},
|
||||||
|
@ -1,3 +1,7 @@
|
|||||||
|
import {
|
||||||
|
createNativeSelect,
|
||||||
|
createNativeSelectOption,
|
||||||
|
} from './components/create-element/create-elementTs';
|
||||||
import { IDataItem } from './components/utils/urils.interface';
|
import { IDataItem } from './components/utils/urils.interface';
|
||||||
import { createSelected, getFormatItem } from './components/utils/utilsTs';
|
import { createSelected, getFormatItem } from './components/utils/utilsTs';
|
||||||
import { ISgSelect } from './interfaces/cg-select.interface';
|
import { ISgSelect } from './interfaces/cg-select.interface';
|
||||||
@ -23,9 +27,10 @@ export class SGSelect implements ISgSelect {
|
|||||||
multiselectTag?: boolean;
|
multiselectTag?: boolean;
|
||||||
|
|
||||||
private element: Element | null;
|
private element: Element | null;
|
||||||
private list: HTMLElement;
|
private list: Element | null | undefined;
|
||||||
private options: ISgSelect;
|
private options: ISgSelect;
|
||||||
private caret: HTMLElement;
|
private randomId: string;
|
||||||
|
private caret: Element | null | undefined;
|
||||||
private category: string;
|
private category: string;
|
||||||
private selectedItems: object[] | object;
|
private selectedItems: object[] | object;
|
||||||
private itemsSelect: IItems[] | string[] | any;
|
private itemsSelect: IItems[] | string[] | any;
|
||||||
@ -36,39 +41,74 @@ export class SGSelect implements ISgSelect {
|
|||||||
this.render();
|
this.render();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Приватный метод инициализации экземпляра класса DropDown
|
||||||
|
* @method #init
|
||||||
|
* @member
|
||||||
|
* @protected
|
||||||
|
* @param {ISgSelect} setting передаваемые настройки селекта
|
||||||
|
* @description Приватный метод. Общая инициализация селекта. Получение настоек и преобразвание элементов селекта.
|
||||||
|
* @example
|
||||||
|
* {
|
||||||
|
selector: '.cg-dropdown_one',
|
||||||
|
placeholder: 'Выберите авто',
|
||||||
|
items: [
|
||||||
|
'BMW',
|
||||||
|
{
|
||||||
|
id: '213sade',
|
||||||
|
title: 'Opel',
|
||||||
|
value: 1,
|
||||||
|
},
|
||||||
|
'Mersedes',
|
||||||
|
'MAN',
|
||||||
|
'max',
|
||||||
|
],
|
||||||
|
darkTheme: true,
|
||||||
|
multiselect: true,
|
||||||
|
multiselectTag: true,
|
||||||
|
}
|
||||||
|
*/
|
||||||
private init(setting: ISgSelect): void {
|
private init(setting: ISgSelect): void {
|
||||||
const { items, multiselect, url, selector} = setting;
|
const { items, multiselect, url, selector } = setting;
|
||||||
|
|
||||||
this.options = setting;
|
this.options = setting;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
const elem = document.querySelector(selector);
|
const elem = document.querySelector(selector);
|
||||||
this.element = elem;
|
this.element = elem;
|
||||||
|
|
||||||
this.element?.addEventListener('click', (e) => {
|
this.element?.addEventListener('click', (e) => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
console.log('click');
|
this.open();
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
this.itemsSelect = [];
|
this.itemsSelect = [];
|
||||||
|
|
||||||
if(multiselect === true){
|
if (multiselect === true) {
|
||||||
this.selectedItems = [];
|
this.selectedItems = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!items && url) {
|
if (!items && url) {
|
||||||
this.renderUrl();
|
this.renderUrl();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
items.forEach((dataItem:IDataItem, index:number) => {
|
items.forEach((dataItem: any, index: number) => {
|
||||||
this.itemsSelect.push(getFormatItem(dataItem, index))
|
let itemInputs: IDataItem = {
|
||||||
})
|
ItemValue: dataItem,
|
||||||
|
};
|
||||||
|
|
||||||
|
this.itemsSelect.push(getFormatItem(itemInputs.ItemValue, index));
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private render() {
|
/**
|
||||||
|
* Приватный метод рендера экземпляра класса DropDown
|
||||||
|
*@protected
|
||||||
|
* @method #render
|
||||||
|
* @param {string} select необязательный елемент. Передаеться в метод initSelected
|
||||||
|
* @description Рендер елементов в селекте.
|
||||||
|
*/
|
||||||
|
private render(select?: string): void {
|
||||||
const {
|
const {
|
||||||
styles,
|
styles,
|
||||||
multiselect,
|
multiselect,
|
||||||
@ -82,14 +122,76 @@ export class SGSelect implements ISgSelect {
|
|||||||
|
|
||||||
const random = Math.random().toString(36).substring(2, 10);
|
const random = Math.random().toString(36).substring(2, 10);
|
||||||
|
|
||||||
this.initSelected()
|
this.initSelected();
|
||||||
|
|
||||||
|
const ulList = document.createElement('ul');
|
||||||
|
const nativeSelect = createNativeSelect();
|
||||||
|
|
||||||
|
let inputSearch: string = '';
|
||||||
|
let textNode: Text;
|
||||||
|
|
||||||
|
this.randomId = random;
|
||||||
|
|
||||||
|
ulList.classList.add('list');
|
||||||
|
|
||||||
|
this.element?.appendChild(ulList);
|
||||||
|
|
||||||
|
this.itemsSelect.forEach((dataItem: IItems | any) => {
|
||||||
|
this.element?.appendChild(nativeSelect);
|
||||||
|
|
||||||
|
const liItem = document.createElement('li');
|
||||||
|
const nativeOption = createNativeSelectOption();
|
||||||
|
const strongItem = document.createElement('strong');
|
||||||
|
|
||||||
|
liItem.classList.add('list__item');
|
||||||
|
strongItem.classList.add('category');
|
||||||
|
|
||||||
|
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');
|
||||||
|
}
|
||||||
|
|
||||||
|
nativeSelect.setAttribute('multiple', 'multiple');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dataItem.title) {
|
||||||
|
nativeOption.text = dataItem.title;
|
||||||
|
nativeOption.value = dataItem.title;
|
||||||
|
textNode = document.createTextNode(dataItem.title);
|
||||||
|
|
||||||
|
nativeSelect.appendChild(nativeOption);
|
||||||
|
liItem.appendChild(textNode);
|
||||||
|
ulList.appendChild(liItem);
|
||||||
|
} else {
|
||||||
|
// Для отрисовки категорий
|
||||||
|
textNode = document.createTextNode(dataItem);
|
||||||
|
strongItem.appendChild(textNode);
|
||||||
|
ulList.appendChild(strongItem);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.list = this.element?.querySelector('.list');
|
||||||
|
this.caret = this.element?.querySelector('.caret');
|
||||||
|
|
||||||
|
// this.#addOptionsBehaviour();
|
||||||
}
|
}
|
||||||
|
|
||||||
private renderUrl() {}
|
private renderUrl() {}
|
||||||
|
|
||||||
|
/**
|
||||||
private initSelected(){
|
* Привaтный метод экземпляра класса DropDown
|
||||||
|
*
|
||||||
|
* @method #initSelected
|
||||||
|
* @param {string} select необязательный елемент. Используется в методе selectIndex
|
||||||
|
* @description Отрисовывает и стилизует селект
|
||||||
|
* @protected
|
||||||
|
*/
|
||||||
|
private initSelected(select?: string): void {
|
||||||
const { styles, selected, placeholder, lable, language } = this.options;
|
const { styles, selected, placeholder, lable, language } = this.options;
|
||||||
|
|
||||||
if (selected) {
|
if (selected) {
|
||||||
@ -104,4 +206,23 @@ export class SGSelect implements ISgSelect {
|
|||||||
// }
|
// }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Приватный метод экземпляра класса DropDown
|
||||||
|
* @protected
|
||||||
|
* @param {boolean} oneClick необязательный параметр передаваемый из функции buttonControl
|
||||||
|
* @description Открывает список для выбора элемента
|
||||||
|
* @method #open
|
||||||
|
*/
|
||||||
|
private open(oneClick?: boolean): void {
|
||||||
|
if (oneClick === true) {
|
||||||
|
this.list?.classList.add('open');
|
||||||
|
this.caret?.classList.add('caret_rotate');
|
||||||
|
} else {
|
||||||
|
this.list?.classList.toggle('open');
|
||||||
|
this.caret?.classList.toggle('caret_rotate');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private addOptionsBehaviour() {}
|
||||||
}
|
}
|
||||||
|
25
src/components/create-element/create-elementTs.ts
Normal file
25
src/components/create-element/create-elementTs.ts
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
|
||||||
|
/**
|
||||||
|
* Метод который создает нативный селект
|
||||||
|
* @returns {HTMLSelectElement} Возвращает созданный нативный селект
|
||||||
|
*/
|
||||||
|
|
||||||
|
export function createNativeSelect(): HTMLSelectElement {
|
||||||
|
const nativeSelect = document.createElement('select');
|
||||||
|
|
||||||
|
nativeSelect.setAttribute('name', 'dataSelect');
|
||||||
|
nativeSelect.classList.add('nativeSelect');
|
||||||
|
return nativeSelect;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Метод который создает Options для нативного селекта
|
||||||
|
* @returns {HTMLOptionElement} Возвращает созданные Options нативного селекта
|
||||||
|
*/
|
||||||
|
export function createNativeSelectOption(): HTMLOptionElement {
|
||||||
|
const nativeOption = document.createElement('option');
|
||||||
|
|
||||||
|
nativeOption.classList.add('nativeSelect__nativeOption');
|
||||||
|
return nativeOption;
|
||||||
|
}
|
||||||
|
|
@ -1,5 +1,7 @@
|
|||||||
|
import { IItems } from "../../interfaces/items.interface";
|
||||||
|
|
||||||
export interface IDataItem{
|
export interface IDataItem{
|
||||||
category?: string;
|
category?: string;
|
||||||
categoryItems?: string;
|
categoryItems?: string;
|
||||||
ItemValue: object | string | number;
|
ItemValue: string | IItems | number;
|
||||||
}
|
}
|
@ -8,7 +8,7 @@ import { IDataItem } from './urils.interface';
|
|||||||
* @returns {IDataItem | IItems} возвращает сформированный объект
|
* @returns {IDataItem | IItems} возвращает сформированный объект
|
||||||
*/
|
*/
|
||||||
|
|
||||||
export function getFormatItem(dataItem:IDataItem , index: number):IDataItem | IItems {
|
export function getFormatItem(dataItem:any , index: number) : IItems {
|
||||||
const random = Math.random().toString(36).substring(2, 10);
|
const random = Math.random().toString(36).substring(2, 10);
|
||||||
let item: IItems;
|
let item: IItems;
|
||||||
|
|
||||||
@ -20,6 +20,7 @@ export function getFormatItem(dataItem:IDataItem , index: number):IDataItem | II
|
|||||||
title: dataItem,
|
title: dataItem,
|
||||||
value: index
|
value: index
|
||||||
}
|
}
|
||||||
|
|
||||||
return item;
|
return item;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
export interface IItems{
|
export interface IItems{
|
||||||
id: string;
|
id: string;
|
||||||
title: string | number | object;
|
title: string;
|
||||||
value: number | string
|
value: number | string
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user