Skip to content

Commit 6417286

Browse files
authored
Merge pull request #10 from Julyova/module9-task1
2 parents 1c0d94f + 563f6a5 commit 6417286

3 files changed

Lines changed: 98 additions & 0 deletions

File tree

index.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,7 @@ <h2 class="data-error__title">Не удалось загрузить данны
237237

238238
<script type="module" src="js/main.js"></script>
239239
<script type="module" src="js/functions.js"></script>
240+
<script src="vendor/pristine/pristine.min.js"></script>
240241

241242
</body>
242243

js/form-upload.js

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
const uploadFileInput = document.querySelector('.img-upload__input');
2+
const uploadOverlay = document.querySelector('.img-upload__overlay');
3+
const uploadForm = document.querySelector('#upload-select-image');
4+
const uploadCancel = document.querySelector('#upload-cancel');
5+
const hashtagsInput = document.querySelector('.text__hashtags');
6+
const descriptionInput = document.querySelector('.text__description');
7+
8+
const MAX_HASHTAGS = 5;
9+
const MAX_HASHTAG_LENGTH = 20;
10+
const VALID_HASHTAG_REGEX = /^#[a-яёa-z0-9]{1,19}$/i;
11+
12+
const pristine = new Pristine(uploadForm, {
13+
classTo: 'img-upload__field-wrapper',
14+
errorClass: 'img-upload__field-wrapper--error',
15+
successClass: 'img-upload__field-wrapper--success',
16+
errorTextParent: 'img-upload__field-wrapper',
17+
errorTextTag: 'span',
18+
errorTextClass: 'img-upload__field-wrapper__error'
19+
});
20+
21+
const validateHashtags = (value) => {
22+
if (!value.trim()) {
23+
return true;
24+
}
25+
26+
const hashtags = value.trim().split(/\s+/);
27+
28+
if (hashtags.length > MAX_HASHTAGS) {
29+
return false;
30+
}
31+
32+
const lowerHashtags = hashtags.map((tag) => tag.toLowerCase());
33+
const uniqueHashtags = new Set(lowerHashtags);
34+
35+
if (uniqueHashtags.size !== hashtags.length) {
36+
return false;
37+
}
38+
39+
return hashtags.every((hashtag) => {
40+
if (hashtag.length > MAX_HASHTAG_LENGTH) {
41+
return false;
42+
}
43+
return VALID_HASHTAG_REGEX.test(hashtag);
44+
});
45+
};
46+
47+
const validateDescription = (value) => value.length <= 140;
48+
49+
pristine.addValidator(hashtagsInput, validateHashtags, 'Ошибка в хэш-тегах');
50+
pristine.addValidator(descriptionInput, validateDescription, 'Комментарий не должен быть длинее 140 символов');
51+
52+
const openForm = () => {
53+
uploadOverlay.classList.remove('hidden');
54+
document.body.classList.add('modal-open');
55+
};
56+
57+
const closeForm = () => {
58+
uploadOverlay.classList.add('hidden');
59+
document.body.classList.remove('modal-open');
60+
uploadForm.reset();
61+
pristine.reset();
62+
};
63+
64+
const onUploadFileInputChange = () => {
65+
openForm();
66+
};
67+
68+
const onUploadCancelClick = () => {
69+
closeForm();
70+
};
71+
72+
const onUploadFormSubmit = (evt) => {
73+
evt.preventDefault();
74+
if (pristine.validate()) {
75+
uploadForm.submit();
76+
}
77+
};
78+
79+
const onDocumentKeydown = (evt) => {
80+
if (evt.key === 'Escape' && !uploadOverlay.classList.contains('hidden')) {
81+
const activeElement = document.activeElement;
82+
if (activeElement !== hashtagsInput && activeElement !== descriptionInput) {
83+
closeForm();
84+
}
85+
}
86+
};
87+
88+
const initFormUpload = () => {
89+
uploadFileInput.addEventListener('change', onUploadFileInputChange);
90+
uploadCancel.addEventListener('click', onUploadCancelClick);
91+
uploadForm.addEventListener('submit', onUploadFormSubmit);
92+
document.addEventListener('keydown', onDocumentKeydown);
93+
};
94+
95+
export { initFormUpload };

js/main.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@
33
import { getArrayMiniatures } from './createArrayMiniatures.js';
44
import { renderPictures } from './pictures.js';
55
import { initBigPictureHandlers } from './big-picture.js';
6+
import { initFormUpload } from './form-upload.js';
67

78
const pictures = getArrayMiniatures();
89
renderPictures(pictures);
910
initBigPictureHandlers();
11+
initFormUpload();
1012

0 commit comments

Comments
 (0)