Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
<meta name="viewport" content="width=device-width,initial-scale=1">
<link rel="stylesheet" href="css/normalize.css">
<link rel="stylesheet" href="css/style.css">
<link rel="stylesheet" href="vendor/nouislider/nouislider.css">
<link rel="shortcut icon" href="favicon.ico" type="image/x-icon">
<title>Кекстаграм</title>
</head>
Expand All @@ -31,7 +32,7 @@ <h2 class="pictures__title visually-hidden">Фотографии других
<section class="img-upload">
<div class="img-upload__wrapper">
<h2 class="img-upload__title visually-hidden">Загрузка фотографии</h2>
<form class="img-upload__form" id="upload-select-image" autocomplete="off">
<form class="img-upload__form" id="upload-select-image" method="post" action=" https://31.javascript.htmlacademy.pro/kekstagram" enctype="multipart/form-data" autocomplete="off">

<!-- Изначальное состояние поля для загрузки изображения -->
<fieldset class="img-upload__start">
Expand All @@ -40,7 +41,7 @@ <h2 class="img-upload__title visually-hidden">Загрузка фотограф
</fieldset>

<!-- Форма редактирования изображения -->
<div class="img-upload__overlay hidden">
<div class="img-upload__overlay hidden">
<div class="img-upload__wrapper">
<div class="img-upload__preview-container">

Expand Down Expand Up @@ -235,6 +236,8 @@ <h2 class="data-error__title">Не удалось загрузить данны
</section>
</template>
<script src="js/functions.js"></script>
<script src="vendor/nouislider/nouislider.js"></script>
<script src="vendor/pristine/pristine.min.js"></script>
<script src="js/main.js" type="module"></script>
</body>

Expand Down
18 changes: 9 additions & 9 deletions js/big-picture.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,16 +21,14 @@ let currentComments = [];
const onEscKeyDown = (evt) => {
if (isEscapeKey(evt)) {
closeBigPicture();
deleteComments();
}
};

const onPictureCancelClick = () => {
closeBigPicture();
deleteComments();
};

const renderNewCommentsStep = () => {
const onShowMoreButtonClick = () => {
const renderingNewComments = currentComments.slice(commentCount, commentCount + COMMENTS__STEP);
const newCommentsLength = renderingNewComments.length += commentCount;
const fragment = document.createDocumentFragment();
Expand All @@ -57,17 +55,17 @@ const renderNewCommentsStep = () => {

const renderComments = (currentPhotoComments) => {
currentComments = currentPhotoComments;
renderNewCommentsStep();
onShowMoreButtonClick();

buttonLoader.addEventListener('click', renderNewCommentsStep);
buttonLoader.addEventListener('click', onShowMoreButtonClick);
};

function deleteComments () {
const deleteComments = () => {
socialComments.innerHTML = '';
commentCount = 0;
buttonLoader.classList.remove('hidden');
buttonLoader.removeEventListener('click', renderNewCommentsStep);
}
buttonLoader.removeEventListener('click', onShowMoreButtonClick);
};

const renderBigPicture = (currentPhoto) => {
bigPictureImage.src = currentPhoto.url;
Expand All @@ -78,6 +76,8 @@ const renderBigPicture = (currentPhoto) => {
};

function closeBigPicture () {
deleteComments();

bigPicture.classList.add('hidden');
document.querySelector('body').classList.remove('modal-open');
document.removeEventListener('keydown', onEscKeyDown);
Expand Down Expand Up @@ -111,5 +111,5 @@ const setPicturesListener = (photos) => {
usersPhotoList.addEventListener('click', (evt) => onPictureContainerClick(evt, photos));
};

export { setPicturesListener };
export { setPicturesListener, onEscKeyDown };

51 changes: 51 additions & 0 deletions js/form/image-form.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import { isEscapeKey } from '../util';
import { initScale, resetScale } from './image-scale';
import { initValidation } from './validation';
import { initEffect, resetEffect } from './slider-effect';

const uploadForm = document.querySelector('.img-upload__form');
const uploadInput = uploadForm.querySelector('.img-upload__input');
const formOverlay = uploadForm.querySelector('.img-upload__overlay');
const buttonCloseUpload = uploadForm.querySelector('.img-upload__cancel');
const hashtagsInput = uploadForm.querySelector('.text__hashtags');
const descriptionInput = uploadForm.querySelector('.text__description');

const onEscKeyDown = (evt) => {
if (isEscapeKey(evt) && (document.activeElement !== hashtagsInput || document.activeElement !== descriptionInput)) {
closeUploadModal();
uploadForm.reset();
}
};
const onUploadCancelClick = () => {
closeUploadModal();
};

function closeUploadModal () {
formOverlay.classList.add('hidden');
document.querySelector('body').classList.remove('.modal-open');
document.removeEventListener('keydown', onEscKeyDown);
buttonCloseUpload.removeEventListener('click', onUploadCancelClick);

resetEffect();
resetScale();
uploadForm.reset();
}

const openUploadModal = () =>{
formOverlay.classList.remove('hidden');
document.querySelector('body').classList.add('.modal-open');
document.addEventListener('keydown', onEscKeyDown);
buttonCloseUpload.addEventListener('click', onUploadCancelClick);

initEffect();
initScale();
initValidation();
};

const initUploadModal = () => {
uploadInput.addEventListener('change', () => {
openUploadModal();
});
};

export { initUploadModal };
35 changes: 35 additions & 0 deletions js/form/image-scale.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
const scaleValue = document.querySelector('.scale__control--value');
const imagePrewiev = document.querySelector('.img-upload__preview img');
const buttonSmaller = document.querySelector('.scale__control--smaller');
const buttonBigger = document.querySelector('.scale__control--bigger');

let scale = 1;
const SCALE_STEP = 0.25;

const onButtonSmallerClick = () => {
if(scale > SCALE_STEP) {
scale -= SCALE_STEP;
imagePrewiev.style.transform = `scale(${scale})`;
scaleValue.value = `${scale * 100}%`;
}
};

const onButtonBiggerClick = () => {
if(scale < 1) {
scale += SCALE_STEP;
imagePrewiev.style.transform = `scale(${scale})`;
scaleValue.value = `${scale * 100}%`;
}
};

const initScale = () => {
buttonSmaller.addEventListener('click', onButtonSmallerClick);
buttonBigger.addEventListener('click', onButtonBiggerClick);
};

const resetScale = () => {
buttonBigger.removeEventListener('click', onButtonBiggerClick);
buttonSmaller.removeEventListener('click', onButtonSmallerClick);
};

export { initScale, resetScale };
72 changes: 72 additions & 0 deletions js/form/slider-effect.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
import { SLIDER_EFFECT_OPTIONS } from './slider-options';

const sliderElement = document.querySelector('.effect-level__slider');
const sliderContainer = document.querySelector('.img-upload__effect-level');
const imagePreview = document.querySelector('.img-upload__preview img');
const effectList = document.querySelector('.img-upload__effects');
const sliderEffectValue = document.querySelector('.effect-level__value');

let currentEffect = 'none';

const updateSliderEffect = (effect) => {
if(effect === 'none') {
sliderContainer.style.display = 'none';
imagePreview.style.filter = 'none';
} else {
sliderContainer.style.display = 'block';
}

sliderElement.noUiSlider.on('update', () => {
const sliderValue = sliderElement.noUiSlider.get();
sliderEffectValue.value = sliderValue;

const configSlider = SLIDER_EFFECT_OPTIONS[currentEffect];
if (currentEffect !== 'none') {
imagePreview.style.filter = `${configSlider.filter}(${sliderValue}${configSlider.measure})`;
}
});
};

const changeSliderOptions = () => {
const configSlider = SLIDER_EFFECT_OPTIONS[currentEffect];

sliderElement.noUiSlider.updateOptions({
range: {
min: configSlider.min,
max: configSlider.max
},
start: configSlider.max,
step: configSlider.step,
measure: configSlider.measure,
});

updateSliderEffect(currentEffect);
};

const initEffect = () => {
noUiSlider.create(sliderElement, {
connect: 'lower',
range: {
min: 0,
max: 100,
},
start: 100,
step: 0.1,
});

updateSliderEffect('none');
};

effectList.addEventListener('change', (evt) => {
if(evt.target.matches('.effects__radio')) {
currentEffect = evt.target.value;
}

changeSliderOptions();
});

const resetEffect = () => {
noUiSlider.destroy(sliderElement);
};

export { initEffect, resetEffect };
48 changes: 48 additions & 0 deletions js/form/slider-options.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
const SLIDER_EFFECT_OPTIONS = {
none: {
filter: 'none',
min: 0,
max: 100,
step: 1,
start: 100,
measure: '',
},
chrome: {
filter: 'grayscale',
min: 0,
max: 1,
step: 0.1,
start: 100,
measure: '',
},
sepia: {
filter: 'sepia',
min: 0,
max: 1,
step: 0.1,
measure: '',
},
marvin: {
filter: 'invert',
min: 0,
max: 100,
step: 1,
measure: '%',
},
phobos: {
filter: 'blur',
min: 0,
max: 3,
step: 0.1,
measure: 'px',
},
heat: {
filter: 'brightness',
min: 0,
max: 3,
step: 0.1,
measure: '',
},
};

export { SLIDER_EFFECT_OPTIONS };
70 changes: 70 additions & 0 deletions js/form/validation.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
const uploadForm = document.querySelector('.img-upload__form');
const hashtagsInput = uploadForm.querySelector('.text__hashtags');
const descriptionInput = uploadForm.querySelector('.text__description');

const MAX_QUATITY = 5;
const MAX_QUANTITY_SIMBOL = 140;

let errorMessage = '';

const pristine = new Pristine(uploadForm, {
classTo: 'img-upload__form',
errorTextParent: 'img-upload__field-wrapper',
errorTextClass: 'img-upload__field-wrapper--error',
});

const checkRules = [
{
check: (inputArray) => inputArray.some((element) => !/^#[a-zа-яё1-9]{1,19}$/i.test(element)),
error: 'Не допустимые символы!'
},
{
check: (inputArray) => inputArray.length > MAX_QUATITY,
error: `Не более ${MAX_QUATITY} хэштегов!`
},
{
check: (inputArray) => inputArray.some((element, num, Array) => Array.includes(element, num + 1)),
error: 'Хэштэги не должны повторяться!'
},
];

const validHashtags = (value) => {
const inputText = value.toLowerCase().trim();
const inputArray = inputText.split(' ');

if(inputText.length === 0){
return true;
}

const checks = checkRules.every((ruleValidate) => {
const isInvalid = ruleValidate.check(inputArray);

if(isInvalid) {
errorMessage = ruleValidate.error;
}

return !isInvalid;
});

return checks;
};

const validDescription = (value) => {
const inputCommentArray = value;
inputCommentArray.split(' ');

const isInvalid = inputCommentArray.length > MAX_QUANTITY_SIMBOL;

if (isInvalid){
errorMessage = `Не более ${MAX_QUANTITY_SIMBOL} символов!`;
}

return !isInvalid;
};

const initValidation = () => {
pristine.addValidator(hashtagsInput, validHashtags, () => errorMessage);
pristine.addValidator(descriptionInput, validDescription, () => errorMessage);
};

export { initValidation };
2 changes: 2 additions & 0 deletions js/main.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
import { generatePhotos } from './generator';
import { renderThumbnails } from './render-thumbnails';
import { setPicturesListener } from './big-picture';
import { initUploadModal } from './form/image-form';

const photos = generatePhotos();
renderThumbnails(photos);
setPicturesListener(photos);
initUploadModal();


1 change: 0 additions & 1 deletion js/util.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,5 +27,4 @@ const getRandomArrayElement = (elements) => elements[getRandomInteger(0, element
const isEscapeKey = (evt) => evt.key === 'Escape';
const isEnterKey = (evt) => evt.key === 'Enter';


export { getRandomInteger, createPreviousRangeGenerator, getRandomArrayElement, isEscapeKey, isEnterKey };
Loading