Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
7780163
[PROD-10021] Implement integration 2.0
jitendrabanjara1991 Jun 24, 2026
3acf672
[PROD-10021] - Integration filter bar UI
amincdev Jun 24, 2026
6663866
[PROD-10021] - Integration cards UI
amincdev Jun 24, 2026
6a25728
PROD-10021 - Add shared admin-common UI layer; unify header + Knowled…
jitendrabanjara1991 Jun 25, 2026
6a4ec5f
PROD-10021 - Fix search setting loader spinner issue
amincdev Jun 25, 2026
346390b
PROD-10021 - Integration search input and loading UI
amincdev Jun 25, 2026
b0ae309
PROD-10021 - Integrations card UI corrections
amincdev Jun 25, 2026
c01076f
PROD-10021 - Address code review: share sanitizer, fix drawer a11y + …
jitendrabanjara1991 Jun 25, 2026
47bcb3b
PROD-10021 - Wire Integrations API field contract (install/plugin_url…
jitendrabanjara1991 Jun 25, 2026
f33521d
PROD-10021 - Integration drawer UI and structure
amincdev Jun 25, 2026
8d963c2
Merge branch 'PROD-10021' of github.com:buddyboss/buddyboss-platform …
jitendrabanjara1991 Jun 25, 2026
4053612
PROD-10021 - Integration drawer content UI
amincdev Jun 25, 2026
c476df3
PROD-10021 - Integration card: title-only open + Install/Learn More b…
jitendrabanjara1991 Jun 26, 2026
0643f17
PROD-10021 - Integration card: show category as the subtitle
jitendrabanjara1991 Jun 26, 2026
6e6a8d9
PROD-10021 - Integration card: match Figma internal spacing
jitendrabanjara1991 Jun 26, 2026
3b78631
PROD-10021 - Integrations: numbered pagination + review-2 fixes
jitendrabanjara1991 Jun 26, 2026
ef1dd8b
PROD-10021 - Integrations: fix docblock typo + track tab arrow-key nav
jitendrabanjara1991 Jun 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -56,11 +56,18 @@
"build:blocks": "npm run build:block:core",
"build:block:core": "wp-scripts build --webpack-src-dir=src/js/blocks/bp-core --config src/js/blocks/bp-core/webpack.config.js",
"watch:readylaunch-header": "wp-scripts start --webpack-src-dir=src/js/blocks/bp-core/readylaunch-header --config src/js/blocks/bp-core/webpack.config.js",
"build:admin": "npm run build:admin:rl-onboarding && npm run build:admin:settings",
"build:admin": "npm run build:admin:rl-onboarding && npm run build:admin:common && npm run build:admin:settings && npm run build:admin:integrations",
"build:admin:rl-onboarding": "BUILD_TARGET=rl-onboarding wp-scripts build --webpack-src-dir=src/js/admin/rl-onboarding --config src/js/admin/webpack.config.js && npm run build:admin:rl-onboarding:scss",
"build:admin:rl-onboarding:scss": "sass --style=compressed --no-source-map src/js/admin/rl-onboarding/styles/onboarding.scss:src/bp-core/admin/bb-settings/rl-onboarding/build/onboarding.css",
"build:admin:settings": "BUILD_TARGET=settings wp-scripts build --webpack-src-dir=src/js/admin/settings --config src/js/admin/webpack.config.js && npm run build:admin:settings:scss",
"build:admin:settings:scss": "sass --style=compressed --no-source-map src/js/admin/settings/styles/scss/admin.scss:src/bp-core/admin/bb-settings/settings/build/styles/admin.css",
"build:admin:integrations": "BUILD_TARGET=integrations wp-scripts build --webpack-src-dir=src/js/admin/integrations --config src/js/admin/webpack.config.js && npm run build:admin:integrations:scss",
"build:admin:common": "BUILD_TARGET=common wp-scripts build --webpack-src-dir=src/js/admin/common --config src/js/admin/webpack.config.js && npm run build:admin:common:scss",
"build:admin:common:scss": "sass --style=compressed --no-source-map src/js/admin/common/styles/scss/common.scss:src/bp-core/admin/bb-settings/common/build/styles/common.css",
"watch:admin:common": "concurrently \"sass --watch src/js/admin/common/styles/scss/common.scss:src/bp-core/admin/bb-settings/common/build/styles/common.css\" \"BUILD_TARGET=common wp-scripts start --webpack-src-dir=src/js/admin/common --config src/js/admin/webpack.config.js\"",
"build:admin:integrations:scss": "sass --style=compressed --no-source-map src/js/admin/integrations/styles/scss/admin.scss:src/bp-core/admin/bb-settings/integrations/build/styles/admin.css",
"watch:admin:integrations": "concurrently \"npm run watch:admin:integrations:scss\" \"BUILD_TARGET=integrations wp-scripts start --webpack-src-dir=src/js/admin/integrations --config src/js/admin/webpack.config.js\"",
"watch:admin:integrations:scss": "sass --watch src/js/admin/integrations/styles/scss/admin.scss:src/bp-core/admin/bb-settings/integrations/build/styles/admin.css",
"watch:admin:rl-onboarding": "concurrently \"npm run watch:admin:rl-onboarding:scss\" \"BUILD_TARGET=rl-onboarding wp-scripts start --webpack-src-dir=src/js/admin/rl-onboarding --config src/js/admin/webpack.config.js\"",
"watch:admin:rl-onboarding:scss": "sass --watch src/js/admin/rl-onboarding/styles/onboarding.scss:src/bp-core/admin/bb-settings/rl-onboarding/build/onboarding.css",
"watch:admin:settings": "concurrently \"npm run watch:admin:settings:scss\" \"BUILD_TARGET=settings wp-scripts start --webpack-src-dir=src/js/admin/settings --config src/js/admin/webpack.config.js\"",
Expand Down
58 changes: 58 additions & 0 deletions src/bp-core/admin/bb-admin-common-assets.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
<?php
/**
* Shared admin-common layer asset registration.
*
* Registers the `bb-admin-common` script handle (exposes window.bbAdminCommon)
* and the `bb-admin-common-style` style handle. App pages enqueue these as
* dependencies so the layer ships once across all admin React apps.
*
* @package BuddyBoss\Core\Administration
* @since BuddyBoss [BBVERSION]
*/

defined( 'ABSPATH' ) || exit;

/**
* Register the shared admin-common script + style handles.
*
* Reads the generated index.asset.php to pick up the version hash and
* dependency list from @wordpress/dependency-extraction-webpack-plugin.
* Consumer pages (e.g. the Integrations page) enqueue these handles so the
* layer ships once and is never duplicated across bundles.
*
* @since BuddyBoss [BBVERSION]
*
* @return void
*/
function bb_register_admin_common_assets() {
$build_dir = buddypress()->plugin_dir . 'bp-core/admin/bb-settings/common/build';
$build_url = buddypress()->plugin_url . 'bp-core/admin/bb-settings/common/build';

$asset_file = $build_dir . '/index.asset.php';
$asset = file_exists( $asset_file )
? require $asset_file
: array(
'dependencies' => array(),
'version' => '0',
);

$deps = $asset['dependencies'];

wp_register_script(
'bb-admin-common',
$build_url . '/index.js',
$deps,
$asset['version'],
true
);

if ( file_exists( $build_dir . '/styles/common.css' ) ) {
wp_register_style(
'bb-admin-common-style',
$build_url . '/styles/common.css',
array(),
$asset['version']
);
}
}
add_action( 'admin_enqueue_scripts', 'bb_register_admin_common_assets', 1 );
163 changes: 163 additions & 0 deletions src/bp-core/admin/bb-admin-integrations-page.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,163 @@
<?php
/**
* BuddyBoss Integrations marketplace admin page.
*
* Renders the standalone React app for the BuddyBoss → Integrations submenu.
* The app is its own webpack bundle (BUILD_TARGET=integrations) so it never
* loads on the Settings page and vice-versa. Data is fetched from buddyboss.com
* through the same-origin proxy (BB_REST_Integrations_Endpoint).
*
* @package BuddyBoss\Core\Administration
* @since BuddyBoss [BBVERSION]
*/

// Exit if accessed directly.
defined( 'ABSPATH' ) || exit;

/**
* Render the Integrations marketplace page.
*
* Mirrors bb_admin_settings_page(): resolves the build asset manifest, enqueues
* the bundle + CSS, localizes the same `bbAdminData` object the React app reads
* (apiUrl + nonce), and prints the mount container.
*
* @since BuddyBoss [BBVERSION]
*
* @return void
*/
function bb_admin_integrations_page() {
$build_dir = buddypress()->plugin_dir . 'bp-core/admin/bb-settings/integrations/build';
$build_url = buddypress()->plugin_url . 'bp-core/admin/bb-settings/integrations/build';

$asset_file = $build_dir . '/index.asset.php';
if ( ! file_exists( $asset_file ) ) {
?>
<div class="wrap">
<div class="notice notice-error">
<p>
<?php
esc_html_e(
'BuddyBoss Integrations assets not found. Please run: npm run build:admin:integrations',
'buddyboss'
);
?>
</p>
</div>
</div>
<?php
return;
}

$asset = require $asset_file;
$min = bp_core_get_minified_asset_suffix();

// WordPress components style (Button, etc.) + BuddyBoss icon fonts.
wp_enqueue_style( 'wp-components' );
$bb_icon_version = function_exists( 'bb_icon_font_map_data' ) ? bb_icon_font_map_data( 'version' ) : bp_get_version();
wp_enqueue_style(
'bb-icons-rl-css',
buddypress()->plugin_url . "bp-templates/bp-nouveau/readylaunch/icons/css/bb-icons-rl{$min}.css",
array(),
$bb_icon_version
);

// Enqueue the shared admin-common layer (registered by bb-admin-common-assets.php at
// admin_enqueue_scripts priority 1) so the global header + CSS ship once.
if ( wp_script_is( 'bb-admin-common', 'registered' ) ) {
wp_enqueue_script( 'bb-admin-common' );
}
if ( wp_style_is( 'bb-admin-common-style', 'registered' ) ) {
wp_enqueue_style( 'bb-admin-common-style' );
}

// Merge bb-admin-common into the integrations bundle deps to guarantee load order.
$integrations_deps = array_unique( array_merge( $asset['dependencies'], array( 'bb-admin-common' ) ) );

wp_enqueue_script(
'bb-admin-integrations',
$build_url . '/index.js',
$integrations_deps,
$asset['version'],
true
);

// Resolve the LTR admin CSS path (RTL is auto-derived). The integrations
// build nests CSS under /styles/, matching the settings target layout.
$css_candidates = array(
"/styles/admin{$min}.css",
"/admin{$min}.css",
);
foreach ( $css_candidates as $css_rel ) {
$css_file = $build_dir . $css_rel;
if ( file_exists( $css_file ) ) {
$css_url = str_replace( buddypress()->plugin_dir, buddypress()->plugin_url, $css_file );
wp_register_style( 'bb-admin-integrations', $css_url, array( 'wp-components' ), $asset['version'] );
wp_style_add_data( 'bb-admin-integrations', 'rtl', 'replace' );
if ( $min ) {
wp_style_add_data( 'bb-admin-integrations', 'suffix', $min );
}
wp_enqueue_style( 'bb-admin-integrations' );
break;
}
}

// The React app reads window.bbIntegrationsData — a distinct global name (not
// the Settings app's bbAdminData) so the two standalone bundles stay isolated.
// Keys: apiUrl (buddyboss/v1 REST root, for the integrations/proxy URL), nonce
// (wp_rest), adminUrl, version (busts the client localStorage cache on upgrade),
// logoUrl + ipnRootId (shared header), and ajaxUrl + searchNonce + settingsUrl
// (shared header's global "Search for settings" → Settings search AJAX).
$api_namespace = function_exists( 'bp_rest_namespace' ) && function_exists( 'bp_rest_version' )
? bp_rest_namespace() . '/' . bp_rest_version() . '/'
: 'buddyboss/v1/';

// Resolve the Mothership IPN root element ID so the shared header can locate
// and relocate the live IPN bell node. The prefix is edition-specific, so we
// ask the IPN View service for the actual ID; on failure the JS falls back to
// a structural [id$="_ipn_root"] selector. Mirrors the Settings page.
$ipn_root_id = '';
if (
class_exists( '\BuddyBoss\Core\Admin\Mothership\BB_Mothership_Loader' ) &&
class_exists( '\BuddyBossPlatform\GroundLevel\InProductNotifications\Services\View' )
) {
try {
$container = \BuddyBoss\Core\Admin\Mothership\BB_Mothership_Loader::instance()->get_container();
$ipn_view = $container->get( \BuddyBossPlatform\GroundLevel\InProductNotifications\Services\View::class );
$ipn_root_id = $ipn_view->getRootElementId();
} catch ( Throwable $e ) {
// Non-fatal: IPN service unavailable — $ipn_root_id stays empty and the
// JS falls back to a structural [id$="_ipn_root"] selector.
$ipn_root_id = '';
}
}

wp_localize_script(
'bb-admin-integrations',
'bbIntegrationsData',
array(
'apiUrl' => rest_url( $api_namespace ),
'nonce' => wp_create_nonce( 'wp_rest' ),
'adminUrl' => esc_url( admin_url() ),
'version' => defined( 'BP_PLATFORM_VERSION' ) ? BP_PLATFORM_VERSION : '0',
'logoUrl' => esc_url( buddypress()->plugin_url . 'bp-core/images/admin/BBLogo.png' ),
'ipnRootId' => $ipn_root_id,
// The shared header's global "Search for settings" box queries the
// Settings search AJAX (bb_admin_search_settings, nonce action
// bb_admin_settings); results deep-link into the Settings page.
'ajaxUrl' => esc_url( admin_url( 'admin-ajax.php' ) ),
'searchNonce' => wp_create_nonce( 'bb_admin_settings' ),
'settingsUrl' => esc_url( admin_url( 'admin.php?page=bb-settings' ) ),
)
);

// Render the React mount, then fire bb_admin_header_actions OUTSIDE the React
// tree (inside .wrap) so the Mothership IPN bell renders its root <div> +
// script synchronously; the shared header relocates that live node into its
// bell slot. Mirrors the Settings page.
// The `bb-admin-app` class scopes the shared Knowledge Base modal styles
// (defined under `.bb-admin-app` in the shared common CSS) so the modal is
// styled here the same as on the Settings page.
echo '<div class="wrap"><div id="bb-admin-integrations" class="bb-admin-app"></div>';
do_action( 'bb_admin_header_actions' );
echo '</div>';
}
35 changes: 35 additions & 0 deletions src/bp-core/admin/bb-admin-settings-init.php
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,16 @@ function bb_admin_settings_init() {
require_once buddypress()->plugin_dir . 'bp-core/admin/bb-admin-settings-page.php';
}

// Integrations marketplace page (render function for the bb-integrations submenu).
if ( file_exists( buddypress()->plugin_dir . 'bp-core/admin/bb-admin-integrations-page.php' ) ) {
require_once buddypress()->plugin_dir . 'bp-core/admin/bb-admin-integrations-page.php';
}

// Shared admin-common layer asset registration.
if ( file_exists( buddypress()->plugin_dir . 'bp-core/admin/bb-admin-common-assets.php' ) ) {
require_once buddypress()->plugin_dir . 'bp-core/admin/bb-admin-common-assets.php';
}

// Admin-only cover image upload + user crop AJAX handlers
// (`bb_admin_cover_image_upload_temp` + `bb_admin_cover_image_set`).
// Two-step pipeline that mirrors the avatar crop flow so the React
Expand Down Expand Up @@ -270,6 +280,31 @@ function bb_register_help_content_rest_route() {
}
add_action( 'rest_api_init', 'bb_register_help_content_rest_route' );

/**
* Register the Integrations marketplace REST proxy route.
*
* Same-origin server-side proxy for the buddyboss.com Integrations directory
* (`wp/v2/integrations` + taxonomies). Mirrors the help-content proxy with its
* own cache namespace and filters. The React Integrations screen POSTs path-only
* fragments to `buddyboss/v1/integrations/proxy`.
*
* @since BuddyBoss [BBVERSION]
*
* @return void
*/
function bb_register_integrations_rest_route() {
$controller_file = buddypress()->plugin_dir . 'bp-core/admin/classes/class-bb-rest-integrations-endpoint.php';
if ( ! file_exists( $controller_file ) ) {
return;
}
require_once $controller_file;
if ( ! class_exists( 'BB_REST_Integrations_Endpoint' ) ) {
return;
}
( new BB_REST_Integrations_Endpoint() )->register_routes();
}
add_action( 'rest_api_init', 'bb_register_integrations_rest_route' );

/**
* Initialize the Integration Bridge early.
*
Expand Down
7 changes: 7 additions & 0 deletions src/bp-core/admin/bb-admin-settings-page.php
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,13 @@ function bb_admin_settings_page() {
}
}

// Shared admin header CSS (the global header styles moved out of admin.css
// into the shared common stylesheet so Settings and Integrations
// share one source). Registered by bb_register_admin_common_assets().
if ( wp_style_is( 'bb-admin-common-style', 'registered' ) ) {
wp_enqueue_style( 'bb-admin-common-style' );
}

// Localize script with admin data.
$groups_per_page_option = bp_core_do_network_admin() ? 'buddyboss_page_bp_groups_network_per_page' : 'buddyboss_page_bp_groups_per_page';
$groups_per_page = absint( get_user_option( $groups_per_page_option, get_current_user_id() ) );
Expand Down
1 change: 1 addition & 0 deletions src/bp-core/admin/bb-settings/common/build/index.asset.php
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<?php return array('dependencies' => array('react', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n'), 'version' => '7fcd9df14272156368f8');
Loading
Loading