PluginProbe
Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder / 3.3.1
Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder v3.3.1
3.3.1 V-3.3.0 3.2.2 3.2.1 3.2.0 3.1.4 3.1.3 3.1.2 3.1.1 3.1.0 V3.0.3 V3.0.2 -3.0.1 V_3.0.0 1.1.1 1.1.8 1.2 1.3 1.4 1.4.18 1.5.2 1.9 2.0 2.10.0 2.10.1 All 138 releases
← All changes | includes/Admin/Admin_Bar.php +236 -79 2.03.3.1 View file →
@@ -1,8 +1,12 @@
1 1 <?php
2 2
3 3 namespace BitCode\BitForm\Admin;
4 4
5 +if (!defined('ABSPATH')) {
6 + exit;
7 +}
8 +
5 9 /**
6 10 * The admin menu and page handler class
7 11 */
8 12
@@ -7,24 +11,32 @@
7 11 */
8 12
9 13 use BitCode\BitForm\Core\Form\FormHandler;
10 14 use BitCode\BitForm\Core\Integration\IntegrationHandler;
15 +use BitCode\BitForm\Core\Integration\Integrations;
11 16 use BitCode\BitForm\Core\Util\DateTimeHelper;
12 17 use BitCode\BitForm\Core\Util\FileDownloadProvider;
13 18 use BitCode\BitForm\Core\Util\IpTool;
19 +use BitCode\BitForm\Core\Util\Utilities;
20 +use WP_Admin_Bar;
14 21
15 -class Admin_Bar {
22 +class Admin_Bar
23 +{
16 24 private static $fonts_url = [
17 - 'https://fonts.googleapis.com/css2?family=Outfit:wght@100;300;400;500;600;700&display=swap&famildy=Roboto:wght@300;400;500&display=swap',
25 + // 'https://fonts.googleapis.com/css2?family=Outfit:wght@100;300;400;500;600;700&display=swap&family=Roboto:wght@300;400;500&display=swap',
26 + 'https://fonts.googleapis.com/css2?family=DM+Sans:wght@100;200;300;400;500;600;700&display=swap',
18 27 'https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;500&display=swap',
19 28 ];
20 29
21 - public function register() {
30 + public function register()
31 + {
22 32 add_action('in_admin_header', [$this, 'AdminNotices']);
23 33 add_action('admin_menu', [$this, 'AdminMenu']);
24 34 add_action('admin_enqueue_scripts', [$this, 'AdminAssets']);
25 35 add_filter('style_loader_tag', [$this, 'linkTagFilter'], 0, 3);
26 36 add_filter('script_loader_tag', [$this, 'scriptTagFilter'], 0, 3);
37 + add_action('admin_bar_menu', [$this, 'AdminTopMenu'], 999);
38 + add_action('admin_enqueue_scripts', [$this, 'bitforms_enqueue_admin_styles']);
27 39 }
28 40
29 41 /**
30 42 * Register the admin menu
@@ -30,15 +42,17 @@
30 42 * Register the admin menu
31 43 *
32 44 * @return void
33 45 */
34 - public function AdminMenu() {
46 + public function AdminMenu()
47 + {
35 48 global $submenu;
36 49
37 50 $capability = apply_filters('bitforms_form_access_capability', 'manage_options');
51 + $menuTitle = Utilities::isProLicensed() ? 'Bit Form Pro' : 'Bit Form';
38 52 add_menu_page(
39 - __('Bit Form - Most advanced form builder and database management system', 'bit-form'),
40 - 'Bit Form',
53 + __('Bit Form - Most advanced form builder and entries management plugin', 'bit-form'),
54 + $menuTitle,
41 55 $capability,
42 56 'bitform',
43 57 [$this, 'RootPage'],
44 58 'data:image/svg+xml;base64,' . base64_encode('<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 163 163"><path fill="#fff" d="M106 0H57A57 57 0 000 57v49a57 57 0 0057 57h49a57 57 0 0057-57V57a57 57 0 00-57-57zM51 60v3l-1 59v12c0 5-3 8-8 6-2-1-3-4-3-6v-21-55a29 29 0 011-4 5 5 0 015-4h33a4 4 0 004-2c2-3 8-2 10-1a9 9 0 015 9 9 9 0 01-7 8c-3 1-6 0-9-3a3 3 0 00-1-1H51zm73 74c-6 5-12 6-20 6H72a8 8 0 01-4-1 5 5 0 01-2-6 5 5 0 015-3h35c11-1 20-10 21-20 0-11-8-20-18-23a6 6 0 00-1 0H78h-1v14l1 2h18a4 4 0 003-1c4-4 8-3 11-1 4 2 5 7 3 12-2 4-9 6-13 2a6 6 0 00-5-1H71c-3 0-5-2-5-6V82c0-4 1-5 5-6h17a21 21 0 0021-24c-1-9-8-16-16-18a25 25 0 00-6 0H46c-4 0-7-3-7-6s3-5 7-5h42a33 33 0 0132 23c2 11 0 20-6 29l-1 2 5 2c11 4 17 12 19 23 3 12-2 24-13 32z"/></svg>'),
@@ -44,13 +58,99 @@
44 58 'data:image/svg+xml;base64,' . base64_encode('<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 163 163"><path fill="#fff" d="M106 0H57A57 57 0 000 57v49a57 57 0 0057 57h49a57 57 0 0057-57V57a57 57 0 00-57-57zM51 60v3l-1 59v12c0 5-3 8-8 6-2-1-3-4-3-6v-21-55a29 29 0 011-4 5 5 0 015-4h33a4 4 0 004-2c2-3 8-2 10-1a9 9 0 015 9 9 9 0 01-7 8c-3 1-6 0-9-3a3 3 0 00-1-1H51zm73 74c-6 5-12 6-20 6H72a8 8 0 01-4-1 5 5 0 01-2-6 5 5 0 015-3h35c11-1 20-10 21-20 0-11-8-20-18-23a6 6 0 00-1 0H78h-1v14l1 2h18a4 4 0 003-1c4-4 8-3 11-1 4 2 5 7 3 12-2 4-9 6-13 2a6 6 0 00-5-1H71c-3 0-5-2-5-6V82c0-4 1-5 5-6h17a21 21 0 0021-24c-1-9-8-16-16-18a25 25 0 00-6 0H46c-4 0-7-3-7-6s3-5 7-5h42a33 33 0 0132 23c2 11 0 20-6 29l-1 2 5 2c11 4 17 12 19 23 3 12-2 24-13 32z"/></svg>'),
45 59 56
46 60 );
47 61 if (current_user_can($capability)) {
48 - $submenu['bitform'][] = [__('All Forms', 'bit-form'), $capability, 'admin.php?page=bitform#/'];
62 + $entriesCount = '';
63 + // if (self::countUnreadEntries()) {
64 + // $entriesCount = ' <span class="update-plugins">' . self::countUnreadEntries() . '</span>';
65 + // }
66 +
67 + $submenu['bitform'][] = [__('All Forms', 'bit-form') . $entriesCount, $capability, 'admin.php?page=bitform#/'];
68 + $submenu['bitform'][] = [__('Form Templates', 'bit-form') . '<span class="bf-template-new-badge">New</span>', $capability, 'admin.php?page=bitform#/form-templates'];
69 + $submenu['bitform'][] = [__('App Settings', 'bit-form'), $capability, 'admin.php?page=bitform#/app-settings/general'];
70 + $submenu['bitform'][] = [__('Integrations', 'bit-form'), $capability, 'admin.php?page=bitform#/app-settings/integrations'];
71 + $submenu['bitform'][] = [__('SMTP', 'bit-form'), $capability, 'admin.php?page=bitform#/app-settings/smtp'];
72 + $submenu['bitform'][] = [__('PDF Setting', 'bit-form'), $capability, 'admin.php?page=bitform#/app-settings/pdf'];
73 + $submenu['bitform'][] = [__('CPT', 'bit-form'), $capability, 'admin.php?page=bitform#/app-settings/cpt'];
74 + $submenu['bitform'][] = [__('Bit Form API', 'bit-form'), $capability, 'admin.php?page=bitform#/app-settings/api'];
75 + $submenu['bitform'][] = [__('Payments', 'bit-form'), $capability, 'admin.php?page=bitform#/app-settings/payments'];
76 + $submenu['bitform'][] = [__('Doc & Support', 'bit-form'), $capability, 'admin.php?page=bitform#/doc-support'];
77 + if (!Utilities::isPro()) {
78 + $submenu['bitform'][] = ['<span class="bf-pro-btn">' . __('Get 74% OFF', 'bit-form') . '</span>', $capability, 'https://bit-form.com/#pricing', '_blank'];
79 + }
49 80 }
50 81 }
51 82
52 - public function getAllPages() {
83 + public function AdminTopMenu(WP_Admin_Bar $wp_admin_bar)
84 + {
85 + if (!(current_user_can('manage_options') || current_user_can('manage_bitform'))) {
86 + return;
87 + }
88 + $indicator = '';
89 + // if (self::countUnreadEntries()) {
90 + // $indicator = ' <div class="wp-core-ui wp-ui-notification bf-indicator-badge">' . self::countUnreadEntries() . '</div>';
91 + // }
92 +
93 + $wp_admin_bar->add_node([
94 + 'id' => 'bitform',
95 + 'title' => 'Bit Form' . $indicator,
96 + 'href' => admin_url('admin.php?page=bitform'),
97 + 'meta' => [
98 + 'class' => 'bitform-admin-bar',
99 + ],
100 + ]);
101 + $wp_admin_bar->add_node([
102 + 'id' => 'bitform-all-forms',
103 + 'parent' => 'bitform',
104 + 'title' => __('All Forms', 'bit-form') . $indicator,
105 + 'href' => admin_url('admin.php?page=bitform#/'),
106 + ]);
107 + $wp_admin_bar->add_node([
108 + 'id' => 'bitform-form-templates',
109 + 'parent' => 'bitform',
110 + 'title' => __('Form Templates', 'bit-form'),
111 + 'href' => admin_url('admin.php?page=bitform#/form-templates'),
112 + ]);
113 + $wp_admin_bar->add_node([
114 + 'id' => 'bitform-app-settings',
115 + 'parent' => 'bitform',
116 + 'title' => __('App Settings', 'bit-form'),
117 + 'href' => admin_url('admin.php?page=bitform#/app-settings/general'),
118 + ]);
119 + $wp_admin_bar->add_node([
120 + 'id' => 'bitform-smtp',
121 + 'parent' => 'bitform',
122 + 'title' => __('SMTP', 'bit-form'),
123 + 'href' => admin_url('admin.php?page=bitform#/app-settings/smtp'),
124 + ]);
125 + $wp_admin_bar->add_node([
126 + 'id' => 'bitform-pdf-setting',
127 + 'parent' => 'bitform',
128 + 'title' => __('PDF Setting', 'bit-form'),
129 + 'href' => admin_url('admin.php?page=bitform#/app-settings/pdf'),
130 + ]);
131 + $wp_admin_bar->add_node([
132 + 'id' => 'bitform-cpt',
133 + 'parent' => 'bitform',
134 + 'title' => __('CPT', 'bit-form'),
135 + 'href' => admin_url('admin.php?page=bitform#/app-settings/cpt'),
136 + ]);
137 + $wp_admin_bar->add_node([
138 + 'id' => 'bitform-api',
139 + 'parent' => 'bitform',
140 + 'title' => __('Bit Form API', 'bit-form'),
141 + 'href' => admin_url('admin.php?page=bitform#/app-settings/api'),
142 + ]);
143 + $wp_admin_bar->add_node([
144 + 'id' => 'bitform-payments',
145 + 'parent' => 'bitform',
146 + 'title' => __('Payments', 'bit-form'),
147 + 'href' => admin_url('admin.php?page=bitform#/app-settings/payments'),
148 + ]);
149 + }
150 +
151 + public function getAllPages()
152 + {
53 153 $pages = get_pages(['post_status' => 'publish', 'sort_column' => 'post_date', 'sort_order' => 'desc']);
54 154 $allPages = [];
55 155 foreach ($pages as $pageKey => $pageDetails) {
56 156 $allPages[$pageKey]['title'] = $pageDetails->post_title;
@@ -63,32 +163,35 @@
63 163 * Load the asset libraries
64 164 *
65 165 * @return void
66 166 */
67 - public function AdminAssets($current_screen) {
68 - if (!strpos($current_screen, 'bitform')) {
167 + public function AdminAssets($current_screen)
168 + {
169 + if (false === strpos($current_screen, 'bitform')) {
69 170 return;
70 171 }
71 - $parsed_url = parse_url(get_admin_url());
172 + $parsed_url = wp_parse_url(get_admin_url());
72 173 $site_url = $parsed_url['scheme'] . '://' . $parsed_url['host'];
73 174 $site_url .= empty($parsed_url['port']) ? null : ':' . $parsed_url['port'];
74 - $base_path_admin = str_replace($site_url, null, get_admin_url());
175 + $base_path_admin = str_replace($site_url, '', get_admin_url());
75 176 // loading google fonts
76 - wp_enqueue_style('googleapis-PRECONNECT', 'https://fonts.googleapis.com');
77 - wp_enqueue_style('gstatic-PRECONNECT-CROSSORIGIN', 'https://fonts.gstatic.com');
177 + wp_enqueue_style('googleapis-BITFORM-PRECONNECT', 'https://fonts.googleapis.com', [], BITFORMS_VERSION, false);
178 + wp_enqueue_style('gstatic-BITFORM-PRECONNECT-CROSSORIGIN', 'https://fonts.gstatic.com', [], BITFORMS_VERSION, false);
78 179 foreach (self::$fonts_url as $i => $font_url) {
79 - wp_enqueue_style('bf-font-' . $i, $font_url);
180 + wp_enqueue_style('bf-font-' . $i, $font_url, [], BITFORMS_VERSION);
80 181 }
81 182
82 183 if (defined('BITAPPS_DEV') && BITAPPS_DEV) {
83 - wp_enqueue_script('vite-client-helper-MODULE', BIT_DEV_URL . '/config/devHotModule.js', [], null);
84 - wp_enqueue_script('vite-client-MODULE', BIT_DEV_URL . '/@vite/client', [], null);
85 - wp_enqueue_script('index-MODULE', BIT_DEV_URL . '/main.jsx', [], null);
184 + // Vite dev server scripts; null version intentional (dev mode, no cache busting needed).
185 + wp_enqueue_script('vite-client-helper-BITFORM-MODULE', BIT_DEV_URL . '/config/devHotModule.js', [], null);
186 + wp_enqueue_script('vite-client-BITFORM-MODULE', BIT_DEV_URL . '/@vite/client', [], null);
187 + wp_enqueue_script('index-BITFORM-MODULE', BIT_DEV_URL . '/main.jsx', [], null);
86 188 }
87 189
88 - if (!defined('BITAPPS_DEV')) {
89 - wp_enqueue_script('index-MODULE', BITFORMS_ASSET_URI . '/main.js', [], null);
90 - wp_enqueue_style('bf-css', BITFORMS_ASSET_URI . '/main.css');
190 + if (!defined('BITAPPS_DEV') || (defined('BITAPPS_DEV') && !BITAPPS_DEV)) {
191 + $build_hash = file_get_contents(BITFORMS_PLUGIN_DIR_PATH . '/build-hash.txt');
192 + wp_enqueue_script('index-BITFORM-MODULE', BITFORMS_ASSET_URI . "/main-{$build_hash}.js", [], null);
193 + wp_enqueue_style('bf-css', BITFORMS_ASSET_URI . "/main-{$build_hash}.css", [], $build_hash);
91 194 }
92 195
93 196 // if (defined('BITAPPS_DEV') && BITAPPS_DEV) {
94 197 // wp_enqueue_script(
@@ -113,52 +216,55 @@
113 216 // true
114 217 // );
115 218 // }
116 219
117 - if (wp_script_is('wp-i18n')) {
118 - $deps = ['bitforms-vendors', 'bitforms-runtime', 'bitforms-file', 'wp-i18n'];
119 - } else {
120 - $deps = ['bitforms-vendors', 'bitforms-runtime', 'bitforms-file'];
121 - }
122 - if (!defined('BITAPPS_DEV')) {
123 - wp_enqueue_script(
124 - 'bitforms-admin-script',
125 - BITFORMS_ASSET_JS_URI . '/index.js',
126 - $deps,
127 - BITFORMS_VERSION,
128 - true
129 - );
130 - }
131 - wp_enqueue_script('tinymce_js', includes_url('js/tinymce/') . 'wp-tinymce.php', null, false, true);
220 + // if (wp_script_is('wp-i18n')) {
221 + // error_log('wp_script' . wp_script_is('wp-i18n'));
222 + // $deps = ['bitforms-vendors', 'bitforms-runtime', 'bitforms-file', 'wp-i18n'];
223 + // } else {
224 + // $deps = ['bitforms-vendors', 'bitforms-runtime', 'bitforms-file'];
225 + // }
226 + // if (!defined('BITAPPS_DEV')) {
227 + // wp_enqueue_script(
228 + // 'bitforms-admin-script',
229 + // BITFORMS_ASSET_JS_URI . '/index.js',
230 + // $deps,
231 + // BITFORMS_VERSION,
232 + // true
233 + // );
234 + // }
132 235
236 + wp_enqueue_script('tinymce_js', includes_url('js/tinymce/') . 'wp-tinymce.php', [], get_bloginfo('version'), true);
237 +
133 238 if (!wp_script_is('media-upload')) {
134 239 wp_enqueue_media();
135 240 }
136 241
137 - $plugin_path = BITFORMS_ASSET_URI;
242 + // $plugin_path = BITFORMS_ASSET_URI;
138 243
139 244 echo "<meta name='theme-color' content='#13233c' />";
140 245
141 - if (defined('BITAPPS_DEV') && !BITAPPS_DEV) {
142 - wp_enqueue_style(
143 - 'bitforms-styles',
144 - BITFORMS_ASSET_URI . '/css/bitforms.css',
145 - null,
146 - BITFORMS_VERSION,
147 - 'screen'
148 - );
246 + // if (defined('BITAPPS_DEV') && !BITAPPS_DEV) {
247 + // wp_enqueue_style(
248 + // 'bitforms-styles',
249 + // BITFORMS_ASSET_URI . '/css/bitforms.css',
250 + // null,
251 + // BITFORMS_VERSION,
252 + // 'screen'
253 + // );
149 254
150 - wp_enqueue_style(
151 - 'bitforms-components-styles',
152 - BITFORMS_ASSET_URI . '/css/components.css',
153 - null,
154 - BITFORMS_VERSION,
155 - 'screen'
156 - );
157 - }
255 + // wp_enqueue_style(
256 + // 'bitforms-components-styles',
257 + // BITFORMS_ASSET_URI . '/css/components.css',
258 + // null,
259 + // BITFORMS_VERSION,
260 + // 'screen'
261 + // );
262 + // }
263 +
158 264 $formHandler = FormHandler::getInstance();
159 265 $all_forms = $formHandler->admin->getAllForm();
160 - $urlQuery = parse_url(FileDownloadProvider::getBaseDownloadURL(), PHP_URL_QUERY);
266 + $urlQuery = wp_parse_url(FileDownloadProvider::getBaseDownloadURL(), PHP_URL_QUERY);
161 267 $baseDLURL = FileDownloadProvider::getBaseDownloadURL();
162 268 $baseDLURL = empty($urlQuery) ? $baseDLURL . '?' : $baseDLURL . '&';
163 269 $ipTool = new IpTool();
164 270 $user_details = $ipTool->getUserDetail();
@@ -163,8 +269,12 @@
163 269 $ipTool = new IpTool();
164 270 $user_details = $ipTool->getUserDetail();
165 271 $integrationHandler = new IntegrationHandler(0, $user_details);
166 272 $allFormIntegrations = $integrationHandler->getAllIntegration('app');
273 +
274 + $integraions = Integrations::getInstance();
275 + $connectedIntegrationApps = $integraions->getConnectedIntegrationApp();
276 +
167 277 $allFormSettings = [];
168 278 if (!is_wp_error($allFormIntegrations)) {
169 279 $integCount = [];
170 280 foreach ($allFormIntegrations as $integration) {
@@ -180,8 +290,12 @@
180 290 foreach ($allFormIntegrations as $integration) {
181 291 $type = $integration->integration_type;
182 292 if (!is_null($type)) {
183 293 $integrationDetails = json_decode($integration->integration_details);
294 +
295 + if (!is_object($integrationDetails) || is_null($integrationDetails)) {
296 + $integrationDetails = new \stdClass();
297 + }
184 298 $integrationDetails->id = $integration->id;
185 299 if ($integCount[$type] > 1) {
186 300 if (!isset($allFormSettings[$type])) {
187 301 $allFormSettings[$type] = [];
@@ -193,22 +307,19 @@
193 307 }
194 308 }
195 309 }
196 310
197 - $users = get_users(['fields' => ['ID', 'user_nicename', 'user_email', 'display_name']]);
198 - $userMail = [];
199 - $userNames = [];
200 - foreach ($users as $key => $value) {
201 - $userMail[$key]['label'] = !empty($value->display_name) ? $value->display_name : '';
202 - $userMail[$key]['value'] = !empty($value->user_email) ? $value->user_email : '';
203 - $userMail[$key]['id'] = $value->ID;
204 - $userNames[$value->ID] = ['name' => $value->display_name, 'url' => get_edit_user_link($value->ID)];
311 + if (!is_wp_error($connectedIntegrationApps)) {
312 + $allFormSettings['connectedIntegrationApps'] = $connectedIntegrationApps;
205 313 }
314 +
315 + $appSettings = get_option('bitform_app_settings', (object)[]);
206 316 $bits = [
207 317 'configs' => ['bf_separator' => BITFORMS_BF_SEPARATOR],
208 318 'nonce' => wp_create_nonce('bitforms_save'),
209 319 'isPro' => false,
210 320 'siteURL' => site_url(),
321 + 'rootURL' => BITFORMS_ROOT_URI,
211 322 'assetsURL' => BITFORMS_ASSET_URI,
212 323 'baseURL' => $base_path_admin . 'admin.php?page=bitform#',
213 324 'baseDLURL' => $baseDLURL,
214 325 'styleURL' => BITFORMS_UPLOAD_BASE_URL . '/form-styles',
@@ -215,17 +326,21 @@
215 326 'iconURL' => BITFORMS_UPLOAD_BASE_URL . '/icons',
216 327 'ajaxURL' => admin_url('admin-ajax.php'),
217 328 'allForms' => is_wp_error($all_forms) ? null : $all_forms,
218 329 'allPages' => is_wp_error($this->getAllPages()) ? [] : $this->getAllPages(),
219 - 'allFormSettings' => $allFormSettings,
220 - 'userMail' => !empty($userMail) ? $userMail : [],
221 - 'user' => (object) $userNames,
330 + 'allFormSettings' => count($allFormSettings) > 0 ? $allFormSettings : (object)[],
331 + 'appSettings' => $appSettings,
222 332 'dateFormat' => get_option('date_format'),
223 333 'timeFormat' => get_option('time_format'),
224 334 'timeZone' => DateTimeHelper::wp_timezone_string(),
225 335 'googleRedirectURL' => get_rest_url() . 'bitform/v1/google',
226 336 'oneDriveRedirectURL' => get_rest_url() . 'bitform/v1/oneDrive',
227 - 'zohoRedirectURL' => get_rest_url() . 'bitform/v1/zoho'
337 + 'zohoRedirectURL' => get_rest_url() . 'bitform/v1/zoho',
338 + 'oAuthRedirectURL' => get_rest_url() . 'bitform/v1/oauth-redirect',
339 + 'downloadedPdfFonts' => is_array(get_option('bitforms_pdf_fonts')) ? get_option('bitforms_pdf_fonts') : [],
340 + 'permission' => empty(get_option('bitforms_allow_tracking')) ? false : true,
341 + 'templatePath' => BITFORMS_ROOT_URI . '/static/templates',
342 + 'serverInfo' => ['php_version' => phpversion(), 'engine' => isset($_SERVER['SERVER_SOFTWARE']) ? sanitize_text_field(wp_unslash($_SERVER['SERVER_SOFTWARE'])) : '', 'wp_version' => get_bloginfo('version'), 'loaded_extensions' => get_loaded_extensions()],
228 343 ];
229 344
230 345 $isMigratingToV2 = get_option('bitforms_migrating_to_v2', false);
231 346 if ($isMigratingToV2) {
@@ -231,9 +346,23 @@
231 346 if ($isMigratingToV2) {
232 347 $bits['isMigratingToV2'] = $isMigratingToV2;
233 348 }
234 349
350 + if (defined('BITFORMS_VERSION')) {
351 + $bits['version'] = BITFORMS_VERSION;
352 + }
353 +
354 + $changelogVersion = get_option('bitforms_changelog_version', '0.0.0');
355 + $bits['changelogVersion'] = $changelogVersion;
356 +
357 + $hideAnnouncementModal = (bool) get_option('bitforms_hide_announcement', false);
358 + $bits['hideAnnouncementModal'] = $hideAnnouncementModal;
359 +
360 + $hideCashbackModal = (bool) get_option('bitforms_hide_cashback', false);
361 + $bits['hideCashbackModal'] = $hideCashbackModal;
362 +
235 363 global $wpdb;
364 + // Direct query: table name interpolation only (no user input). $wpdb->prepare() cannot parameterize schema-check queries.
236 365 $hasV1FormTable = $wpdb->get_var("SHOW TABLES LIKE '{$wpdb->prefix}bitforms_form_v1'");
237 366 if ($hasV1FormTable) {
238 367 $bits['canRollbackToV1'] = true;
239 368 }
@@ -241,28 +370,46 @@
241 370 $bitforms = apply_filters(
242 371 'bitforms_localized_script',
243 372 $bits
244 373 );
245 - if ('en_US' !== get_locale() && file_exists(BITFORMS_PLUGIN_DIR_PATH . '/languages/generatedString.php')) {
374 +
375 + $allowBitFormTranslation = apply_filters('bitform_filter_allow_translation', true);
376 + if ($allowBitFormTranslation && 'en_US' !== get_user_locale() && file_exists(BITFORMS_PLUGIN_DIR_PATH . '/languages/generatedString.php')) {
246 377 include_once BITFORMS_PLUGIN_DIR_PATH . '/languages/generatedString.php';
247 - $bitforms['translations'] = $bitform_i18n_strings;
378 + $bitforms['translations'] = $bitforms_i18n_strings;
379 +
380 + // Apply a filter to allow user/custom translations to modify the $bitforms translations
381 + $bitforms['translations'] = apply_filters('bitform_filter_translations', $bitforms['translations']);
248 382 }
249 - wp_localize_script('index-MODULE', 'bits', $bitforms);
383 + wp_localize_script('index-BITFORM-MODULE', 'bits', $bitforms);
250 384 // !BIT_DEV && wp_localize_script('bitforms-admin-script', 'bits', $bitforms);
251 - // echo !BIT_DEV ? '' : "<script>console.log(window.bits=JSON.parse('" . str_replace("'", '', json_encode($bitforms)) . "'))</script>";
385 + // echo !BIT_DEV ? '' : "<script>console.log(window.bits=JSON.parse('" . str_replace("'", '', wp_json_encode($bitforms)) . "'))</script>";
252 386 // if (\function_exists('wp_set_script_translations'))
253 387 // wp_set_script_translations('bitforms-admin-script', 'bitform', BITFORMS_PLUGIN_DIR_PATH . 'languages');
254 388 }
255 389
390 + public function bitforms_enqueue_admin_styles()
391 + {
392 + wp_enqueue_style(
393 + 'bitforms-admin-styles',
394 + BITFORMS_ROOT_URI . '/resources/admin.css',
395 + [],
396 + BITFORMS_VERSION,
397 + 'all'
398 + );
399 + }
400 +
256 401 /**
257 402 * Bitforms apps-root id provider
258 403 * @return void
259 404 */
260 - public function RootPage() {
405 + public function RootPage()
406 + {
261 407 require_once BITFORMS_PLUGIN_DIR_PATH . '/views/view-root.php';
262 408 }
263 409
264 - public function AdminNotices() {
410 + public function AdminNotices()
411 + {
265 412 global $plugin_page;
266 413 $plugin_page = null === $plugin_page ? '' : $plugin_page;
267 414 if (false === strpos($plugin_page, 'bitform')) {
268 415 return;
@@ -277,20 +424,21 @@
277 424 * @param string $html link tag
278 425 *
279 426 * @return string new link tag
280 427 */
281 - public function linkTagFilter($html, $handle, $href) {
428 + public function linkTagFilter($html, $handle, $href)
429 + {
282 430 $newTag = $html;
283 - if (str_contains($handle, 'PRECONNECT')) {
431 + if (preg_match('/BITFORM-PRECONNECT/', $handle)) {
284 432 $newTag = preg_replace('/rel=("|\')stylesheet("|\')/', 'rel="preconnect"', $newTag);
285 433 }
286 - if (str_contains($handle, 'PRELOAD')) {
434 + if (preg_match('/BITFORM-PRELOAD/', $handle)) {
287 435 $newTag = preg_replace('/rel=("|\')stylesheet("|\')/', 'rel="preload"', $newTag);
288 436 }
289 - if (str_contains($handle, 'CROSSORIGIN')) {
437 + if (preg_match('/BITFORM-CROSSORIGIN/', $handle)) {
290 438 $newTag = preg_replace('/<link /', '<link crossorigin ', $newTag);
291 439 }
292 - if (str_contains($handle, 'SCRIPT')) {
440 + if (preg_match('/BITFORM-SCRIPT/', $handle)) {
293 441 $newTag = preg_replace('/<link /', '<link as="script" ', $newTag);
294 442 }
295 443 return $newTag;
296 444 }
@@ -301,12 +449,21 @@
301 449 * @param string $html script tag
302 450 *
303 451 * @return string new script tag
304 452 */
305 - public function scriptTagFilter($html, $handle, $href) {
453 + public function scriptTagFilter($html, $handle, $href)
454 + {
306 455 $newTag = $html;
307 - if (str_contains($handle, 'MODULE')) {
456 + if (preg_match('/BITFORM-MODULE/', $handle)) {
308 457 $newTag = preg_replace('/<script /', '<script type="module" ', $newTag);
309 458 }
310 459 return $newTag;
460 + }
461 +
462 + private static function countUnreadEntries()
463 + {
464 + global $wpdb;
465 + // Direct query: table name interpolation only (no user input). status = 1 is a hardcoded literal.
466 + $unreadEntries = $wpdb->get_var("SELECT COUNT(*) FROM {$wpdb->prefix}bitforms_form_entries WHERE status = 1");
467 + return $unreadEntries;
311 468 }
312 469 }