Skip to content

Commit 004044b

Browse files
authored
Merge pull request #10 from yakovenko79/module9-task1
2 parents 98020db + 0715b8e commit 004044b

7 files changed

Lines changed: 147 additions & 43 deletions

File tree

index.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ <h2 class="pictures__title visually-hidden">Фотографии других
3030
<section class="img-upload">
3131
<div class="img-upload__wrapper">
3232
<h2 class="img-upload__title visually-hidden">Загрузка фотографии</h2>
33-
<form class="img-upload__form" id="upload-select-image" autocomplete="off">
33+
<form class="img-upload__form" id="upload-select-image" method="post" action="https://31.javascript.htmlacademy.pro/kekstagram" enctype="multipart/form-data" autocomplete="off">
3434

3535
<!-- Изначальное состояние поля для загрузки изображения -->
3636
<fieldset class="img-upload__start">
@@ -119,7 +119,7 @@ <h2 class="img-upload__title visually-hidden">Загрузка фотограф
119119
<input class="text__hashtags" name="hashtags" placeholder="#ХэшТег">
120120
</div>
121121
<div class="img-upload__field-wrapper">
122-
<textarea class="text__description" name="description" placeholder="Ваш комментарий..."></textarea>
122+
<textarea class="text__description" name="description" maxlength="140" placeholder="Ваш комментарий..."></textarea>
123123
</div>
124124
</fieldset>
125125

@@ -233,7 +233,7 @@ <h2 class="success__title">Изображение успешно загруже
233233
<h2 class="data-error__title">Не удалось загрузить данные</h2>
234234
</section>
235235
</template>
236-
236+
<script src="vendor/pristine/pristine.min.js"></script>
237237
<script src="js/main.js" type="module"></script>
238238
<script src="js/functions.js"></script>
239239
</body>

js/create-comments.js

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ const commentsLoader = modal.querySelector('.social__comments-loader');
88
let currentAmountComments = 0;
99
let comments = [];
1010

11-
function onNextComment() {
11+
function loadComments() {
1212
const fragment = document.createDocumentFragment();
1313
const nextComments = comments.slice(currentAmountComments, currentAmountComments + COMMENTS_STEP);
1414
currentAmountComments += nextComments.length;
@@ -37,11 +37,15 @@ function clearComments() {
3737
commentsLoader.classList.remove('hidden');
3838
}
3939

40+
function onCommentsLoaderClick(){
41+
loadComments();
42+
}
43+
4044
function createComments(currentComments) {
4145
comments = currentComments;
42-
commentsLoader.removeEventListener('click', onNextComment);
43-
commentsLoader.addEventListener('click', onNextComment);
44-
commentsLoader.click();
46+
loadComments();
4547
}
4648

49+
commentsLoader.addEventListener('click', onCommentsLoaderClick);
50+
4751
export { createComments, clearComments };

js/functions.js

Lines changed: 0 additions & 33 deletions
This file was deleted.

js/hashtag-validator.js

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
const MAX_HASHTAG_SYMBOLS = 20;
2+
const MAX_HASHTAGS = 5;
3+
4+
5+
let errorMessage = '';
6+
7+
function error() {
8+
return errorMessage;
9+
}
10+
11+
function isHashtagValid(value){
12+
errorMessage = '';
13+
const inputText = value.toLowerCase().trim();
14+
15+
if(inputText.lenght === 0){
16+
return true;
17+
}
18+
19+
const inputTextsArray = inputText.split(/\s+/);
20+
21+
const validateRules = [
22+
{
23+
check: inputTextsArray.some((item) => item === '#'),
24+
error: 'Хештег не может состоять только из решетки'
25+
},
26+
{
27+
check: inputTextsArray.some((item) => item.slice(1).includes('#')),
28+
error: 'Хештеги разделяются пробелами'
29+
},
30+
{
31+
check: inputTextsArray.some((item) => item[0] !== '#'),
32+
error: 'Хештег должен начинаться с символа "#"'
33+
},
34+
{
35+
check: inputTextsArray.some((item, num, array) => array.includes(item, num + 1)),
36+
error: 'Хештеги не должны повторяться'
37+
},
38+
{
39+
check: inputTextsArray.some((item) => item.length > MAX_HASHTAG_SYMBOLS),
40+
error: `Хештег должен содержать не более ${MAX_HASHTAG_SYMBOLS} символов, включая "#"`
41+
},
42+
{
43+
check: inputTextsArray.length > MAX_HASHTAGS,
44+
error: `Максимально допустимое количество хештегов - ${MAX_HASHTAGS}`
45+
},
46+
{
47+
check: inputTextsArray.some((item) => !/^#[a-zа-яё0-9]{1,19}$/i.test(item)),
48+
error: 'Хештег содержит недопустимые символы'
49+
}
50+
];
51+
52+
return validateRules.every((rule) => {
53+
const isInvalid = rule.check;
54+
if(isInvalid){
55+
errorMessage = rule.error;
56+
}
57+
return !isInvalid;
58+
});
59+
}
60+
61+
export { isHashtagValid, error };

js/main.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { createThumbnails } from './thumbnails';
22
import { getPhotos } from './generate-data.js';
3+
import { initUploadModal } from './upload-photo-form.js';
34

45
const photos = getPhotos();
56

67
createThumbnails(photos);
7-
8-
8+
initUploadModal();

js/thumbnails.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,4 @@ function createThumbnails(photos) {
3434
attachEvents(photos);
3535
}
3636

37-
export { createThumbnails, pictures };
37+
export { createThumbnails };

js/upload-photo-form.js

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
import { isHashtagValid, error } from './hashtag-validator';
2+
import { isEscapeKey } from './utils';
3+
4+
const uploadForm = document.querySelector('.img-upload__form');
5+
const pageBody = document.body;
6+
7+
const uploadFileControl = uploadForm.querySelector('#upload-file');
8+
const photoEditorForm = uploadForm.querySelector('.img-upload__overlay');
9+
const resetPhotoEditorFormButton = uploadForm.querySelector('.img-upload__cancel');
10+
11+
const hashtagInput = uploadForm.querySelector('.text__hashtags');
12+
const commentInput = uploadForm.querySelector('.text__description');
13+
14+
function onResetFormButton(){
15+
closePhotoEditorForm();
16+
}
17+
18+
function onDocumentKeyDown(evt) {
19+
if(isEscapeKey(evt)){
20+
if(document.activeElement === hashtagInput || document.activeElement === commentInput){
21+
evt.stopPropagation();
22+
} else {
23+
uploadForm.reset();
24+
closePhotoEditorForm();
25+
}
26+
}
27+
}
28+
29+
const pristine = new Pristine(uploadForm, {
30+
classTo: 'img-upload__field-wrapper',
31+
errorClass: 'img-upload__field-wrapper--error',
32+
errorTextParent: 'img-upload__field-wrapper',
33+
});
34+
35+
function closePhotoEditorForm(){
36+
photoEditorForm.classList.add('hidden');
37+
pageBody.classList.remove('modal-open');
38+
resetPhotoEditorFormButton.removeEventListener('click', onResetFormButton);
39+
document.removeEventListener('keydown', onDocumentKeyDown);
40+
uploadFileControl.value = '';
41+
pristine.reset();
42+
43+
}
44+
45+
function initUploadModal() {
46+
uploadFileControl.addEventListener('change', () => {
47+
photoEditorForm.classList.remove('hidden');
48+
pageBody.classList.add('modal-open');
49+
resetPhotoEditorFormButton.addEventListener('click', onResetFormButton);
50+
document.addEventListener('keydown', onDocumentKeyDown);
51+
});
52+
}
53+
54+
function onHashtagInput() {
55+
isHashtagValid(hashtagInput.value);
56+
}
57+
58+
function onFormSubmit(evt) {
59+
evt.preventDefault();
60+
if(pristine.validate()) {
61+
hashtagInput.value = hashtagInput.value.trim().replaceAll(/\s+/g, ' ');
62+
uploadForm.submit();
63+
}
64+
}
65+
66+
pristine.addValidator(hashtagInput, isHashtagValid, error, 2, false);
67+
68+
hashtagInput.addEventListener('input', onHashtagInput);
69+
70+
uploadForm.addEventListener('submit', onFormSubmit);
71+
72+
export { initUploadModal };

0 commit comments

Comments
 (0)