1
+ <template >
2
+ <div :class =" { 'saving--option' : this.$store.state.loading }" >
3
+ <div class =" field columns" >
4
+ <label class =" label column has-text-grey-dark" >
5
+ {{strings.enable_network_opt_title}}
6
+ <p class =" is-italic has-text-weight-normal" >
7
+ {{strings.enable_network_opt_desc}}
8
+ </p >
9
+ </label >
10
+ <div class =" column is-3" >
11
+ <br />
12
+ <toggle-button :class =" 'has-text-dark'"
13
+ :disabled =" this.$store.state.loading"
14
+ v-model =" networkStatus"
15
+ :labels =" {checked: strings.enabled, unchecked: strings.disabled}"
16
+ :width =" 80"
17
+ :height =" 25"
18
+ color =" #008ec2" ></toggle-button >
19
+ </div >
20
+
21
+ </div >
22
+ <div class =" field columns" >
23
+ <label class =" label column has-text-grey-dark" >
24
+ {{strings.quality_title}}
25
+ <p class =" is-italic has-text-weight-normal" >
26
+ {{strings.quality_desc}}
27
+ </p >
28
+ </label >
29
+
30
+
31
+ </div >
32
+ <div class =" field columns" >
33
+ <div class =" column" >
34
+ <vue-slider @change =" () => { showSave=true;showSample=true }" v-bind =" sliderOptions" v-model =" new_data.quality" ></vue-slider >
35
+ </div >
36
+ </div >
37
+ <div class =" field is-fullwidth columns " >
38
+ <div class =" column is-left" >
39
+ <button @click =" saveChanges()" class =" button is-success is-small "
40
+ :class =" this.$store.state.loading ? 'is-loading' : '' " :disabled =" !showSave" >{{strings.save_changes}}
41
+ </button >
42
+ <a href =" #" v-if =" showSample" @click =" newSample(false)" class =" view-sample-image is-link" >{{strings.view_sample_image}}
43
+ </a >
44
+ </div >
45
+ </div >
46
+ <div v-if =" showComparison" class =" sample-image" >
47
+ <div v-if =" loading_images" class =" has-text-centered subtitle " >{{strings.sample_image_loading}}<span
48
+ class =" loader has-text-black-bis icon is-small" ></span >
49
+ </div >
50
+ <div v-else-if =" sample_images.id && sample_images.original_size > 0" >
51
+ <div class =" columns is-centered is-vcentered is-multiline is-mobile" >
52
+ <a @click =" newSample(true)"
53
+ class =" button is-small is-pulled-right" >
54
+ <span class =" icon dashicons dashicons-image-rotate" ></span >
55
+ </a >
56
+ <div class =" column visual-compare is-half-fullhd is-half-desktop is-three-quarters-touch is-12-mobile " >
57
+ <div class =" is-full progress-wrapper" >
58
+ <p class =" subtitle is-size-6 compress-optimization-ratio-done has-text-centered"
59
+ v-if =" compressionRatio > 0" >
60
+ <strong >{{( 100 - compressionRatio )}}%</strong > smaller </p >
61
+ <p class =" subtitle compress-optimization-ratio-nothing is-size-6 has-text-centered" v-else >
62
+ {{all_strings.latest_images.same_size}}
63
+ </p >
64
+ <progress class =" progress is-large is-success "
65
+ :value =" compressionRatio"
66
+ :max =" 100" >
67
+ </progress >
68
+ <hr />
69
+ </div >
70
+ <Image _diff class =" is-fullwidth" value =" 50" :first_label =" strings.image_1_label"
71
+ :second_label =" strings.image_2_label" >
72
+ <img slot =" first" :src =" sample_images.optimized" >
73
+ <img slot =" second" :src =" sample_images.original" >
74
+ </Image _diff >
75
+ </div >
76
+ </div >
77
+ <p class =" title has-text-centered is-6" >{{strings.quality_slider_desc}}</p >
78
+ </div >
79
+ <div v-else-if =" sample_images.id < 0" >
80
+ <p class =" title has-text-centered is-5 is-size-6-mobile" >{{strings.no_images_found}}</p >
81
+ </div >
82
+ </div >
83
+
84
+ </div >
85
+ </template >
86
+
87
+ <script >
88
+
89
+
90
+ import VueSlider from ' vue-slider-component'
91
+
92
+ import Image_diff from " ./image_diff.vue" ;
93
+
94
+ import ' vue-slider-component/theme/antd.css'
95
+ function qualityNumberToString (value ) {
96
+ if (value === 90 ) {
97
+ return optimoleDashboardApp .strings .options_strings .high_q_title ;
98
+ }
99
+ if (value === 75 ) {
100
+ return optimoleDashboardApp .strings .options_strings .medium_q_title ;
101
+ }
102
+ if (value === 55 ) {
103
+ return optimoleDashboardApp .strings .options_strings .low_q_title ;
104
+ }
105
+ return value;
106
+ }
107
+ function qualityStringToNumber (value ) {
108
+
109
+ if ( typeof value === ' number' ){
110
+ return value;
111
+ }
112
+ if (value === ' auto' ) {
113
+ return 90 ;
114
+ }
115
+ if (value === ' high_c' ) {
116
+ return 90 ;
117
+ }
118
+ if (value === ' medium_c' ) {
119
+ return 75 ;
120
+ }
121
+ if (value === ' low_c' ) {
122
+ return 55 ;
123
+ }
124
+ return 90 ;
125
+ }
126
+ export default {
127
+ name: " compression" ,
128
+ components: {VueSlider,Image_diff},
129
+ data () {
130
+ return {
131
+ strings: optimoleDashboardApp .strings .options_strings ,
132
+ all_strings: optimoleDashboardApp .strings ,
133
+ showSave: false ,
134
+ showSample: false ,
135
+ loading_images: false ,
136
+ showComparison: false ,
137
+ new_data: {
138
+ quality: qualityStringToNumber ( this .$store .state .site_settings .quality ),
139
+ network_optimization: this .$store .state .site_settings .network_optimization
140
+ },
141
+ sliderOptions: {
142
+ processStyle: {
143
+ backgroundColor: ' #3273dc'
144
+ },
145
+ contained: true ,
146
+ dotStyle: {
147
+ borderColor: ' #3273dc'
148
+ },
149
+ min: 1 ,
150
+ max: 100 ,
151
+ tooltipFormatter : function (value ) {
152
+ return qualityNumberToString (value);
153
+ },
154
+ marks : function (value ) {
155
+ let style = {
156
+ width: ' 12px' ,
157
+ height: ' 12px' ,
158
+ display: ' block' ,
159
+ backgroundColor: ' #3273dc' ,
160
+ borderColor: ' #3273dc' ,
161
+ boxShadow: ' none' ,
162
+ transform: ' translate(-4px, -4px)'
163
+ };
164
+ let text = qualityNumberToString (value);
165
+ if ( typeof text === ' number' ){
166
+ return false ;
167
+ }
168
+ return {
169
+ label: text,
170
+ style: style
171
+ };
172
+ }
173
+ }
174
+ }
175
+ },
176
+ mounted : function () {
177
+ },
178
+ methods: {
179
+ saveChanges : function () {
180
+ this .$store .dispatch (' saveSettings' , {
181
+ settings: this .new_data
182
+ });
183
+ },
184
+ newSample : function ( force ) {
185
+ if ( this .showComparison !== true ) {
186
+ this .showComparison = true
187
+ }
188
+ this .updateSampleImage ( this .new_data .quality , force ? ' yes' : ' no' );
189
+ return false ;
190
+ },
191
+ updateSampleImage : function (value , force = ' no' ) {
192
+ this .$store .dispatch (' sampleRate' , {
193
+ quality: value,
194
+ force: force,
195
+ component: this ,
196
+ }).then (
197
+ (response ) => {
198
+
199
+ setTimeout (() => {
200
+ this .showNotification = false ;
201
+ }, 1000 )
202
+ },
203
+ (response ) => {
204
+
205
+ }
206
+ );
207
+ },
208
+ },
209
+ computed: {
210
+ site_settings () {
211
+ return this .$store .state .site_settings ;
212
+ },
213
+
214
+ compressionRatio () {
215
+ return (parseFloat (this .sample_images .optimized_size / this .sample_images .original_size ) * 100 ).toFixed (0 );
216
+ },
217
+ sample_images () {
218
+ return this .$store .state .sample_rate ;
219
+ },
220
+ networkStatus: {
221
+ set : function (value ) {
222
+ this .showSave = true ;
223
+ this .new_data .network_optimization = value ? ' enabled' : ' disabled' ;
224
+ },
225
+ get : function () {
226
+ return ! (this .site_settings .network_optimization === ' disabled' );
227
+ }
228
+ }
229
+ }
230
+ }
231
+ </script >
232
+
233
+ <style scoped>
234
+ .sample-image {
235
+ margin-top :30px ;
236
+ }
237
+ .view-sample-image {
238
+
239
+ line-height : 32px ;
240
+ margin-left : 20px ;
241
+ }
242
+ </style >
0 commit comments