Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Epic: Campaigns #7506

Draft
wants to merge 118 commits into
base: develop
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
118 commits
Select commit Hold shift + click to select a range
9482b84
chore: Add Campaigns domain
kjohnson Aug 21, 2024
3a9a502
chore: Add Campaigns service provider
kjohnson Aug 21, 2024
a56ea7b
Feature: add campaigns menu item and initial empty page (#7511)
glaubersilva Aug 22, 2024
3741176
Create campaign tables (#7519)
alaca Aug 27, 2024
b13f5ff
Feature: Add Campaign model and repository (#7520)
alaca Aug 28, 2024
3f1b23f
Merge branch 'develop' into epic/campaigns
kjohnson Aug 28, 2024
0b24a19
Feature: Add migration to create initial campaigns from existing dona…
kjohnson Aug 28, 2024
f12b328
Feature: Add campaign pages (#7510)
kjohnson Sep 3, 2024
99d42e5
Feature: add list table for campaigns (#7524)
glaubersilva Sep 5, 2024
fac70e4
Feature: Relate Campaigns to Donation Forms with one-to-many relation…
kjohnson Sep 5, 2024
e288b63
Feature: add campaign details page (#7531)
glaubersilva Sep 6, 2024
979c5c0
Refactor: Exclude P2P Campaigns from core query (#7534)
kjohnson Sep 10, 2024
aa54987
Refactor: Update Forms to Campaigns migration (#7532)
kjohnson Sep 12, 2024
9be3b13
Merge branch 'develop' into epic/campaigns
kjohnson Sep 12, 2024
05fe5be
Feature: Add query builder for Campaign Donations (#7544)
kjohnson Sep 18, 2024
4314f8b
Merge branch 'develop' into epic/campaigns
kjohnson Sep 18, 2024
9bbaa90
Merge branch 'develop' into epic/campaigns
kjohnson Sep 20, 2024
38ca04d
Feature: add campaign details page header with tabs, save buttons, an…
glaubersilva Sep 23, 2024
155924a
Feature: Add endpoint for Campaign Overview Statistics (#7545)
kjohnson Sep 25, 2024
da95ba6
Merge branch 'develop' into epic/campaigns
kjohnson Sep 25, 2024
67011c2
Feature: add create new campaign flow (#7543)
glaubersilva Oct 1, 2024
e961e42
Feature: Campaign Settings tab (#7547)
alaca Oct 1, 2024
7abceb8
Feature: add Forms tab to the campaign details page (#7555)
glaubersilva Oct 3, 2024
92e2ae4
Feature: Add campaign overview statistics (#7559)
kjohnson Oct 4, 2024
5a4570c
Refactor: add new styles for list table views (#7558)
glaubersilva Oct 8, 2024
49678f6
Merge branch 'develop' into epic/campaigns
glaubersilva Oct 8, 2024
bb241ae
fix: fatal errors while updating goal and goalType
glaubersilva Oct 8, 2024
41a64c3
fix: campaign status filter
glaubersilva Oct 8, 2024
380ebc5
fix: migration missing campaign id
glaubersilva Oct 8, 2024
3e40b7c
fix: missing tab navigation through browser back and forward buttons
glaubersilva Oct 8, 2024
63219f8
Feature: Archive campaigns (#7565)
alaca Oct 14, 2024
520f2a3
Feature: add campaign goal types for recurring donations (#7567)
glaubersilva Oct 14, 2024
834138e
Merge branch 'develop' into epic/campaigns
glaubersilva Oct 14, 2024
3618252
Chore: Replace test data from Campaign Stats (#7574)
kjohnson Oct 17, 2024
c9e164b
Feature: Form inherits campaign goal (#7569)
alaca Oct 22, 2024
d2a5dd0
Feature: add Option-Based Form Editor feature flag (#7571)
glaubersilva Oct 22, 2024
f799ebc
Feature: add update default form method and missing tests for new met…
glaubersilva Oct 25, 2024
78417d7
Refactor: Update goal progress widget styles (#7591)
kjohnson Oct 28, 2024
54a6279
Feature: Add campaign default form widget (#7584)
kjohnson Oct 31, 2024
18d4c4c
Fix: Check for campaign goal before calculating percentage (#7596)
kjohnson Nov 4, 2024
937c430
Feature: Associate upgraded form to a campaign (#7592)
alaca Nov 6, 2024
1864e84
Feature: add merge campaigns methods (#7597)
glaubersilva Nov 6, 2024
09dce3d
Feature: add merge campaigns endpoint (#7605)
glaubersilva Nov 6, 2024
1dc7949
Fix: remove unnecessary error message when selecting the initial goal…
glaubersilva Nov 7, 2024
cef7414
Fix: goal creation modal should not highlight previous button (#7611)
glaubersilva Nov 7, 2024
1bbd809
Feature: add "Make as default" action to the forms list view (#7606)
glaubersilva Nov 8, 2024
462bd8c
Feature: add merge campaigns UI (#7612)
glaubersilva Nov 8, 2024
f112d87
Update campaign design implementation (#7613)
kjohnson Nov 8, 2024
bcc93c0
Fix: Prevent page refresh when opening the Create Campaign Modal (#7608)
kjohnson Nov 8, 2024
9fe6d37
Feature: add campaign page settings (#7624)
glaubersilva Nov 19, 2024
0409274
Merge branch 'develop' into epic/campaigns
glaubersilva Nov 20, 2024
3ccb57a
refactor: hide the "Switch to Legacy View" button
glaubersilva Nov 20, 2024
45bfa95
Feature: Add revenue data to Campaign Overview (#7588)
kjohnson Nov 20, 2024
da7aa04
Feature: Default form tooltip (#7590)
alaca Nov 21, 2024
670498e
Fix: Update styles for archive campaign modal UI (#7618)
jdghinson Nov 21, 2024
4bc0ecf
Refactor: Update goal progress with campaign entity (#7628)
kjohnson Nov 21, 2024
fd2f0d3
Merge branch 'develop' into epic/campaigns
jonwaldstein Nov 22, 2024
6a0ffad
Merge branch 'develop' into epic/campaigns
glaubersilva Dec 3, 2024
9db67ba
Refactor: Default form (#7616)
alaca Dec 4, 2024
1804935
Feature: Update Campaign Donation Query (#7630)
alaca Dec 4, 2024
25ac81c
Refactor: Campaign status changes (#7639)
alaca Dec 4, 2024
79b02b7
Refactor: Default form functionality (#7640)
alaca Dec 6, 2024
6c67a30
Feature: Add deferred resolution to model factory definitions (#7626)
kjohnson Dec 6, 2024
899fa1b
Refactor: use DonationForm model to create default campaign form (#7638)
JoshuaHungDinh Dec 9, 2024
c9c3e4f
Fix: make entity prop optional (#7644)
alaca Dec 10, 2024
a4648f6
Merge branch 'develop' into epic/campaigns
glaubersilva Dec 10, 2024
3b8580c
Fix: adjust Campaign overview tab styles (#7636)
JoshuaHungDinh Dec 11, 2024
a26e2f6
Refactor: change font-size for modal input descriptions (#7650)
glaubersilva Dec 20, 2024
7dd1436
Refactor: migrate v2 forms to campaigns and add upgraded forms as cam…
glaubersilva Dec 23, 2024
f74bfa9
Merge branch 'develop' into epic/campaigns
glaubersilva Dec 23, 2024
623a3d9
Refactor: adjust Campaign settings page styles (#7646)
JoshuaHungDinh Jan 7, 2025
042ca2b
Refactor: update list table confirmation modals (#7649)
JoshuaHungDinh Jan 7, 2025
63ed1f5
Refactor: Improve Campaign Overview page styling and structure (#7666)
JoshuaHungDinh Jan 13, 2025
a9ba5df
Feature: Add campaign title block (#7648)
pauloiankoski Jan 16, 2025
22bbb3b
Feature: add Campaign Cover Block (#7701)
JoshuaHungDinh Feb 2, 2025
74b417f
Feature: ListTable configuration (#7678)
alaca Feb 3, 2025
760a4bc
Feature: Campaign Donate Button block (#7687)
alaca Feb 3, 2025
d149099
chore: merge develop and fix conflicts
Feb 5, 2025
3056b51
Feature: Add Campaign Donors block (#7700)
pauloiankoski Feb 6, 2025
ca092ad
Feature: Add Campaign Donations block (#7703)
pauloiankoski Feb 6, 2025
d051ea2
Fix: prevent donation details page fatal error (#7711)
jonwaldstein Feb 10, 2025
eab7e73
Fix: Prevent NaN error in Campaign Overview Stat Widget (#7698)
kjohnson Feb 10, 2025
9980846
Feature: Register campaign theme color settings (#7707)
pauloiankoski Feb 13, 2025
dc82528
Refactor: Remove Edit button from default form widget (#7728)
pauloiankoski Feb 13, 2025
6175641
Fix: View Campaign Button (#7721)
alaca Feb 13, 2025
de80d9b
Refactor: update Campaign details to remove hardcoded USD and locale …
jonwaldstein Feb 13, 2025
c655c07
Feature: add campaign stats block (#7726)
JoshuaHungDinh Feb 13, 2025
fb9fb72
Feature: Campaign Goal Block (#7702)
alaca Feb 14, 2025
e2c0e8c
Fix: remove font weight hover styles on campaign tabs (#7742)
JoshuaHungDinh Feb 17, 2025
4427426
Fix: ensure campaign goal progress percentage is an integer and does …
jonwaldstein Feb 17, 2025
f9244ae
Feature: Campaign List Block (#7708)
alaca Feb 17, 2025
a9132d2
Fix: Force campaign save on initial publish (#7715)
kjohnson Feb 17, 2025
65ec8b9
Fix: Campaign pages support titles (#7713)
kjohnson Feb 17, 2025
4785a06
Fix: Duplicated forms are assigned to the campaign of the original fo…
kjohnson Feb 17, 2025
2f89ad4
chore: merge develop and fix conflicts
Feb 17, 2025
85c5f00
Refactor: remove option to delete a campaign (#7739)
jonwaldstein Feb 18, 2025
134e37e
Merge branch 'develop' into epic/campaigns
Feb 18, 2025
4c3bbd8
Refactor: replace "Donation Form" with "Campaign Form" in the onboard…
glaubersilva Feb 18, 2025
d90f69e
Refactor: remove "Add Form" options (#7722)
glaubersilva Feb 18, 2025
ca65e59
Fix: Set a minimum for the y-axis of the Campaign revenue chart (#7717)
kjohnson Feb 18, 2025
497a70c
Refactor: hide trash option for campaign default form (#7738)
jonwaldstein Feb 18, 2025
8f56ff1
chore: merge develop and fix conflicts
Feb 18, 2025
a832c02
fix: correct merge for removing add form options
Feb 18, 2025
a79831d
fix: correct merge to add back campaign list table entry
Feb 18, 2025
a161605
fix: missing locale for "Add campaign form" button
glaubersilva Feb 18, 2025
73b8661
Fix: conditionally update campaign end date (#7747)
jonwaldstein Feb 19, 2025
b529388
Feature: add campaign comments block (#7724)
JoshuaHungDinh Feb 19, 2025
b1081c5
fix: php warning on block title render regarding undefined variable
Feb 19, 2025
f1c5162
Refactor: Replace Campaign Short Description editor with textarea (#7…
pauloiankoski Feb 19, 2025
9ee4991
Feature: Campaign Page Default Layout (#7746)
kjohnson Feb 19, 2025
706f15c
Refactor: ensure campaign cover block does not render unless an image…
JoshuaHungDinh Feb 20, 2025
2876666
Fix: Campaign status change - archive (#7749)
alaca Feb 20, 2025
2d507f5
Refactor: Remove cover video support (#7751)
pauloiankoski Feb 21, 2025
c519b8d
Feature: Campaign Block (#7727)
alaca Feb 21, 2025
8a5e425
chore: merge develop and fix conflicts
Feb 21, 2025
78fbe7b
Fix: Customize editor back button for Campaign Page post type (#7714)
kjohnson Feb 21, 2025
91aac39
Fix: Maintain aspect ratio for the Campaign Cover Image block (#7718)
kjohnson Feb 21, 2025
71e0a06
Fix: Return 404 for campaign pages when disabled on the campaign (#7716)
kjohnson Feb 21, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
4 changes: 4 additions & 0 deletions assets/src/css/admin/_components.admin-header.scss
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@
.post-type-give_forms,
.give_forms_page_give-subscriptions {

.page-title-action:not(.switch-new-view) {
display: none;
}

.wp-header-end + .notice {
margin-top: 11px;
}
Expand Down
119 changes: 65 additions & 54 deletions assets/src/js/admin/reports/components/no-data-notice/index.js
Original file line number Diff line number Diff line change
@@ -1,71 +1,82 @@
// Dependencies
import { useState, Fragment } from 'react';
import { __ } from '@wordpress/i18n'
import { getWindowData } from '../../utils';
import {Fragment, useState} from 'react';
import {__} from '@wordpress/i18n';
import {getWindowData} from '../../utils';

// Store-related dependencies
import { useStoreValue } from '../../store';
import { disablePeriodSelector } from '../../store/actions';
import {useStoreValue} from '../../store';
import {disablePeriodSelector} from '../../store/actions';

// Styles
import './style.scss';

const NoDataNotice = ( { version } ) => {
const [ {}, dispatch ] = useStoreValue();
const NoDataNotice = ({version}) => {
const [{}, dispatch] = useStoreValue();

const [ showNotice, setShowNotice ] = useState( true );
const [showNotice, setShowNotice] = useState(true);

const loadSampleData = () => {
setShowNotice( false );
dispatch( disablePeriodSelector() );
};
const loadSampleData = () => {
setShowNotice(false);
dispatch(disablePeriodSelector());
};

const goToNewFormUrl = () => {
const url = getWindowData( 'newFormUrl' );
window.location = url;
};
const goToNewFormUrl = () => {
const url = getWindowData('newFormUrl');
window.location = url;
};

return (
<Fragment>
{ showNotice && (
<div className="givewp-not-found-notice">
<div className="givewp-not-found-card">
{ version === 'dashboard' ? (
<Fragment>
<h2>{ __( 'Get a quick view of your', 'give' ) }<br />{ __( 'donation activity', 'give' ) }</h2>
<p>
{ __( 'It looks like there hasn\'t been any donations yet on your website.', 'give' ) } <br />
{ __( 'Set up a donation form to begin collecting donations now.', 'give' ) } <br />
</p>
<button
onClick={ () => goToNewFormUrl() }
className="givewp-not-found-notice-button">
{ __( 'Create a Donation Form', 'give' ) }
</button>
</Fragment>
) : (
<Fragment>
<h2>{ __( 'Get a detailed view of your', 'give' ) }<br />{ __( 'donation activity', 'give' ) }</h2>
<p>
{ __( 'It looks like there hasn\'t been any donations yet on your website. ', 'give' ) } <br />
{ __( 'Set up a donation form to begin collection donations or load some sample data to preview what the reports look like.', 'give' ) } <br />
</p>
<button
onClick={ () => loadSampleData() }
className="givewp-not-found-notice-button">
{ __( 'Explore Sample Reports', 'give' ) }
</button>
</Fragment>
) }
</div>
</div>
) }
</Fragment>
);
return (
<Fragment>
{showNotice && (
<div className="givewp-not-found-notice">
<div className="givewp-not-found-card">
{version === 'dashboard' ? (
<Fragment>
<h2>
{__('Get a quick view of your', 'give')}
<br />
{__('donation activity', 'give')}
</h2>
<p>
{__("It looks like there hasn't been any donations yet on your website.", 'give')}{' '}
<br />
{__('Set up a campaign form to begin collecting donations now.', 'give')}
<br />
</p>
<button onClick={() => goToNewFormUrl()} className="givewp-not-found-notice-button">
{__('Create a Campaign Form', 'give')}
</button>
</Fragment>
) : (
<Fragment>
<h2>
{__('Get a detailed view of your', 'give')}
<br />
{__('donation activity', 'give')}
</h2>
<p>
{__("It looks like there hasn't been any donations yet on your website. ", 'give')}{' '}
<br />
{__(
'Set up a campaign form to begin collection donations or load some sample data to preview what the reports look like.',
'give'
)}{' '}
<br />
</p>
<button onClick={() => loadSampleData()} className="givewp-not-found-notice-button">
{__('Explore Sample Reports', 'give')}
</button>
</Fragment>
)}
</div>
</div>
)}
</Fragment>
);
};

NoDataNotice.defaultProps = {
version: 'app',
version: 'app',
};

export default NoDataNotice;
39 changes: 22 additions & 17 deletions blocks/components/no-form/index.js
Original file line number Diff line number Diff line change
@@ -1,33 +1,38 @@
/**
* WordPress dependencies
*/
import { __ } from '@wordpress/i18n'
import { Button } from '@wordpress/components';
import {__} from '@wordpress/i18n';
import {Button} from '@wordpress/components';

/**
* Internal dependencies
*/
import { getSiteUrl } from '../../utils';
import {getSiteUrl} from '../../utils';
import GiveBlankSlate from '../blank-slate';

/**
* Render No forms Found UI
*/
*
* @unreleased Replace "new form" with "new campaign form" link
*/

const NoForms = () => {
return (
<GiveBlankSlate title={ __( 'No donation forms found.', 'give' ) }
description={ __( 'The first step towards accepting online donations is to create a form.', 'give' ) }
helpLink>
<Button
isPrimary
isLarge
className="give-blank-slate__cta"
href={ `${ getSiteUrl() }/wp-admin/post-new.php?post_type=give_forms` }>
{ __( 'Create Donation Form', 'give' ) }
</Button>
</GiveBlankSlate>
);
return (
<GiveBlankSlate
title={__('No campaign forms found.', 'give')}
description={__('The first step towards accepting online donations is to create a campaign.', 'give')}
helpLink
>
<Button
isPrimary
isLarge
className="give-blank-slate__cta"
href={`${getSiteUrl()}/wp-admin/edit.php?post_type=give_forms&page=give-campaigns&new=campaign`}
>
{__('Create Campaign Form', 'give')}
</Button>
</GiveBlankSlate>
);
};

export default NoForms;
Original file line number Diff line number Diff line change
Expand Up @@ -270,6 +270,7 @@ private function getAsArray($value) {
/**
* Return formatted notice when shortcode return empty string
*
* @unreleased Replace "new form" with "new campaign form" link
* @since 2.4.0
*
* @return string
Expand All @@ -284,10 +285,11 @@ private function blank_slate() {
$content = array(
'image_url' => GIVE_PLUGIN_URL . 'assets/dist/images/give-icon-full-circle.svg',
'image_alt' => __( 'Give Icon', 'give' ),
'heading' => __( 'No donation forms found.', 'give' ),
'message' => __( 'The first step towards accepting online donations is to create a form.', 'give' ),
'cta_text' => __( 'Create Donation Form', 'give' ),
'cta_link' => admin_url( 'post-new.php?post_type=give_forms' ),
'heading' => __('No campaign forms found.', 'give'),
'message' => __('The first step towards accepting online donations is to create a campaign.',
'give'),
'cta_text' => __('Create Campaign Form', 'give'),
'cta_link' => admin_url('edit.php?post_type=give_forms&page=give-campaigns&new=campaign'),
'help' => sprintf(
/* translators: 1: Opening anchor tag. 2: Closing anchor tag. */
__( 'Need help? Get started with %1$sGive 101%2$s.', 'give' ),
Expand Down
4 changes: 3 additions & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@
"woocommerce/action-scheduler": "^3.6",
"psr/container": "1.1.1",
"ext-json": "*",
"stellarwp/admin-notices": "^2.0"
"stellarwp/admin-notices": "^2.0",
"stellarwp/arrays": "^1.3"
},
"require-dev": {
"fakerphp/faker": "^1.9",
Expand Down Expand Up @@ -96,6 +97,7 @@
"classmap_prefix": "Give_Vendors_",
"constant_prefix": "GIVE_VENDORS_",
"packages": [
"stellarwp/arrays",
"stellarwp/admin-notices",
"stellarwp/validation",
"stellarwp/field-conditions",
Expand Down
50 changes: 49 additions & 1 deletion composer.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions give.php
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
* - The GiveWP Team
*/

use Give\Campaigns\Repositories\CampaignRepository;
use Give\Container\Container;
use Give\DonationForms\ServiceProvider as DonationFormsServiceProvider;
use Give\DonationForms\V2\Repositories\DonationFormsRepository;
Expand Down Expand Up @@ -133,6 +134,7 @@
* @property-read DonorRepositoryProxy $donors
* @property-read SubscriptionRepository $subscriptions
* @property-read DonationFormsRepository $donationForms
* @property-read CampaignRepository $campaigns
* @property-read Profile $donorDashboard
* @property-read TabsRegister $donorDashboardTabs
* @property-read Give_Recurring_DB_Subscription_Meta $subscription_meta
Expand Down Expand Up @@ -245,6 +247,7 @@ final class Give
Give\FormTaxonomies\ServiceProvider::class,
Give\DonationSpam\ServiceProvider::class,
Give\Settings\ServiceProvider::class,
Give\Campaigns\ServiceProvider::class,
Give\FeatureFlags\OptionBasedFormEditor\ServiceProvider::class,
Give\ThirdPartySupport\ServiceProvider::class,
];
Expand Down
15 changes: 9 additions & 6 deletions includes/admin/class-blank-slate.php
Original file line number Diff line number Diff line change
Expand Up @@ -249,20 +249,23 @@ private function donor_exists() {
/**
* Gets the content of a blank slate message based on provided context.
*
* @since 1.8.13
* @unreleased Replace "new form" with "new campaign form" link
* @since 1.8.13
*
* @param string $context The key used to determine which content is returned.
*
* @return array Blank slate content.
*/
private function get_content( $context ) {
// Define default content.
$defaults = array(
'image_url' => GIVE_PLUGIN_URL . 'assets/dist/images/give-icon-full-circle.svg',
'image_alt' => __( 'GiveWP Icon', 'give' ),
'heading' => __( 'No donation forms found.', 'give' ),
'message' => __( 'The first step towards accepting online donations is to create a form.', 'give' ),
'cta_text' => __( 'Create Donation Form', 'give' ),
'cta_link' => admin_url( 'post-new.php?post_type=give_forms' ),
'image_alt' => __( 'GiveWP Icon', 'give'),
'heading' => __('No campaign forms found.', 'give'),
'message' => __('The first step towards accepting online donations is to create a campaign.',
'give'),
'cta_text' => __('Create Campaign Form', 'give'),
'cta_link' => admin_url('edit.php?post_type=give_forms&page=give-campaigns&new=campaign'),
'help' => sprintf(
/* translators: 1: Opening anchor tag. 2: Closing anchor tag. */
__( 'Need help? Get started with %1$sGive 101%2$s.', 'give' ),
Expand Down
15 changes: 9 additions & 6 deletions includes/admin/shortcodes/shortcode-give-form.php
Original file line number Diff line number Diff line change
Expand Up @@ -33,14 +33,16 @@ public function __construct() {
/**
* Define the shortcode attribute fields
*
* @return array
* @unreleased Replace "new form" with "new campaign form" link
*
* @return array
*/
public function define_fields() {

$create_form_link = sprintf(
/* translators: %s: create new form URL */
__( '<a href="%s">Create</a> a new Donation Form.', 'give' ),
admin_url( 'post-new.php?post_type=give_forms' )
__('<a href="%s">Create</a> a new Campaign Form.', 'give'),
admin_url('edit.php?post_type=give_forms&page=give-campaigns&new=campaign')
);

return array(
Expand All @@ -51,10 +53,11 @@ public function define_fields() {
),
'name' => 'id',
'tooltip' => esc_attr__( 'Select a Donation Form', 'give' ),
'placeholder' => '- ' . esc_attr__( 'Select a Donation Form', 'give' ) . ' -',
'placeholder' => '- ' . esc_attr__('Select a Campaign Form', 'give') . ' -',
'required' => array(
'alert' => esc_html__( 'You must first select a Form!', 'give' ),
'error' => sprintf( '<p class="strong">%s</p><p class="no-margin">%s</p>', esc_html__( 'No forms found.', 'give' ), $create_form_link ),
'alert' => esc_html__('You must first select a Campaign Form!', 'give'),
'error' => sprintf('<p class="strong">%s</p><p class="no-margin">%s</p>',
esc_html__('No campaign forms found.', 'give'), $create_form_link),
),
),
array(
Expand Down
Loading
Loading