Skip to content

Commit

Permalink
Merge pull request #10 from OlegSulitskii/module9-task2
Browse files Browse the repository at this point in the history
Module9-task2 (Помощь друга)
  • Loading branch information
AlSudar authored Feb 26, 2025
2 parents d015785 + 30812ed commit fb67e55
Show file tree
Hide file tree
Showing 8 changed files with 346 additions and 9 deletions.
11 changes: 7 additions & 4 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<link rel="stylesheet" href="vendor/nouislider/nouislider.css">
<link rel="stylesheet" href="css/normalize.css">
<link rel="stylesheet" href="css/style.css">
<link rel="shortcut icon" href="favicon.ico" type="image/x-icon">
Expand Down Expand Up @@ -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" enctype="multipart/form-data" action="https://31.javascript.htmlacademy.pro/kekstagram" 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 All @@ -58,7 +59,7 @@ <h2 class="img-upload__title visually-hidden">Загрузка фотограф

<!-- Изменение глубины эффекта, накладываемого на изображение -->
<fieldset class="img-upload__effect-level effect-level">
<input class="effect-level__value" type="number" step="any" name="effect-level" value="">
<input class="effect-level__value" type="text" step="any" name="effect-level" value="">
<div class="effect-level__slider"></div>
</fieldset>

Expand Down Expand Up @@ -117,7 +118,7 @@ <h2 class="img-upload__title visually-hidden">Загрузка фотограф
<!-- Добавление хэштегов и комментария к изображению -->
<fieldset class="img-upload__text text">
<div class="img-upload__field-wrapper">
<input class="text__hashtags" name="hashtags" placeholder="#ХэшТег">
<input type="text" class="text__hashtags" name="hashtags" placeholder="#ХэшТег">
</div>
<div class="img-upload__field-wrapper">
<textarea class="text__description" name="description" placeholder="Ваш комментарий..."></textarea>
Expand Down Expand Up @@ -235,6 +236,8 @@ <h2 class="data-error__title">Не удалось загрузить данны
</section>
</template>

<script src="vendor/pristine/pristine.min.js" type="text/javascript"></script>
<script src="vendor/nouislider/nouislider.js" type="text/javascript"></script>
<script src="js/main.js" type="module"></script>
</body>

Expand Down
141 changes: 141 additions & 0 deletions js/effects.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
const imgUploadElement = document.querySelector('.img-upload__preview img');
const effectLevelElement = document.querySelector('.img-upload__effect-level');
const effectLevelValueElement = effectLevelElement.querySelector('.effect-level__value');
const effectLevelSliderElement = effectLevelElement.querySelector('.effect-level__slider');
const effectNoneElement = document.querySelector('#effect-none');
const effectChromeElement = document.querySelector('#effect-chrome');
const effectSepiaElement = document.querySelector('#effect-sepia');
const effectMarvinElement = document.querySelector('#effect-marvin');
const effectPhobosElement = document.querySelector('#effect-phobos');
const effectHeatElement = document.querySelector('#effect-heat');

noUiSlider.create(effectLevelSliderElement, {
range: {
min: 0,
max: 1,
},
start: 1,
step: 0.1,
connect: 'lower',
format: {
to: function (value) {
if (Number.isInteger(value)) {
return value.toFixed(0);
}
return value.toFixed(1);
},
from: function (value) {
return parseFloat(value);
},
},
});

const filterChange = (filter, unit) => {
effectLevelSliderElement.noUiSlider.on('update', () => {
effectLevelValueElement.setAttribute('value', effectLevelSliderElement.noUiSlider.get() + unit);
imgUploadElement.style.filter = `${ filter }(${ effectLevelValueElement.getAttribute('value') })`;
});
};

const resetEffects = () => {
effectLevelValueElement.removeAttribute('value');
imgUploadElement.style.filter = '';
effectLevelElement.classList.add('hidden');
};

const getSettingsEffectGrayscalSepia = () => {
effectLevelSliderElement.noUiSlider.updateOptions({
range: {
min: 0,
max: 1,
},
start: 1,
step: 0.1,
});
};

const getSettingsEffectMarvin = () => {
effectLevelSliderElement.noUiSlider.updateOptions({
range: {
min: 0,
max: 100,
},
start: 100,
step: 1,
});
};

const getSettingsEffectPhobos = () => {
effectLevelSliderElement.noUiSlider.updateOptions({
range: {
min: 0,
max: 3,
},
start: 3,
step: 0.1,
});
};

const getSettingsEffectHeat = () => {
effectLevelSliderElement.noUiSlider.updateOptions({
range: {
min: 1,
max: 3,
},
start: 3,
step: 0.1,
});
};

const effectsEventListener = () => {
effectNoneElement.addEventListener('change', (evt) => {
if (evt.target.checked) {
resetEffects();
}
});

effectChromeElement.addEventListener('change', (evt) => {
if (evt.target.checked) {
effectLevelElement.classList.remove('hidden');
filterChange('grayscale','');
getSettingsEffectGrayscalSepia();
}
});

effectSepiaElement.addEventListener('change', (evt) => {
if (evt.target.checked) {
effectLevelElement.classList.remove('hidden');
filterChange('sepia','');
getSettingsEffectGrayscalSepia();
}
});

effectMarvinElement.addEventListener('change', (evt) => {
if (evt.target.checked) {
effectLevelElement.classList.remove('hidden');
filterChange('invert','%');
getSettingsEffectMarvin();
}
});

effectPhobosElement.addEventListener('change', (evt) => {
if (evt.target.checked) {
effectLevelElement.classList.remove('hidden');
filterChange('blur','px');
getSettingsEffectPhobos();
}
});

effectHeatElement.addEventListener('change', (evt) => {
if (evt.target.checked) {
effectLevelElement.classList.remove('hidden');
filterChange('brightness','');
getSettingsEffectHeat();
}
});
};

export {
effectsEventListener,
resetEffects
};
48 changes: 48 additions & 0 deletions js/img-scale-change.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
const imgUploadPreviewContainerElement = document.querySelector('.img-upload__preview-container');
const imgUploadPreviewElement = imgUploadPreviewContainerElement.querySelector('.img-upload__preview');
const imgUploadElement = imgUploadPreviewElement.querySelector('img');
const scaleElement = imgUploadPreviewContainerElement.querySelector('.scale');
const scaleControlValueElement = scaleElement.querySelector('.scale__control--value');
const scaleControlSmallerElement = scaleElement.querySelector('.scale__control--smaller');
const scaleControlBiggerElement = scaleElement.querySelector('.scale__control--bigger');

const SCALE_STEP = 25;
const SCALE_MIN_VALUE = 25;
const SCALE_MAX_VALUE = 100;
const SCALE_NORMAL_VALUE = 100;

let currentScaleValue = SCALE_NORMAL_VALUE;

const scaleActions = () => {
scaleControlValueElement.setAttribute('value', `${currentScaleValue }%`);
const clearPersentValue = scaleControlValueElement.value.replace('%', '') * 0.01;
imgUploadElement.style.scale = clearPersentValue;
};

const scaleControlSmallerElementClick = () => {
currentScaleValue = Math.max(currentScaleValue - SCALE_STEP, SCALE_MIN_VALUE);
scaleActions();
};

const scaleControlBiggerElementClick = () => {
currentScaleValue = Math.min(currentScaleValue + SCALE_STEP, SCALE_MAX_VALUE);
scaleActions();
};

const scaleControlEventListener = () => {
scaleControlSmallerElement.addEventListener(('click'), scaleControlSmallerElementClick);
scaleControlBiggerElement.addEventListener(('click'), scaleControlBiggerElementClick);
scaleActions();
};

const normalizeScale = () => {
scaleControlSmallerElement.removeEventListener(('click'), scaleControlSmallerElementClick);
scaleControlBiggerElement.removeEventListener(('click'), scaleControlBiggerElementClick);
currentScaleValue = SCALE_NORMAL_VALUE;
scaleActions();
};

export {
scaleControlEventListener,
normalizeScale
};
5 changes: 4 additions & 1 deletion js/main.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
import { getArrayPosts } from './create-array-posts.js';
import { renderTumbnails } from './render-tumbnails.js';
import { onOffBigPicture } from './on-off-big-picture.js';
import { registerEventsOpenImgUpload } from './on-off-img-upload.js';
import { initValidation } from './validation-hashtags-and-comments.js';

const getArrayPostsClone = structuredClone(getArrayPosts);

renderTumbnails(getArrayPostsClone);

onOffBigPicture(getArrayPostsClone);
registerEventsOpenImgUpload();
initValidation();
6 changes: 2 additions & 4 deletions js/on-off-big-picture.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,6 @@ const bigPictureCloseActions = () => {
};

const registerEventsCloseBigPicture = () => {
bigPictureCloseActions();

bigPictureCloseElement.addEventListener('click', () => {
bigPictureCloseActions();
});
Expand All @@ -45,9 +43,9 @@ const pushDataBigPicture = ({photo, likes, description}) => {

const onOffBigPicture = (data) => {
picturesElement.addEventListener('click', (evt) => {
evt.preventDefault();

if(evt.target.closest('.picture')) {
evt.preventDefault();

openBigPicture();

const getDataTargetPost = data.find((element) => {
Expand Down
76 changes: 76 additions & 0 deletions js/on-off-img-upload.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
import { scaleControlEventListener, normalizeScale } from './img-scale-change.js';
import { resetEffects, effectsEventListener } from './effects.js';

const bodyElement = document.querySelector('body');
const imgUploadElement = bodyElement.querySelector('.img-upload');
const imgUploadInputElement = imgUploadElement.querySelector('.img-upload__input');
const imgUploadOverlayElement = imgUploadElement.querySelector('.img-upload__overlay');
const imgUploadCancelElement = imgUploadElement.querySelector('.img-upload__cancel');
const hashtagInputElement = imgUploadOverlayElement.querySelector('.text__hashtags');
const commentInputElement = imgUploadOverlayElement.querySelector('.text__description');
const imgUploadFormElement = imgUploadElement.querySelector('.img-upload__form');

const resetErrorClass = () => {
const imgUploadFieldWrapperList = imgUploadOverlayElement.querySelectorAll('.img-upload__field-wrapper');
imgUploadFieldWrapperList.forEach((item) => {
item.classList.remove('img-upload__field-wrapper--error');
});
};

const resetErrorText = () => {
const pristineErrorList = imgUploadOverlayElement.querySelectorAll('.pristine-error');
pristineErrorList.forEach((item) => {
item.textContent = '';
});
};

const imgCloseActions = () => {
imgUploadOverlayElement.classList.add('hidden');
bodyElement.classList.remove('modal-open');
imgUploadInputElement.value = '';
hashtagInputElement.value = '';
commentInputElement.value = '';
resetErrorClass();
resetErrorText();
normalizeScale();
};

const imgUploadCancelElementClick = () => {
removeEventsCloseImgUpload();
imgCloseActions();
};

const onDocumentKeydown = (evt) => {
if (evt.key === 'Escape'){
evt.preventDefault();
if(document.activeElement === hashtagInputElement || document.activeElement === commentInputElement){
evt.stopPropagation();
bodyElement.classList.add('modal-open');
} else {
removeEventsCloseImgUpload();
imgCloseActions();
imgUploadFormElement.reset();
}
}
};

function removeEventsCloseImgUpload () {
document.removeEventListener('keydown', onDocumentKeydown);
imgUploadCancelElement.removeEventListener('click', imgUploadCancelElementClick);
}

const registerEventsOpenImgUpload = () => {
imgUploadInputElement.addEventListener('change', () => {
imgUploadOverlayElement.classList.remove('hidden');
bodyElement.classList.add('modal-open');
imgUploadCancelElement.addEventListener('click', imgUploadCancelElementClick);
document.addEventListener('keydown', onDocumentKeydown);
scaleControlEventListener();
resetEffects();
effectsEventListener();
});
};

export {
registerEventsOpenImgUpload
};
1 change: 1 addition & 0 deletions js/render-comments.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ const renderCommentsBySteps = () => {
});

socialCommentsElement.append(listCommentsFragment);

commentsShownCountElement.textContent = visibleCommentsLength;
commentsTotalCountElement.textContent = allComments.length;

Expand Down
Loading

0 comments on commit fb67e55

Please sign in to comment.