HEX
Server: Apache
System: Linux WWW 6.1.0-40-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.153-1 (2025-09-20) x86_64
User: web11 (1011)
PHP: 8.2.29
Disabled: NONE
Upload Files
File: /var/www/ippmt.kauko.lt/wp-content/plugins/ocean-elementor-widgets/modules/table/widgets/table.php
<?php
namespace owpElementor\Modules\Table\Widgets;

// Elementor Classes
use Elementor\Controls_Manager;
use Elementor\Repeater;
use Elementor\Utils;
use Elementor\Group_Control_Background;
use Elementor\Group_Control_Image_Size;
use Elementor\Group_Control_Border;
use Elementor\Group_Control_Typography;
use Elementor\Scheme_Typography;
use Elementor\Group_Control_Box_Shadow;
use Elementor\Widget_Base;

if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly

class Table extends Widget_Base {

	public function get_name() {
		return 'oew-table';
	}

	public function get_title() {
		return __( 'Table', 'ocean-elementor-widgets' );
	}

	public function get_icon() {
		// Upload "eicons.ttf" font via this site: http://bluejamesbond.github.io/CharacterMap/
		return 'oew-icon eicon-table';
	}

	public function get_categories() {
		return [ 'oceanwp-elements' ];
	}

	public function get_style_depends() {
		return [ 'oew-table' ];
	}

	protected function _register_controls() {

		$this->start_controls_section(
			'section_header',
			[
				'label' 		=> __( 'Header', 'ocean-elementor-widgets' ),
			]
		);

		$this->add_control(
			'hide_headers_mobile',
			[
				'label' 		=> __( 'Hide Headers on Mobile', 'ocean-elementor-widgets' ),
				'type' 			=> Controls_Manager::SWITCHER,
				'return_value' 	=> 'hide',
				'prefix_class'	=> 'oew-table-mobile-header-',
				'frontend_available' => true,
			]
		);

		$this->add_control(
			'mobile_display',
			[
				'label' 		=> __( 'Mobile Display', 'ocean-elementor-widgets' ),
				'type' 			=> Controls_Manager::SELECT,
				'default' 		=> 'column',
				'options' 		=> [
					'column' 	=> __( 'Column', 'ocean-elementor-widgets' ),
					'inline' 	=> __( 'Inline', 'ocean-elementor-widgets' ),
				],
				'prefix_class'	=> 'oew-table-mobile-header-',
				'condition'		=> [
					'hide_headers_mobile!' => 'hide',
				],
			]
		);

		$repeater = new Repeater();

		$repeater->add_control(
			'cell_text',
			[
				'label' 		=> __( 'Cell Text', 'ocean-elementor-widgets' ),
				'type' 			=> Controls_Manager::TEXT,
				'dynamic' 		=> [ 'active' => true ],
			]
		);

		$repeater->add_control(
			'cell_icon',
			[
				'label' 		=> __( 'Icon', 'ocean-elementor-widgets' ),
				'type' 			=> Controls_Manager::ICON,
				'default' 		=> '',
			]
		);

		$repeater->add_control(
			'cell_icon_align',
			[
				'label' 		=> __( 'Icon Position', 'ocean-elementor-widgets' ),
				'type' 			=> Controls_Manager::SELECT,
				'default' 		=> 'left',
				'options' 		=> [
					'left' => __( 'Before', 'ocean-elementor-widgets' ),
					'right' => __( 'After', 'ocean-elementor-widgets' ),
				],
				'condition' 	=> [
					'cell_icon!' => '',
				],
			]
		);

		$repeater->add_control(
			'cell_icon_indent',
			[
				'label' 		=> __( 'Icon Spacing', 'ocean-elementor-widgets' ),
				'type' 			=> Controls_Manager::SLIDER,
				'range' 		=> [
					'px' => [
						'max' => 50,
					],
				],
				'condition' 	=> [
					'cell_icon!' => '',
				],
				'selectors' 	=> [
					'{{WRAPPER}} thead {{CURRENT_ITEM}} .oew-table-text .elementor-align-icon-right' => 'margin-left: {{SIZE}}{{UNIT}};',
					'{{WRAPPER}} thead {{CURRENT_ITEM}} .oew-table-text .elementor-align-icon-left' => 'margin-right: {{SIZE}}{{UNIT}};',
				],
			]
		);

		$repeater->add_control(
			'cell_span',
			[
				'label'   		=> __( 'Column Span', 'ocean-elementor-widgets' ),
				'title' 		=> __( 'How many columns should this column span across.', 'ocean-elementor-widgets' ),
				'type'    		=> Controls_Manager::NUMBER,
				'default' 		=> 1,
				'min'     		=> 1,
				'max'     		=> 20,
				'step'    		=> 1,
			]
		);

		$repeater->add_control(
			'cell_row_span',
			[
				'label'   		=> __( 'Row Span', 'ocean-elementor-widgets' ),
				'title' 		=> __( 'How many rows should this column span across.', 'ocean-elementor-widgets' ),
				'type'    		=> Controls_Manager::NUMBER,
				'default' 		=> 1,
				'min'     		=> 1,
				'max'     		=> 20,
				'step'    		=> 1,
				'separator'		=> 'below',
			]
		);

		$repeater->add_control(
			'_item_id',
			[
				'label' 		=> __( 'CSS ID', 'ocean-elementor-widgets' ),
				'type' 			=> Controls_Manager::TEXT,
			]
		);

		$repeater->add_control(
			'css_classes',
			[
				'label' 		=> __( 'CSS Classes', 'ocean-elementor-widgets' ),
				'type' 			=> Controls_Manager::TEXT,
			]
		);

		$this->add_control(
			'header_cells',
			[
				'label' 		=> __( 'Rows', 'ocean-elementor-widgets' ),
				'type' 			=> Controls_Manager::REPEATER,
				'default' 		=> [
					[
						'cell_text' => __( 'Header #1', 'ocean-elementor-widgets' ),
					],
					[
						'cell_text' => __( 'Header #2', 'ocean-elementor-widgets' ),
					],
					[
						'cell_text' => __( 'Header #3', 'ocean-elementor-widgets' ),
					],
				],
				'prevent_empty'	=> true,
				'fields' 		=> array_values( $repeater->get_controls() ),
				'title_field' 	=> '{{{ cell_text }}}',
			]
		);

		$this->end_controls_section();

		$this->start_controls_section(
			'section_content',
			[
				'label' 		=> __( 'Content', 'ocean-elementor-widgets' ),
			]
		);

		$repeater = new Repeater();

		$repeater->add_control(
			'content_type',
			[
				'label' 		=> __( 'Element', 'ocean-elementor-widgets' ),
				'type' 			=> Controls_Manager::SELECT,
				'default'		=> 'cell',
				'options' 		=> [
					'row' 	=> __( 'Row', 'ocean-elementor-widgets' ),
					'cell' 	=> __( 'Cell', 'ocean-elementor-widgets' ),
				],
			]
		);

		$repeater->add_control(
			'cell_type',
			[
				'label' 		=> __( 'Cell Type', 'ocean-elementor-widgets' ),
				'type'		=> Controls_Manager::SELECT,
				'default'	=> 'td',
				'options' 	=> [
					'td' 	=> __( 'Default', 'ocean-elementor-widgets' ),
					'th' 	=> __( 'Header', 'ocean-elementor-widgets' ),
				],
				'condition'	=> [
					'content_type' => 'cell',
				]
			]
		);

		$repeater->add_control(
			'content_text',
			[
				'label' 		=> __( 'Content Text', 'ocean-elementor-widgets' ),
				'type' 			=> Controls_Manager::TEXT,
				'dynamic' 		=> [ 'active' => true ],
			]
		);

		$repeater->add_control(
			'content_icon',
			[
				'label' 		=> __( 'Icon', 'ocean-elementor-widgets' ),
				'type' 			=> Controls_Manager::ICON,
				'default' 		=> '',
				'condition'	=> [
					'content_type' => 'cell',
				]
			]
		);

		$repeater->add_control(
			'content_icon_align',
			[
				'label' 		=> __( 'Icon Position', 'ocean-elementor-widgets' ),
				'type' 			=> Controls_Manager::SELECT,
				'default' 		=> 'left',
				'options' 		=> [
					'left' => __( 'Before', 'ocean-elementor-widgets' ),
					'right' => __( 'After', 'ocean-elementor-widgets' ),
				],
				'condition' 	=> [
					'content_icon!' => '',
					'content_type' => 'cell',
				],
			]
		);

		$repeater->add_control(
			'content_icon_indent',
			[
				'label' 		=> __( 'Icon Spacing', 'ocean-elementor-widgets' ),
				'type' 			=> Controls_Manager::SLIDER,
				'range' 		=> [
					'px' => [
						'max' => 50,
					],
				],
				'condition' 	=> [
					'content_icon!' => '',
					'content_type' => 'cell',
				],
				'selectors' 	=> [
					'{{WRAPPER}} tbody {{CURRENT_ITEM}} .oew-table-text .elementor-align-icon-right' => 'margin-left: {{SIZE}}{{UNIT}};',
					'{{WRAPPER}} tbody {{CURRENT_ITEM}} .oew-table-text .elementor-align-icon-left' => 'margin-right: {{SIZE}}{{UNIT}};',
				],
			]
		);

		$repeater->add_control(
			'content_span',
			[
				'label'   		=> __( 'Column Span', 'ocean-elementor-widgets' ),
				'title' 		=> __( 'How many columns should this column span across.', 'ocean-elementor-widgets' ),
				'type'    		=> Controls_Manager::NUMBER,
				'default' 		=> 1,
				'min'     		=> 1,
				'max'     		=> 20,
				'step'    		=> 1,
				'condition'	=> [
					'content_type' => 'cell',
				]
			]
		);

		$repeater->add_control(
			'content_row_span',
			[
				'label'   		=> __( 'Row Span', 'ocean-elementor-widgets' ),
				'title' 		=> __( 'How many rows should this column span across.', 'ocean-elementor-widgets' ),
				'type'    		=> Controls_Manager::NUMBER,
				'default' 		=> 1,
				'min'     		=> 1,
				'max'     		=> 20,
				'step'    		=> 1,
				'separator'		=> 'below',
				'condition'	=> [
					'content_type' => 'cell',
				]
			]
		);

		$repeater->add_control(
			'content_link',
			[
				'label' 		=> __( 'Link', 'ocean-elementor-widgets' ),
				'type' 			=> Controls_Manager::URL,
				'condition'	=> [
					'content_type' => 'cell',
				]
			]
		);

		$repeater->add_control(
			'content_item_id',
			[
				'label' 		=> __( 'CSS ID', 'ocean-elementor-widgets' ),
				'type' 			=> Controls_Manager::TEXT,
			]
		);

		$repeater->add_control(
			'content_css_classes',
			[
				'label' 		=> __( 'CSS Classes', 'ocean-elementor-widgets' ),
				'type' 			=> Controls_Manager::TEXT,
			]
		);

		$this->add_control(
			'rows',
			[
				'label' 		=> __( 'Rows', 'ocean-elementor-widgets' ),
				'type' 			=> Controls_Manager::REPEATER,
				'default' 		=> [
					[
						'content_type' 	=> 'row',
					],
					[
						'content_type' 	=> 'cell',
						'content_text' 	=> __( 'Column #1', 'ocean-elementor-widgets' ),
						'cell_type'		=> 'td',
					],
					[
						'content_type' 	=> 'cell',
						'content_text' 	=> __( 'Column #2', 'ocean-elementor-widgets' ),
						'cell_type'		=> 'td',
					],
					[
						'content_type' 	=> 'cell',
						'content_text' 	=> __( 'Column #3', 'ocean-elementor-widgets' ),
						'cell_type'		=> 'td',
					],
					[
						'content_type' 	=> 'row',
					],
					[
						'content_type' 	=> 'cell',
						'content_text' 	=> __( 'Column #1', 'ocean-elementor-widgets' ),
					],
					[
						'content_type' 	=> 'cell',
						'content_text' 	=> __( 'Column #2', 'ocean-elementor-widgets' ),
					],
					[
						'content_type' 	=> 'cell',
						'content_text' 	=> __( 'Column #3', 'ocean-elementor-widgets' ),
					],
				],
				'fields' 		=> array_values( $repeater->get_controls() ),
				'title_field' 	=> 'Start {{ content_type }}: {{{ content_text }}}',
			]
		);

		$this->end_controls_section();

		$this->start_controls_section(
			'section_style',
			[
				'label' 		=> esc_html__( 'Table', 'ocean-elementor-widgets' ),
				'tab' 			=> Controls_Manager::TAB_STYLE,
			]
		);

		$this->add_responsive_control(
			'size',
			[
				'label' 		=> __( 'Size', 'ocean-elementor-widgets' ),
				'type' 			=> Controls_Manager::SLIDER,
				'default' 		=> [
					'size' => 100,
					'unit' => '%',
				],
				'size_units' 	=> [ '%', 'px' ],
				'range' 		=> [
					'%' => [
						'min' => 1,
						'max' => 100,
					],
					'px' => [
						'min' => 1,
						'max' => 1200,
					],
				],
				'selectors' 	=> [
					'{{WRAPPER}} .oew-table' => 'max-width: {{SIZE}}{{UNIT}};',
				],
			]
		);

		$this->add_responsive_control(
			'alignment',
			[
				'label' 		=> __( 'Alignment', 'ocean-elementor-widgets' ),
				'type' 			=> Controls_Manager::CHOOSE,
				'options' 		=> [
					'left' => [
						'title' => __( 'Left', 'ocean-elementor-widgets' ),
						'icon' 	=> 'fa fa-align-left',
					],
					'center' => [
						'title' => __( 'Center', 'ocean-elementor-widgets' ),
						'icon' 	=> 'fa fa-align-center',
					],
					'right' => [
						'title' => __( 'Right', 'ocean-elementor-widgets' ),
						'icon' 	=> 'fa fa-align-right',
					],
				],
				'prefix_class' => 'oew%s-align-',
			]
		);

		$this->end_controls_section();

		$this->start_controls_section(
			'section_rows_style',
			[
				'label' 		=> esc_html__( 'Rows', 'ocean-elementor-widgets' ),
				'tab' 			=> Controls_Manager::TAB_STYLE,
			]
		);

		$this->add_group_control(
			Group_Control_Border::get_type(),
			[
				'name' 			=> 'row_border',
				'label' 		=> __( 'Border', 'ocean-elementor-widgets' ),
				'selector' 		=> '{{WRAPPER}} .oew-table-row',
			]
		);

		$this->add_control(
			'row_alternate',
			[
				'label'			=> __( 'Alternate', 'ocean-elementor-widgets' ),
				'type'			=> Controls_Manager::SELECT,
				'default'		=> 'even',
				'options' 		=> [
					'even' 	=> __( 'Even', 'ocean-elementor-widgets' ),
					'odd' 	=> __( 'Odd', 'ocean-elementor-widgets' ),
				],

			]
		);

		$this->start_controls_tabs( 'tabs_row_style' );

		$this->start_controls_tab(
			'tab_row_default_style',
			[
				'label' 		=> __( 'Default', 'ocean-elementor-widgets' ),
			]
		);

		$this->add_control(
			'row_style_heading',
			[
				'label'			=> __( 'Default', 'ocean-elementor-widgets' ),
				'type'			=> Controls_Manager::HEADING,
			]
		);

		$this->add_control(
			'row_bg',
			[
				'label' 	=> __( 'Background Color', 'ocean-elementor-widgets' ),
				'type' 		=> Controls_Manager::COLOR,
				'selectors' => [
					'{{WRAPPER}} .oew-table-row' => 'background-color: {{VALUE}};',
				],
			]
		);

		$this->add_control(
			'row_color',
			[
				'label' 		=> __( 'Color', 'ocean-elementor-widgets' ),
				'type' 			=> Controls_Manager::COLOR,
				'selectors' 	=> [
					'{{WRAPPER}} .oew-table-row .oew-table-text' => 'color: {{VALUE}};',
				],
			]
		);

		$this->add_control(
			'row_style_hover_heading',
			[
				'label'		=> __( 'Hover', 'ocean-elementor-widgets' ),
				'type'		=> Controls_Manager::HEADING,
			]
		);

		$this->add_control(
			'row_hover_bg',
			[
				'label' 	=> __( 'Background Color', 'ocean-elementor-widgets' ),
				'type' 		=> Controls_Manager::COLOR,
				'selectors' => [
					'{{WRAPPER}} .oew-table-row:hover' => 'background-color: {{VALUE}};',
				],
			]
		);

		$this->add_control(
			'row_hover_color',
			[
				'label' 	=> __( 'Color', 'ocean-elementor-widgets' ),
				'type' 		=> Controls_Manager::COLOR,
				'selectors' => [
					'{{WRAPPER}} .oew-table-row:hover .oew-table-text' => 'color: {{VALUE}};',
				],
			]
		);

		$this->end_controls_tab();

		$this->start_controls_tab(
			'tab_row_alternate_style',
			[
				'label' 		=> __( 'Alternate', 'ocean-elementor-widgets' ),
			]
		);

		$this->add_control(
			'row_style_alternate_heading',
			[
				'label'		=> __( 'Default', 'ocean-elementor-widgets' ),
				'type'		=> Controls_Manager::HEADING,
			]
		);

		$this->add_control(
			'row_alternate_bg',
			[
				'label' 	=> __( 'Background Color', 'ocean-elementor-widgets' ),
				'type' 		=> Controls_Manager::COLOR,
				'selectors' => [
					'{{WRAPPER}} .oew-table-odd .oew-table-row:nth-child(odd),
					 {{WRAPPER}} .oew-table-even .oew-table-row:nth-child(even)' => 'background-color: {{VALUE}};',
				],
			]
		);

		$this->add_control(
			'row_alternate_color',
			[
				'label' 	=> __( 'Color', 'ocean-elementor-widgets' ),
				'type' 		=> Controls_Manager::COLOR,
				'selectors' => [
					'{{WRAPPER}} .oew-table-odd .oew-table-row:nth-child(odd) .oew-table-text,
					 {{WRAPPER}} .oew-table-even .oew-table-row:nth-child(even) .oew-table-text' => 'color: {{VALUE}};',
				],
			]
		);

		$this->add_control(
			'row_style_alternate_hover_heading',
			[
				'label'		=> __( 'Hover', 'ocean-elementor-widgets' ),
				'type'		=> Controls_Manager::HEADING,
			]
		);

		$this->add_control(
			'row_alternate_hover_bg',
			[
				'label' 	=> __( 'Background Color', 'ocean-elementor-widgets' ),
				'type' 		=> Controls_Manager::COLOR,
				'selectors' => [
					'{{WRAPPER}} .oew-table-odd .oew-table-row:nth-child(odd):hover,
					 {{WRAPPER}} .oew-table-even .oew-table-row:nth-child(even):hover' => 'background-color: {{VALUE}};',
				],
			]
		);

		$this->add_control(
			'row_alternate_hover_color',
			[
				'label' 	=> __( 'Color', 'ocean-elementor-widgets' ),
				'type' 		=> Controls_Manager::COLOR,
				'selectors' => [
					'{{WRAPPER}} .oew-table-odd .oew-table-row:nth-child(odd):hover .oew-table-text,
					 {{WRAPPER}} .oew-table-even .oew-table-row:nth-child(even):hover .oew-table-text' => 'color: {{VALUE}};',
				],
			]
		);

		$this->end_controls_tab();

		$this->end_controls_tabs();

		$this->end_controls_section();

		$this->start_controls_section(
			'section_cells_style',
			[
				'label' 	=> __( 'Cells', 'ocean-elementor-widgets' ),
				'tab' 		=> Controls_Manager::TAB_STYLE,
			]
		);

		$this->add_group_control(
			Group_Control_Typography::get_type(),
			[
				'name' 		=> 'cell_typography',
				'label' 	=> __( 'Typography', 'ocean-elementor-widgets' ),
				'scheme' 	=> Scheme_Typography::TYPOGRAPHY_4,
				'selector' 	=> '{{WRAPPER}} .oew-table td.oew-table-cell',
			]
		);

		$this->start_controls_tabs( 'tabs_cell_colors' );

		$this->start_controls_tab(
			'tab_cell_colors',
			[
				'label' 		=> __( 'Default', 'ocean-elementor-widgets' ),
			]
		);

		$this->add_control(
			'cell_bg',
			[
				'label' 		=> __( 'Background Color', 'ocean-elementor-widgets' ),
				'type' 			=> Controls_Manager::COLOR,
				'selectors' 	=> [
					'{{WRAPPER}} .oew-table-cell' => 'background-color: {{VALUE}};',
				],
			]
		);

		$this->add_control(
			'cell_color',
			[
				'label' 		=> __( 'Color', 'ocean-elementor-widgets' ),
				'type' 			=> Controls_Manager::COLOR,
				'selectors' 	=> [
					'{{WRAPPER}} .oew-table-cell .oew-table-text' => 'color: {{VALUE}};',
				],
			]
		);

		$this->end_controls_tab();

		$this->start_controls_tab(
			'tab_cell_hover_colors',
			[
				'label' 		=> __( 'Hover', 'ocean-elementor-widgets' ),
			]
		);

		$this->add_control(
			'cell_hover_bg',
			[
				'label' 		=> __( 'Background Color', 'ocean-elementor-widgets' ),
				'type' 			=> Controls_Manager::COLOR,
				'selectors' 	=> [
					'{{WRAPPER}} .oew-table-cell:hover' => 'background-color: {{VALUE}};',
				],
			]
		);

		$this->add_control(
			'cell_hover_color',
			[
				'label' 		=> __( 'Color', 'ocean-elementor-widgets' ),
				'type' 			=> Controls_Manager::COLOR,
				'selectors' 	=> [
					'{{WRAPPER}} .oew-table-cell:hover .oew-table-text' => 'color: {{VALUE}};',
				],
			]
		);

		$this->end_controls_tab();

		$this->end_controls_tabs();

		$this->add_responsive_control(
			'cell_padding',
			[
				'label' 		=> __( 'Padding', 'ocean-elementor-widgets' ),
				'type' 			=> Controls_Manager::DIMENSIONS,
				'size_units' 	=> [ 'px', 'em', '%' ],
				'selectors' 	=> [
					'{{WRAPPER}} .oew-table-text' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
				],
			]
		);

		$this->add_group_control(
			Group_Control_Border::get_type(),
			[
				'name' 			=> 'cell_border',
				'label' 		=> __( 'Border', 'ocean-elementor-widgets' ),
				'selector' 		=> '{{WRAPPER}} .oew-table-cell',
			]
		);

		$this->end_controls_section();

		$this->start_controls_section(
			'section_headers_style',
			[
				'label' 	=> __( 'Headers', 'ocean-elementor-widgets' ),
				'tab' 		=> Controls_Manager::TAB_STYLE,
			]
		);

		$this->add_group_control(
			Group_Control_Typography::get_type(),
			[
				'name' 		=> 'headers_typography',
				'label' 	=> __( 'Typography', 'ocean-elementor-widgets' ),
				'scheme' 	=> Scheme_Typography::TYPOGRAPHY_4,
				'selector' 	=> '{{WRAPPER}} .oew-table th.oew-table-cell',
			]
		);

		$this->start_controls_tabs( 'tabs_headers_colors' );

		$this->start_controls_tab(
			'tab_headers_colors',
			[
				'label' 		=> __( 'Default', 'ocean-elementor-widgets' ),
			]
		);

		$this->add_control(
			'headers_bg',
			[
				'label' 		=> __( 'Background Color', 'ocean-elementor-widgets' ),
				'type' 			=> Controls_Manager::COLOR,
				'selectors' 	=> [
					'{{WRAPPER}} th.oew-table-cell' => 'background-color: {{VALUE}};',
					'{{WRAPPER}} .oew-table-cell[data-title]:before' => 'background-color: {{VALUE}};',
				],
			]
		);

		$this->add_control(
			'headers_color',
			[
				'label' 		=> __( 'Color', 'ocean-elementor-widgets' ),
				'type' 			=> Controls_Manager::COLOR,
				'selectors' 	=> [
					'{{WRAPPER}} th.oew-table-cell .oew-table-text' => 'color: {{VALUE}};',
					'{{WRAPPER}} .oew-table-cell[data-title]:before' => 'color: {{VALUE}};',
				],
			]
		);

		$this->end_controls_tab();

		$this->start_controls_tab(
			'tab_headers_hover_colors',
			[
				'label' 		=> __( 'Hover', 'ocean-elementor-widgets' ),
			]
		);

		$this->add_control(
			'headers_hover_bg',
			[
				'label' 		=> __( 'Background Color', 'ocean-elementor-widgets' ),
				'type' 			=> Controls_Manager::COLOR,
				'selectors' 	=> [
					'{{WRAPPER}} th.oew-table-cell:hover' => 'background-color: {{VALUE}};',
				],
			]
		);

		$this->add_control(
			'headers_hover_color',
			[
				'label' 		=> __( 'Color', 'ocean-elementor-widgets' ),
				'type' 			=> Controls_Manager::COLOR,
				'selectors' 	=> [
					'{{WRAPPER}} th.oew-table-cell:hover .oew-table-text' => 'color: {{VALUE}};',
				],
			]
		);

		$this->end_controls_tab();

		$this->end_controls_tabs();

		$this->add_responsive_control(
			'headers_padding',
			[
				'label' 		=> __( 'Padding', 'ocean-elementor-widgets' ),
				'type' 			=> Controls_Manager::DIMENSIONS,
				'size_units' 	=> [ 'px', 'em', '%' ],
				'selectors' 	=> [
					'{{WRAPPER}} th.oew-table-cell .oew-table-text' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
					'{{WRAPPER}} .oew-table-cell[data-title]:before' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
				],
			]
		);

		$this->add_group_control(
			Group_Control_Border::get_type(),
			[
				'name' 			=> 'headers_border',
				'label' 		=> __( 'Border', 'ocean-elementor-widgets' ),
				'selector' 		=> '{{WRAPPER}} th.oew-table-cell, {{WRAPPER}} .oew-table-cell[data-title]:before',
			]
		);

		$this->end_controls_section();

	}

	protected function is_invalid_first_row() {
		$settings = $this->get_settings();

		if ( 'row' === $settings['rows'][0]['content_type'] ) {
			return false;
		}

		return true;
	}

	protected function render() {
		$settings 		= $this->get_settings_for_display();

		$counter 		= 1;
		$cell_counter 	= 0;
		$head_output 	= '';
		$output 		= '';
		$row_count 		= count( $settings['rows'] );

		$this->add_render_attribute( 'table', 'class', [
			'oew-table',
			'oew-table-' . $settings['row_alternate'],
		] );

		$this->add_render_attribute( 'row', 'class', 'oew-table-row' ); ?>
		
		<table <?php echo $this->get_render_attribute_string( 'table' ); ?>>

			<?php
			if ( $settings['header_cells'] ) { ?>

				<thead>
					<tr <?php echo $this->get_render_attribute_string( 'row' ); ?>>

						<?php
						foreach ( $settings['header_cells'] as $index => $row ) {

							$key = $this->get_repeater_setting_key( 'cell_text', 'header_cells', $index );
							
							$this->add_render_attribute( 'header-' . $counter, 'class', 'oew-table-cell' );
							$this->add_render_attribute( 'header-' . $counter, 'class', 'elementor-repeater-item-' . $row['_id'] );

							$this->add_render_attribute( 'header-text-' . $counter, 'class', 'oew-table-text' );
							$this->add_render_attribute( $key, 'class', 'oew-table-text-inner' );
							$this->add_inline_editing_attributes( $key, 'basic' );

							if ( $row['_item_id'] ) {
								$this->add_render_attribute( 'header-' . $counter, 'id', $row['_item_id'] );
							}

							if ( $row['css_classes'] ) {
								$this->add_render_attribute( 'header-' . $counter, 'class', $row['css_classes'] );
							}

							if ( $row['cell_span'] > 1 ) {
								$this->add_render_attribute( 'header-' . $counter, 'colspan', $row['cell_span'] );
							}

							if ( $row['cell_row_span'] > 1 ) {
								$this->add_render_attribute( 'header-' . $counter, 'rowspan', $row['cell_row_span'] );
							}

							// Output header contents
							$head_output .= '<th ' . $this->get_render_attribute_string( 'header-' . $counter ) . '>';
								$head_output .= '<span ' . $this->get_render_attribute_string( 'header-text-' . $counter ) . '>';

								if ( '' !== $row['cell_icon'] ) {

									$this->add_render_attribute( 'icon-' . $counter, 'class', 'elementor-align-icon-' . $row['cell_icon_align'] );

									$head_output .= '<span ' . $this->get_render_attribute_string( 'icon-' . $counter ) . '>';
										$head_output .= '<i class="' . esc_attr( $row['cell_icon'] ) . '"></i>';
									$head_output .= '</span>';
								}

								$head_output .= '<span ' . $this->get_render_attribute_string( $key ) . '>' . $row['cell_text'] . '</span>';

								$head_output .= '</span>';
							$head_output .= '</th>';

						}

						echo $head_output; ?>

					</tr>

				</thead>

			<?php
			}

			if ( $settings['rows'] ) { ?>

				<tbody>

					<?php if ( $this->is_invalid_first_row() ) { ?>
						<tr <?php echo $this->get_render_attribute_string( 'row' ); ?>>
					<?php } ?>

						<?php
						foreach ( $settings['rows'] as $index => $row ) {

							$text_tag 		= 'span';
							$header_text 	= '';
							$content_key 	= $this->get_repeater_setting_key( 'content_text', 'rows', $index );

							if ( ! empty( $row['content_link']['url'] ) ) {

								$text_tag = 'a';

								$this->add_render_attribute( 'text-' . $counter, 'href', $row['content_link']['url'] );

								if ( $row['content_link']['is_external'] ) {
									$this->add_render_attribute( 'text-' . $counter, 'target', '_blank' );
								}

								if ( ! empty( $row['content_link']['nofollow'] ) ) {
									$this->add_render_attribute( 'text-' . $counter, 'rel', 'nofollow' );
								}
							}
							
							if ( $row['content_type'] === 'cell' ) {

								if ( 'hide' !== $settings['hide_headers_mobile'] ) {

									// Fetch corresponding header cell text
									if ( isset( $settings['header_cells'][ $cell_counter ] ) ) {
										$header_text = $settings['header_cells'][ $cell_counter ]['cell_text'];
									}

									// Increment to next cell
									$cell_counter++;

								}

								$this->add_render_attribute( 'cell-' . $counter, 'class', 'oew-table-cell' );
								$this->add_render_attribute( 'cell-' . $counter, 'class', 'elementor-repeater-item-' . $row['_id'] );

								$this->add_render_attribute( 'text-' . $counter, 'class', 'oew-table-text' );
								$this->add_render_attribute( $content_key, 'class', 'oew-table-text-inner' );
								$this->add_inline_editing_attributes( $content_key, 'basic' );

								if ( $row['content_item_id'] ) {
									$this->add_render_attribute( 'cell-' . $counter, 'id', $row['content_item_id'] );
								}

								if ( $row['content_css_classes'] ) {
									$this->add_render_attribute( 'cell-' . $counter, 'class', $row['content_css_classes'] );
								}

								if ( $header_text ) {
									$this->add_render_attribute( 'cell-' . $counter, 'data-title', $header_text );
								}

								if ( $row['content_span'] > 1 ) {
									$this->add_render_attribute( 'cell-' . $counter, 'colspan', $row['content_span'] );
								}

								if ( $row['content_row_span'] > 1 ) {
									$this->add_render_attribute( 'cell-' . $counter, 'rowspan', $row['content_row_span'] );
								}

								// Output cell contents
								$output .= '<' . $row['cell_type'] . ' ' . $this->get_render_attribute_string( 'cell-' . $counter ) . '>';
								$output .= '<' . $text_tag . ' ' . $this->get_render_attribute_string( 'text-' . $counter ) . '>';

								if ( '' !== $row['content_icon'] ) {

									$this->add_render_attribute( 'icon-' . $counter, 'class', 'elementor-align-icon-' . $row['content_icon_align'] );

									$output .= '<span ' . $this->get_render_attribute_string( 'icon-' . $counter ) . '>';
										$output .= '<i class="' . esc_attr( $row['content_icon'] ) . '"></i>';
									$output .= '</span>';
								}

								$output .= '<span ' . $this->get_render_attribute_string( $content_key ) . '>' . $row['content_text'] . '</span>';
								$output .= '</' . $text_tag . '>';
								$output .= '</' . $row['cell_type'] . '>';

							} else {

								$this->add_render_attribute( 'row-' . $counter, 'class', 'oew-table-row' );
								$this->add_render_attribute( 'row-' . $counter, 'class', 'elementor-repeater-item-' . $row['_id'] );

								if ( $row['content_item_id'] ) {
									$this->add_render_attribute( 'row-' . $counter, 'id', $row['content_item_id'] );
								}

								if ( $row['content_css_classes'] ) {
									$this->add_render_attribute( 'row-' . $counter, 'class', $row['content_css_classes'] );
								}

								if ( $counter > 1 && $counter < $row_count ) {

									// Break into new row
									$output .= '</tr><tr ' . $this->get_render_attribute_string( 'row-' . $counter ) . '>';

								} else if ( $counter === 1 && false === $this->is_invalid_first_row() ) {
									$output .= '<tr ' . $this->get_render_attribute_string( 'row-' . $counter ) . '>';
								}

								$cell_counter = 0;
							}

							$counter++;

						}

						echo $output; ?>

					</tr>

				</tbody>

			<?php } ?>

		</table>

	<?php
	}

	protected function _content_template() { ?>
		<#
		var counter 				= 1,
			cell_counter 			= 0,
			row_count 				= settings.rows.length,
			is_invalid_first_row 	= false;

		if ( 'row' !== settings.rows[0].type ) {
			is_invalid_first_row = true;
		} #>

		<table class="oew-table oew-table-{{ settings.row_alternate }}">

			<# if ( settings.header_cells ) { #>

				<thead>

					<tr class="oew-table-row">

						<# _.each( settings.header_cells, function( row ) { #>

							<th id="{{ row._item_id }}" class="oew-table-cell elementor-repeater-item-{{ row._id }} {{ row.css_classes }}" colspan="{{ row.cell_span }}" rowspan="{{ row.cell_row_span }}">
								<span class="oew-table-text">

									<# if ( '' !== row.cell_icon ) { #>
										<span class="elementor-align-icon-{{ row.cell_icon_align }}">
											<i class="{{ row.cell_icon }}"></i>
										</span>
									<# } #>

									<span class="oew-table-text-inner elementor-inline-editing" data-elementor-setting-key="header_cells.{{ counter - 1 }}.cell_text" data-elementor-inline-editing-toolbar="basic">{{{ row.cell_text }}}</span>

								</span>
							</th>

						<# counter++;

						} ); counter = 1; #>

					</tr>

				</thead>

			<# } #>

			<# if ( settings.rows ) { #>

				<tbody>

					<# if ( is_invalid_first_row ) { #>
						<tr class="oew-table-row">
					<# }

						_.each( settings.rows, function( row ) {

							var text_tag 			= 'span',
								text_link 			= '',
								header_text 		= '',
								data_header_text 	= '';

							if ( '' !== row.content_link.url ) {
								text_tag = 'a';
								text_link = 'href="' + row.content_link.url + '"';
							}

							if ( row.content_type === 'cell' ) {

								if ( 'hide' !== settings.hide_headers_mobile ) {

									if ( undefined !== settings.header_cells[ cell_counter ] ) {
										header_text = settings.header_cells[ cell_counter ].cell_text;
									}

									cell_counter++;
								}

								if ( header_text ) {
									data_header_text = 'data-title="' + header_text + '"';
								} #>

								<{{ row.cell_type }} id="{{ row.content_item_id }}" class="oew-table-cell elementor-repeater-item-{{ row._id }} {{ row.content_css_classes }}" colspan="{{ row.content_span }}" rowspan="{{ row.content_row_span }}" {{{ data_header_text }}}>

									<{{ text_tag }} {{ text_link }} class="oew-table-text">
										<# if ( '' !== row.content_icon ) { #>
											<span class="elementor-align-icon-{{ row.content_icon_align }}">
												<i class="{{ row.content_icon }}"></i>
											</span>
										<# } #>
										<span class="oew-table-text-inner elementor-inline-editing" data-elementor-setting-key="rows.{{ counter - 1 }}.content_text" data-elementor-inline-editing-toolbar="basic">{{{ row.content_text }}}</span>
									</{{ text_tag }}>

								</{{ row.cell_type }}>

							<# } else {

								if ( counter > 1 && counter < row_count ) { #>
									</tr><tr class="oew-table-row elementor-repeater-item-{{ row._id }} {{ row.content_css_classes }}" id="{{ row.content_item_id }}">
								<# } else if ( 1 === counter && ! is_invalid_first_row ) { #>
									<tr class="oew-table-row elementor-repeater-item-{{ row._id }} {{ row.content_css_classes }}" id="{{ row.content_item_id }}">
								<# }

								cell_counter = 0;
							}

						counter++;

						} ); #>

					</tr>

				</tbody>

			<# } #>

		</table>

	<?php
	}

}