feat(content-manager): contional fields

This commit is contained in:
Bassel Kanso 2025-05-28 13:09:00 +03:00
parent 26ef1c1726
commit 14aa4a8901
16 changed files with 65 additions and 11 deletions

View File

@ -9,7 +9,6 @@
"name": "Country"
},
"options": {
"comment": "",
"draftAndPublish": false
},
"pluginOptions": {
@ -30,6 +29,7 @@
},
"code": {
"type": "string",
"required":true,
"maxLength": 3,
"unique": true,
"minLength": 2,
@ -37,7 +37,20 @@
"i18n": {
"localized": true
}
},
"conditions": {
"visible": {
"==": [
{
"var": "visible"
},
true
]
}
}
},
"visible": {
"type": "boolean"
}
}
}

View File

@ -76,6 +76,7 @@ export type { Widget as WidgetType } from './core/apis/Widgets';
export { translatedErrors } from './utils/translatedErrors';
export * from './utils/getFetchClient';
export * from './utils/baseQuery';
export * from './utils/rulesEngine';
export * from './services/api';
export type { CMAdminConfiguration } from './types/adminConfiguration';

View File

@ -1,4 +1,4 @@
import { createRulesEngine, Condition } from '../rules-engine';
import { createRulesEngine, Condition } from '../rulesEngine';
describe('RulesEngine with is & isNot operator', () => {
const engine = createRulesEngine();

View File

@ -110,6 +110,7 @@
"inquirer": "8.2.5",
"invariant": "^2.2.4",
"is-localhost-ip": "2.0.0",
"json-logic-js": "2.0.5",
"jsonwebtoken": "9.0.0",
"koa": "2.15.4",
"koa-compose": "4.1.0",
@ -148,6 +149,7 @@
"@types/codemirror5": "npm:@types/codemirror@^5.60.15",
"@types/fs-extra": "11.0.4",
"@types/invariant": "2.2.36",
"@types/json-logic-js": "2.0.8",
"@types/jsonwebtoken": "9.0.3",
"@types/koa-passport": "6.0.1",
"@types/lodash": "^4.14.191",

View File

@ -6,6 +6,7 @@ import {
InputRenderer as FormInputRenderer,
useField,
Form,
createRulesEngine,
} from '@strapi/admin/strapi-admin';
import { Alert, Box, Field, Flex, Link, Tooltip, Typography } from '@strapi/design-system';
import { useIntl } from 'react-intl';
@ -325,6 +326,7 @@ const VersionInputRenderer = ({
const canReadFields = useDocumentRBAC('InputRenderer', (rbac) => rbac.canReadFields);
const canUpdateFields = useDocumentRBAC('InputRenderer', (rbac) => rbac.canUpdateFields);
const canUserAction = useDocumentRBAC('InputRenderer', (rbac) => rbac.canUserAction);
const fieldValues = useForm('Fields', (state) => state.values);
const editableFields = id ? canUpdateFields : canCreateFields;
const readableFields = id ? canReadFields : canCreateFields;
@ -345,6 +347,17 @@ const VersionInputRenderer = ({
edit: { components: componentsLayout },
} = useDocLayout();
const rulesEngine = createRulesEngine();
const attribute = props.attribute;
if (attribute?.conditions && attribute?.conditions.visible) {
const isVisible = rulesEngine.evaluate(attribute?.conditions.visible, fieldValues);
if (!isVisible) {
return null;
}
}
if (!visible) {
return null;
}

View File

@ -1011,7 +1011,6 @@ const UpdateAction: DocumentActionComponent = ({
return;
}
if (isCloning) {
const res = await clone(
{

View File

@ -5,6 +5,7 @@ import {
useForm,
InputRenderer as FormInputRenderer,
useField,
createRulesEngine,
} from '@strapi/admin/strapi-admin';
import { useIntl } from 'react-intl';
@ -55,6 +56,7 @@ const InputRenderer = ({ visible, hint: providedHint, document, ...props }: Inpu
const canReadFields = useDocumentRBAC('InputRenderer', (rbac) => rbac.canReadFields);
const canUpdateFields = useDocumentRBAC('InputRenderer', (rbac) => rbac.canUpdateFields);
const canUserAction = useDocumentRBAC('InputRenderer', (rbac) => rbac.canUserAction);
const fieldValues = useForm('Fields', (state) => state.values);
let idToCheck = document.document?.documentId;
if (collectionType === SINGLE_TYPES) {
@ -80,6 +82,16 @@ const InputRenderer = ({ visible, hint: providedHint, document, ...props }: Inpu
// We pass field in case of Custom Fields to keep backward compatibility
const field = useField(props.name);
const rulesEngine = createRulesEngine();
const attribute = document.schema?.attributes[props.name];
if (attribute?.conditions && attribute?.conditions.visible) {
const isVisible = rulesEngine.evaluate(attribute?.conditions.visible, fieldValues);
if (!isVisible) {
return null;
}
}
if (!visible) {
return null;

View File

@ -23,7 +23,7 @@ const createDocument = async (ctx: any, opts?: Options) => {
const { userAbility, user } = ctx.state;
const { model } = ctx.params;
const { body } = ctx.request;
console.log('createDocument', { model, body });
const documentManager = getService('document-manager');
const permissionChecker = getService('permission-checker').create({ userAbility, model });

View File

@ -18,7 +18,6 @@ const createEntriesService = (
async function createEntry(params = {} as any) {
const { data, ...restParams } = await transformParamsDocumentId(uid, params);
const query = transformParamsToQuery(uid, pickSelectionParams(restParams) as any); // select / populate
// Validation

View File

@ -267,7 +267,7 @@ const createScalarAttributeValidator =
const createAttributeValidator =
(createOrUpdate: CreateOrUpdate) => (metas: ValidatorMetas, options: ValidatorContext) => {
let validator = yup.mixed();
console.log('metas ==>', metas.model, metas.attr);
if (isMediaAttribute(metas.attr)) {
validator = yup.mixed();
} else if (isScalarAttribute(metas.attr)) {
@ -376,6 +376,9 @@ const createValidateEntity = (createOrUpdate: CreateOrUpdate) => {
`Invalid payload submitted for the ${createOrUpdate} of an entity of type ${displayName}. Expected an object, but got ${typeof data}`
);
}
console.log('model', model);
console.log('data', data);
console.log('entity', entity);
const validator = createModelValidator(createOrUpdate)(
{

View File

@ -51,6 +51,7 @@
"@strapi/permissions": "5.13.1",
"@strapi/utils": "5.13.1",
"commander": "8.3.0",
"json-logic-js": "2.0.5",
"koa": "2.15.4",
"koa-body": "6.0.1",
"node-schedule": "2.1.1",
@ -61,6 +62,7 @@
"devDependencies": {
"@strapi/ts-zen": "^0.2.0",
"@types/jest": "29.5.2",
"@types/json-logic-js": "2.0.8",
"@types/koa": "2.13.4",
"@types/koa__router": "12.0.0",
"@types/node-schedule": "2.1.7",

View File

@ -1,3 +1,7 @@
import jsonLogic from 'json-logic-js';
type JsonLogicCondition = jsonLogic.RulesLogic<jsonLogic.AdditionalOperation>;
/**
* Enumerates all possible attribute types in Strapi.
*
@ -65,6 +69,13 @@ export interface Attribute<TKind extends Kind = Kind> {
*/
searchable?: boolean;
/**
* Specifies conditional logic on an attribute's visibility.
*/
conditions?: {
visible: JsonLogicCondition;
};
/**
* Database validations and settings
* https://docs.strapi.io/dev-docs/backend-customization/models#database-validations-and-settings

View File

@ -50,7 +50,6 @@
"date-fns": "2.30.0",
"execa": "5.1.1",
"http-errors": "2.0.0",
"json-logic-js": "2.0.5",
"lodash": "4.17.21",
"node-machine-id": "1.1.12",
"p-map": "4.0.0",
@ -60,7 +59,6 @@
},
"devDependencies": {
"@types/http-errors": "2.0.4",
"@types/json-logic-js": "2.0.8",
"@types/koa": "2.13.4",
"@types/node": "18.19.24",
"eslint-config-custom": "5.13.1",

View File

@ -24,7 +24,6 @@ export * as errors from './errors';
export * as contentTypes from './content-types';
export * as relations from './relations';
export * as hooks from './hooks';
export * as rulesEngine from './rules-engine';
export * from './zod';
export * from './primitives';

View File

@ -8599,6 +8599,7 @@ __metadata:
"@types/codemirror5": "npm:@types/codemirror@^5.60.15"
"@types/fs-extra": "npm:11.0.4"
"@types/invariant": "npm:2.2.36"
"@types/json-logic-js": "npm:2.0.8"
"@types/jsonwebtoken": "npm:9.0.3"
"@types/koa-passport": "npm:6.0.1"
"@types/lodash": "npm:^4.14.191"
@ -8629,6 +8630,7 @@ __metadata:
inquirer: "npm:8.2.5"
invariant: "npm:^2.2.4"
is-localhost-ip: "npm:2.0.0"
json-logic-js: "npm:2.0.5"
jsonwebtoken: "npm:9.0.0"
koa: "npm:2.15.4"
koa-body: "npm:6.0.1"
@ -9703,11 +9705,13 @@ __metadata:
"@strapi/ts-zen": "npm:^0.2.0"
"@strapi/utils": "npm:5.13.1"
"@types/jest": "npm:29.5.2"
"@types/json-logic-js": "npm:2.0.8"
"@types/koa": "npm:2.13.4"
"@types/koa__router": "npm:12.0.0"
"@types/node-schedule": "npm:2.1.7"
commander: "npm:8.3.0"
eslint-config-custom: "npm:5.13.1"
json-logic-js: "npm:2.0.5"
koa: "npm:2.15.4"
koa-body: "npm:6.0.1"
lodash: "npm:4.17.21"
@ -9855,14 +9859,12 @@ __metadata:
dependencies:
"@sindresorhus/slugify": "npm:1.1.0"
"@types/http-errors": "npm:2.0.4"
"@types/json-logic-js": "npm:2.0.8"
"@types/koa": "npm:2.13.4"
"@types/node": "npm:18.19.24"
date-fns: "npm:2.30.0"
eslint-config-custom: "npm:5.13.1"
execa: "npm:5.1.1"
http-errors: "npm:2.0.0"
json-logic-js: "npm:2.0.5"
koa: "npm:2.15.4"
koa-body: "npm:6.0.1"
lodash: "npm:4.17.21"