Added multi lenguage and fix methods

This commit is contained in:
Макс Овсяников 2022-11-07 19:56:10 +03:00
parent dc9e2d50d9
commit db177e66cf
5 changed files with 90 additions and 11 deletions

View File

@ -14,6 +14,7 @@ import {
createNativSelectOption, createNativSelectOption,
createNativeSelect, createNativeSelect,
} from './components/create-element'; } from './components/create-element';
import { ru, en } from './language/language';
/** /**
* @class Описание класса DropDown * @class Описание класса DropDown
@ -243,9 +244,28 @@ export class DropDown {
}); });
} }
// on(select, callback) { /**
// console.log('aa'); * Метод экземпляра класса 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 * Приватный метод инициализации экземпляра класса DropDown
@ -361,7 +381,7 @@ export class DropDown {
* @description Рендер елементов в селекте. * @description Рендер елементов в селекте.
*/ */
#render(select) { #render(select) {
const { styles, multiselect, searchMode, multiselectTag, darkTheme } = this.#options; const { styles, multiselect, searchMode, multiselectTag, darkTheme, lenguage } = this.#options;
const random = Math.random().toString(36).substring(2, 10); const random = Math.random().toString(36).substring(2, 10);
if (select || (select && styles)) { if (select || (select && styles)) {
@ -372,11 +392,18 @@ export class DropDown {
} }
const ulList = document.createElement('ul'); const ulList = document.createElement('ul');
const intputSearch = createInputSearch(random);
const nativSelect = createNativeSelect(); const nativSelect = createNativeSelect();
let intputSearch = '';
this.random = random; this.random = random;
if (searchMode) { if (searchMode) {
if (lenguage === 'ru') {
intputSearch = createInputSearch(random, ru.placeholder);
} else {
intputSearch = createInputSearch(random, en.placeholder);
}
ulList.appendChild(intputSearch); ulList.appendChild(intputSearch);
} }
@ -453,16 +480,21 @@ export class DropDown {
* @description Изменяет цветовую схему с темной на светлую. * @description Изменяет цветовую схему с темной на светлую.
*/ */
#checkTheme() { #checkTheme() {
const { darkTheme } = this.#options; const { darkTheme, searchMode } = this.#options;
const select = this.#element.querySelector('.cg-select'); const select = this.#element.querySelector('.cg-select');
const caret = this.#element.querySelector('.caret'); const caret = this.#element.querySelector('.caret');
const list = this.#element.querySelector('ul.list'); const list = this.#element.querySelector('ul.list');
const search = this.#element.querySelector('.inputSearch');
if (darkTheme == false) { if (darkTheme == false) {
select.classList.add('selectWhite'); select.classList.add('selectWhite');
caret.classList.add('caretWhite'); caret.classList.add('caretWhite');
list.classList.add('listWhite'); list.classList.add('listWhite');
if (searchMode == true) {
search.classList.add('inputWhite');
}
} else if (darkTheme == true || !darkTheme) { } else if (darkTheme == true || !darkTheme) {
return; return;
} else { } else {
@ -695,13 +727,22 @@ export class DropDown {
* @method #searchMode * @method #searchMode
*/ */
#searchMode(random) { #searchMode(random) {
const { lenguage } = this.#options;
const input = this.#element.querySelector(`#searchSelect-${random}`); const input = this.#element.querySelector(`#searchSelect-${random}`);
const searchSelect = this.#element.querySelectorAll('.list__item'); const searchSelect = this.#element.querySelectorAll('.list__item');
const result = document.createElement('p'); 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.appendChild(textNode);
result.classList.add('displayHide'); result.classList.add('displayHide');
result.classList.add('noRezult');
input.parentElement.appendChild(result); input.parentElement.appendChild(result);
input.addEventListener('click', (e) => { input.addEventListener('click', (e) => {

View File

@ -97,15 +97,25 @@ export function createNativSelectOption() {
/** /**
* Метод который создает поиск элементов в селекте * Метод который создает поиск элементов в селекте
* @param {string} random уникальное значение для input элемента. * @param {string} random уникальное значение для input элемента.
* @param {string} lenguage текст на определенном языке переданный из файла language.js
* @returns {HTMLInputElement} Возвращает сформированный input елемент. * @returns {HTMLInputElement} Возвращает сформированный input елемент.
*/ */
export function createInputSearch(random) { export function createInputSearch(random, lenguage) {
const intputSearch = document.createElement('input'); const intputSearch = document.createElement('input');
intputSearch.type = 'text'; intputSearch.type = 'text';
intputSearch.classList.add('inputSearch'); intputSearch.classList.add('inputSearch');
intputSearch.setAttribute('id', `searchSelect-${random}`); 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; return intputSearch;
} }

View File

@ -6,6 +6,7 @@ const dropdown = new DropDown({
placeholder: 'Выберите авто', placeholder: 'Выберите авто',
lable: 'Выбор лучшего авто!', lable: 'Выбор лучшего авто!',
darkTheme: false, darkTheme: false,
searchMode: true,
closeOnSelect: false, closeOnSelect: false,
items: [ items: [
'BMW', 'BMW',
@ -31,12 +32,20 @@ const dropdown = new DropDown({
// multiselectTag: true, // multiselectTag: true,
}); });
const ger = {
placeholder: 'searcH????',
textInListSearch: 'None',
};
dropdown.addLenguage(ger);
// ------------------------------URL-------------------- // ------------------------------URL--------------------
const dropdown3 = new DropDown({ const dropdown3 = new DropDown({
selector: '.cg-dropdown_three', selector: '.cg-dropdown_three',
placeholder: 'URL', placeholder: 'URL',
url: 'http://jsonplaceholder.typicode.com/users', url: 'http://jsonplaceholder.typicode.com/users',
searchMode: true, searchMode: true,
lenguage: 'ru',
styles: { styles: {
head: { head: {
background: 'black', background: 'black',

9
src/language/language.js Normal file
View File

@ -0,0 +1,9 @@
export const ru = {
placeholder: 'Поиск...',
textInListSearch: 'Совпадений нет...',
};
export const en = {
placeholder: 'Search...',
textInListSearch: 'No matches...',
};

View File

@ -1,6 +1,13 @@
.selectWhite {
background: rgb(248, 248, 248) !important;
}
.selectWhite,
.listWhite,
.inputWhite,
.pathBlack,
.selectWhite { .selectWhite {
color: black !important; color: black !important;
background: rgb(248, 248, 248) !important;
} }
.caretWhite { .caretWhite {
@ -8,10 +15,13 @@
} }
.listWhite { .listWhite {
color: black !important;
background-color: white !important; background-color: white !important;
} }
.inputWhite {
border-bottom: 1px solid black !important;
}
.pathWhite { .pathWhite {
color: white !important; color: white !important;
} }