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

Feature: Handle orphaned forms #7864

Open
wants to merge 2 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
1 change: 1 addition & 0 deletions src/Campaigns/Actions/LoadCampaignOptions.php
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ public function __invoke()
'showCampaignListTableNotice' => !get_user_meta(get_current_user_id(), 'givewp_campaign_listtable_notice', true),
'showCampaignFormNotice' => !get_user_meta(get_current_user_id(), 'givewp_campaign_form_notice', true),
'showCampaignSettingsNotice' => !get_user_meta(get_current_user_id(), 'givewp_campaign_settings_notice', true),
'orphanedForms' => give_get_option('give_campaign_orphaned_forms')
]
: null,
]
Expand Down
68 changes: 68 additions & 0 deletions src/Campaigns/Actions/OrphanedForms.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
<?php

namespace Give\Campaigns\Actions;

use Give\Campaigns\ValueObjects\CampaignType;
use Give\Framework\Database\DB;
use Give\Framework\QueryBuilder\QueryBuilder;

/**
* @unreleased
*/
class OrphanedForms
{
private string $hookName = 'give_campaign_check_forms';
private string $optionName = 'give_campaign_orphaned_forms';

/**
* @unreleased
*/
public function registerAction()
{
if ( ! as_has_scheduled_action($this->hookName)) {
as_schedule_recurring_action(
time(),
DAY_IN_SECONDS,
$this->hookName
);
}

add_action($this->hookName, function () {
$this->runAction();
});
}

/**
* @unreleased
*/
private function runAction()
{
// Bail out if we already collected orphaned forms
if (give_get_option($this->optionName)) {
return;
}

$forms = DB::table('posts')
->select('ID', 'post_title')
->where('post_type', 'give_forms')
->whereNotIn('ID', function (QueryBuilder $builder) {
$builder
->from('give_campaign_forms')
->select('form_id');
})
// p2p forms
->whereNotIn('ID', function (QueryBuilder $builder) {
$builder
->from('give_campaigns')
->select('form_id')
->where('campaign_type', CampaignType::CORE, '!=');
})
->getAll(ARRAY_A);

if ( ! $forms) {
return;
}

give_update_option($this->optionName, $forms);
}
}
6 changes: 5 additions & 1 deletion src/Campaigns/ServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
use Give\Campaigns\Actions\ArchiveCampaignFormsAsDraftStatus;
use Give\Campaigns\Actions\ArchiveCampaignPagesAsDraftStatus;
use Give\Campaigns\Actions\AssociateCampaignPageWithCampaign;
use Give\Campaigns\Actions\OrphanedForms;
use Give\Campaigns\Actions\CreateCampaignPage;
use Give\Campaigns\Actions\CreateDefaultCampaignForm;
use Give\Campaigns\Actions\FormInheritsCampaignGoal;
Expand Down Expand Up @@ -118,12 +119,15 @@ private function registerTableNames(): void
*/
private function registerActions(): void
{
// @unreleased
Hooks::addAction('init', OrphanedForms::class, 'registerAction');

Hooks::addAction('givewp_campaign_updated', ArchiveCampaignFormsAsDraftStatus::class);
Hooks::addAction('givewp_campaign_updated', ArchiveCampaignPagesAsDraftStatus::class);
Hooks::addAction('givewp_donation_form_creating', FormInheritsCampaignGoal::class);
Hooks::addAction('givewp_campaign_page_created', AssociateCampaignPageWithCampaign::class);
Hooks::addAction('give_form_duplicated', Actions\AssignDuplicatedFormToCampaign::class, '__invoke', 10, 2);

Hooks::addAction('before_delete_post', PreventDeleteDefaultForm::class);
Hooks::addAction('transition_post_status', PreventDeleteDefaultForm::class, 'preventTrashStatusChange', 10, 3);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import ExistingUserIntroModal from '@givewp/campaigns/admin/components/ExistingU
import {getCampaignOptionsWindowData} from '@givewp/campaigns/utils';
import {useCampaignNoticeHook} from '@givewp/campaigns/hooks';
import CampaignNotice from '@givewp/campaigns/admin/components/CampaignDetailsPage/Components/Notices/CampaignNotice';
import OrphanedFormsModal from '@givewp/campaigns/admin/components/OrphanedFormsModal';

declare const window: {
GiveCampaignsListTable: GiveCampaignsListTable;
Expand Down Expand Up @@ -93,6 +94,8 @@ const bulkActions: Array<BulkActionsConfig> = [
];

export default function CampaignsListTable() {
const {admin} = getCampaignOptionsWindowData();
const [isOrphanedFormModalOpen, setIsOrphanedFormModalOpen] = useState<boolean>(admin.orphanedForms);
const [isCreateCampaignModalOpen, setCreateCampaignModalOpen] = useState<boolean>(autoOpenCreateCampaignModal());
const [isExistingUserIntroModalOpen, setExistingUserIntroModalOpen] = useState<boolean>(
shouldShowExistingUserIntroModal
Expand Down Expand Up @@ -141,6 +144,8 @@ export default function CampaignsListTable() {
>
<CreateCampaignModal isOpen={isCreateCampaignModalOpen} setOpen={setCreateCampaignModalOpen} />
<ExistingUserIntroModal isOpen={isExistingUserIntroModalOpen} setOpen={setExistingUserIntroModalOpen} />
<OrphanedFormsModal isOpen={isOrphanedFormModalOpen} setOpen={setIsOrphanedFormModalOpen} />

{!isExistingUserIntroModalOpen && showTooltip && (
<CampaignNotice
title={__('Campaign List', 'give')}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import {useState} from 'react';
import {__} from '@wordpress/i18n';
import styles from './CreateCampaignModal.module.scss';
import CampaignFormModal from '../CampaignFormModal';
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import {__} from '@wordpress/i18n';
import ModalDialog from '@givewp/components/AdminUI/ModalDialog';

/**
* Associate orphaned forms to a campaign
*
* @unreleased
*/
export default function OrphanedFormsModal({isOpen, setOpen}) {

const openModal = () => setOpen(true);
const closeModal = () => {
setOpen(false);
};


return (
<ModalDialog
isOpen={isOpen}
showHeader={true}
handleClose={() => closeModal()}
title={__('Orphaned forms', 'give')}
>
<>

</>
</ModalDialog>
);
}
3 changes: 2 additions & 1 deletion src/Campaigns/resources/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ declare module "@wordpress/data" {
export type GiveCampaignOptions = {
isAdmin: boolean;
adminUrl: string;
campaignsAdminUrl: string;s
campaignsAdminUrl: string;
currency: string;
isRecurringEnabled: boolean;
defaultForm: string;
Expand All @@ -45,6 +45,7 @@ export type GiveCampaignOptions = {
showCampaignListTableNotice: boolean
showCampaignFormNotice: boolean
showCampaignSettingsNotice: boolean
orphanedForms?: []
}
}

Expand Down