PluginProbe
FluentCart A New Era of eCommerce – Faster, Lighter, and Simpler / 1.7.1
FluentCart A New Era of eCommerce – Faster, Lighter, and Simpler v1.7.1
1.7.1 1.7.0 1.6.6 1.6.5 1.6.4 1.6.3 1.6.2 1.6.1 1.6.0 1.5.4 1.5.5 1.5.3 1.5.2 1.5.1 1.5.0 1.4.2 1.4.1 1.4.0 1.3.28 1.3.27 1.3.26 1.3.25 1.3.23 1.3.22 1.3.21 All 51 releases
← All changes | app/Hooks/Handlers/MenuHandler.php +59 -4 1.4.2 → 1.7.1 View file →
@@ -19,8 +19,10 @@
19 19 use FluentCart\App\Models\AttributeTerm;
20 20 use FluentCart\App\Models\AttributeGroup;
21 21 use FluentCart\App\Models\ShippingMethod;
22 22 use FluentCart\App\Modules\Tax\TaxModule;
23 +use FluentCart\App\Modules\FluentPlayer\FluentPlayerBridge;
24 +use FluentCart\App\Modules\AdminFooter\AdminFooter;
23 25 use FluentCart\App\Helpers\CurrenciesHelper;
24 26 use FluentCart\App\Services\Filter\TaxFilter;
25 27 use FluentCart\App\Services\Filter\OrderFilter;
26 28 use FluentCart\App\Services\Filter\LicenseFilter;
@@ -26,11 +28,19 @@
26 28 use FluentCart\App\Services\Filter\LicenseFilter;
27 29 use FluentCart\App\Services\Filter\LicenseSiteFilter;
28 30 use FluentCart\App\Services\Filter\ProductFilter;
29 31 use FluentCart\App\Services\Filter\CustomerFilter;
32 +use FluentCart\App\Services\Filter\CouponFilter;
33 +use FluentCart\App\Services\Filter\LogFilter;
34 +use FluentCart\App\Services\Filter\OrderBumpFilter;
35 +use FluentCart\App\Services\Filter\ReviewFilter;
36 +use FluentCart\App\Modules\Shipping\Services\Filter\ShippingClassFilter;
37 +use FluentCart\App\Modules\Shipping\Services\Filter\ShippingZoneFilter;
30 38 use FluentCart\App\Modules\Integrations\AddOnModule;
39 +use FluentCart\App\Services\DateTime\DayjsFormatter;
31 40 use FluentCart\App\Services\Translations\TransStrings;
32 41 use FluentCart\App\Services\Permission\PermissionManager;
42 +use FluentCart\Database\DataBackfills;
33 43 use FluentCart\App\Modules\PaymentMethods\Core\GatewayManager;
34 44
35 45 class MenuHandler
36 46 {
@@ -43,8 +53,9 @@
43 53
44 54 if ($page == 'fluent-cart') {
45 55
46 56 \FluentCart\App\Events\FirstTimePluginActivation::handle();
57 + (new AdminFooter())->register();
47 58 add_action('admin_enqueue_scripts', function () {
48 59 Vite::enqueueStyle('fluent_cart_admin_app_css',
49 60 'styles/tailwind/style.css',
50 61 );
@@ -78,8 +89,9 @@
78 89 $targetKeys = [
79 90 'checkout_page_id' => __('Checkout Page', 'fluent-cart'),
80 91 'cart_page_id' => __('Cart Page', 'fluent-cart'),
81 92 'receipt_page_id' => __('Receipt Page', 'fluent-cart'),
93 + 'order_review_page_id' => __('Order Review Page', 'fluent-cart'),
82 94 'shop_page_id' => __('Shop Page', 'fluent-cart'),
83 95 'customer_profile_page_id' => __('Customer Profile Page', 'fluent-cart'),
84 96 ];
85 97
@@ -176,8 +188,22 @@
176 188 {
177 189
178 190 add_action('admin_menu', array($this, 'addAdminMenu'));
179 191
192 + // The "↳" children under Products stay visible on every page so the
193 + // sidebar never changes shape. Pro's "↳ Inventory" still hides itself
194 + // with inline CSS (it relied on the admin app to reveal it), so keep
195 + // that row visible whichever Pro version is installed.
196 + add_action('admin_enqueue_scripts', function () {
197 + wp_register_style('fluent-cart-admin-submenu', false);
198 + wp_enqueue_style('fluent-cart-admin-submenu');
199 + wp_add_inline_style('fluent-cart-admin-submenu', '
200 + #adminmenu .toplevel_page_fluent-cart li.fluent_cart_inventory {
201 + display: list-item;
202 + }
203 + ');
204 + });
205 +
180 206 /*
181 207 * Disable Gutenberg for Products
182 208 */
183 209 add_filter('parent_file', function ($parent_file) {
@@ -438,9 +464,10 @@
438 464
439 465 do_action('fluent_cart/loading_app', $app);
440 466
441 467 //This should be done before enqueueing the global script.
442 - Vite::enqueueScript($slug . '_admin_app_start', 'admin/bootstrap/app.js', [$slug . '_global_admin_hooks']);
468 + // wp-i18n backs the admin translator (resources/admin/utils/translator/Translator.js).
469 + Vite::enqueueScript($slug . '_admin_app_start', 'admin/bootstrap/app.js', [$slug . '_global_admin_hooks', 'wp-i18n']);
443 470
444 471 //Don't register this script using vite.
445 472 if (!wp_script_is('wp-hooks', 'registered')) {
446 473 $suffix = (defined('SCRIPT_DEBUG') && SCRIPT_DEBUG) ? '' : '.min';
@@ -460,8 +487,9 @@
460 487
461 488 $settings = new StoreSettings();
462 489 $checkoutUrl = add_query_arg(Helper::INSTANT_CHECKOUT_URL_PARAM, '=', $settings->getCheckoutPage());
463 490 $restVars = Helper::getRestInfo();
491 + $hasDataMigrations = current_user_can('manage_options') && DataBackfills::hasPending();
464 492
465 493 $filterOptions = [
466 494 'order_filter_options' => OrderFilter::getTableFilterOptions(),
467 495 'customer_filter_options' => CustomerFilter::getTableFilterOptions(),
@@ -468,8 +496,9 @@
468 496 'product_filter_options' => ProductFilter::getTableFilterOptions(),
469 497 'license_filter_options' => LicenseFilter::getTableFilterOptions(),
470 498 'license_site_filter_options' => LicenseSiteFilter::getTableFilterOptions(),
471 499 'tax_filter_options' => TaxFilter::getTableFilterOptions(),
500 + 'review_filter_options' => ReviewFilter::getTableFilterOptions(),
472 501 ];
473 502 $filterOptions = apply_filters('fluent_cart/admin_filter_options', $filterOptions, []);
474 503
475 504 // Structured table config keyed by table name (used by Table.js base class)
@@ -481,10 +510,31 @@
481 510 'license_sites' => ['filters' => Arr::get($filterOptions, 'license_site_filter_options', [])],
482 511 'taxes_table' => ['filters' => Arr::get($filterOptions, 'tax_filter_options', [])],
483 512 'subscriptions' => ['filters' => Arr::get($filterOptions, 'subscription_filter_options', [])],
484 513 'shipping_zone_table' => ['filters' => Arr::get($filterOptions, 'shipping_zone_filter_options', [])],
514 + 'review_table' => ['filters' => Arr::get($filterOptions, 'review_filter_options', [])],
515 + // The Order Sources report filters orders, so its advanced-filter UI
516 + // reuses the Orders filter vocabulary rather than defining its own.
517 + 'source_report' => ['filters' => Arr::get($filterOptions, 'order_filter_options', [])],
485 518 ];
486 519
520 + // Tables that declare sort options on their filter class but carry no
521 + // filter-options entry above: the Sort popover still needs them, and
522 + // they are what `fluent_cart/{filterName}_table_sorts` feeds.
523 + $sortOnlyTables = [
524 + 'coupon_table' => CouponFilter::class,
525 + 'log_table' => LogFilter::class,
526 + 'order_bump_table' => OrderBumpFilter::class,
527 + 'shipping_class_table' => ShippingClassFilter::class,
528 + 'shipping_zone_table' => ShippingZoneFilter::class,
529 + ];
530 +
531 + foreach ($sortOnlyTables as $tableName => $filterClass) {
532 + if (empty($tableConfig[$tableName]['filters']['sorts'])) {
533 + $tableConfig[$tableName]['filters']['sorts'] = call_user_func([$filterClass, 'getSortOptions']);
534 + }
535 + }
536 +
487 537 $tableConfig = apply_filters('fluent_cart/admin_table_saved_views', $tableConfig, [
488 538 'filterOptions' => $filterOptions
489 539 ]);
490 540
@@ -495,8 +545,9 @@
495 545 $appConfig['version'] = FLUENTCART_VERSION;
496 546 $appConfig['permissions'] = PermissionManager::getUserPermissions();
497 547 $appConfig['isProActive'] = App::isProActive();
498 548 $appConfig['proVersion'] = defined('FLUENTCART_PRO_PLUGIN_VERSION') ? FLUENTCART_PRO_PLUGIN_VERSION : null;
549 + $appConfig['fluentPlayer'] = FluentPlayerBridge::adminAppConfig();
499 550
500 551 $appConfig['logos'] = [
501 552 'dark' => Vite::getAssetUrl('images/logo/logo-full-dark.svg'),
502 553 'light' => Vite::getAssetUrl('images/logo/logo-full.svg'),
@@ -501,9 +552,9 @@
501 552 'dark' => Vite::getAssetUrl('images/logo/logo-full-dark.svg'),
502 553 'light' => Vite::getAssetUrl('images/logo/logo-full.svg'),
503 554 ];
504 555 $appConfig['isModuleTabEnabled'] = $settings->isModuleTabEnabled();
505 - $appConfig['upgrade_url'] = 'https://fluentcart.com/pricing/';
556 + $appConfig['upgrade_url'] = Helper::getUpgradeUrl();
506 557
507 558 $max_upload_size = wp_max_upload_size(); // Returns size in bytes
508 559 $adminLocalizeData = apply_filters('fluent_cart/admin_app_data', [
509 560 'app_config' => $appConfig,
@@ -508,8 +559,9 @@
508 559 $adminLocalizeData = apply_filters('fluent_cart/admin_app_data', [
509 560 'app_config' => $appConfig,
510 561 'slug' => $app->config->get('app.slug'),
511 562 'admin_url' => admin_url('admin.php?page=fluent-cart#/'),
563 + 'wp_admin_url' => rtrim(admin_url(), '/'),
512 564 'frontend_url' => URL::getFrontEndUrl(''),
513 565 'nonce' => wp_create_nonce($slug),
514 566 'rest' => $restVars,
515 567 'brand_logo' => $this->getMenuIcon(),
@@ -534,9 +586,9 @@
534 586 'order_statues' => Status::getOrderStatuses(),
535 587 'editable_order_statues' => Status::getEditableOrderStatuses(),
536 588 'editable_customer_statues' => Status::getEditableCustomerStatuses(),
537 589 'shipping_statuses' => Status::getShippingStatuses(),
538 - 'allow_bulk_payment_status_change' => true,
590 + // Attribute library powering the Advanced Variation feature.
539 591 'variation_attributes' => AttributeGroup::with(['terms'])->get(),
540 592 'variation_terms' => AttributeTerm::query()->get()->keyBy('id'),
541 593 'product_image_base_uri' => Helper::getProductImageBaseUri(),
542 594 'add_on_modules' => AddOnModule::showAddOns(),
@@ -558,14 +610,17 @@
558 610 'is_tax_enabled' => TaxModule::isTaxEnabled(),
559 611 'eu_vat_county_options' => TaxModule::euVatCountyOptions(),
560 612 'country_tax_titles' => TaxModule::taxTitleLists(),
561 613 'site_url' => site_url(),
614 + 'store_logo' => (new \FluentCart\Api\StoreSettings())->get('store_logo.url', ''),
562 615 'modules_settings' => ModuleSettings::getAllSettings(),
563 616 'purchase_fluent_cart_link' => 'https://fluentcart.com/',
564 617 'admin_notices' => apply_filters('fluent_cart/admin_notices', []),
618 + // POSTs data-backfills/run until done; endpoint requires manage_options
619 + 'has_data_migrations' => $hasDataMigrations,
565 620 'subscription_intervals' => Helper::getAvailableSubscriptionIntervalOptions(),
566 621
567 - 'datei18' => TransStrings::dateTimeStrings(),
622 + 'datei18' => DayjsFormatter::localizedStrings(),
568 623 'el_strings' => TransStrings::elStrings(),
569 624 'wp_locale' => get_locale(),
570 625 'is_full_name_required' => CheckoutFieldsSchema::isFullNameRequired(),
571 626 'business_details' => [