Skip to content

Commit 3c35dc6

Browse files
committed
[PRAC/cont] Add styles for modal window "add-btn"
Realiz partial stylization modal window/its positioning, accord temp. Worth noting: - a small correction/replacements in css files. core: B-3 / JS-BL
1 parent c7f41b7 commit 3c35dc6

File tree

6 files changed

+166
-38
lines changed

6 files changed

+166
-38
lines changed

core-courses/3-js-basic-level/practicum-js-basic-level/sb-crm-client/css/crm-search.css

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,36 @@
1919
margin-right: 55px;
2020
}
2121

22-
.crm__search-form-input-wrap {
22+
.crm__search-form-wrap {
2323
padding-top: 4px;
2424
width: 100%;
2525
max-width: 580px;
2626
}
2727

28+
.crm__search-form,
29+
.crm__search-form input,
30+
.crm__search-form input[type="text"] {
31+
font-family: var(--open-sans), sans-serif;
32+
font-size: var(--default-fs);
33+
}
34+
35+
.crm__search-form,
36+
.crm__search-form input::placeholder {
37+
color: var(--text-gray);
38+
}
39+
2840
.crm__search-input {
2941
border-radius: 0;
3042
min-height: 44px;
3143
caret-color: var(--main-purple);
3244
}
3345

46+
.crm__search-input:focus {
47+
border-color: var(--main-purple);
48+
outline: none;
49+
box-shadow: 0 0 0 .25rem rgba(152, 115, 255, .25);
50+
}
51+
3452
/* media queries, any-hover */
3553

3654
@media (max-width: 992px) {
@@ -64,11 +82,11 @@
6482
cursor: pointer;
6583
}
6684

67-
.crm__search-form-input-wrap {
85+
.crm__search-form-wrap {
6886
display: none;
6987
}
7088

71-
.show-search-input .crm__search-form-input-wrap {
89+
.show-search-input .crm__search-form-wrap {
7290
display: block;
7391
}
7492
}

core-courses/3-js-basic-level/practicum-js-basic-level/sb-crm-client/css/crm.css

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,3 @@
33
margin-left: 20px;
44
padding-top: 10px;
55
}
6-
7-
.crm__search-form,
8-
.crm__search-form input,
9-
.crm__search-form input[type="text"] {
10-
font-family: var(--open-sans), sans-serif;
11-
font-size: var(--default-fs);
12-
}
13-
14-
.crm__search-form,
15-
.crm__search-form input::placeholder {
16-
color: var(--text-gray);
17-
}
18-
19-
.form-control:focus {
20-
border-color: var(--main-purple);
21-
outline: none;
22-
box-shadow: 0 0 0 .25rem rgba(152, 115, 255, .25);
23-
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
.modal__add-dialog {
2+
position: relative;
3+
top: 220px;
4+
}
5+
6+
.modal__add-content-wrap {
7+
border: none;
8+
border-radius: 0;
9+
padding: 25px 30px;
10+
max-width: 450px;
11+
outline: none;
12+
}
13+
14+
.modal__add-header,
15+
.modal__add-body,
16+
.modal__add-footer {
17+
padding: 0;
18+
}
19+
20+
.modal__add-header,
21+
.modal__add-footer {
22+
border: none;
23+
}
24+
25+
.modal__add-header {
26+
margin-bottom: 32px;
27+
}
28+
29+
.modal__add-header-title {
30+
font-weight: var(--bold);
31+
font-size: 18px;
32+
color: var(--black);
33+
}
34+
35+
.modal__add-header .modal__add-header-x-btn {
36+
position: relative;
37+
top: -12px;
38+
right: -7px;
39+
padding: 5px;
40+
}
41+
42+
.modal__add-header .modal__add-header-x-btn:focus {
43+
box-shadow: 0 0 0 0.25rem var(--bootstrap-red);
44+
opacity: 0.5;
45+
}
46+
47+
.modal__add-body-form {
48+
display: flex;
49+
flex-direction: column;
50+
row-gap: 30px;
51+
}
52+
53+
.modal__add-body-input {
54+
border: none;
55+
border-bottom: 1px solid var(--gray);
56+
border-radius: 0;
57+
}

core-courses/3-js-basic-level/practicum-js-basic-level/sb-crm-client/css/style.css

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,5 @@
55
@import url("crm-search.css");
66
@import url("crm-output.css");
77
@import url("crm-add.css");
8+
@import url("modal-add.css");
89
@import url("custom-tippy.css");

core-courses/3-js-basic-level/practicum-js-basic-level/sb-crm-client/css/variables.css

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
/* colors */
1818
--black: #333;
1919
--white: #fff;
20+
--bootstrap-red: #dc3545;
2021
--main-purple: #9873FF;
2122
--light-purple: #B89EFF;
2223
--dark-purple: #8052FF;

core-courses/3-js-basic-level/practicum-js-basic-level/sb-crm-client/js/index.js

Lines changed: 86 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
(() => {
22
// ** получение существующих, создание "новых" элементов (глобальное объявление)
3-
const page = document.getElementById('page');
43
const crm = document.getElementById('crm');
54
const crmSearch = document.getElementById('crm-search');
65
const crmOutput = document.getElementById('crm-output');
@@ -13,7 +12,7 @@
1312
const searchLogoWrap = document.createElement('div');
1413
const searchLogo = document.createElement('a');
1514
const searchLogoImg = document.createElement('img');
16-
const searchFormInputWrap = document.createElement('div');
15+
const searchFormWrap = document.createElement('div');
1716
const searchForm = document.createElement('form');
1817
const searchInputWrap = document.createElement('div');
1918
const searchInput = document.createElement('input');
@@ -22,7 +21,7 @@
2221
searchLogoWrap.classList.add('crm__search-logo-wrap');
2322
searchLogo.classList.add('crm__search-logo');
2423
searchLogoImg.classList.add('crm__search-logo-img');
25-
searchFormInputWrap.classList.add('crm__search-form-input-wrap');
24+
searchFormWrap.classList.add('crm__search-form-wrap');
2625
searchForm.classList.add('crm__search-form', 'needs-validation');
2726
searchInputWrap.classList.add('crm__search-input-wrap');
2827
searchInput.classList.add('crm__search-input', 'form-control');
@@ -52,8 +51,8 @@
5251
searchLogoWrap.append(searchLogo);
5352
searchInputWrap.append(searchInput, searchInputFeedback);
5453
searchForm.append(searchInputWrap);
55-
searchFormInputWrap.append(searchForm);
56-
crmSearchContainer.append(searchLogoWrap, searchFormInputWrap);
54+
searchFormWrap.append(searchForm);
55+
crmSearchContainer.append(searchLogoWrap, searchFormWrap);
5756

5857
// организация таблицы данных о клиентах (структура, заголовки колонок, иконки)
5958
const outputTitleWrap = document.createElement('div');
@@ -239,10 +238,13 @@
239238
const addModalBodyForm = document.createElement('form');
240239
const addModalBodySurnameInputWrap = document.createElement('div');
241240
const addModalBodySurnameInput = document.createElement('input');
241+
const addModalBodySurnameFeedback = document.createElement('div');
242242
const addModalBodyNameInputWrap = document.createElement('div');
243243
const addModalBodyNameInput = document.createElement('input');
244+
const addModalBodyNameFeedback = document.createElement('div');
244245
const addModalBodyPatronymicInputWrap = document.createElement('div');
245246
const addModalBodyPatronymicInput = document.createElement('input');
247+
const addModalBodyPatronymicFeedback = document.createElement('div');
246248
const addModalFooter = document.createElement('div');
247249
const addModalFooterAddBtnWrap = document.createElement('div');
248250
const addModalFooterAddBtn = document.createElement('button');
@@ -256,17 +258,13 @@
256258
addBtnGrayIcon.classList.add('crm__add-btn-icon', 'gray-add-icon');
257259
addBtnText.classList.add('crm__add-btn-text');
258260
addModalWrap.classList.add('modal', 'crm__add-btn-modal', 'fade');
259-
addModalDialog.classList.add(
260-
'modal__add-dialog',
261-
'modal-dialog',
262-
'modal-dialog-centered'
263-
);
261+
addModalDialog.classList.add('modal__add-dialog', 'modal-dialog');
264262
addModalContent.classList.add('modal__add-content-wrap', 'modal-content');
265263
addModalHeader.classList.add('modal__add-header', 'modal-header');
266264
addModalHeaderTitle.classList.add('modal__add-header-title', 'modal-title');
267265
addModalHeaderXBtn.classList.add('modal__add-header-x-btn', 'btn-close');
268266
addModalBody.classList.add('modal__add-body', 'modal-body');
269-
addModalBodyForm.classList.add('modal__add-body-form');
267+
addModalBodyForm.classList.add('modal__add-body-form', 'needs-validation');
270268
addModalBodySurnameInputWrap.classList.add(
271269
'modal__add-body-input-wrap',
272270
'add-surname-input-wrap'
@@ -276,6 +274,11 @@
276274
'add-surname-input',
277275
'form-control'
278276
);
277+
addModalBodySurnameFeedback.classList.add(
278+
'modal__add-body-input-feedback',
279+
'surname-input-feedback',
280+
'invalid-feedback'
281+
);
279282
addModalBodyNameInputWrap.classList.add(
280283
'modal__add-body-input-wrap',
281284
'add-name-input-wrap'
@@ -285,6 +288,11 @@
285288
'add-name-input',
286289
'form-control'
287290
);
291+
addModalBodyNameFeedback.classList.add(
292+
'modal__add-body-input-feedback',
293+
'name-input-feedback',
294+
'invalid-feedback'
295+
);
288296
addModalBodyPatronymicInputWrap.classList.add(
289297
'modal__add-body-input-wrap',
290298
'add-patronymic-input-wrap'
@@ -294,6 +302,11 @@
294302
'add-patronymic-input',
295303
'form-control'
296304
);
305+
addModalBodyPatronymicFeedback.classList.add(
306+
'modal__add-body-input-feedback',
307+
'patronymic-input-feedback',
308+
'invalid-feedback'
309+
);
297310
addModalFooter.classList.add('modal__add-footer', 'modal-footer');
298311
addModalFooterAddBtnWrap.classList.add('modal__add-footer-add-btn-wrap');
299312
addModalFooterAddBtn.classList.add('modal__add-footer-add-btn');
@@ -338,16 +351,31 @@
338351

339352
addBtnText.textContent = 'Добавить клиента';
340353
addModalHeaderTitle.textContent = 'Новый клиент';
354+
addModalBodySurnameFeedback.textContent =
355+
'Введены не корректные данные.. исключите: английские буквы, цифры!';
356+
addModalBodyNameFeedback.textContent =
357+
'Введены не корректные данные.. исключите: английские буквы, цифры!';
358+
addModalBodyPatronymicFeedback.textContent =
359+
'Введены не корректные данные.. исключите: английские буквы, цифры!';
341360
addModalFooterAddBtn.textContent = 'Добавить контакт';
342361
addModalFooterSaveBtn.textContent = 'Сохранить';
343362
addModalFooterCancelBtn.textContent = 'Отмена';
344363

345364
addBtn.append(addBtnDefaultIcon, addBtnWhiteIcon, addBtnGrayIcon, addBtnText);
346365
addBtnWrap.append(addBtn);
347366
addModalHeader.append(addModalHeaderTitle, addModalHeaderXBtn);
348-
addModalBodySurnameInputWrap.append(addModalBodySurnameInput);
349-
addModalBodyNameInputWrap.append(addModalBodyNameInput);
350-
addModalBodyPatronymicInputWrap.append(addModalBodyPatronymicInput);
367+
addModalBodySurnameInputWrap.append(
368+
addModalBodySurnameInput,
369+
addModalBodySurnameFeedback
370+
);
371+
addModalBodyNameInputWrap.append(
372+
addModalBodyNameInput,
373+
addModalBodyNameFeedback
374+
);
375+
addModalBodyPatronymicInputWrap.append(
376+
addModalBodyPatronymicInput,
377+
addModalBodyPatronymicFeedback
378+
);
351379
addModalBodyForm.append(
352380
addModalBodySurnameInputWrap,
353381
addModalBodyNameInputWrap,
@@ -411,10 +439,10 @@
411439
});
412440
}
413441

414-
const searchFormInput = document.querySelector('.crm__search-form input'); // получение search-инпута
415-
searchFormInputValidation(searchFormInput);
442+
const searchFormMainInput = document.querySelector('.crm__search-form input'); // получение search-инпута
443+
searchFormInputValidation(searchFormMainInput);
416444

417-
// изменение направления стрелки/svg-icon, согласно прожатия по заглавной ячейке (при сортировке данных)
445+
// ** изменение направления стрелки/svg-icon, согласно прожатия по заглавной ячейке (при сортировке данных)
418446
const allHeaderRowCells = document.querySelectorAll(
419447
'.crm__o-table-head-cell'
420448
);
@@ -448,4 +476,45 @@
448476
}
449477
});
450478
});
479+
480+
// ** организация валидации для ввода данных/в модальном окне (при добавлении нового/клиента)
481+
function addModalFormInputValidation(inputs) {
482+
inputs.forEach((input) =>
483+
input.addEventListener('input', (event) => {
484+
const target = event.target;
485+
const targetParentNode = target.parentNode;
486+
const invalidFeed = targetParentNode.querySelector('.invalid-feedback');
487+
488+
// принудительное исключение пробелов (в начале поля для ввода)
489+
target.value = target.value.replace(/^\s+/, '');
490+
491+
// только русские буквы (без цифр/символов), "один" дефис (для двойных фамилий) и без необоснованных пробелов
492+
if (
493+
/[^а-яА-ЯёЁ\s-]/.test(target.value) ||
494+
(target.value.match(/-/g) || []).length > 1 ||
495+
/\s{2,}/.test(target.value)
496+
) {
497+
target.classList.add('is-invalid');
498+
499+
if (/[^а-яА-ЯёЁ\s-]/.test(target.value)) {
500+
invalidFeed.textContent =
501+
'Некорректный ввод! Измените раскладку клавиатуры и/или исключите цифры/знаки!';
502+
} else if ((target.value.match(/-/g) || []).length > 1) {
503+
invalidFeed.textContent = 'Некорректный ввод! Только ОДИН дефис!';
504+
} else {
505+
invalidFeed.textContent =
506+
'Некорректный ввод! Только ОДИН пробел между словами!';
507+
}
508+
} else {
509+
target.classList.remove('is-invalid');
510+
invalidFeed.textContent = ''; // очистка сообщения об ошибке
511+
}
512+
})
513+
);
514+
}
515+
516+
const allAddModalFormInputs = document.querySelectorAll(
517+
'.modal__add-body-input'
518+
); // получение всех модальных-инпутов
519+
addModalFormInputValidation(allAddModalFormInputs);
451520
})();

0 commit comments

Comments
 (0)