Ninja Tables – WP Data Table Plugin for WordPress - Version 4.1.9

Version Description

(Date: January 28, 2022) = - Improves data sanitization

=4.1.8 (Date: January 27, 2022) = - Adds no follow option - Adds font customization - Adds time format option in date field - Fixes Ace library issue - Fixes CSV library issue - Improves data sanitization - Improves Admin UI

=4.1.7 (Date: September 17, 2021) - Added woocommerce product variations - Fixes date & date range filter manual input date search issue - Fixes progressive filter filter_selects - Fixes category post filter issue - Fixes filter shortcode for AND logical operator and phrase filter

=4.1.6 (Date: Jun 28, 2021) - Fixes CSV export & Print issue in frontend - Fixes transform value reference shortcode - Fixes filter table data print issue in frontend - Fixes advance shortcode filters for filter_selects in frontend - Fixes searcher flick issue in frontend - Fixes large data loading table hide issue in frontend - Fixes custom filter checkbox & select strict mode issue in frontend - Fixes custom filter issue for special character in frontend - Fixes custom filter number range input value issue in frontend - Fixes custom filter manual data multiselect table hide issue in mobile device - Fixes special character sorting issue

=4.1.5 (Date: Feb 18, 2021) - Fixes value transformation in admin page.

=4.1.4 (Date: Feb 16, 2021) - Fixes AJAX data loading for public nonce issue.

=4.1.3 (Date: Feb 13, 2021) - Adds transformed value sorting & filtering. - Improves formula support for European numbers. - Fixes exact match filtering for multi-select.

=4.1.2 (Date: Feb 08, 2021) - Fixes calculation for European formatted numbers. - Fixes frontend CSV export issue for accented characters. - Fixes TablePress import order. - Fixes elementor popup. - Fixes WP latest jQuery update issues.

=4.1.1 (Date: Nov 21, 2020) - Fixes Google Sheets data fetching issue. - Fixes frontend pagination issue. - Fixes frontend data transformation issue.

=4.1.0 (Date: Nov 18, 2020) - Adds default diacritics filter support. - Fixes for diacritics sorting. - Fixes transform value on frontend. - Fixes Google Sheets integration.

=4.0.2 (Date: Sep 14, 2020) - Fixes client side value transformation module.

=4.0.1 (Date: Sep 14, 2020) - Fixes transform value bug for Excel formula. - Fixes regular search bugs for string value. - Fixes Semantic UI table's footer radius style. - Improves value transformation module.

=4.0.0 (Date: Sep 12, 2020) - Adds special characters (diacritics) search. - Adds Ninja Charts for data visualization. - Fixes sticky header issue. - Fixes table design issues. - Fixes sorting issues on export. - Fixes preload key request for custom fonts. - Fixes table filter for multiple instances on a page. - Fixes SQL table bugs. - Fixes pagination issues. - Fixes remote CSV title issue. - Fixes custom filters on Firefox. - Fixes custom filters design issues. - Fixes multi-select issues on Firefox. - Fixes minor bugs and improves overall performance.

=3.5.12 (Date: Apr 07, 2020) - Fixes shortcode defaults bug.

=3.5.11 (Date: Mar 23, 2020) - Adds all tables sorting. - Adds Jetpack lazy image compatibility. - Adds Fluent Form meta fields to display. - Adds cart and checkout button customization. - Adds batch insert for CSV to avoid PHP memory issue. - Adds filters and search to be included in the Print page. - Adds removing image options in both backend and frontend. - Adds all chunk data loaded hooks for frontend ('ninja_table_all_chunk_loaded''). - Fixes Safari ellipsis bug. - Fixes custom CSS duplication. - Fixes iPhone table width bug. - Fixes inline edit caching bug. - Fixes frontend editing focus bug. - Fixes Fluent Forms entry fetcher bug. - Fixes global appearance settings bug. - Fixes stackables for the latest jQuery. - Fixes Fluent Form provider variable bug. - Fixes conditional matching issues for sorting. - Fixes Google CSV no results error, filter "ninja_tables_remote_csv_timeout".

=3.5.10 (Date: Dec 27, 2019) - Fixes stackable tables on different devices. - Fixes stackable tables tbody color issues. - Fixes CSV import table bug.

=3.5.9 (Date: Dec 26, 2019) - Renders styles ahead of table load. - Improves page speed issues. - Adds meta query filters. - Improves print to allow customized styles. - Improves front end editing. - Fixes import & export issues. - Fixes Non-ASCII characters from Google Sheet issues. - Fixes possible browser rendering issues. - Fixes table duplicate issues. - Fixes stackable tables to expand all issues. - Fixes iOS rendering issues. - Fixes custom filter loading issues. - Fixes colored table with stackables issues. - Fixes sticky header background issue.

=3.5.8 (Date: Nov 09, 2019) - Adds plain text export support for CSV. - Adds Non-ASCII characters support for label filtering. - Adds dynamic table ID placeholder for custom CSS. - Fixed Stackable table frontend editing bug. - Fixed WooCommerce custom Buy Now button text. - Fixed missing transform value rendering bug. - Fixed sticky header bug. - Fixed stackable table print issue. - Fixed rowspan bug for paginated data.

=3.5.7 (Date: Aug 28, 2019) - All Accessibility Issues fixed so far (y) - Filtering issue fixed for number range - Date format bug fixed - Spinner effect improved - PHP warning fixed - Added filter and improvements - Number data type UX improved

=3.5.5 (Date: June 20, 2019) - Overall Improvement for editing screen - Added inline editing for select fields - Data type issues fix - Improved filter - Added table edit link from frontend

=3.5.2 (Date: July 13, 2019) = - Security Fixes - Improve Table Rendering - Added Inline editing

=3.5.0 (Date: July 10, 2019) = - Shortcode issue fixed on Ajax Data Table Rendering - WCAG AA Compatibility issue fixed - Fix issues for non-english languages - Fix scroll to top issue - Fix filtering issue - Improvements in Backend and data rendering

=3.4.5 (Date: June 01, 2019) = - Fix issue for csv export for backend - Integrity issue resolved - Expand issue resolved for stacks table - Remove all cache option added - Shortcode rendering issue resolved

=3.4.3 ( Date: May 27, 2019 ) = - Fix Shortcode rendering issue - Added few UI changes

=3.4.0 ( Date: May 24, 2019 ) = - Improved some design issues. - Added more filters for searching the data - Improve Multi-site support (100% support now) - Internal code improvement

=3.3.3 ( Date: April 08, 2019 ) = - Fix default filter issue. - Fix issue for search and transform value - Fix date rendering issue. - Improve performance

=3.3.0 ( Date: March 21, 2019 ) = - Improved table config and make it hookable - improve asset loading - Now the table comply with WCAG 2.1 AA - Added entry result counter - Fix caption for table - Overall performance improvement

=3.2.4 ( Date: January 25, 2019 ) = - Fix bug for Data sorting issues - Improve overall performance

=3.2.3 ( Date: January 19, 2019 ) = - Fix bug for data export-import json - Improve Frontend Rendering - Improve Data Sorting Issues

Download this release

Release Info

Developer techjewel
Plugin Icon 128x128 Ninja Tables – WP Data Table Plugin for WordPress
Version 4.1.9
Comparing to
See all releases

Code changes from version 4.1.8 to 4.1.9

admin/DeactivationMessage.php CHANGED
@@ -11,8 +11,9 @@ class DeactivationMessage
11
  if($this->isLocalhost()) {
12
  return;
13
  }
14
- $reason = ArrayHelper::get($_REQUEST, 'reason', 'other');
15
- $reason_message = ArrayHelper::get($_REQUEST, 'custom_message', '');
 
16
 
17
  $currentUser = wp_get_current_user();
18
  $data = array(
@@ -49,7 +50,7 @@ class DeactivationMessage
49
  ob_start();
50
  include 'partials/deactive_form.php';
51
  $message = ob_get_clean();
52
-
53
  echo $message;
54
  }
55
 
11
  if($this->isLocalhost()) {
12
  return;
13
  }
14
+ $requestData = ninja_tables_sanitize_array($_REQUEST);
15
+ $reason = ArrayHelper::get($requestData, 'reason', 'other');
16
+ $reason_message = ArrayHelper::get($requestData, 'custom_message', '');
17
 
18
  $currentUser = wp_get_current_user();
19
  $data = array(
50
  ob_start();
51
  include 'partials/deactive_form.php';
52
  $message = ob_get_clean();
53
+
54
  echo $message;
55
  }
56
 
admin/NinjaTablesAdmin.php CHANGED
@@ -423,7 +423,7 @@ class NinjaTablesAdmin
423
 
424
  public function enqueue_data_tables_scripts()
425
  {
426
- if (isset($_GET['page']) && $_GET['page'] == 'ninja_tables') {
427
  $this->enqueue_scripts();
428
  $this->enqueue_styles();
429
  }
@@ -478,7 +478,7 @@ class NinjaTablesAdmin
478
  );
479
 
480
 
481
- $requested_route = $_REQUEST['target_action'];
482
  if (isset($valid_routes[$requested_route])) {
483
  $this->{$valid_routes[$requested_route]}();
484
  } else if (isset($importRoutes[$requested_route])) {
@@ -500,8 +500,8 @@ class NinjaTablesAdmin
500
  $args = array(
501
  'posts_per_page' => $perPage,
502
  'offset' => $skip,
503
- 'orderby' => $_REQUEST['orderBy'],
504
- 'order' => $_REQUEST['order'],
505
  'post_type' => $this->cpt_name,
506
  'post_status' => 'any',
507
  );
@@ -543,7 +543,7 @@ class NinjaTablesAdmin
543
 
544
  public function storeTable()
545
  {
546
- if (!$_REQUEST['post_title']) {
547
  wp_send_json_error(array(
548
  'message' => __('The name field is required.', 'ninja-tables')
549
  ), 423);
@@ -585,8 +585,10 @@ class NinjaTablesAdmin
585
  public function saveCustomCSSJS()
586
  {
587
  $tableId = intval($_REQUEST['table_id']);
588
- $css = $_REQUEST['custom_css'];
589
- $js = $_REQUEST['custom_js'];
 
 
590
  $css = wp_strip_all_tags($css);
591
 
592
  update_post_meta($tableId, '_ninja_tables_custom_css', $css);
@@ -640,7 +642,7 @@ class NinjaTablesAdmin
640
  $tableColumns = array();
641
 
642
  if (isset($_REQUEST['columns'])) {
643
- $rawColumns = $_REQUEST['columns'];
644
  if ($rawColumns && is_array($rawColumns)) {
645
  foreach ($rawColumns as $column) {
646
  foreach ($column as $column_index => $column_value) {
@@ -669,7 +671,7 @@ class NinjaTablesAdmin
669
  $formattedTablePreference = array();
670
 
671
  if (isset($_REQUEST['table_settings'])) {
672
- $tablePreference = $_REQUEST['table_settings'];
673
  if ($tablePreference && is_array($tablePreference)) {
674
  $formattedTablePreference = ninjaTableNormalize($tablePreference);
675
 
@@ -733,11 +735,11 @@ class NinjaTablesAdmin
733
 
734
  public function getTableData()
735
  {
736
- $perPage = intval($_REQUEST['per_page']) ? intval($_REQUEST['per_page']) : 10;
737
  $currentPage = isset($_REQUEST['page']) ? intval($_REQUEST['page']) : 1;
738
  $skip = $perPage * ($currentPage - 1);
739
  $tableId = intval($_REQUEST['table_id']);
740
- $search = esc_attr($_REQUEST['search']);
741
 
742
  $dataSourceType = ninja_table_get_data_provider($tableId);
743
  if ($dataSourceType == 'default') {
@@ -851,11 +853,11 @@ class NinjaTablesAdmin
851
  public function storeData()
852
  {
853
  $tableId = intval($_REQUEST['table_id']);
854
- $row = $_REQUEST['row'];
855
  $formattedRow = array();
856
 
857
  foreach ($row as $key => $item) {
858
- $formattedRow[$key] = wp_kses_post(wp_unslash($item));
859
  }
860
 
861
  $attributes = array(
@@ -867,11 +869,17 @@ class NinjaTablesAdmin
867
  );
868
 
869
  if (isset($_REQUEST['settings'])) {
870
- $attributes['settings'] = maybe_serialize(wp_unslash($_REQUEST['settings']));
 
 
 
 
871
  }
872
 
873
- if (isset($_REQUEST['created_at']) && $_REQUEST['created_at']) {
874
- $attributes['created_at'] = sanitize_text_field($_REQUEST['created_at']);
 
 
875
  }
876
 
877
  if ($id = intval($_REQUEST['id'])) {
@@ -939,8 +947,9 @@ class NinjaTablesAdmin
939
  public function updateSingleCell()
940
  {
941
  $rowId = intval($_REQUEST['row_id']);
942
- $columnKey = sanitize_text_field($_REQUEST['column_key']);
943
- $columnValue = wp_unslash($_REQUEST['column_value']);
 
944
 
945
  // get The row first
946
  $row = ninja_tables_DbTable()
@@ -948,7 +957,7 @@ class NinjaTablesAdmin
948
  ->first();
949
 
950
  $values = json_decode($row->value, true);
951
- $values[$columnKey] = wp_kses_post($columnValue);
952
  ninja_tables_DbTable()
953
  ->where('id', $rowId)
954
  ->update([
@@ -993,9 +1002,10 @@ class NinjaTablesAdmin
993
 
994
  public function deleteData()
995
  {
996
- $tableId = intval($_REQUEST['table_id']);
 
997
 
998
- $id = $_REQUEST['id'];
999
 
1000
  $ids = is_array($id) ? $id : array($id);
1001
 
@@ -1016,7 +1026,7 @@ class NinjaTablesAdmin
1016
 
1017
  public function exportData()
1018
  {
1019
- $format = esc_attr($_REQUEST['format']);
1020
 
1021
  $tableId = intval($_REQUEST['table_id']);
1022
 
@@ -1242,7 +1252,7 @@ class NinjaTablesAdmin
1242
  public function saveNinjaTableFlagOnShortCode($post_id)
1243
  {
1244
  if (isset($_POST['post_content'])) {
1245
- $post_content = $_POST['post_content'];
1246
  } else {
1247
  $post = get_post($post_id);
1248
  $post_content = $post->post_content;
@@ -1616,7 +1626,7 @@ class NinjaTablesAdmin
1616
  public function updateButtonSettings()
1617
  {
1618
  $tableId = absint($_REQUEST['table_id']);
1619
- $buttonSettings = wp_unslash($_REQUEST['button_settings']);
1620
  update_post_meta($tableId, '_ninja_custom_table_buttons', $buttonSettings);
1621
  wp_send_json_success(array(
1622
  'message' => __('Settings successfully updated', 'ninja-tables')
423
 
424
  public function enqueue_data_tables_scripts()
425
  {
426
+ if (isset($_GET['page']) && sanitize_text_field($_GET['page']) == 'ninja_tables') {
427
  $this->enqueue_scripts();
428
  $this->enqueue_styles();
429
  }
478
  );
479
 
480
 
481
+ $requested_route = sanitize_text_field($_REQUEST['target_action']);
482
  if (isset($valid_routes[$requested_route])) {
483
  $this->{$valid_routes[$requested_route]}();
484
  } else if (isset($importRoutes[$requested_route])) {
500
  $args = array(
501
  'posts_per_page' => $perPage,
502
  'offset' => $skip,
503
+ 'orderby' => sanitize_text_field($_REQUEST['orderBy']),
504
+ 'order' => sanitize_text_field($_REQUEST['order']),
505
  'post_type' => $this->cpt_name,
506
  'post_status' => 'any',
507
  );
543
 
544
  public function storeTable()
545
  {
546
+ if (!sanitize_text_field($_REQUEST['post_title'])) {
547
  wp_send_json_error(array(
548
  'message' => __('The name field is required.', 'ninja-tables')
549
  ), 423);
585
  public function saveCustomCSSJS()
586
  {
587
  $tableId = intval($_REQUEST['table_id']);
588
+ // todo: we need to sanizite css & js properly.
589
+ // Probably need to see what other plugins do.
590
+ $css = sanitize_text_field($_REQUEST['custom_css']);
591
+ $js = sanitize_text_field($_REQUEST['custom_js']);
592
  $css = wp_strip_all_tags($css);
593
 
594
  update_post_meta($tableId, '_ninja_tables_custom_css', $css);
642
  $tableColumns = array();
643
 
644
  if (isset($_REQUEST['columns'])) {
645
+ $rawColumns = ninja_tables_sanitize_array($_REQUEST['columns']);
646
  if ($rawColumns && is_array($rawColumns)) {
647
  foreach ($rawColumns as $column) {
648
  foreach ($column as $column_index => $column_value) {
671
  $formattedTablePreference = array();
672
 
673
  if (isset($_REQUEST['table_settings'])) {
674
+ $tablePreference = ninja_tables_sanitize_array($_REQUEST['table_settings']);
675
  if ($tablePreference && is_array($tablePreference)) {
676
  $formattedTablePreference = ninjaTableNormalize($tablePreference);
677
 
735
 
736
  public function getTableData()
737
  {
738
+ $perPage = isset($_REQUEST['per_page']) ? intval($_REQUEST['per_page']) : 10;
739
  $currentPage = isset($_REQUEST['page']) ? intval($_REQUEST['page']) : 1;
740
  $skip = $perPage * ($currentPage - 1);
741
  $tableId = intval($_REQUEST['table_id']);
742
+ $search = sanitize_text_field($_REQUEST['search']);
743
 
744
  $dataSourceType = ninja_table_get_data_provider($tableId);
745
  if ($dataSourceType == 'default') {
853
  public function storeData()
854
  {
855
  $tableId = intval($_REQUEST['table_id']);
856
+ $row = ninja_tables_sanitize_array($_REQUEST['row']);
857
  $formattedRow = array();
858
 
859
  foreach ($row as $key => $item) {
860
+ $formattedRow[$key] = wp_unslash($item);
861
  }
862
 
863
  $attributes = array(
869
  );
870
 
871
  if (isset($_REQUEST['settings'])) {
872
+ $attributes['settings'] = maybe_serialize(
873
+ wp_unslash(
874
+ ninja_tables_sanitize_array($_REQUEST['settings'])
875
+ )
876
+ );
877
  }
878
 
879
+ $createdAt = isset($_REQUEST['created_at']) && sanitize_text_field($_REQUEST['created_at']);
880
+
881
+ if ($createdAt) {
882
+ $attributes['created_at'] = $createdAt;
883
  }
884
 
885
  if ($id = intval($_REQUEST['id'])) {
947
  public function updateSingleCell()
948
  {
949
  $rowId = intval($_REQUEST['row_id']);
950
+ $data = ninja_tables_sanitize_array($_REQUEST);
951
+ $columnKey = sanitize_text_field($data['column_key']);
952
+ $columnValue = wp_unslash($data['column_value']);
953
 
954
  // get The row first
955
  $row = ninja_tables_DbTable()
957
  ->first();
958
 
959
  $values = json_decode($row->value, true);
960
+ $values[$columnKey] = $columnValue;
961
  ninja_tables_DbTable()
962
  ->where('id', $rowId)
963
  ->update([
1002
 
1003
  public function deleteData()
1004
  {
1005
+ $data = ninja_tables_sanitize_array($_REQUEST);
1006
+ $tableId = intval($data['table_id']);
1007
 
1008
+ $id = $data['id'];
1009
 
1010
  $ids = is_array($id) ? $id : array($id);
1011
 
1026
 
1027
  public function exportData()
1028
  {
1029
+ $format = sanitize_text_field($_REQUEST['format']);
1030
 
1031
  $tableId = intval($_REQUEST['table_id']);
1032
 
1252
  public function saveNinjaTableFlagOnShortCode($post_id)
1253
  {
1254
  if (isset($_POST['post_content'])) {
1255
+ $post_content = wp_kses_post($_POST['post_content']);
1256
  } else {
1257
  $post = get_post($post_id);
1258
  $post_content = $post->post_content;
1626
  public function updateButtonSettings()
1627
  {
1628
  $tableId = absint($_REQUEST['table_id']);
1629
+ $buttonSettings = wp_unslash(ninja_tables_sanitize_array($_REQUEST['button_settings']));
1630
  update_post_meta($tableId, '_ninja_custom_table_buttons', $buttonSettings);
1631
  wp_send_json_success(array(
1632
  'message' => __('Settings successfully updated', 'ninja-tables')
admin/partials/deactive_form.php CHANGED
@@ -1,4 +1,4 @@
1
- <div class="ninja-deactivation-feedback <?php echo $slug; ?>_modal no-confirmation-message">
2
  <div class="ninja-modal-dialog">
3
  <div class="ninja-modal-header"><h4>Quick feedback</h4></div>
4
  <div class="ninja-modal-body">
@@ -7,28 +7,28 @@
7
  <h3><strong>If you have a moment, please let us know why you are deactivating:</strong></h3>
8
  <ul id="reasons-list">
9
  <?php foreach ($reasons as $reason_key => $reason): ?>
10
- <li class="reason">
11
- <label>
12
  <span>
13
- <input class="<?php echo ($reason['has_custom']) ? 'has_custom' : ''; ?>" type="radio" name="selected-reason" value="<?php echo $reason_key; ?>">
14
  </span>
15
- <span><?php echo $reason['label']; ?></span>
16
- </label>
17
- <?php if($reason['has_custom']): ?>
18
- <div class="ninja_custom_feedback">
19
- <label>
20
- <span><?php echo $reason['custom_label']; ?></span>
21
- <input type="text" name="<?php echo $reason_key; ?>_custom" placeholder="<?php echo $reason['custom_placeholder']; ?>" />
22
- </label>
23
- </div>
24
- <?php endif; ?>
25
- </li>
26
  <?php endforeach; ?>
27
  </ul>
28
  </div>
29
  </div>
30
  <div class="ninja-modal-footer">
31
- <a class="ninja_action_deactivate button" href="#">Skip & Deactivate</a>
32
  <a href="#" class="ninja_action_close button button-primary button-close">Cancel</a>
33
  </div>
34
  </div>
@@ -37,10 +37,10 @@
37
  <script type="text/javascript">
38
  jQuery(document).ready(function ($) {
39
 
40
- jQuery('tr[data-slug="<?php echo $slug;?>"]').on('click', '.deactivate a', function (e) {
41
  e.preventDefault();
42
- $('.<?php echo $slug; ?>_modal').addClass('active');
43
- $('.<?php echo $slug; ?>_modal a.ninja_action_deactivate').attr('href', $(this).attr('href'));
44
  });
45
 
46
  $('.ninja_action_close').on('click', function(e) {
@@ -48,14 +48,14 @@
48
  $('.ninja-deactivation-feedback').removeClass('active');
49
  });
50
 
51
- $('.<?php echo $slug; ?>_modal input[name="selected-reason"').on('change', function (e) {
52
- e.preventDefault();
53
- $('a.ninja_action_deactivate').text('Submit & Deactive').addClass('has_feedback');
54
- $('.ninja_custom_feedback').removeClass('active');
55
- $(this).closest('.reason').find('.ninja_custom_feedback').addClass('active');
56
  });
57
 
58
- $('.<?php echo $slug; ?>_modal .ninja-modal-footer').on('click', 'a.ninja_action_deactivate.has_feedback', function (e) {
59
  e.preventDefault();
60
  var redirectLink = $(this).attr('href');
61
 
@@ -63,7 +63,7 @@
63
  var custom_message = $('input[name="'+reason+'_custom"]').val();
64
  $(this).text('Deactivating...').attr('disabled', true);
65
  jQuery.post(ajaxurl, {
66
- action: '<?php echo $slug; ?>_deactivate_feedback',
67
  reason: reason,
68
  custom_message: custom_message
69
  })
1
+ <div class="ninja-deactivation-feedback <?php esc_attr_e($slug); ?>_modal no-confirmation-message">
2
  <div class="ninja-modal-dialog">
3
  <div class="ninja-modal-header"><h4>Quick feedback</h4></div>
4
  <div class="ninja-modal-body">
7
  <h3><strong>If you have a moment, please let us know why you are deactivating:</strong></h3>
8
  <ul id="reasons-list">
9
  <?php foreach ($reasons as $reason_key => $reason): ?>
10
+ <li class="reason">
11
+ <label>
12
  <span>
13
+ <input class="<?php esc_attr_e(($reason['has_custom']) ? 'has_custom' : ''); ?>" type="radio" name="selected-reason" value="<?php esc_attr_e($reason_key); ?>">
14
  </span>
15
+ <span><?php esc_attr_e($reason['label']); ?></span>
16
+ </label>
17
+ <?php if($reason['has_custom']): ?>
18
+ <div class="ninja_custom_feedback">
19
+ <label>
20
+ <span><?php esc_attr_e($reason['custom_label']); ?></span>
21
+ <input type="text" name="<?php esc_attr_e($reason_key); ?>_custom" placeholder="<?php esc_attr_e($reason['custom_placeholder']); ?>" />
22
+ </label>
23
+ </div>
24
+ <?php endif; ?>
25
+ </li>
26
  <?php endforeach; ?>
27
  </ul>
28
  </div>
29
  </div>
30
  <div class="ninja-modal-footer">
31
+ <a class="ninja_action_deactivate button" href="#">Skip & Deactivate</a>
32
  <a href="#" class="ninja_action_close button button-primary button-close">Cancel</a>
33
  </div>
34
  </div>
37
  <script type="text/javascript">
38
  jQuery(document).ready(function ($) {
39
 
40
+ jQuery('tr[data-slug="<?php esc_attr_e($slug);?>"]').on('click', '.deactivate a', function (e) {
41
  e.preventDefault();
42
+ $('.<?php esc_attr_e($slug); ?>_modal').addClass('active');
43
+ $('.<?php esc_attr_e($slug); ?>_modal a.ninja_action_deactivate').attr('href', $(this).attr('href'));
44
  });
45
 
46
  $('.ninja_action_close').on('click', function(e) {
48
  $('.ninja-deactivation-feedback').removeClass('active');
49
  });
50
 
51
+ $('.<?php esc_attr_e($slug); ?>_modal input[name="selected-reason"').on('change', function (e) {
52
+ e.preventDefault();
53
+ $('a.ninja_action_deactivate').text('Submit & Deactive').addClass('has_feedback');
54
+ $('.ninja_custom_feedback').removeClass('active');
55
+ $(this).closest('.reason').find('.ninja_custom_feedback').addClass('active');
56
  });
57
 
58
+ $('.<?php esc_attr_e($slug); ?>_modal .ninja-modal-footer').on('click', 'a.ninja_action_deactivate.has_feedback', function (e) {
59
  e.preventDefault();
60
  var redirectLink = $(this).attr('href');
61
 
63
  var custom_message = $('input[name="'+reason+'_custom"]').val();
64
  $(this).text('Deactivating...').attr('disabled', true);
65
  jQuery.post(ajaxurl, {
66
+ action: '<?php esc_attr_e($slug); ?>_deactivate_feedback',
67
  reason: reason,
68
  custom_message: custom_message
69
  })
includes/NinjaTableClass.php CHANGED
@@ -217,7 +217,7 @@ class NinjaTableClass
217
  $this->loader->add_action('ninja_table_check_db_integrity', $plugin_admin, 'checkDBMigrations');
218
 
219
  add_action('admin_enqueue_scripts', function () {
220
- if (isset($_GET['page']) && $_GET['page'] == 'ninja_tables') {
221
  if (function_exists('wp_enqueue_editor')) {
222
  wp_enqueue_editor();
223
  }
@@ -227,13 +227,13 @@ class NinjaTableClass
227
  }
228
  });
229
 
230
- add_filter('pre_set_site_transient_update_plugins', function ($updates) {
231
- if (!empty($updates->response['ninja-tables-pro'])) {
232
- $updates->response['ninja-tables-pro/ninja-tables-pro.php'] = $updates->response['ninja-tables-pro'];
233
- unset($updates->response['ninja-tables-pro']);
234
- }
235
- return $updates;
236
- }, 999, 1);
237
 
238
 
239
  global $pagenow;
@@ -248,7 +248,7 @@ class NinjaTableClass
248
  $this->loader->add_filter('plugin_action_links_ninja-tables/ninja-tables.php', $plugin_admin, 'add_plugin_action_links');
249
 
250
  add_filter('admin_footer_text', function ($content) {
251
- if (isset($_GET['page']) && $_GET['page'] == 'ninja_tables') {
252
  $content = 'If you like Ninja Tables <a target="_blank" href="https://wordpress.org/support/plugin/ninja-tables/reviews/#new-post">please leave us a ★★★★★ rating</a>. Many thanks from the WPManageNinja team in advance :)';
253
  }
254
  return $content;
217
  $this->loader->add_action('ninja_table_check_db_integrity', $plugin_admin, 'checkDBMigrations');
218
 
219
  add_action('admin_enqueue_scripts', function () {
220
+ if (isset($_GET['page']) && sanitize_text_field($_GET['page']) == 'ninja_tables') {
221
  if (function_exists('wp_enqueue_editor')) {
222
  wp_enqueue_editor();
223
  }
227
  }
228
  });
229
 
230
+ // add_filter('pre_set_site_transient_update_plugins', function ($updates) {
231
+ // if (!empty($updates->response['ninja-tables-pro'])) {
232
+ // $updates->response['ninja-tables-pro/ninja-tables-pro.php'] = $updates->response['ninja-tables-pro'];
233
+ // unset($updates->response['ninja-tables-pro']);
234
+ // }
235
+ // return $updates;
236
+ // }, 999, 1);
237
 
238
 
239
  global $pagenow;
248
  $this->loader->add_filter('plugin_action_links_ninja-tables/ninja-tables.php', $plugin_admin, 'add_plugin_action_links');
249
 
250
  add_filter('admin_footer_text', function ($content) {
251
+ if (isset($_GET['page']) && sanitize_text_field($_GET['page']) == 'ninja_tables') {
252
  $content = 'If you like Ninja Tables <a target="_blank" href="https://wordpress.org/support/plugin/ninja-tables/reviews/#new-post">please leave us a ★★★★★ rating</a>. Many thanks from the WPManageNinja team in advance :)';
253
  }
254
  return $content;
includes/NinjaTableImport.php CHANGED
@@ -12,7 +12,7 @@ class NinjaTableImport
12
 
13
  public function importTable()
14
  {
15
- $format = $_REQUEST['format'];
16
 
17
  if ($format == 'csv') {
18
  $this->uploadTableCsv();
@@ -50,7 +50,7 @@ class NinjaTableImport
50
 
51
  public function importTableFromPlugin()
52
  {
53
- $plugin = esc_attr($_REQUEST['plugin']);
54
  $tableId = intval($_REQUEST['tableId']);
55
 
56
  if ($plugin == 'UltimateTables') {
@@ -115,18 +115,18 @@ class NinjaTableImport
115
  'application/txt'
116
  );
117
 
118
- if (!in_array($_FILES['file']['type'], $mimes)) {
119
  wp_send_json_error(array(
120
  'errors' => array(),
121
  'message' => __('Please upload valid CSV', 'ninja-tables')
122
  ), 423);
123
  }
124
 
125
- $tmpName = $_FILES['file']['tmp_name'];
126
  $fileName = sanitize_text_field($_FILES['file']['name']);
127
 
128
  $data = file_get_contents($tmpName);
129
- if (isset($_REQUEST['do_unicode']) && $_REQUEST['do_unicode'] == 'yes') {
130
  $data = utf8_encode($data);
131
  }
132
 
@@ -164,7 +164,7 @@ class NinjaTableImport
164
  {
165
  $tableId = $this->createTable();
166
 
167
- $tmpName = $_FILES['file']['tmp_name'];
168
 
169
  $content = json_decode(file_get_contents($tmpName), true);
170
 
@@ -188,7 +188,7 @@ class NinjaTableImport
188
 
189
  private function uploadTableNinjaJson()
190
  {
191
- $tmpName = $_FILES['file']['tmp_name'];
192
 
193
  $parsedContent = file_get_contents($tmpName);
194
 
@@ -269,10 +269,10 @@ class NinjaTableImport
269
  public function uploadData()
270
  {
271
  $tableId = intval($_REQUEST['table_id']);
272
- $tmpName = $_FILES['file']['tmp_name'];
273
 
274
  $data = file_get_contents($tmpName);
275
- if (isset($_REQUEST['do_unicode']) && $_REQUEST['do_unicode'] == 'yes') {
276
  $data = utf8_encode($data);
277
  }
278
 
@@ -327,7 +327,7 @@ class NinjaTableImport
327
  $timeStamp = $timeStamp + 100;
328
  }
329
 
330
- $replace = $_REQUEST['replace'] === 'true';
331
 
332
  $data = apply_filters('ninja_tables_import_table_data', $data, $tableId);
333
 
12
 
13
  public function importTable()
14
  {
15
+ $format = sanitize_text_field($_REQUEST['format']);
16
 
17
  if ($format == 'csv') {
18
  $this->uploadTableCsv();
50
 
51
  public function importTableFromPlugin()
52
  {
53
+ $plugin = sanitize_text_field($_REQUEST['plugin']);
54
  $tableId = intval($_REQUEST['tableId']);
55
 
56
  if ($plugin == 'UltimateTables') {
115
  'application/txt'
116
  );
117
 
118
+ if (!in_array(sanitize_text_field($_FILES['file']['type']), $mimes)) {
119
  wp_send_json_error(array(
120
  'errors' => array(),
121
  'message' => __('Please upload valid CSV', 'ninja-tables')
122
  ), 423);
123
  }
124
 
125
+ $tmpName = sanitize_text_field($_FILES['file']['tmp_name']);
126
  $fileName = sanitize_text_field($_FILES['file']['name']);
127
 
128
  $data = file_get_contents($tmpName);
129
+ if (isset($_REQUEST['do_unicode']) && sanitize_text_field($_REQUEST['do_unicode']) == 'yes') {
130
  $data = utf8_encode($data);
131
  }
132
 
164
  {
165
  $tableId = $this->createTable();
166
 
167
+ $tmpName = sanitize_text_field($_FILES['file']['tmp_name']);
168
 
169
  $content = json_decode(file_get_contents($tmpName), true);
170
 
188
 
189
  private function uploadTableNinjaJson()
190
  {
191
+ $tmpName = sanitize_text_field($_FILES['file']['tmp_name']);
192
 
193
  $parsedContent = file_get_contents($tmpName);
194
 
269
  public function uploadData()
270
  {
271
  $tableId = intval($_REQUEST['table_id']);
272
+ $tmpName = sanitize_text_field($_FILES['file']['tmp_name']);
273
 
274
  $data = file_get_contents($tmpName);
275
+ if (isset($_REQUEST['do_unicode']) && sanitize_text_field($_REQUEST['do_unicode']) == 'yes') {
276
  $data = utf8_encode($data);
277
  }
278
 
327
  $timeStamp = $timeStamp + 100;
328
  }
329
 
330
+ $replace = sanitize_text_field($_REQUEST['replace']) === 'true';
331
 
332
  $data = apply_filters('ninja_tables_import_table_data', $data, $tableId);
333
 
includes/ProcessDemoPage.php CHANGED
@@ -6,10 +6,14 @@ class ProcessDemoPage
6
  {
7
  public function handleExteriorPages()
8
  {
9
- if (isset($_GET['ninjatable_preview']) && $_GET['ninjatable_preview']) {
10
- if (ninja_table_admin_role()) {
11
- $tableId = intval($_GET['ninjatable_preview']);
 
 
12
 
 
 
13
  do_action('ninja_tables_will_render_table', $tableId);
14
 
15
  wp_enqueue_style('ninja-tables-preview', plugin_dir_url(__DIR__) . "assets/css/ninja-tables-preview.css");
6
  {
7
  public function handleExteriorPages()
8
  {
9
+ $tableId = null;
10
+
11
+ if (isset($_GET['ninjatable_preview'])) {
12
+ $tableId = intval($_GET['ninjatable_preview']);
13
+ }
14
 
15
+ if ($tableId) {
16
+ if (ninja_table_admin_role()) {
17
  do_action('ninja_tables_will_render_table', $tableId);
18
 
19
  wp_enqueue_style('ninja-tables-preview', plugin_dir_url(__DIR__) . "assets/css/ninja-tables-preview.css");
includes/libs/Lead/LeadFlow.php CHANGED
@@ -84,7 +84,7 @@ class LeadFlow {
84
  }
85
 
86
  public function addNotice( $message, $type = 'success', $id = '', $hasDismiss = true ) {
87
- if ( isset( $_GET['page'] ) && $_GET['page'] == 'ninja_tables' ) {
88
  return;
89
  }
90
  $this->notices[ $id ] = array(
@@ -99,16 +99,16 @@ class LeadFlow {
99
  public function showNotices() {
100
  foreach ( $this->notices as $notice ) {
101
  ?>
102
- <div data-notice_id="<?php echo $notice['id']; ?>"
103
- class="notice notice-<?php echo $notice['type']; ?> mn-notices mn-has-title">
104
  <?php if ( $notice['title'] ): ?>
105
- <label class="mn-plugin-title"><?php echo $notice['title']; ?></label>
106
  <?php endif; ?>
107
  <div class="mn-close">
108
  <i class="dashicons dashicons-no" title="Dismiss"></i><span>Dismiss</span>
109
  </div>
110
  <div class="mn-notice-body">
111
- <?php echo $notice['message']; ?>
112
  </div>
113
  </div>
114
  <?php
84
  }
85
 
86
  public function addNotice( $message, $type = 'success', $id = '', $hasDismiss = true ) {
87
+ if ( isset( $_GET['page'] ) && sanitize_text_field($_GET['page']) == 'ninja_tables' ) {
88
  return;
89
  }
90
  $this->notices[ $id ] = array(
99
  public function showNotices() {
100
  foreach ( $this->notices as $notice ) {
101
  ?>
102
+ <div data-notice_id="<?php esc_attr_e($notice['id']); ?>"
103
+ class="notice notice-<?php esc_attr_e($notice['type']); ?> mn-notices mn-has-title">
104
  <?php if ( $notice['title'] ): ?>
105
+ <label class="mn-plugin-title"><?php esc_html_e($notice['title']); ?></label>
106
  <?php endif; ?>
107
  <div class="mn-close">
108
  <i class="dashicons dashicons-no" title="Dismiss"></i><span>Dismiss</span>
109
  </div>
110
  <div class="mn-notice-body">
111
+ <?php esc_html_e($notice['message']); ?>
112
  </div>
113
  </div>
114
  <?php
includes/libs/TableDrivers/views/ninja_foo_table.php CHANGED
@@ -1,5 +1,5 @@
1
- <div id="footable_parent_<?php echo $table_id; ?>"
2
- class="footable_parent ninja_table_wrapper loading_ninja_table wp_table_data_press_parent <?php echo $settings['css_lib']; ?> <?php echo $tableHasColor; ?>">
3
  <?php if (isset($settings['show_title']) && $settings['show_title']) : ?>
4
  <?php do_action('ninja_tables_before_table_title', $table); ?>
5
  <h3 class="table_title footable_title"><?php echo esc_attr($table->post_title); ?></h3>
@@ -13,16 +13,16 @@
13
  $table); ?>
14
  <?php endif; ?>
15
  <?php do_action('ninja_tables_before_table_print', $table, $table_vars); ?>
16
- <table data-ninja_table_instance="<?php echo $table_instance_name; ?>" <?php echo $foo_table_attributes; ?>
17
  id="footable_<?php echo intval($table_id); ?>"
18
- data-unique_identifier="<?php echo $tableArray['uniqueID']; ?>"
19
- class=" foo-table ninja_footable foo_table_<?php echo intval($table_id); ?> <?php echo $tableArray['uniqueID']; ?> <?php echo esc_attr($table_classes); ?>">
20
  <?php if ($tableCaption): ?>
21
- <caption><?php echo $tableCaption; ?></caption>
22
  <?php endif; ?>
23
  <colgroup>
24
  <?php foreach ($formatted_columns as $index => $column) : ?>
25
- <col class="ninja_column_<?php echo $index . ' ' . $column['breakpoints']; ?>">
26
  <?php endforeach; ?>
27
  </colgroup>
28
  <?php do_action('ninja_tables_inside_table_render', $table, $table_vars); ?>
@@ -36,7 +36,7 @@
36
  <?php endif; ?>
37
 
38
  <?php if (is_user_logged_in() && ninja_table_admin_role()): ?>
39
- <a class="nt_edit_link" href="<?php echo admin_url('admin.php?page=ninja_tables#/tables/' . $table->ID); ?>">
40
  <?php _e('Edit Table', 'ninja-tables') ?>
41
  </a>
42
  <?php endif; ?>
1
+ <div id="footable_parent_<?php esc_attr_e($table_id); ?>"
2
+ class="footable_parent ninja_table_wrapper loading_ninja_table wp_table_data_press_parent <?php esc_attr_e($settings['css_lib']); ?> <?php esc_attr_e($tableHasColor); ?>">
3
  <?php if (isset($settings['show_title']) && $settings['show_title']) : ?>
4
  <?php do_action('ninja_tables_before_table_title', $table); ?>
5
  <h3 class="table_title footable_title"><?php echo esc_attr($table->post_title); ?></h3>
13
  $table); ?>
14
  <?php endif; ?>
15
  <?php do_action('ninja_tables_before_table_print', $table, $table_vars); ?>
16
+ <table data-ninja_table_instance="<?php esc_attr_e($table_instance_name); ?>" <?php esc_attr_e($foo_table_attributes); ?>
17
  id="footable_<?php echo intval($table_id); ?>"
18
+ data-unique_identifier="<?php esc_attr_e($tableArray['uniqueID']); ?>"
19
+ class=" foo-table ninja_footable foo_table_<?php echo intval($table_id); ?> <?php esc_attr_e($tableArray['uniqueID']); ?> <?php echo esc_attr($table_classes); ?>">
20
  <?php if ($tableCaption): ?>
21
+ <caption><?php esc_attr_e($tableCaption); ?></caption>
22
  <?php endif; ?>
23
  <colgroup>
24
  <?php foreach ($formatted_columns as $index => $column) : ?>
25
+ <col class="ninja_column_<?php esc_attr_e($index . ' ' . $column['breakpoints']); ?>">
26
  <?php endforeach; ?>
27
  </colgroup>
28
  <?php do_action('ninja_tables_inside_table_render', $table, $table_vars); ?>
36
  <?php endif; ?>
37
 
38
  <?php if (is_user_logged_in() && ninja_table_admin_role()): ?>
39
+ <a class="nt_edit_link" href="<?php echo esc_url_raw(admin_url('admin.php?page=ninja_tables#/tables/' . $table->ID)); ?>">
40
  <?php _e('Edit Table', 'ninja-tables') ?>
41
  </a>
42
  <?php endif; ?>
includes/libs/TableDrivers/views/ninja_footable_css.php CHANGED
@@ -1,79 +1,79 @@
1
- <style id="ninja_table_custom_css_<?php echo $tableId; ?>" type="text/css">
2
  <?php if($fonts):?>
3
- <?php echo $css_prefix; ?> {
4
- font-family: <?php echo $fonts['table_font_family'];?> !important;
5
- font-size: <?php echo $fonts['table_font_size'];?>px !important;
6
  }
7
  <?php endif;?>
8
  <?php if($colors): ?>
9
- <?php echo $css_prefix; ?>,
10
- <?php echo $css_prefix; ?> table {
11
- background-color: <?php echo $colors['table_color_primary']; ?> !important;
12
- color: <?php echo $colors['table_color_secondary']; ?> !important;
13
- border-color: <?php echo $colors['table_color_border']; ?> !important;
14
  }
15
- <?php echo $css_prefix; ?> thead tr.footable-filtering th {
16
- background-color: <?php echo $colors['table_search_color_primary']; ?> !important;
17
- color: <?php echo $colors['table_search_color_secondary']; ?> !important;
18
  }
19
- <?php echo $css_prefix; ?>:not(.hide_all_borders) thead tr.footable-filtering th {
20
  <?php if($colors['table_search_color_border']): ?>
21
- border : 1px solid <?php echo $colors['table_search_color_border']; ?> !important;
22
  <?php else: ?>
23
  border : 1px solid transparent !important;
24
  <?php endif; ?>
25
  }
26
- <?php echo $css_prefix; ?> .input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) {
27
- background-color: <?php echo $colors['table_search_color_secondary']; ?> !important;
28
- color: <?php echo $colors['table_search_color_primary']; ?> !important;
29
  }
30
- <?php echo $css_prefix; ?> tr.footable-header, <?php echo $css_prefix; ?> tr.footable-header th, .colored_table table.ninja_table_pro.inverted.table.footable-details tbody tr th {
31
- background-color: <?php echo $colors['table_header_color_primary']; ?> !important;
32
- color: <?php echo $colors['table_color_header_secondary']; ?> !important;
33
  }
34
  <?php if($colors['table_color_header_border']) : ?>
35
- <?php echo $css_prefix; ?>:not(.hide_all_borders) tr.footable-header th, <?php echo $css_prefix; ?>:not(.hide_all_borders) tbody tr th {
36
- border-color: <?php echo $colors['table_color_header_border']; ?> !important;
37
  }
38
  <?php endif; ?>
39
 
40
  <?php if(isset($colors['table_color_border']) && $colors['table_color_border']) : ?>
41
- <?php echo $css_prefix; ?>:not(.hide_all_borders) tbody tr td {
42
- border-color: <?php echo $colors['table_color_border']; ?> !important;
43
  }
44
  <?php endif; ?>
45
- <?php echo $css_prefix; ?> tbody tr:hover {
46
- background-color: <?php echo $colors['table_color_primary_hover']; ?> !important;
47
- color: <?php echo $colors['table_color_secondary_hover']; ?> !important;
48
  }
49
- <?php echo $css_prefix; ?> tbody tr:hover td {
50
- border-color: <?php echo $colors['table_color_border_hover']; ?> !important;
51
  }
52
  <?php if(isset($colors['alternate_color_status']) && $colors['alternate_color_status'] == 'yes'): ?>
53
- <?php echo $css_prefix; ?> tbody tr:nth-child(even) {
54
- background-color: <?php echo $colors['table_alt_color_primary']; ?> !important;
55
- color: <?php echo $colors['table_alt_color_secondary']; ?> !important;
56
  }
57
- <?php echo $css_prefix; ?> tbody tr:nth-child(odd) {
58
- background-color: <?php echo $colors['table_alt_2_color_primary']; ?> !important;
59
- color: <?php echo $colors['table_alt_2_color_secondary']; ?> !important;
60
  }
61
- <?php echo $css_prefix; ?> tbody tr:nth-child(even):hover {
62
- background-color: <?php echo $colors['table_alt_color_hover']; ?> !important;
63
  }
64
- <?php echo $css_prefix; ?> tbody tr:nth-child(odd):hover {
65
- background-color: <?php echo $colors['table_alt_2_color_hover']; ?> !important;
66
  }
67
  <?php endif; ?>
68
 
69
- <?php echo $css_prefix; ?> tfoot .footable-paging {
70
- background-color: <?php echo $colors['table_footer_bg']; ?> !important;
71
  }
72
- <?php echo $css_prefix; ?> tfoot .footable-paging .footable-page.active a {
73
- background-color: <?php echo $colors['table_footer_active']; ?> !important;
74
  }
75
- <?php echo $css_prefix; ?>:not(.hide_all_borders) tfoot tr.footable-paging td {
76
- border-color: <?php echo $colors['table_footer_border']; ?> !important;
77
  }
78
  <?php endif; ?>
79
  <?php if($cellStyles): ?>
@@ -82,79 +82,79 @@
82
  $cell = maybe_unserialize($cellStyle->settings);
83
  $cellPrefix = $css_prefix.'.ninja_footable.ninja_table_pro tbody tr.nt_row_id_'.$cellStyle->id;
84
  ?>
85
- <?php echo $cellPrefix ?> {
86
- <?php if(@$cell['row_bg']): ?>background: <?php echo $cell['row_bg'].' !important;'; endif; ?>
87
- <?php if(@$cell['text_color']): ?>color: <?php echo $cell['text_color'].'!important;'; endif; ?>}
88
  <?php if($cell && isset($cell['cell']) && is_array($cell['cell'])) : foreach ($cell['cell'] as $cell_key => $values): ?>
89
  <?php $specCellPrefix = $cellPrefix.' .ninja_clmn_nm_'.$cell_key; ?>
90
- <?php echo $specCellPrefix ?> {
91
  <?php foreach ($values as $value_key => $value){ ?>
92
- <?php if($value): echo $value_key; ?> : <?php echo $value.';'; endif; ?>
93
  <?php } ?>
94
  }
95
- <?php echo $specCellPrefix ?> > * { color: inherit }
96
  <?php endforeach; endif; // end of if(is_array($cell['cell'])) ?>
97
  <?php endforeach; ?>
98
  <?php endif; ?>
99
 
100
  <?php if($hasStackable): ?>
101
- <?php echo $css_prefix; ?>.ninja_stacked_table > tbody, <?php echo $css_prefix; ?>.ninja_stacked_table {
102
  background: transparent !important;
103
  }
104
  <?php if ($colors) : ?>
105
- <?php echo $css_prefix; ?>.ninja_stacked_table .footable-details tbody {
106
- background-color: <?php echo $colors['table_color_primary']; ?> !important;
107
- color: <?php echo $colors['table_color_secondary']; ?> !important;
108
- border-color: <?php echo $colors['table_color_border']; ?> !important;
109
- }
110
- <?php echo $stackPrefix; ?> thead tr.footable-filtering th {
111
- background-color: <?php echo $colors['table_search_color_primary']; ?> !important;
112
- color: <?php echo $colors['table_search_color_secondary']; ?> !important;
113
  }
114
- <?php echo $stackPrefix; ?>:not(.hide_all_borders) thead tr.footable-filtering th {
115
  <?php if($colors['table_search_color_border']): ?>
116
- border : 1px solid <?php echo $colors['table_search_color_border']; ?> !important;
117
  <?php else: ?>
118
  border : 1px solid transparent !important;
119
  <?php endif; ?>
120
  }
121
- <?php echo $stackPrefix; ?> .input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) {
122
- background-color: <?php echo $colors['table_search_color_secondary']; ?> !important;
123
- color: <?php echo $colors['table_search_color_primary']; ?> !important;
124
  }
125
- <?php echo $stackPrefix; ?> tr.footable-header, <?php echo $stackPrefix; ?> tr.footable-header th {
126
- background-color: <?php echo $colors['table_header_color_primary']; ?> !important;
127
- color: <?php echo $colors['table_color_header_secondary']; ?> !important;
128
  }
129
  <?php endif; ?>
130
  <?php if(isset($colors['table_color_header_border']) && $colors['table_color_header_border']) : ?>
131
- <?php echo $stackPrefix; ?>:not(.hide_all_borders) tr.footable-header th {
132
- border-color: <?php echo $colors['table_color_header_border']; ?> !important;
133
  }
134
  <?php endif; ?>
135
 
136
  <?php if(isset($colors['table_color_border']) && $colors['table_color_border']) : ?>
137
- <?php echo $css_prefix; ?>:not(.hide_all_borders) tbody tr td table {
138
- border-color: <?php echo $colors['table_color_border']; ?> !important;
139
  }
140
  <?php endif; ?>
141
  <?php if(isset($css_prefix['alternate_color_status']) && $css_prefix['alternate_color_status'] == 'yes'): ?>
142
- <?php echo $stackPrefix; ?> tbody tr:nth-child(even) {
143
- background-color: <?php echo $colors['table_alt_color_primary']; ?>;
144
- color: <?php echo $colors['table_alt_color_secondary']; ?>;
145
  }
146
- <?php echo $stackPrefix; ?> tbody tr:nth-child(odd) {
147
- background-color: <?php echo $colors['table_alt_2_color_primary']; ?>;
148
- color: <?php echo $colors['table_alt_2_color_secondary']; ?>;
149
  }
150
- <?php echo $stackPrefix; ?> tbody tr:nth-child(even):hover {
151
- background-color: <?php echo $colors['table_alt_color_hover']; ?>;
152
  }
153
- <?php echo $stackPrefix; ?> tbody tr:nth-child(odd):hover {
154
- background-color: <?php echo $colors['table_alt_2_color_hover']; ?>;
155
  }
156
  <?php endif; ?>
157
  <?php endif; ?>
158
 
159
- <?php echo $custom_css; ?>
160
  </style>
1
+ <style id="ninja_table_custom_css_<?php esc_attr_e($tableId); ?>" type="text/css">
2
  <?php if($fonts):?>
3
+ <?php esc_attr_e($css_prefix); ?> {
4
+ font-family: <?php esc_attr_e($fonts['table_font_family']);?> !important;
5
+ font-size: <?php esc_attr_e($fonts['table_font_size']);?>px !important;
6
  }
7
  <?php endif;?>
8
  <?php if($colors): ?>
9
+ <?php esc_attr_e($css_prefix); ?>,
10
+ <?php esc_attr_e($css_prefix); ?> table {
11
+ background-color: <?php esc_attr_e($colors['table_color_primary']); ?> !important;
12
+ color: <?php esc_attr_e($colors['table_color_secondary']); ?> !important;
13
+ border-color: <?php esc_attr_e($colors['table_color_border']); ?> !important;
14
  }
15
+ <?php esc_attr_e($css_prefix); ?> thead tr.footable-filtering th {
16
+ background-color: <?php esc_attr_e($colors['table_search_color_primary']); ?> !important;
17
+ color: <?php esc_attr_e($colors['table_search_color_secondary']); ?> !important;
18
  }
19
+ <?php esc_attr_e($css_prefix); ?>:not(.hide_all_borders) thead tr.footable-filtering th {
20
  <?php if($colors['table_search_color_border']): ?>
21
+ border : 1px solid <?php esc_attr_e($colors['table_search_color_border']); ?> !important;
22
  <?php else: ?>
23
  border : 1px solid transparent !important;
24
  <?php endif; ?>
25
  }
26
+ <?php esc_attr_e($css_prefix); ?> .input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) {
27
+ background-color: <?php esc_attr_e($colors['table_search_color_secondary']); ?> !important;
28
+ color: <?php esc_attr_e($colors['table_search_color_primary']); ?> !important;
29
  }
30
+ <?php esc_attr_e($css_prefix); ?> tr.footable-header, <?php esc_attr_e($css_prefix); ?> tr.footable-header th, .colored_table table.ninja_table_pro.inverted.table.footable-details tbody tr th {
31
+ background-color: <?php esc_attr_e($colors['table_header_color_primary']); ?> !important;
32
+ color: <?php esc_attr_e($colors['table_color_header_secondary']); ?> !important;
33
  }
34
  <?php if($colors['table_color_header_border']) : ?>
35
+ <?php esc_attr_e($css_prefix); ?>:not(.hide_all_borders) tr.footable-header th, <?php esc_attr_e($css_prefix); ?>:not(.hide_all_borders) tbody tr th {
36
+ border-color: <?php esc_attr_e($colors['table_color_header_border']); ?> !important;
37
  }
38
  <?php endif; ?>
39
 
40
  <?php if(isset($colors['table_color_border']) && $colors['table_color_border']) : ?>
41
+ <?php esc_attr_e($css_prefix); ?>:not(.hide_all_borders) tbody tr td {
42
+ border-color: <?php esc_attr_e($colors['table_color_border']); ?> !important;
43
  }
44
  <?php endif; ?>
45
+ <?php esc_attr_e($css_prefix); ?> tbody tr:hover {
46
+ background-color: <?php esc_attr_e($colors['table_color_primary_hover']); ?> !important;
47
+ color: <?php esc_attr_e($colors['table_color_secondary_hover']); ?> !important;
48
  }
49
+ <?php esc_attr_e($css_prefix); ?> tbody tr:hover td {
50
+ border-color: <?php esc_attr_e($colors['table_color_border_hover']); ?> !important;
51
  }
52
  <?php if(isset($colors['alternate_color_status']) && $colors['alternate_color_status'] == 'yes'): ?>
53
+ <?php esc_attr_e($css_prefix); ?> tbody tr:nth-child(even) {
54
+ background-color: <?php esc_attr_e($colors['table_alt_color_primary']); ?> !important;
55
+ color: <?php esc_attr_e($colors['table_alt_color_secondary']); ?> !important;
56
  }
57
+ <?php esc_attr_e($css_prefix); ?> tbody tr:nth-child(odd) {
58
+ background-color: <?php esc_attr_e($colors['table_alt_2_color_primary']); ?> !important;
59
+ color: <?php esc_attr_e($colors['table_alt_2_color_secondary']); ?> !important;
60
  }
61
+ <?php esc_attr_e($css_prefix); ?> tbody tr:nth-child(even):hover {
62
+ background-color: <?php esc_attr_e($colors['table_alt_color_hover']); ?> !important;
63
  }
64
+ <?php esc_attr_e($css_prefix); ?> tbody tr:nth-child(odd):hover {
65
+ background-color: <?php esc_attr_e($colors['table_alt_2_color_hover']); ?> !important;
66
  }
67
  <?php endif; ?>
68
 
69
+ <?php esc_attr_e($css_prefix); ?> tfoot .footable-paging {
70
+ background-color: <?php esc_attr_e($colors['table_footer_bg']); ?> !important;
71
  }
72
+ <?php esc_attr_e($css_prefix); ?> tfoot .footable-paging .footable-page.active a {
73
+ background-color: <?php esc_attr_e($colors['table_footer_active']); ?> !important;
74
  }
75
+ <?php esc_attr_e($css_prefix); ?>:not(.hide_all_borders) tfoot tr.footable-paging td {
76
+ border-color: <?php esc_attr_e($colors['table_footer_border']); ?> !important;
77
  }
78
  <?php endif; ?>
79
  <?php if($cellStyles): ?>
82
  $cell = maybe_unserialize($cellStyle->settings);
83
  $cellPrefix = $css_prefix.'.ninja_footable.ninja_table_pro tbody tr.nt_row_id_'.$cellStyle->id;
84
  ?>
85
+ <?php esc_attr_e($cellPrefix)?> {
86
+ <?php if(@$cell['row_bg']): ?>background: <?php esc_attr_e($cell['row_bg']).' !important;'; endif; ?>
87
+ <?php if(@$cell['text_color']): ?>color: <?php esc_attr_e($cell['text_color']).'!important;'; endif; ?>}
88
  <?php if($cell && isset($cell['cell']) && is_array($cell['cell'])) : foreach ($cell['cell'] as $cell_key => $values): ?>
89
  <?php $specCellPrefix = $cellPrefix.' .ninja_clmn_nm_'.$cell_key; ?>
90
+ <?php esc_attr_e($specCellPrefix) ?> {
91
  <?php foreach ($values as $value_key => $value){ ?>
92
+ <?php if($value): esc_attr_e($value_key); ?> : <?php esc_attr_e($value).';'; endif; ?>
93
  <?php } ?>
94
  }
95
+ <?php esc_attr_e($specCellPrefix) ?> > * { color: inherit }
96
  <?php endforeach; endif; // end of if(is_array($cell['cell'])) ?>
97
  <?php endforeach; ?>
98
  <?php endif; ?>
99
 
100
  <?php if($hasStackable): ?>
101
+ <?php esc_attr_e($css_prefix); ?>.ninja_stacked_table > tbody, <?php echo $css_prefix; ?>.ninja_stacked_table {
102
  background: transparent !important;
103
  }
104
  <?php if ($colors) : ?>
105
+ <?php esc_attr_e($css_prefix); ?>.ninja_stacked_table .footable-details tbody {
106
+ background-color: <?php esc_attr_e($colors['table_color_primary']); ?> !important;
107
+ color: <?php esc_attr_e($colors['table_color_secondary']); ?> !important;
108
+ border-color: <?php esc_attr_e($colors['table_color_border']); ?> !important;
109
+ }
110
+ <?php esc_attr_e($stackPrefix); ?> thead tr.footable-filtering th {
111
+ background-color: <?php esc_attr_e($colors['table_search_color_primary']); ?> !important;
112
+ color: <?php esc_attr_e($colors['table_search_color_secondary']); ?> !important;
113
  }
114
+ <?php esc_attr_e($stackPrefix); ?>:not(.hide_all_borders) thead tr.footable-filtering th {
115
  <?php if($colors['table_search_color_border']): ?>
116
+ border : 1px solid <?php esc_attr_e($colors['table_search_color_border']); ?> !important;
117
  <?php else: ?>
118
  border : 1px solid transparent !important;
119
  <?php endif; ?>
120
  }
121
+ <?php esc_attr_e($stackPrefix); ?> .input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) {
122
+ background-color: <?php esc_attr_e($colors['table_search_color_secondary']); ?> !important;
123
+ color: <?php esc_attr_e($colors['table_search_color_primary']); ?> !important;
124
  }
125
+ <?php esc_attr_e($stackPrefix); ?> tr.footable-header, <?php esc_attr_e($stackPrefix); ?> tr.footable-header th {
126
+ background-color: <?php esc_attr_e($colors['table_header_color_primary']); ?> !important;
127
+ color: <?php esc_attr_e($colors['table_color_header_secondary']); ?> !important;
128
  }
129
  <?php endif; ?>
130
  <?php if(isset($colors['table_color_header_border']) && $colors['table_color_header_border']) : ?>
131
+ <?php esc_attr_e($stackPrefix); ?>:not(.hide_all_borders) tr.footable-header th {
132
+ border-color: <?php esc_attr_e($colors['table_color_header_border']); ?> !important;
133
  }
134
  <?php endif; ?>
135
 
136
  <?php if(isset($colors['table_color_border']) && $colors['table_color_border']) : ?>
137
+ <?php esc_attr_e($css_prefix); ?>:not(.hide_all_borders) tbody tr td table {
138
+ border-color: <?php esc_attr_e($colors['table_color_border']); ?> !important;
139
  }
140
  <?php endif; ?>
141
  <?php if(isset($css_prefix['alternate_color_status']) && $css_prefix['alternate_color_status'] == 'yes'): ?>
142
+ <?php esc_attr_e($stackPrefix); ?> tbody tr:nth-child(even) {
143
+ background-color: <?php esc_attr_e($colors['table_alt_color_primary']); ?>;
144
+ color: <?php esc_attr_e($colors['table_alt_color_secondary']); ?>;
145
  }
146
+ <?php esc_attr_e($stackPrefix); ?> tbody tr:nth-child(odd) {
147
+ background-color: <?php esc_attr_e($colors['table_alt_2_color_primary']); ?>;
148
+ color: <?php esc_attr_e($colors['table_alt_2_color_secondary']); ?>;
149
  }
150
+ <?php esc_attr_e($stackPrefix); ?> tbody tr:nth-child(even):hover {
151
+ background-color: <?php esc_attr_e($colors['table_alt_color_hover']); ?>;
152
  }
153
+ <?php esc_attr_e($stackPrefix); ?> tbody tr:nth-child(odd):hover {
154
+ background-color: <?php esc_attr_e($colors['table_alt_2_color_hover']); ?>;
155
  }
156
  <?php endif; ?>
157
  <?php endif; ?>
158
 
159
+ <?php esc_attr_e($custom_css); ?>
160
  </style>
includes/libs/csv/src/Config/Output.php CHANGED
@@ -206,7 +206,7 @@ trait Output
206
  if (!empty($bom)) {
207
  $csv->fseek(mb_strlen($input_bom));
208
  }
209
- echo $bom;
210
  $res = $csv->fpassthru();
211
 
212
  return $res + strlen($bom);
206
  if (!empty($bom)) {
207
  $csv->fseek(mb_strlen($input_bom));
208
  }
209
+ esc_html_e($bom);
210
  $res = $csv->fpassthru();
211
 
212
  return $res + strlen($bom);
includes/ninja_tables-global-functions.php CHANGED
@@ -231,7 +231,7 @@ function ninja_table_get_icon_url()
231
  }
232
 
233
  if (!function_exists('ninja_tables_is_valid_url')) {
234
- define('URL_FORMAT',
235
  '/^(https?):\/\/' . // protocol
236
  '(([a-z0-9$_\.\+!\*\'\(\),;\?&=-]|%[0-9a-f]{2})+' . // username
237
  '(:([a-z0-9$_\.\+!\*\'\(\),;\?&=-]|%[0-9a-f]{2})+)?' . // password
@@ -248,7 +248,7 @@ if (!function_exists('ninja_tables_is_valid_url')) {
248
  '$/i');
249
  function ninja_tables_is_valid_url($url)
250
  {
251
- return preg_match(URL_FORMAT, $url);
252
  }
253
  }
254
 
@@ -878,7 +878,7 @@ function ninjaTablePreloadFont () {
878
  add_action('wp_head', function () {
879
  $preloadFontUrl = NINJA_TABLES_DIR_URL . "assets/fonts/ninja-tables.woff2?" . NINJA_TABLES_PRELOAD_FONT_VERSION;
880
  ?>
881
- <link rel="preload" as="font" href="<?php echo $preloadFontUrl ?>" type="font/woff2" crossorigin="anonymous">
882
  <?php
883
  }, 99);
884
  }
231
  }
232
 
233
  if (!function_exists('ninja_tables_is_valid_url')) {
234
+ define('NINJA_TABLES_URL_FORMAT',
235
  '/^(https?):\/\/' . // protocol
236
  '(([a-z0-9$_\.\+!\*\'\(\),;\?&=-]|%[0-9a-f]{2})+' . // username
237
  '(:([a-z0-9$_\.\+!\*\'\(\),;\?&=-]|%[0-9a-f]{2})+)?' . // password
248
  '$/i');
249
  function ninja_tables_is_valid_url($url)
250
  {
251
+ return preg_match(NINJA_TABLES_URL_FORMAT, $url);
252
  }
253
  }
254
 
878
  add_action('wp_head', function () {
879
  $preloadFontUrl = NINJA_TABLES_DIR_URL . "assets/fonts/ninja-tables.woff2?" . NINJA_TABLES_PRELOAD_FONT_VERSION;
880
  ?>
881
+ <link rel="preload" as="font" href="<?php esc_attr_e($preloadFontUrl) ?>" type="font/woff2" crossorigin="anonymous">
882
  <?php
883
  }, 99);
884
  }
ninja-tables.php CHANGED
@@ -16,7 +16,7 @@
16
  * Plugin Name: Ninja Tables
17
  * Plugin URI: https://wpmanageninja.com/downloads/ninja-tables-pro-add-on/
18
  * Description: The Easiest & Fastest Responsive Table Plugin on WordPress. Multiple templates, drag-&-drop live table builder, multiple color scheme, and styles.
19
- * Version: 4.1.8
20
  * Author: WPManageNinja LLC
21
  * Author URI: https://wpmanageninja.com/
22
  * License: GPL-2.0+
@@ -33,7 +33,7 @@ if (!defined('WPINC')) {
33
  define('NINJA_TABLES_DIR_URL', plugin_dir_url(__FILE__));
34
  define('NINJA_TABLES_DIR_PATH', plugin_dir_path(__FILE__));
35
  define('NINJA_TABLES_PUBLIC_DIR_URL', NINJA_TABLES_DIR_URL . 'public/');
36
- define('NINJA_TABLES_VERSION', '4.1.8');
37
  define('NINJA_TABLES_ASSET_VERSION', '3.1.0');
38
  define('NINJA_TABLES_PRELOAD_FONT_VERSION', "1a82860cb5286f7833a2c33fbdd1d76c");
39
 
16
  * Plugin Name: Ninja Tables
17
  * Plugin URI: https://wpmanageninja.com/downloads/ninja-tables-pro-add-on/
18
  * Description: The Easiest & Fastest Responsive Table Plugin on WordPress. Multiple templates, drag-&-drop live table builder, multiple color scheme, and styles.
19
+ * Version: 4.1.9
20
  * Author: WPManageNinja LLC
21
  * Author URI: https://wpmanageninja.com/
22
  * License: GPL-2.0+
33
  define('NINJA_TABLES_DIR_URL', plugin_dir_url(__FILE__));
34
  define('NINJA_TABLES_DIR_PATH', plugin_dir_path(__FILE__));
35
  define('NINJA_TABLES_PUBLIC_DIR_URL', NINJA_TABLES_DIR_URL . 'public/');
36
+ define('NINJA_TABLES_VERSION', '4.1.9');
37
  define('NINJA_TABLES_ASSET_VERSION', '3.1.0');
38
  define('NINJA_TABLES_PRELOAD_FONT_VERSION', "1a82860cb5286f7833a2c33fbdd1d76c");
39
 
public/NinjaTablePublic.php CHANGED
@@ -103,7 +103,7 @@ class NinjaTablePublic
103
  }
104
 
105
  $ownOnly = false;
106
- if (isset($_REQUEST['own_only']) && $_REQUEST['own_only'] == 'yes') {
107
  $ownOnly = true;
108
  }
109
 
103
  }
104
 
105
  $ownOnly = false;
106
+ if (isset($_REQUEST['own_only']) && sanitize_text_field($_REQUEST['own_only']) == 'yes') {
107
  $ownOnly = true;
108
  }
109
 
public/dataProviders/FluentFormProvider.php CHANGED
@@ -68,8 +68,8 @@ class FluentFormProvider
68
  ninjaTablesValidateNonce();
69
 
70
  $messages = array();
71
- $tableId = $_REQUEST['table_Id'];
72
- $formId = $_REQUEST['form']['id'];
73
 
74
  if (!$tableId) {
75
  // Validate Title
@@ -79,8 +79,8 @@ class FluentFormProvider
79
  }
80
 
81
  // Validate Columns
82
- $fields = isset($_REQUEST['form']['fields']) ? $_REQUEST['form']['fields'] : array();
83
- if (!($fields = ninja_tables_sanitize_array($fields))) {
84
  $messages['fields'] = __('No fields were selected.', 'ninja-tables');
85
  }
86
 
@@ -131,11 +131,11 @@ class FluentFormProvider
131
  }
132
 
133
  update_post_meta(
134
- $tableId, '_ninja_tables_data_provider_ff_entry_limit', $_REQUEST['form']['entry_limit']
135
  );
136
 
137
  update_post_meta(
138
- $tableId, '_ninja_tables_data_provider_ff_entry_status', $_REQUEST['form']['entry_status']
139
  );
140
 
141
  wp_send_json_success(array('table_id' => $tableId, 'form_id' => $formId));
68
  ninjaTablesValidateNonce();
69
 
70
  $messages = array();
71
+ $tableId = intval($_REQUEST['table_Id']);
72
+ $formId = intval($_REQUEST['form']['id']);
73
 
74
  if (!$tableId) {
75
  // Validate Title
79
  }
80
 
81
  // Validate Columns
82
+ $fields = isset($_REQUEST['form']['fields']) ? ninja_tables_sanitize_array($_REQUEST['form']['fields']) : array();
83
+ if (!$fields) {
84
  $messages['fields'] = __('No fields were selected.', 'ninja-tables');
85
  }
86
 
131
  }
132
 
133
  update_post_meta(
134
+ $tableId, '_ninja_tables_data_provider_ff_entry_limit', sanitize_text_field($_REQUEST['form']['entry_limit'])
135
  );
136
 
137
  update_post_meta(
138
+ $tableId, '_ninja_tables_data_provider_ff_entry_status', sanitize_text_field($_REQUEST['form']['entry_status'])
139
  );
140
 
141
  wp_send_json_success(array('table_id' => $tableId, 'form_id' => $formId));
public/views/frameless/show_review.php CHANGED
@@ -6,7 +6,7 @@
6
  <meta http-equiv="Imagetoolbar" content="No"/>
7
  <meta name="viewport" content="width=device-width, initial-scale=1">
8
  <title>
9
- <?php esc_html_e('Preview Table', 'ninja-tables') ?>
10
  </title>
11
  <?php
12
  wp_head();
@@ -21,24 +21,24 @@
21
  <div class="nt_preview_header_title">
22
  <ul>
23
  <li>
24
- [ninja_tables id="<?php echo $table_id; ?>"]
25
  </li>
26
  </ul>
27
  </div>
28
  <div class="nt_preview_header_action">
29
- <a href="<?php echo admin_url('admin.php?page=ninja_tables#/tables/' . $table_id) ?>">Edit</a>
30
  </div>
31
  </div>
32
 
33
  <div class="nt_preview_body">
34
  <div class="nt_preview_body_wrapper">
35
- <?php echo do_shortcode('[ninja_tables id="' . $table_id . '"]'); ?>
36
  </div>
37
  </div>
38
  <div class="nt_preview_fotter">
39
  <p class="nt_preview_fotter_text">You are seeing preview version of Ninja Tables. This table is only accessible for Admin users. Other users
40
  may not access this page. To use this for in a page please use the following shortcode: [ninja_tables
41
- id='<?php echo $table_id ?>']</p>
42
  </div>
43
  </div>
44
  <?php
6
  <meta http-equiv="Imagetoolbar" content="No"/>
7
  <meta name="viewport" content="width=device-width, initial-scale=1">
8
  <title>
9
+ <?php esc_attr_e('Preview Table', 'ninja-tables') ?>
10
  </title>
11
  <?php
12
  wp_head();
21
  <div class="nt_preview_header_title">
22
  <ul>
23
  <li>
24
+ [ninja_tables id="<?php esc_attr_e($table_id); ?>"]
25
  </li>
26
  </ul>
27
  </div>
28
  <div class="nt_preview_header_action">
29
+ <a href="<?php echo esc_url_raw(admin_url('admin.php?page=ninja_tables#/tables/' . $table_id)) ?>">Edit</a>
30
  </div>
31
  </div>
32
 
33
  <div class="nt_preview_body">
34
  <div class="nt_preview_body_wrapper">
35
+ <?php echo(do_shortcode('[ninja_tables id="' . $table_id . '"]')); ?>
36
  </div>
37
  </div>
38
  <div class="nt_preview_fotter">
39
  <p class="nt_preview_fotter_text">You are seeing preview version of Ninja Tables. This table is only accessible for Admin users. Other users
40
  may not access this page. To use this for in a page please use the following shortcode: [ninja_tables
41
+ id='<?php esc_attr_e($table_id) ?>']</p>
42
  </div>
43
  </div>
44
  <?php
public/views/table_inner_html.php CHANGED
@@ -40,7 +40,7 @@ if ($table_rows && count($table_columns)):
40
  $row_class = 'ninja_table_row_' . $row_index;
41
  $row_class .= ' nt_row_id_' . $rowId;
42
  ?>
43
- <tr data-row_id="<?php echo $rowId; ?>" class="<?php echo $row_class; ?>">
44
  <?php
45
  $colSpanCounter = 1; // Make the colspan counter 1 at first
46
  foreach ($table_columns as $index => $table_column) {
40
  $row_class = 'ninja_table_row_' . $row_index;
41
  $row_class .= ' nt_row_id_' . $rowId;
42
  ?>
43
+ <tr data-row_id="<?php esc_attr_e($rowId); ?>" class="<?php esc_attr_e($row_class); ?>">
44
  <?php
45
  $colSpanCounter = 1; // Make the colspan counter 1 at first
46
  foreach ($table_columns as $index => $table_column) {
readme.txt CHANGED
@@ -5,7 +5,7 @@ Tags: table builder, table plugin, wpdatatables, wordpress tables, table grid, c
5
  Requires at least: 4.5
6
  Requires PHP: 5.4 or greater
7
  Tested up to: 5.9
8
- Stable tag: 4.1.8
9
  License: GPLv2 or later
10
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
11
 
@@ -315,6 +315,9 @@ Yes, you can connect your Google spreadsheets to your WordPress table plugin by
315
 
316
  == Changelog ==
317
 
 
 
 
318
  =4.1.8 (Date: January 27, 2022) =
319
  - Adds no follow option
320
  - Adds font customization
5
  Requires at least: 4.5
6
  Requires PHP: 5.4 or greater
7
  Tested up to: 5.9
8
+ Stable tag: 4.1.9
9
  License: GPLv2 or later
10
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
11
 
315
 
316
  == Changelog ==
317
 
318
+ = 4.1.9 (Date: January 28, 2022) =
319
+ - Improves data sanitization
320
+
321
  =4.1.8 (Date: January 27, 2022) =
322
  - Adds no follow option
323
  - Adds font customization