Data Tables Generator by Supsystic - Version 1.8.7

Version Description

/ 24.07.2018 = * Fix Multisite Installation process * Fixed the problem: Clicking on the cell raises the table up * Fixes for optioon Source - Database * Added the ability to edit database table data through the frontend fields * Added the ability to create diagrams for cells with shortcodes * Fix underline position by exporting to pdf * Fix of dynamically applying of diagram's options to diagram preview * Add support Strict Matching Option for SSP * Fix of displaying merged cells in table footer * Fix for GlobalSearch

Download this release

Release Info

Developer supsystic.com
Plugin Icon 128x128 Data Tables Generator by Supsystic
Version 1.8.7
Comparing to
See all releases

Code changes from version 1.8.5 to 1.8.7

app/SupsysticTables.php CHANGED
@@ -18,7 +18,7 @@ class SupsysticTables
18
 
19
  $menuSlug = 'supsystic-tables';
20
  $pluginPath = dirname(dirname(__FILE__));
21
- $environment = new Rsc_Environment('st', '1.8.5', $pluginPath);
22
 
23
  /* Configure */
24
  $environment->configure(
18
 
19
  $menuSlug = 'supsystic-tables';
20
  $pluginPath = dirname(dirname(__FILE__));
21
+ $environment = new Rsc_Environment('st', '1.8.7', $pluginPath);
22
 
23
  /* Configure */
24
  $environment->configure(
app/langs/supsystic_tables-vi.mo ADDED
Binary file
app/langs/supsystic_tables-vi.po ADDED
@@ -0,0 +1,2156 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ msgid ""
2
+ msgstr ""
3
+ "Project-Id-Version: \n"
4
+ "POT-Creation-Date: \n"
5
+ "PO-Revision-Date: \n"
6
+ "Language-Team: \n"
7
+ "MIME-Version: 1.0\n"
8
+ "Content-Type: text/plain; charset=UTF-8\n"
9
+ "Content-Transfer-Encoding: 8bit\n"
10
+ "X-Generator: Poedit 2.0.8\n"
11
+ "Last-Translator: \n"
12
+ "Plural-Forms: nplurals=1; plural=0;\n"
13
+ "Language: vi_VN\n"
14
+
15
+ msgid ""
16
+ "\n"
17
+ " You can set the rows and cols from the selected "
18
+ "range, which is need to be removed from diagram.<br /><br />\n"
19
+ " For example: 1r,2c<br /><br />\n"
20
+ " In this case the first row and the second column will "
21
+ "be removed from diagram.<br /><br />\n"
22
+ " Leave this field blank to use all selected rows and "
23
+ "columns."
24
+ msgstr ""
25
+ "\n"
26
+ " Bạn có thể đặt các hàng và cột từ phạm vi đã chọn, cần xóa khỏi sơ đồ. <br /"
27
+ "> <br />\n"
28
+ " Ví dụ: 1r, 2c <br /> <br />\n"
29
+ " Trong trường hợp này, hàng đầu tiên và cột thứ hai sẽ "
30
+ "bị xóa khỏi sơ đồ. <br /> <br />\n"
31
+ " Để trống trường này để sử dụng tất cả các hàng và cột "
32
+ "đã chọn."
33
+
34
+ msgid "(filtered from _MAX_ total entries)"
35
+ msgstr "(Được lọc từ mục nhập lớn nhất)"
36
+
37
+ msgid "11x17"
38
+ msgstr "11x17"
39
+
40
+ msgid "2A0"
41
+ msgstr "2A0"
42
+
43
+ msgid "3D Diagram"
44
+ msgstr "Biểu đồ 3D"
45
+
46
+ msgid "4A0"
47
+ msgstr "4A0"
48
+
49
+ msgid "8.5x11"
50
+ msgstr "8.5x11"
51
+
52
+ msgid "8.5x14"
53
+ msgstr "8.5x14"
54
+
55
+ msgid ""
56
+ "<a href=\"//supsystic.com/forum/datatable-plugin/\" target=\"_blank\"> "
57
+ "Contact us </a> through the Forum on our site - if you have some question, "
58
+ "offer or wish."
59
+ msgstr ""
60
+ "<a href=\"//supsystic.com/forum/datatable-plugin/\" target=\"_blank\"> Liên "
61
+ "hệ với chúng tôi </a> thông qua Diễn đàn trên trang web của chúng tôi - nếu "
62
+ "bạn có một số câu hỏi, ưu đãi hoặc mong muốn."
63
+
64
+ msgid ""
65
+ "<b>Upgrading</b> <br>Once you have purchased Premium version of plugin - "
66
+ "you’ll have to enter license key (you can find it in your personal account "
67
+ "on our site). Go to the License tab and enter your email and license key. "
68
+ "Once you have activated your PRO license - you can use all its advanced "
69
+ "options. <br><br>That’s all. From this moment you can use your Data Table "
70
+ "without any doubt. But if you still have some question - do not hesitate to "
71
+ "contact us through our <a href=\"https://supsystic.com/contact-us/"
72
+ "\">internal support</a> or on our <a href=\"http://supsystic.com/forum/"
73
+ "datatable-plugin/\">Supsystic Forum.</a> Besides you can always describe "
74
+ "your questions on <a href=\"https://wordpress.org/support/plugin/data-tables-"
75
+ "generator-by-supsystic\">WordPress Ultimate Forum.</a> <br><br><b>Enjoy this "
76
+ "plugin?</b> <br>It will be nice if you`ll help us and boost plugin with <a "
77
+ "href=\"https://wordpress.org/support/view/plugin-reviews/data-tables-"
78
+ "generator-by-supsystic?rate=5#postform/\">Five Stars rating on WordPress.org."
79
+ "</a> <br><br>We hope that you like our Data Table plugin and wish you all "
80
+ "the best! Good luck!"
81
+ msgstr ""
82
+ "<b> Nâng cấp </ b> <br> Khi bạn đã mua phiên bản cao cấp của plugin - bạn sẽ "
83
+ "phải nhập khóa cấp phép (bạn có thể tìm thấy nó trong tài khoản cá nhân của "
84
+ "mình trên trang web của chúng tôi). Chuyển đến tab Giấy phép và nhập email "
85
+ "và khóa cấp phép của bạn. Khi bạn đã kích hoạt giấy phép PRO của mình - bạn "
86
+ "có thể sử dụng tất cả các tùy chọn nâng cao của nó. <br> <br> Đó là tất cả. "
87
+ "Từ thời điểm này, bạn có thể sử dụng Bảng dữ liệu của mình mà không nghi ngờ "
88
+ "gì. Nhưng nếu bạn vẫn có một số câu hỏi - đừng ngần ngại liên hệ với chúng "
89
+ "tôi qua <a href=\"https://supsystic.com/contact-us/\"> bộ phận hỗ trợ nội bộ "
90
+ "</a> của chúng tôi hoặc trên <a href = \"http của chúng tôi : //supsystic."
91
+ "com/forum/datatable-plugin/ \"> Diễn đàn Supsystic. </a> Bên cạnh đó bạn "
92
+ "luôn có thể mô tả câu hỏi của mình trên <a href =\" https://wordpress.org/"
93
+ "support/plugin/data-tables -generator-by-supsystic \"> WordPress Ultimate "
94
+ "Forum. </a> <br> <br> <b> Thưởng thức plugin này? </ b> <br> Sẽ tốt hơn nếu "
95
+ "bạn giúp chúng tôi và tăng plugin bằng <a href=\"https://wordpress.org/"
96
+ "support/view/plugin-reviews/data-tables-generator-by-supsystic?"
97
+ "rate=5#postform/\"> Xếp hạng 5 sao trên WordPress.org. </ a > <br> <br> "
98
+ "Chúng tôi hy vọng bạn thích plugin Data Table của chúng tôi và chúc bạn mọi "
99
+ "điều tốt đẹp nhất! Chúc may mắn!"
100
+
101
+ msgid "A small guide for the first-time user"
102
+ msgstr "Hướng dẫn sử dung cho người dung lần đầu"
103
+
104
+ msgid ""
105
+ "A stacked column chart is a column chart that places related values atop one "
106
+ "another.<br /><br />\n"
107
+ " \"Relative Mode\" formats each value as a fraction "
108
+ "of 1.<br /><br />\n"
109
+ " \"Percent Mode\" formats each value as a percentage "
110
+ "of 100%. "
111
+ msgstr ""
112
+ "Biểu đồ cột xếp chồng lên nhau là biểu đồ cột đặt các giá trị có liên quan "
113
+ "trên đỉnh nhau. <br /> <br />\n"
114
+ " \"Chế độ tương đối\" định dạng từng giá trị dưới "
115
+ "dạng một phần nhỏ của 1. <br /> <br />\n"
116
+ " \"Chế độ phần trăm\" định dạng từng giá trị dưới "
117
+ "dạng phần trăm 100%.."
118
+
119
+ msgid "A0"
120
+ msgstr "A0"
121
+
122
+ msgid "A1"
123
+ msgstr "A1"
124
+
125
+ msgid "A10"
126
+ msgstr "A10"
127
+
128
+ msgid "A2"
129
+ msgstr "A2"
130
+
131
+ msgid "A3"
132
+ msgstr "A3"
133
+
134
+ msgid "A4"
135
+ msgstr "A4"
136
+
137
+ msgid "A5"
138
+ msgstr "A5"
139
+
140
+ msgid "A6"
141
+ msgstr "A6"
142
+
143
+ msgid "A7"
144
+ msgstr "A7"
145
+
146
+ msgid "A8"
147
+ msgstr "A8"
148
+
149
+ msgid "A9"
150
+ msgstr "A9"
151
+
152
+ msgid "Above table"
153
+ msgstr "Bên trên bảng"
154
+
155
+ msgid "Above the chart"
156
+ msgstr "Phía trên biểu đồ"
157
+
158
+ msgid "Actions"
159
+ msgstr "Thực hiện"
160
+
161
+ msgid "Activate"
162
+ msgstr "Kích hoạt"
163
+
164
+ msgid "Activate License"
165
+ msgstr "Kích hoạt bản quyền"
166
+
167
+ msgid ""
168
+ "Actually, Data Table plugin is very simple and has a lot of different "
169
+ "options at the same time. That’s why when you close this article I will show "
170
+ "you the main of them, but the very detailed one you can find on our site. I "
171
+ "hope that you will have no questions after even this small guide. For the "
172
+ "first time we will help you to install and create your first table, but if "
173
+ "you need help - contact us through the internal support"
174
+ msgstr ""
175
+ "Trên thực tế, plugin Data Table rất đơn giản và có nhiều tùy chọn khác nhau "
176
+ "cùng một lúc. Đó là lý do tại sao khi bạn đóng bài viết này tôi sẽ cho bạn "
177
+ "thấy chính của họ, nhưng một trong rất chi tiết bạn có thể tìm thấy trên "
178
+ "trang web của chúng tôi. Tôi hy vọng rằng bạn sẽ không có câu hỏi nào sau "
179
+ "ngay cả hướng dẫn nhỏ này. Lần đầu tiên chúng tôi sẽ giúp bạn cài đặt và tạo "
180
+ "bảng đầu tiên của bạn, nhưng nếu bạn cần trợ giúp - hãy liên hệ với chúng "
181
+ "tôi thông qua bộ phận hỗ trợ nội bộ"
182
+
183
+ msgid ""
184
+ "Add <a href=\"%s\" target=\"_blank\">editable field</a> for selected cells "
185
+ "to edit cell value on frontend. Enjoy the <a href=\"%s\" target=\"_blank"
186
+ "\">practical example</a>."
187
+ msgstr ""
188
+ "Thêm <a href=\"%s\" target=\"_blank\"> trường có thể chỉnh sửa </a> cho các "
189
+ "ô đã chọn để chỉnh sửa giá trị ô trên giao diện người dùng. Chúc bạn thành "
190
+ "công <a href=\"%s\" target=\"_blank\"> ví dụ thực tế </a>."
191
+
192
+ msgid "Add Fixed Column Width"
193
+ msgstr "Thêm chiều rộng cột cố định"
194
+
195
+ msgid "Add Multiple Sorting"
196
+ msgstr "Thêm nhiều lựa chọn sắp xếp"
197
+
198
+ msgid "Add Option"
199
+ msgstr "Thêm tùy chọn"
200
+
201
+ msgid "Add automatic highlight for table odd rows"
202
+ msgstr "Thêm đánh dấu tự động cho các hàng lẻ trong bảng"
203
+
204
+ msgid "Add column on the left"
205
+ msgstr "Thêm cột ở bên trái"
206
+
207
+ msgid "Add diagram"
208
+ msgstr "Thêm sơ đồ"
209
+
210
+ msgid ""
211
+ "Add dropdown list for highlighted cell to change cell value on frontend."
212
+ msgstr ""
213
+ "Thêm danh sách thả xuống cho ô được đánh dấu để thay đổi giá trị ô trên giao "
214
+ "diện người dùng."
215
+
216
+ msgid "Add editable field"
217
+ msgstr "Thêm trường có thể chỉnh sửa"
218
+
219
+ msgid "Add new table"
220
+ msgstr "Thêm bảng mới"
221
+
222
+ msgid "Add row above"
223
+ msgstr "Thêm hang vào bên trên"
224
+
225
+ msgid "Add table"
226
+ msgstr "Thêm bảng"
227
+
228
+ msgid "Align by First Table"
229
+ msgstr "Căn chỉnh theo bảng đầu tiên"
230
+
231
+ msgid "Alignment"
232
+ msgstr "Căn chỉnh"
233
+
234
+ msgid "Allow export table to pdf, csv, xls on frontend"
235
+ msgstr ""
236
+ "Cho phép xuất bảng thành các định dạng: pdf, csv, xls trên giao diện người "
237
+ "dùng"
238
+
239
+ msgid ""
240
+ "Allows to <a href=\"%s\" target=\"_blank\">use frontend fields only for "
241
+ "logged in users</a>. See the next buttons on the editor toolbar:<br />\n"
242
+ " Add editable field<br />\n"
243
+ " Add dropdown list"
244
+ msgstr ""
245
+ "Cho phép <a href=\"%s\" target=\"_blank\"> chỉ sử dụng các trường giao diện "
246
+ "người dùng cho người dùng đã đăng nhập </a>. Xem các nút tiếp theo trên "
247
+ "thanh công cụ của trình chỉnh sửa: <br />\n"
248
+ "Thêm trường có thể chỉnh sửa <br />\n"
249
+ "Thêm danh sách thả xuống"
250
+
251
+ msgid ""
252
+ "Allows to <a href=\"%s\" target=\"_blank\">use frontend fields only for "
253
+ "logged in users</a>. See the next buttons on the editor toolbar:<br />\n"
254
+ " Add editable field<br />\n"
255
+ " Add dropdown list"
256
+ msgstr ""
257
+ "Cho phép <a href=\"%s\" target=\"_blank\"> chỉ sử dụng các trường giao diện "
258
+ "người dùng cho người dùng đã đăng nhập </a>. Xem các nút tiếp theo trên "
259
+ "thanh công cụ của trình chỉnh sửa: <br />\n"
260
+ "Thêm trường có thể chỉnh sửa <br />\n"
261
+ "Thêm danh sách thả xuống"
262
+
263
+ msgid ""
264
+ "Allows to choose language for the table's labels (pagination, search ets.)"
265
+ msgstr "Cho phép chọn ngôn ngữ cho nhãn của bảng"
266
+
267
+ msgid "Allows to execute custom javascript code after table is loaded."
268
+ msgstr "Cho phép thực thi mã javascript tùy chỉnh sau khi bảng được load xong."
269
+
270
+ msgid ""
271
+ "Allows to export table in pdf, csv, xls formats from the front-end. Choose "
272
+ "needed formats"
273
+ msgstr ""
274
+ "Cho phép xuất bảng ở định dạng: pdf, csv, xls từ giao diện người dùng. Vui "
275
+ "long chọn định dạng"
276
+
277
+ msgid ""
278
+ "Allows to fix columns during table scrolling. Important! The fixing of "
279
+ "columns suggests that the table will have a horisontal scroll type of "
280
+ "responsive mode, otherwise you will not see that the fixed columns exist. So "
281
+ "this feature is a kind of responsive mode on its own and will not work with "
282
+ "such Responsive Modes as Standard and Automatic columns hiding."
283
+ msgstr ""
284
+ "Cho phép sửa các cột trong khi cuộn bảng. Quan trọng! Việc sửa chữa các cột "
285
+ "cho thấy rằng bảng sẽ có một loại cuộn horisontal của chế độ đáp ứng, nếu "
286
+ "không bạn sẽ không thấy rằng các cột cố định tồn tại. Vì vậy, tính năng này "
287
+ "là một loại chế độ đáp ứng một mình và sẽ không hoạt động với các Chế độ đáp "
288
+ "ứng như các cột Tiêu chuẩn và Tự động ẩn."
289
+
290
+ msgid ""
291
+ "Allows to fix the table's footer during table scrolling. Important! Footer "
292
+ "option must be enabled for using this feature. Also you need to set Fixed "
293
+ "Table Height to create a vertical scroll at the table. To see the work of "
294
+ "this feature you should not use such Responsive Modes as Standard and "
295
+ "Automatic columns hiding."
296
+ msgstr ""
297
+ "Cho phép sửa chân trang của bảng trong khi cuộn bảng. Quan trọng! Tùy chọn "
298
+ "chân trang phải được bật để sử dụng tính năng này. Ngoài ra, bạn cần đặt "
299
+ "Fixed Table Height để tạo một cuộn dọc ở bảng. Để xem công việc của tính "
300
+ "năng này, bạn không nên sử dụng các Chế độ đáp ứng như các cột Tiêu chuẩn và "
301
+ "Tự động ẩn."
302
+
303
+ msgid ""
304
+ "Allows to fix the table's header during table scrolling. Important! Header "
305
+ "option must be enabled for using this feature. Also you need to set Fixed "
306
+ "Table Height to create a vertical scroll for your table. To see the work of "
307
+ "this feature you should not use such Responsive Modes such as Standard and "
308
+ "Automatic columns hiding."
309
+ msgstr ""
310
+ "Cho phép sửa tiêu đề của bảng trong khi cuộn bảng. Quan trọng! Tùy chọn tiêu "
311
+ "đề phải được bật để sử dụng tính năng này. Ngoài ra, bạn cần đặt Fixed Table "
312
+ "Height để tạo một cuộn dọc cho bảng của bạn. Để xem công việc của tính năng "
313
+ "này, bạn không nên sử dụng các Chế độ đáp ứng như các cột Tiêu chuẩn và Tự "
314
+ "động ẩn."
315
+
316
+ msgid ""
317
+ "Allows to save data to the table through the frontend fields. See the next "
318
+ "buttons on the editor toolbar:<br />\n"
319
+ " Add editable field<br />\n"
320
+ " Add dropdown list"
321
+ msgstr ""
322
+ "Cho phép lưu dữ liệu vào bảng thông qua các trường giao diện người dùng. Xem "
323
+ "các nút tiếp theo trên thanh công cụ của trình chỉnh sửa: <br />\n"
324
+ "Thêm trường có thể chỉnh sửa <br />\n"
325
+ "Thêm danh sách thả xuống"
326
+
327
+ msgid ""
328
+ "Allows to save data to the table through the frontend fields. See the next "
329
+ "buttons on the editor toolbar:<br />\n"
330
+ " Add editable field<br />\n"
331
+ " Add dropdown list"
332
+ msgstr ""
333
+ "Cho phép lưu dữ liệu vào bảng thông qua các trường giao diện người dùng. Xem "
334
+ "các nút tiếp theo trên thanh công cụ của trình chỉnh sửa: <br />\n"
335
+ "Thêm trường có thể chỉnh sửa <br />\n"
336
+ "Thêm danh sách thả xuống"
337
+
338
+ msgid ""
339
+ "Allows to use editable fields only for users with selected roles. If there "
340
+ "are no chosen roles - all logged in users will have ability to use the "
341
+ "editable fields."
342
+ msgstr ""
343
+ "Chỉ cho phép sử dụng các trường có thể chỉnh sửa cho người dùng có vai trò "
344
+ "đã chọn. Nếu không có vai trò nào được chọn - tất cả người dùng đã đăng nhập "
345
+ "sẽ có khả năng sử dụng các trường có thể chỉnh sửa."
346
+
347
+ msgid "An error has occurred"
348
+ msgstr "Một lỗi đã xảy ra"
349
+
350
+ msgid "Append to existing table data"
351
+ msgstr "Thêm vào dữ liệu bảng hiện có"
352
+
353
+ msgid "Area Chart"
354
+ msgstr "Biểu đồ khu vực"
355
+
356
+ msgid "Ascending"
357
+ msgstr "Tăng dần"
358
+
359
+ msgid "Auto Index"
360
+ msgstr "Lập chỉ mục tự động"
361
+
362
+ msgid "Auto Table Width"
363
+ msgstr "Chiều rộng bảng tự động"
364
+
365
+ msgid "Autoimport from Google Sheet"
366
+ msgstr "Tự động nhúng từ Google trang tính"
367
+
368
+ msgid "Automatic"
369
+ msgstr "Tự động"
370
+
371
+ msgid "Automatic column hiding"
372
+ msgstr "Tự động ẩn cột"
373
+
374
+ msgid ""
375
+ "Automatic column hiding - in this mode table columns will collapse from "
376
+ "right to left if content does not fit to parent container width"
377
+ msgstr ""
378
+ "Tự động ẩn cột - trong cột bảng chế độ này sẽ thu gọn từ phải sang trái nếu "
379
+ "nội dung không phù hợp với chiều rộng vùng chứa cấp độ gốc"
380
+
381
+ msgid "Automticaly appends selected logo for output pdf or printing"
382
+ msgstr "Tự động gắn logo cho bản in ra pdf hoặc in"
383
+
384
+ msgid "Axis X Format"
385
+ msgstr "Định dạng trục X"
386
+
387
+ msgid "Axis X Title"
388
+ msgstr "Tiêu đề trục X"
389
+
390
+ msgid "Axis Y Format"
391
+ msgstr "Định dạng trục Y"
392
+
393
+ msgid "Axis Y Title"
394
+ msgstr "Tiêu đề trục Y"
395
+
396
+ msgid "B0"
397
+ msgstr "B0"
398
+
399
+ msgid "B1"
400
+ msgstr "B1"
401
+
402
+ msgid "B10"
403
+ msgstr "B10"
404
+
405
+ msgid "B2"
406
+ msgstr "B2"
407
+
408
+ msgid "B3"
409
+ msgstr "B3"
410
+
411
+ msgid "B4"
412
+ msgstr "B4"
413
+
414
+ msgid "B5"
415
+ msgstr "B5"
416
+
417
+ msgid "B6"
418
+ msgstr "B6"
419
+
420
+ msgid "B7"
421
+ msgstr "B7"
422
+
423
+ msgid "B8"
424
+ msgstr "B8"
425
+
426
+ msgid "B9"
427
+ msgstr "B9"
428
+
429
+ msgid "Background color"
430
+ msgstr "Màu nền"
431
+
432
+ msgid "Backup Plugin"
433
+ msgstr "Sao lưu plugin"
434
+
435
+ msgid ""
436
+ "Backup and Restore WordPress Plugin by Supsystic provides quick and "
437
+ "unhitched DropBox, FTP, Amazon S3, Google Drive backup for your WordPress "
438
+ "website."
439
+ msgstr ""
440
+ "Sao lưu và khôi phục WordPress Plugin bởi Supsystic cung cấp DropBox nhanh "
441
+ "chóng và không bị giật, FTP, Amazon S3, sao lưu Google Drive cho trang web "
442
+ "WordPress của bạn."
443
+
444
+ msgid "Bar Chart"
445
+ msgstr "Biểu đồ thanh"
446
+
447
+ msgid ""
448
+ "Be closer to your visitors and customers with Live Chat Support by "
449
+ "Supsystic. Help you visitors, support them in real-time with exceptional "
450
+ "Live Chat WordPress plugin by Supsystic."
451
+ msgstr ""
452
+ "Được gần gũi hơn với khách truy cập và khách hàng của bạn với Live Chat "
453
+ "Support bởi Supsystic. Giúp bạn truy cập, hỗ trợ họ trong thời gian thực với "
454
+ "plugin Live Chat WordPress đặc biệt bởi Supsystic."
455
+
456
+ msgid "Begin Step-by-step Tutorial"
457
+ msgstr "Bắt đầu Hướng dẫn từng bước"
458
+
459
+ msgid "Below table"
460
+ msgstr "Bên dưới bảng"
461
+
462
+ msgid "Below the chart"
463
+ msgstr "Bên dưới đồ thị"
464
+
465
+ msgid "Bold"
466
+ msgstr "In đậm"
467
+
468
+ msgid "Borders"
469
+ msgstr "Đường"
470
+
471
+ msgid "Bubble Chart"
472
+ msgstr "Biểu đồ mờ"
473
+
474
+ msgid "C0"
475
+ msgstr "C0"
476
+
477
+ msgid "C1"
478
+ msgstr "C1"
479
+
480
+ msgid "C10"
481
+ msgstr "C10"
482
+
483
+ msgid "C2"
484
+ msgstr "C2"
485
+
486
+ msgid "C3"
487
+ msgstr "C3"
488
+
489
+ msgid "C4"
490
+ msgstr "C4"
491
+
492
+ msgid "C5"
493
+ msgstr "C5"
494
+
495
+ msgid "C6"
496
+ msgstr "C6"
497
+
498
+ msgid "C7"
499
+ msgstr "C7"
500
+
501
+ msgid "C8"
502
+ msgstr "C8"
503
+
504
+ msgid "C9"
505
+ msgstr "C9"
506
+
507
+ msgid "CSS"
508
+ msgstr "CSS"
509
+
510
+ msgid "CSS Editor"
511
+ msgstr "Sửa CSS"
512
+
513
+ msgid "Can't decode table meta from JSON."
514
+ msgstr "Không thể giải mã bảng meta từ JSON."
515
+
516
+ msgid "Can't decode table rows from JSON."
517
+ msgstr "Không thể giải mã các hàng trong bảng từ JSON."
518
+
519
+ msgid "Caption"
520
+ msgstr "Chú thích"
521
+
522
+ msgid "Catalog #10 1/2 Envelope"
523
+ msgstr "Mục lục #10 1/2 phong bì"
524
+
525
+ msgid "Cell"
526
+ msgstr "Cột"
527
+
528
+ msgid ""
529
+ "Cell - adds border around all four sides of each cell, Row - adds border "
530
+ "only over and under each row. (i.e. only for the rows)."
531
+ msgstr ""
532
+ "Ô - thêm đường viền xung quanh tất cả bốn cạnh của mỗi ô, Hàng - chỉ thêm "
533
+ "đường viền trên và dưới mỗi hàng. (tức là chỉ cho các hàng)."
534
+
535
+ msgid "Center"
536
+ msgstr "Giữa"
537
+
538
+ msgid "Check all other FAQs"
539
+ msgstr "Kiểm tra tất cả các Câu hỏi thường gặp khác"
540
+
541
+ msgid "Check the result of formula in the table on your site."
542
+ msgstr "Kiểm tra kết quả của công thức trong bảng trên trang web của bạn."
543
+
544
+ msgid "Choose Icon"
545
+ msgstr "Chọn icon"
546
+
547
+ msgid "Choose color for loader"
548
+ msgstr "Chọn màu khi đang load"
549
+
550
+ msgid "Choose icon"
551
+ msgstr "Chọn icon"
552
+
553
+ msgid "Choose icon for loader"
554
+ msgstr "Chọn icon trong khi load"
555
+
556
+ msgid "Choose the orientation for PDF pages"
557
+ msgstr "Chọn hướng cho các trang PDF"
558
+
559
+ msgid "Choose the paper size for PDF pages"
560
+ msgstr "Chọn khổ giấy cho các trang PDF"
561
+
562
+ msgid "Clear"
563
+ msgstr "Dọn dẹp"
564
+
565
+ msgid ""
566
+ "Click on the button “Add new table” and see the first form, which you need "
567
+ "to fill in. A very simple step!"
568
+ msgstr ""
569
+ "Nhấp vào nút \"Thêm bảng mới\" và xem biểu mẫu đầu tiên mà bạn cần điền. Một "
570
+ "bước rất đơn giản!"
571
+
572
+ msgid "Clone"
573
+ msgstr "Sao chép"
574
+
575
+ msgid "Close Tutorial"
576
+ msgstr "Đóng hướng dẫn"
577
+
578
+ msgid "Column Chart"
579
+ msgstr "Biểu đồ cột"
580
+
581
+ msgid "Columns"
582
+ msgstr "Cột"
583
+
584
+ msgid "Coming Soon Plugin"
585
+ msgstr "Plugin sắp ra mắt"
586
+
587
+ msgid ""
588
+ "Coming soon page with drag-and-drop builder or under construction | "
589
+ "maintenance mode to notify visitors and collects emails."
590
+ msgstr ""
591
+ "Sắp có trang với trình tạo kéo và thả hoặc đang được xây dựng | chế độ bảo "
592
+ "trì để thông báo cho khách truy cập và thu thập email."
593
+
594
+ msgid "Comment"
595
+ msgstr "Bình luận"
596
+
597
+ msgid "Commerical #10 Envelope"
598
+ msgstr "Phong bì thương mại số 10"
599
+
600
+ msgid "Compact Table"
601
+ msgstr "Bảng nhỏ gọn"
602
+
603
+ msgid ""
604
+ "Congratulations! You have successfully installed and activated PRO version "
605
+ "of %s plugin."
606
+ msgstr ""
607
+ "Xin chúc mừng! Bạn đã cài đặt thành công và kích hoạt phiên bản PRO của "
608
+ "plugin% s."
609
+
610
+ msgid ""
611
+ "Congratulations! You have successfully installed and activated PRO version "
612
+ "of ' ~ environment.getMenu().getMenuTitle() ~ ' plugin."
613
+ msgstr ""
614
+ "Xin chúc mừng! Bạn đã cài đặt thành công và kích hoạt phiên bản PRO của "
615
+ "plugin '~ environment.getMenu (). GetMenuTitle () ~'."
616
+
617
+ msgid "Contact Form Plugin"
618
+ msgstr "Plugin biểu mẫu liên hệ"
619
+
620
+ msgid "Count of Footer Rows"
621
+ msgstr "Số lượng chân trang"
622
+
623
+ msgid "Count of Header Rows"
624
+ msgstr "Số lượng dòng tiêu đề"
625
+
626
+ msgid "Count of table rows, which will be moved to footer."
627
+ msgstr "Đếm các hàng trong bảng, sẽ được chuyển đến chân trang."
628
+
629
+ msgid "Count of table rows, which will be moved to header."
630
+ msgstr "Tổng số hàng trong bảng, sẽ được chuyển đến tiêu đề."
631
+
632
+ msgid ""
633
+ "Create and manage beautiful data tables with custom design. No HTML "
634
+ "knowledge is required."
635
+ msgstr ""
636
+ "Tạo và quản lý các bảng dữ liệu đẹp với thiết kế tùy chỉnh. Không cần kiến ​​"
637
+ "thức về HTML."
638
+
639
+ msgid ""
640
+ "Create online membership community with custom user profiles, roles, "
641
+ "FrontEnd registration and login. Members Directory, activity, groups, "
642
+ "messages."
643
+ msgstr ""
644
+ "Tạo cộng đồng thành viên trực tuyến với hồ sơ người dùng tùy chỉnh, vai trò, "
645
+ "đăng ký FrontEnd và đăng nhập. Danh bạ thành viên, hoạt động, nhóm, tin nhắn."
646
+
647
+ msgid "Create your first table"
648
+ msgstr "Tạo bảng đầu tiên của bạn"
649
+
650
+ msgid "Created"
651
+ msgstr "Tạo"
652
+
653
+ msgid ""
654
+ "Creating slideshows with Slider plugin is fast and easy. Simply select "
655
+ "images from your WordPress Media Library, Flickr, Instagram or Facebook, set "
656
+ "slide captions, links and SEO fields all from one page."
657
+ msgstr ""
658
+ "Tạo trình chiếu với plugin trượt nhanh chóng và dễ dàng. Chỉ cần chọn hình "
659
+ "ảnh từ Thư viện phương tiện WordPress, Flickr, Instagram hoặc Facebook của "
660
+ "bạn, đặt chú thích trang trình bày, liên kết và trường SEO tất cả từ một "
661
+ "trang."
662
+
663
+ msgid "Currency"
664
+ msgstr "Tiền tệ"
665
+
666
+ msgid "Custom Footer"
667
+ msgstr "Chân trang tùy chỉnh"
668
+
669
+ msgid "Data Formats"
670
+ msgstr "Định dạng dữ liệu"
671
+
672
+ msgid "Data Tables Generator"
673
+ msgstr "Trình tạo bảng dữ liệu"
674
+
675
+ msgid "Date"
676
+ msgstr "Ngày"
677
+
678
+ msgid "Decrease the amount of whitespace in the table."
679
+ msgstr "Giảm khoảng trắng trong bảng."
680
+
681
+ msgid "Default"
682
+ msgstr "Mặc định"
683
+
684
+ msgid "Delete"
685
+ msgstr "Xóa"
686
+
687
+ msgid "Delimiter"
688
+ msgstr "Dấu phân tách"
689
+
690
+ msgid "Descending"
691
+ msgstr "Giảm dần"
692
+
693
+ msgid "Description"
694
+ msgstr "Miêu tả"
695
+
696
+ msgid "Description Text"
697
+ msgstr "Văn bản mô tả"
698
+
699
+ msgid "Design"
700
+ msgstr "Thiết kế"
701
+
702
+ msgid "Diagram"
703
+ msgstr "Sơ đồ"
704
+
705
+ msgid "Diagram Title"
706
+ msgstr "Tiêu đề sơ đồ"
707
+
708
+ msgid "Diagrams"
709
+ msgstr "Sơ đồ"
710
+
711
+ msgid ""
712
+ "Diagrams - this is a Pro feature of our plugin, which can help you to follow "
713
+ "the statistics of your table. Several types for every taste and any wishes."
714
+ msgstr ""
715
+ "Sơ đồ - đây là tính năng Pro của plugin của chúng tôi, có thể giúp bạn theo "
716
+ "dõi thống kê của bảng. Một số loại cho mọi sở thích và mong muốn."
717
+
718
+ msgid "Digital Publication Plugin"
719
+ msgstr "Plugin xuất bản kỹ thuật số"
720
+
721
+ msgid ""
722
+ "Digital Publication WordPress Plugin by Supsystic for Magazines, Catalogs, "
723
+ "Portfolios. Convert images, posts, PDF to the page flip book."
724
+ msgstr ""
725
+ "Xuất bản kỹ thuật số WordPress Plugin bởi Supsystic cho Tạp chí, Catalogues, "
726
+ "Danh mục đầu tư. Chuyển đổi hình ảnh, bài đăng, PDF sang sách lật trang."
727
+
728
+ msgid "Disable"
729
+ msgstr "Vô hiệu hóa"
730
+
731
+ msgid "Disable Responsivity"
732
+ msgstr "Vô hiệu hóa trách nhiệm"
733
+
734
+ msgid "Disable Responsivity - default table fluid layout"
735
+ msgstr "Tắt tính năng trả lời - bố cục bảng mặc định"
736
+
737
+ msgid "Disable Sorting"
738
+ msgstr "Tắt sắp xếp"
739
+
740
+ msgid "Disable Wrapping"
741
+ msgstr "Tắt gói"
742
+
743
+ msgid "Disable indexing table for search bots"
744
+ msgstr "Vô hiệu hóa bảng lập chỉ mục cho các bot tìm kiếm"
745
+
746
+ msgid ""
747
+ "Disable wrapping of content in the table, so every word in the cells will be "
748
+ "in one single line."
749
+ msgstr ""
750
+ "Tắt gói nội dung trong bảng, vì vậy mọi từ trong các ô sẽ nằm trong một dòng."
751
+
752
+ msgid "Disallow Indexing"
753
+ msgstr "Không cho phép lập chỉ mục"
754
+
755
+ msgid ""
756
+ "Display custom Google Maps. Set markers and locations with text, images, "
757
+ "categories and links. Customize google map in a simple and intuitive way."
758
+ msgstr ""
759
+ "Hiển thị Google Maps tùy chỉnh. Đặt điểm đánh dấu và vị trí bằng văn bản, "
760
+ "hình ảnh, danh mục và liên kết. Tùy chỉnh bản đồ google theo cách đơn giản "
761
+ "và trực quan."
762
+
763
+ msgid "Display only entries with matching characters in the beginning of words"
764
+ msgstr "Chỉ hiển thị các mục nhập có các ký tự trùng khớp ở đầu từ"
765
+
766
+ msgid "Edit table \"%s\""
767
+ msgstr "Chỉnh sửa bảng \"% s\""
768
+
769
+ msgid "Editable fields"
770
+ msgstr "Các trường có thể chỉnh sửa"
771
+
772
+ msgid "Editor"
773
+ msgstr "Biên tập viên"
774
+
775
+ msgid "Editor tab"
776
+ msgstr "Tab trình soạn thảo"
777
+
778
+ msgid "Email"
779
+ msgstr "Email"
780
+
781
+ msgid "Empty info text"
782
+ msgstr "Văn bản thông tin trống"
783
+
784
+ msgid "Empty table"
785
+ msgstr "Bàn trống"
786
+
787
+ msgid "Enable"
788
+ msgstr "Bật"
789
+
790
+ msgid ""
791
+ "Enable / disable table loader icon before table will be completely loaded."
792
+ msgstr ""
793
+ "Bật / tắt biểu tượng trình tải bảng trước khi bảng sẽ được tải hoàn toàn."
794
+
795
+ msgid "Enable Table History"
796
+ msgstr "Bật Lịch sử bảng"
797
+
798
+ msgid "Enter the name and create Data Table"
799
+ msgstr "Nhập tên và tạo bảng dữ liệu"
800
+
801
+ msgid "Execute JS Script After Table Is Loaded"
802
+ msgstr "Thực thi JS Script sau khi bảng được tải"
803
+
804
+ msgid "Executive"
805
+ msgstr "Điều hành"
806
+
807
+ msgid "Export"
808
+ msgstr "Xuất ra"
809
+
810
+ msgid "Export Data to the File"
811
+ msgstr "Xuất dữ liệu vào tệp"
812
+
813
+ msgid "Export Logo"
814
+ msgstr "Xuất Logo"
815
+
816
+ msgid "Export Page Orientation"
817
+ msgstr "Định hướng trang xuất"
818
+
819
+ msgid "Export Paper Size"
820
+ msgstr "Chọn kích thước giấy xuất ra"
821
+
822
+ msgid "Export available only in PRO version."
823
+ msgstr "Xuất chỉ khả dụng trong phiên bản PRO."
824
+
825
+ msgid "Export label"
826
+ msgstr "Xuất nhãn"
827
+
828
+ msgid "Export table"
829
+ msgstr "Xuất bảng"
830
+
831
+ msgid "Failed to find diagram %s."
832
+ msgstr "Không thể tìm thấy sơ đồ% s."
833
+
834
+ msgid "Failed to find table %s."
835
+ msgstr "Không thể tìm thấy bảng% s."
836
+
837
+ msgid "Failed to get table rows: %s"
838
+ msgstr "Không nhận được hàng trong bảng:% s"
839
+
840
+ msgid "Failed to import data from the uploaded file"
841
+ msgstr "Không thể nhập dữ liệu từ tệp được tải lên"
842
+
843
+ msgid "Failed to import selected file"
844
+ msgstr "Không thể nhập tệp đã chọn"
845
+
846
+ msgid "Failed to import selected file: Wrong spreadsheet id or url"
847
+ msgstr "Không thể nhập tệp đã chọn: Id hoặc url bảng tính sai"
848
+
849
+ msgid "Failed to save table meta data: %s"
850
+ msgstr "Không thể lưu dữ liệu meta bảng:% s"
851
+
852
+ msgid "Failed to save table rows: %s"
853
+ msgstr "Không thể lưu hàng trong bảng:% s"
854
+
855
+ msgid "Failed to upload selected file"
856
+ msgstr "Không thể tải lên tệp đã chọn"
857
+
858
+ msgid "Featured Plugins"
859
+ msgstr "Plugins nổi bật"
860
+
861
+ msgid "Features"
862
+ msgstr "Đặc điểm"
863
+
864
+ msgid "Feel free to contact us and don’t worry, everything gonna be ok!"
865
+ msgstr "Hãy liên hệ với chúng tôi và đừng lo, mọi thứ sẽ ổn thôi!"
866
+
867
+ msgid "File Type"
868
+ msgstr "Loại tệp"
869
+
870
+ msgid "File extension type"
871
+ msgstr "Loại tiện ích mở rộng tệp"
872
+
873
+ msgid "Fill in the rest of the formula."
874
+ msgstr "Điền vào phần còn lại của công thức."
875
+
876
+ msgid ""
877
+ "Fill the table title and choose the number of columns and rows. Don’t worry, "
878
+ "you will be able to change it (add or delete some) later!"
879
+ msgstr ""
880
+ "Điền tiêu đề bảng và chọn số cột và hàng. Đừng lo lắng, bạn sẽ có thể thay "
881
+ "đổi nó (thêm hoặc xóa một số) sau!"
882
+
883
+ msgid "Filtered info text"
884
+ msgstr "Văn bản thông tin được lọc"
885
+
886
+ msgid "Fixed Columns"
887
+ msgstr "Cột cố định"
888
+
889
+ msgid "Fixed Footer"
890
+ msgstr "Chân trang cố định"
891
+
892
+ msgid "Fixed Header"
893
+ msgstr "Tiêu đề cố định"
894
+
895
+ msgid "Fixed Table Height"
896
+ msgstr "Chiều cao bảng cố định"
897
+
898
+ msgid "Fixed Table Width"
899
+ msgstr "Chiều rộng bảng cố định"
900
+
901
+ msgid ""
902
+ "Fixed table height in px. This value must be less than the original table "
903
+ "height to create a vertical scroll, otherwise you will not see that the "
904
+ "fixed header / footer exists."
905
+ msgstr ""
906
+ "Cố định chiều cao bảng trong px. Giá trị này phải nhỏ hơn chiều cao bảng ban "
907
+ "đầu để tạo một cuộn dọc, nếu không bạn sẽ không thấy rằng đầu trang / chân "
908
+ "trang cố định tồn tại."
909
+
910
+ msgid "Folio"
911
+ msgstr "Tờ số"
912
+
913
+ msgid "Font Family"
914
+ msgstr "Họ phông chữ"
915
+
916
+ msgid "Font Size"
917
+ msgstr "Cỡ font chữ"
918
+
919
+ msgid "Font family changing available only in PRO version."
920
+ msgstr "Thay đổi font chữ chỉ có trong phiên bản PRO."
921
+
922
+ msgid "Footer"
923
+ msgstr "Chân trang"
924
+
925
+ msgid ""
926
+ "Formats for cells value. All formats convert cell values to appropriate "
927
+ "format types.\n"
928
+ " <b>Percent with Convert</b> format sets percent "
929
+ "format and convert cells value to percentage by division by 100.\n"
930
+ " "
931
+ msgstr ""
932
+ "Định dạng cho giá trị ô. Tất cả các định dạng chuyển đổi giá trị ô thành các "
933
+ "loại định dạng thích hợp.\n"
934
+ "<b> Phần trăm với định dạng Chuyển đổi </ b> đặt định dạng phần trăm và "
935
+ "chuyển đổi các ô có giá trị thành phần trăm chia cho 100."
936
+
937
+ msgid "Frequently Asked Questions"
938
+ msgstr "Các câu hỏi thường gặp"
939
+
940
+ msgid "Frontend Export"
941
+ msgstr "Frontend xuất khẩu"
942
+
943
+ msgid "Get Browser Language"
944
+ msgstr "Tải ngôn ngữ trình duyệt"
945
+
946
+ msgid "Get PRO"
947
+ msgstr "Nhận phiên bản PRO"
948
+
949
+ msgid "Get PRO version"
950
+ msgstr "Nhận phiên bản PRO"
951
+
952
+ msgid "Global Table Data Search"
953
+ msgstr "Tìm kiếm dữ liệu bảng toàn cầu"
954
+
955
+ msgid "Go to Editor of Data Table."
956
+ msgstr "Chuyển đến Trình chỉnh sửa Bảng dữ liệu."
957
+
958
+ msgid "Google Maps Easy"
959
+ msgstr "Google Maps dễ dàng"
960
+
961
+ msgid "Google Spreadsheet Url"
962
+ msgstr "Url bảng tính của Google"
963
+
964
+ msgid "Header"
965
+ msgstr "Tiêu đề"
966
+
967
+ msgid "Height"
968
+ msgstr "Chiều cao"
969
+
970
+ msgid "Hello Supsystic Team!"
971
+ msgstr "Xin chào đội Supsystic!"
972
+
973
+ msgid "Hello! This is the Data Tables by Supsystic"
974
+ msgstr "Xin chào! Đây là bảng dữ liệu bởi Supsystic"
975
+
976
+ msgid "Hide Table Loader"
977
+ msgstr "Ẩn trình tải bảng"
978
+
979
+ msgid "Hide table by default and show only if search has a result."
980
+ msgstr "Ẩn bảng theo mặc định và chỉ hiển thị nếu tìm kiếm có kết quả."
981
+
982
+ msgid "Highlight the Order Column"
983
+ msgstr "Đánh dấu cột thứ tự"
984
+
985
+ msgid "Highlighting by Mousehover"
986
+ msgstr "Làm nổi bật khi rê chuột"
987
+
988
+ msgid "Horizontal scroll"
989
+ msgstr "Cuộn ngang"
990
+
991
+ msgid ""
992
+ "Horizontal scroll - in this mode scroll bar will be added if table overflows "
993
+ "parent container width"
994
+ msgstr ""
995
+ "Cuộn ngang - trong thanh cuộn chế độ này sẽ được thêm nếu bảng tràn chiều "
996
+ "rộng vùng chứa của cấp độ gốc"
997
+
998
+ msgid "How to use formulas in the table?"
999
+ msgstr "Làm thế nào để sử dụng các công thức trong bảng?"
1000
+
1001
+ msgid ""
1002
+ "I need to have line breaks/spaces between the paragraphs within the cells."
1003
+ msgstr "Tôi cần phải có dấu ngắt dòng / dấu cách giữa các đoạn trong các ô."
1004
+
1005
+ msgid ""
1006
+ "If checked - footer will be created from the last table rows. Otherwise - "
1007
+ "footer will be created from header rows."
1008
+ msgstr ""
1009
+ "Nếu được chọn - chân trang sẽ được tạo từ các hàng trong bảng cuối cùng. Nếu "
1010
+ "không - chân trang sẽ được tạo từ hàng tiêu đề."
1011
+
1012
+ msgid ""
1013
+ "If checked - table data on frontend will be overloaded from selected Google "
1014
+ "Sheet. <a href=\"%s\" tagget=\"_blank\">Read more</a> about how organize "
1015
+ "Auto Import form Google Sheets"
1016
+ msgstr ""
1017
+ "Nếu dữ liệu bảng đã chọn trên giao diện người dùng sẽ bị quá tải từ Google "
1018
+ "Trang tính đã chọn. <a href=\"%s\" tagget=\"_blank\"> Đọc thêm </a> về cách "
1019
+ "sắp xếp Tự động nhập tổ chức Google Trang tính"
1020
+
1021
+ msgid "If checked - table data will be included in the global site search"
1022
+ msgstr ""
1023
+ "Nếu dữ liệu được chọn - bảng sẽ được bao gồm trong tìm kiếm trang web toàn "
1024
+ "cầu"
1025
+
1026
+ msgid "If checked - the current sorted column will be highlighted"
1027
+ msgstr "Nếu được chọn - cột được sắp xếp hiện tại sẽ được tô sáng"
1028
+
1029
+ msgid ""
1030
+ "If checked - this table will be resized by first supsystic table on page. "
1031
+ "Important! This option makes sense only if table is not on responsive mode "
1032
+ "or responsive mode is disabled. Also if the first table has different count "
1033
+ "of columns or different settings, their sizes may not be equal."
1034
+ msgstr ""
1035
+ "Nếu được chọn - bảng này sẽ được thay đổi kích thước bằng bảng supsystic đầu "
1036
+ "tiên trên trang. Quan trọng! Tùy chọn này chỉ có ý nghĩa nếu bảng không ở "
1037
+ "chế độ phản hồi hoặc chế độ phản hồi bị tắt. Ngoài ra nếu bảng đầu tiên có "
1038
+ "số lượng cột khác nhau hoặc các cài đặt khác nhau, kích thước của chúng có "
1039
+ "thể không bằng nhau."
1040
+
1041
+ msgid ""
1042
+ "If checked - width of table columns will be calculated automatically for "
1043
+ "table width 100%.<br /><br />\n"
1044
+ " Otherwise - you can set "
1045
+ "table width manually: columns width will be get from Fixed Table Width "
1046
+ "option\n"
1047
+ " (toolbar on Editor tab) or "
1048
+ "calculated depending on the columns width in the table editor.<br /><br />\n"
1049
+ " If you do not want to apply "
1050
+ "columns width at all - you should uncheck \"Auto Table Width\" option, set "
1051
+ "\"Fixed Table Width\"\n"
1052
+ " option to \"auto\" and check "
1053
+ "\"Compact Table\" option."
1054
+ msgstr ""
1055
+ "Nếu được chọn - chiều rộng của các cột trong bảng sẽ được tính tự động cho "
1056
+ "chiều rộng bảng 100%. <br /> <br />\n"
1057
+ "                                                 Nếu không - bạn có thể đặt "
1058
+ "chiều rộng bảng theo cách thủ công: chiều rộng cột sẽ được lấy từ tùy chọn "
1059
+ "Chiều rộng Bảng cố định\n"
1060
+ "                                                 (thanh công cụ trên tab "
1061
+ "Editor) hoặc được tính toán tùy thuộc vào chiều rộng cột trong trình soạn "
1062
+ "thảo bảng. <br /> <br />\n"
1063
+ "                                                 Nếu bạn không muốn áp dụng "
1064
+ "chiều rộng cột ở tất cả - bạn nên bỏ chọn tùy chọn \"Chiều rộng bảng tự động"
1065
+ "\", đặt \"Chiều rộng bảng cố định\"\n"
1066
+ "                                                 tùy chọn \"tự động\" và "
1067
+ "chọn tùy chọn \"Bảng nhỏ gọn\"."
1068
+
1069
+ msgid ""
1070
+ "If multiple sorting for columns is not set - the table will be sorted in the "
1071
+ "specified order by the column set in the table settings: Settings-> Features-"
1072
+ "> Sorting Order / Sorting Column. Otherwise - table will be sorted by the "
1073
+ "specified custom columns in sequense, in which they are listed."
1074
+ msgstr ""
1075
+ "Nếu nhiều sắp xếp cho cột không được đặt - bảng sẽ được sắp xếp theo thứ tự "
1076
+ "được chỉ định bởi tập hợp cột trong cài đặt bảng: Cài đặt-> Tính năng-> Thứ "
1077
+ "tự sắp xếp / Cột sắp xếp. Nếu không - bảng sẽ được sắp xếp theo các cột tùy "
1078
+ "chỉnh được chỉ định theo trình tự, trong đó chúng được liệt kê."
1079
+
1080
+ msgid ""
1081
+ "If you use some specific characters (greek, cyrillic etc.) it is better to "
1082
+ "check this box for PDF export."
1083
+ msgstr ""
1084
+ "Nếu bạn sử dụng một số ký tự cụ thể (tiếng Hy Lạp, cyrillic, vv) thì tốt hơn "
1085
+ "nên chọn hộp này để xuất PDF."
1086
+
1087
+ msgid ""
1088
+ "If, unfortunately, you have some problem - we are ready to help you in our "
1089
+ "<a href=\"//supsystic.com/contact-us/\" target=\"_blank\">internal support.</"
1090
+ "a>"
1091
+ msgstr ""
1092
+ "Tuy nhiên, nếu bạn gặp sự cố - chúng tôi sẵn sàng trợ giúp bạn trong <a href="
1093
+ "\"//supsystic.com/contact-us/\" target=\"_blank\"> bộ phận hỗ trợ nội bộ của "
1094
+ "chúng tôi. </a>"
1095
+
1096
+ msgid "Import"
1097
+ msgstr "Nhập"
1098
+
1099
+ msgid "Import Data to the Table"
1100
+ msgstr "Nhập dữ liệu vào bảng"
1101
+
1102
+ msgid "Import Settings"
1103
+ msgstr "Nhập cài đặt"
1104
+
1105
+ msgid "Import available only in PRO version."
1106
+ msgstr "Nhập chỉ khả dụng trong phiên bản PRO."
1107
+
1108
+ msgid "Import error"
1109
+ msgstr "Lỗi nhập"
1110
+
1111
+ msgid "Import settings"
1112
+ msgstr "Nhập cài đặt"
1113
+
1114
+ msgid "Import to the table"
1115
+ msgstr "Nhập vào bảng"
1116
+
1117
+ msgid "Import/Export"
1118
+ msgstr "Nhập khẩu/ xuất khẩu"
1119
+
1120
+ msgid ""
1121
+ "Important! Please, check the sharing settings of your spreadsheet: it must "
1122
+ "be accessed to edit for everyone who has link. In other case the data will "
1123
+ "not import to table."
1124
+ msgstr ""
1125
+ "Quan trọng! Vui lòng kiểm tra cài đặt chia sẻ của bảng tính của bạn: nó phải "
1126
+ "được truy cập để chỉnh sửa cho tất cả những người có liên kết. Trong trường "
1127
+ "hợp khác, dữ liệu sẽ không được nhập vào bảng."
1128
+
1129
+ msgid ""
1130
+ "In case you have special or at least, basic knowledge of CSS code - you can "
1131
+ "easily change the table here. Just make sure that you know, what you are "
1132
+ "doing and you will not destroy the table."
1133
+ msgstr ""
1134
+ "Trong trường hợp bạn có kiến thức cơ bản về mã CSS - bạn có thể dễ dàng thay "
1135
+ "đổi bảng ở đây. Chỉ cần chắc chắn rằng bạn biết, những gì bạn đang làm và "
1136
+ "bạn sẽ không phá hủy bảng."
1137
+
1138
+ msgid "Insert Link"
1139
+ msgstr "Chèn đường dẫn"
1140
+
1141
+ msgid "Insert link"
1142
+ msgstr "Chèn đường dẫn"
1143
+
1144
+ msgid "Insert picture"
1145
+ msgstr "Chèn ảnh"
1146
+
1147
+ msgid "Inside by the top left corner"
1148
+ msgstr "Bên trong góc trên cùng bên trái"
1149
+
1150
+ msgid "Invalid range specified."
1151
+ msgstr "Phạm vi không hợp lệ được chỉ định."
1152
+
1153
+ msgid "Italic"
1154
+ msgstr "Chữ nghiêng"
1155
+
1156
+ msgid ""
1157
+ "It’s never been so easy to create and manage pricing and comparison tables "
1158
+ "with table builder. Any element of the table can be customise with mouse "
1159
+ "click."
1160
+ msgstr ""
1161
+ "Không bao giờ dễ dàng tạo và quản lý các bảng giá cả và so sánh với trình "
1162
+ "tạo bảng. Bất kỳ phần tử nào của bảng có thể được tùy chỉnh bằng cách nhấp "
1163
+ "chuột."
1164
+
1165
+ msgid "Landscape"
1166
+ msgstr "Phong cảnh"
1167
+
1168
+ msgid "Language"
1169
+ msgstr "Ngôn ngữ"
1170
+
1171
+ msgid "Language and Text"
1172
+ msgstr "Ngôn ngữ và văn bản"
1173
+
1174
+ msgid "Large"
1175
+ msgstr "Lớn"
1176
+
1177
+ msgid ""
1178
+ "Learn more about how to do this <a href=\"//supsystic.com/how-to-use-tables/"
1179
+ "\" target=\"_blank\">here</a>."
1180
+ msgstr ""
1181
+ "Tìm hiểu thêm về cách thực hiện <a href=\"//supsystic.com/how-to-use-tables/"
1182
+ "\" target=\"_blank\"> tại đây </a>."
1183
+
1184
+ msgid "Ledger"
1185
+ msgstr "Sổ cái"
1186
+
1187
+ msgid "Left"
1188
+ msgstr "Trái"
1189
+
1190
+ msgid "Left Columns Count"
1191
+ msgstr "Số cột còn lại"
1192
+
1193
+ msgid "Left of the chart"
1194
+ msgstr "Bên trái của biểu đồ"
1195
+
1196
+ msgid "Legal"
1197
+ msgstr "Hợp pháp"
1198
+
1199
+ msgid "Legend Position"
1200
+ msgstr "Vị trí chú giải"
1201
+
1202
+ msgid "Length text"
1203
+ msgstr "Văn bản chiều dài"
1204
+
1205
+ msgid "Let's Start!"
1206
+ msgstr "Hãy bắt đầu!"
1207
+
1208
+ msgid ""
1209
+ "Lets make search by fields, marked as hidden (see appropriate button on "
1210
+ "editor toolbar)"
1211
+ msgstr ""
1212
+ "Cho phép thực hiện tìm kiếm theo trường, được đánh dấu là ẩn (xem nút thích "
1213
+ "hợp trên thanh công cụ của trình soạn thảo)"
1214
+
1215
+ msgid "Letter"
1216
+ msgstr "Lá thư"
1217
+
1218
+ msgid "License"
1219
+ msgstr "Giấy phép"
1220
+
1221
+ msgid "Line Chart"
1222
+ msgstr "Biểu đồ đường kẻ"
1223
+
1224
+ msgid "Lines between slices and values"
1225
+ msgstr "Đường giữa các lát và giá trị"
1226
+
1227
+ msgid "Link Text"
1228
+ msgstr "Văn bản liên kết"
1229
+
1230
+ msgid "Link from Google Tables"
1231
+ msgstr "Liên kết từ Google Tables"
1232
+
1233
+ msgid "List of columns for multiple sorting"
1234
+ msgstr "Danh sách các cột để phân loại nhiều"
1235
+
1236
+ msgid "List of columns, disabled from manual sorting"
1237
+ msgstr "Danh sách các cột, vô hiệu hóa từ sắp xếp thủ công"
1238
+
1239
+ msgid "List of width sizes, set for table columns:"
1240
+ msgstr "Danh sách các kích thước chiều rộng, được đặt cho các cột trong bảng:"
1241
+
1242
+ msgid "Live Chat Plugin"
1243
+ msgstr "Pluin Live Chat"
1244
+
1245
+ msgid "Loading your table, please wait..."
1246
+ msgstr "Đang tải bảng của bạn, vui lòng chờ ..."
1247
+
1248
+ msgid "Logo Alignment"
1249
+ msgstr "Căn chỉnh logo"
1250
+
1251
+ msgid "Logo Position"
1252
+ msgstr "Vị trí logo"
1253
+
1254
+ msgid "Long Number"
1255
+ msgstr "Số dài"
1256
+
1257
+ msgid "Main"
1258
+ msgstr "Chính"
1259
+
1260
+ msgid ""
1261
+ "Main Settings of your first table. Here you can see main settings which are "
1262
+ "conected with languages, table elements, styling and other different editors "
1263
+ "settings. Generally it’s a tab where you can edit the visual part of the "
1264
+ "whole table, switch on/off the responsive mode, set pagination etc."
1265
+ msgstr ""
1266
+ "Cài đặt chính của bảng đầu tiên của bạn. Ở đây bạn có thể thấy các cài đặt "
1267
+ "chính được kết nối với ngôn ngữ, các yếu tố bảng, kiểu dáng và các cài đặt "
1268
+ "trình chỉnh sửa khác. Nói chung, đó là tab mà bạn có thể chỉnh sửa phần trực "
1269
+ "quan của toàn bộ bảng, bật / tắt chế độ phản hồi, đặt phân trang, v.v ..."
1270
+
1271
+ msgid "Make data table responsive"
1272
+ msgstr "Làm cho bảng dữ liệu đáp ứng"
1273
+
1274
+ msgid ""
1275
+ "Mandatory attribute \"id\" is not specified. ' . 'Shortcode usage example: "
1276
+ "[%s id=\"{table_id}\"]"
1277
+ msgstr ""
1278
+ "Thuộc tính bắt buộc \"id\" không được chỉ định. '. Ví dụ về sử dụng mã ngắn: "
1279
+ "[% s id = \"{table_id}\"]"
1280
+
1281
+ msgid ""
1282
+ "Mark selected cells as hidden and remove them from frontend. Can be useful "
1283
+ "for placing information in the table for admins only. <br /><br />Importanr! "
1284
+ "To display the table correctly, please, add this property for the whole row "
1285
+ "or the whole column of table."
1286
+ msgstr ""
1287
+ "Đánh dấu các ô đã chọn là ẩn và xóa chúng khỏi giao diện người dùng. Có thể "
1288
+ "hữu ích khi đặt thông tin trong bảng chỉ dành cho quản trị viên. <br /> <br /"
1289
+ "> Importanr! Để hiển thị bảng chính xác, vui lòng thêm thuộc tính này cho "
1290
+ "toàn bộ hàng hoặc toàn bộ cột của bảng."
1291
+
1292
+ msgid ""
1293
+ "Mark selected cells as invisible and hide them on frontend. Can be useful "
1294
+ "for placing intermediate calculations. <br /><br />To display the table "
1295
+ "correctly, please, add this property for the whole row or the whole column "
1296
+ "of table."
1297
+ msgstr ""
1298
+ "Đánh dấu các ô đã chọn là ẩn và ẩn chúng trên giao diện người dùng. Có thể "
1299
+ "hữu ích khi đặt các phép tính trung gian. <br /> <br /> Để hiển thị bảng "
1300
+ "chính xác, vui lòng thêm thuộc tính này cho toàn bộ hàng hoặc toàn bộ cột "
1301
+ "của bảng."
1302
+
1303
+ msgid "Medium"
1304
+ msgstr "Trung bình"
1305
+
1306
+ msgid "Membership by Supsystic"
1307
+ msgstr "Tư cách thành viên bởi Supsystic"
1308
+
1309
+ msgid "Message"
1310
+ msgstr "Tin nhắn"
1311
+
1312
+ msgid "Minimum Count of Characters"
1313
+ msgstr "Số lượng ký tự tối thiểu"
1314
+
1315
+ msgid "Name"
1316
+ msgstr "Tên"
1317
+
1318
+ msgid "Name of Cloned Table"
1319
+ msgstr "Tên bảng nhân bản"
1320
+
1321
+ msgid "Name of slice"
1322
+ msgstr "Tên lát"
1323
+
1324
+ msgid "Newsletter Plugin"
1325
+ msgstr "Pluin Newsletter"
1326
+
1327
+ msgid "Next"
1328
+ msgstr "Tiếp theo"
1329
+
1330
+ msgid "No"
1331
+ msgstr "Không"
1332
+
1333
+ msgid "No data available in table"
1334
+ msgstr "Không có dữ liệu trong bảng"
1335
+
1336
+ msgid "No detected"
1337
+ msgstr "Không phát hiện"
1338
+
1339
+ msgid "No legend"
1340
+ msgstr "Không có huyền thoại"
1341
+
1342
+ msgid "No matching records are found"
1343
+ msgstr "Không tìm thấy hồ sơ phù hợp"
1344
+
1345
+ msgid "No value"
1346
+ msgstr "Không có giá trị"
1347
+
1348
+ msgid "None"
1349
+ msgstr "Không ai"
1350
+
1351
+ msgid "Not displaying"
1352
+ msgstr "Không hiển thị"
1353
+
1354
+ msgid ""
1355
+ "Note that the table may look a little different depending on your theme "
1356
+ "style."
1357
+ msgstr ""
1358
+ "Lưu ý rằng bảng có thể trông hơi khác một chút tùy thuộc vào kiểu chủ đề của "
1359
+ "bạn."
1360
+
1361
+ msgid "Number"
1362
+ msgstr "Con số"
1363
+
1364
+ msgid "Number Formatting"
1365
+ msgstr "Định dạng số"
1366
+
1367
+ msgid ""
1368
+ "Number of column to apply sort order. Set no value to disable table sorting "
1369
+ "by default."
1370
+ msgstr ""
1371
+ "Số cột để áp dụng thứ tự sắp xếp. Không đặt giá trị để vô hiệu hóa sắp xếp "
1372
+ "bảng theo mặc định."
1373
+
1374
+ msgid "Number of column to fix by left side of the table."
1375
+ msgstr "Số cột cần sửa ở bên trái của bảng."
1376
+
1377
+ msgid "Number of column to fix by right side of the table."
1378
+ msgstr "Số cột cần sửa theo bên phải của bảng."
1379
+
1380
+ msgid "Offset Bottom"
1381
+ msgstr "Dưới bù đắp"
1382
+
1383
+ msgid "Offset Left"
1384
+ msgstr "Bù đắp trái"
1385
+
1386
+ msgid "Offset Right"
1387
+ msgstr "Bù đắp phải"
1388
+
1389
+ msgid "Offset Top"
1390
+ msgstr "Bù đắp trên"
1391
+
1392
+ msgid "Offset for axes' area by bottom."
1393
+ msgstr "Bù đắp cho khu vực của trục ở phía dưới."
1394
+
1395
+ msgid "Offset for axes' area by left."
1396
+ msgstr "Bù đắp cho khu vực của trục bên trái."
1397
+
1398
+ msgid "Offset for axes' area by right."
1399
+ msgstr "Bù đắp cho khu vực trục của bên phải."
1400
+
1401
+ msgid "Offset for axes' area by top."
1402
+ msgstr "Bù đắp cho khu vực trục của đầu."
1403
+
1404
+ msgid ""
1405
+ "One of the best plugin for creating Contact Forms on your WordPress site. "
1406
+ "Changeable fonts, backgrounds, an option for adding fields etc."
1407
+ msgstr ""
1408
+ "Một trong những plugin tốt nhất để tạo Biểu mẫu liên hệ trên trang web "
1409
+ "WordPress của bạn. Phông chữ có thể thay đổi, hình nền, tùy chọn thêm "
1410
+ "trường, v.v."
1411
+
1412
+ msgid "Open in new tab"
1413
+ msgstr "Mở ra trong trang mới"
1414
+
1415
+ msgid "Other"
1416
+ msgstr "Khác"
1417
+
1418
+ msgid "Overview"
1419
+ msgstr "Tổng quan"
1420
+
1421
+ msgid "Overwrite Table Text"
1422
+ msgstr "Ghi đè văn bản bảng"
1423
+
1424
+ msgid "PHP"
1425
+ msgstr "PHP"
1426
+
1427
+ msgid "PRO option"
1428
+ msgstr "Tùy chọn PRO"
1429
+
1430
+ msgid "PRO version"
1431
+ msgstr "Phiên bản PRO"
1432
+
1433
+ msgid "Pagination"
1434
+ msgstr "Phân trang"
1435
+
1436
+ msgid "Pagination List Content"
1437
+ msgstr "Nội dung danh sách phân trang"
1438
+
1439
+ msgid "Pagination Size"
1440
+ msgstr "Kích thước phân trang"
1441
+
1442
+ msgid "Paragraph Mode"
1443
+ msgstr "Chế độ đoạn"
1444
+
1445
+ msgid "Paste script code here"
1446
+ msgstr "Dán mã tập lệnh tại đây"
1447
+
1448
+ msgid "Percent"
1449
+ msgstr "Phần trăm"
1450
+
1451
+ msgid "Percent Mode"
1452
+ msgstr "Chế độ phần trăm"
1453
+
1454
+ msgid "Percent with Convert"
1455
+ msgstr "Phần trăm với chuyển đổi"
1456
+
1457
+ msgid "Percentage of slice size out of total"
1458
+ msgstr "Phần trăm kích thước lát trong tổng số"
1459
+
1460
+ msgid "Photo Gallery Plugin"
1461
+ msgstr "Plugin Photo Gallery"
1462
+
1463
+ msgid ""
1464
+ "Photo Gallery Plugin with a great number of layouts will help you to create "
1465
+ "quality respectable portfolios and image galleries."
1466
+ msgstr ""
1467
+ "Photo Gallery Plugin với một số lượng lớn bố trí sẽ giúp bạn tạo ra danh mục "
1468
+ "đầu tư chất lượng và thư viện hình ảnh đáng kính."
1469
+
1470
+ msgid "Pie Chart"
1471
+ msgstr "Biểu đồ tròn"
1472
+
1473
+ msgid "Plain"
1474
+ msgstr "Trơn"
1475
+
1476
+ msgid ""
1477
+ "Please be advised that this option is available only in %s. You can %s today "
1478
+ "and get this and other PRO option for your tables!"
1479
+ msgstr ""
1480
+ "Xin lưu ý rằng tùy chọn này chỉ có sẵn trong% s. Bạn có thể% s ngày hôm nay "
1481
+ "và nhận được tùy chọn này và PRO khác cho các bảng của bạn!"
1482
+
1483
+ msgid "Plugin options"
1484
+ msgstr "Tùy chọn plugin"
1485
+
1486
+ msgid "Popup Plugin"
1487
+ msgstr "Plugin bật lên"
1488
+
1489
+ msgid "Portrait"
1490
+ msgstr "Chân dung"
1491
+
1492
+ msgid "Preview"
1493
+ msgstr "Xem trước"
1494
+
1495
+ msgid ""
1496
+ "Preview insert for your comfort. Before updating the table on your page - "
1497
+ "you can see the result of your efforts and changes, look at it and enjoy the "
1498
+ "final outcome."
1499
+ msgstr ""
1500
+ "Xem trước chèn cho sự thoải mái của bạn. Trước khi cập nhật bảng trên trang "
1501
+ "của bạn - bạn có thể thấy kết quả của những nỗ lực và thay đổi của bạn, hãy "
1502
+ "nhìn vào nó và tận hưởng kết quả cuối cùng."
1503
+
1504
+ msgid "Pricing Table"
1505
+ msgstr "Bảng giá"
1506
+
1507
+ msgid "Quantitative value of slice"
1508
+ msgstr "Giá trị định lượng của lát cắt"
1509
+
1510
+ msgid "RA0"
1511
+ msgstr "RA0"
1512
+
1513
+ msgid "RA1"
1514
+ msgstr "RA1"
1515
+
1516
+ msgid "RA2"
1517
+ msgstr "RA2"
1518
+
1519
+ msgid "RA3"
1520
+ msgstr "RA3"
1521
+
1522
+ msgid "RA4"
1523
+ msgstr "RA4"
1524
+
1525
+ msgid "Redo"
1526
+ msgstr "Chuẩn bị"
1527
+
1528
+ msgid "Relative Mode"
1529
+ msgstr "Chế độ tương đối"
1530
+
1531
+ msgid "Remove"
1532
+ msgstr "Xóa bỏ"
1533
+
1534
+ msgid "Remove Data"
1535
+ msgstr "Xóa bỏ dữ liệu"
1536
+
1537
+ msgid "Remove Logo"
1538
+ msgstr "Xóa bỏ logo"
1539
+
1540
+ msgid "Renew License"
1541
+ msgstr "Gia hạn giấy phép"
1542
+
1543
+ msgid "Report a bug"
1544
+ msgstr "Báo cáo lỗi"
1545
+
1546
+ msgid "Require a new functionallity"
1547
+ msgstr "Yêu cầu chức năng mới"
1548
+
1549
+ msgid "Responsive Mode"
1550
+ msgstr "Chế độ đáp ứng"
1551
+
1552
+ msgid "Right"
1553
+ msgstr "Phải"
1554
+
1555
+ msgid "Right Columns Count"
1556
+ msgstr "Số cột phải"
1557
+
1558
+ msgid "Right of the chart"
1559
+ msgstr "Bên phải của biểu đồ"
1560
+
1561
+ msgid "Role for users who can use plugin. Administrator is included by default"
1562
+ msgstr ""
1563
+ "Vai trò cho người dùng có thể sử dụng plugin. Quản trị viên được bao gồm "
1564
+ "theo mặc định"
1565
+
1566
+ msgid "Roles"
1567
+ msgstr "Vai trò"
1568
+
1569
+ msgid "Row"
1570
+ msgstr "Hàng"
1571
+
1572
+ msgid "Row Striping"
1573
+ msgstr "Hàng tước"
1574
+
1575
+ msgid "Row highlighting by mouse hover."
1576
+ msgstr "Hàng nổi bật bằng cách di chuột."
1577
+
1578
+ msgid "Rows"
1579
+ msgstr "Hàng"
1580
+
1581
+ msgid "Rows Count per Request"
1582
+ msgstr "Số lượng hàng cho mỗi yêu cầu"
1583
+
1584
+ msgid "SRA0"
1585
+ msgstr "SRA0"
1586
+
1587
+ msgid "SRA1"
1588
+ msgstr "SRA1"
1589
+
1590
+ msgid "SRA2"
1591
+ msgstr "SRA2"
1592
+
1593
+ msgid "SRA3"
1594
+ msgstr "SRA3"
1595
+
1596
+ msgid "SRA4"
1597
+ msgstr "SRA4"
1598
+
1599
+ msgid "Save"
1600
+ msgstr "Lưu"
1601
+
1602
+ msgid "Save Frontend Fields"
1603
+ msgstr "Lưu các trường Frontend"
1604
+
1605
+ msgid "Save as"
1606
+ msgstr "Lưu dưới dạng"
1607
+
1608
+ msgid "Save the changes of table."
1609
+ msgstr "Lưu các thay đổi của bảng."
1610
+
1611
+ msgid "Scientific"
1612
+ msgstr "Thuộc về khoa học"
1613
+
1614
+ msgid "Search by Hidden Fields"
1615
+ msgstr "Tìm kiếm theo trường ẩn"
1616
+
1617
+ msgid "Search label"
1618
+ msgstr "Tìm kiếm nhãn"
1619
+
1620
+ msgid "Search:"
1621
+ msgstr "Tìm kiếm:"
1622
+
1623
+ msgid "Searching"
1624
+ msgstr "Đang tìm kiếm"
1625
+
1626
+ msgid "Select Logo"
1627
+ msgstr "Chọn logo"
1628
+
1629
+ msgid "Select User to display its table"
1630
+ msgstr "Chọn Người dùng để hiển thị bảng của nó"
1631
+
1632
+ msgid ""
1633
+ "Select a cell and start typing. In a cell, type an equal sign “=” to start "
1634
+ "the formula."
1635
+ msgstr ""
1636
+ "Chọn một ô và bắt đầu nhập. Trong một ô, nhập dấu bằng “=” để bắt đầu công "
1637
+ "thức."
1638
+
1639
+ msgid "Select alignment of table logotype"
1640
+ msgstr "Chọn căn chỉnh của biểu trưng bảng"
1641
+
1642
+ msgid "Select avalilable roles to use tables"
1643
+ msgstr "Chọn vai trò có sẵn để sử dụng bảng"
1644
+
1645
+ msgid "Select chart type"
1646
+ msgstr "Chọn loại biểu đồ"
1647
+
1648
+ msgid "Select file type to export table:"
1649
+ msgstr "Chọn loại tệp để xuất bảng:"
1650
+
1651
+ msgid "Select position of table logotype"
1652
+ msgstr "Chọn vị trí của biểu trưng bảng"
1653
+
1654
+ msgid "Select roles"
1655
+ msgstr "Chọn vai trò"
1656
+
1657
+ msgid "Selectable fields"
1658
+ msgstr "Các trường có thể chọn"
1659
+
1660
+ msgid ""
1661
+ "Set column width for selected columns in pixels or percents. Press \"Clear "
1662
+ "Fixed Width\" to clear fixed columns width for all table columns. All "
1663
+ "changes will be applied after table saving."
1664
+ msgstr ""
1665
+ "Đặt chiều rộng cột cho các cột được chọn theo pixel hoặc phần trăm. Nhấn "
1666
+ "\"Clear Fixed Width\" để xóa chiều rộng cột cố định cho tất cả các cột trong "
1667
+ "bảng. Tất cả thay đổi sẽ được áp dụng sau khi lưu bảng."
1668
+
1669
+ msgid ""
1670
+ "Set count of table rows, which will be saved per one request. If you do not "
1671
+ "know why does this value need for - it's better to keep the preferred value: "
1672
+ "400."
1673
+ msgstr ""
1674
+ "Đặt số lượng hàng trong bảng, sẽ được lưu theo một yêu cầu. Nếu bạn không "
1675
+ "biết tại sao giá trị này lại cần - tốt hơn là giữ giá trị ưu tiên: 400."
1676
+
1677
+ msgid ""
1678
+ "Set fixed table width in px, % or auto (in this case table will be adjusted "
1679
+ "by table content)"
1680
+ msgstr ""
1681
+ "Đặt chiều rộng bảng cố định bằng px,% hoặc tự động (trong trường hợp này "
1682
+ "bảng sẽ được điều chỉnh theo nội dung bảng)"
1683
+
1684
+ msgid "Set format of all numbers in the table"
1685
+ msgstr "Đặt định dạng của tất cả các số trong bảng"
1686
+
1687
+ msgid ""
1688
+ "Set minimum count of characters to start search in Search field. Set 0 to "
1689
+ "make search in any case."
1690
+ msgstr ""
1691
+ "Đặt số ký tự tối thiểu để bắt đầu tìm kiếm trong trường Tìm kiếm. Đặt 0 để "
1692
+ "thực hiện tìm kiếm trong mọi trường hợp."
1693
+
1694
+ msgid ""
1695
+ "Set multiple column sorting for selected columns. Press \"Clear Multiple "
1696
+ "Sorting\" to clear multiple sorting for all table columns. All changes will "
1697
+ "be applied after table saving."
1698
+ msgstr ""
1699
+ "Đặt nhiều cột sắp xếp cho các cột đã chọn. Nhấn \"Xóa nhiều phân loại\" để "
1700
+ "xóa nhiều phân loại cho tất cả các cột trong bảng. Tất cả thay đổi sẽ được "
1701
+ "áp dụng sau khi lưu bảng."
1702
+
1703
+ msgid ""
1704
+ "Set output format for currencies. Supports only 1 currency for 1 table. "
1705
+ "Besides here you can establish needed divider between integer and fractional "
1706
+ "parts and quantity of zeros at fractional part. For example:<br />\n"
1707
+ " $ 1,000.000<br />\n"
1708
+ " € 1.00"
1709
+ msgstr ""
1710
+ "Đặt định dạng đầu ra cho tiền tệ. Chỉ hỗ trợ 1 đơn vị tiền tệ cho 1 bảng. "
1711
+ "Bên cạnh đó ở đây bạn có thể thiết lập chia cần thiết giữa các số nguyên và "
1712
+ "các phần phân đoạn và số lượng các số không ở phần phân số. Ví dụ: <br />\n"
1713
+ "                                             $ 1,000.000 <br />\n"
1714
+ "                                             € 1,00"
1715
+
1716
+ msgid ""
1717
+ "Set output format for date. For example:<br />\n"
1718
+ " YYYY-MM-DD - 1991-12-25<br />\n"
1719
+ " DD.MM.YY - 25.12.91"
1720
+ msgstr ""
1721
+ "Đặt định dạng đầu ra cho ngày. Ví dụ: <br />\n"
1722
+ "                                             YYYY-MM-DD - 1991-12-25 <br />\n"
1723
+ "                                             DD.MM.YY - 25.12.91"
1724
+
1725
+ msgid "Set output format for numbers e.g. 1,000.00, 1.00"
1726
+ msgstr "Đặt định dạng đầu ra cho các số, ví dụ: 1.000,00, 1,00"
1727
+
1728
+ msgid ""
1729
+ "Set output format for percent numbers. For example:<br />\n"
1730
+ " 10.00%<br />\n"
1731
+ " 10%"
1732
+ msgstr ""
1733
+ "Đặt định dạng đầu ra cho số phần trăm. Ví dụ: <br />\n"
1734
+ "                                             10,00% <br />\n"
1735
+ "                                             10%"
1736
+
1737
+ msgid ""
1738
+ "Set output format for time and duration. For example:<br />\n"
1739
+ " 1) time<br />\n"
1740
+ " HH:mm - 18:00<br />\n"
1741
+ " hh:mm a - 9:00 pm<br /><br />\n"
1742
+ " 2) duration<br />\n"
1743
+ " hh:mm - 36:40<br />\n"
1744
+ " hh:mm:ss - 36:40:12"
1745
+ msgstr ""
1746
+ "Đặt định dạng đầu ra cho thời gian và thời lượng. Ví dụ:<br />\n"
1747
+ " 1) time<br />\n"
1748
+ " HH:mm - 18:00<br />\n"
1749
+ " hh:mm a - 9:00 pm<br /><br />\n"
1750
+ " 2) duration<br />\n"
1751
+ " hh:mm - 36:40<br />\n"
1752
+ " hh:mm:ss - 36:40:12"
1753
+
1754
+ msgid "Set sort order by default"
1755
+ msgstr "Đặt thứ tự sắp xếp theo mặc định"
1756
+
1757
+ msgid ""
1758
+ "Set the numeric value from 0 to 100, for example 10 (equals to 10%). Leave "
1759
+ "this field empty to use default offset value."
1760
+ msgstr ""
1761
+ "Đặt giá trị số từ 0 đến 100, ví dụ 10 (bằng 10%). Để trống trường này để sử "
1762
+ "dụng giá trị bù mặc định."
1763
+
1764
+ msgid ""
1765
+ "Set the value in px or %, for example, 200 (equals to 200px) or 80%. Leave "
1766
+ "this field empty to use default height value."
1767
+ msgstr ""
1768
+ "Đặt giá trị bằng px hoặc%, ví dụ: 200 (bằng 200px) hoặc 80%. Để trống trường "
1769
+ "này để sử dụng giá trị độ cao mặc định."
1770
+
1771
+ msgid ""
1772
+ "Set the value in px or %, for example, 400 (equals to 400px) or 90%. Leave "
1773
+ "this field empty to use default width value."
1774
+ msgstr ""
1775
+ "Đặt giá trị bằng px hoặc%, ví dụ: 400 (bằng 400px) hoặc 90%. Để trống trường "
1776
+ "này để sử dụng giá trị độ rộng mặc định."
1777
+
1778
+ msgid "Settings"
1779
+ msgstr "Cài đặt"
1780
+
1781
+ msgid "Short Number"
1782
+ msgstr "Số ngắn"
1783
+
1784
+ msgid "Shortcode"
1785
+ msgstr "Mã ngắn"
1786
+
1787
+ msgid "Show Empty Table"
1788
+ msgstr "Hiển thị bảng trống"
1789
+
1790
+ msgid "Show Only Search Results"
1791
+ msgstr "Chỉ hiển thị kết quả tìm kiếm"
1792
+
1793
+ msgid "Show _MENU_ entries"
1794
+ msgstr "Hiển thị các mục _MENU"
1795
+
1796
+ msgid "Showing 0 to 0 of 0 entries"
1797
+ msgstr "Hiển thị 0 đến 0 trong số 0 mục"
1798
+
1799
+ msgid "Showing _START_ to _END_ of _TOTAL_ entries"
1800
+ msgstr "Hiển thị _START_ đến _END_ của _TOTAL_ mục"
1801
+
1802
+ msgid "Signature"
1803
+ msgstr "Chữ ký"
1804
+
1805
+ msgid "Signature Text"
1806
+ msgstr "Chữ ký"
1807
+
1808
+ msgid "Slider Plugin"
1809
+ msgstr "Pluin Slider"
1810
+
1811
+ msgid "Slider by Supsystic"
1812
+ msgstr "Slider bởi Supsystic"
1813
+
1814
+ msgid "Small"
1815
+ msgstr "Nhỏ"
1816
+
1817
+ msgid "Social Share Buttons"
1818
+ msgstr "Nút chia sẻ mạng xã hội"
1819
+
1820
+ msgid ""
1821
+ "Social share buttons to increase social traffic and popularity. Social "
1822
+ "sharing to Facebook, Twitter and other social networks."
1823
+ msgstr ""
1824
+ "Nút chia sẻ xã hội để tăng lưu lượng truy cập xã hội và mức độ phổ biến. "
1825
+ "Chia sẻ xã hội lên Facebook, Twitter và các mạng xã hội khác."
1826
+
1827
+ msgid ""
1828
+ "Some errors occurred while sending mail please send your message trough this "
1829
+ "contact form:"
1830
+ msgstr ""
1831
+ "Đã xảy ra một số lỗi khi gửi thư, vui lòng gửi tin nhắn của bạn thông qua "
1832
+ "biểu mẫu liên hệ này:"
1833
+
1834
+ msgid "Sort order"
1835
+ msgstr "Thứ tự sắp xếp"
1836
+
1837
+ msgid "Sorting"
1838
+ msgstr "Sắp xếp"
1839
+
1840
+ msgid "Sorting Column"
1841
+ msgstr "Sắp xếp theo cột"
1842
+
1843
+ msgid "Sorting Order"
1844
+ msgstr "Sắp xếp thứ tự"
1845
+
1846
+ msgid "Stacked Columns"
1847
+ msgstr "Cột xếp chồng lên nhau"
1848
+
1849
+ msgid "Standard Responsive mode"
1850
+ msgstr "Chế độ đáp ứng tiêu chuẩn"
1851
+
1852
+ msgid ""
1853
+ "Standard Responsive mode - in this mode if table content doesn't fit all "
1854
+ "columns become under each other with one cell per row"
1855
+ msgstr ""
1856
+ "Chế độ đáp ứng tiêu chuẩn - trong chế độ này nếu nội dung bảng không phù hợp "
1857
+ "với tất cả các cột trở nên dưới nhau với một ô trên mỗi hàng"
1858
+
1859
+ msgid "Step-by-step Tutorial"
1860
+ msgstr "Hướng dẫn từng bước"
1861
+
1862
+ msgid "Strict Matching"
1863
+ msgstr "Kết hợp chặt chẽ"
1864
+
1865
+ msgid "Subject"
1866
+ msgstr "Chủ đề"
1867
+
1868
+ msgid "Support"
1869
+ msgstr "Hỗ trợ"
1870
+
1871
+ msgid ""
1872
+ "Supsystic Newsletter plugin for automatic mailing of your letters. You will "
1873
+ "have no need to control it or send them manually. No coding, hard skills or "
1874
+ "long hours of customizing are required."
1875
+ msgstr ""
1876
+ "Supsystic Bản tin plugin cho tự động gửi thư của bạn. Bạn sẽ không cần phải "
1877
+ "kiểm soát nó hoặc gửi chúng bằng tay. Không yêu cầu mã hóa, kỹ năng cứng "
1878
+ "hoặc nhiều giờ tùy chỉnh."
1879
+
1880
+ msgid "Switch rows / columns"
1881
+ msgstr "Chuyển đổi hàng / cột"
1882
+
1883
+ msgid "Table Elements"
1884
+ msgstr "Các phần tử bảng"
1885
+
1886
+ msgid "Table History"
1887
+ msgstr "Lịch sử thay đổi bảng"
1888
+
1889
+ msgid "Table Information"
1890
+ msgstr "Thông tin bảng"
1891
+
1892
+ msgid "Table Language"
1893
+ msgstr "Ngôn ngữ bảng"
1894
+
1895
+ msgid "Table Loader Color"
1896
+ msgstr "Màu khi load bảng"
1897
+
1898
+ msgid "Table Loader Icon"
1899
+ msgstr "Icon khi load bảng"
1900
+
1901
+ msgid "Table info text"
1902
+ msgstr "Văn bản thông tin bảng"
1903
+
1904
+ msgid "Table information display field. %s"
1905
+ msgstr "Trường hiển thị thông tin bảng. %S"
1906
+
1907
+ msgid "Table title"
1908
+ msgstr "Tiêu đề bảng"
1909
+
1910
+ msgid "Table will not be hidden by default , but will be empty."
1911
+ msgstr "Bảng sẽ không bị ẩn theo mặc định, nhưng sẽ trống."
1912
+
1913
+ msgid "Tables"
1914
+ msgstr "Bảng"
1915
+
1916
+ msgid "Tabloid"
1917
+ msgstr "Báo lá cải"
1918
+
1919
+ msgid "Text color"
1920
+ msgstr "Màu chữ văn bản"
1921
+
1922
+ msgid "Text on Slice"
1923
+ msgstr "Văn bản trên Slice"
1924
+
1925
+ msgid ""
1926
+ "Thank you for choosing our Data Tables plugin. Just click here to start "
1927
+ "using it - and we will show you it's possibilities and powerfull features."
1928
+ msgstr ""
1929
+ "Cảm ơn bạn đã chọn plugin Bảng dữ liệu của chúng tôi. Chỉ cần nhấp vào đây "
1930
+ "để bắt đầu sử dụng nó - và chúng tôi sẽ cho bạn thấy khả năng của nó và các "
1931
+ "tính năng mạnh mẽ."
1932
+
1933
+ msgid ""
1934
+ "Thank you for choosing our Data Tables plugin. Let’s make a quick tour "
1935
+ "through features and main options of the plugin. Just click “Next” button."
1936
+ msgstr ""
1937
+ "Cảm ơn bạn đã chọn plugin Bảng dữ liệu của chúng tôi. Hãy thực hiện chuyến "
1938
+ "tham quan nhanh qua các tính năng và tùy chọn chính của plugin. Chỉ cần nhấp "
1939
+ "vào nút \"Tiếp theo\"."
1940
+
1941
+ msgid ""
1942
+ "The Best WordPress PopUp option plugin to help you gain more subscribers, "
1943
+ "social followers or advertisement. Responsive pop-ups with friendly options."
1944
+ msgstr ""
1945
+ "Plugin tùy chọn WordPress PopUp tốt nhất để giúp bạn có được nhiều người "
1946
+ "đăng ký, người theo dõi xã hội hoặc quảng cáo hơn. Cửa sổ bật lên đáp ứng "
1947
+ "với các tùy chọn thân thiện."
1948
+
1949
+ msgid ""
1950
+ "The most important part of settings - Editor. Here you can fill all the "
1951
+ "cells of your table, add some colors, play with fonts and sizes. This insert "
1952
+ "also allows you to change the alignment of your font, add formats (percents, "
1953
+ "currency), images and links to make your table more visual attraction."
1954
+ msgstr ""
1955
+ "Phần quan trọng nhất của cài đặt - Trình chỉnh sửa. Ở đây bạn có thể điền "
1956
+ "vào tất cả các ô của bảng, thêm một số màu, chơi với phông chữ và kích cỡ. "
1957
+ "Chèn này cũng cho phép bạn thay đổi sự liên kết của phông chữ của bạn, thêm "
1958
+ "định dạng (phần trăm, tiền tệ), hình ảnh và liên kết để làm cho bảng của bạn "
1959
+ "thu hút thị giác hơn."
1960
+
1961
+ msgid "The table ID %s not found."
1962
+ msgstr "Không tìm thấy ID bảng% s."
1963
+
1964
+ msgid "The table with ID %d not exists."
1965
+ msgstr "Bảng có ID% d không tồn tại."
1966
+
1967
+ msgid "There are not all shortcode's attributes specified. Usage example"
1968
+ msgstr ""
1969
+ "Không có tất cả các thuộc tính của shortcode được chỉ định. Ví dụ sử dụng"
1970
+
1971
+ msgid ""
1972
+ "This label can not be translated using Table Language option. You can change "
1973
+ "this label typing the custom text or hide this label typing _NONE_ as label "
1974
+ "text."
1975
+ msgstr ""
1976
+ "Không thể dịch nhãn này bằng tùy chọn Ngôn ngữ bảng. Bạn có thể thay đổi "
1977
+ "nhãn này bằng cách nhập văn bản tùy chỉnh hoặc ẩn nhãn này đang nhập _NONE_ "
1978
+ "làm văn bản nhãn."
1979
+
1980
+ msgid ""
1981
+ "This mode allows you to separate the content into paragraphs. To move to a "
1982
+ "new line in the cell - please press CTRL + Enter."
1983
+ msgstr ""
1984
+ "Chế độ này cho phép bạn tách nội dung thành các đoạn văn. Để di chuyển đến "
1985
+ "một dòng mới trong ô - vui lòng nhấn CTRL + Enter."
1986
+
1987
+ msgid "Time / Duration"
1988
+ msgstr "Khoảng thời gian"
1989
+
1990
+ msgid "Title"
1991
+ msgstr "Chức vụ"
1992
+
1993
+ msgid "Topic"
1994
+ msgstr "Đề tài"
1995
+
1996
+ msgid "Type"
1997
+ msgstr "Kiểu"
1998
+
1999
+ msgid "Type Google Sheet url to import data from sheet to table"
2000
+ msgstr "Nhập url của Trang tính Google để nhập dữ liệu từ trang tính vào bảng"
2001
+
2002
+ msgid "Underline"
2003
+ msgstr "Gạch dưới"
2004
+
2005
+ msgid "Undo"
2006
+ msgstr "Hủy bỏ"
2007
+
2008
+ msgid "Unsupported export type: %s."
2009
+ msgstr "Loại xuất không được hỗ trợ:% s."
2010
+
2011
+ msgid "Url"
2012
+ msgstr "Url"
2013
+
2014
+ msgid "Use Comma as Delimiter"
2015
+ msgstr "Sử dụng dấu phẩy làm dấu phân tách"
2016
+
2017
+ msgid "Use Custom Colors"
2018
+ msgstr "Sử dụng màu tùy chỉnh"
2019
+
2020
+ msgid "Use Editable Fields for Current Roles"
2021
+ msgstr "Sử dụng các trường có thể chỉnh sửa cho vai trò hiện tại"
2022
+
2023
+ msgid "Use Export Font"
2024
+ msgstr "Sử dụng Phông chữ xuất"
2025
+
2026
+ msgid "Use Frontend Fields for Logged In Users Only"
2027
+ msgstr "Sử dụng các trường giao diện người dùng cho người dùng đã đăng nhập"
2028
+
2029
+ msgid ""
2030
+ "Use comma as delimiter of integer and fractional parts of number for "
2031
+ "editable fields on frontend"
2032
+ msgstr ""
2033
+ "Sử dụng dấu phẩy làm dấu phân tách các phần số nguyên và phân số cho các "
2034
+ "trường có thể chỉnh sửa trên giao diện người dùng"
2035
+
2036
+ msgid "Use first column as labels"
2037
+ msgstr "Sử dụng cột đầu tiên làm nhãn"
2038
+
2039
+ msgid "Use first row as headers"
2040
+ msgstr "Sử dụng hàng đầu tiên làm tiêu đề"
2041
+
2042
+ msgid "Vertical alignment"
2043
+ msgstr "Căn chỉnh theo chiều dọc"
2044
+
2045
+ msgid "Video Tutorial"
2046
+ msgstr "Video hướng dẫn"
2047
+
2048
+ msgid ""
2049
+ "We are trying to make your using of our plugin maximum comfortable and easy. "
2050
+ "So we find it like the best way to tell you about some options and features "
2051
+ "of this plugin."
2052
+ msgstr ""
2053
+ "Chúng tôi đang cố gắng làm cho việc sử dụng plugin của chúng tôi tối đa "
2054
+ "thoải mái và dễ dàng. Vì vậy, chúng tôi tìm thấy nó như là cách tốt nhất để "
2055
+ "cho bạn biết về một số tùy chọn và tính năng của plugin này."
2056
+
2057
+ msgid ""
2058
+ "We really like what we do and feel responsibility for our “child”. "
2059
+ "Constantly we are trying to change something or update the new features, but "
2060
+ "sometimes you may have a situation when you need help or have a problem. We "
2061
+ "can offer you two kinds of help: "
2062
+ msgstr ""
2063
+ "Chúng tôi thực sự thích những gì chúng tôi làm và cảm thấy có trách nhiệm "
2064
+ "với “đứa trẻ” của chúng tôi. Thường xuyên chúng tôi đang cố gắng thay đổi "
2065
+ "một cái gì đó hoặc cập nhật các tính năng mới, nhưng đôi khi bạn có thể có "
2066
+ "một tình huống khi bạn cần giúp đỡ hoặc có một vấn đề. Chúng tôi có thể cung "
2067
+ "cấp cho bạn hai loại trợ giúp:"
2068
+
2069
+ msgid "Website"
2070
+ msgstr "Website"
2071
+
2072
+ msgid "Welcome to Data Tables plugin by Supsystic!"
2073
+ msgstr "Chào mừng bạn đến với plugin Bảng dữ liệu bởi Supsystic!"
2074
+
2075
+ msgid "Welcome to our plugin"
2076
+ msgstr "Chào mừng bạn đến với plugin của chúng tôi"
2077
+
2078
+ msgid "Well done!"
2079
+ msgstr "Làm tốt!"
2080
+
2081
+ msgid ""
2082
+ "When you use frontend fields, <a href=\"%s\" target=\"_blank\">Table Hitory</"
2083
+ "a> allows you (using History Shortcode) to display on frontend the own table "
2084
+ "version for each logged in user. On this tab you can display any user's "
2085
+ "table - just choose the user name from dropdown list."
2086
+ msgstr ""
2087
+ "Khi bạn sử dụng các trường giao diện người dùng, <a href=\"%s\" target="
2088
+ "\"_blank\"> Bảng Hitory </a> cho phép bạn (sử dụng Shortcode lịch sử) hiển "
2089
+ "thị trên giao diện người dùng phiên bản bảng riêng cho từng người dùng đã "
2090
+ "đăng nhập. Trên tab này, bạn có thể hiển thị bảng của bất kỳ người dùng nào "
2091
+ "- chỉ cần chọn tên người dùng từ danh sách thả xuống."
2092
+
2093
+ msgid "Width"
2094
+ msgstr "Chiều rộng"
2095
+
2096
+ msgid ""
2097
+ "With these two buttons in our Pro version you can Import any table of csv "
2098
+ "format and Export the whole table, which you have done."
2099
+ msgstr ""
2100
+ "Với hai nút này trong phiên bản Pro của chúng tôi, bạn có thể Nhập bất kỳ "
2101
+ "bảng định dạng csv nào và Xuất toàn bộ bảng mà bạn đã thực hiện."
2102
+
2103
+ msgid "Word wrapping"
2104
+ msgstr "Gói từ"
2105
+
2106
+ msgid "Yes"
2107
+ msgstr "Vâng"
2108
+
2109
+ msgid "You can change number of Columns and Rows later"
2110
+ msgstr "Bạn có thể thay đổi số lượng cột và hàng sau"
2111
+
2112
+ msgid ""
2113
+ "You have no diagrams for now. Go to %s -> select the required data in the "
2114
+ "table and click on “Add diagram” button. Also please check the tutorial %s"
2115
+ msgstr ""
2116
+ "Bạn không có sơ đồ cho bây giờ. Đi tới% s -> chọn dữ liệu cần thiết trong "
2117
+ "bảng và nhấp vào nút “Thêm sơ đồ”. Ngoài ra, hãy kiểm tra hướng dẫn% s"
2118
+
2119
+ msgid ""
2120
+ "You need to enable ZipArchive extension in PHP config file on your server. "
2121
+ "Please, contact to your server administrator."
2122
+ msgstr ""
2123
+ "Bạn cần bật phần mở rộng ZipArchive trong tệp cấu hình PHP trên máy chủ của "
2124
+ "bạn. Vui lòng liên hệ với quản trị viên máy chủ của bạn."
2125
+
2126
+ msgid "You will not be able to update your pro version with expired license"
2127
+ msgstr ""
2128
+ "Bạn sẽ không thể cập nhật phiên bản chuyên nghiệp của mình với giấy phép đã "
2129
+ "hết hạn"
2130
+
2131
+ msgid "Your message successfully send. We contact you soon."
2132
+ msgstr "Tin nhắn của bạn đã gửi thành công. Chúng tôi liên lạc với bạn sớm."
2133
+
2134
+ msgid "Your premium support is expired in %s days"
2135
+ msgstr "Hỗ trợ phí bảo hiểm của bạn đã hết hạn sau% s ngày"
2136
+
2137
+ msgid "Your premium support is expired in ' ~ days ~ ' days"
2138
+ msgstr "Hỗ trợ phí bảo hiểm của bạn đã hết hạn sau '~ days ~' ngày"
2139
+
2140
+ msgid "Zero records"
2141
+ msgstr "Bản ghi Zero"
2142
+
2143
+ msgid "by Supsystic!"
2144
+ msgstr "bởi Supsystic!"
2145
+
2146
+ msgid "default"
2147
+ msgstr "mặc định"
2148
+
2149
+ msgid "disable width"
2150
+ msgstr "tắt chiều rộng"
2151
+
2152
+ msgid "how to create Diagrams with Data Table plugin"
2153
+ msgstr "làm thế nào để tạo ra Diagrams với Data Table plugin"
2154
+
2155
+ msgid "value"
2156
+ msgstr "giá trị"
index.php CHANGED
@@ -4,7 +4,7 @@
4
  * Plugin Name: Data Tables Generator by Supsystic
5
  * Plugin URI: http://supsystic.com
6
  * Description: Create and manage beautiful data tables with custom design. No HTML knowledge is required
7
- * Version: 1.8.5
8
  * Author: supsystic.com
9
  * Author URI: http://supsystic.com
10
  */
4
  * Plugin Name: Data Tables Generator by Supsystic
5
  * Plugin URI: http://supsystic.com
6
  * Description: Create and manage beautiful data tables with custom design. No HTML knowledge is required
7
+ * Version: 1.8.7
8
  * Author: supsystic.com
9
  * Author URI: http://supsystic.com
10
  */
readme.txt CHANGED
@@ -1,8 +1,8 @@
1
  === Data Tables Generator by Supsystic ===
2
  Contributors: supsystic.com
3
  Tags: csv, csv file, csv to table, excel, table, tablesorter, post, data table, table, database, html table, table generator, builder, generator, cells, area chart, bar chart, candlestick chart, canvas, chart, charting, charts, column chart, gauge chart, geo chart, google chart, google visualization api, graph, graphing, graphs, html5, line chart, pie chart, scatter chart, spreadsheet, visualisation, visualise data, visualization, visualize data
4
- Tested up to: 4.9.6
5
- Stable tag: 1.8.5
6
 
7
  Create data tables with charts and graphs. Custom design, navigation, searching and ordering functions. Export to PDF, CSV, Print. Excel spreadsheet
8
 
@@ -194,6 +194,25 @@ Important! Shortcode must be inserted in a text editor page, and not in the visu
194
 
195
  == Changelog ==
196
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
197
  = 1.8.5 / 21.06.2018 =
198
  * Added mass migration of tables
199
  * Add caching to solve the problem of importing large tables
@@ -206,7 +225,6 @@ Important! Shortcode must be inserted in a text editor page, and not in the visu
206
  * Change "Insert picture" toolbar button to "Insert media"
207
  * Minor issues fix
208
 
209
-
210
  = 1.8.4 / 30.05.2018 =
211
  * Add of option to plugin settings: Disable WP Footer Fix
212
  * Implemented automatic updating of diagrams when changing data in a table
1
  === Data Tables Generator by Supsystic ===
2
  Contributors: supsystic.com
3
  Tags: csv, csv file, csv to table, excel, table, tablesorter, post, data table, table, database, html table, table generator, builder, generator, cells, area chart, bar chart, candlestick chart, canvas, chart, charting, charts, column chart, gauge chart, geo chart, google chart, google visualization api, graph, graphing, graphs, html5, line chart, pie chart, scatter chart, spreadsheet, visualisation, visualise data, visualization, visualize data
4
+ Tested up to: 4.9.7
5
+ Stable tag: 1.8.7
6
 
7
  Create data tables with charts and graphs. Custom design, navigation, searching and ordering functions. Export to PDF, CSV, Print. Excel spreadsheet
8
 
194
 
195
  == Changelog ==
196
 
197
+ = 1.8.7 / 24.07.2018 =
198
+ * Fix Multisite Installation process
199
+ * Fixed the problem: Clicking on the cell raises the table up
200
+ * Fixes for optioon Source - Database
201
+ * Added the ability to edit database table data through the frontend fields
202
+ * Added the ability to create diagrams for cells with shortcodes
203
+ * Fix underline position by exporting to pdf
204
+ * Fix of dynamically applying of diagram's options to diagram preview
205
+ * Add support Strict Matching Option for SSP
206
+ * Fix of displaying merged cells in table footer
207
+ * Fix for GlobalSearch
208
+
209
+ = 1.8.6 / 03.07.2018 =
210
+ * fix code for IE
211
+ * Disabled Save button until the data loaded
212
+ * Added Vietnamese translation
213
+ * Add Server-side Processing as an option and optimize import of the large tables
214
+ * Minor issues fix
215
+
216
  = 1.8.5 / 21.06.2018 =
217
  * Added mass migration of tables
218
  * Add caching to solve the problem of importing large tables
225
  * Change "Insert picture" toolbar button to "Insert media"
226
  * Minor issues fix
227
 
 
228
  = 1.8.4 / 30.05.2018 =
229
  * Add of option to plugin settings: Disable WP Footer Fix
230
  * Implemented automatic updating of diagrams when changing data in a table
src/SupsysticTables/Core/Module.php CHANGED
@@ -16,7 +16,7 @@ class SupsysticTables_Core_Module extends SupsysticTables_Core_BaseModule
16
 
17
  private $frontendMethods = array(
18
  'ajax' => array(
19
- 'tables' => array('saveEditableFields')
20
  ),
21
  'post' => array(
22
  'importer' => array('import'),
@@ -462,8 +462,20 @@ class SupsysticTables_Core_Module extends SupsysticTables_Core_BaseModule
462
  $oldVersion = get_option($optionName);
463
 
464
  if (version_compare($oldVersion, $currentVersion) === -1) {
465
- $this->cleanTablesCache();
466
- update_option($optionName, $currentVersion);
 
 
 
 
 
 
 
 
 
 
 
 
467
  }
468
 
469
  $revision = array(
@@ -475,7 +487,25 @@ class SupsysticTables_Core_Module extends SupsysticTables_Core_BaseModule
475
  return;
476
  }
477
 
478
- /** @var SupsysticTables_Core_Model_Core $core */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
479
  $core = $this->getModelsFactory()->get('core');
480
  $updatesPath = $this->getLocation() . '/updates';
481
 
@@ -503,7 +533,7 @@ class SupsysticTables_Core_Module extends SupsysticTables_Core_BaseModule
503
  }
504
 
505
  update_option($config->get('revision_key'), $revision['current']);
506
- }
507
 
508
  private function registerTwigFunctions()
509
  {
16
 
17
  private $frontendMethods = array(
18
  'ajax' => array(
19
+ 'tables' => array('saveEditableFields', 'getPageRows')
20
  ),
21
  'post' => array(
22
  'importer' => array('import'),
462
  $oldVersion = get_option($optionName);
463
 
464
  if (version_compare($oldVersion, $currentVersion) === -1) {
465
+ if (function_exists('is_multisite') && is_multisite()) {
466
+ global $wpdb;
467
+ $blog_id = $wpdb->get_col("SELECT blog_id FROM $wpdb->blogs");
468
+ foreach ($blog_id as $id) {
469
+ if (switch_to_blog($id)) {
470
+ $this->cleanTablesCache();
471
+ update_option($optionName, $currentVersion);
472
+ restore_current_blog();
473
+ }
474
+ }
475
+ } else {
476
+ $this->cleanTablesCache();
477
+ update_option($optionName, $currentVersion);
478
+ }
479
  }
480
 
481
  $revision = array(
487
  return;
488
  }
489
 
490
+ if (function_exists('is_multisite') && is_multisite()) {
491
+ global $wpdb;
492
+ $blog_id = $wpdb->get_col("SELECT blog_id FROM $wpdb->blogs");
493
+ foreach ($blog_id as $id) {
494
+ if (switch_to_blog($id)) {
495
+ $this->makeDbUpdate($revision);
496
+ restore_current_blog();
497
+ }
498
+ }
499
+ } else {
500
+ $this->makeDbUpdate($revision);
501
+ }
502
+ }
503
+
504
+ private function makeDbUpdate($revision) {
505
+ $environment = $this->getEnvironment();
506
+ $config = $environment->getConfig();
507
+
508
+ /** @var SupsysticTables_Core_Model_Core $core */
509
  $core = $this->getModelsFactory()->get('core');
510
  $updatesPath = $this->getLocation() . '/updates';
511
 
533
  }
534
 
535
  update_option($config->get('revision_key'), $revision['current']);
536
+ }
537
 
538
  private function registerTwigFunctions()
539
  {
src/SupsysticTables/Core/assets/js/core.js CHANGED
@@ -1,6 +1,7 @@
1
  if(typeof(SDT_DATA) == 'undefined') {
2
  var SDT_DATA = {};
3
  }
 
4
 
5
  (function (vendor, $, window) {
6
 
@@ -207,6 +208,7 @@ if(typeof(SDT_DATA) == 'undefined') {
207
  searching: false,
208
  stateSave: false,
209
  api: true,
 
210
  initComplete: callback,
211
  headerCallback: function( thead, data, start, end, display ) {
212
  $(thead).closest('thead').find('th').each(function() {
@@ -219,6 +221,9 @@ if(typeof(SDT_DATA) == 'undefined') {
219
  });
220
  }
221
  };
 
 
 
222
 
223
  // Fix of correct displaying of tables with hidden rows / columns for tables without headers.
224
  if (!$table.data('head')) {
@@ -349,11 +354,11 @@ if(typeof(SDT_DATA) == 'undefined') {
349
  });
350
  }
351
  if (searchingSettings.columnSearch && $table.find('tfoot').find('input').length == 0) {
352
- var tds = $table.find('tbody tr:first').find('td'),
353
  ths = '';
354
 
355
  for (var i = 0; i < tds.length; i++) {
356
- ths += '<th' + ($(tds[i]).hasClass('invisibleCell') ? ' class="invisibleCell"' : '') + '><input type="text" /></th>';
357
  }
358
  if (ths.length > 0) {
359
  if($table.find('tfoot').length == 0) {
@@ -439,6 +444,11 @@ if(typeof(SDT_DATA) == 'undefined') {
439
  }
440
  }
441
  }, 150));
 
 
 
 
 
442
  }).trigger('resize');
443
  } else if (responsiveMode === 1) {
444
  // Responsive Mode: Automatic Column Hiding
@@ -476,13 +486,22 @@ if(typeof(SDT_DATA) == 'undefined') {
476
  }
477
  };
478
  $table.on('responsive-resize.dt', function(event, api, columns) {
 
 
 
 
 
 
 
 
 
479
  if ($table.width() > $table.parent().width()) {
480
  api.responsive.recalc();
481
  return;
482
  }
483
  for (var i = 0, len = columns.length; i < len; i++) {
484
  if (columns[i]) {
485
- $table.find('tr > td.collapsed-cell-holder[data-cell-column="' + i + '"]').each(function(index, el) {
486
  var $this = $(this);
487
  var $cell = $(api.cell(
488
  $this.data('cell-row'),
@@ -549,13 +568,132 @@ if(typeof(SDT_DATA) == 'undefined') {
549
  }
550
  });
551
  config.language = translation;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
552
  $table.trigger('beforeInitializeTable', $table);
553
- tableInstance = $table.dataTable($.extend({}, defaultFeatures, config, reinit));
554
  tableInstance.table_id = $table.data('id');
555
  tableInstance.table_view_id = $table.data('view-id');
556
  tableInstance.fnFakeRowspan();
557
  self._checkOnClickPopups($table);
558
 
 
 
 
 
 
 
559
  if(addInstance) {
560
  this.setTableInstance(tableInstance);
561
  }
@@ -601,7 +739,7 @@ if(typeof(SDT_DATA) == 'undefined') {
601
 
602
  $(document).on('click', '.paginate_button', function () {
603
  setTimeout(function() {
604
- _ruleJS.init();
605
  self.formatDataAtTable($table, true);
606
  }, 50);
607
  });
@@ -649,6 +787,9 @@ if(typeof(SDT_DATA) == 'undefined') {
649
  self.setAllFields($table, $editableFields, $selectableFields);
650
  } else {
651
  self.createEditableFields($table, $editableFields);
 
 
 
652
  }
653
  $table.on('init.dt', function() {
654
  $table.on('responsive-resize.dt responsive-display.dt draw.dt', function() {
@@ -690,6 +831,9 @@ if(typeof(SDT_DATA) == 'undefined') {
690
  }else{
691
  tBody.removeStyle('border-bottom');
692
  }
 
 
 
693
  }).trigger('resize');
694
 
695
  // need resize twice to get better frontend view
@@ -772,6 +916,19 @@ if(typeof(SDT_DATA) == 'undefined') {
772
  }
773
  }
774
 
 
 
 
 
 
 
 
 
 
 
 
 
 
775
  function b64DecodeUnicode(str) {
776
  return decodeURIComponent(Array.prototype.map.call(atob(str), function(c) {
777
  return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
@@ -779,6 +936,57 @@ if(typeof(SDT_DATA) == 'undefined') {
779
  }
780
  });
781
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
782
  // Callback for executing script after table is initialized
783
  vendor[appName].executeScript = (function(table) {
784
  var $table = (table instanceof $ ? table : $(table)),
1
  if(typeof(SDT_DATA) == 'undefined') {
2
  var SDT_DATA = {};
3
  }
4
+ var g_stbServerSideProcessing = false;
5
 
6
  (function (vendor, $, window) {
7
 
208
  searching: false,
209
  stateSave: false,
210
  api: true,
211
+ retrieve: true,
212
  initComplete: callback,
213
  headerCallback: function( thead, data, start, end, display ) {
214
  $(thead).closest('thead').find('th').each(function() {
221
  });
222
  }
223
  };
224
+ if($table.data('server-side-processing') && $table.data('server-side-processing') == 'on') {
225
+ g_stbServerSideProcessing = true;
226
+ }
227
 
228
  // Fix of correct displaying of tables with hidden rows / columns for tables without headers.
229
  if (!$table.data('head')) {
354
  });
355
  }
356
  if (searchingSettings.columnSearch && $table.find('tfoot').find('input').length == 0) {
357
+ var tds = $table.find('thead tr:first').find('th'),
358
  ths = '';
359
 
360
  for (var i = 0; i < tds.length; i++) {
361
+ ths += '<th><input type="text" /></th>';
362
  }
363
  if (ths.length > 0) {
364
  if($table.find('tfoot').length == 0) {
444
  }
445
  }
446
  }, 150));
447
+ if(g_stbServerSideProcessing) {
448
+ $table.find('td').each(function() {
449
+ $(this).css({'width': '','min-width': ''});
450
+ });
451
+ }
452
  }).trigger('resize');
453
  } else if (responsiveMode === 1) {
454
  // Responsive Mode: Automatic Column Hiding
486
  }
487
  };
488
  $table.on('responsive-resize.dt', function(event, api, columns) {
489
+ if(typeof api == 'undefined' || typeof columns == 'undefined') {
490
+ var tbl = $(this),
491
+ instance = vendor[appName].getTableInstanceById(tbl.data('id'));
492
+
493
+ if(instance) {
494
+ api = typeof api != 'undefined' ? api : instance.api();
495
+ columns = typeof columns != 'undefined' ? columns : instance.api().columns();
496
+ }
497
+ }
498
  if ($table.width() > $table.parent().width()) {
499
  api.responsive.recalc();
500
  return;
501
  }
502
  for (var i = 0, len = columns.length; i < len; i++) {
503
  if (columns[i]) {
504
+ $table.find('tr > td.collapsed-cell-holder[data-cell-column="' + i + '"]').each(function(index, el) {
505
  var $this = $(this);
506
  var $cell = $(api.cell(
507
  $this.data('cell-row'),
568
  }
569
  });
570
  config.language = translation;
571
+
572
+ var ajaxSource = {};
573
+
574
+ if(g_stbServerSideProcessing) {
575
+ var route = {"action" : "getPageRows", "module": "tables"},
576
+ loadedRows = [],
577
+ loadedCells = [],
578
+ headerRowsCount = ($table.data('head') == 'on' ? $table.data('head-rows-count') : 0),
579
+ footerRowsCount = ($table.data('foot') == 'on' ? $table.data('foot-custom-rows-count') : 0);
580
+ ajaxSource = {
581
+ processing: true,
582
+ serverSide: true,
583
+ ajax: {
584
+ url: window.ajaxurl ? window.ajaxurl : ajax_obj.ajaxurl,
585
+ type: 'POST',
586
+ data: {
587
+ action: "supsystic-tables",
588
+ route: route,
589
+ id: $table.data('id'),
590
+ searchParams: searchingSettings,
591
+ searchValue: function () {
592
+ var input = $('#' + $table.attr('id') + '_filter.dataTables_filter').find('input');
593
+ return (input.length ? input.val() : '');
594
+ },
595
+ header: headerRowsCount,
596
+ footer: footerRowsCount},
597
+ dataFilter: function(data){
598
+ var json = jQuery.parseJSON(data),
599
+ rows = $(json.rows).find('tr'),
600
+ aData = [];
601
+
602
+ loadedRows = [];
603
+ loadedCells = [];
604
+ for(var i = 0; i < rows.length; i++) {
605
+ var row = rows[i];
606
+ loadedRows.push(row.attributes);
607
+ var cells = $(row).find('td'),
608
+ attrs = [],
609
+ vals = [];
610
+ for(var j = 0; j < cells.length; j++) {
611
+ var cell = cells[j];
612
+ attrs.push(cell.attributes);
613
+ vals.push(cell.innerHTML);
614
+ }
615
+ loadedCells.push(attrs);
616
+ aData.push(vals);
617
+ }
618
+ json.rows = '';
619
+ json.data = aData;
620
+ return JSON.stringify(json);
621
+ }
622
+ },
623
+ createdRow: function (row, data, dataIndex) {
624
+ if(typeof(loadedRows[dataIndex]) != 'undefined') {
625
+ $(loadedRows[dataIndex]).each(function () {
626
+ $(row).attr(this.name, this.value);
627
+ });
628
+ }
629
+ }
630
+ }
631
+ if(typeof(config.aoColumnDefs) == 'undefined') {
632
+ config.aoColumnDefs = [];
633
+ }
634
+ config.aoColumnDefs.push({
635
+ targets: '_all',
636
+ cellType: 'td',
637
+ createdCell: function (td, cellData, rowData, row, col) {
638
+ if(typeof(loadedCells[row][col]) != 'undefined') {
639
+ var rowspan = 1,
640
+ colspan = 1;
641
+ $(loadedCells[row][col]).each(function () {
642
+ if (this.name == 'data-rowspan' && this.value > 1) {
643
+ rowspan = this.value;
644
+ }
645
+ if(this.name == 'data-colspan' && this.value > 1) {
646
+ colspan = this.value;
647
+ }
648
+ });
649
+ if(rowspan > 1 || colspan > 1) {
650
+ var stopRow = row + parseInt(rowspan),
651
+ stopCol = col + parseInt(colspan),
652
+ startRow = colspan > 1 ? row : row + 1,
653
+ hide;
654
+ if(stopRow >= loadedCells.length) {
655
+ stopRow = loadedCells.length;
656
+ }
657
+ if(stopCol >= loadedCells[row].length) {
658
+ stopCol = loadedCells[row].length;
659
+ }
660
+
661
+ for(i = startRow; i < stopRow; i++) {
662
+ if(i > row) {
663
+ hide = document.createAttribute('data-hide');
664
+ hide.value = 'true';
665
+ loadedCells[i][col].setNamedItem(hide);
666
+ }
667
+ for(j = col + 1; j < stopCol; j++) {
668
+ hide = document.createAttribute('data-hide');
669
+ hide.value = 'true';
670
+ loadedCells[i][j].setNamedItem(hide);
671
+ }
672
+ }
673
+ }
674
+ $(loadedCells[row][col]).each(function () {
675
+ if(this.name != 'data-formula') {
676
+ $(td).attr(this.name, this.value);
677
+ }
678
+ });
679
+ }
680
+ }
681
+ });
682
+ }
683
+
684
  $table.trigger('beforeInitializeTable', $table);
685
+ tableInstance = $table.dataTable($.extend({}, defaultFeatures, config, ajaxSource, reinit));
686
  tableInstance.table_id = $table.data('id');
687
  tableInstance.table_view_id = $table.data('view-id');
688
  tableInstance.fnFakeRowspan();
689
  self._checkOnClickPopups($table);
690
 
691
+ if(g_stbServerSideProcessing) {
692
+ $('.dataTables_processing').css('z-index', '10');
693
+ } else {
694
+ self.setColumnSearch($table);
695
+ }
696
+
697
  if(addInstance) {
698
  this.setTableInstance(tableInstance);
699
  }
739
 
740
  $(document).on('click', '.paginate_button', function () {
741
  setTimeout(function() {
742
+ _ruleJS.init();
743
  self.formatDataAtTable($table, true);
744
  }, 50);
745
  });
787
  self.setAllFields($table, $editableFields, $selectableFields);
788
  } else {
789
  self.createEditableFields($table, $editableFields);
790
+ }
791
+ if(typeof(self.setImgLightbox) == 'function'){
792
+ self.setImgLightbox($table);
793
  }
794
  $table.on('init.dt', function() {
795
  $table.on('responsive-resize.dt responsive-display.dt draw.dt', function() {
831
  }else{
832
  tBody.removeStyle('border-bottom');
833
  }
834
+ if(g_stbServerSideProcessing) {
835
+ self.getTableInstanceByViewId(viewId).fnAdjustColumnSizing(false);
836
+ }
837
  }).trigger('resize');
838
 
839
  // need resize twice to get better frontend view
916
  }
917
  }
918
 
919
+ if(g_stbServerSideProcessing) {
920
+ $table.on('draw.dt', function (e) {
921
+ var searching = $table.data('searching-settings');
922
+ if(searching && ('columnSearch' in searching) && searching.columnSearch == 'on') {
923
+ self.setColumnSearch($table);
924
+ }
925
+ self.getTableInstanceByViewId(viewId).fnFakeRowspan();
926
+ if(responsiveMode === 0 || responsiveMode === 2) {
927
+ $(window).trigger('resize');
928
+ }
929
+ }).trigger('draw.dt');
930
+ }
931
+
932
  function b64DecodeUnicode(str) {
933
  return decodeURIComponent(Array.prototype.map.call(atob(str), function(c) {
934
  return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
936
  }
937
  });
938
 
939
+ vendor[appName].setColumnSearch = (function(table) {
940
+ var dtable = $('#supsystic-table-' + table.data('id') + '[data-view-id="' + table.data('view-id') + '"]'),
941
+ tfoot = $('#supsystic-table-' + table.data('view-id')).find('div .dataTables_scrollFootInner table '),
942
+ inputs = (tfoot.length == 0 ? dtable.find('tfoot tr:last input') : tfoot.eq(0).find('tfoot tr:last input'));
943
+
944
+ if(inputs.length == 0) {
945
+ return;
946
+ }
947
+ dtable.DataTable().columns().every( function (colIdx) {
948
+ var that = this;
949
+ inputs.eq(colIdx).off('keyup.dtg change.dtg').on('keyup.dtg change.dtg', function () {
950
+ if ( that.search() !== this.value ) {
951
+ that
952
+ .search (this.value.replace(/;/g, "|"), true, false)
953
+ .draw ();
954
+ }
955
+ });
956
+ });
957
+ var div = $('#supsystic-table-' + table.data('view-id')),
958
+ leftTable = div.find('.DTFC_LeftBodyWrapper').find('table'),
959
+ rightTable = div.find('.DTFC_RightBodyWrapper').find('table'),
960
+ self = vendor[appName];
961
+
962
+ if(leftTable.length) {
963
+ var leftFoot = div.find('.DTFC_LeftFootWrapper').find('table'),
964
+ leftInputs = (leftFoot.length == 0 ? leftTable.find('tfoot tr:last input') : leftFoot.eq(0).find('tfoot tr:last input'));
965
+
966
+ leftInputs.each( function (colIdx) {
967
+ self.setCopyEvents(this, inputs.eq(colIdx).data('events'));
968
+ });
969
+ }
970
+ if(rightTable.length) {
971
+ var rightFoot = div.find('.DTFC_RightFootWrapper').find('table'),
972
+ rightInputs = (rightFoot.length == 0 ? rightTable.find('tfoot tr:last input') : rightFoot.eq(0).find('tfoot tr:last input')),
973
+ cntRight = rightInputs.length,
974
+ cntInputs = inputs.length;
975
+
976
+ rightInputs.each( function (colIdx) {
977
+ self.setCopyEvents(this, inputs.eq(cntInputs - cntRight + colIdx).data('events'));
978
+ });
979
+ }
980
+ });
981
+
982
+ vendor[appName].setCopyEvents = (function(obj, events) {
983
+ $.each(events, function (event, handlers) {
984
+ $.each(handlers, function (j, handler) {
985
+ $(obj).unbind(event).bind(event, handler);
986
+ });
987
+ });
988
+ });
989
+
990
  // Callback for executing script after table is initialized
991
  vendor[appName].executeScript = (function(table) {
992
  var $table = (table instanceof $ ? table : $(table)),
src/SupsysticTables/Promo/Module.php CHANGED
@@ -21,21 +21,19 @@ class SupsysticTables_Promo_Module extends SupsysticTables_Core_BaseModule
21
  }
22
 
23
  public function loadAdminPromoAssets() {
24
- $modulePath = untrailingslashit(plugin_dir_url(__FILE__));
25
-
26
  if (!get_user_meta(get_current_user_id(), 'supsystic-tables-tutorial_was_showed', true)) {
27
- wp_enqueue_script(
28
- 'supsystic-tables-step-tutorial',
29
- $modulePath . '/assets/js/tutorial.js',
30
- array('wp-pointer')
31
- );
32
-
33
  add_action('admin_enqueue_scripts', array($this, 'enqueueTutorialAssets'));
34
  }
35
  }
36
 
37
  public function enqueueTutorialAssets()
38
  {
 
 
 
 
 
 
39
  wp_enqueue_style('wp-pointer');
40
 
41
  $data = array(
21
  }
22
 
23
  public function loadAdminPromoAssets() {
 
 
24
  if (!get_user_meta(get_current_user_id(), 'supsystic-tables-tutorial_was_showed', true)) {
 
 
 
 
 
 
25
  add_action('admin_enqueue_scripts', array($this, 'enqueueTutorialAssets'));
26
  }
27
  }
28
 
29
  public function enqueueTutorialAssets()
30
  {
31
+ $modulePath = untrailingslashit(plugin_dir_url(__FILE__));
32
+ wp_enqueue_script(
33
+ 'supsystic-tables-step-tutorial',
34
+ $modulePath . '/assets/js/tutorial.js',
35
+ array('wp-pointer')
36
+ );
37
  wp_enqueue_style('wp-pointer');
38
 
39
  $data = array(
src/SupsysticTables/Tables/Controller.php CHANGED
@@ -118,6 +118,8 @@ class SupsysticTables_Tables_Controller extends SupsysticTables_Core_BaseControl
118
  $table->settings['features']['after_table_loaded_script'] = base64_decode($table->settings['features']['after_table_loaded_script']);
119
  }
120
 
 
 
121
  return $this->response(
122
  '@tables/view.twig',
123
  array(
@@ -127,6 +129,7 @@ class SupsysticTables_Tables_Controller extends SupsysticTables_Core_BaseControl
127
  'rows' => $request->query->get('rows', 5)
128
  ),
129
  'translations' => $languages->getTranslations(),
 
130
  )
131
  );
132
  }
@@ -152,6 +155,67 @@ class SupsysticTables_Tables_Controller extends SupsysticTables_Core_BaseControl
152
  return $this->ajaxSuccess();
153
  }
154
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
155
  /**
156
  * Returns the table columns.
157
  * @param Rsc_Http_Request $request
@@ -200,6 +264,27 @@ class SupsysticTables_Tables_Controller extends SupsysticTables_Core_BaseControl
200
  return $this->ajaxSuccess();
201
  }
202
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
203
  /**
204
  * Returns the table rows.
205
  * @param Rsc_Http_Request $request
@@ -210,12 +295,14 @@ class SupsysticTables_Tables_Controller extends SupsysticTables_Core_BaseControl
210
  /** @var SupsysticTables_Tables_Model_Tables $tables */
211
  $tables = $this->getModel('tables');
212
  $id = $request->post->get('id');
 
 
213
 
214
  try {
215
  $this->getEnvironment()->getModule('tables')->setIniLimits();
216
 
217
  return $this->ajaxSuccess(array(
218
- 'rows' => $tables->getRows($id)
219
  ));
220
  } catch (Exception $e) {
221
  return $this->ajaxError($e->getMessage());
@@ -356,9 +443,8 @@ class SupsysticTables_Tables_Controller extends SupsysticTables_Core_BaseControl
356
  /** @var SupsysticTables_Tables_Model_Tables $tables */
357
  $tables = $this->getModel('tables');
358
  $this->getEnvironment()->getModule('tables')->setIniLimits();
359
- $table = $tables->getById($id);
360
 
361
- return $this->ajaxSuccess(array('meta' => $table->meta));
362
  }
363
 
364
  /**
@@ -420,6 +506,7 @@ class SupsysticTables_Tables_Controller extends SupsysticTables_Core_BaseControl
420
  $title = $request->post->get('title');
421
  $tableModel = $this->getModel('tables');
422
  $clonedTable = $tableModel->getById($id);
 
423
 
424
  try {
425
  if (!$this->isValidTitle($title)) {
118
  $table->settings['features']['after_table_loaded_script'] = base64_decode($table->settings['features']['after_table_loaded_script']);
119
  }
120
 
121
+ $settings = get_option($this->getConfig()->get('db_prefix') . 'settings');
122
+
123
  return $this->response(
124
  '@tables/view.twig',
125
  array(
129
  'rows' => $request->query->get('rows', 5)
130
  ),
131
  'translations' => $languages->getTranslations(),
132
+ 'settings' => $settings
133
  )
134
  );
135
  }
155
  return $this->ajaxSuccess();
156
  }
157
 
158
+ /**
159
+ * Get Data for AJAX paging.
160
+ * @param Rsc_Http_Request $request
161
+ * @return Rsc_Http_Response
162
+ */
163
+ public function getPageRowsAction(Rsc_Http_Request $request)
164
+ {
165
+
166
+ $id = (int)$request->post->get('id');
167
+ $tables = $this->getModel('tables');
168
+
169
+ try {
170
+ $this->getEnvironment()->getModule('tables')->setIniLimits();
171
+
172
+ $start = $request->post->get('start');
173
+ $length = $request->post->get('length');
174
+ $searchAll = $request->post->get('search');
175
+ $columns = $request->post->get('columns');
176
+ $searchParams = $request->post->get('searchParams');
177
+ $searchValue = $request->post->get('searchValue');
178
+ if (isset($searchValue) && $searchValue != '') {
179
+ $searchAll['value'] = $searchValue;
180
+ }
181
+
182
+ $searchCols = array();
183
+ foreach ($columns as $j => $column) {
184
+ if (isset($column['search']) && isset($column['search']['value'])) {
185
+ $search = $column['search']['value'];
186
+ if($search != '') {
187
+ $list = explode('|', $search);
188
+ if (!in_array('', $list)) {
189
+ $searchCols[$j] = $list;
190
+ }
191
+ }
192
+ }
193
+ }
194
+ $order = $request->post->get('order');
195
+ $orderCol = (isset($order[0]) && isset($order[0]['column']) ? $order[0]['column'] : false);
196
+ $orderAsc = (isset($order[0]) && isset($order[0]['dir']) && $order[0]['dir'] == 'asc');
197
+ $header = (int)$request->post->get('header');
198
+ $footer = (int)$request->post->get('footer');
199
+
200
+ $rows = $tables->getRowsByPart($id, ($searchAll['value'] == '' ? false : $searchAll['value']), $searchCols, $orderCol, $orderAsc, $start, $length, $header, $footer, $searchParams);
201
+
202
+ $table = $tables->getById($id);
203
+ $table->rows = $rows['data'];
204
+
205
+ $module = $this->getEnvironment()->getModule('tables');
206
+ $module->setIniLimits();
207
+ $module->setDataForPage($table);
208
+
209
+ return $this->ajaxSuccess(array('draw' => $request->post->get('draw'),
210
+ 'recordsTotal' => $rows['recordsTotal'],
211
+ 'recordsFiltered' => $rows['recordsFiltered'],
212
+ 'rows' => $module->render($id)));
213
+
214
+ } catch (Exception $e) {
215
+ return $this->ajaxError($e->getMessage());
216
+ }
217
+ }
218
+
219
  /**
220
  * Returns the table columns.
221
  * @param Rsc_Http_Request $request
264
  return $this->ajaxSuccess();
265
  }
266
 
267
+ /**
268
+ * Returns count of table rows.
269
+ * @param Rsc_Http_Request $request
270
+ * @return Rsc_Http_Response
271
+ */
272
+ public function getCountRowsAction(Rsc_Http_Request $request)
273
+ {
274
+ $tables = $this->getModel('tables');
275
+ $id = $request->post->get('id');
276
+
277
+ try {
278
+ $this->getEnvironment()->getModule('tables')->setIniLimits();
279
+
280
+ return $this->ajaxSuccess(array(
281
+ 'countRows' => $tables->getCountRows($id)
282
+ ));
283
+ } catch (Exception $e) {
284
+ return $this->ajaxError($e->getMessage());
285
+ }
286
+ }
287
+
288
  /**
289
  * Returns the table rows.
290
  * @param Rsc_Http_Request $request
295
  /** @var SupsysticTables_Tables_Model_Tables $tables */
296
  $tables = $this->getModel('tables');
297
  $id = $request->post->get('id');
298
+ $limit = $request->post->get('limit');
299
+ $offset = $request->post->get('offset');
300
 
301
  try {
302
  $this->getEnvironment()->getModule('tables')->setIniLimits();
303
 
304
  return $this->ajaxSuccess(array(
305
+ 'rows' => $tables->getRows($id, isset($limit) ? $limit : 0, 'ASC', isset($offset) ? $offset : 0)
306
  ));
307
  } catch (Exception $e) {
308
  return $this->ajaxError($e->getMessage());
443
  /** @var SupsysticTables_Tables_Model_Tables $tables */
444
  $tables = $this->getModel('tables');
445
  $this->getEnvironment()->getModule('tables')->setIniLimits();
 
446
 
447
+ return $this->ajaxSuccess(array('meta' => $tables->getMeta($id)));
448
  }
449
 
450
  /**
506
  $title = $request->post->get('title');
507
  $tableModel = $this->getModel('tables');
508
  $clonedTable = $tableModel->getById($id);
509
+ $clonedTable->rows = $tableModel->getRows($id);
510
 
511
  try {
512
  if (!$this->isValidTitle($title)) {
src/SupsysticTables/Tables/Model/Tables.php CHANGED
@@ -289,15 +289,22 @@ class SupsysticTables_Tables_Model_Tables extends SupsysticTables_Core_BaseModel
289
  /**
290
  * Returns all table rows
291
  * @param int $id Table id
 
 
 
292
  * @return array
293
  */
294
- public function getRows($id)
295
  {
296
  $query = $this->getQueryBuilder()
297
  ->select($this->getField('rows', 'data'))
298
  ->from($this->getTable('rows'))
299
  ->where('table_id', '=', (int)$id)
300
  ->orderBy($this->getField('rows', 'id'));
 
 
 
 
301
 
302
  $rows = $this->db->get_results($query->build());
303
 
@@ -319,6 +326,218 @@ class SupsysticTables_Tables_Model_Tables extends SupsysticTables_Core_BaseModel
319
  return $rows;
320
  }
321
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
322
  /**
323
  * Sets the part of rows for the table
324
  * @param int $id Table id
@@ -378,6 +597,61 @@ class SupsysticTables_Tables_Model_Tables extends SupsysticTables_Core_BaseModel
378
  }
379
  }
380
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
381
  /**
382
  * Sets the rows for the table
383
  * @param int $id Table id
@@ -404,6 +678,26 @@ class SupsysticTables_Tables_Model_Tables extends SupsysticTables_Core_BaseModel
404
  }
405
  }
406
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
407
  /**
408
  * Removes all table rows.
409
  * @param int $id Table id
@@ -445,8 +739,6 @@ class SupsysticTables_Tables_Model_Tables extends SupsysticTables_Core_BaseModel
445
  */
446
  public function onTablesGet($table)
447
  {
448
- // This method load twice all rows in backend second call go via ajax.
449
- // Need to fix.
450
  if (null === $table) {
451
  return $table;
452
  }
@@ -454,14 +746,6 @@ class SupsysticTables_Tables_Model_Tables extends SupsysticTables_Core_BaseModel
454
  $table->view_id = $table->id . '_' . mt_rand(1, 99999);
455
  $table->columns = $this->getColumns($table->id);
456
  $table->settings = unserialize(htmlspecialchars_decode($table->settings, ENT_QUOTES));
457
- $source = ($this->environment->isPro() && isset($table->settings['source']) ? $table->settings['source'] : '');
458
- if(isset($source['database']) && $source['database'] == 'on' && isset($source['dbTable'])){
459
- $core = $this->environment->getModule('core');
460
- $dbTableModel = $core->getModelsFactory()->get('DBTables', 'tables');
461
- $table->rows = $dbTableModel->getRows($source['dbTable'], isset($source['dbFields']) ? $source['dbFields'] : array());
462
- } else {
463
- $table->rows = $this->getRows($table->id);
464
- }
465
 
466
  // rev 41
467
  if (property_exists($table, 'meta')) {
@@ -563,6 +847,26 @@ class SupsysticTables_Tables_Model_Tables extends SupsysticTables_Core_BaseModel
563
  return $result;
564
  }
565
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
566
  /**
567
  * @param $tableIds
568
  *
@@ -589,7 +893,7 @@ class SupsysticTables_Tables_Model_Tables extends SupsysticTables_Core_BaseModel
589
  if(preg_match_all('|\[supsystic-tables\s+id=[\'"]?(\d+)[\'"]?\s*?\]|',$content,$matches)) {
590
  array_shift( $matches );
591
  foreach($matches[0] as $matchedTableId) {
592
- if (in_array( $matchedTableId, array_keys($tableIds))) {
593
  $postIds[ $parsingPost->ID ]['tables'][] = $matchedTableId;
594
  }
595
  }
@@ -606,25 +910,34 @@ class SupsysticTables_Tables_Model_Tables extends SupsysticTables_Core_BaseModel
606
  */
607
  public function getTableIdsBySearchTokens($tokens)
608
  {
609
- $tableIds = array();
610
- $query = $this->getQueryBuilder()
611
- ->select('id')
612
- ->from($this->db->prefix . 'supsystic_tbl_tables')
613
- ->orderBy('id')
614
- ->order('ASC');
615
- $allTables = $this->db->get_results($query->build());
 
 
 
 
 
 
616
 
617
- if($this->db->last_error) {
618
- throw new RuntimeException( $this->db->last_error );
 
 
 
 
 
 
619
  }
620
- if(!empty($allTables)){
621
- foreach($allTables as $table) {
622
- $tableRows = $this->getRowsLike($table->id, $tokens);
623
 
624
- foreach($tableRows as $row) {
625
- $tableIds[$row->table_id] = !empty($tableIds[$row->table_id]) ? $tableIds[$row->table_id] : array();
626
- array_push($tableIds[$row->table_id], $row->id);
627
- }
628
  }
629
  }
630
  return $tableIds;
289
  /**
290
  * Returns all table rows
291
  * @param int $id Table id
292
+ * @param int $limit limit
293
+ * @param bool $asc
294
+ * @param int $offset offset
295
  * @return array
296
  */
297
+ public function getRows($id, $limit = 0, $asc = true, $offset = 0)
298
  {
299
  $query = $this->getQueryBuilder()
300
  ->select($this->getField('rows', 'data'))
301
  ->from($this->getTable('rows'))
302
  ->where('table_id', '=', (int)$id)
303
  ->orderBy($this->getField('rows', 'id'));
304
+
305
+ if ($limit != 0){
306
+ $query->order($asc ? 'ASC' : 'DESC')->limit((int)$limit)->offset((int)$offset);
307
+ }
308
 
309
  $rows = $this->db->get_results($query->build());
310
 
326
  return $rows;
327
  }
328
 
329
+ /**
330
+ * Returns table rows with Id
331
+ * @return array
332
+ */
333
+ public function getRowsWithId($id, $limit = 0, $asc = true, $offset = 0, $raw = false)
334
+ {
335
+ $query = $this->getQueryBuilder()
336
+ ->select('id, data')
337
+ ->from($this->getTable('rows'))
338
+ ->where('table_id', '=', (int)$id);
339
+
340
+ if ($limit != 0){
341
+ $query->order($asc ? 'ASC' : 'DESC')->limit((int)$limit)->offset((int)$offset);
342
+ }
343
+ $result = $this->db->get_results($query->build());
344
+
345
+ if ($this->db->last_error) {
346
+ throw new RuntimeException($this->db->last_error);
347
+ }
348
+
349
+ $rows = array();
350
+ if (count($result) > 0) {
351
+ foreach ($result as $index => $row) {
352
+ $rows[$row->id] = @unserialize($row->data);
353
+ }
354
+ }
355
+ if (!$raw) {
356
+ foreach ($rows as &$row) {
357
+ $row = $this->prepareRowsData($row, false);
358
+ }
359
+ }
360
+
361
+ return $rows;
362
+ }
363
+
364
+ /**
365
+ * Returns needed table rows
366
+ * @return array
367
+ */
368
+ public function getNeededRows($id, &$settings, $isSSP, $all = false)
369
+ {
370
+ $source = ($this->environment->isPro() && isset($settings['source']) ? $settings['source'] : '');
371
+
372
+ if (isset($source['database']) && $source['database'] == 'on' && isset($source['dbTable'])){
373
+ $core = $this->environment->getModule('core');
374
+ $dbTableModel = $core->getModelsFactory()->get('DBTables', 'tables');
375
+ return $dbTableModel->getRowsData($settings);
376
+ }
377
+ if (!$all && $isSSP) {
378
+ $cntHead = 1;
379
+ $footers = array();
380
+ if (isset($settings['elements']['head']) && $settings['elements']['head'] == 'on' &&
381
+ isset($settings['headerRowsCount']) && $settings['headerRowsCount'] > 0) {
382
+ $cntHead = $this->getRows($id, $settings['headerRowsCount']);
383
+ }
384
+ $headers = $this->getRows($id, $cntHead);
385
+ if (isset($settings['elements']['foot']) && $settings['elements']['foot'] == 'on' &&
386
+ isset($settings['customFooter']) && $settings['customFooter'] == 'on' &&
387
+ isset($settings['footerRowsCount']) && $settings['footerRowsCount'] > 0) {
388
+ $footers = $this->getRows($id, $settings['footerRowsCount'], false);
389
+ }
390
+ return array_merge($headers, $footers);
391
+ }
392
+ return $this->getRows($id);
393
+ }
394
+
395
+ /**
396
+ * Returns count table rows
397
+ * @return int
398
+ */
399
+ public function getCountRows($id)
400
+ {
401
+ $query = $this->getQueryBuilder()
402
+ ->select('count(*)')
403
+ ->from($this->getTable('rows'))
404
+ ->where('table_id', '=', (int)$id);
405
+
406
+ $count = $this->db->get_row($query->build(), ARRAY_N);
407
+
408
+ if ($this->db->last_error) {
409
+ throw new RuntimeException($this->db->last_error);
410
+ }
411
+
412
+ return $count[0];
413
+ }
414
+
415
+ /**
416
+ * Calc rows for AJAX page
417
+ * @return array
418
+ */
419
+ public function getRowsByPart($id, $searchAll, $searchCols, $orderCol, $orderAsc, $start, $length, $header, $footer, $searchParams)
420
+ {
421
+ $sort = $orderCol !== false;
422
+ $sorter = array();
423
+ $search = (sizeof($searchCols) > 0 || $searchAll !== false);
424
+ $isWord = (isset($searchParams['strictMatching']) && ($searchParams['strictMatching'] == 'on'));
425
+ if ($isWord) {
426
+ $searchAll = '~\b'.$searchAll.'~i';
427
+ }
428
+
429
+ $rawData = (!$sort && !$search);
430
+
431
+ $recordsTotal = $this->getCountRows($id);
432
+ $bodyStart = $header;
433
+ $bodyStop = $recordsTotal - $footer - 1;
434
+ $recordsTotal = $recordsTotal - $header - $footer;
435
+
436
+ $query = $this->getQueryBuilder()
437
+ ->select('id, data')
438
+ ->from($this->getTable('rows'))
439
+ ->where('table_id', '=', (int)$id)
440
+ ->orderBy($this->getField('rows', 'id'));
441
+
442
+ if ($rawData) {
443
+ $recordsFiltered = $recordsTotal;
444
+ $offset = $header + $start;
445
+ $limit = ($offset + $length - 1 > $bodyStop ? $bodyStop - $offset + 1: $length);
446
+ $query->limit($limit)->offset($offset);
447
+ } else {
448
+ $offset = $bodyStart;
449
+ $limit = 1000;
450
+ $query->limit($limit);
451
+ do {
452
+ $query->offset($offset);
453
+ $rows = $this->db->get_results($query->build());
454
+ if($this->db->last_error) {
455
+ throw new RuntimeException($this->db->last_error);
456
+ }
457
+
458
+ foreach ($rows as $i => $row) {
459
+ $values = $this->prepareRowsData(@unserialize($row->data), false);
460
+ $cells = $values['cells'];
461
+ $filterCols = true;
462
+ foreach ($searchCols as $j => $s) {
463
+ if (!$this->searchInValue($cells[$j]['data'], $s)) {
464
+ $filterCols = false;
465
+ break;
466
+ }
467
+ }
468
+ if (!$filterCols) continue;
469
+
470
+ $filterAll = $searchAll === false;
471
+ if (!$filterAll) {
472
+ foreach ($cells as $j => $cell) {
473
+ $filterAll = ($isWord ? preg_match($searchAll, $cell['data']) == 1 : stripos($cell['data'], $searchAll) !== false);
474
+ if ($filterAll) break;
475
+ }
476
+ }
477
+ if ($filterAll) {
478
+ $sorter[$row->id] = $cells[$orderCol]['data'];
479
+ }
480
+ }
481
+ unset($rows);
482
+ $offset += $limit;
483
+ } while ($offset < $bodyStop);
484
+
485
+ $recordsFiltered = count($sorter);
486
+ if ($sort) {
487
+ if ($orderAsc) {
488
+ asort($sorter);
489
+ } else {
490
+ arsort($sorter);
491
+ }
492
+ }
493
+ if ($start > 0 || $length > 0) {
494
+ $sorter = array_slice($sorter, $start, $length, true);
495
+ }
496
+ $list = '0,';
497
+ $num = 0;
498
+ foreach ($sorter as $i => $v) {
499
+ $list .= $i.',';
500
+ $sorter[$i] = $num;
501
+ $num++;
502
+ }
503
+
504
+ $query = $this->getQueryBuilder()
505
+ ->select('id, data')
506
+ ->from($this->getTable('rows'))
507
+ ->where('table_id', '=', (int)$id)
508
+ ->andWhere('id', 'IN', substr($list, 0, -1));
509
+ }
510
+
511
+ $rows = $this->db->get_results($query->build());
512
+ if ($this->db->last_error) {
513
+ throw new RuntimeException($this->db->last_error);
514
+ }
515
+
516
+ $num = 0;
517
+ $data = array();
518
+ foreach ($rows as $i => $row) {
519
+ $values = $this->prepareRowsData(@unserialize($row->data), false);
520
+
521
+ $rowId = $row->id;
522
+ $n = ($sort ? $sorter[$rowId] : $num++);
523
+ $data[$n] = $values;
524
+ }
525
+
526
+ if ($sort) {
527
+ ksort($data);
528
+ }
529
+ return array('data' => $data, 'recordsTotal' => $recordsTotal, 'recordsFiltered' => $recordsFiltered);
530
+ }
531
+ private function searchInValue($value, $searchs)
532
+ {
533
+ foreach($searchs as $i => $search) {
534
+ if(stripos($value, $search) !== false) {
535
+ return true;
536
+ }
537
+ }
538
+ return false;
539
+ }
540
+
541
  /**
542
  * Sets the part of rows for the table
543
  * @param int $id Table id
597
  }
598
  }
599
 
600
+ public function removeLastRows($id, $count)
601
+ {
602
+ if ($count <= 0) return;
603
+
604
+ $query = $this->getQueryBuilder()
605
+ ->select('MAX(' . $this->getField('rows', 'id') . ') as max')
606
+ ->from($this->getTable('rows'))
607
+ ->where($this->getField('rows', 'table_id'), '=', (int)$id);
608
+
609
+ $lastRowId = $this->db->get_row($query->build(), ARRAY_N);
610
+
611
+ $query = $this->getQueryBuilder()
612
+ ->deleteFrom($this->getTable('rows'))
613
+ ->where($this->getField('rows', 'table_id'), '=', (int)$id)
614
+ ->andWhere($this->getField('rows', 'id'), '>', (int)($lastRowId[0] - $count));
615
+
616
+ $this->db->query($query->build());
617
+
618
+ if ($this->db->last_error) {
619
+ throw new RuntimeException($this->db->last_error);
620
+ }
621
+ }
622
+
623
+ public function removeLastColumns($id, $from)
624
+ {
625
+ if ($from <= 0) return;
626
+
627
+ $totalRows = $this->getCountRows($id);
628
+
629
+ $query = $this->getQueryBuilder()
630
+ ->select('id, data')
631
+ ->from($this->getTable('rows'))
632
+ ->where('table_id', '=', (int)$id)
633
+ ->orderBy($this->getField('rows', 'id'));
634
+
635
+ $limit = 400;
636
+ $offset = 0;
637
+ do {
638
+ $query->limit($limit)->offset($offset);
639
+ $rows = $this->db->get_results($query->build());
640
+
641
+ if ($this->db->last_error) {
642
+ throw new RuntimeException($this->db->last_error);
643
+ }
644
+
645
+ foreach ($rows as $i => $row) {
646
+ $values = @unserialize($row->data);
647
+ array_splice($values['cells'], $from);
648
+ updateRow($row->id, $values);
649
+ }
650
+ unset($rows);
651
+ $offset += $limit;
652
+ } while ($offset < $totalRows);
653
+ }
654
+
655
  /**
656
  * Sets the rows for the table
657
  * @param int $id Table id
678
  }
679
  }
680
 
681
+ /**
682
+ * Update the rows by id
683
+ */
684
+ public function updateRow($id, $data, $raw = false)
685
+ {
686
+ if($raw) {
687
+ $data = $this->prepareRowsData($data);
688
+ }
689
+ $update = $this->getQueryBuilder()
690
+ ->update($this->getTable('rows'))
691
+ ->where('id', '=', (int)$id)
692
+ ->set(array('data' => serialize($data)));
693
+
694
+ $this->db->query($update->build());
695
+ if ($this->db->last_error) {
696
+ throw new RuntimeException($this->db->last_error);
697
+ }
698
+ }
699
+
700
+
701
  /**
702
  * Removes all table rows.
703
  * @param int $id Table id
739
  */
740
  public function onTablesGet($table)
741
  {
 
 
742
  if (null === $table) {
743
  return $table;
744
  }
746
  $table->view_id = $table->id . '_' . mt_rand(1, 99999);
747
  $table->columns = $this->getColumns($table->id);
748
  $table->settings = unserialize(htmlspecialchars_decode($table->settings, ENT_QUOTES));
 
 
 
 
 
 
 
 
749
 
750
  // rev 41
751
  if (property_exists($table, 'meta')) {
847
  return $result;
848
  }
849
 
850
+ public function getMeta($id)
851
+ {
852
+ $query = $this->getQueryBuilder()
853
+ ->select($this->getField('tables', 'meta'))
854
+ ->from($this->getTable('tables'))
855
+ ->where('id', '=', (int)$id);
856
+
857
+ $result = $this->db->get_results($query->build());
858
+
859
+ if ($this->db->last_error) {
860
+ throw new RuntimeException($this->db->last_error);
861
+ }
862
+ if (!empty($result)) {
863
+ $result = $result[0]->meta;
864
+ $result = unserialize(htmlspecialchars_decode($result, ENT_QUOTES));
865
+ }
866
+
867
+ return $result;
868
+ }
869
+
870
  /**
871
  * @param $tableIds
872
  *
893
  if(preg_match_all('|\[supsystic-tables\s+id=[\'"]?(\d+)[\'"]?\s*?\]|',$content,$matches)) {
894
  array_shift( $matches );
895
  foreach($matches[0] as $matchedTableId) {
896
+ if (in_array( $matchedTableId, $tableIds)) {
897
  $postIds[ $parsingPost->ID ]['tables'][] = $matchedTableId;
898
  }
899
  }
910
  */
911
  public function getTableIdsBySearchTokens($tokens)
912
  {
913
+ $tempIds = array();
914
+ $step = 0;
915
+ foreach($tokens as $token) {
916
+ $step++;
917
+ $query = $this->getQueryBuilder()
918
+ ->select('DISTINCT table_id')
919
+ ->from($this->getTable('rows'))
920
+ ->where('data', 'LIKE', "%{$token}%");
921
+ $tables = $this->db->get_results($query->build());
922
+
923
+ if($this->db->last_error) {
924
+ throw new RuntimeException( $this->db->last_error );
925
+ }
926
 
927
+ foreach($tables as $table) {
928
+ $id = $table->table_id;
929
+ if($step == 1) {
930
+ $tempIds[$id] = 1;
931
+ } elseif(isset($tempIds[$id])) {
932
+ $tempIds[$id]++;
933
+ }
934
+ }
935
  }
 
 
 
936
 
937
+ $tableIds = array();
938
+ foreach($tempIds as $id => $flag) {
939
+ if($flag == $step) {
940
+ array_push($tableIds, $id);
941
  }
942
  }
943
  return $tableIds;
src/SupsysticTables/Tables/Module.php CHANGED
@@ -124,6 +124,12 @@ class SupsysticTables_Tables_Module extends SupsysticTables_Core_BaseModule
124
  return '';
125
  }
126
 
 
 
 
 
 
 
127
  public function getDataTablesObj() {
128
  if(empty($this->_tablesObj)) {
129
  $core = $this->getEnvironment()->getModule('core'); // @var SupsysticTables_Core_Module $core
@@ -150,15 +156,13 @@ class SupsysticTables_Tables_Module extends SupsysticTables_Core_BaseModule
150
  $settings = get_option('supsystic_tbl_settings');
151
 
152
  if (!empty($settings['table_search'])) {
153
- add_filter('posts_where' , array($this, 'globalTablesSearchFilter'));
154
  }
155
  }
156
  }
157
 
158
- public function globalTablesSearchFilter($where) {
159
- global $wpdb;
160
-
161
- if(is_main_query() && is_search()) {
162
  $search_query = trim(get_search_query());
163
 
164
  if(!empty($search_query)) {
@@ -173,15 +177,18 @@ class SupsysticTables_Tables_Module extends SupsysticTables_Core_BaseModule
173
  $postIds = $tables->getPostIdsByTableIds($tableIds);
174
 
175
  if(!empty($postIds)) {
 
176
  $idsStr = implode(',',array_keys($postIds));
177
 
178
  $exact = get_query_var( 'exact' );
179
  $n = ( empty( $exact ) ) ? '%' : '';
180
  $where = $wpdb->remove_placeholder_escape( $where );
181
-
182
- $old_or = "OR ({$wpdb->posts}.post_content LIKE '{$n}{$tokens[0]}{$n}')";
183
- $new_or = $old_or . " OR {$wpdb->posts}.ID IN ({$idsStr}) ";
184
- $where = str_replace( $old_or, $new_or, $where );
 
 
185
 
186
  $where = $wpdb->add_placeholder_escape( $where );
187
  }
@@ -220,16 +227,25 @@ class SupsysticTables_Tables_Module extends SupsysticTables_Core_BaseModule
220
  }
221
  }
222
  $table = $table ? $table : $tables->getById($id);
223
-
224
  if (!$table) {
225
  return sprintf($environment->translate('The table with ID %d not exists.'), $id);
226
  }
227
- $this->checkSpreadsheet = $this->checkSpreadsheet
 
 
 
 
 
 
 
 
228
  && $environment->isPro()
229
  && isset($table->settings['features']['import']['google']['automatically_update'])
230
  && isset($table->settings['features']['import']['google']['link']);
231
 
232
- if (!isset($table->settings['disableCache']) && !$this->isSingleCell && !$this->isTablePart && !$this->checkSpreadsheet && !$this->isFromHistory && file_exists($cachePath) && $this->getEnvironment()->isProd()) {
 
233
  // Connect scripts and styles depending on table settings and table's cells settings for table cache
234
  $dispatcher = $this->getEnvironment()->getDispatcher();
235
  $dispatcher->apply('before_table_render', array($table));
@@ -243,19 +259,25 @@ class SupsysticTables_Tables_Module extends SupsysticTables_Core_BaseModule
243
  return $e->getMessage();
244
  }
245
  // We need to get the new rows' data from db
246
- $table = $tables->getById($id);
247
  }
248
- if (isset($table->meta['columnsWidth'])) {
249
- $columnsTotalWidth = array_sum($table->meta['columnsWidth']);
 
 
 
250
 
251
- if($columnsTotalWidth) {
252
- foreach ($table->meta['columnsWidth'] as &$value) {
253
- $value = round($value / $columnsTotalWidth * 100, 4);
 
254
  }
255
  }
256
  }
257
 
258
- $lightbox = ($environment->isPro() && isset($table->settings['styling']['lightboxImg']) && $table->settings['styling']['lightboxImg'] == 'on');
 
 
259
  if($this->isSingleCell) {
260
  // Unset unneeded elements and features
261
  unset($table->settings['elements']['head']);
@@ -327,17 +349,11 @@ class SupsysticTables_Tables_Module extends SupsysticTables_Core_BaseModule
327
  $table->rows[$key]['cells'][$index]['calculatedValue'] = $this->isFromHistory[$key]['cells'][$index]['calculatedValue'];
328
  }
329
  }
330
- // add href for Lightbox
331
- if($lightbox && substr($cell['data'], 0, 10) == '<img src="'){
332
- $endHref = strpos($cell['data'], '"', 15);
333
- if($endHref > 0) {
334
- $table->rows[$key]['cells'][$index]['imgHref'] = substr($cell['data'], 10, $endHref - 10);
335
- }
336
- }
337
  $table->rows[$key]['cells'][$index]['data'] = do_shortcode($table->rows[$key]['cells'][$index]['data']);
338
  }
339
  }
340
  }
 
341
  $table->history = (bool) $this->isFromHistory;
342
  $table->history_data = $this->historyData;
343
  $table->encoded_title = htmlspecialchars($table->title, ENT_QUOTES);
@@ -362,6 +378,40 @@ class SupsysticTables_Tables_Module extends SupsysticTables_Core_BaseModule
362
  return $renderData;
363
  }
364
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
365
  /**
366
  * Renders the value of single cell
367
  * @param int $tableId
@@ -1034,7 +1084,7 @@ class SupsysticTables_Tables_Module extends SupsysticTables_Core_BaseModule
1034
  }
1035
 
1036
  public function getFontsList() {
1037
- return array("ABeeZee","Abel","Abril Fatface","Aclonica","Acme","Actor","Adamina","Advent Pro","Aguafina Script","Akronim","Aladin","Aldrich","Alef","Alegreya","Alegreya SC","Alegreya Sans","Alegreya Sans SC","Alex Brush","Alfa Slab One","Alice","Alike","Alike Angular","Allan","Allerta","Allerta Stencil","Allura","Almendra","Almendra Display","Almendra SC","Amarante","Amaranth","Amatic SC","Amethysta","Amiri","Anaheim","Andada","Andika","Angkor","Annie Use Your Telescope","Anonymous Pro","Antic","Antic Didone","Antic Slab","Anton","Arapey","Arbutus","Arbutus Slab","Architects Daughter","Archivo Black","Archivo Narrow","Arimo","Arizonia","Armata","Artifika","Arvo","Asap","Asset","Astloch","Asul","Atomic Age","Aubrey","Audiowide","Autour One","Average","Average Sans","Averia Gruesa Libre","Averia Libre","Averia Sans Libre","Averia Serif Libre","Bad Script","Balthazar","Bangers","Basic","Battambang","Baumans","Bayon","Belgrano","Belleza","BenchNine","Bentham","Berkshire Swash","Bevan","Bigelow Rules","Bigshot One","Bilbo","Bilbo Swash Caps","Biryani","Bitter","Black Ops One","Bokor","Bonbon","Boogaloo","Bowlby One","Bowlby One SC","Brawler","Bree Serif","Bubblegum Sans","Bubbler One","Buda","Buenard","Butcherman","Butterfly Kids","Cabin","Cabin Condensed","Cabin Sketch","Caesar Dressing","Cagliostro","Calibri","Calligraffitti","Cambay","Cambo","Candal","Cantarell","Cantata One","Cantora One","Capriola","Cardo","Carme","Carrois Gothic","Carrois Gothic SC","Carter One","Caudex","Cedarville Cursive","Ceviche One","Changa One","Chango","Chau Philomene One","Chela One","Chelsea Market","Chenla","Cherry Cream Soda","Cherry Swash","Chewy","Chicle","Chivo","Cinzel","Cinzel Decorative","Clicker Script","Coda","Coda Caption","Codystar","Combo","Comfortaa","Coming Soon","Concert One","Condiment","Content","Contrail One","Convergence","Cookie","Copse","Corben","Courgette","Cousine","Coustard","Covered By Your Grace","Crafty Girls","Creepster","Crete Round","Crimson Text","Croissant One","Crushed","Cuprum","Cutive","Cutive Mono","Damion","Dancing Script","Dangrek","Dawning of a New Day","Days One","Dekko","Delius","Delius Swash Caps","Delius Unicase","Della Respira","Denk One","Devonshire","Dhurjati","Didact Gothic","Diplomata","Diplomata SC","Domine","Donegal One","Doppio One","Dorsa","Dosis","Dr Sugiyama","Droid Sans","Droid Sans Mono","Droid Serif","Duru Sans","Dynalight","EB Garamond","Eagle Lake","Eater","Economica","Ek Mukta","Electrolize","Elsie","Elsie Swash Caps","Emblema One","Emilys Candy","Engagement","Englebert","Enriqueta","Erica One","Esteban","Euphoria Script","Ewert","Exo","Exo 2","Expletus Sans","Fanwood Text","Fascinate","Fascinate Inline","Faster One","Fasthand","Fauna One","Federant","Federo","Felipa","Fenix","Finger Paint","Fira Mono","Fira Sans","Fjalla One","Fjord One","Flamenco","Flavors","Fondamento","Fontdiner Swanky","Forum","Francois One","Freckle Face","Fredericka the Great","Fredoka One","Freehand","Fresca","Frijole","Fruktur","Fugaz One","GFS Didot","GFS Neohellenic","Gabriela","Gafata","Galdeano","Galindo","Gentium Basic","Gentium Book Basic","Geo","Geostar","Geostar Fill","Germania One","Gidugu","Gilda Display","Give You Glory","Glass Antiqua","Glegoo","Gloria Hallelujah","Goblin One","Gochi Hand","Gorditas","Goudy Bookletter 1911","Graduate","Grand Hotel","Gravitas One","Great Vibes","Griffy","Gruppo","Gudea","Gurajada","Habibi","Halant","Hammersmith One","Hanalei","Hanalei Fill","Handlee","Hanuman","Happy Monkey","Headland One","Henny Penny","Herr Von Muellerhoff","Hind","Holtwood One SC","Homemade Apple","Homenaje","IM Fell DW Pica","IM Fell DW Pica SC","IM Fell Double Pica","IM Fell Double Pica SC","IM Fell English","IM Fell English SC","IM Fell French Canon","IM Fell French Canon SC","IM Fell Great Primer","IM Fell Great Primer SC","Iceberg","Iceland","Imprima","Inconsolata","Inder","Indie Flower","Inika","Irish Grover","Istok Web","Italiana","Italianno","Jacques Francois","Jacques Francois Shadow","Jaldi","Jim Nightshade","Jockey One","Jolly Lodger","Josefin Sans","Josefin Slab","Joti One","Judson","Julee","Julius Sans One","Junge","Jura","Just Another Hand","Just Me Again Down Here","Kalam","Kameron","Kantumruy","Karla","Karma","Kaushan Script","Kavoon","Kdam Thmor","Keania One","Kelly Slab","Kenia","Khand","Khmer","Khula","Kite One","Knewave","Kotta One","Koulen","Kranky","Kreon","Kristi","Krona One","Kurale","La Belle Aurore","Laila","Lakki Reddy","Lancelot","Lateef","Lato","League Script","Leckerli One","Ledger","Lekton","Lemon","Libre Baskerville","Life Savers","Lilita One","Lily Script One","Limelight","Linden Hill","Lobster","Lobster Two","Londrina Outline","Londrina Shadow","Londrina Sketch","Londrina Solid","Lora","Love Ya Like A Sister","Loved by the King","Lovers Quarrel","Luckiest Guy","Lusitana","Lustria","Macondo","Macondo Swash Caps","Magra","Maiden Orange","Mako","Mallanna","Mandali","Marcellus","Marcellus SC","Marck Script","Margarine","Marko One","Marmelad","Martel","Martel Sans","Marvel","Mate","Mate SC","Maven Pro","McLaren","Meddon","MedievalSharp","Medula One","Megrim","Meie Script","Merienda","Merienda One","Merriweather","Merriweather Sans","Metal","Metal Mania","Metamorphous","Metrophobic","Michroma","Milonga","Miltonian","Miltonian Tattoo","Miniver","Miss Fajardose","Modak","Modern Antiqua","Molengo","Molle","Monda","Monofett","Monoton","Monsieur La Doulaise","Montaga","Montez","Montserrat","Montserrat Alternates","Montserrat Subrayada","Moul","Moulpali","Mountains of Christmas","Mouse Memoirs","Mr Bedfort","Mr Dafoe","Mr De Haviland","Mrs Saint Delafield","Mrs Sheppards","Muli","Mystery Quest","NTR","Neucha","Neuton","New Rocker","News Cycle","Niconne","Nixie One","Nobile","Nokora","Norican","Nosifer","Nothing You Could Do","Noticia Text","Noto Sans","Noto Serif","Nova Cut","Nova Flat","Nova Mono","Nova Oval","Nova Round","Nova Script","Nova Slim","Nova Square","Numans","Nunito","Odor Mean Chey","Offside","Old Standard TT","Oldenburg","Oleo Script","Oleo Script Swash Caps","Open Sans","Open Sans Condensed","Oranienbaum","Orbitron","Oregano","Orienta","Original Surfer","Oswald","Over the Rainbow","Overlock","Overlock SC","Ovo","Oxygen","Oxygen Mono","PT Mono","PT Sans","PT Sans Caption","PT Sans Narrow","PT Serif","PT Serif Caption","Pacifico","Palanquin","Palanquin Dark","Paprika","Parisienne","Passero One","Passion One","Pathway Gothic One","Patrick Hand","Patrick Hand SC","Patua One","Paytone One","Peddana","Peralta","Permanent Marker","Petit Formal Script","Petrona","Philosopher","Piedra","Pinyon Script","Pirata One","Plaster","Play","Playball","Playfair Display","Playfair Display SC","Podkova","Poiret One","Poller One","Poly","Pompiere","Pontano Sans","Port Lligat Sans","Port Lligat Slab","Pragati Narrow","Prata","Preahvihear","Press Start 2P","Princess Sofia","Prociono","Prosto One","Puritan","Purple Purse","Quando","Quantico","Quattrocento","Quattrocento Sans","Questrial","Quicksand","Quintessential","Qwigley","Racing Sans One","Radley","Rajdhani","Raleway","Raleway Dots","Ramabhadra","Ramaraja","Rambla","Rammetto One","Ranchers","Rancho","Ranga","Rationale","Ravi Prakash","Redressed","Reenie Beanie","Revalia","Ribeye","Ribeye Marrow","Righteous","Risque","Roboto","Roboto Condensed","Roboto Slab","Rochester","Rock Salt","Rokkitt","Romanesco","Ropa Sans","Rosario","Rosarivo","Rouge Script","Rozha One","Rubik Mono One","Rubik One","Ruda","Rufina","Ruge Boogie","Ruluko","Rum Raisin","Ruslan Display","Russo One","Ruthie","Rye","Sacramento","Sail","Salsa","Sanchez","Sancreek","Sansita One","Sarina","Sarpanch","Satisfy","Scada","Scheherazade","Schoolbell","Seaweed Script","Sevillana","Seymour One","Shadows Into Light","Shadows Into Light Two","Shanti","Share","Share Tech","Share Tech Mono","Shojumaru","Short Stack","Siemreap","Sigmar One","Signika","Signika Negative","Simonetta","Sintony","Sirin Stencil","Six Caps","Skranji","Slabo 13px","Slabo 27px","Slackey","Smokum","Smythe","Sniglet","Snippet","Snowburst One","Sofadi One","Sofia","Sonsie One","Sorts Mill Goudy","Source Code Pro","Source Sans Pro","Source Serif Pro","Special Elite","Spicy Rice","Spinnaker","Spirax","Squada One","Sree Krushnadevaraya","Stalemate","Stalinist One","Stardos Stencil","Stint Ultra Condensed","Stint Ultra Expanded","Stoke","Strait","Sue Ellen Francisco","Sumana","Sunshiney","Supermercado One","Suranna","Suravaram","Suwannaphum","Swanky and Moo Moo","Syncopate","Tangerine","Taprom","Tauri","Teko","Telex","Tenali Ramakrishna","Tenor Sans","Text Me One","The Girl Next Door","Tienne","Timmana","Tinos","Titan One","Titillium Web","Trade Winds","Trocchi","Trochut","Trykker","Tulpen One","Ubuntu","Ubuntu Condensed","Ubuntu Mono","Ultra","Uncial Antiqua","Underdog","Unica One","UnifrakturCook","UnifrakturMaguntia","Unkempt","Unlock","Unna","VT323","Vampiro One","Varela","Varela Round","Vast Shadow","Vesper Libre","Vibur","Vidaloka","Viga","Voces","Volkhov","Vollkorn","Voltaire","Waiting for the Sunrise","Wallpoet","Walter Turncoat","Warnes","Wellfleet","Wendy One","Wire One","Yanone Kaffeesatz","Yellowtail","Yeseva One","Yesteryear","Zeyada");
1038
  }
1039
 
1040
  public function getStandardFontsList() {
124
  return '';
125
  }
126
 
127
+ public function setDataForPage($table) {
128
+ $table->isDisplayed = false;
129
+ $table->isPageRows = true;
130
+ $this->_tablesObj[$table->view_id] = $table;
131
+ }
132
+
133
  public function getDataTablesObj() {
134
  if(empty($this->_tablesObj)) {
135
  $core = $this->getEnvironment()->getModule('core'); // @var SupsysticTables_Core_Module $core
156
  $settings = get_option('supsystic_tbl_settings');
157
 
158
  if (!empty($settings['table_search'])) {
159
+ add_filter('posts_search' , array($this, 'globalTablesSearchFilter'), 10, 2);
160
  }
161
  }
162
  }
163
 
164
+ public function globalTablesSearchFilter($where, $query) {
165
+ if($query->is_search() && $query->is_main_query()) {
 
 
166
  $search_query = trim(get_search_query());
167
 
168
  if(!empty($search_query)) {
177
  $postIds = $tables->getPostIdsByTableIds($tableIds);
178
 
179
  if(!empty($postIds)) {
180
+ global $wpdb;
181
  $idsStr = implode(',',array_keys($postIds));
182
 
183
  $exact = get_query_var( 'exact' );
184
  $n = ( empty( $exact ) ) ? '%' : '';
185
  $where = $wpdb->remove_placeholder_escape( $where );
186
+
187
+ foreach($tokens as $token) {
188
+ $old_or = "OR ({$wpdb->posts}.post_content LIKE '{$n}{$token}{$n}')";
189
+ $new_or = $old_or . " OR {$wpdb->posts}.ID IN ({$idsStr}) ";
190
+ $where = str_replace( $old_or, $new_or, $where );
191
+ }
192
 
193
  $where = $wpdb->add_placeholder_escape( $where );
194
  }
227
  }
228
  }
229
  $table = $table ? $table : $tables->getById($id);
230
+
231
  if (!$table) {
232
  return sprintf($environment->translate('The table with ID %d not exists.'), $id);
233
  }
234
+
235
+ $table->isSSP = (!$this->isSingleCell && !$this->isTablePart && isset($table->settings['serverSideProcessing']) && $table->settings['serverSideProcessing'] == 'on');
236
+ $table->isDB = ($environment->isPro() && !$this->isSingleCell && !$this->isTablePart && isset($table->settings['source']) && isset($table->settings['source']['database']) && $table->settings['source']['database'] == 'on');
237
+
238
+ if(!isset($table->isPageRows)) {
239
+ $table->isPageRows = false;
240
+ }
241
+
242
+ $this->checkSpreadsheet = $this->checkSpreadsheet && !$table->isPageRows
243
  && $environment->isPro()
244
  && isset($table->settings['features']['import']['google']['automatically_update'])
245
  && isset($table->settings['features']['import']['google']['link']);
246
 
247
+ if (!$table->isSSP && !isset($table->settings['disableCache']) && !$this->isSingleCell && !$this->isTablePart && !$this->checkSpreadsheet && !$this->isFromHistory && file_exists($cachePath) && $this->getEnvironment()->isProd()) {
248
+ $table->rows = $tables->getNeededRows($id, $table->settings, $table->isSSP);
249
  // Connect scripts and styles depending on table settings and table's cells settings for table cache
250
  $dispatcher = $this->getEnvironment()->getDispatcher();
251
  $dispatcher->apply('before_table_render', array($table));
259
  return $e->getMessage();
260
  }
261
  // We need to get the new rows' data from db
262
+ $table->meta = $tables->getMeta($id);
263
  }
264
+ if(!$table->isPageRows) {
265
+ $table->rows = $tables->getNeededRows($id, $table->settings, $table->isSSP);
266
+
267
+ if (isset($table->meta['columnsWidth'])) {
268
+ $columnsTotalWidth = array_sum($table->meta['columnsWidth']);
269
 
270
+ if($columnsTotalWidth) {
271
+ foreach ($table->meta['columnsWidth'] as &$value) {
272
+ $value = round($value / $columnsTotalWidth * 100, 4);
273
+ }
274
  }
275
  }
276
  }
277
 
278
+ if(!$environment->isPro()) {
279
+ $table->settings['styling']['lightboxImg'] = '';
280
+ }
281
  if($this->isSingleCell) {
282
  // Unset unneeded elements and features
283
  unset($table->settings['elements']['head']);
349
  $table->rows[$key]['cells'][$index]['calculatedValue'] = $this->isFromHistory[$key]['cells'][$index]['calculatedValue'];
350
  }
351
  }
 
 
 
 
 
 
 
352
  $table->rows[$key]['cells'][$index]['data'] = do_shortcode($table->rows[$key]['cells'][$index]['data']);
353
  }
354
  }
355
  }
356
+ $table->mirrorFooter = $this->getMirrorFooter($table);
357
  $table->history = (bool) $this->isFromHistory;
358
  $table->history_data = $this->historyData;
359
  $table->encoded_title = htmlspecialchars($table->title, ENT_QUOTES);
378
  return $renderData;
379
  }
380
 
381
+ public function getMirrorFooter($table) {
382
+ $footer = array();
383
+
384
+ if(!in_array('customFooter', $table->settings)) {
385
+ $headerRowsCount = !empty($table->settings['headerRowsCount']) ? $table->settings['headerRowsCount'] : 1;
386
+ $footer = array_slice($table->rows, 0, $headerRowsCount);
387
+
388
+ foreach($footer as $key => $row) {
389
+ foreach($row['cells'] as $index => $cell) {
390
+ if(!empty($table->meta['mergedCells'])) {
391
+ foreach($table->meta['mergedCells'] as $m) {
392
+ if($m['row'] == $key && $m['col'] == $index && $m['rowspan'] > 1) {
393
+ $newKey = $key + $m['rowspan'] - 1;
394
+ $footer[$newKey]['cells'][$index] = $cell;
395
+ $footer[$newKey]['cells'][$index]['rewrite'] = array(
396
+ 'rowspan' => $m['rowspan'],
397
+ 'colspan' => $m['colspan'],
398
+ 'display' => true,
399
+ );
400
+ $footer[$key]['cells'][$index]['rewrite'] = array(
401
+ 'rowspan' => 1,
402
+ 'colspan' => 1,
403
+ 'display' => false,
404
+ );
405
+ }
406
+ }
407
+ }
408
+ }
409
+ }
410
+ $footer = array_reverse($footer);
411
+ }
412
+ return $footer;
413
+ }
414
+
415
  /**
416
  * Renders the value of single cell
417
  * @param int $tableId
1084
  }
1085
 
1086
  public function getFontsList() {
1087
+ return array("ABeeZee","Abel","Abril Fatface","Aclonica","Acme","Actor","Adamina","Advent Pro","Aguafina Script","Akronim","Aladin","Aldrich","Alef","Alegreya","Alegreya SC","Alegreya Sans","Alegreya Sans SC","Alex Brush","Alfa Slab One","Alice","Alike","Alike Angular","Allan","Allerta","Allerta Stencil","Allura","Almendra","Almendra Display","Almendra SC","Amarante","Amaranth","Amatic SC","Amethysta","Amiri","Anaheim","Andada","Andika","Angkor","Annie Use Your Telescope","Anonymous Pro","Antic","Antic Didone","Antic Slab","Anton","Arapey","Arbutus","Arbutus Slab","Architects Daughter","Archivo Black","Archivo Narrow","Arimo","Arizonia","Armata","Artifika","Arvo","Asap","Asset","Astloch","Asul","Atomic Age","Aubrey","Audiowide","Autour One","Average","Average Sans","Averia Gruesa Libre","Averia Libre","Averia Sans Libre","Averia Serif Libre","Bad Script","Balthazar","Bangers","Basic","Battambang","Baumans","Bayon","Belgrano","Belleza","BenchNine","Bentham","Berkshire Swash","Bevan","Bigelow Rules","Bigshot One","Bilbo","Bilbo Swash Caps","Biryani","Bitter","Black Ops One","Bokor","Bonbon","Boogaloo","Bowlby One","Bowlby One SC","Brawler","Bree Serif","Bubblegum Sans","Bubbler One","Buenard","Butcherman","Butterfly Kids","Cabin","Cabin Condensed","Cabin Sketch","Caesar Dressing","Cagliostro","Calligraffitti","Cambay","Cambo","Candal","Cantarell","Cantata One","Cantora One","Capriola","Cardo","Carme","Carrois Gothic","Carrois Gothic SC","Carter One","Caudex","Cedarville Cursive","Ceviche One","Changa One","Chango","Chau Philomene One","Chela One","Chelsea Market","Chenla","Cherry Cream Soda","Cherry Swash","Chewy","Chicle","Chivo","Cinzel","Cinzel Decorative","Clicker Script","Coda","Codystar","Combo","Comfortaa","Coming Soon","Concert One","Condiment","Content","Contrail One","Convergence","Cookie","Copse","Corben","Courgette","Cousine","Coustard","Covered By Your Grace","Crafty Girls","Creepster","Crete Round","Crimson Text","Croissant One","Crushed","Cuprum","Cutive","Cutive Mono","Damion","Dancing Script","Dangrek","Dawning of a New Day","Days One","Dekko","Delius","Delius Swash Caps","Delius Unicase","Della Respira","Denk One","Devonshire","Dhurjati","Didact Gothic","Diplomata","Diplomata SC","Domine","Donegal One","Doppio One","Dorsa","Dosis","Dr Sugiyama","Droid Sans","Droid Sans Mono","Droid Serif","Duru Sans","Dynalight","EB Garamond","Eagle Lake","Eater","Economica","Ek Mukta","Electrolize","Elsie","Elsie Swash Caps","Emblema One","Emilys Candy","Engagement","Englebert","Enriqueta","Erica One","Esteban","Euphoria Script","Ewert","Exo","Exo 2","Expletus Sans","Fanwood Text","Fascinate","Fascinate Inline","Faster One","Fasthand","Fauna One","Federant","Federo","Felipa","Fenix","Finger Paint","Fira Mono","Fira Sans","Fjalla One","Fjord One","Flamenco","Flavors","Fondamento","Fontdiner Swanky","Forum","Francois One","Freckle Face","Fredericka the Great","Fredoka One","Freehand","Fresca","Frijole","Fruktur","Fugaz One","GFS Didot","GFS Neohellenic","Gabriela","Gafata","Galdeano","Galindo","Gentium Basic","Gentium Book Basic","Geo","Geostar","Geostar Fill","Germania One","Gidugu","Gilda Display","Give You Glory","Glass Antiqua","Glegoo","Gloria Hallelujah","Goblin One","Gochi Hand","Gorditas","Goudy Bookletter 1911","Graduate","Grand Hotel","Gravitas One","Great Vibes","Griffy","Gruppo","Gudea","Gurajada","Habibi","Halant","Hammersmith One","Hanalei","Hanalei Fill","Handlee","Hanuman","Happy Monkey","Headland One","Henny Penny","Herr Von Muellerhoff","Hind","Holtwood One SC","Homemade Apple","Homenaje","IM Fell DW Pica","IM Fell DW Pica SC","IM Fell Double Pica","IM Fell Double Pica SC","IM Fell English","IM Fell English SC","IM Fell French Canon","IM Fell French Canon SC","IM Fell Great Primer","IM Fell Great Primer SC","Iceberg","Iceland","Imprima","Inconsolata","Inder","Indie Flower","Inika","Irish Grover","Istok Web","Italiana","Italianno","Jacques Francois","Jacques Francois Shadow","Jaldi","Jim Nightshade","Jockey One","Jolly Lodger","Josefin Sans","Josefin Slab","Joti One","Judson","Julee","Julius Sans One","Junge","Jura","Just Another Hand","Just Me Again Down Here","Kalam","Kameron","Kantumruy","Karla","Karma","Kaushan Script","Kavoon","Kdam Thmor","Keania One","Kelly Slab","Kenia","Khand","Khmer","Khula","Kite One","Knewave","Kotta One","Koulen","Kranky","Kreon","Kristi","Krona One","Kurale","La Belle Aurore","Laila","Lakki Reddy","Lancelot","Lateef","Lato","League Script","Leckerli One","Ledger","Lekton","Lemon","Libre Baskerville","Life Savers","Lilita One","Lily Script One","Limelight","Linden Hill","Lobster","Lobster Two","Londrina Outline","Londrina Shadow","Londrina Sketch","Londrina Solid","Lora","Love Ya Like A Sister","Loved by the King","Lovers Quarrel","Luckiest Guy","Lusitana","Lustria","Macondo","Macondo Swash Caps","Magra","Maiden Orange","Mako","Mallanna","Mandali","Marcellus","Marcellus SC","Marck Script","Margarine","Marko One","Marmelad","Martel","Martel Sans","Marvel","Mate","Mate SC","Maven Pro","McLaren","Meddon","MedievalSharp","Medula One","Megrim","Meie Script","Merienda","Merienda One","Merriweather","Merriweather Sans","Metal","Metal Mania","Metamorphous","Metrophobic","Michroma","Milonga","Miltonian","Miltonian Tattoo","Miniver","Miss Fajardose","Modak","Modern Antiqua","Molengo","Monda","Monofett","Monoton","Monsieur La Doulaise","Montaga","Montez","Montserrat","Montserrat Alternates","Montserrat Subrayada","Moul","Moulpali","Mountains of Christmas","Mouse Memoirs","Mr Bedfort","Mr Dafoe","Mr De Haviland","Mrs Saint Delafield","Mrs Sheppards","Muli","Mystery Quest","NTR","Neucha","Neuton","New Rocker","News Cycle","Niconne","Nixie One","Nobile","Nokora","Norican","Nosifer","Nothing You Could Do","Noticia Text","Noto Sans","Noto Serif","Nova Cut","Nova Flat","Nova Mono","Nova Oval","Nova Round","Nova Script","Nova Slim","Nova Square","Numans","Nunito","Odor Mean Chey","Offside","Old Standard TT","Oldenburg","Oleo Script","Oleo Script Swash Caps","Open Sans","Oranienbaum","Orbitron","Oregano","Orienta","Original Surfer","Oswald","Over the Rainbow","Overlock","Overlock SC","Ovo","Oxygen","Oxygen Mono","PT Mono","PT Sans","PT Sans Caption","PT Sans Narrow","PT Serif","PT Serif Caption","Pacifico","Palanquin","Palanquin Dark","Paprika","Parisienne","Passero One","Passion One","Pathway Gothic One","Patrick Hand","Patrick Hand SC","Patua One","Paytone One","Peddana","Peralta","Permanent Marker","Petit Formal Script","Petrona","Philosopher","Piedra","Pinyon Script","Pirata One","Plaster","Play","Playball","Playfair Display","Playfair Display SC","Podkova","Poiret One","Poller One","Poly","Pompiere","Pontano Sans","Port Lligat Sans","Port Lligat Slab","Pragati Narrow","Prata","Preahvihear","Press Start 2P","Princess Sofia","Prociono","Prosto One","Puritan","Purple Purse","Quando","Quantico","Quattrocento","Quattrocento Sans","Questrial","Quicksand","Quintessential","Qwigley","Racing Sans One","Radley","Rajdhani","Raleway","Raleway Dots","Ramabhadra","Ramaraja","Rambla","Rammetto One","Ranchers","Rancho","Ranga","Rationale","Ravi Prakash","Redressed","Reenie Beanie","Revalia","Ribeye","Ribeye Marrow","Righteous","Risque","Roboto","Roboto Condensed","Roboto Slab","Rochester","Rock Salt","Rokkitt","Romanesco","Ropa Sans","Rosario","Rosarivo","Rouge Script","Rozha One","Rubik Mono One","Rubik One","Ruda","Rufina","Ruge Boogie","Ruluko","Rum Raisin","Ruslan Display","Russo One","Ruthie","Rye","Sacramento","Sail","Salsa","Sanchez","Sancreek","Sansita One","Sarina","Sarpanch","Satisfy","Scada","Scheherazade","Schoolbell","Seaweed Script","Sevillana","Seymour One","Shadows Into Light","Shadows Into Light Two","Shanti","Share","Share Tech","Share Tech Mono","Shojumaru","Short Stack","Siemreap","Sigmar One","Signika","Signika Negative","Simonetta","Sintony","Sirin Stencil","Six Caps","Skranji","Slabo 13px","Slabo 27px","Slackey","Smokum","Smythe","Sniglet","Snippet","Snowburst One","Sofadi One","Sofia","Sonsie One","Sorts Mill Goudy","Source Code Pro","Source Sans Pro","Source Serif Pro","Special Elite","Spicy Rice","Spinnaker","Spirax","Squada One","Sree Krushnadevaraya","Stalemate","Stalinist One","Stardos Stencil","Stint Ultra Condensed","Stint Ultra Expanded","Stoke","Strait","Sue Ellen Francisco","Sumana","Sunshiney","Supermercado One","Suranna","Suravaram","Suwannaphum","Swanky and Moo Moo","Syncopate","Tangerine","Taprom","Tauri","Teko","Telex","Tenali Ramakrishna","Tenor Sans","Text Me One","The Girl Next Door","Tienne","Timmana","Tinos","Titan One","Titillium Web","Trade Winds","Trocchi","Trochut","Trykker","Tulpen One","Ubuntu","Ubuntu Condensed","Ubuntu Mono","Ultra","Uncial Antiqua","Underdog","Unica One","UnifrakturMaguntia","Unkempt","Unlock","Unna","VT323","Vampiro One","Varela","Varela Round","Vast Shadow","Vesper Libre","Vibur","Vidaloka","Viga","Voces","Volkhov","Vollkorn","Voltaire","Waiting for the Sunrise","Wallpoet","Walter Turncoat","Warnes","Wellfleet","Wendy One","Wire One","Yanone Kaffeesatz","Yellowtail","Yeseva One","Yesteryear","Zeyada");
1088
  }
1089
 
1090
  public function getStandardFontsList() {
src/SupsysticTables/Tables/assets/css/tables.shortcode.css CHANGED
@@ -93,7 +93,6 @@ table.supsystic-table img {
93
  table.supsystic-table .ww-h {
94
  white-space: nowrap !important;
95
  overflow: hidden;
96
- max-width: 0;
97
  }
98
 
99
  table.supsystic-table {
93
  table.supsystic-table .ww-h {
94
  white-space: nowrap !important;
95
  overflow: hidden;
 
96
  }
97
 
98
  table.supsystic-table {
src/SupsysticTables/Tables/assets/css/tables.view.css CHANGED
@@ -232,6 +232,9 @@
232
  .setting-item + .setting-item {
233
  text-align: right;
234
  }
 
 
 
235
  .setting-item label {
236
  height: 33px;
237
  line-height: 33px;
232
  .setting-item + .setting-item {
233
  text-align: right;
234
  }
235
+ .setting-item .chosen-drop {
236
+ text-align: left;
237
+ }
238
  .setting-item label {
239
  height: 33px;
240
  line-height: 33px;
src/SupsysticTables/Tables/assets/js/editor/tables.editor.js CHANGED
@@ -1,8 +1,19 @@
1
- g_stbWindowHeight = 0;
 
 
2
  (function ($, app, undefined) {
3
  $(document).ready(function() {
4
  g_stbWindowHeight = $(window).width() > 810 ? $(window).height() * 0.7 : $(window).height(); // 810px is mobile responsive width
5
 
 
 
 
 
 
 
 
 
 
6
  var tableId = app.getParameterByName('id'),
7
  tablesModel = app.Models.Tables,
8
  editor = new Handsontable(document.getElementById('tableEditor'), {
@@ -503,15 +514,27 @@ g_stbWindowHeight = 0;
503
  // Load table data to editor
504
  $.when(
505
  tablesModel.getMeta(tableId),
506
- tablesModel.getRows(tableId)
507
- ).done(function (metaResponse, rowsResponse) {
508
- tablesModel.setTableData(metaResponse, rowsResponse);
 
 
 
 
 
 
 
509
  }).fail(function (error) {
510
  alert('Failed to load table data: ' + error);
511
  }).always(function (response) {
512
  $('#loadingProgress').remove();
513
  editor.render();
 
 
514
  });
 
 
 
515
 
516
  // Select all table cells by click on the top left corner of table editor
517
  $('.ht_clone_top_left_corner').on('mousedown', function(e) {
@@ -592,7 +615,8 @@ g_stbWindowHeight = 0;
592
  })();
593
 
594
  editor.setPageData = (function () {
595
- return function (inBuffer = true) {
 
596
  if (inBuffer) {
597
  this.copyInBuffer();
598
  }
1
+ var g_stbWindowHeight = 0;
2
+ var g_stbPagination = false;
3
+ var g_stbRowsPerPage = 1;
4
  (function ($, app, undefined) {
5
  $(document).ready(function() {
6
  g_stbWindowHeight = $(window).width() > 810 ? $(window).height() * 0.7 : $(window).height(); // 810px is mobile responsive width
7
 
8
+ var pagination = $('#tableEditor').data('editor-pagination');
9
+ if(typeof(pagination) != 'undefined' && pagination == 'on') {
10
+ g_stbPagination = true;
11
+ var rowsPerPage = $('#tableEditor').data('editor-pagination-rows');
12
+ if(typeof(rowsPerPage) != 'undefined') {
13
+ g_stbRowsPerPage = rowsPerPage;
14
+ }
15
+ }
16
+
17
  var tableId = app.getParameterByName('id'),
18
  tablesModel = app.Models.Tables,
19
  editor = new Handsontable(document.getElementById('tableEditor'), {
514
  // Load table data to editor
515
  $.when(
516
  tablesModel.getMeta(tableId),
517
+ tablesModel.getCountRows(tableId)
518
+ ).done(function(metaResponse, countResponse) {
519
+ $.when(
520
+ tablesModel.getRows(tableId, countResponse[0].countRows)
521
+ ).done(function (rowsResponse) {
522
+ if(countResponse[0].countRows == rowsResponse[0].rows.length) {
523
+ tablesModel.setTableData(metaResponse, rowsResponse);
524
+ } else {
525
+ alert('Failed to load table data!');
526
+ }
527
  }).fail(function (error) {
528
  alert('Failed to load table data: ' + error);
529
  }).always(function (response) {
530
  $('#loadingProgress').remove();
531
  editor.render();
532
+ $('#buttonSave').attr('disabled', false);
533
+ g_stbDoSaving = false;
534
  });
535
+ }).fail(function (error) {
536
+ alert('Failed to load table data: ' + error);
537
+ });
538
 
539
  // Select all table cells by click on the top left corner of table editor
540
  $('.ht_clone_top_left_corner').on('mousedown', function(e) {
615
  })();
616
 
617
  editor.setPageData = (function () {
618
+ return function (inBuffer) {
619
+ if (typeof(inBuffer) == 'undefined') inBuffer = true;
620
  if (inBuffer) {
621
  this.copyInBuffer();
622
  }
src/SupsysticTables/Tables/assets/js/tables.model.js CHANGED
@@ -1,8 +1,6 @@
1
- var g_stbDoSaving = false;
2
  var g_stbDoPreview = false;
3
  var g_stbPreviewTimeoutSet = false;
4
- var g_stbPagination = false;
5
- var g_stbRowsPerPage = 1;
6
  (function ($, app) {
7
 
8
  var TablesModel = (function () {
@@ -58,12 +56,40 @@ var g_stbRowsPerPage = 1;
58
  return this.request('updateColumns', { id: id, columns: columns })
59
  };
60
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
61
  TablesModel.prototype.getRows = function (id) {
62
  if (isNaN(id = parseInt(id))) {
63
  throw new Error('Invalid table id.');
64
  }
 
 
 
65
 
66
- return this.request('getRows', { id: id });
 
67
  };
68
 
69
  TablesModel.prototype.setRows = function (id, rows, byPart, preview) {
@@ -185,7 +211,7 @@ var g_stbRowsPerPage = 1;
185
  $.each(rows, function (x, row) {
186
  var cells = [];
187
 
188
- heights.push(row.height || undefined);
189
 
190
  $.each(row.cells, function (y, cell) {
191
  var metaData = {};
@@ -419,7 +445,8 @@ var g_stbRowsPerPage = 1;
419
  metaData = [],
420
  mergeData = [],
421
  rowsData = [],
422
- columnsWidth = [];
 
423
 
424
  // Put textareas data into the hidden fields before the saving of table settings
425
  formData.find('input[name="elements[descriptionText]"]').val( formData.find('#descriptionText').val() );
@@ -434,8 +461,10 @@ var g_stbRowsPerPage = 1;
434
  $(preview).empty();
435
  }
436
  }
 
437
  $.each((pagination ? bufferData : editor.getData()), function (x, row) {
438
  var currentRow = { cells: [] };
 
439
 
440
  $.each(row, function (y, cell) {
441
  var meta = (pagination ? bufferMeta[x * countCols + y] : editor.getCellMeta(x, y)),
@@ -455,6 +484,7 @@ var g_stbRowsPerPage = 1;
455
  var cellHtml = (pagination ? bufferData[x][y] : $(editor.getCell(x, y))),
456
  classes = [],
457
  cellData = {
 
458
  data: cell,
459
  calculatedValue: null,
460
  hidden: false,
1
+ var g_stbDoSaving = true; //waiting for the end of downloads
2
  var g_stbDoPreview = false;
3
  var g_stbPreviewTimeoutSet = false;
 
 
4
  (function ($, app) {
5
 
6
  var TablesModel = (function () {
56
  return this.request('updateColumns', { id: id, columns: columns })
57
  };
58
 
59
+ TablesModel.prototype.getCountRows = function (id) {
60
+ if (isNaN(id = parseInt(id))) {
61
+ throw new Error('Invalid table id.');
62
+ }
63
+
64
+ return this.request('getCountRows', { id: id })
65
+ };
66
+
67
+ var allRows = [];
68
+ TablesModel.prototype.getPartRows = function(id, limit, offset, deferred) {
69
+ var self = this;
70
+ $.when(
71
+ this.request('getRows', { id: id, limit: limit, offset: offset})
72
+ ).done(function (rowsResponse) {
73
+ if(rowsResponse.rows.length > 0) {
74
+ $.merge(allRows, rowsResponse.rows);
75
+ offset += limit;
76
+ self.getPartRows(id, limit, offset, deferred);
77
+ } else {
78
+ deferred.resolve([{rows: allRows}]);
79
+ }
80
+ });
81
+ };
82
+
83
  TablesModel.prototype.getRows = function (id) {
84
  if (isNaN(id = parseInt(id))) {
85
  throw new Error('Invalid table id.');
86
  }
87
+ var deferred = $.Deferred();
88
+ limit = 2000,
89
+ offset = 0;
90
 
91
+ this.getPartRows(id, limit, offset, deferred);
92
+ return deferred.promise();
93
  };
94
 
95
  TablesModel.prototype.setRows = function (id, rows, byPart, preview) {
211
  $.each(rows, function (x, row) {
212
  var cells = [];
213
 
214
+ heights.push(row.height !== undefined && row.height > 0 ? row.height : undefined);
215
 
216
  $.each(row.cells, function (y, cell) {
217
  var metaData = {};
445
  metaData = [],
446
  mergeData = [],
447
  rowsData = [],
448
+ columnsWidth = [],
449
+ rowCounter = 0;
450
 
451
  // Put textareas data into the hidden fields before the saving of table settings
452
  formData.find('input[name="elements[descriptionText]"]').val( formData.find('#descriptionText').val() );
461
  $(preview).empty();
462
  }
463
  }
464
+
465
  $.each((pagination ? bufferData : editor.getData()), function (x, row) {
466
  var currentRow = { cells: [] };
467
+ rowCounter++;
468
 
469
  $.each(row, function (y, cell) {
470
  var meta = (pagination ? bufferMeta[x * countCols + y] : editor.getCellMeta(x, y)),
484
  var cellHtml = (pagination ? bufferData[x][y] : $(editor.getCell(x, y))),
485
  classes = [],
486
  cellData = {
487
+ y: rowCounter,
488
  data: cell,
489
  calculatedValue: null,
490
  hidden: false,
src/SupsysticTables/Tables/assets/js/tables.shortcode.js CHANGED
@@ -61,66 +61,13 @@
61
  }
62
  if(typeof app.getTableInstanceById(table.data('id')).fnAdjustColumnSizing == 'function' ) {
63
  setTimeout(function(){
64
- app.getTableInstanceById(table.data('id')).fnAdjustColumnSizing();
65
  }, 350);
66
  }
67
- var searching = table.data('searching-settings');
68
- if(searching && ("columnSearch" in searching) && searching.columnSearch == 'on') {
69
- setColumnSearch(table);
70
- }
71
  });
72
  });
73
  });
74
 
75
- function setColumnSearch(table) {
76
- var dtable = $('#supsystic-table-' + table.data('id') + '[data-view-id="' + table.data('view-id') + '"]'),
77
- tfoot = $('#supsystic-table-' + table.data('view-id')).find('div .dataTables_scrollFootInner table '),
78
- inputs = (tfoot.length == 0 ? dtable.find('tfoot tr:last input') : tfoot.eq(0).find('tfoot tr:last input'));
79
-
80
- if(inputs.length == 0) {
81
- return;
82
- }
83
- dtable.DataTable().columns().every( function (colIdx) {
84
- var that = this;
85
- inputs.eq(colIdx).on('keyup change', function () {
86
- if ( that.search() !== this.value ) {
87
- that
88
- .search (this.value.replace(/;/g, "|"), true, false)
89
- .draw ();
90
- }
91
- });
92
- });
93
- var div = $('#supsystic-table-' + table.data('view-id')),
94
- leftTable = div.find('.DTFC_LeftBodyWrapper').find('table'),
95
- rightTable = div.find('.DTFC_RightBodyWrapper').find('table');
96
-
97
- if(leftTable.length) {
98
- var leftFoot = div.find('.DTFC_LeftFootWrapper').find('table'),
99
- leftInputs = (leftFoot.length == 0 ? leftTable.find('tfoot tr:last input') : leftFoot.eq(0).find('tfoot tr:last input'));
100
-
101
- leftInputs.each( function (colIdx) {
102
- setCopyEvents(this, inputs.eq(colIdx).data('events'));
103
- });
104
- }
105
- if(rightTable.length) {
106
- var rightFoot = div.find('.DTFC_RightFootWrapper').find('table'),
107
- rightInputs = (rightFoot.length == 0 ? rightTable.find('tfoot tr:last input') : rightFoot.eq(0).find('tfoot tr:last input')),
108
- cntRight = rightInputs.length,
109
- cntInputs = inputs.length;
110
-
111
- rightInputs.each( function (colIdx) {
112
- setCopyEvents(this, inputs.eq(cntInputs - cntRight + colIdx).data('events'));
113
- });
114
- }
115
- }
116
- function setCopyEvents(obj, events) {
117
- $.each(events, function (event, handlers) {
118
- $.each(handlers, function (j, handler) {
119
- $(obj).bind(event, handler);
120
- });
121
- });
122
- }
123
-
124
  function getOriginalImageSizes(img) {
125
  var tempImage = new Image(),
126
  width,
61
  }
62
  if(typeof app.getTableInstanceById(table.data('id')).fnAdjustColumnSizing == 'function' ) {
63
  setTimeout(function(){
64
+ app.getTableInstanceById(table.data('id')).fnAdjustColumnSizing(false);
65
  }, 350);
66
  }
 
 
 
 
67
  });
68
  });
69
  });
70
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
71
  function getOriginalImageSizes(img) {
72
  var tempImage = new Image(),
73
  width,
src/SupsysticTables/Tables/views/shortcode.twig CHANGED
@@ -3,15 +3,19 @@
3
 
4
  {% if cell.hiddenCell != true or cell.hiddenCell == true and searchByHidden == 'on' %}
5
  {% set data = cell.data %}
 
 
 
 
6
 
7
  {% if context.table.settings.styling.paragraphMode %}
8
  {% set data = data | raw | nl2br %}
9
  {% endif %}
10
 
11
  <{{tag}}
12
- data-cell-id="{{ context.cols[context.countIter] ~ context.cols[context.cellIter] ~ rowIndex }}"
13
  data-x="{{ cellIndex }}"
14
- data-y="{{ rowIndex }}"
15
  class="{{ cell.meta | join(' ') | trim }}"
16
 
17
  {% if cell.comment is defined and cell.comment.value is defined %}
@@ -79,13 +83,22 @@
79
  {% set colspan = 1 %}
80
  {% set rowspan = 1 %}
81
  {% for mergedCell in context.table.meta.mergedCells %}
82
- {% if mergedCell.row == rowIndex - 1 and mergedCell.col == cellIndex %}
83
  {% set display = true %}
84
  {% set colspan = mergedCell.colspan %}
85
  {% set rowspan = mergedCell.rowspan %}
86
  {% endif %}
87
  {% endfor %}
88
- {% if display == false %}
 
 
 
 
 
 
 
 
 
89
  data-hide="true"
90
  {% else %}
91
  data-colspan="{{ colspan }}"
@@ -93,12 +106,7 @@
93
  {% endif %}
94
  {% endif %}
95
  >
96
- {# set lightbox for image #}
97
- {% if cell.imgHref is defined %}
98
- <a href="{{ cell.imgHref }}" data-featherlight="image">{{ data | raw }}</a>
99
- {% else %}
100
- {{ data | raw }}
101
- {% endif %}
102
  </{{tag}}>
103
  {% endif %}
104
  {% endmacro %}
@@ -108,7 +116,11 @@
108
  {% set cols = 'A'..'Z' %}
109
  {% set countIter = -1 %}
110
  {% set cellIter = 0 %}
 
 
 
111
 
 
112
  {% if 'auto_width' not in table.settings.features | keys %}
113
  {% if table.settings.tableWidthType == 'auto' %}
114
  {% set tableWidth = 'auto' %}
@@ -173,6 +185,12 @@
173
  data-date-format="{{ table.settings.dateFormat | default('DD.MM.YYYY') }}"
174
  data-time-format="{{ table.settings.timeFormat | default('HH:mm') }}"
175
  data-features="{{ table.settings.features | keys | json_encode | e }}"
 
 
 
 
 
 
176
  {% if 'head' in table.settings.elements | keys %}
177
  data-head="{{ table.settings.elements.head }}"
178
  {% endif %}
@@ -185,6 +203,9 @@
185
  {% if 'foot' in table.settings.elements | keys %}
186
  data-foot="{{ table.settings.elements.foot }}"
187
  {% endif %}
 
 
 
188
  {% if 'fixedFooter' in table.settings | keys %}
189
  data-fixed-foot="{{ table.settings.fixedFooter }}"
190
  {% endif %}
@@ -289,7 +310,11 @@
289
  {% set footRowsCount = table.settings.footerRowsCount | default(1) %}
290
  {% set footRows = table.rows | slice('-' ~ footRowsCount, footRowsCount) %}
291
  {% else %}
292
- {% set footRows = headRows | reverse %}
 
 
 
 
293
  {% endif %}
294
  {% endif %}
295
 
@@ -338,8 +363,12 @@
338
  {% endfor %}
339
  </thead>
340
  {% endblock %}
 
 
 
341
 
342
  {% block tbody %}
 
343
  <tbody>
344
  {% for row in bodyRows %}
345
  {% set rowNumber = loop.index + (head ? headRowsCount : 0) %}
@@ -385,8 +414,10 @@
385
  {% endif %}
386
  {% endfor %}
387
  </tbody>
 
388
  {% endblock %}
389
 
 
390
  {% block tfoot %}
391
  {% if foot %}
392
  <tfoot>
@@ -436,6 +467,7 @@
436
 
437
  {% block after_table %}{% endblock %}
438
  </div>
 
439
  <!-- /.supsystic-tables-wrap -->
440
 
441
  <!-- Tables Generator by Supsystic -->
3
 
4
  {% if cell.hiddenCell != true or cell.hiddenCell == true and searchByHidden == 'on' %}
5
  {% set data = cell.data %}
6
+ {% set cellY = rowIndex %}
7
+ {% if context.isSSP == true or context.isDB == true %}
8
+ {% set cellY = cell.y | default(rowIndex) %}
9
+ {% endif %}
10
 
11
  {% if context.table.settings.styling.paragraphMode %}
12
  {% set data = data | raw | nl2br %}
13
  {% endif %}
14
 
15
  <{{tag}}
16
+ data-cell-id="{{ context.cols[context.countIter] ~ context.cols[context.cellIter] ~ cellY }}"
17
  data-x="{{ cellIndex }}"
18
+ data-y="{{ cellY }}"
19
  class="{{ cell.meta | join(' ') | trim }}"
20
 
21
  {% if cell.comment is defined and cell.comment.value is defined %}
83
  {% set colspan = 1 %}
84
  {% set rowspan = 1 %}
85
  {% for mergedCell in context.table.meta.mergedCells %}
86
+ {% if mergedCell.row == cellY - 1 and mergedCell.col == cellIndex %}
87
  {% set display = true %}
88
  {% set colspan = mergedCell.colspan %}
89
  {% set rowspan = mergedCell.rowspan %}
90
  {% endif %}
91
  {% endfor %}
92
+ {% if cell.rewrite.rowspan is defined %}
93
+ {% set rowspan = cell.rewrite.rowspan %}
94
+ {% endif %}
95
+ {% if cell.rewrite.colspan is defined %}
96
+ {% set colspan = cell.rewrite.colspan %}
97
+ {% endif %}
98
+ {% if cell.rewrite.display is defined %}
99
+ {% set display = cell.rewrite.display %}
100
+ {% endif %}
101
+ {% if display == false and context.isPageRows == false %}
102
  data-hide="true"
103
  {% else %}
104
  data-colspan="{{ colspan }}"
106
  {% endif %}
107
  {% endif %}
108
  >
109
+ {{ data | raw }}
 
 
 
 
 
110
  </{{tag}}>
111
  {% endif %}
112
  {% endmacro %}
116
  {% set cols = 'A'..'Z' %}
117
  {% set countIter = -1 %}
118
  {% set cellIter = 0 %}
119
+ {% set isSSP = table.isSSP | default(false) %}
120
+ {% set isPageRows = table.isPageRows | default(false) %}
121
+ {% set isDB = table.isDB | default(false) %}
122
 
123
+ {% if isPageRows == false %}
124
  {% if 'auto_width' not in table.settings.features | keys %}
125
  {% if table.settings.tableWidthType == 'auto' %}
126
  {% set tableWidth = 'auto' %}
185
  data-date-format="{{ table.settings.dateFormat | default('DD.MM.YYYY') }}"
186
  data-time-format="{{ table.settings.timeFormat | default('HH:mm') }}"
187
  data-features="{{ table.settings.features | keys | json_encode | e }}"
188
+ {% if 'lightboxImg' in table.settings.styling | keys %}
189
+ data-lightbox-img="{{ table.settings.styling.lightboxImg }}"
190
+ {% endif %}
191
+ {% if table.isSSP == true %}
192
+ data-server-side-processing="on"
193
+ {% endif %}
194
  {% if 'head' in table.settings.elements | keys %}
195
  data-head="{{ table.settings.elements.head }}"
196
  {% endif %}
203
  {% if 'foot' in table.settings.elements | keys %}
204
  data-foot="{{ table.settings.elements.foot }}"
205
  {% endif %}
206
+ {% if 'customFooter' in table.settings | keys and 'footerRowsCount' in table.settings | keys %}
207
+ data-foot-custom-rows-count="{{ table.settings.footerRowsCount | default(1) }}"
208
+ {% endif %}
209
  {% if 'fixedFooter' in table.settings | keys %}
210
  data-fixed-foot="{{ table.settings.fixedFooter }}"
211
  {% endif %}
310
  {% set footRowsCount = table.settings.footerRowsCount | default(1) %}
311
  {% set footRows = table.rows | slice('-' ~ footRowsCount, footRowsCount) %}
312
  {% else %}
313
+ {% if table.mirrorFooter is not empty %}
314
+ {% set footRows = table.mirrorFooter %}
315
+ {% else %}
316
+ {% set footRows = headRows | reverse %}
317
+ {% endif %}
318
  {% endif %}
319
  {% endif %}
320
 
363
  {% endfor %}
364
  </thead>
365
  {% endblock %}
366
+ {% else %}
367
+ {% set bodyRows = table.rows %}
368
+ {% endif %}
369
 
370
  {% block tbody %}
371
+ {% if isSSP == false or isPageRows == true %}
372
  <tbody>
373
  {% for row in bodyRows %}
374
  {% set rowNumber = loop.index + (head ? headRowsCount : 0) %}
414
  {% endif %}
415
  {% endfor %}
416
  </tbody>
417
+ {% endif %}
418
  {% endblock %}
419
 
420
+ {% if isPageRows == false %}
421
  {% block tfoot %}
422
  {% if foot %}
423
  <tfoot>
467
 
468
  {% block after_table %}{% endblock %}
469
  </div>
470
+ {% endif %}
471
  <!-- /.supsystic-tables-wrap -->
472
 
473
  <!-- Tables Generator by Supsystic -->
src/SupsysticTables/Tables/views/view.twig CHANGED
@@ -61,7 +61,7 @@
61
  <div class="stbMainBtnsShell col-lg-6 col-md-12 col-sm-12 col-xs-12">
62
  <ul class="subsubsub control-buttons">
63
  <li>
64
- <button id="buttonSave" class="button">
65
  <i class="fa fa-floppy-o" aria-hidden="true"></i>
66
  <span>{{ environment.translate('Save') }}</span>
67
  </button>
@@ -738,6 +738,23 @@
738
  </select>
739
  </div>
740
  </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
741
  <div class="setting-wrapper row">
742
  <div class="setting-item col-md-6 col-sm-6 col-xs-12">
743
  <label for="features-searching">
@@ -759,7 +776,7 @@
759
  >
760
  <div class="setting-item setting-options col-md-6 col-sm-6 col-xs-12">
761
  <label for="features-search-by-column">
762
- {{ environment.translate('Search by columns') }}
763
  {{ tooltip.icon(environment.translate('Add search by table columns. Use a semicolon as separator for select any of the values.')) }}
764
  </label>
765
  </div>
@@ -1741,7 +1758,10 @@
1741
  <div class="clear"></div>
1742
  </div>
1743
  <!-- /#formulaEditor -->
1744
- <div id="tableEditor"></div>
 
 
 
1745
  <!-- /#tableEditor -->
1746
  </div>
1747
 
61
  <div class="stbMainBtnsShell col-lg-6 col-md-12 col-sm-12 col-xs-12">
62
  <ul class="subsubsub control-buttons">
63
  <li>
64
+ <button id="buttonSave" class="button" disabled>
65
  <i class="fa fa-floppy-o" aria-hidden="true"></i>
66
  <span>{{ environment.translate('Save') }}</span>
67
  </button>
738
  </select>
739
  </div>
740
  </div>
741
+ <div class="setting-wrapper row pagination-options"
742
+ {% if table.settings.features.paging is not defined %}
743
+ style="display:none"
744
+ {% endif %}
745
+ >
746
+ <div class="setting-item setting-options col-md-6 col-sm-6 col-xs-12">
747
+ <label for="pagination-server-processing">
748
+ {{ environment.translate('Server-side Processing') }}
749
+ {{ tooltip.icon(environment.translate('This option is recommended for a large tables that cannot be processed in conventional way. The table will be sequentially loaded by ajax on a per page basis, all filtering, ordering and search clauses is server-side implemented too.')) }}
750
+ </label>
751
+ </div>
752
+ <div class="setting-item col-md-6 col-sm-6 col-xs-12">
753
+ <input type="checkbox" name="serverSideProcessing" id="server-side-processing"
754
+ {{ checkbox.checked(table.settings.serverSideProcessing) }}
755
+ >
756
+ </div>
757
+ </div>
758
  <div class="setting-wrapper row">
759
  <div class="setting-item col-md-6 col-sm-6 col-xs-12">
760
  <label for="features-searching">
776
  >
777
  <div class="setting-item setting-options col-md-6 col-sm-6 col-xs-12">
778
  <label for="features-search-by-column">
779
+ {{ environment.translate('Search by Columns') }}
780
  {{ tooltip.icon(environment.translate('Add search by table columns. Use a semicolon as separator for select any of the values.')) }}
781
  </label>
782
  </div>
1758
  <div class="clear"></div>
1759
  </div>
1760
  <!-- /#formulaEditor -->
1761
+ <div id="tableEditor"
1762
+ {% if settings.editor_pagination is defined %} data-editor-pagination="{{ settings.editor_pagination }}" {% endif %}
1763
+ {% if settings.editor_pagination_rows is defined %} data-editor-pagination-rows="{{ settings.editor_pagination_rows | default(1) }}" {% endif %}
1764
+ ></div>
1765
  <!-- /#tableEditor -->
1766
  </div>
1767