|
1 | | -/* global HTMLElement, prplSuggestedTask, prplL10n, prplUpdateRaviGauge, prplTerms, prplSuggestedTasksWidget */ |
| 1 | +/* global HTMLElement, prplSuggestedTask, prplL10n, prplUpdateRaviGauge, prplTerms */ |
2 | 2 | /* |
3 | 3 | * Suggested Task scripts & helpers. |
4 | 4 | * |
@@ -34,66 +34,28 @@ prplSuggestedTask = { |
34 | 34 |
|
35 | 35 | const fetchData = { |
36 | 36 | status: args.status, |
37 | | - per_page: args.per_page || 1, |
| 37 | + per_page: args.per_page || 100, |
38 | 38 | _embed: true, |
39 | 39 | exclude: prplSuggestedTask.injectedItemIds, |
40 | 40 | filter: { |
41 | 41 | orderby: 'menu_order', |
42 | 42 | order: 'ASC', |
43 | 43 | }, |
44 | 44 | }; |
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; |
48 | 52 | } |
49 | 53 |
|
50 | 54 | return prplSuggestedTask |
51 | 55 | .getPostsCollectionPromise( { data: fetchData } ) |
52 | 56 | .then( ( response ) => response.data ); |
53 | 57 | }, |
54 | 58 |
|
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 | | - |
97 | 59 | /** |
98 | 60 | * Inject items. |
99 | 61 | * |
@@ -145,27 +107,15 @@ prplSuggestedTask = { |
145 | 107 | */ |
146 | 108 | getNewItemTemplatePromise: ( { post = {}, listId = '' } ) => |
147 | 109 | 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 }; |
156 | 112 |
|
157 | 113 | Object.values( prplTerms.get( 'provider' ) ).forEach( ( term ) => { |
158 | 114 | if ( term.id === terms[ prplTerms.provider ][ 0 ] ) { |
159 | 115 | terms[ prplTerms.provider ] = term; |
160 | 116 | } |
161 | 117 | } ); |
162 | 118 |
|
163 | | - Object.values( prplTerms.get( 'category' ) ).forEach( ( term ) => { |
164 | | - if ( term.id === terms[ prplTerms.category ][ 0 ] ) { |
165 | | - terms[ prplTerms.category ] = term; |
166 | | - } |
167 | | - } ); |
168 | | - |
169 | 119 | const template = wp.template( 'prpl-suggested-task' ); |
170 | 120 | const data = { |
171 | 121 | post, |
@@ -212,6 +162,10 @@ prplSuggestedTask = { |
212 | 162 | post.destroy( { url } ).then( () => { |
213 | 163 | // Remove the task from the todo list. |
214 | 164 | prplSuggestedTask.removeTaskElement( postId ); |
| 165 | + |
| 166 | + // Fetch and inject a replacement task |
| 167 | + prplSuggestedTask.fetchAndInjectReplacementTask(); |
| 168 | + |
215 | 169 | setTimeout( |
216 | 170 | () => |
217 | 171 | window.dispatchEvent( |
@@ -243,10 +197,6 @@ prplSuggestedTask = { |
243 | 197 | postData?.[ prplTerms.provider ], |
244 | 198 | prplTerms.provider |
245 | 199 | ).slug; |
246 | | - const taskCategorySlug = prplTerms.getTerm( |
247 | | - postData?.[ prplTerms.category ], |
248 | | - prplTerms.category |
249 | | - ).slug; |
250 | 200 |
|
251 | 201 | const el = prplSuggestedTask.getTaskElement( postId ); |
252 | 202 |
|
@@ -334,11 +284,8 @@ prplSuggestedTask = { |
334 | 284 | ) |
335 | 285 | ); |
336 | 286 |
|
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(); |
342 | 289 |
|
343 | 290 | // Resolve immediately for non-user tasks |
344 | 291 | resolve( { |
@@ -434,14 +381,11 @@ prplSuggestedTask = { |
434 | 381 | date, |
435 | 382 | date_gmt: date, |
436 | 383 | } ); |
437 | | - postModelToSave.save().then( ( postData ) => { |
| 384 | + postModelToSave.save().then( () => { |
438 | 385 | prplSuggestedTask.removeTaskElement( postId ); |
439 | 386 |
|
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(); |
445 | 389 | } ); |
446 | 390 | }, |
447 | 391 |
|
@@ -568,6 +512,42 @@ prplSuggestedTask = { |
568 | 512 | */ |
569 | 513 | removeTaskElement: ( postId ) => |
570 | 514 | 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 | + }, |
571 | 551 | }; |
572 | 552 |
|
573 | 553 | /** |
|
0 commit comments