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