Skip to content

Commit c9f1202

Browse files
committed
fix: update create record logic for the fields, where showIf used
1 parent 348dabd commit c9f1202

File tree

3 files changed

+10
-63
lines changed

3 files changed

+10
-63
lines changed

adminforth/modules/restApi.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import {
1515
Filters,
1616
} from "../types/Back.js";
1717

18-
import { ADMINFORTH_VERSION, listify, md5hash, getLoginPromptHTML, checkShowIf } from './utils.js';
18+
import { ADMINFORTH_VERSION, listify, md5hash, getLoginPromptHTML } from './utils.js';
1919

2020
import AdminForthAuth from "../auth.js";
2121
import { ActionCheckSource, AdminForthConfigMenuItem, AdminForthDataTypes, AdminForthFilterOperators, AdminForthResourceColumnInputCommon, AdminForthResourceCommon, AdminForthResourcePages,
@@ -1171,7 +1171,7 @@ export default class AdminForthRestAPI implements IAdminForthRestAPI {
11711171
return { error };
11721172
}
11731173

1174-
const { record } = body;
1174+
const { record, requiredColumnsToSkip } = body;
11751175

11761176
// todo if showIn.create is function, code below will be buggy (will not detect required fact)
11771177
for (const column of resource.columns) {
@@ -1180,8 +1180,8 @@ export default class AdminForthRestAPI implements IAdminForthRestAPI {
11801180
record[column.name] === undefined &&
11811181
column.showIn.create
11821182
) {
1183-
const isColumnShownWithShowIf = await checkShowIf(column as AdminForthResourceColumnInputCommon, record) ;
1184-
if (isColumnShownWithShowIf === true) {
1183+
const shouldWeSkipColumn = requiredColumnsToSkip.find(reqColumnToSkip => reqColumnToSkip.name === column.name);
1184+
if (!shouldWeSkipColumn) {
11851185
return { error: `Column '${column.name}' is required`, ok: false };
11861186
}
11871187
}
@@ -1206,8 +1206,8 @@ export default class AdminForthRestAPI implements IAdminForthRestAPI {
12061206
for (const column of resource.columns) {
12071207
if ((column.required as { create?: boolean })?.create) {
12081208
const shown = await isShown(column, 'create', ctxCreate);
1209-
const isColumnShownWithShowIf = await checkShowIf(column as AdminForthResourceColumnInputCommon , record) ;
1210-
if (isColumnShownWithShowIf === true) {
1209+
const shouldWeSkipColumn = requiredColumnsToSkip.find(reqColumnToSkip => reqColumnToSkip.name === column.name);
1210+
if (!shouldWeSkipColumn) {
12111211
if (shown && record[column.name] === undefined) {
12121212
return { error: `Column '${column.name}' is required`, ok: false };
12131213
}

adminforth/modules/utils.ts

Lines changed: 0 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -479,59 +479,3 @@ export function slugifyString(str: string): string {
479479
.replace(/\s+/g, '-')
480480
.replace(/[^a-z0-9-_]/g, '-');
481481
}
482-
483-
export function checkShowIf(c: AdminForthResourceColumnInputCommon, record: Record<string, any>) {
484-
if (!c.showIf) return true;
485-
486-
const evaluatePredicate = (predicate: Predicate): boolean => {
487-
const results: boolean[] = [];
488-
489-
if ("$and" in predicate) {
490-
results.push(predicate.$and.every(evaluatePredicate));
491-
}
492-
493-
if ("$or" in predicate) {
494-
results.push(predicate.$or.some(evaluatePredicate));
495-
}
496-
497-
const fieldEntries = Object.entries(predicate).filter(([key]) => !key.startsWith('$'));
498-
if (fieldEntries.length > 0) {
499-
const fieldResult = fieldEntries.every(([field, condition]) => {
500-
const recordValue = record[field];
501-
502-
if (condition === undefined) {
503-
return true;
504-
}
505-
if (typeof condition !== "object" || condition === null) {
506-
return recordValue === condition;
507-
}
508-
509-
if ("$eq" in condition) return recordValue === condition.$eq;
510-
if ("$not" in condition) return recordValue !== condition.$not;
511-
if ("$gt" in condition) return recordValue > condition.$gt;
512-
if ("$gte" in condition) return recordValue >= condition.$gte;
513-
if ("$lt" in condition) return recordValue < condition.$lt;
514-
if ("$lte" in condition) return recordValue <= condition.$lte;
515-
if ("$in" in condition) return (Array.isArray(condition.$in) && condition.$in.includes(recordValue));
516-
if ("$nin" in condition) return (Array.isArray(condition.$nin) && !condition.$nin.includes(recordValue));
517-
if ("$includes" in condition)
518-
return (
519-
Array.isArray(recordValue) &&
520-
recordValue.includes(condition.$includes)
521-
);
522-
if ("$nincludes" in condition)
523-
return (
524-
Array.isArray(recordValue) &&
525-
!recordValue.includes(condition.$nicludes)
526-
);
527-
528-
return true;
529-
});
530-
results.push(fieldResult);
531-
}
532-
533-
return results.every(result => result);
534-
};
535-
536-
return evaluatePredicate(c.showIf);
537-
}

adminforth/spa/src/views/CreateView.vue

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ import BreadcrumbsWithButtons from '@/components/BreadcrumbsWithButtons.vue';
9797
import ResourceForm from '@/components/ResourceForm.vue';
9898
import SingleSkeletLoader from '@/components/SingleSkeletLoader.vue';
9999
import { useCoreStore } from '@/stores/core';
100-
import { callAdminForthApi, getCustomComponent,checkAcessByAllowedActions, initThreeDotsDropdown } from '@/utils';
100+
import { callAdminForthApi, getCustomComponent,checkAcessByAllowedActions, initThreeDotsDropdown, checkShowIf } from '@/utils';
101101
import { IconFloppyDiskSolid } from '@iconify-prerendered/vue-flowbite';
102102
import { onMounted, ref, watch, nextTick } from 'vue';
103103
import { useRoute, useRouter } from 'vue-router';
@@ -190,13 +190,16 @@ async function saveRecord(opts?: { confirmationResult?: any }) {
190190
} else {
191191
validating.value = false;
192192
}
193+
const requiredColumns = coreStore.resource?.columns.filter(c => c.required?.create === true) || [];
194+
const requiredColumnsToSkip = requiredColumns.filter(c => checkShowIf(c, record.value) === false);
193195
saving.value = true;
194196
const response = await callAdminForthApi({
195197
method: 'POST',
196198
path: `/create_record`,
197199
body: {
198200
resourceId: route.params.resourceId,
199201
record: record.value,
202+
requiredColumnsToSkip,
200203
meta: {
201204
...(opts?.confirmationResult ? { confirmationResult: opts.confirmationResult } : {}),
202205
},

0 commit comments

Comments
 (0)