Skip to content

Commit 73cf1bc

Browse files
authored
Merge pull request #10 from zarram89/module9-task2
2 parents 1addf9e + 369be83 commit 73cf1bc

4 files changed

Lines changed: 167 additions & 0 deletions

File tree

js/ui/form/effect.js

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
const EFFECTS = [
2+
{ name: 'none', style: 'none', min: 0, max: 100, step: 1, unit: '' },
3+
{ name: 'chrome', style: 'grayscale', min: 0, max: 1, step: 0.1, unit: '' },
4+
{ name: 'sepia', style: 'sepia', min: 0, max: 1, step: 0.1, unit: '' },
5+
{ name: 'marvin', style: 'invert', min: 0, max: 100, step: 1, unit: '%' },
6+
{ name: 'phobos', style: 'blur', min: 0, max: 3, step: 0.1, unit: 'px' },
7+
{ name: 'heat', style: 'brightness', min: 1, max: 3, step: 0.1, unit: '' },
8+
];
9+
10+
const DEFAULT_EFFECT = EFFECTS[0];
11+
12+
const EFFECTS_MAP = Object.fromEntries(
13+
EFFECTS.map((effect) => [effect.name, effect])
14+
);
15+
16+
let chosenEffect = DEFAULT_EFFECT;
17+
18+
const imageElement = document.querySelector('.img-upload__preview img');
19+
const effectsElement = document.querySelector('.effects');
20+
const sliderElement = document.querySelector('.effect-level__slider');
21+
const sliderContainerElement = document.querySelector('.img-upload__effect-level');
22+
const effectLevelElement = document.querySelector('.effect-level__value');
23+
24+
const isDefault = () => chosenEffect.name === 'none';
25+
26+
const showSlider = () => {
27+
sliderContainerElement.classList.remove('hidden');
28+
};
29+
30+
const hideSlider = () => {
31+
sliderContainerElement.classList.add('hidden');
32+
};
33+
34+
const removeEffectClasses = () => {
35+
EFFECTS.forEach((effect) => {
36+
imageElement.classList.remove(`effects__preview--${effect.name}`);
37+
});
38+
};
39+
40+
const applyEffectClass = () => {
41+
removeEffectClasses();
42+
imageElement.classList.add(`effects__preview--${chosenEffect.name}`);
43+
};
44+
45+
const updateSlider = () => {
46+
sliderElement.noUiSlider.updateOptions({
47+
range: {
48+
min: chosenEffect.min,
49+
max: chosenEffect.max,
50+
},
51+
start: chosenEffect.max,
52+
step: chosenEffect.step,
53+
});
54+
55+
if (isDefault()) {
56+
hideSlider();
57+
} else {
58+
showSlider();
59+
}
60+
};
61+
62+
const onEffectsChange = (evt) => {
63+
if (!evt.target.classList.contains('effects__radio')) {
64+
return;
65+
}
66+
67+
chosenEffect = EFFECTS_MAP[evt.target.value];
68+
69+
applyEffectClass();
70+
updateSlider();
71+
};
72+
73+
const onSliderUpdate = () => {
74+
const sliderValue = Number(sliderElement.noUiSlider.get());
75+
76+
imageElement.style.filter = isDefault()
77+
? 'none'
78+
: `${chosenEffect.style}(${sliderValue}${chosenEffect.unit})`;
79+
80+
effectLevelElement.value = sliderValue;
81+
};
82+
83+
const resetEffects = () => {
84+
chosenEffect = DEFAULT_EFFECT;
85+
86+
removeEffectClasses();
87+
imageElement.style.filter = 'none';
88+
effectLevelElement.value = '';
89+
90+
updateSlider();
91+
};
92+
93+
const initEffects = () => {
94+
noUiSlider.create(sliderElement, {
95+
range: {
96+
min: DEFAULT_EFFECT.min,
97+
max: DEFAULT_EFFECT.max,
98+
},
99+
start: DEFAULT_EFFECT.max,
100+
step: DEFAULT_EFFECT.step,
101+
connect: 'lower',
102+
});
103+
104+
hideSlider();
105+
resetEffects();
106+
107+
effectsElement.addEventListener('change', onEffectsChange);
108+
sliderElement.noUiSlider.on('update', onSliderUpdate);
109+
};
110+
111+
export { initEffects, resetEffects };

js/ui/form/index.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
import { initModal } from './modal.js';
22
import { initValidation, resetValidation } from './validation.js';
33
import { initSubmit } from './submit.js';
4+
import { initScale } from './scale.js';
5+
import { initEffects } from './effect.js';
46

57
const initForm = () => {
68
initValidation();
79
initSubmit();
10+
initScale();
11+
initEffects();
812

913
initModal(() => {
1014
resetValidation();

js/ui/form/modal.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import { isEscapeKey } from '../../utils/common.js';
2+
import { resetScale } from './scale.js';
3+
import { resetEffects } from './effect.js';
24

35
const body = document.body;
46
const form = document.querySelector('.img-upload__form');
@@ -17,6 +19,8 @@ const showModal = () => {
1719
const hideModal = () => {
1820
form.reset();
1921
fileField.value = '';
22+
resetScale();
23+
resetEffects();
2024

2125
overlay.classList.add('hidden');
2226
body.classList.remove('modal-open');

js/ui/form/scale.js

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
const SCALE_STEP = 25;
2+
const MIN_SCALE = 25;
3+
const MAX_SCALE = 100;
4+
const DEFAULT_SCALE = 100;
5+
6+
const modalElement = document.querySelector('.img-upload');
7+
const smallerButtonElement = modalElement.querySelector('.scale__control--smaller');
8+
const biggerButtonElement = modalElement.querySelector('.scale__control--bigger');
9+
const scaleInputElement = modalElement.querySelector('.scale__control--value');
10+
const imageElement = modalElement.querySelector('.img-upload__preview img');
11+
12+
const getScaleValue = () =>
13+
Number(scaleInputElement.value.replace('%', ''));
14+
15+
const scaleImage = (value) => {
16+
imageElement.style.transform = `scale(${value / 100})`;
17+
scaleInputElement.value = `${value}%`;
18+
};
19+
20+
const changeScale = (delta) => {
21+
const currentValue = getScaleValue();
22+
let newValue = currentValue + delta;
23+
24+
if (newValue < MIN_SCALE) {
25+
newValue = MIN_SCALE;
26+
}
27+
if (newValue > MAX_SCALE) {
28+
newValue = MAX_SCALE;
29+
}
30+
31+
scaleImage(newValue);
32+
};
33+
34+
const onSmallerButtonClick = () => changeScale(-SCALE_STEP);
35+
const onBiggerButtonClick = () => changeScale(SCALE_STEP);
36+
37+
const resetScale = () => {
38+
scaleImage(DEFAULT_SCALE);
39+
};
40+
41+
const initScale = () => {
42+
scaleImage(DEFAULT_SCALE);
43+
44+
smallerButtonElement.addEventListener('click', onSmallerButtonClick);
45+
biggerButtonElement.addEventListener('click', onBiggerButtonClick);
46+
};
47+
48+
export { initScale, resetScale };

0 commit comments

Comments
 (0)