Skip to content

Commit 819c7cb

Browse files
authored
Merge pull request #667 from ProgressPlanner/ari/remove-categories
Remove categories
2 parents 345d837 + fb1ad35 commit 819c7cb

52 files changed

Lines changed: 891 additions & 584 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/ISSUE_TEMPLATE/new-task-recommendation.yml

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -28,28 +28,6 @@ body:
2828
validations:
2929
required: true
3030

31-
- type: dropdown
32-
id: category
33-
attributes:
34-
label: Recommendation category
35-
description: Select the most appropriate category for this recommendation
36-
options:
37-
- content-update
38-
- configuration
39-
- user
40-
- other
41-
validations:
42-
required: true
43-
44-
- type: input
45-
id: other_category
46-
attributes:
47-
label: Other category
48-
description: If you selected "other", please specify the category
49-
placeholder: "Specify the category"
50-
validations:
51-
required: false
52-
5331
- type: input
5432
id: capability
5533
attributes:

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

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,26 @@
2828

2929
.prpl-show-all-tasks {
3030
display: none;
31+
32+
.prpl-toggle-all-recommendations-button {
33+
background: none;
34+
border: none;
35+
padding: 0;
36+
color: var(--wp-admin-theme-color, #2271b1);
37+
text-decoration: underline;
38+
cursor: pointer;
39+
font-size: inherit;
40+
font-family: inherit;
41+
42+
&:hover {
43+
color: var(--wp-admin-theme-color-darker-10, #135e96);
44+
}
45+
46+
&:disabled {
47+
opacity: 0.6;
48+
cursor: not-allowed;
49+
}
50+
}
3151
}
3252

3353
&:has(.prpl-suggested-tasks-list li) {

assets/js/suggested-task-terms.js

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
const prplSuggestedTasksTerms = {};
99

1010
const prplTerms = {
11-
category: 'prpl_recommendations_category',
1211
provider: 'prpl_recommendations_provider',
1312

1413
/**
@@ -19,9 +18,7 @@ const prplTerms = {
1918
*/
2019
// eslint-disable-next-line no-unused-vars
2120
get: ( taxonomy ) => {
22-
if ( 'category' === taxonomy ) {
23-
taxonomy = prplTerms.category;
24-
} else if ( 'provider' === taxonomy ) {
21+
if ( 'provider' === taxonomy ) {
2522
taxonomy = prplTerms.provider;
2623
}
2724
return prplSuggestedTasksTerms[ taxonomy ] || {};
@@ -109,7 +106,6 @@ const prplTerms = {
109106
return new Promise( ( resolve ) => {
110107
prplDocumentReady( () => {
111108
Promise.all( [
112-
prplTerms.getCollectionPromise( prplTerms.category ),
113109
prplTerms.getCollectionPromise( prplTerms.provider ),
114110
] ).then( () => resolve( prplSuggestedTasksTerms ) );
115111
} );

assets/js/suggested-task.js

Lines changed: 56 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* global HTMLElement, prplSuggestedTask, prplL10n, prplUpdateRaviGauge, prplTerms, prplSuggestedTasksWidget */
1+
/* global HTMLElement, prplSuggestedTask, prplL10n, prplUpdateRaviGauge, prplTerms */
22
/*
33
* Suggested Task scripts & helpers.
44
*
@@ -34,66 +34,28 @@ prplSuggestedTask = {
3434

3535
const fetchData = {
3636
status: args.status,
37-
per_page: args.per_page || 1,
37+
per_page: args.per_page || 100,
3838
_embed: true,
3939
exclude: prplSuggestedTask.injectedItemIds,
4040
filter: {
4141
orderby: 'menu_order',
4242
order: 'ASC',
4343
},
4444
};
45-
if ( args.category ) {
46-
fetchData[ prplTerms.category ] =
47-
prplTerms.get( 'category' )[ args.category ].id;
45+
46+
// Pass through provider and exclude_provider if provided.
47+
if ( args.provider ) {
48+
fetchData.provider = args.provider;
49+
}
50+
if ( args.exclude_provider ) {
51+
fetchData.exclude_provider = args.exclude_provider;
4852
}
4953

5054
return prplSuggestedTask
5155
.getPostsCollectionPromise( { data: fetchData } )
5256
.then( ( response ) => response.data );
5357
},
5458

55-
/**
56-
* Inject items from a category.
57-
*
58-
* @param {string} taskCategorySlug The task category slug.
59-
* @param {string[]} taskStatus The task status.
60-
*/
61-
injectItemsFromCategory: ( args ) =>
62-
prplSuggestedTask
63-
.fetchItems( {
64-
category: args.category,
65-
status: args.status || [ 'publish' ],
66-
per_page: args.per_page || 1,
67-
} )
68-
.then( ( data ) => {
69-
if ( data.length ) {
70-
// Inject the items into the DOM.
71-
data.forEach( ( item ) => {
72-
document.dispatchEvent(
73-
new CustomEvent( 'prpl/suggestedTask/injectItem', {
74-
detail: {
75-
item,
76-
listId: 'prpl-suggested-tasks-list',
77-
insertPosition: 'beforeend',
78-
},
79-
} )
80-
);
81-
prplSuggestedTask.injectedItemIds.push( item.id );
82-
} );
83-
}
84-
85-
return data;
86-
} )
87-
.then( ( data ) => {
88-
// Toggle the "Loading..." text.
89-
prplSuggestedTasksWidget.removeLoadingItems();
90-
91-
// Trigger the grid resize event.
92-
window.dispatchEvent( new CustomEvent( 'prpl/grid/resize' ) );
93-
94-
return data;
95-
} ),
96-
9759
/**
9860
* Inject items.
9961
*
@@ -145,27 +107,15 @@ prplSuggestedTask = {
145107
*/
146108
getNewItemTemplatePromise: ( { post = {}, listId = '' } ) =>
147109
new Promise( ( resolve ) => {
148-
const {
149-
prpl_recommendations_provider,
150-
prpl_recommendations_category,
151-
} = post;
152-
const terms = {
153-
prpl_recommendations_provider,
154-
prpl_recommendations_category,
155-
};
110+
const { prpl_recommendations_provider } = post;
111+
const terms = { prpl_recommendations_provider };
156112

157113
Object.values( prplTerms.get( 'provider' ) ).forEach( ( term ) => {
158114
if ( term.id === terms[ prplTerms.provider ][ 0 ] ) {
159115
terms[ prplTerms.provider ] = term;
160116
}
161117
} );
162118

163-
Object.values( prplTerms.get( 'category' ) ).forEach( ( term ) => {
164-
if ( term.id === terms[ prplTerms.category ][ 0 ] ) {
165-
terms[ prplTerms.category ] = term;
166-
}
167-
} );
168-
169119
const template = wp.template( 'prpl-suggested-task' );
170120
const data = {
171121
post,
@@ -212,6 +162,10 @@ prplSuggestedTask = {
212162
post.destroy( { url } ).then( () => {
213163
// Remove the task from the todo list.
214164
prplSuggestedTask.removeTaskElement( postId );
165+
166+
// Fetch and inject a replacement task
167+
prplSuggestedTask.fetchAndInjectReplacementTask();
168+
215169
setTimeout(
216170
() =>
217171
window.dispatchEvent(
@@ -243,10 +197,6 @@ prplSuggestedTask = {
243197
postData?.[ prplTerms.provider ],
244198
prplTerms.provider
245199
).slug;
246-
const taskCategorySlug = prplTerms.getTerm(
247-
postData?.[ prplTerms.category ],
248-
prplTerms.category
249-
).slug;
250200

251201
const el = prplSuggestedTask.getTaskElement( postId );
252202

@@ -334,11 +284,8 @@ prplSuggestedTask = {
334284
)
335285
);
336286

337-
// Inject more tasks from the same category.
338-
prplSuggestedTask.injectItemsFromCategory( {
339-
category: taskCategorySlug,
340-
status: [ 'publish' ],
341-
} );
287+
// Fetch and inject a replacement task for non-user tasks
288+
prplSuggestedTask.fetchAndInjectReplacementTask();
342289

343290
// Resolve immediately for non-user tasks
344291
resolve( {
@@ -434,14 +381,11 @@ prplSuggestedTask = {
434381
date,
435382
date_gmt: date,
436383
} );
437-
postModelToSave.save().then( ( postData ) => {
384+
postModelToSave.save().then( () => {
438385
prplSuggestedTask.removeTaskElement( postId );
439386

440-
// Inject more tasks from the same category.
441-
prplSuggestedTask.injectItemsFromCategory( {
442-
category: postData?.prpl_category?.slug,
443-
status: [ 'publish' ],
444-
} );
387+
// Fetch and inject a replacement task
388+
prplSuggestedTask.fetchAndInjectReplacementTask();
445389
} );
446390
},
447391

@@ -568,6 +512,42 @@ prplSuggestedTask = {
568512
*/
569513
removeTaskElement: ( postId ) =>
570514
prplSuggestedTask.getTaskElement( postId )?.remove(),
515+
516+
/**
517+
* Fetch and inject a replacement task after one is removed.
518+
*
519+
* Replacement tasks are always fetched for the suggested-tasks-list,
520+
* which excludes user tasks (user tasks have their own todo list).
521+
*/
522+
fetchAndInjectReplacementTask: () => {
523+
// Collect all currently visible task IDs from the DOM
524+
const visibleTaskIds = Array.from(
525+
document.querySelectorAll( '.prpl-suggested-task[data-post-id]' )
526+
).map( ( el ) => parseInt( el.getAttribute( 'data-post-id' ) ) );
527+
528+
// Combine with injectedItemIds to ensure we have a complete exclusion list
529+
const allTaskIds = [
530+
...new Set( [
531+
...prplSuggestedTask.injectedItemIds,
532+
...visibleTaskIds,
533+
] ),
534+
];
535+
536+
// Update injectedItemIds to include any tasks that might have been missed
537+
prplSuggestedTask.injectedItemIds = allTaskIds;
538+
539+
const fetchArgs = {
540+
status: 'publish',
541+
per_page: 1,
542+
exclude_provider: 'user', // Always exclude user tasks from suggested-tasks-list
543+
};
544+
545+
prplSuggestedTask.fetchItems( fetchArgs ).then( ( items ) => {
546+
if ( items && items.length > 0 ) {
547+
prplSuggestedTask.injectItems( items );
548+
}
549+
} );
550+
},
571551
};
572552

573553
/**

0 commit comments

Comments
 (0)