PluginProbe ʕ •ᴥ•ʔ
Superb Addons: Blocks, Patterns, Pre-built Pages, Sliders, Popups, Free Forms, Animations & More / 4.0.0
Superb Addons: Blocks, Patterns, Pre-built Pages, Sliders, Popups, Free Forms, Animations & More v4.0.0
4.0.7 4.0.6 4.0.5 4.0.4 4.0.3 4.0.2 4.0.1 4.0.0 trunk 1.0.0 2.0.0 2.0.1 2.0.2 2.0.3 3.0 3.0.1 3.0.2 3.0.5 3.0.6 3.0.7 3.0.8 3.0.9 3.1.0 3.1.2 3.1.3 3.2.0 3.2.1 3.2.2 3.2.4 3.2.5 3.2.7 3.2.8 3.2.9 3.3.0 3.3.1 3.3.2 3.4.0 3.4.1 3.4.2 3.4.5 3.4.6 3.5.0 3.5.1 3.5.2 3.5.3 3.5.4 3.5.6 3.5.7 3.5.8 3.5.9 3.6.0 3.6.1 3.6.2 3.7.0 3.7.1
superb-blocks / src / admin / pages / class-page-form.php
superb-blocks / src / admin / pages Last commit date
wizard 2 months ago class-page-additional-css.php 2 months ago class-page-dashboard.php 2 months ago class-page-form.php 2 months ago class-page-settings.php 2 months ago class-page-support.php 2 months ago
class-page-form.php
955 lines
1 <?php
2
3 namespace SuperbAddons\Admin\Pages;
4
5 defined('ABSPATH') || exit();
6
7 use SuperbAddons\Admin\Controllers\DashboardController;
8 use SuperbAddons\Admin\Utils\AdminLinkSource;
9 use SuperbAddons\Admin\Utils\AdminLinkUtil;
10 use SuperbAddons\Components\Admin\Modal;
11 use SuperbAddons\Components\Admin\EncryptionNotice;
12 use SuperbAddons\Components\Admin\PremiumBox;
13 use SuperbAddons\Components\Admin\ReviewBox;
14 use SuperbAddons\Components\Admin\SupportBox;
15 use SuperbAddons\Config\Capabilities;
16 use SuperbAddons\Data\Controllers\KeyController;
17 use SuperbAddons\Gutenberg\Controllers\GutenbergController;
18 use SuperbAddons\Gutenberg\Form\FormAccessControl;
19 use SuperbAddons\Gutenberg\Form\FormRegistry;
20 use SuperbAddons\Gutenberg\Form\FormSettings;
21 use SuperbAddons\Gutenberg\Form\FormSubmissionHandler;
22
23 class FormsPage
24 {
25 private $form_id = '';
26 private $form_name = '';
27 private $forms = array();
28 private $is_single_form = false;
29 private $form_stats = array();
30 private $form_entry = null;
31 private $total_forms = 0;
32 private $total_submissions = 0;
33 private $total_unread = 0;
34
35 public function __construct()
36 {
37 if (!GutenbergController::is_compatible()) {
38 $this->RenderIncompatible();
39 return;
40 }
41
42 // We can skip nonce verification here because we're not performing any sensitive actions based on this value, just using it to determine which view to show.
43 // phpcs:ignore WordPress.Security.NonceVerification.Recommended
44 $this->form_id = isset($_GET['form_id']) ? sanitize_text_field(wp_unslash($_GET['form_id'])) : '';
45 $this->is_single_form = !empty($this->form_id);
46
47 if ($this->is_single_form) {
48 $this->form_entry = FormRegistry::Get($this->form_id);
49 $this->form_stats = FormSubmissionHandler::GetFormStats($this->form_id);
50 // Form doesn't exist in registry and has no submissions
51 if (!$this->form_entry && $this->form_stats['total'] === 0) {
52 $this->RenderNotFound();
53 return;
54 }
55 $this->LoadFormName();
56 } else {
57 $this->LoadFormsList();
58 }
59
60 $this->Render();
61 }
62
63 private function LoadFormName()
64 {
65 $this->form_name = FormRegistry::GetName($this->form_id);
66 }
67
68 private static function RenderAccessControlNotice()
69 {
70 if (!current_user_can(Capabilities::ADMIN) || FormAccessControl::IsEnabled()) {
71 return;
72 }
73 ?>
74 <div class="superbaddons-dashboard-suggest-card superbaddons-dashboard-suggest-card--sidebar">
75 <img src="<?php echo esc_url(SUPERBADDONS_ASSETS_PATH . '/img/purple-shield-check.svg'); ?>" alt="" aria-hidden="true" />
76 <strong class="superbaddons-element-text-xxs superbaddons-element-text-dark"><?php echo esc_html__('Access Control', 'superb-blocks'); ?></strong>
77 <p class="superbaddons-element-text-xxs superbaddons-element-text-gray superbaddons-element-m0"><?php echo esc_html__('All users with editor access currently have full access to this page and form blocks. You can restrict permissions per role in Settings.', 'superb-blocks'); ?></p>
78 <a href="<?php echo esc_url(admin_url('admin.php?page=' . DashboardController::SETTINGS . '#forms')); ?>" class="superbaddons-element-colorlink superbaddons-element-text-xxs"><?php echo esc_html__('Manage Permissions', 'superb-blocks'); ?> &rarr;</a>
79 </div>
80 <?php
81 }
82
83 /**
84 * Get the action statuses for a form from its stored config.
85 * Returns array with store_enabled, email_enabled, send_confirmation, and integration statuses.
86 * Integration statuses use: false (off), 'on' (fully configured), 'no_api_key', 'no_lists'.
87 */
88 private static function GetFormActionStatuses($form_id)
89 {
90 $config = FormRegistry::GetConfig($form_id);
91 $defaults = array(
92 'store_enabled' => false,
93 'email_enabled' => false,
94 'send_confirmation' => false,
95 'mailchimp_status' => false,
96 'brevo_status' => false,
97 'webhook_status' => false,
98 'google_sheets_status' => false,
99 'slack_status' => false,
100 );
101
102 if (!$config || !is_array($config)) {
103 return $defaults;
104 }
105
106 return array(
107 'store_enabled' => !empty($config['storeEnabled']),
108 'email_enabled' => !empty($config['emailEnabled']),
109 'send_confirmation' => !empty($config['sendConfirmation']),
110 'mailchimp_status' => self::GetIntegrationStatus(
111 !empty($config['mailchimpEnabled']),
112 FormSettings::Get(FormSettings::OPTION_MAILCHIMP_API_KEY),
113 isset($config['mailchimpListIds']) ? $config['mailchimpListIds'] : array()
114 ),
115 'brevo_status' => self::GetIntegrationStatus(
116 !empty($config['brevoEnabled']),
117 FormSettings::Get(FormSettings::OPTION_BREVO_API_KEY),
118 isset($config['brevoListIds']) ? $config['brevoListIds'] : array()
119 ),
120 'webhook_status' => self::GetWebhookStatus($config),
121 'google_sheets_status' => self::GetGoogleSheetsStatus($config),
122 'slack_status' => self::GetSlackStatus($config),
123 );
124 }
125
126 /**
127 * Determine the status of an integration.
128 * Returns false (off), 'on' (fully configured), 'no_api_key', or 'no_lists'.
129 */
130 private static function GetIntegrationStatus($enabled, $api_key, $list_ids)
131 {
132 if (!$enabled) {
133 return false;
134 }
135 if (empty($api_key)) {
136 return 'no_api_key';
137 }
138 if (!is_array($list_ids) || empty($list_ids)) {
139 return 'no_lists';
140 }
141 return 'on';
142 }
143
144 private static function GetWebhookStatus($config)
145 {
146 if (empty($config['webhookEnabled'])) {
147 return false;
148 }
149 if (empty($config['webhookUrl'])) {
150 return 'no_url';
151 }
152 return 'on';
153 }
154
155 private static function GetGoogleSheetsStatus($config)
156 {
157 if (empty($config['googleSheetsEnabled'])) {
158 return false;
159 }
160 if (!FormSettings::HasValue(FormSettings::OPTION_GOOGLE_SHEETS_CLIENT_EMAIL) || !FormSettings::HasValue(FormSettings::OPTION_GOOGLE_SHEETS_PRIVATE_KEY)) {
161 return 'no_api_key';
162 }
163 if (empty($config['googleSheetsSpreadsheetUrl'])) {
164 return 'no_spreadsheet';
165 }
166 return 'on';
167 }
168
169 private static function GetSlackStatus($config)
170 {
171 if (empty($config['slackEnabled'])) {
172 return false;
173 }
174 if (empty($config['slackWebhookUrl'])) {
175 return 'no_url';
176 }
177 return 'on';
178 }
179
180 private static function GetEditLabel($source_post_type)
181 {
182 $edit_labels = array(
183 'page' => __('Edit in Page', 'superb-blocks'),
184 'post' => __('Edit in Post', 'superb-blocks'),
185 'wp_template' => __('Edit in Template', 'superb-blocks'),
186 'wp_template_part' => __('Edit in Template Part', 'superb-blocks'),
187 'wp_block' => __('Edit in Pattern', 'superb-blocks'),
188 );
189 return isset($edit_labels[$source_post_type]) ? $edit_labels[$source_post_type] : __('Edit', 'superb-blocks');
190 }
191
192 /**
193 * Extract the short reference from a block ID.
194 * Returns the portion after the last underscore or hyphen.
195 */
196 private static function GetShortRef($id)
197 {
198 if (empty($id)) {
199 return $id;
200 }
201 $last_underscore = strrpos($id, '_');
202 $last_hyphen = strrpos($id, '-');
203 $pos = false;
204 if ($last_underscore !== false && $last_hyphen !== false) {
205 $pos = $last_underscore > $last_hyphen ? $last_underscore : $last_hyphen;
206 } elseif ($last_underscore !== false) {
207 $pos = $last_underscore;
208 } elseif ($last_hyphen !== false) {
209 $pos = $last_hyphen;
210 }
211 if ($pos === false) {
212 return $id;
213 }
214 return substr($id, $pos + 1);
215 }
216
217 private function LoadFormsList()
218 {
219 $registry = FormRegistry::GetAll();
220 $form_ids_with_submissions = FormSubmissionHandler::GetDistinctFormIds();
221
222 // Merge: all registry forms + any submission-only forms not in registry
223 $all_form_ids = array_unique(array_merge(array_keys($registry), $form_ids_with_submissions));
224
225 foreach ($all_form_ids as $fid) {
226 $count = FormSubmissionHandler::GetCount($fid);
227 $last_date = FormSubmissionHandler::GetLastSubmissionDate($fid);
228 $entry = isset($registry[$fid]) ? $registry[$fid] : null;
229
230 $this->forms[] = array(
231 'form_id' => $fid,
232 'form_name' => FormRegistry::GetName($fid),
233 'total' => $count['total'],
234 'new' => $count['new'],
235 'last_date' => $last_date,
236 'source_post_id' => ($entry && isset($entry['source_post_id'])) ? $entry['source_post_id'] : null,
237 'source_post_type' => ($entry && isset($entry['source_post_type'])) ? $entry['source_post_type'] : null,
238 'pending_delete' => ($entry && !empty($entry['pending_delete'])),
239 'actions' => self::GetFormActionStatuses($fid),
240 'spam_count' => FormSubmissionHandler::GetSpamCount($fid),
241 );
242 }
243
244 // Compute aggregate stats for the welcome strip
245 $this->total_forms = count($this->forms);
246 foreach ($this->forms as $form) {
247 $this->total_submissions += $form['total'];
248 $this->total_unread += $form['new'];
249 }
250 }
251
252 private function Render()
253 {
254 if ($this->is_single_form) {
255 $this->RenderSingleForm();
256 } else {
257 $this->RenderFormsList();
258 }
259 new Modal();
260 }
261
262 private function RenderIncompatible()
263 {
264 ?>
265 <div class="superbaddons-admindashboard-content-box-large spbaddons-form-submissions-page">
266 <div class="spbaddons-form-submissions-empty">
267 <img src="<?php echo esc_url(SUPERBADDONS_ASSETS_PATH . '/img/icon-superb.svg'); ?>" alt="" aria-hidden="true" />
268 <h3 class="superbaddons-element-text-md superbaddons-element-text-800 superbaddons-element-text-dark"><?php echo esc_html__('WordPress Update Required', 'superb-blocks'); ?></h3>
269 <p class="superbaddons-element-text-xs superbaddons-element-text-gray"><?php
270 echo esc_html(sprintf(
271 /* translators: %s: minimum WordPress version number */
272 __('Forms require WordPress %s or later. Please update WordPress to use the form blocks and view submissions.', 'superb-blocks'),
273 GutenbergController::MINIMUM_WORDPRESS_VERSION
274 ));
275 ?></p>
276 <a href="<?php echo esc_url(admin_url('update-core.php')); ?>" class="superbaddons-element-button spbaddons-admin-btn-primary"><?php echo esc_html__('Update WordPress', 'superb-blocks'); ?></a>
277 </div>
278 </div>
279 <?php
280 }
281
282 private function RenderNotFound()
283 {
284 ?>
285 <div class="superbaddons-admindashboard-content-box-large spbaddons-form-submissions-page">
286 <div class="spbaddons-form-submissions-header">
287 <a href="<?php echo esc_url(admin_url('admin.php?page=' . DashboardController::FORMS)); ?>" class="spbaddons-form-submissions-back superbaddons-element-text-xs">
288 <img class="superbaddons-element-button-icon" src="<?php echo esc_url(SUPERBADDONS_ASSETS_PATH . '/img/purple-arrow-left.svg'); ?>" alt="" aria-hidden="true" />
289 <?php echo esc_html__('All Forms', 'superb-blocks'); ?>
290 </a>
291 </div>
292 <div class="spbaddons-form-submissions-empty">
293 <img src="<?php echo esc_url(SUPERBADDONS_ASSETS_PATH . '/img/icon-superb.svg'); ?>" alt="" aria-hidden="true" />
294 <h3 class="superbaddons-element-text-md superbaddons-element-text-800 superbaddons-element-text-dark"><?php echo esc_html__('Form not found', 'superb-blocks'); ?></h3>
295 <p class="superbaddons-element-text-xs superbaddons-element-text-gray"><?php echo esc_html__('The form you are looking for does not exist or has been deleted.', 'superb-blocks'); ?></p>
296 <a href="<?php echo esc_url(admin_url('admin.php?page=' . DashboardController::FORMS)); ?>" class="superbaddons-element-button spbaddons-admin-btn-primary"><?php echo esc_html__('View All Forms', 'superb-blocks'); ?></a>
297 </div>
298 </div>
299 <?php
300 }
301
302 private function RenderFormsList()
303 {
304 ?>
305 <!-- Welcome / Status Strip -->
306 <div class="superbaddons-dashboard-welcome-strip">
307 <span class="superbaddons-dashboard-welcome-title"><?php echo esc_html__('Forms', 'superb-blocks'); ?> <span class="spbaddons-live-dot" title="<?php echo esc_attr__('Live monitoring active', 'superb-blocks'); ?>"></span></span>
308 <div class="superbaddons-dashboard-stat-items">
309 <span class="superbaddons-dashboard-stat-item">
310 <span class="superbaddons-status-dot superbaddons-status-dot--purple"></span>
311 <?php echo esc_html(sprintf(
312 /* translators: %d: number of forms */
313 _n('%d Form', '%d Forms', $this->total_forms, 'superb-blocks'),
314 $this->total_forms
315 )); ?>
316 </span>
317 <span class="superbaddons-dashboard-stat-item">
318 <span class="superbaddons-status-dot <?php echo $this->total_submissions > 0 ? 'superbaddons-status-dot--green' : 'superbaddons-status-dot--gray'; ?>"></span>
319 <?php echo esc_html(sprintf(
320 /* translators: %d: number of submissions */
321 _n('%d Submission', '%d Submissions', $this->total_submissions, 'superb-blocks'),
322 $this->total_submissions
323 )); ?>
324 </span>
325 <span class="superbaddons-dashboard-stat-item">
326 <span class="superbaddons-status-dot <?php echo $this->total_unread > 0 ? 'superbaddons-status-dot--purple' : 'superbaddons-status-dot--gray'; ?>"></span>
327 <?php echo esc_html(sprintf(
328 /* translators: %d: number of unread submissions */
329 __('%d Unread', 'superb-blocks'),
330 $this->total_unread
331 )); ?>
332 </span>
333 </div>
334 </div>
335
336 <!-- Sidebar Layout -->
337 <div class="superbaddons-admindashboard-sidebarlayout">
338 <div class="superbaddons-admindashboard-sidebarlayout-left">
339 <div class="superbaddons-settings-section">
340 <?php if (empty($this->forms)) : ?>
341 <div class="spbaddons-form-submissions-empty">
342 <h3 class="superbaddons-element-text-md superbaddons-element-text-800 superbaddons-element-text-dark"><?php echo esc_html__('No forms yet', 'superb-blocks'); ?></h3>
343 <p class="superbaddons-element-text-xs superbaddons-element-text-gray"><?php echo esc_html__('Create a form by adding a Superb Form block to any page, post, or template.', 'superb-blocks'); ?></p>
344 <div class="spbaddons-form-empty-actions">
345 <div class="spbaddons-form-empty-action-card">
346 <img src="<?php echo esc_url(SUPERBADDONS_ASSETS_PATH . '/img/purple-note.svg'); ?>" alt="" aria-hidden="true" />
347 <span><?php echo esc_html__('Create in a Page', 'superb-blocks'); ?></span>
348 <a href="<?php echo esc_url(admin_url('edit.php?post_type=page')); ?>" class="superbaddons-element-button superbaddons-element-button-sm"><?php echo esc_html__('View Pages', 'superb-blocks'); ?></a>
349 </div>
350 <div class="spbaddons-form-empty-action-card">
351 <img src="<?php echo esc_url(SUPERBADDONS_ASSETS_PATH . '/img/purple-note.svg'); ?>" alt="" aria-hidden="true" />
352 <span><?php echo esc_html__('Create in a Post', 'superb-blocks'); ?></span>
353 <a href="<?php echo esc_url(admin_url('edit.php')); ?>" class="superbaddons-element-button superbaddons-element-button-sm"><?php echo esc_html__('View Posts', 'superb-blocks'); ?></a>
354 </div>
355 <div class="spbaddons-form-empty-action-card">
356 <img src="<?php echo esc_url(SUPERBADDONS_ASSETS_PATH . '/img/purple-image.svg'); ?>" alt="" aria-hidden="true" />
357 <span><?php echo esc_html__('Create in a Template', 'superb-blocks'); ?></span>
358 <a href="<?php echo esc_url(admin_url('site-editor.php?path=/wp_template')); ?>" class="superbaddons-element-button superbaddons-element-button-sm"><?php echo esc_html__('View Templates', 'superb-blocks'); ?></a>
359 </div>
360 </div>
361 <p class="superbaddons-element-text-xxs superbaddons-element-text-gray"><?php echo esc_html__('Forms will appear here automatically once saved. Make sure you have the "Save submissions" option enabled in your form block settings if you want to manage submissions here.', 'superb-blocks'); ?></p>
362 </div>
363 <?php else : ?>
364 <p class="superbaddons-element-text-xs superbaddons-element-text-gray superbaddons-help-text-inline"><?php echo esc_html__('View and manage submissions from your forms. Forms appear here after saving a page that contains a form block, or after receiving a submission.', 'superb-blocks'); ?></p>
365 <div class="spbaddons-forms-grid">
366 <?php foreach ($this->forms as $form) :
367 $has_new = $form['new'] > 0;
368 $last_date_display = '';
369 if (!empty($form['last_date'])) {
370 $last_date_display = esc_html(sprintf(
371 /* translators: %s: human-readable time difference */
372 __('Last submission: %s ago', 'superb-blocks'),
373 human_time_diff(strtotime($form['last_date']), current_time('timestamp'))
374 ));
375 } else {
376 $last_date_display = esc_html__('No submissions yet', 'superb-blocks');
377 }
378 ?>
379 <div class="spbaddons-form-card<?php echo $has_new ? ' spbaddons-form-card--has-new' : ''; ?>">
380 <div class="spbaddons-form-card-header">
381 <img class="spbaddons-form-card-icon" src="<?php echo esc_url(SUPERBADDONS_ASSETS_PATH . '/img/icon-form.svg'); ?>" alt="" aria-hidden="true" />
382 <h3 class="spbaddons-form-card-name superbaddons-element-text-sm superbaddons-element-text-800 superbaddons-element-text-dark superbaddons-element-m0"><?php echo esc_html($form['form_name']); ?></h3>
383 <span class="spbaddons-form-card-ref">#<?php echo esc_html(self::GetShortRef($form['form_id'])); ?></span>
384 </div>
385 <?php if ($form['pending_delete']) : ?>
386 <span class="spbaddons-form-card-pending-badge"><?php echo esc_html__('Form Block Removed', 'superb-blocks'); ?></span>
387 <?php endif; ?>
388 <?php if ($form['actions']['store_enabled'] || $form['total'] > 0) : ?>
389 <div class="spbaddons-form-card-stats">
390 <div class="spbaddons-form-card-stat">
391 <span class="spbaddons-form-card-stat-number"><?php echo esc_html($form['total']); ?></span>
392 <span class="spbaddons-form-card-stat-label"><?php echo esc_html__('Total', 'superb-blocks'); ?></span>
393 </div>
394 <div class="spbaddons-form-card-stat">
395 <span class="spbaddons-form-card-stat-number<?php echo $has_new ? ' spbaddons-form-card-stat-number--unread' : ''; ?>"><?php echo esc_html($form['new']); ?></span>
396 <span class="spbaddons-form-card-stat-label"><?php echo esc_html__('Unread', 'superb-blocks'); ?></span>
397 </div>
398 </div>
399 <?php if ($form['spam_count'] > 0) : ?>
400 <span class="spbaddons-form-card-spam-badge"><?php echo esc_html(sprintf(
401 /* translators: %d: number of blocked submissions */
402 _n('%d blocked', '%d blocked', $form['spam_count'], 'superb-blocks'),
403 $form['spam_count']
404 )); ?></span>
405 <?php endif; ?>
406 <p class="spbaddons-form-card-activity superbaddons-element-text-xxs superbaddons-element-text-gray superbaddons-element-m0"><?php echo esc_html($last_date_display); ?></p>
407 <?php endif; ?>
408 <?php if (!$form['pending_delete']) : ?>
409 <div class="spbaddons-form-action-statuses">
410 <span class="spbaddons-form-action-status <?php echo $form['actions']['store_enabled'] ? 'spbaddons-form-action-status--on' : 'spbaddons-form-action-status--off'; ?>">
411 <?php echo esc_html__('Save Submissions', 'superb-blocks'); ?>
412 </span>
413 <span class="spbaddons-form-action-status <?php echo $form['actions']['email_enabled'] ? 'spbaddons-form-action-status--on' : 'spbaddons-form-action-status--off'; ?>">
414 <?php echo esc_html__('Admin Notification', 'superb-blocks'); ?>
415 </span>
416 <span class="spbaddons-form-action-status <?php echo $form['actions']['send_confirmation'] ? 'spbaddons-form-action-status--on' : 'spbaddons-form-action-status--off'; ?>">
417 <?php echo esc_html__('User Notification', 'superb-blocks'); ?>
418 </span>
419 <?php if ($form['actions']['mailchimp_status']) : ?>
420 <span class="spbaddons-form-action-status <?php echo $form['actions']['mailchimp_status'] === 'on' ? 'spbaddons-form-action-status--on' : 'spbaddons-form-action-status--warn'; ?>">
421 <?php echo esc_html__('Mailchimp', 'superb-blocks'); ?>
422 </span>
423 <?php endif; ?>
424 <?php if ($form['actions']['brevo_status']) : ?>
425 <span class="spbaddons-form-action-status <?php echo $form['actions']['brevo_status'] === 'on' ? 'spbaddons-form-action-status--on' : 'spbaddons-form-action-status--warn'; ?>">
426 <?php echo esc_html__('Brevo', 'superb-blocks'); ?>
427 </span>
428 <?php endif; ?>
429 <?php if ($form['actions']['webhook_status']) : ?>
430 <span class="spbaddons-form-action-status <?php echo $form['actions']['webhook_status'] === 'on' ? 'spbaddons-form-action-status--on' : 'spbaddons-form-action-status--warn'; ?>">
431 <?php echo esc_html__('Webhook', 'superb-blocks'); ?>
432 </span>
433 <?php endif; ?>
434 <?php if ($form['actions']['google_sheets_status']) : ?>
435 <span class="spbaddons-form-action-status <?php echo $form['actions']['google_sheets_status'] === 'on' ? 'spbaddons-form-action-status--on' : 'spbaddons-form-action-status--warn'; ?>">
436 <?php echo esc_html__('Google Sheets', 'superb-blocks'); ?>
437 </span>
438 <?php endif; ?>
439 <?php if ($form['actions']['slack_status']) : ?>
440 <span class="spbaddons-form-action-status <?php echo $form['actions']['slack_status'] === 'on' ? 'spbaddons-form-action-status--on' : 'spbaddons-form-action-status--warn'; ?>">
441 <?php echo esc_html__('Slack', 'superb-blocks'); ?>
442 </span>
443 <?php endif; ?>
444 </div>
445 <?php elseif ($form['pending_delete']) : ?>
446 <p class="spbaddons-form-action-bar-notice superbaddons-element-m0 spbaddons-form-action-bar-notice--warn">
447 <?php echo esc_html__('This form block no longer exists on your site. You can still view and manage existing submissions. If all submissions are deleted, this form will be removed automatically.', 'superb-blocks'); ?>
448 </p>
449 <?php elseif (empty($form['source_post_id'])) : ?>
450 <p class="spbaddons-form-action-bar-notice superbaddons-element-m0">
451 <?php echo esc_html__('This form is not currently linked to any page, post, or template.', 'superb-blocks'); ?>
452 </p>
453 <?php endif; ?>
454 <div class="spbaddons-form-card-actions">
455 <a href="<?php echo esc_url(admin_url('admin.php?page=' . DashboardController::FORMS . '&form_id=' . urlencode($form['form_id']))); ?>" class="spbaddons-form-card-link">
456 <?php echo esc_html__('View Details', 'superb-blocks'); ?>
457 <img class="superbaddons-element-button-icon" src="<?php echo esc_url(SUPERBADDONS_ASSETS_PATH . '/img/purple-arrow-right.svg'); ?>" alt="" aria-hidden="true" />
458 </a>
459 <?php
460 $edit_url = !empty($form['source_post_id']) ? get_edit_post_link(intval($form['source_post_id']), 'raw') : '';
461 if ($edit_url) : ?>
462 <a href="<?php echo esc_url($edit_url); ?>" class="spbaddons-form-card-link spbaddons-form-card-link--secondary">
463 <?php echo esc_html(self::GetEditLabel($form['source_post_type'])); ?>
464 </a>
465 <?php endif; ?>
466 </div>
467 </div>
468 <?php endforeach; ?>
469 <div class="superbaddons-dashboard-suggest-card">
470 <img src="<?php echo esc_url(SUPERBADDONS_ASSETS_PATH . '/img/purple-bulb.svg'); ?>" alt="" aria-hidden="true" />
471 <div class="superbaddons-dashboard-suggest-card-content">
472 <strong class="superbaddons-element-text-xxs superbaddons-element-text-dark"><?php echo esc_html__('Missing a feature?', 'superb-blocks'); ?></strong>
473 <p class="superbaddons-element-text-xxs superbaddons-element-text-gray superbaddons-element-m0"><?php echo esc_html__('Let us know how we can improve our forms.', 'superb-blocks'); ?></p>
474 </div>
475 <a href="<?php echo esc_url(AdminLinkUtil::GetLink(AdminLinkSource::DEFAULT, array("url" => "https://superbthemes.com/contact/", "anchor" => "create-ticket"))); ?>" target="_blank" class="superbaddons-element-colorlink superbaddons-element-text-xxs"><?php echo esc_html__('Request Feature', 'superb-blocks'); ?> &rarr;</a>
476 </div>
477 </div>
478 <?php endif; ?>
479 </div>
480 </div>
481 <div class="superbaddons-admindashboard-sidebarlayout-right">
482 <?php
483 self::RenderAccessControlNotice();
484 if (!KeyController::HasValidPremiumKey()) {
485 new PremiumBox(AdminLinkSource::FORMS);
486 } else {
487 new SupportBox();
488 }
489 ?>
490 </div>
491 </div>
492 <?php
493 }
494
495 private function RenderSingleForm()
496 {
497 $stats = $this->form_stats;
498 $actions = self::GetFormActionStatuses($this->form_id);
499 $pending_delete = $this->form_entry && !empty($this->form_entry['pending_delete']);
500 $has_source = $this->form_entry && !empty($this->form_entry['source_post_id']);
501 $edit_url = $has_source ? get_edit_post_link(intval($this->form_entry['source_post_id']), 'raw') : '';
502 new EncryptionNotice();
503 ?>
504 <!-- Welcome / Status Strip -->
505 <div class="superbaddons-dashboard-welcome-strip">
506 <span class="superbaddons-dashboard-welcome-title"><?php echo esc_html($this->form_name); ?> <span class="spbaddons-form-title-ref">#<?php echo esc_html(self::GetShortRef($this->form_id)); ?></span> <?php if (!$pending_delete) : ?><span class="spbaddons-live-dot" title="<?php echo esc_attr__('Live monitoring active', 'superb-blocks'); ?>"></span><?php endif; ?><?php if ($edit_url) : ?> <a href="<?php echo esc_url($edit_url); ?>" class="spbaddons-form-title-edit"><?php echo esc_html(self::GetEditLabel($this->form_entry['source_post_type'])); ?></a><?php endif; ?></span>
507 <div class="superbaddons-dashboard-stat-items">
508 <span class="superbaddons-dashboard-stat-item">
509 <span class="superbaddons-status-dot <?php echo $actions['store_enabled'] ? 'superbaddons-status-dot--green' : 'superbaddons-status-dot--gray'; ?>"></span>
510 <?php echo esc_html__('Save Submissions:', 'superb-blocks'); ?> <?php echo $actions['store_enabled'] ? esc_html__('On', 'superb-blocks') : esc_html__('Off', 'superb-blocks'); ?>
511 </span>
512 <span class="superbaddons-dashboard-stat-item">
513 <span class="superbaddons-status-dot <?php echo $actions['email_enabled'] ? 'superbaddons-status-dot--green' : 'superbaddons-status-dot--gray'; ?>"></span>
514 <?php echo esc_html__('Admin Email:', 'superb-blocks'); ?> <?php echo $actions['email_enabled'] ? esc_html__('On', 'superb-blocks') : esc_html__('Off', 'superb-blocks'); ?>
515 </span>
516 <span class="superbaddons-dashboard-stat-item">
517 <span class="superbaddons-status-dot <?php echo $actions['send_confirmation'] ? 'superbaddons-status-dot--green' : 'superbaddons-status-dot--gray'; ?>"></span>
518 <?php echo esc_html__('User Email:', 'superb-blocks'); ?> <?php echo $actions['send_confirmation'] ? esc_html__('On', 'superb-blocks') : esc_html__('Off', 'superb-blocks'); ?>
519 </span>
520 <?php if ($actions['mailchimp_status']) : ?>
521 <span class="superbaddons-dashboard-stat-item">
522 <span class="superbaddons-status-dot <?php echo $actions['mailchimp_status'] === 'on' ? 'superbaddons-status-dot--green' : 'superbaddons-status-dot--yellow'; ?>"></span>
523 <?php echo esc_html__('Mailchimp:', 'superb-blocks'); ?> <?php echo $actions['mailchimp_status'] === 'on' ? esc_html__('On', 'superb-blocks') : esc_html__('Misconfigured', 'superb-blocks'); ?>
524 </span>
525 <?php endif; ?>
526 <?php if ($actions['brevo_status']) : ?>
527 <span class="superbaddons-dashboard-stat-item">
528 <span class="superbaddons-status-dot <?php echo $actions['brevo_status'] === 'on' ? 'superbaddons-status-dot--green' : 'superbaddons-status-dot--yellow'; ?>"></span>
529 <?php echo esc_html__('Brevo:', 'superb-blocks'); ?> <?php echo $actions['brevo_status'] === 'on' ? esc_html__('On', 'superb-blocks') : esc_html__('Misconfigured', 'superb-blocks'); ?>
530 </span>
531 <?php endif; ?>
532 <?php if ($actions['webhook_status']) : ?>
533 <span class="superbaddons-dashboard-stat-item">
534 <span class="superbaddons-status-dot <?php echo $actions['webhook_status'] === 'on' ? 'superbaddons-status-dot--green' : 'superbaddons-status-dot--yellow'; ?>"></span>
535 <?php echo esc_html__('Webhook:', 'superb-blocks'); ?> <?php echo $actions['webhook_status'] === 'on' ? esc_html__('On', 'superb-blocks') : esc_html__('Misconfigured', 'superb-blocks'); ?>
536 </span>
537 <?php endif; ?>
538 <?php if ($actions['google_sheets_status']) : ?>
539 <span class="superbaddons-dashboard-stat-item">
540 <span class="superbaddons-status-dot <?php echo $actions['google_sheets_status'] === 'on' ? 'superbaddons-status-dot--green' : 'superbaddons-status-dot--yellow'; ?>"></span>
541 <?php echo esc_html__('Google Sheets:', 'superb-blocks'); ?> <?php echo $actions['google_sheets_status'] === 'on' ? esc_html__('On', 'superb-blocks') : esc_html__('Misconfigured', 'superb-blocks'); ?>
542 </span>
543 <?php endif; ?>
544 <?php if ($actions['slack_status']) : ?>
545 <span class="superbaddons-dashboard-stat-item">
546 <span class="superbaddons-status-dot <?php echo $actions['slack_status'] === 'on' ? 'superbaddons-status-dot--green' : 'superbaddons-status-dot--yellow'; ?>"></span>
547 <?php echo esc_html__('Slack:', 'superb-blocks'); ?> <?php echo $actions['slack_status'] === 'on' ? esc_html__('On', 'superb-blocks') : esc_html__('Misconfigured', 'superb-blocks'); ?>
548 </span>
549 <?php endif; ?>
550 </div>
551 </div>
552
553 <!-- Notices Area -->
554 <div class="spbaddons-form-notices">
555 <?php if (!$pending_delete) : ?>
556 <?php if (!$actions['store_enabled']) : ?>
557 <p class="spbaddons-form-action-bar-notice">
558 <?php echo esc_html__('Saving submissions is currently disabled for this form. If you\'d like to store and manage submissions here, you can enable "Save submissions" in the form block settings.', 'superb-blocks'); ?>
559 </p>
560 <?php endif; ?>
561 <?php if ($actions['mailchimp_status'] === 'no_api_key') : ?>
562 <p class="spbaddons-form-action-bar-notice spbaddons-form-action-bar-notice--warn">
563 <?php echo esc_html__('Mailchimp is enabled but no API key has been configured. Add your API key in the form block integration settings.', 'superb-blocks'); ?>
564 </p>
565 <?php elseif ($actions['mailchimp_status'] === 'no_lists') : ?>
566 <p class="spbaddons-form-action-bar-notice spbaddons-form-action-bar-notice--warn">
567 <?php echo esc_html__('Mailchimp is enabled but no audience has been selected. Select an audience in the form block integration settings.', 'superb-blocks'); ?>
568 </p>
569 <?php endif; ?>
570 <?php if ($actions['brevo_status'] === 'no_api_key') : ?>
571 <p class="spbaddons-form-action-bar-notice spbaddons-form-action-bar-notice--warn">
572 <?php echo esc_html__('Brevo is enabled but no API key has been configured. Add your API key in the form block integration settings.', 'superb-blocks'); ?>
573 </p>
574 <?php elseif ($actions['brevo_status'] === 'no_lists') : ?>
575 <p class="spbaddons-form-action-bar-notice spbaddons-form-action-bar-notice--warn">
576 <?php echo esc_html__('Brevo is enabled but no contact list has been selected. Select a list in the form block integration settings.', 'superb-blocks'); ?>
577 </p>
578 <?php endif; ?>
579 <?php if ($actions['webhook_status'] === 'no_url') : ?>
580 <p class="spbaddons-form-action-bar-notice spbaddons-form-action-bar-notice--warn">
581 <?php echo esc_html__('Webhook is enabled but no URL has been configured. Add a webhook URL in the form block settings.', 'superb-blocks'); ?>
582 </p>
583 <?php endif; ?>
584 <?php if ($actions['google_sheets_status'] === 'no_api_key') : ?>
585 <p class="spbaddons-form-action-bar-notice spbaddons-form-action-bar-notice--warn">
586 <?php echo esc_html__('Google Sheets is enabled but no Service Account key has been configured. Add your key in Settings.', 'superb-blocks'); ?>
587 </p>
588 <?php elseif ($actions['google_sheets_status'] === 'no_spreadsheet') : ?>
589 <p class="spbaddons-form-action-bar-notice spbaddons-form-action-bar-notice--warn">
590 <?php echo esc_html__('Google Sheets is enabled but no spreadsheet URL has been configured. Add a spreadsheet URL in the form block settings.', 'superb-blocks'); ?>
591 </p>
592 <?php endif; ?>
593 <?php if ($actions['slack_status'] === 'no_url') : ?>
594 <p class="spbaddons-form-action-bar-notice spbaddons-form-action-bar-notice--warn">
595 <?php echo esc_html__('Slack is enabled but no webhook URL has been configured. Add a Slack webhook URL in the form block settings.', 'superb-blocks'); ?>
596 </p>
597 <?php endif; ?>
598 <?php if ($actions['email_enabled'] && FormSubmissionHandler::HasRecentEmailFailures($this->form_id)) : ?>
599 <p class="spbaddons-form-action-bar-notice spbaddons-form-action-bar-notice--warn">
600 <?php echo esc_html__('Recent form emails failed to send. Please contact your hosting provider or install an SMTP plugin to set up email sending for your site. This notice will disappear automatically once emails are sent successfully.', 'superb-blocks'); ?>
601 </p>
602 <?php endif; ?>
603 <?php elseif ($pending_delete) : ?>
604 <p class="spbaddons-form-action-bar-notice spbaddons-form-action-bar-notice--warn">
605 <?php echo esc_html__('This form block no longer exists on your site. You can still view and manage existing submissions. If all submissions are deleted, this form will be removed automatically.', 'superb-blocks'); ?>
606 </p>
607 <?php elseif (!$has_source) : ?>
608 <p class="spbaddons-form-action-bar-notice">
609 <?php echo esc_html__('This form is not currently linked to any page, post, or template.', 'superb-blocks'); ?>
610 </p>
611 <?php endif; ?>
612 </div>
613
614 <!-- Sidebar Layout -->
615 <div class="superbaddons-admindashboard-sidebarlayout">
616 <div class="superbaddons-admindashboard-sidebarlayout-left">
617 <?php if ($actions['store_enabled'] || $stats['total'] > 0) : ?>
618 <div class="superbaddons-settings-section">
619 <!-- Stats Bar -->
620 <div class="spbaddons-form-stats-bar">
621 <button type="button" class="spbaddons-form-stat spbaddons-form-stat--clickable" data-stat-action="reset">
622 <span class="spbaddons-form-stat-number" id="spbaddons-stat-total"><?php echo esc_html($stats['total']); ?></span>
623 <span class="spbaddons-form-stat-label"><?php echo esc_html__('Total', 'superb-blocks'); ?></span>
624 </button>
625 <button type="button" class="spbaddons-form-stat spbaddons-form-stat--clickable" data-stat-action="unread">
626 <span class="spbaddons-form-stat-number<?php echo $stats['new'] > 0 ? ' spbaddons-form-stat-number--unread' : ''; ?>" id="spbaddons-stat-unread"><?php echo esc_html($stats['new']); ?></span>
627 <span class="spbaddons-form-stat-label"><?php echo esc_html__('Unread', 'superb-blocks'); ?></span>
628 </button>
629 <button type="button" class="spbaddons-form-stat spbaddons-form-stat--clickable" data-date-filter="today">
630 <span class="spbaddons-form-stat-number" id="spbaddons-stat-today"><?php echo esc_html($stats['today']); ?></span>
631 <span class="spbaddons-form-stat-label"><?php echo esc_html__('Today', 'superb-blocks'); ?></span>
632 </button>
633 <button type="button" class="spbaddons-form-stat spbaddons-form-stat--clickable" data-date-filter="this_week">
634 <span class="spbaddons-form-stat-number" id="spbaddons-stat-week"><?php echo esc_html($stats['this_week']); ?></span>
635 <span class="spbaddons-form-stat-label"><?php echo esc_html__('This Week', 'superb-blocks'); ?></span>
636 </button>
637 <?php
638 $spam_count = FormSubmissionHandler::GetSpamCount($this->form_id);
639 if ($spam_count > 0) : ?>
640 <div class="spbaddons-form-stat spbaddons-form-stat--spam">
641 <span class="spbaddons-form-stat-number spbaddons-form-stat-number--spam" id="spbaddons-stat-spam"><?php echo esc_html($spam_count); ?></span>
642 <span class="spbaddons-form-stat-label"><?php echo esc_html__('Blocked', 'superb-blocks'); ?></span>
643 </div>
644 <?php endif; ?>
645 </div>
646
647 <!-- Filter Bar -->
648 <div class="spbaddons-form-submissions-filter-bar">
649 <div class="spbaddons-form-submissions-filter-bar-left">
650 <div class="spbaddons-form-submissions-filter-tabs" role="tablist">
651 <button type="button" class="spbaddons-form-submissions-filter-tab spbaddons-form-submissions-filter-tab--active" data-filter="" role="tab" aria-selected="true">
652 <?php echo esc_html__('All', 'superb-blocks'); ?> <span class="spbaddons-form-submissions-filter-count" id="spbaddons-filter-count-all"><?php echo esc_html($stats['total']); ?></span>
653 </button>
654 <button type="button" class="spbaddons-form-submissions-filter-tab" data-filter="new" role="tab" aria-selected="false">
655 <?php echo esc_html__('Unread', 'superb-blocks'); ?> <span class="spbaddons-form-submissions-filter-count" id="spbaddons-filter-count-new"><?php echo esc_html($stats['new']); ?></span>
656 </button>
657 <button type="button" class="spbaddons-form-submissions-filter-tab" data-filter="read" role="tab" aria-selected="false">
658 <?php echo esc_html__('Read', 'superb-blocks'); ?> <span class="spbaddons-form-submissions-filter-count" id="spbaddons-filter-count-read"><?php echo esc_html($stats['total'] - $stats['new']); ?></span>
659 </button>
660 </div>
661 <button type="button" id="spbaddons-form-submissions-star-filter" class="spbaddons-form-submissions-star-filter" aria-label="<?php echo esc_attr__('Filter starred submissions', 'superb-blocks'); ?>" title="<?php echo esc_attr__('Starred', 'superb-blocks'); ?>">
662 <img class="spbaddons-star-icon-regular" src="<?php echo esc_url(SUPERBADDONS_ASSETS_PATH . '/img/purple-star-regular.svg'); ?>" alt="" aria-hidden="true" width="16" height="16" />
663 <img class="spbaddons-star-icon-fill" src="<?php echo esc_url(SUPERBADDONS_ASSETS_PATH . '/img/purple-star-fill.svg'); ?>" alt="" aria-hidden="true" width="16" height="16" style="display:none;" />
664 </button>
665 <div class="spbaddons-date-filter-wrap">
666 <button type="button" id="spbaddons-form-submissions-date-filter" class="spbaddons-date-filter-trigger" aria-label="<?php echo esc_attr__('Filter by date range', 'superb-blocks'); ?>" aria-expanded="false">
667 <span id="spbaddons-date-filter-label"><?php echo esc_html__('All Time', 'superb-blocks'); ?></span>
668 <svg class="spbaddons-date-filter-chevron" width="10" height="6" viewBox="0 0 10 6" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
669 <path d="M1 1L5 5L9 1" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" />
670 </svg>
671 </button>
672 </div>
673 </div>
674 <div class="spbaddons-form-submissions-filter-bar-right">
675 <input type="search" id="spbaddons-form-submissions-search" class="spbaddons-form-submissions-search" placeholder="<?php echo esc_attr__('Search submissions...', 'superb-blocks'); ?>" />
676 <?php if (!$pending_delete) : ?>
677 <?php /* We can't filter fields when the form is pending deletion as it has no config */ ?>
678 <div class="spbaddons-fields-wrap">
679 <button type="button" id="spbaddons-form-submissions-fields" class="superbaddons-element-button superbaddons-element-m0">
680 <img class="superbaddons-element-button-icon" src="<?php echo esc_url(SUPERBADDONS_ASSETS_PATH . '/img/purple-list-bullets.svg'); ?>" alt="" aria-hidden="true" />
681 <span><?php echo esc_html__('Fields', 'superb-blocks'); ?></span>
682 </button>
683 </div>
684 <?php endif; ?>
685 <button type="button" id="spbaddons-form-submissions-export" class="superbaddons-element-button superbaddons-element-m0">
686 <img class="superbaddons-element-button-icon" src="<?php echo esc_url(SUPERBADDONS_ASSETS_PATH . '/img/download-simple-duotone.svg'); ?>" alt="" aria-hidden="true" />
687 <span id="spbaddons-form-submissions-export-label"><?php echo esc_html__('Export', 'superb-blocks'); ?></span>
688 </button>
689 <!-- Export popover -->
690 <div id="spbaddons-form-submissions-export-popover" class="spbaddons-form-submissions-export-popover" style="display:none;">
691 <div id="spbaddons-form-submissions-export-scope" class="spbaddons-form-submissions-export-scope" style="display:none;">
692 <label class="spbaddons-form-submissions-export-scope-option">
693 <input type="radio" name="spbaddons_export_scope" value="filtered" checked />
694 <span id="spbaddons-form-submissions-export-scope-filtered-label"><?php echo esc_html__('Filtered results', 'superb-blocks'); ?></span>
695 </label>
696 <label class="spbaddons-form-submissions-export-scope-option">
697 <input type="radio" name="spbaddons_export_scope" value="all" />
698 <span><?php echo esc_html__('All submissions', 'superb-blocks'); ?></span>
699 </label>
700 </div>
701 <label class="spbaddons-form-submissions-export-popover-label spbaddons-checkbox-wrap" id="spbaddons-form-submissions-export-sensitive-wrap" style="display:none;">
702 <input type="checkbox" id="spbaddons-form-submissions-export-sensitive" />
703 <span class="spbaddons-checkbox-mark"><img src="<?php echo esc_url(SUPERBADDONS_ASSETS_PATH . '/img/checkmark.svg'); ?>" alt="" aria-hidden="true" /></span>
704 <span><?php echo esc_html__('Include sensitive fields', 'superb-blocks'); ?></span>
705 </label>
706 <label class="spbaddons-form-submissions-export-popover-label spbaddons-checkbox-wrap" id="spbaddons-form-submissions-export-notes-wrap" style="display:none;">
707 <input type="checkbox" id="spbaddons-form-submissions-export-notes" />
708 <span class="spbaddons-checkbox-mark"><img src="<?php echo esc_url(SUPERBADDONS_ASSETS_PATH . '/img/checkmark.svg'); ?>" alt="" aria-hidden="true" /></span>
709 <span><?php echo esc_html__('Include notes', 'superb-blocks'); ?></span>
710 </label>
711 <label class="spbaddons-form-submissions-export-popover-label spbaddons-checkbox-wrap" id="spbaddons-form-submissions-export-all-fields-wrap" style="display:none;">
712 <input type="checkbox" id="spbaddons-form-submissions-export-all-fields" />
713 <span class="spbaddons-checkbox-mark"><img src="<?php echo esc_url(SUPERBADDONS_ASSETS_PATH . '/img/checkmark.svg'); ?>" alt="" aria-hidden="true" /></span>
714 <span><?php echo esc_html__('Export all fields', 'superb-blocks'); ?></span>
715 </label>
716 <button type="button" id="spbaddons-form-submissions-export-download" class="superbaddons-element-button spbaddons-admin-btn-primary superbaddons-element-button-small superbaddons-element-m0">
717 <?php echo esc_html__('Download CSV', 'superb-blocks'); ?>
718 </button>
719 </div>
720 </div>
721 </div>
722
723 <!-- Contextual Bulk Actions Toolbar (hidden until selection) -->
724 <div id="spbaddons-form-submissions-toolbar" class="spbaddons-form-submissions-toolbar">
725 <div class="spbaddons-form-submissions-toolbar-top">
726 <span id="spbaddons-form-submissions-selected-count" class="spbaddons-form-submissions-selected-count"></span>
727 <span class="spbaddons-form-submissions-toolbar-sep">&middot;</span>
728 <button type="button" id="spbaddons-form-submissions-deselect" class="spbaddons-form-submissions-deselect"><?php echo esc_html__('Clear', 'superb-blocks'); ?></button>
729 </div>
730 <div class="spbaddons-form-submissions-toolbar-actions">
731 <div class="spbaddons-form-submissions-toolbar-group">
732 <button type="button" id="spbaddons-form-submissions-bulk-read" class="superbaddons-element-button superbaddons-element-button-sm">
733 <img class="superbaddons-element-button-icon" src="<?php echo esc_url(SUPERBADDONS_ASSETS_PATH . '/img/eye.svg'); ?>" alt="" aria-hidden="true" />
734 <?php echo esc_html__('Mark as Read', 'superb-blocks'); ?>
735 </button>
736 <button type="button" id="spbaddons-form-submissions-bulk-unread" class="superbaddons-element-button superbaddons-element-button-sm">
737 <img class="superbaddons-element-button-icon" src="<?php echo esc_url(SUPERBADDONS_ASSETS_PATH . '/img/eye-slash.svg'); ?>" alt="" aria-hidden="true" />
738 <?php echo esc_html__('Mark as Unread', 'superb-blocks'); ?>
739 </button>
740 </div>
741 <div class="spbaddons-form-submissions-toolbar-group">
742 <button type="button" id="spbaddons-form-submissions-bulk-star" class="superbaddons-element-button superbaddons-element-button-sm">
743 <img class="superbaddons-element-button-icon" src="<?php echo esc_url(SUPERBADDONS_ASSETS_PATH . '/img/purple-star-fill.svg'); ?>" alt="" aria-hidden="true" />
744 <?php echo esc_html__('Star', 'superb-blocks'); ?>
745 </button>
746 <button type="button" id="spbaddons-form-submissions-bulk-unstar" class="superbaddons-element-button superbaddons-element-button-sm">
747 <img class="superbaddons-element-button-icon" src="<?php echo esc_url(SUPERBADDONS_ASSETS_PATH . '/img/purple-star-regular.svg'); ?>" alt="" aria-hidden="true" />
748 <?php echo esc_html__('Unstar', 'superb-blocks'); ?>
749 </button>
750 </div>
751 <div class="spbaddons-form-submissions-toolbar-group">
752 <button type="button" id="spbaddons-form-submissions-bulk-delete" class="superbaddons-element-button superbaddons-element-button-sm spbaddons-admin-btn-danger">
753 <img class="superbaddons-element-button-icon" src="<?php echo esc_url(SUPERBADDONS_ASSETS_PATH . '/img/trash-light.svg'); ?>" alt="" aria-hidden="true" />
754 <?php echo esc_html__('Delete', 'superb-blocks'); ?>
755 </button>
756 </div>
757 </div>
758 </div>
759
760 <div id="spbaddons-form-submissions-table-wrapper" class="spbaddons-form-submissions-table-wrapper">
761 <table class="spbaddons-form-submissions-table" role="grid">
762 <thead>
763 <tr>
764 <th class="spbaddons-form-submissions-col-check" scope="col">
765 <label class="spbaddons-checkbox-wrap">
766 <input type="checkbox" id="spbaddons-form-submissions-select-all" aria-label="<?php echo esc_attr__('Select all submissions', 'superb-blocks'); ?>" />
767 <span class="spbaddons-checkbox-mark"><img src="<?php echo esc_url(SUPERBADDONS_ASSETS_PATH . '/img/checkmark.svg'); ?>" alt="" aria-hidden="true" /></span>
768 </label>
769 </th>
770 <th class="spbaddons-form-submissions-col-star" scope="col"></th>
771 <th class="spbaddons-form-submissions-col-primary superbaddons-element-text-xxs superbaddons-element-text-800" scope="col"><?php echo esc_html__('Submission', 'superb-blocks'); ?></th>
772 <th class="spbaddons-form-submissions-col-fields superbaddons-element-text-xxs superbaddons-element-text-800" scope="col"><?php echo esc_html__('Fields', 'superb-blocks'); ?></th>
773 <th class="spbaddons-form-submissions-col-actions superbaddons-element-text-xxs superbaddons-element-text-800" scope="col"></th>
774 </tr>
775 </thead>
776 <tbody id="spbaddons-form-submissions-tbody" aria-live="polite">
777 <!-- Populated by JS -->
778 </tbody>
779 </table>
780 <div id="spbaddons-form-submissions-loading" class="spbaddons-form-submissions-loading">
781 <!-- Skeleton rows populated by JS -->
782 </div>
783 <div id="spbaddons-form-submissions-empty" class="spbaddons-form-submissions-empty" style="display:none;">
784 <img src="<?php echo esc_url(SUPERBADDONS_ASSETS_PATH . '/img/icon-superb.svg'); ?>" alt="" aria-hidden="true" />
785 <p id="spbaddons-form-submissions-empty-text" class="superbaddons-element-text-sm superbaddons-element-text-gray"><?php echo esc_html__('No submissions found.', 'superb-blocks'); ?></p>
786 <button type="button" id="spbaddons-form-submissions-clear-filters" class="superbaddons-element-button superbaddons-element-button-sm" style="display:none;"><?php echo esc_html__('Clear filters', 'superb-blocks'); ?></button>
787 </div>
788 </div>
789
790 <div id="spbaddons-form-submissions-pagination" class="spbaddons-form-submissions-pagination" style="display:none;">
791 <button type="button" id="spbaddons-form-submissions-prev" class="superbaddons-element-button superbaddons-element-button-sm" disabled><img class="superbaddons-element-button-icon" src="<?php echo esc_url(SUPERBADDONS_ASSETS_PATH . '/img/caret-left.svg'); ?>" alt="" aria-hidden="true" /> <?php echo esc_html__('Previous', 'superb-blocks'); ?></button>
792 <span id="spbaddons-form-submissions-page-info" class="superbaddons-element-text-xs superbaddons-element-text-gray"></span>
793 <button type="button" id="spbaddons-form-submissions-next" class="superbaddons-element-button superbaddons-element-button-sm"><?php echo esc_html__('Next', 'superb-blocks'); ?> <img class="superbaddons-element-button-icon" src="<?php echo esc_url(SUPERBADDONS_ASSETS_PATH . '/img/caret-right.svg'); ?>" alt="" aria-hidden="true" /></button>
794 <select id="spbaddons-form-submissions-per-page" class="spbaddons-form-submissions-per-page" aria-label="<?php echo esc_attr__('Submissions per page', 'superb-blocks'); ?>">
795 <option value="20">20</option>
796 <option value="50">50</option>
797 <option value="100">100</option>
798 </select>
799 </div>
800 </div>
801 <?php endif; ?>
802
803 <!-- Danger Zone -->
804 <div class="superbaddons-danger-zone">
805 <h5 class="superbaddons-danger-zone-title">
806 <img class="superbaddons-admindashboard-content-icon superbaddons-element-mr1" src="<?php echo esc_url(SUPERBADDONS_ASSETS_PATH . '/img/color-warning-octagon.svg'); ?>" alt="" aria-hidden="true" />
807 <?php echo esc_html__('Danger Zone', 'superb-blocks'); ?>
808 </h5>
809 <div class="superbaddons-danger-zone-item">
810 <div class="superbaddons-danger-zone-item-info">
811 <strong><?php echo esc_html__('Delete Form', 'superb-blocks'); ?></strong>
812 <p><?php echo esc_html__('Permanently delete this form and all its submissions. This action cannot be undone.', 'superb-blocks'); ?></p>
813 </div>
814 <button type="button" id="spbaddons-form-delete" class="superbaddons-element-button spbaddons-admin-btn-danger superbaddons-element-button-sm" data-form-id="<?php echo esc_attr($this->form_id); ?>" <?php echo $has_source ? ' data-has-source="1" data-source-type="' . esc_attr($this->form_entry['source_post_type']) . '"' : ''; ?>>
815 <img class="superbaddons-element-button-icon" src="<?php echo esc_url(SUPERBADDONS_ASSETS_PATH . '/img/trash-light.svg'); ?>" alt="" aria-hidden="true" />
816 <?php echo esc_html__('Delete', 'superb-blocks'); ?>
817 </button>
818 </div>
819 </div>
820 </div>
821 <div class="superbaddons-admindashboard-sidebarlayout-right">
822 <?php self::RenderAccessControlNotice(); ?>
823 <!-- Keyboard Shortcuts Card -->
824 <div class="spbaddons-form-shortcuts-card">
825 <h5><?php echo esc_html__('Keyboard Shortcuts', 'superb-blocks'); ?></h5>
826 <p class="superbaddons-element-text-xxs superbaddons-element-text-gray"><?php echo esc_html__('Available when viewing a submission in the detail panel.', 'superb-blocks'); ?></p>
827 <ul class="spbaddons-form-shortcuts-list">
828 <li>
829 <span><?php echo esc_html__('Next submission', 'superb-blocks'); ?></span>
830 <kbd>J</kbd>
831 </li>
832 <li>
833 <span><?php echo esc_html__('Previous submission', 'superb-blocks'); ?></span>
834 <kbd>K</kbd>
835 </li>
836 <li>
837 <span><?php echo esc_html__('Close panel', 'superb-blocks'); ?></span>
838 <kbd>Esc</kbd>
839 </li>
840 </ul>
841 </div>
842 <?php
843 new ReviewBox();
844 new SupportBox();
845 ?>
846 </div>
847 </div>
848
849 <!-- Slide-in Detail Panel (fixed position, outside sidebar layout) -->
850 <div id="spbaddons-form-submissions-panel-overlay" class="spbaddons-form-submissions-panel-overlay" style="display:none;"></div>
851 <div id="spbaddons-form-submissions-panel" class="spbaddons-form-submissions-panel" style="display:none;" role="dialog" aria-modal="true" aria-label="<?php echo esc_attr__('Submission Details', 'superb-blocks'); ?>">
852 <div class="spbaddons-form-submissions-panel-header">
853 <div class="spbaddons-form-submissions-panel-header-left">
854 <button type="button" id="spbaddons-form-submissions-panel-prev" class="spbaddons-form-submissions-panel-nav" aria-label="<?php echo esc_attr__('Previous submission', 'superb-blocks'); ?>"><img src="<?php echo esc_url(SUPERBADDONS_ASSETS_PATH . '/img/caret-left.svg'); ?>" alt="" aria-hidden="true" /></button>
855 <span id="spbaddons-form-submissions-panel-counter" class="superbaddons-element-text-xs superbaddons-element-text-gray"></span>
856 <button type="button" id="spbaddons-form-submissions-panel-next" class="spbaddons-form-submissions-panel-nav" aria-label="<?php echo esc_attr__('Next submission', 'superb-blocks'); ?>"><img src="<?php echo esc_url(SUPERBADDONS_ASSETS_PATH . '/img/caret-right.svg'); ?>" alt="" aria-hidden="true" /></button>
857 </div>
858 <div class="spbaddons-form-submissions-panel-header-right">
859 <button type="button" id="spbaddons-form-submissions-panel-star" class="spbaddons-form-submissions-panel-star" aria-label="<?php echo esc_attr__('Star submission', 'superb-blocks'); ?>">
860 <img class="spbaddons-star-icon-regular" src="<?php echo esc_url(SUPERBADDONS_ASSETS_PATH . '/img/purple-star-regular.svg'); ?>" alt="" aria-hidden="true" width="18" height="18" />
861 <img class="spbaddons-star-icon-fill" src="<?php echo esc_url(SUPERBADDONS_ASSETS_PATH . '/img/purple-star-fill.svg'); ?>" alt="" aria-hidden="true" width="18" height="18" style="display:none;" />
862 </button>
863 <div class="spbaddons-form-submissions-panel-print-wrap">
864 <button type="button" id="spbaddons-form-submissions-panel-print" class="spbaddons-form-submissions-panel-print" aria-label="<?php echo esc_attr__('Print submission', 'superb-blocks'); ?>">
865 <img src="<?php echo esc_url(SUPERBADDONS_ASSETS_PATH . '/img/printer-duotone.svg'); ?>" alt="" aria-hidden="true" width="18" height="18" />
866 </button>
867 <!-- Print popover -->
868 <div id="spbaddons-form-submissions-print-popover" class="spbaddons-form-submissions-print-popover" style="display:none;">
869 <label class="spbaddons-form-submissions-print-popover-label spbaddons-checkbox-wrap" id="spbaddons-form-submissions-print-sensitive-wrap" style="display:none;">
870 <input type="checkbox" id="spbaddons-form-submissions-print-sensitive" />
871 <span class="spbaddons-checkbox-mark"><img src="<?php echo esc_url(SUPERBADDONS_ASSETS_PATH . '/img/checkmark.svg'); ?>" alt="" aria-hidden="true" /></span>
872 <span><?php echo esc_html__('Include sensitive fields (unmasked)', 'superb-blocks'); ?></span>
873 </label>
874 <label class="spbaddons-form-submissions-print-popover-label spbaddons-checkbox-wrap" id="spbaddons-form-submissions-print-notes-wrap" style="display:none;">
875 <input type="checkbox" id="spbaddons-form-submissions-print-notes" />
876 <span class="spbaddons-checkbox-mark"><img src="<?php echo esc_url(SUPERBADDONS_ASSETS_PATH . '/img/checkmark.svg'); ?>" alt="" aria-hidden="true" /></span>
877 <span><?php echo esc_html__('Include notes', 'superb-blocks'); ?></span>
878 </label>
879 <button type="button" id="spbaddons-form-submissions-print-go" class="superbaddons-element-button spbaddons-admin-btn-primary superbaddons-element-button-small superbaddons-element-m0">
880 <?php echo esc_html__('Print', 'superb-blocks'); ?>
881 </button>
882 </div>
883 </div>
884 <div class="spbaddons-form-submissions-panel-actions-wrap">
885 <button type="button" id="spbaddons-form-submissions-panel-more" class="spbaddons-form-submissions-panel-more" aria-label="<?php echo esc_attr__('More actions', 'superb-blocks'); ?>">
886 <img src="<?php echo esc_url(SUPERBADDONS_ASSETS_PATH . '/img/dots-three.svg'); ?>" alt="" aria-hidden="true" width="18" height="18" />
887 </button>
888 <!-- Actions popover -->
889 <div id="spbaddons-form-submissions-actions-popover" style="display:none;">
890 <button type="button" id="spbaddons-form-submissions-panel-toggle-read" class="superbaddons-element-button superbaddons-element-button-small superbaddons-element-m0 spbaddons-panel-action-btn">
891 <img class="superbaddons-element-button-icon" src="<?php echo esc_url(SUPERBADDONS_ASSETS_PATH . '/img/eye-slash.svg'); ?>" alt="" aria-hidden="true" />
892 <span><?php echo esc_html__('Mark as Unread', 'superb-blocks'); ?></span>
893 </button>
894 <button type="button" id="spbaddons-form-submissions-panel-resend-admin" class="superbaddons-element-button superbaddons-element-button-small superbaddons-element-m0 spbaddons-panel-action-btn" style="display:none;">
895 <img class="superbaddons-element-button-icon" src="<?php echo esc_url(SUPERBADDONS_ASSETS_PATH . '/img/arrow-clockwise-duotone.svg'); ?>" alt="" aria-hidden="true" />
896 <?php echo esc_html__('Resend Admin Email', 'superb-blocks'); ?>
897 </button>
898 <button type="button" id="spbaddons-form-submissions-panel-resend-user" class="superbaddons-element-button superbaddons-element-button-small superbaddons-element-m0 spbaddons-panel-action-btn" style="display:none;">
899 <img class="superbaddons-element-button-icon" src="<?php echo esc_url(SUPERBADDONS_ASSETS_PATH . '/img/arrow-clockwise-duotone.svg'); ?>" alt="" aria-hidden="true" />
900 <?php echo esc_html__('Resend User Email', 'superb-blocks'); ?>
901 </button>
902 <button type="button" id="spbaddons-form-submissions-panel-not-spam" class="superbaddons-element-button superbaddons-element-button-small superbaddons-element-m0 spbaddons-panel-action-btn" style="display:none;">
903 <img class="superbaddons-element-button-icon" src="<?php echo esc_url(SUPERBADDONS_ASSETS_PATH . '/img/eye.svg'); ?>" alt="" aria-hidden="true" />
904 <?php echo esc_html__('Not Spam', 'superb-blocks'); ?>
905 </button>
906 <button type="button" id="spbaddons-form-submissions-panel-delete" class="superbaddons-element-button superbaddons-element-button-small spbaddons-admin-btn-danger superbaddons-element-m0 spbaddons-panel-action-btn">
907 <img class="superbaddons-element-button-icon" src="<?php echo esc_url(SUPERBADDONS_ASSETS_PATH . '/img/trash-light.svg'); ?>" alt="" aria-hidden="true" />
908 <?php echo esc_html__('Delete Submission', 'superb-blocks'); ?>
909 </button>
910 </div>
911 </div>
912 <button type="button" id="spbaddons-form-submissions-panel-close" class="spbaddons-form-submissions-panel-close" aria-label="<?php echo esc_attr__('Close panel', 'superb-blocks'); ?>"><img src="<?php echo esc_url(SUPERBADDONS_ASSETS_PATH . '/img/x.svg'); ?>" alt="" aria-hidden="true" /></button>
913 </div>
914 </div>
915 <div class="spbaddons-form-submissions-panel-meta" id="spbaddons-form-submissions-panel-meta">
916 <!-- Date + status populated by JS -->
917 </div>
918 <div class="spbaddons-form-submissions-panel-fields" id="spbaddons-form-submissions-panel-fields">
919 <!-- Field key-value pairs populated by JS -->
920 </div>
921 <!-- Email / Integration Status (informational, populated by JS) -->
922 <div id="spbaddons-form-submissions-panel-email-status" class="spbaddons-form-submissions-panel-status-section" style="display:none;">
923 </div>
924 <div id="spbaddons-form-submissions-panel-integration-status" class="spbaddons-form-submissions-panel-status-section" style="display:none;">
925 </div>
926 <!-- Notes Section -->
927 <div class="spbaddons-form-submissions-panel-notes" id="spbaddons-form-submissions-panel-notes">
928 <div class="spbaddons-panel-notes-header">
929 <span class="spbaddons-panel-notes-title"><?php echo esc_html__('Notes', 'superb-blocks'); ?></span>
930 <span class="spbaddons-panel-notes-count" id="spbaddons-panel-notes-count"></span>
931 </div>
932 <div class="spbaddons-panel-notes-list" id="spbaddons-panel-notes-list">
933 <!-- Notes populated by JS -->
934 </div>
935 <div class="spbaddons-panel-notes-add">
936 <textarea id="spbaddons-panel-notes-input" class="spbaddons-panel-notes-input" placeholder="<?php echo esc_attr__('Add a note...', 'superb-blocks'); ?>" maxlength="1000" rows="2"></textarea>
937 <div class="spbaddons-panel-notes-add-footer">
938 <span class="spbaddons-panel-notes-chars" id="spbaddons-panel-notes-chars"></span>
939 <button type="button" id="spbaddons-panel-notes-submit" class="superbaddons-element-button spbaddons-admin-btn-primary superbaddons-element-button-sm" disabled>
940 <?php echo esc_html__('Add Note', 'superb-blocks'); ?>
941 </button>
942 </div>
943 </div>
944 </div>
945 </div>
946
947 <!-- Print-only container -->
948 <div id="spbaddons-form-submissions-print" class="spbaddons-form-submissions-print">
949 <div id="spbaddons-form-submissions-print-content"></div>
950 <div class="spbaddons-form-submissions-print-footer"><?php echo esc_html(home_url()); ?></div>
951 </div>
952 <?php
953 }
954 }
955