Skip to content

Commit 2f79e20

Browse files
authored
Merge pull request #10 from natalya87324/module9-task2
Помощь друга
2 parents c60daa8 + 503bc6b commit 2f79e20

File tree

3 files changed

+177
-5
lines changed

3 files changed

+177
-5
lines changed

index.html

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
<meta charset="utf-8">
66
<meta name="viewport" content="width=device-width,initial-scale=1">
77
<link rel="stylesheet" href="css/normalize.css">
8+
<link rel="stylesheet" href="vendor/nouislider/nouislider.css">
89
<link rel="stylesheet" href="css/style.css">
910
<link rel="shortcut icon" href="favicon.ico" type="image/x-icon">
1011
<title>Кекстаграм</title>
@@ -252,6 +253,7 @@ <h2 class="data-error__title">Не удалось загрузить данны
252253
</template>
253254

254255
<script src="./vendor/pristine/pristine.min.js"></script>
256+
<script src="./vendor/nouislider/nouislider.js"></script>
255257
<script src="./js/main.js" type="module"></script>
256258
</body>
257259

js/update-photo-mode.js

Lines changed: 167 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,167 @@
1+
const SCALE_STEP = 25;
2+
3+
const Scale = {
4+
MIN: 25,
5+
MAX: 100
6+
};
7+
8+
const scaleValueField = document.querySelector('.scale__control--value');
9+
const scaleDownBtn = document.querySelector('.scale__control--smaller');
10+
const scaleUpBtn = document.querySelector('.scale__control--bigger');
11+
const preview = document.querySelector('.img-upload__preview img');
12+
const sliderContainer = document.querySelector('.img-upload__effect-level');
13+
const sliderElement = document.querySelector('.effect-level__slider');
14+
const effectLevel = document.querySelector('.effect-level__value');
15+
const effectItems = document.querySelectorAll('.effects__radio');
16+
17+
let currentScale = Number.parseInt(scaleValueField.value, 10);
18+
let currentEffect = null;
19+
20+
const effects = [
21+
{
22+
name: 'chrome',
23+
options: {
24+
range: {
25+
min: 0,
26+
max: 1
27+
},
28+
start: 0,
29+
step: 0.1
30+
},
31+
setFilter: (value) => `grayscale(${value})`
32+
},
33+
{
34+
name: 'sepia',
35+
options: {
36+
range: {
37+
min: 0,
38+
max: 1
39+
},
40+
start: 0,
41+
step: 0.1
42+
},
43+
setFilter: (value) => `sepia(${value})`
44+
},
45+
{
46+
name: 'marvin',
47+
options: {
48+
range: {
49+
min: 0,
50+
max: 100
51+
},
52+
start: 0,
53+
step: 1
54+
},
55+
setFilter: (value) => `invert(${value}%)`
56+
},
57+
{
58+
name: 'phobos',
59+
options: {
60+
range: {
61+
min: 0,
62+
max: 3
63+
},
64+
start: 0,
65+
step: 0.1
66+
},
67+
setFilter: (value) => `blur(${value}px)`
68+
},
69+
{
70+
name: 'heat',
71+
options: {
72+
range: {
73+
min: 1,
74+
max: 3
75+
},
76+
start: 1,
77+
step: 0.1
78+
},
79+
setFilter: (value) => `brightness(${value})`
80+
},
81+
];
82+
83+
const changeScale = () => {
84+
if (currentScale < Scale.MIN) {
85+
currentScale = Scale.MIN;
86+
}
87+
88+
if (currentScale > Scale.MAX) {
89+
currentScale = Scale.MAX;
90+
}
91+
92+
scaleValueField.value = `${currentScale}%`;
93+
preview.style.transform = `scale(${currentScale / 100})`;
94+
};
95+
96+
const resetScale = () => {
97+
currentScale = Scale.MAX;
98+
preview.style.transform = `scale(${currentScale / 100})`;
99+
};
100+
101+
const resetSlider = () => {
102+
currentEffect = null;
103+
sliderContainer.style.display = 'none';
104+
preview.style.filter = '';
105+
};
106+
107+
const onScaleDown = () => {
108+
currentScale -= SCALE_STEP;
109+
changeScale();
110+
};
111+
112+
const onScaleUp = () => {
113+
currentScale += SCALE_STEP;
114+
changeScale();
115+
};
116+
117+
function onEffectItemClick() {
118+
currentEffect = effects.find((effect) => effect.name === this.value);
119+
if (!currentEffect) {
120+
resetSlider();
121+
return;
122+
}
123+
sliderContainer.style.display = '';
124+
sliderElement.noUiSlider.updateOptions(currentEffect.options);
125+
preview.style.filter = currentEffect.setFilter(currentEffect.options.start);
126+
}
127+
128+
const updateScale = () => {
129+
scaleUpBtn.addEventListener('click', onScaleUp);
130+
scaleDownBtn.addEventListener('click', onScaleDown);
131+
};
132+
133+
const updateEffect = () => {
134+
135+
noUiSlider.create(sliderElement, {
136+
range: {
137+
min: 0,
138+
max: 100,
139+
},
140+
start: 100,
141+
step: 1,
142+
connect: 'lower',
143+
format: {
144+
to: function (value) {
145+
if (Number.isInteger(value)) {
146+
return value.toFixed(0);
147+
}
148+
return value.toFixed(1);
149+
},
150+
from: function (value) {
151+
return parseFloat(value);
152+
},
153+
}
154+
});
155+
156+
sliderElement.noUiSlider.on('update', () => {
157+
if (currentEffect) {
158+
effectLevel.value = sliderElement.noUiSlider.get();
159+
preview.style.filter = currentEffect.setFilter(effectLevel.value);
160+
}
161+
});
162+
163+
effectItems.forEach((item) => item.addEventListener('click', onEffectItemClick));
164+
};
165+
166+
167+
export { updateScale, resetScale, updateEffect, resetSlider };

js/upload-photo.js

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { toggleClass, isEscapeKey } from './util.js';
2+
import { updateScale, resetScale, updateEffect, resetSlider } from './update-photo-mode.js';
23

34
const HASHTAG_MAX_COUNT = 5;
45

@@ -89,12 +90,9 @@ const validateHashtags = (value) => {
8990
pristine.addValidator(photoDescriptionField, validatePhotoDescription, getDescriptionErrorMessage);
9091
pristine.addValidator(hashtagInput, validateHashtags, getHashtagErrorMessage);
9192

93+
9294
const toggleSubmitBtn = () => {
93-
if (pristine.validate()) {
94-
photoSubmitBtn.disabled = false;
95-
} else {
96-
photoSubmitBtn.disabled = true;
97-
}
95+
photoSubmitBtn.disabled = !pristine.validate();
9896
};
9997

10098
const onHashtagInput = () => toggleSubmitBtn();
@@ -113,6 +111,8 @@ const resetForm = () => {
113111
});
114112
}
115113
photoUploadForm.reset();
114+
resetScale();
115+
resetSlider();
116116
};
117117

118118
const onCancelPhotoUpload = (evt) => {
@@ -139,6 +139,7 @@ function openPhotoUploadForm() {
139139
document.addEventListener('keydown', onPhotoUploadEscKey);
140140
toggleModal();
141141
toggleSubmitBtn();
142+
resetSlider();
142143
}
143144

144145
function closePhotoUploadForm() {
@@ -161,6 +162,8 @@ const initPhotoUploadForm = () => {
161162
cancelPhotoUploadBtn.addEventListener('click', onCancelPhotoUpload);
162163
hashtagInput.addEventListener('input', onHashtagInput);
163164
photoDescriptionField.addEventListener('input', onDescriptionInput);
165+
updateScale();
166+
updateEffect();
164167
};
165168

166169

0 commit comments

Comments
 (0)