Skip to content

Commit 423a1fc

Browse files
committed
add set about, contact, faq page interactive tasks
1 parent 562d54b commit 423a1fc

10 files changed

Lines changed: 664 additions & 38 deletions

File tree

assets/css/page-widgets/suggested-tasks.css

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -495,3 +495,104 @@
495495
}
496496
}
497497
}
498+
499+
/*------------------------------------*\
500+
Page select setting.
501+
\*------------------------------------*/
502+
.prpl-pages-item {
503+
504+
&:has(input[type="radio"][value="yes"]:checked),
505+
&:has(input[type="radio"][value="no"]:checked) {
506+
507+
h3 {
508+
509+
.icon-exclamation-circle {
510+
display: block;
511+
}
512+
513+
.icon-check-circle {
514+
display: none;
515+
}
516+
}
517+
}
518+
519+
&:has(option[value=""]:not(:checked)):has(input[type="radio"][value="yes"]:checked),
520+
&:has(input[type="radio"][value="not-applicable"]:checked) {
521+
522+
h3 {
523+
524+
.icon-check-circle {
525+
display: block;
526+
}
527+
528+
.icon-exclamation-circle {
529+
display: none;
530+
}
531+
}
532+
}
533+
534+
.item-actions,
535+
.prpl-select-page {
536+
display: flex;
537+
align-items: center;
538+
gap: 1rem;
539+
}
540+
541+
.remind-button,
542+
.assign-button {
543+
544+
svg {
545+
width: 1rem;
546+
height: 1rem;
547+
}
548+
}
549+
550+
h3 {
551+
font-size: 1.15rem;
552+
margin: 0;
553+
554+
display: flex;
555+
align-items: center;
556+
gap: 0.5rem;
557+
558+
.icon {
559+
width: 1em;
560+
height: 1em;
561+
display: none;
562+
}
563+
}
564+
565+
p {
566+
margin-block-start: 0.5rem;
567+
margin-block-end: 1rem;
568+
}
569+
570+
.radios {
571+
margin-bottom: 1rem;
572+
}
573+
574+
.prpl-radio-wrapper {
575+
display: flex;
576+
justify-content: space-between;
577+
align-items: center;
578+
579+
[data-action="select"],
580+
[data-action="create"] {
581+
visibility: hidden;
582+
}
583+
584+
&:has(input[type="radio"]:checked) {
585+
586+
[data-action="select"],
587+
[data-action="create"] {
588+
visibility: visible;
589+
}
590+
}
591+
592+
&:has(input[type="radio"][value="not-applicable"]) {
593+
padding-top: 0.25rem;
594+
595+
/* Add bit height, because we dont have button or select */
596+
}
597+
}
598+
}

assets/css/settings-page.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@
211211
}
212212
}
213213

214-
.prpl-button {
214+
.prpl-button-link {
215215
color: var(--prpl-color-gray-7);
216216
text-decoration: none;
217217
border: 1px solid var(--prpl-color-border);
Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
/* global prplInteractiveTaskFormListener, progressPlanner, prplDocumentReady */
2+
3+
/*
4+
* Set page settings (About, Contact, FAQ, etc.)
5+
*
6+
* Dependencies: progress-planner/recommendations/interactive-task
7+
*/
8+
9+
// Initialize custom submit handlers for all set-page tasks.
10+
prplDocumentReady( function () {
11+
// Find all set-page popovers.
12+
const popovers = document.querySelectorAll(
13+
'[id^="prpl-popover-set-page-"]'
14+
);
15+
16+
popovers.forEach( function ( popover ) {
17+
// Extract page name from popover ID (e.g., "prpl-popover-set-page-about" -> "about")
18+
const popoverId = popover.id;
19+
const match = popoverId.match( /prpl-popover-set-page-(.+)/ );
20+
if ( ! match ) {
21+
return;
22+
}
23+
24+
const pageName = match[ 1 ];
25+
const taskId = 'set-page-' + pageName;
26+
27+
// Skip if already initialized.
28+
if ( popover.dataset.setPageInitialized ) {
29+
return;
30+
}
31+
popover.dataset.setPageInitialized = 'true';
32+
33+
prplInteractiveTaskFormListener.customSubmit( {
34+
taskId,
35+
popoverId,
36+
callback: () => {
37+
return new Promise( ( resolve, reject ) => {
38+
const pageValue = document.querySelector(
39+
'#' +
40+
popoverId +
41+
' input[name="pages[' +
42+
pageName +
43+
'][have_page]"]:checked'
44+
);
45+
46+
if ( ! pageValue ) {
47+
reject( {
48+
success: false,
49+
error: new Error( 'Page value not found' ),
50+
} );
51+
return;
52+
}
53+
54+
const pageId = document.querySelector(
55+
'#' +
56+
popoverId +
57+
' select[name="pages[' +
58+
pageName +
59+
'][id]"]'
60+
);
61+
62+
fetch( progressPlanner.ajaxUrl, {
63+
method: 'POST',
64+
headers: {
65+
'Content-Type': 'application/x-www-form-urlencoded',
66+
},
67+
body: new URLSearchParams( {
68+
action: 'prpl_interactive_task_submit_set-page',
69+
nonce: progressPlanner.nonce,
70+
have_page: pageValue.value,
71+
id: pageId ? pageId.value : '',
72+
task_id: taskId,
73+
} ),
74+
} )
75+
.then( ( response ) => response.json() )
76+
.then( ( data ) => {
77+
if ( data.success ) {
78+
resolve( { response: data, success: true } );
79+
} else {
80+
reject( { success: false, error: data } );
81+
}
82+
} )
83+
.catch( ( error ) => {
84+
reject( { success: false, error } );
85+
} );
86+
} );
87+
},
88+
} );
89+
} );
90+
} );
91+
92+
const prplTogglePageSelectorSettingVisibility = function ( page, value ) {
93+
const itemRadiosWrapperEl = document.querySelector(
94+
`.prpl-pages-item-${ page } .radios`
95+
);
96+
97+
if ( ! itemRadiosWrapperEl ) {
98+
return;
99+
}
100+
101+
const selectPageWrapper =
102+
itemRadiosWrapperEl.querySelector( '.prpl-select-page' );
103+
104+
if ( ! selectPageWrapper ) {
105+
return;
106+
}
107+
108+
// Show only create button.
109+
if ( 'no' === value || 'not-applicable' === value ) {
110+
// Hide <select> wrapper.
111+
selectPageWrapper.style.visibility = 'hidden';
112+
}
113+
114+
// Show only select and edit button.
115+
if ( 'yes' === value ) {
116+
// Show <select> wrapper.
117+
selectPageWrapper.style.visibility = 'visible';
118+
}
119+
};
120+
121+
prplDocumentReady( function () {
122+
document
123+
.querySelectorAll( 'input[type="radio"][data-page]' )
124+
.forEach( function ( radio ) {
125+
const page = radio.getAttribute( 'data-page' ),
126+
value = radio.value;
127+
128+
if ( radio ) {
129+
// Show/hide the page selector setting if radio is checked.
130+
if ( radio.checked ) {
131+
prplTogglePageSelectorSettingVisibility( page, value );
132+
}
133+
134+
// Add listeners for all radio buttons.
135+
radio.addEventListener( 'change', function () {
136+
prplTogglePageSelectorSettingVisibility( page, value );
137+
} );
138+
}
139+
} );
140+
} );

classes/admin/class-page-settings.php

Lines changed: 49 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -143,49 +143,65 @@ public function store_settings_form_options() {
143143
// Sanitize the pages array at point of reception.
144144
$pages = \map_deep( \wp_unslash( $_POST['pages'] ), 'sanitize_text_field' ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
145145

146-
foreach ( $pages as $type => $page_args ) {
147-
$need_page = isset( $page_args['have_page'] ) ? $page_args['have_page'] : '';
148-
149-
\progress_planner()->get_page_types()->set_no_page_needed(
150-
$type,
151-
'not-applicable' === $need_page
152-
);
153-
154-
// Remove the post-meta from the existing posts.
155-
$existing_posts = \progress_planner()->get_page_types()->get_posts_by_type( 'any', $type );
156-
foreach ( $existing_posts as $post ) {
157-
if ( $post->ID === (int) $page_args['id'] && 'no' !== $page_args['have_page'] ) {
158-
continue;
159-
}
146+
$this->set_page_values( $pages );
147+
}
160148

161-
// Get the term-ID for the type.
162-
$term = \get_term_by( 'slug', $type, Page_Types::TAXONOMY_NAME );
163-
if ( ! $term instanceof \WP_Term ) {
164-
continue;
165-
}
149+
$this->save_settings();
150+
$this->save_post_types();
166151

167-
// Remove the assigned terms from the `progress_planner_page_types` taxonomy.
168-
\wp_remove_object_terms( $post->ID, $term->term_id, Page_Types::TAXONOMY_NAME );
169-
}
152+
\do_action( 'progress_planner_settings_form_options_stored' );
153+
154+
\wp_send_json_success( \esc_html__( 'Options stored successfully', 'progress-planner' ) );
155+
}
156+
157+
/**
158+
* Set the page value.
159+
*
160+
* @param array $pages The pages.
161+
*
162+
* @return void
163+
*/
164+
public function set_page_values( $pages ) {
170165

171-
// Skip if the ID is not set.
172-
if ( ! isset( $page_args['id'] ) || 1 > (int) $page_args['id'] ) {
166+
if ( empty( $pages ) ) {
167+
return;
168+
}
169+
170+
foreach ( $pages as $type => $page_args ) {
171+
$need_page = isset( $page_args['have_page'] ) ? $page_args['have_page'] : '';
172+
173+
\progress_planner()->get_page_types()->set_no_page_needed(
174+
$type,
175+
'not-applicable' === $need_page
176+
);
177+
178+
// Remove the post-meta from the existing posts.
179+
$existing_posts = \progress_planner()->get_page_types()->get_posts_by_type( 'any', $type );
180+
foreach ( $existing_posts as $post ) {
181+
if ( $post->ID === (int) $page_args['id'] && 'no' !== $page_args['have_page'] ) {
173182
continue;
174183
}
175184

176-
if ( 'no' !== $page_args['have_page'] ) {
177-
// Add the term to the `progress_planner_page_types` taxonomy.
178-
\progress_planner()->get_page_types()->set_page_type_by_id( (int) $page_args['id'], $type );
185+
// Get the term-ID for the type.
186+
$term = \get_term_by( 'slug', $type, Page_Types::TAXONOMY_NAME );
187+
if ( ! $term instanceof \WP_Term ) {
188+
continue;
179189
}
180-
}
181-
}
182190

183-
$this->save_settings();
184-
$this->save_post_types();
191+
// Remove the assigned terms from the `progress_planner_page_types` taxonomy.
192+
\wp_remove_object_terms( $post->ID, $term->term_id, Page_Types::TAXONOMY_NAME );
193+
}
185194

186-
\do_action( 'progress_planner_settings_form_options_stored' );
195+
// Skip if the ID is not set.
196+
if ( ! isset( $page_args['id'] ) || 1 > (int) $page_args['id'] ) {
197+
continue;
198+
}
187199

188-
\wp_send_json_success( \esc_html__( 'Options stored successfully', 'progress-planner' ) );
200+
if ( 'no' !== $page_args['have_page'] ) {
201+
// Add the term to the `progress_planner_page_types` taxonomy.
202+
\progress_planner()->get_page_types()->set_page_type_by_id( (int) $page_args['id'], $type );
203+
}
204+
}
189205
}
190206

191207
/**

classes/suggested-tasks/class-tasks-manager.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@
3939
use Progress_Planner\Suggested_Tasks\Providers\Set_Date_Format;
4040
use Progress_Planner\Suggested_Tasks\Providers\SEO_Plugin;
4141
use Progress_Planner\Suggested_Tasks\Providers\Improve_Pdf_Handling;
42+
use Progress_Planner\Suggested_Tasks\Providers\Set_Page_About;
43+
use Progress_Planner\Suggested_Tasks\Providers\Set_Page_FAQ;
44+
use Progress_Planner\Suggested_Tasks\Providers\Set_Page_Contact;
4245

4346
/**
4447
* Tasks_Manager class.
@@ -87,6 +90,9 @@ public function __construct() {
8790
new Set_Date_Format(),
8891
new SEO_Plugin(),
8992
new Improve_Pdf_Handling(),
93+
new Set_Page_About(),
94+
new Set_Page_FAQ(),
95+
new Set_Page_Contact(),
9096
];
9197

9298
// Add the plugin integration.

0 commit comments

Comments
 (0)