@@ -190,21 +190,28 @@ The plugin replaces the default rendering of the `data` column with a diff viewe
190190Import the approval resource in ` index.ts ` and add it to the AdminForth resource list and menu:
191191
192192``` ts title="./index.ts"
193- // diff-add import crudManualApproveResource from './resources/crud_manual_approve.js';
193+ // diff-add
194+ import crudManualApproveResource from ' ./resources/crud_manual_approve.js' ;
194195
195196export const admin = new AdminForth ({
196197 // ...
197198 resources: [
198199 // ...
199- // diff-add crudManualApproveResource,
200+ // diff-add
201+ crudManualApproveResource ,
200202 ],
201203 menu: [
202204 // ...
203- // diff-add {
204- // diff-add label: 'Approvals',
205- // diff-add icon: 'flowbite:clipboard-check-solid',
206- // diff-add resourceId: 'crud_manual_approve',
207- // diff-add },
205+ // diff-add
206+ {
207+ // diff-add
208+ label: ' Approvals' ,
209+ // diff-add
210+ icon: ' flowbite:clipboard-check-solid' ,
211+ // diff-add
212+ resourceId: ' crud_manual_approve' ,
213+ // diff-add
214+ },
208215 ],
209216});
210217```
@@ -217,47 +224,83 @@ Open `resources/apartments.ts` and add the helper and hooks below:
217224
218225``` ts title="./resources/apartments.ts"
219226import { AdminForthDataTypes , type AdminForthResourceInput } from ' adminforth' ;
220- // diff-add import { crudApprovePlugin } from './crud_manual_approve.js';
221-
222- // diff-add async function sendChangeToApproval({
223- // diff-add resource,
224- // diff-add action,
225- // diff-add record,
226- // diff-add updates,
227- // diff-add oldRecord,
228- // diff-add recordId,
229- // diff-add adminUser,
230- // diff-add extra,
231- // diff-add }: any) {
232- // diff-add // When the CRUD Approve plugin applies an already approved change,
233- // diff-add // it marks the request with this flag. In that case we must not create
234- // diff-add // another approval request, otherwise the operation would loop forever.
235- // diff-add if (extra?.adminforth_plugin_crud_approve?.callingFromApprovalPlugin) {
236- // diff-add return { ok: true };
237- // diff-add }
227+ // diff-add
228+ import { crudApprovePlugin } from ' ./crud_manual_approve.js' ;
229+
230+ // diff-add
231+ async function sendChangeToApproval({
232+ // diff-add
233+ resource ,
234+ // diff-add
235+ action ,
236+ // diff-add
237+ record ,
238+ // diff-add
239+ updates ,
240+ // diff-add
241+ oldRecord ,
242+ // diff-add
243+ recordId ,
244+ // diff-add
245+ adminUser ,
246+ // diff-add
247+ extra ,
248+ // diff-add
249+ }: any ) {
250+ // diff-add
251+ // When the CRUD Approve plugin applies an already approved change,
252+ // diff-add
253+ // it marks the request with this flag. In that case we must not create
254+ // diff-add
255+ // another approval request, otherwise the operation would loop forever.
256+ // diff-add
257+ if (extra ?.adminforth_plugin_crud_approve ?.callingFromApprovalPlugin ) {
258+ // diff-add
259+ return { ok: true };
260+ // diff-add
261+ // }
238262// diff-add
239- // diff-add const pkColumnName = resource.columns.find((column: any) => column.primaryKey)?.name || 'id';
240- // diff-add const data = recordId ? { [pkColumnName]: recordId } : record;
263+ // diff-add
264+ const pkColumnName = resource .columns .find ((column : any ) => column .primaryKey )?.name || ' id' ;
265+ // diff-add
266+ const data = recordId ? { [pkColumnName ]: recordId } : record ;
267+ // diff-add
268+ // diff-add
269+ const result = await crudApprovePlugin .createApprovalRequest ({
270+ // diff-add
271+ resource ,
272+ // diff-add
273+ action ,
274+ // diff-add
275+ data ,
276+ // diff-add
277+ user: adminUser ,
278+ // diff-add
279+ record ,
280+ // diff-add
281+ oldRecord ,
282+ // diff-add
283+ updates ,
284+ // diff-add
285+ extra ,
286+ // diff-add
287+ });
241288// diff-add
242- // diff-add const result = await crudApprovePlugin.createApprovalRequest({
243- // diff-add resource,
244- // diff-add action,
245- // diff-add data,
246- // diff-add user: adminUser,
247- // diff-add record,
248- // diff-add oldRecord,
249- // diff-add updates,
250- // diff-add extra,
251- // diff-add });
289+ // diff-add
290+ if (result .error ) {
291+ // diff-add
292+ return { ok: false , error: result .error };
293+ // diff-add
294+ }
252295// diff-add
253- // diff-add if (result.error) {
254- // diff-add return { ok: false, error: result.error };
255- // diff-add }
296+ // diff-add
297+ // Stop the original mutation. The real create/edit/delete will be executed
298+ // diff-add
299+ // later only if a reviewer approves the request.
300+ // diff-add
301+ return { ok: true , error: " Action sent for manual approval" };
256302// diff-add
257- // diff-add // Stop the original mutation. The real create/edit/delete will be executed
258- // diff-add // later only if a reviewer approves the request.
259- // diff-add return { ok: true, error: "Action sent for manual approval" };
260- // diff-add }
303+ }
261304
262305export default {
263306 dataSource: ' maindb' ,
@@ -268,23 +311,40 @@ export default {
268311 columns: [
269312 // ...
270313 ],
271- // diff-add hooks: {
272- // diff-add create: {
273- // diff-add beforeSave: async (args: any) => {
274- // diff-add return sendChangeToApproval({ ...args, action: 'create' });
275- // diff-add },
276- // diff-add },
277- // diff-add edit: {
278- // diff-add beforeSave: async (args: any) => {
279- // diff-add return sendChangeToApproval({ ...args, action: 'edit' });
280- // diff-add },
281- // diff-add },
282- // diff-add delete: {
283- // diff-add beforeSave: async (args: any) => {
284- // diff-add return sendChangeToApproval({ ...args, action: 'delete' });
285- // diff-add },
286- // diff-add },
287- // diff-add },
314+ // diff-add
315+ hooks: {
316+ // diff-add
317+ create: {
318+ // diff-add
319+ beforeSave : async (args : any ) => {
320+ // diff-add
321+ return sendChangeToApproval ({ ... args , action: ' create' });
322+ // diff-add
323+ },
324+ // diff-add
325+ },
326+ // diff-add
327+ edit: {
328+ // diff-add
329+ beforeSave : async (args : any ) => {
330+ // diff-add
331+ return sendChangeToApproval ({ ... args , action: ' edit' });
332+ // diff-add
333+ },
334+ // diff-add
335+ },
336+ // diff-add
337+ delete: {
338+ // diff-add
339+ beforeSave : async (args : any ) => {
340+ // diff-add
341+ return sendChangeToApproval ({ ... args , action: ' delete' });
342+ // diff-add
343+ },
344+ // diff-add
345+ },
346+ // diff-add
347+ },
288348 options: {
289349 listPageSize: 10 ,
290350 allowedActions: {
0 commit comments