PluginProbe
Elementor Website Builder – more than just a page builder / 3.9.1
Elementor Website Builder – more than just a page builder v3.9.1
4.3.0-beta2 4.3.0-beta1 4.2.4 4.2.3 4.2.2 4.2.1 4.2.0 4.1.5 4.2.0-beta2 4.2.0-dev2 4.2.0-beta1 4.1.4 4.1.3 4.1.2 4.1.1 4.1.0 4.1.0-beta3 4.1.0-dev3 4.0.9 4.1.0-beta2 4.1.0-dev2 4.0.8 4.1.0-beta1 4.1.0-dev1 4.0.7 All 451 releases
elementor / includes / widgets / progress.php

progress.php in Elementor Website Builder – more than just a page builder 3.9.1, at includes/widgets/progress.php

429 lines 10.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 namespace Elementor;
3
4 if ( ! defined( 'ABSPATH' ) ) {
5 exit; // Exit if accessed directly.
6 }
7
8 use Elementor\Core\Kits\Documents\Tabs\Global_Colors;
9 use Elementor\Core\Kits\Documents\Tabs\Global_Typography;
10
11 /**
12 * Elementor progress widget.
13 *
14 * Elementor widget that displays an escalating progress bar.
15 *
16 * @since 1.0.0
17 */
18 class Widget_Progress extends Widget_Base {
19
20 /**
21 * Get widget name.
22 *
23 * Retrieve progress widget name.
24 *
25 * @since 1.0.0
26 * @access public
27 *
28 * @return string Widget name.
29 */
30 public function get_name() {
31 return 'progress';
32 }
33
34 /**
35 * Get widget title.
36 *
37 * Retrieve progress widget title.
38 *
39 * @since 1.0.0
40 * @access public
41 *
42 * @return string Widget title.
43 */
44 public function get_title() {
45 return esc_html__( 'Progress Bar', 'elementor' );
46 }
47
48 /**
49 * Get widget icon.
50 *
51 * Retrieve progress widget icon.
52 *
53 * @since 1.0.0
54 * @access public
55 *
56 * @return string Widget icon.
57 */
58 public function get_icon() {
59 return 'eicon-skill-bar';
60 }
61
62 /**
63 * Get widget keywords.
64 *
65 * Retrieve the list of keywords the widget belongs to.
66 *
67 * @since 2.1.0
68 * @access public
69 *
70 * @return array Widget keywords.
71 */
72 public function get_keywords() {
73 return [ 'progress', 'bar' ];
74 }
75
76 /**
77 * Register progress widget controls.
78 *
79 * Adds different input fields to allow the user to change and customize the widget settings.
80 *
81 * @since 3.1.0
82 * @access protected
83 */
84 protected function register_controls() {
85 $this->start_controls_section(
86 'section_progress',
87 [
88 'label' => esc_html__( 'Progress Bar', 'elementor' ),
89 ]
90 );
91
92 $this->add_control(
93 'title',
94 [
95 'label' => esc_html__( 'Title', 'elementor' ),
96 'type' => Controls_Manager::TEXT,
97 'dynamic' => [
98 'active' => true,
99 ],
100 'placeholder' => esc_html__( 'Enter your title', 'elementor' ),
101 'default' => esc_html__( 'My Skill', 'elementor' ),
102 'label_block' => true,
103 ]
104 );
105
106 $this->add_control(
107 'progress_type',
108 [
109 'label' => esc_html__( 'Type', 'elementor' ),
110 'type' => Controls_Manager::SELECT,
111 'default' => '',
112 'options' => [
113 '' => esc_html__( 'Default', 'elementor' ),
114 'info' => esc_html__( 'Info', 'elementor' ),
115 'success' => esc_html__( 'Success', 'elementor' ),
116 'warning' => esc_html__( 'Warning', 'elementor' ),
117 'danger' => esc_html__( 'Danger', 'elementor' ),
118 ],
119 ]
120 );
121
122 $this->add_control(
123 'percent',
124 [
125 'label' => esc_html__( 'Percentage', 'elementor' ),
126 'type' => Controls_Manager::SLIDER,
127 'default' => [
128 'size' => 50,
129 'unit' => '%',
130 ],
131 'dynamic' => [
132 'active' => true,
133 ],
134 ]
135 );
136
137 $this->add_control(
138 'display_percentage',
139 [
140 'label' => esc_html__( 'Display Percentage', 'elementor' ),
141 'type' => Controls_Manager::SELECT,
142 'default' => 'show',
143 'options' => [
144 'show' => esc_html__( 'Show', 'elementor' ),
145 'hide' => esc_html__( 'Hide', 'elementor' ),
146 ],
147 ]
148 );
149
150 $this->add_control(
151 'inner_text',
152 [
153 'label' => esc_html__( 'Inner Text', 'elementor' ),
154 'type' => Controls_Manager::TEXT,
155 'dynamic' => [
156 'active' => true,
157 ],
158 'placeholder' => esc_html__( 'e.g. Web Designer', 'elementor' ),
159 'default' => esc_html__( 'Web Designer', 'elementor' ),
160 'label_block' => true,
161 ]
162 );
163
164 $this->add_control(
165 'view',
166 [
167 'label' => esc_html__( 'View', 'elementor' ),
168 'type' => Controls_Manager::HIDDEN,
169 'default' => 'traditional',
170 ]
171 );
172
173 $this->end_controls_section();
174
175 $this->start_controls_section(
176 'section_progress_style',
177 [
178 'label' => esc_html__( 'Progress Bar', 'elementor' ),
179 'tab' => Controls_Manager::TAB_STYLE,
180 ]
181 );
182
183 $this->add_control(
184 'bar_color',
185 [
186 'label' => esc_html__( 'Color', 'elementor' ),
187 'type' => Controls_Manager::COLOR,
188 'global' => [
189 'default' => Global_Colors::COLOR_PRIMARY,
190 ],
191 'selectors' => [
192 '{{WRAPPER}} .elementor-progress-wrapper .elementor-progress-bar' => 'background-color: {{VALUE}};',
193 ],
194 ]
195 );
196
197 $this->add_control(
198 'bar_bg_color',
199 [
200 'label' => esc_html__( 'Background Color', 'elementor' ),
201 'type' => Controls_Manager::COLOR,
202 'selectors' => [
203 '{{WRAPPER}} .elementor-progress-wrapper' => 'background-color: {{VALUE}};',
204 ],
205 ]
206 );
207
208 $this->add_control(
209 'bar_height',
210 [
211 'label' => esc_html__( 'Height', 'elementor' ),
212 'type' => Controls_Manager::SLIDER,
213 'selectors' => [
214 '{{WRAPPER}} .elementor-progress-bar' => 'height: {{SIZE}}{{UNIT}}; line-height: {{SIZE}}{{UNIT}};',
215 ],
216 ]
217 );
218
219 $this->add_control(
220 'bar_border_radius',
221 [
222 'label' => esc_html__( 'Border Radius', 'elementor' ),
223 'type' => Controls_Manager::SLIDER,
224 'size_units' => [ 'px', '%', 'em' ],
225 'selectors' => [
226 '{{WRAPPER}} .elementor-progress-wrapper' => 'border-radius: {{SIZE}}{{UNIT}}; overflow: hidden;',
227 ],
228 ]
229 );
230
231 $this->add_control(
232 'inner_text_heading',
233 [
234 'label' => esc_html__( 'Inner Text', 'elementor' ),
235 'type' => Controls_Manager::HEADING,
236 'separator' => 'before',
237 ]
238 );
239
240 $this->add_control(
241 'bar_inline_color',
242 [
243 'label' => esc_html__( 'Color', 'elementor' ),
244 'type' => Controls_Manager::COLOR,
245 'selectors' => [
246 '{{WRAPPER}} .elementor-progress-bar' => 'color: {{VALUE}};',
247 ],
248 ]
249 );
250
251 $this->add_group_control(
252 Group_Control_Typography::get_type(),
253 [
254 'name' => 'bar_inner_typography',
255 'selector' => '{{WRAPPER}} .elementor-progress-bar',
256 'exclude' => [
257 'line_height',
258 ],
259 ]
260 );
261
262 $this->add_group_control(
263 Group_Control_Text_Shadow::get_type(),
264 [
265 'name' => 'bar_inner_shadow',
266 'selector' => '{{WRAPPER}} .elementor-progress-bar',
267 ]
268 );
269
270 $this->end_controls_section();
271
272 $this->start_controls_section(
273 'section_title',
274 [
275 'label' => esc_html__( 'Title Style', 'elementor' ),
276 'tab' => Controls_Manager::TAB_STYLE,
277 ]
278 );
279
280 $this->add_control(
281 'title_color',
282 [
283 'label' => esc_html__( 'Text Color', 'elementor' ),
284 'type' => Controls_Manager::COLOR,
285 'selectors' => [
286 '{{WRAPPER}} .elementor-title' => 'color: {{VALUE}};',
287 ],
288 'global' => [
289 'default' => Global_Colors::COLOR_PRIMARY,
290 ],
291 ]
292 );
293
294 $this->add_group_control(
295 Group_Control_Typography::get_type(),
296 [
297 'name' => 'typography',
298 'selector' => '{{WRAPPER}} .elementor-title',
299 'global' => [
300 'default' => Global_Typography::TYPOGRAPHY_TEXT,
301 ],
302 ]
303 );
304
305 $this->add_group_control(
306 Group_Control_Text_Shadow::get_type(),
307 [
308 'name' => 'title_shadow',
309 'selector' => '{{WRAPPER}} .elementor-title',
310 ]
311 );
312
313 $this->end_controls_section();
314 }
315
316 /**
317 * Render progress widget output on the frontend.
318 * Make sure value does no exceed 100%.
319 *
320 * Written in PHP and used to generate the final HTML.
321 *
322 * @since 1.0.0
323 * @access protected
324 */
325 protected function render() {
326 $settings = $this->get_settings_for_display();
327
328 $progress_percentage = is_numeric( $settings['percent']['size'] ) ? $settings['percent']['size'] : '0';
329 if ( 100 < $progress_percentage ) {
330 $progress_percentage = 100;
331 }
332
333 $this->add_render_attribute( 'title', [
334 'class' => 'elementor-title',
335 ]);
336
337 $this->add_inline_editing_attributes( 'title' );
338
339 $this->add_render_attribute( 'wrapper', [
340 'class' => 'elementor-progress-wrapper',
341 'role' => 'progressbar',
342 'aria-valuemin' => '0',
343 'aria-valuemax' => '100',
344 'aria-valuenow' => $progress_percentage,
345 'aria-valuetext' => $settings['inner_text'],
346 ] );
347
348 if ( ! empty( $settings['progress_type'] ) ) {
349 $this->add_render_attribute( 'wrapper', 'class', 'progress-' . $settings['progress_type'] );
350 }
351
352 $this->add_render_attribute( 'progress-bar', [
353 'class' => 'elementor-progress-bar',
354 'data-max' => $progress_percentage,
355 ] );
356
357 $this->add_render_attribute( 'inner_text', [
358 'class' => 'elementor-progress-text',
359 ] );
360
361 $this->add_inline_editing_attributes( 'inner_text' );
362
363 if ( ! Utils::is_empty( $settings['title'] ) ) { ?>
364 <span <?php $this->print_render_attribute_string( 'title' ); ?>><?php $this->print_unescaped_setting( 'title' ); ?></span>
365 <?php } ?>
366
367 <div <?php $this->print_render_attribute_string( 'wrapper' ); ?>>
368 <div <?php $this->print_render_attribute_string( 'progress-bar' ); ?>>
369 <span <?php $this->print_render_attribute_string( 'inner_text' ); ?>><?php $this->print_unescaped_setting( 'inner_text' ); ?></span>
370 <?php if ( 'hide' !== $settings['display_percentage'] ) { ?>
371 <span class="elementor-progress-percentage"><?php echo $progress_percentage; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>%</span>
372 <?php } ?>
373 </div>
374 </div>
375 <?php
376 }
377
378 /**
379 * Render progress widget output in the editor.
380 *
381 * Written as a Backbone JavaScript template and used to generate the live preview.
382 *
383 * @since 2.9.0
384 * @access protected
385 */
386 protected function content_template() {
387 ?>
388 <#
389 let progress_percentage = 0;
390 if ( ! isNaN( settings.percent.size ) ) {
391 progress_percentage = 100 < settings.percent.size ? 100 : settings.percent.size;
392 }
393
394 view.addRenderAttribute( 'title', {
395 'class': 'elementor-title'
396 } );
397
398 view.addInlineEditingAttributes( 'title' );
399
400 view.addRenderAttribute( 'progressWrapper', {
401 'class': [ 'elementor-progress-wrapper', 'progress-' + settings.progress_type ],
402 'role': 'progressbar',
403 'aria-valuemin': '0',
404 'aria-valuemax': '100',
405 'aria-valuenow': progress_percentage,
406 'aria-valuetext': settings.inner_text
407 } );
408
409 view.addRenderAttribute( 'inner_text', {
410 'class': 'elementor-progress-text'
411 } );
412
413 view.addInlineEditingAttributes( 'inner_text' );
414 #>
415 <# if ( settings.title ) { #>
416 <span {{{ view.getRenderAttributeString( 'title' ) }}}>{{{ settings.title }}}</span><#
417 } #>
418 <div {{{ view.getRenderAttributeString( 'progressWrapper' ) }}}>
419 <div class="elementor-progress-bar" data-max="{{ progress_percentage }}">
420 <span {{{ view.getRenderAttributeString( 'inner_text' ) }}}>{{{ settings.inner_text }}}</span>
421 <# if ( 'hide' !== settings.display_percentage ) { #>
422 <span class="elementor-progress-percentage">{{{ progress_percentage }}}%</span>
423 <# } #>
424 </div>
425 </div>
426 <?php
427 }
428 }
429