Как я могу переопределить текст сообщений об ошибках по умолчанию в формах JSON

TLDR: мне нужно настроить сообщения об ошибках по умолчанию, предоставляемые формой JSON. Например, если поле required, то форма JSON выдает ошибку, например is a required property, я хочу, чтобы она возвращала текст сообщения об ошибке, например Invalid input....

Я создал JSON-форму со схемой вроде

    {
    type: 'object',
    properties: {
        name: {
            type: 'string',
            minLength: 3,
        },
    },
    required: [
        'name',
    ],
    errorMessage: {
        required: 'INVALID INPUT. This is a required field',
    },
};

Теперь я использовал эту схему и схему пользовательского интерфейса для создания формы JSON.

const ajv = createAjv();
require('ajv-keywords')(ajv);
require('ajv-errors')(ajv);
<JsonForms
    schema={schema}
    uischema={uischema}
    data={data}
    renderers={CustomRenderers}
    cells={vanillaCells}
    onChange={onChange}
    ajv={ajv}
/>

Приведенная выше форма JSON отображает форму пользовательского интерфейса, и когда поле пусто, выдается стандартное сообщение об ошибке, например is a required property, теперь здесь мне нужно переопределить свое собственное сообщение, для этой цели https://github.com/ajv-validator/ajv-errors оказался полезным и добавил свойство errorMessage в мою схему с ключом required, имеющим мой пользовательское сообщение, также я добавил require('ajv-errors')(ajv); по мере необходимости, но все равно получаю сообщение об ошибке по умолчанию, а не то, которое я перезаписываю в errorMessage.

Я что-то упустил здесь? Или у меня есть другой способ переопределить сообщение по умолчанию. Кроме того, наряду с required у меня будет много проверок, таких как minLength, maxLength и т. д., чье сообщение по умолчанию мне, возможно, придется переопределить.

Также я ожидаю много других свойств в схеме, поэтому добавление errorMessage в каждое свойство может быть не очень эффективным, но если это единственное решение, которое я должен использовать :)


person Jawad    schedule 15.12.2020    source источник


Ответы (1)


Я пошел дальше и добавил свое собственное ключевое слово

export default (ajv) => {
    ajv.addKeyword('customErrorMessages', {
        inline: generate_customErrorMessages,
        statements: true,
        valid: true,
        errors: 'full',
    });
    return ajv;
};

const generate_customErrorMessages = () => {
    var out = ' ';
    out += "vErrors = vErrors.map((v) => {"
    out += "if (v.keyword === 'required') {v.message = 'This field cannot be left blank.';} ";
    out += "else if (v.keyword === 'minLength') {v.message = `This field cannot be shorter than ${v.params?.limit} characters.`;} ";
    out += "else if (v.keyword === 'maxLength') {v.message = `This field cannot be longer than ${v.params?.limit} characters.`;} ";
    out += "else if (v.keyword === 'maximum') {v.message = `This field should be ${v.params?.comparison} ${v.params?.limit}`;} ";
    out += "else if (v.keyword === 'minimum') {v.message = `This field should be ${v.params?.comparison} ${v.params?.limit}`;}";
    out += "return v;});"
    return out;
};

Также мне нужно добавить ключевое слово в мою схему как "customErrorMessages": true. При этом мои сообщения будут частью кода, а не схемы, я также могу добавлять разные сообщения для разных языков и не должны зависеть от схемы.

person Jawad    schedule 16.12.2020
comment
Здравствуйте, могу я узнать, где найти документацию по inline? На сайте ajv не нашел. - person Thennarasu Ramasamy; 22.06.2021