feat: hasMany for number field (#2517)

* added custom config extension points

* Added custom field to documentation

* fix: not building due to incorrect typings

* Upload dist

* point to number array test

* feat: hasMany for number field

* fix: types

* Fix: incorrectly styles input for hasMany

* Revert "point to number array test"

This reverts commit 5a5162a80302e974eef15c88a1bc32cbecd457e8.

* Revert "Merge branch 'production-with-custom' into number-hasmany-v2"

This reverts commit dfc3ac523efc8cae70c9f0ccd48cd517b098a5e2, reversing
changes made to a3b1b7dd678809c239f8042362eaeada17035af0.

* test: adds test for numbers with hasMany

* test: add number field e2e

* Fix updated index.tsx

* Fix updated index.tsx

* chore: add jsDocs for hasMany property

* chore: rename isMultiText to isCreatable, as it makes more sense

* fix: incorrect double space in comments

* chore: rename onMultiTextChange to handleHasManyChange

* chore: improve ordering

* docs: add documentation for hasMany

* docs: add more jsdocs for number field

* fix: new value not transformed to number

* improve types

* fix: only allow numbers as input using filterOption

* fix: Option / value type breaking sortable selects

* fix: typings and add id for sorting

* add animation to react select

* undo transitions due to glitches

* fix: keyboard handler for select for empty input values

* fix: validation for hasMany numbers

* feat: perform validation in the filter as well

* attempt to fix duplicate key issue

* add todo

* remove console logs

* fix: stupid key warning

* fix: validation tests

* feat: add filterOption to keydown listener

* feat: numberOnly for react-select

* chore: improve variable naming

* fix: allow numbers for relationship value by stringifying those for sortable react-selects

* feat: generated types for hasMany number field

* graphql typings part 1

* graphql defaults type

* better typing for number in buildObjectType

* fix: default graphql type disregarding hasMany for relationship field

* feat: minRows and maxRows for hasMany numbers

* simplify joi schema

* working minRows and maxRows validation!

* jesus christ: fix incorrect translations for number & relationship fields for greaterThanMax and lessThanMin

* fix weird type error

* move validation tests to validations.spec.ts and fix them

* fix: make sure filterOption only passes a number array to validate function

* fix: adds missing dark-mode styles for version differences view (#2812)

Co-authored-by: Tylan Davis <tylan@Tylans-MacBook-Pro.local>

* fix: #2821 i18n ui field label (#2823)

* chore: version diff styles (#2824)

Co-authored-by: Tylan Davis <tylan@Tylans-MacBook-Pro.local>

* chore: remove --legacy-peer-deps from gh actions workflow (#2814)

* chore: removes cms text from instances of payload name (#2793)

* chore(release): v1.9.2

* chore: update changelog release notes v1.9.2

* chore: cleans up graphql-schema-gen test folder

* fix: adds custom property to ui field in joi validation (#2835)

* adjust validation

* improve isnumber function

* Update number.mdx

---------

Co-authored-by: Teun Mooij <tmooij@infinitaslearning.com>
Co-authored-by: Dan Ribbens <dan.ribbens@gmail.com>
Co-authored-by: Tylan Davis <89618855+tylandavis@users.noreply.github.com>
Co-authored-by: Tylan Davis <tylan@Tylans-MacBook-Pro.local>
Co-authored-by: Dan Ribbens <DanRibbens@users.noreply.github.com>
Co-authored-by: Jacob Fletcher <jacobsfletch@gmail.com>
Co-authored-by: Jarrod Flesch <jarrodmflesch@gmail.com>
Co-authored-by: Jarrod Flesch <30633324+JarrodMFlesch@users.noreply.github.com>
This commit is contained in:
Alessio Gravili
2023-06-20 20:21:27 +02:00
committed by GitHub
parent 542b5362d3
commit 8f086e315c
53 changed files with 867 additions and 491 deletions

View File

@@ -18,6 +18,9 @@ keywords: number, fields, config, configuration, documentation, Content Manageme
| **`label`** | Text used as a field label in the Admin panel or an object with keys for each language. | | **`label`** | Text used as a field label in the Admin panel or an object with keys for each language. |
| **`min`** | Minimum value accepted. Used in the default `validation` function. | | **`min`** | Minimum value accepted. Used in the default `validation` function. |
| **`max`** | Maximum value accepted. Used in the default `validation` function. | | **`max`** | Maximum value accepted. Used in the default `validation` function. |
| **`hasMany`** | Makes this field an ordered array of numbers instead of just a single number. |
| **`minRows`** | Minimum number of numbers in the numbers array, if `hasMany` is set to true. |
| **`maxRows`** | Maximum number of numbers in the numbers array, if `hasMany` is set to true. |
| **`unique`** | Enforce that each entry in the Collection has a unique value for this field. | | **`unique`** | Enforce that each entry in the Collection has a unique value for this field. |
| **`index`** | Build a [MongoDB index](https://docs.mongodb.com/manual/indexes/) for this field to produce faster queries. Set this field to `true` if your users will perform queries on this field's data often. | | **`index`** | Build a [MongoDB index](https://docs.mongodb.com/manual/indexes/) for this field to produce faster queries. Set this field to `true` if your users will perform queries on this field's data often. |
| **`validate`** | Provide a custom validation function that will be executed on both the Admin panel and the backend. [More](/docs/fields/overview#validation) | | **`validate`** | Provide a custom validation function that will be executed on both the Admin panel and the backend. [More](/docs/fields/overview#validation) |

View File

@@ -23,6 +23,6 @@ export const useDraggableSortable = (props: UseDraggableArguments): UseDraggable
isDragging, isDragging,
listeners, listeners,
setNodeRef, setNodeRef,
transform: transform && `translate3d(${transform.x}px, ${transform.y}px, 0)`, transform: transform && `translate3d(${transform.x}px, ${transform.y}px, 0)`, // translate3d is faster than translate in most browsers
}; };
}; };

View File

@@ -1,6 +1,6 @@
import React from 'react'; import React from 'react';
import { components as SelectComponents, ControlProps } from 'react-select'; import { components as SelectComponents, ControlProps } from 'react-select';
import { Option } from '../../../forms/field-types/Relationship/types'; import type { Option } from '../types';
export const Control: React.FC<ControlProps<Option, any>> = (props) => { export const Control: React.FC<ControlProps<Option, any>> = (props) => {
const { const {

View File

@@ -4,12 +4,12 @@ import {
components as SelectComponents, components as SelectComponents,
} from 'react-select'; } from 'react-select';
import { useDraggableSortable } from '../../DraggableSortable/useDraggableSortable'; import { useDraggableSortable } from '../../DraggableSortable/useDraggableSortable';
import { Option as OptionType } from '../types'; import type { Option } from '../types';
import './index.scss'; import './index.scss';
const baseClass = 'multi-value'; const baseClass = 'multi-value';
export const MultiValue: React.FC<MultiValueProps<OptionType>> = (props) => { export const MultiValue: React.FC<MultiValueProps<Option>> = (props) => {
const { const {
className, className,
isDisabled, isDisabled,

View File

@@ -1,6 +1,6 @@
import React from 'react'; import React from 'react';
import { components as SelectComponents, MultiValueProps } from 'react-select'; import { components as SelectComponents, MultiValueProps } from 'react-select';
import { Option } from '../../../forms/field-types/Relationship/types'; import type { Option } from '../types';
import './index.scss'; import './index.scss';
const baseClass = 'multi-value-label'; const baseClass = 'multi-value-label';

View File

@@ -1,5 +1,6 @@
import React from 'react'; import React, { KeyboardEventHandler } from 'react';
import Select from 'react-select'; import Select from 'react-select';
import CreatableSelect from 'react-select/creatable';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { arrayMove } from '@dnd-kit/sortable'; import { arrayMove } from '@dnd-kit/sortable';
import { Props as ReactSelectAdapterProps } from './types'; import { Props as ReactSelectAdapterProps } from './types';
@@ -13,11 +14,20 @@ import { ClearIndicator } from './ClearIndicator';
import { MultiValueRemove } from './MultiValueRemove'; import { MultiValueRemove } from './MultiValueRemove';
import { Control } from './Control'; import { Control } from './Control';
import DraggableSortable from '../DraggableSortable'; import DraggableSortable from '../DraggableSortable';
import type { Option } from './types';
import './index.scss'; import './index.scss';
const createOption = (label: string) => ({
label,
value: label,
});
const SelectAdapter: React.FC<ReactSelectAdapterProps> = (props) => { const SelectAdapter: React.FC<ReactSelectAdapterProps> = (props) => {
const { t, i18n } = useTranslation(); const { t, i18n } = useTranslation();
const [inputValue, setInputValue] = React.useState(''); // for creatable select
const { const {
className, className,
@@ -30,9 +40,11 @@ const SelectAdapter: React.FC<ReactSelectAdapterProps> = (props) => {
isSearchable = true, isSearchable = true,
isClearable = true, isClearable = true,
filterOption = undefined, filterOption = undefined,
numberOnly = false,
isLoading, isLoading,
onMenuOpen, onMenuOpen,
components, components,
isCreatable,
selectProps, selectProps,
} = props; } = props;
@@ -42,8 +54,68 @@ const SelectAdapter: React.FC<ReactSelectAdapterProps> = (props) => {
showError && 'react-select--error', showError && 'react-select--error',
].filter(Boolean).join(' '); ].filter(Boolean).join(' ');
if (!isCreatable) {
return (
<Select
isLoading={isLoading}
placeholder={getTranslation(placeholder, i18n)}
captureMenuScroll
{...props}
value={value}
onChange={onChange}
isDisabled={disabled}
className={classes}
classNamePrefix="rs"
options={options}
isSearchable={isSearchable}
isClearable={isClearable}
filterOption={filterOption}
onMenuOpen={onMenuOpen}
menuPlacement="auto"
components={{
ValueContainer,
SingleValue,
MultiValue,
MultiValueLabel,
MultiValueRemove,
DropdownIndicator: Chevron,
ClearIndicator,
Control,
...components,
}}
/>
);
}
const handleKeyDown: KeyboardEventHandler = (event) => {
// eslint-disable-next-line no-restricted-globals
if (numberOnly === true) {
const acceptableKeys = ['Tab', 'Escape', 'Backspace', 'Enter', 'ArrowRight', 'ArrowLeft', 'ArrowUp', 'ArrowDown'];
const isNumber = !/[^0-9]/.test(event.key);
const isActionKey = acceptableKeys.includes(event.key);
if (!isNumber && !isActionKey) {
event.preventDefault();
return;
}
}
if (!value || !inputValue || inputValue.trim() === '') return;
if (filterOption && !filterOption(null, inputValue)) {
return;
}
switch (event.key) {
case 'Enter':
case 'Tab':
onChange([...value as Option[], createOption(inputValue)]);
setInputValue('');
event.preventDefault();
break;
default:
break;
}
};
return ( return (
<Select <CreatableSelect
isLoading={isLoading} isLoading={isLoading}
placeholder={getTranslation(placeholder, i18n)} placeholder={getTranslation(placeholder, i18n)}
captureMenuScroll captureMenuScroll
@@ -60,6 +132,9 @@ const SelectAdapter: React.FC<ReactSelectAdapterProps> = (props) => {
filterOption={filterOption} filterOption={filterOption}
onMenuOpen={onMenuOpen} onMenuOpen={onMenuOpen}
menuPlacement="auto" menuPlacement="auto"
inputValue={inputValue}
onInputChange={(newValue) => setInputValue(newValue)}
onKeyDown={handleKeyDown}
components={{ components={{
ValueContainer, ValueContainer,
SingleValue, SingleValue,
@@ -81,8 +156,10 @@ const SortableSelect: React.FC<ReactSelectAdapterProps> = (props) => {
value, value,
} = props; } = props;
let ids: string[] = []; let ids: string[] = [];
if (value) ids = Array.isArray(value) ? value.map((item) => item?.value as string) : [value?.value as string]; // TODO: fix these types if (value) ids = Array.isArray(value) ? value.map((item) => item?.id ?? `${item?.value}` as string) : [value?.id || `${value?.value}` as string];
return ( return (
<DraggableSortable <DraggableSortable

View File

@@ -33,6 +33,8 @@ declare module 'react-select/dist/declarations/src' {
export type Option = { export type Option = {
[key: string]: unknown [key: string]: unknown
value: unknown value: unknown
//* The ID is used to identify the option in the UI. If it doesn't exist and value cannot be transformed into a string, sorting won't work */
id?: string
} }
export type OptionGroup = { export type OptionGroup = {
@@ -48,7 +50,10 @@ export type Props = {
disabled?: boolean, disabled?: boolean,
showError?: boolean, showError?: boolean,
options: Option[] | OptionGroup[] options: Option[] | OptionGroup[]
/** Allows you to specify multiple values instead of just one */
isMulti?: boolean, isMulti?: boolean,
/** Allows you to create own values in the UI despite them not being pre-specified */
isCreatable?: boolean,
isLoading?: boolean isLoading?: boolean
isOptionSelected?: any isOptionSelected?: any
isSortable?: boolean, isSortable?: boolean,
@@ -61,6 +66,7 @@ export type Props = {
filterOption?: filterOption?:
| (({ label, value, data }: { label: string, value: string, data: Option }, search: string) => boolean) | (({ label, value, data }: { label: string, value: string, data: Option }, search: string) => boolean)
| undefined, | undefined,
numberOnly?: boolean,
components?: { components?: {
[key: string]: React.FC<any> [key: string]: React.FC<any>
} }

View File

@@ -4,8 +4,10 @@
position: relative; position: relative;
margin-bottom: $baseline; margin-bottom: $baseline;
input { &:not(.has-many) {
@include formInput; input {
@include formInput;
}
} }
&.error { &.error {

View File

@@ -1,4 +1,4 @@
import React, { useCallback } from 'react'; import React, { useCallback, useEffect, useState } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import useField from '../../useField'; import useField from '../../useField';
import Label from '../../Label'; import Label from '../../Label';
@@ -8,8 +8,11 @@ import withCondition from '../../withCondition';
import { number } from '../../../../../fields/validations'; import { number } from '../../../../../fields/validations';
import { Props } from './types'; import { Props } from './types';
import { getTranslation } from '../../../../../utilities/getTranslation'; import { getTranslation } from '../../../../../utilities/getTranslation';
import { Option } from '../../../elements/ReactSelect/types';
import ReactSelect from '../../../elements/ReactSelect';
import './index.scss'; import './index.scss';
import { isNumber } from '../../../../../utilities/isNumber';
const NumberField: React.FC<Props> = (props) => { const NumberField: React.FC<Props> = (props) => {
const { const {
@@ -20,6 +23,9 @@ const NumberField: React.FC<Props> = (props) => {
label, label,
max, max,
min, min,
hasMany,
minRows,
maxRows,
admin: { admin: {
readOnly, readOnly,
style, style,
@@ -32,7 +38,7 @@ const NumberField: React.FC<Props> = (props) => {
} = {}, } = {},
} = props; } = props;
const { i18n } = useTranslation(); const { t, i18n } = useTranslation();
const path = pathFromProps || name; const path = pathFromProps || name;
@@ -45,7 +51,7 @@ const NumberField: React.FC<Props> = (props) => {
showError, showError,
setValue, setValue,
errorMessage, errorMessage,
} = useField({ } = useField<number | number[]>({
path, path,
validate: memoizedValidate, validate: memoizedValidate,
condition, condition,
@@ -67,8 +73,46 @@ const NumberField: React.FC<Props> = (props) => {
className, className,
showError && 'error', showError && 'error',
readOnly && 'read-only', readOnly && 'read-only',
hasMany && 'has-many',
].filter(Boolean).join(' '); ].filter(Boolean).join(' ');
const [valueToRender, setValueToRender] = useState<{label: string, value: {value: number}, id: string}[]>([]); // Only for hasMany
const handleHasManyChange = useCallback((selectedOption) => {
if (!readOnly) {
let newValue;
if (!selectedOption) {
newValue = [];
} else if (Array.isArray(selectedOption)) {
newValue = selectedOption.map((option) => Number(option.value?.value || option.value));
} else {
newValue = [Number(selectedOption.value?.value || selectedOption.value)];
}
setValue(newValue);
}
}, [
readOnly,
setValue,
]);
// useeffect update valueToRender:
useEffect(() => {
if (hasMany && Array.isArray(value)) {
setValueToRender(value.map((val, index) => {
return {
label: `${val}`,
value: {
value: (val as any)?.value || val,
toString: () => `${val}${index}`,
}, // You're probably wondering, why the hell is this done that way? Well, React-select automatically uses "label-value" as a key, so we will get that react duplicate key warning if we just pass in the value as multiple values can be the same. So we need to append the index to the toString() of the value to avoid that warning, as it uses that as the key.
id: `${val}${index}`, // append index to avoid duplicate keys but allow duplicate numbers
};
}));
}
}, [value, hasMany]);
return ( return (
<div <div
className={classes} className={classes}
@@ -86,21 +130,43 @@ const NumberField: React.FC<Props> = (props) => {
label={label} label={label}
required={required} required={required}
/> />
<input {hasMany ? (
id={`field-${path.replace(/\./gi, '__')}`} <ReactSelect
value={typeof value === 'number' ? value : ''} className={`field-${path.replace(/\./gi, '__')}`}
onChange={handleChange} placeholder={t('general:enterAValue')}
disabled={readOnly} onChange={handleHasManyChange}
placeholder={getTranslation(placeholder, i18n)} value={valueToRender as Option[]}
type="number" showError={showError}
name={path} disabled={readOnly}
step={step} options={[]}
onWheel={(e) => { isCreatable
// eslint-disable-next-line @typescript-eslint/ban-ts-comment isMulti
// @ts-ignore isSortable
e.target.blur(); isClearable
}} filterOption={(option, rawInput) => {
/> // eslint-disable-next-line no-restricted-globals
return isNumber(rawInput)
}}
numberOnly
/>
) : (
<input
id={`field-${path.replace(/\./gi, '__')}`}
value={typeof value === 'number' ? value : ''}
onChange={handleChange}
disabled={readOnly}
placeholder={getTranslation(placeholder, i18n)}
type="number"
name={path}
step={step}
onWheel={(e) => {
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
e.target.blur();
}}
/>
)}
<FieldDescription <FieldDescription
value={value} value={value}
description={description} description={description}

View File

@@ -341,7 +341,7 @@ export type CollectionConfig = {
* @default true * @default true
*/ */
timestamps?: boolean timestamps?: boolean
/** Extension point to add your custom data. */ /** Extension point to add your custom data. */
custom?: Record<string, any>; custom?: Record<string, any>;
}; };

View File

@@ -194,7 +194,7 @@ export type Endpoint = {
* @default false * @default false
*/ */
root?: boolean; root?: boolean;
/** Extension point to add your custom data. */ /** Extension point to add your custom data. */
custom?: Record<string, any>; custom?: Record<string, any>;
}; };
@@ -528,7 +528,7 @@ export type Config = {
telemetry?: boolean; telemetry?: boolean;
/** A function that is called immediately following startup that receives the Payload instance as its only argument. */ /** A function that is called immediately following startup that receives the Payload instance as its only argument. */
onInit?: (payload: Payload) => Promise<void> | void; onInit?: (payload: Payload) => Promise<void> | void;
/** Extension point to add your custom data. */ /** Extension point to add your custom data. */
custom?: Record<string, any>; custom?: Record<string, any>;
}; };

View File

@@ -94,6 +94,11 @@ export const number = baseField.keys({
autoComplete: joi.string(), autoComplete: joi.string(),
step: joi.number(), step: joi.number(),
}), }),
hasMany: joi.boolean().default(false),
minRows: joi.number()
.when('hasMany', { is: joi.not(true), then: joi.forbidden() }),
maxRows: joi.number()
.when('hasMany', { is: joi.not(true), then: joi.forbidden() }),
}); });
export const textarea = baseField.keys({ export const textarea = baseField.keys({

View File

@@ -122,20 +122,40 @@ export interface FieldBase {
read?: FieldAccess; read?: FieldAccess;
update?: FieldAccess; update?: FieldAccess;
}; };
/** Extension point to add your custom data. */ /** Extension point to add your custom data. */
custom?: Record<string, any>; custom?: Record<string, any>;
} }
export type NumberField = FieldBase & { export type NumberField = FieldBase & {
type: 'number'; type: 'number';
admin?: Admin & { admin?: Admin & {
/** Set this property to a string that will be used for browser autocomplete. */
autoComplete?: string autoComplete?: string
/** Set this property to define a placeholder string for the field. */
placeholder?: Record<string, string> | string placeholder?: Record<string, string> | string
/** Set a value for the number field to increment / decrement using browser controls. */
step?: number step?: number
} }
/** Minimum value accepted. Used in the default `validation` function. */
min?: number min?: number
/** Maximum value accepted. Used in the default `validation` function. */
max?: number max?: number
} } & ({
/** Makes this field an ordered array of numbers instead of just a single number. */
hasMany: true
/** Minimum number of numbers in the numbers array, if `hasMany` is set to true. */
minRows?: number
/** Maximum number of numbers in the numbers array, if `hasMany` is set to true. */
maxRows?: number
} | {
/** Makes this field an ordered array of numbers instead of just a single number. */
hasMany?: false | undefined
/** Minimum number of numbers in the numbers array, if `hasMany` is set to true. */
minRows?: undefined
/** Maximum number of numbers in the numbers array, if `hasMany` is set to true. */
maxRows?: undefined
})
export type TextField = FieldBase & { export type TextField = FieldBase & {
type: 'text'; type: 'text';
@@ -261,7 +281,7 @@ export type UIField = {
} }
} }
type: 'ui'; type: 'ui';
/** Extension point to add your custom data. */ /** Extension point to add your custom data. */
custom?: Record<string, any>; custom?: Record<string, any>;
} }

View File

@@ -424,5 +424,30 @@ describe('Field Validations', () => {
const result = number(val, { ...numberOptions, max: 1 }); const result = number(val, { ...numberOptions, max: 1 });
expect(result).toBe('validation:greaterThanMax'); expect(result).toBe('validation:greaterThanMax');
}); });
it('should validate an array of numbers', async () => {
const val = [1.25, 2.5];
const result = number(val, { ...numberOptions, hasMany: true });
expect(result).toBe(true);
});
it('should validate an array of numbers using min', async () => {
const val = [1.25, 2.5];
const result = number(val, { ...numberOptions, hasMany: true, min: 3 });
expect(result).toBe('validation:lessThanMin');
});
it('should validate an array of numbers using max', async () => {
const val = [1.25, 2.5];
const result = number(val, { ...numberOptions, hasMany: true, max: 1 });
expect(result).toBe('validation:greaterThanMax');
});
it('should validate an array of numbers using minRows', async () => {
const val = [1.25, 2.5];
const result = number(val, { ...numberOptions, hasMany: true, minRows: 4 });
expect(result).toBe('validation:lessThanMin');
});
it('should validate an array of numbers using maxRows', async () => {
const val = [1.25, 2.5, 3.5];
const result = number(val, { ...numberOptions, hasMany: true, maxRows: 2 });
expect(result).toBe('validation:greaterThanMax');
});
}); });
}); });

View File

@@ -24,25 +24,45 @@ import canUseDOM from '../utilities/canUseDOM';
import { isValidID } from '../utilities/isValidID'; import { isValidID } from '../utilities/isValidID';
import { getIDType } from '../utilities/getIDType'; import { getIDType } from '../utilities/getIDType';
export const number: Validate<unknown, unknown, NumberField> = (value: string, { t, required, min, max }) => { export const number: Validate<unknown, unknown, NumberField> = (value: number | number[], { t, required, min, max, minRows, maxRows, hasMany }) => {
const parsedValue = parseFloat(value); const toValidate: number[] = Array.isArray(value) ? value : [value];
if ((value && typeof parsedValue !== 'number') || (required && Number.isNaN(parsedValue)) || (value && Number.isNaN(parsedValue))) { // eslint-disable-next-line no-restricted-syntax
return t('validation:enterNumber'); for (const valueToValidate of toValidate) {
const floatValue = parseFloat(valueToValidate as unknown as string);
if ((value && typeof floatValue !== 'number') || (required && Number.isNaN(floatValue)) || (value && Number.isNaN(floatValue))) {
return t('validation:enterNumber');
}
if (typeof max === 'number' && floatValue > max) {
return t('validation:greaterThanMax', { value, max, label: t('value') });
}
if (typeof min === 'number' && floatValue < min) {
return t('validation:lessThanMin', { value, min, label: t('value') });
}
if (required && typeof floatValue !== 'number') {
return t('validation:required');
}
} }
if (typeof max === 'number' && parsedValue > max) { if (required && toValidate.length === 0) {
return t('validation:greaterThanMax', { value, max });
}
if (typeof min === 'number' && parsedValue < min) {
return t('validation:lessThanMin', { value, min });
}
if (required && typeof parsedValue !== 'number') {
return t('validation:required'); return t('validation:required');
} }
if (hasMany === true) {
if (minRows && toValidate.length < minRows) {
return t('validation:lessThanMin', { value: toValidate.length, min: minRows, label: t('rows') });
}
if (maxRows && toValidate.length > maxRows) {
return t('validation:greaterThanMax', { value: toValidate.length, max: maxRows, label: t('rows') });
}
}
return true; return true;
}; };
@@ -290,11 +310,11 @@ export const relationship: Validate<unknown, unknown, RelationshipField> = async
if (Array.isArray(value)) { if (Array.isArray(value)) {
if (minRows && value.length < minRows) { if (minRows && value.length < minRows) {
return t('validation:lessThanMin', { count: minRows, label: t('rows') }); return t('validation:lessThanMin', { value: value.length, min: minRows, label: t('rows') });
} }
if (maxRows && value.length > maxRows) { if (maxRows && value.length > maxRows) {
return t('validation:greaterThanMax', { count: maxRows, label: t('rows') }); return t('validation:greaterThanMax', { value: value.length, max: maxRows, label: t('rows') });
} }
} }

View File

@@ -132,7 +132,7 @@ export type GlobalConfig = {
} }
fields: Field[]; fields: Field[];
admin?: GlobalAdminOptions admin?: GlobalAdminOptions
/** Extension point to add your custom data. */ /** Extension point to add your custom data. */
custom?: Record<string, any>; custom?: Record<string, any>;
} }

View File

@@ -43,7 +43,7 @@ function buildMutationInputType(payload: Payload, name: string, fields: Field[],
const type = field.name === 'id' ? GraphQLInt : GraphQLFloat; const type = field.name === 'id' ? GraphQLInt : GraphQLFloat;
return { return {
...inputObjectTypeConfig, ...inputObjectTypeConfig,
[field.name]: { type: withNullableType(field, type, forceNullable) }, [field.name]: { type: withNullableType(field, field.hasMany === true ? new GraphQLList(type) : type, forceNullable) },
}; };
}, },
text: (inputObjectTypeConfig: InputObjectTypeConfig, field: TextField) => ({ text: (inputObjectTypeConfig: InputObjectTypeConfig, field: TextField) => ({

View File

@@ -84,10 +84,13 @@ function buildObjectType({
forceNullable, forceNullable,
}: Args): GraphQLObjectType { }: Args): GraphQLObjectType {
const fieldToSchemaMap = { const fieldToSchemaMap = {
number: (objectTypeConfig: ObjectTypeConfig, field: NumberField) => ({ number: (objectTypeConfig: ObjectTypeConfig, field: NumberField) => {
...objectTypeConfig, const type = field?.name === 'id' ? GraphQLInt : GraphQLFloat;
[field.name]: { type: withNullableType(field, GraphQLFloat, forceNullable) }, return ({
}), ...objectTypeConfig,
[field.name]: { type: withNullableType(field, field?.hasMany === true ? new GraphQLList(type) : type, forceNullable) },
});
},
text: (objectTypeConfig: ObjectTypeConfig, field: TextField) => ({ text: (objectTypeConfig: ObjectTypeConfig, field: TextField) => ({
...objectTypeConfig, ...objectTypeConfig,
[field.name]: { type: withNullableType(field, GraphQLString, forceNullable) }, [field.name]: { type: withNullableType(field, GraphQLString, forceNullable) },

View File

@@ -1,8 +1,8 @@
import { GraphQLBoolean, GraphQLInputObjectType, GraphQLString, GraphQLList, GraphQLFloat, GraphQLEnumType } from 'graphql'; import { GraphQLBoolean, GraphQLInputObjectType, GraphQLString, GraphQLList, GraphQLFloat, GraphQLEnumType, GraphQLInt } from 'graphql';
import type { GraphQLType } from 'graphql'; import type { GraphQLType } from 'graphql';
import { GraphQLJSON } from 'graphql-type-json'; import { GraphQLJSON } from 'graphql-type-json';
import { DateTimeResolver, EmailAddressResolver } from 'graphql-scalars'; import { DateTimeResolver, EmailAddressResolver } from 'graphql-scalars';
import { FieldAffectingData, RadioField, SelectField, optionIsObject } from '../../fields/config/types'; import { FieldAffectingData, NumberField, RadioField, RelationshipField, SelectField, optionIsObject } from '../../fields/config/types';
import combineParentName from '../utilities/combineParentName'; import combineParentName from '../utilities/combineParentName';
import formatName from '../utilities/formatName'; import formatName from '../utilities/formatName';
import operators from './operators'; import operators from './operators';
@@ -27,7 +27,10 @@ type DefaultsType = {
const defaults: DefaultsType = { const defaults: DefaultsType = {
number: { number: {
type: GraphQLFloat, type: (field: NumberField): GraphQLType => {
const type = field?.name === 'id' ? GraphQLInt : GraphQLFloat;
return field?.hasMany === true ? new GraphQLList(type) : type;
},
operators: [...operators.equality, ...operators.comparison], operators: [...operators.equality, ...operators.comparison],
}, },
text: { text: {
@@ -86,7 +89,9 @@ const defaults: DefaultsType = {
operators: [...operators.equality, ...operators.comparison, ...operators.geo], operators: [...operators.equality, ...operators.comparison, ...operators.geo],
}, },
relationship: { relationship: {
type: GraphQLString, type: (field: RelationshipField): GraphQLType => {
return field?.hasMany === true ? new GraphQLList(GraphQLString) : GraphQLString;
},
operators: [...operators.equality, ...operators.contains], operators: [...operators.equality, ...operators.contains],
}, },
upload: { upload: {

View File

@@ -233,12 +233,13 @@ export class ParamParser {
hasCustomID = true; hasCustomID = true;
} }
paths.push({ paths.push({
path: '_id', path: '_id',
field: { field: {
name: 'id', name: 'id',
type: idFieldType, type: idFieldType,
}, } as Field, // With the hasMany union type stuff for the number field, typescript gets confused if we remove the `as Field` here
complete: true, complete: true,
collectionSlug: this.collectionSlug, collectionSlug: this.collectionSlug,
}); });

View File

@@ -114,7 +114,7 @@ const buildSchema = (config: SanitizedConfig, configFields: Field[], buildSchema
const fieldToSchemaMap: Record<string, FieldSchemaGenerator> = { const fieldToSchemaMap: Record<string, FieldSchemaGenerator> = {
number: (field: NumberField, schema: Schema, config: SanitizedConfig, buildSchemaOptions: BuildSchemaOptions): void => { number: (field: NumberField, schema: Schema, config: SanitizedConfig, buildSchemaOptions: BuildSchemaOptions): void => {
const baseSchema = { ...formatBaseSchema(field, buildSchemaOptions), type: Number }; const baseSchema = { ...formatBaseSchema(field, buildSchemaOptions), type: field.hasMany ? [Number] : Number };
schema.add({ schema.add({
[field.name]: localizeSchema(field, baseSchema, config.localization), [field.name]: localizeSchema(field, baseSchema, config.localization),

View File

@@ -241,6 +241,7 @@
"uploading": "جار الرفع", "uploading": "جار الرفع",
"user": "المستخدم", "user": "المستخدم",
"users": "المستخدمين", "users": "المستخدمين",
"value": "القيمة",
"welcome": "مرحبًا" "welcome": "مرحبًا"
}, },
"operators": { "operators": {
@@ -274,11 +275,11 @@
"emailAddress": "يرجى إدخال عنوان بريد إلكتروني صحيح.", "emailAddress": "يرجى إدخال عنوان بريد إلكتروني صحيح.",
"enterNumber": "يرجى إدخال رقم صحيح.", "enterNumber": "يرجى إدخال رقم صحيح.",
"fieldHasNo": "هذا الحقل ليس لديه {{label}}", "fieldHasNo": "هذا الحقل ليس لديه {{label}}",
"greaterThanMax": "\"{{value}}\" أكبر من الحد الأقصى المسموح به {{max}}.", "greaterThanMax": "{{value}} أكبر من الحد الأقصى المسموح به {{label}} الذي يبلغ {{max}}.",
"invalidInput": "هذا الحقل لديه إدخال غير صالح.", "invalidInput": "هذا الحقل لديه إدخال غير صالح.",
"invalidSelection": "هذا الحقل لديه اختيار غير صالح.", "invalidSelection": "هذا الحقل لديه اختيار غير صالح.",
"invalidSelections": "هذا الحقل لديه الاختيارات الغير صالحة التالية:", "invalidSelections": "هذا الحقل لديه الاختيارات الغير صالحة التالية:",
"lessThanMin": "\"{{value}}\" أقل من الحد الأدنى المسموح به {{min}}.", "lessThanMin": "{{value}} أقل من الحد الأدنى المسموح به {{label}} الذي يبلغ {{min}}.",
"longerThanMin": "يجب أن يكون هذا القيمة أطول من الحد الأدنى للطول الذي هو {{minLength}} أحرف.", "longerThanMin": "يجب أن يكون هذا القيمة أطول من الحد الأدنى للطول الذي هو {{minLength}} أحرف.",
"notValidDate": "\"{{value}}\" ليس تاريخا صالحا.", "notValidDate": "\"{{value}}\" ليس تاريخا صالحا.",
"required": "هذا الحقل مطلوب.", "required": "هذا الحقل مطلوب.",

View File

@@ -241,6 +241,7 @@
"uploading": "Качва се", "uploading": "Качва се",
"user": "Потребител", "user": "Потребител",
"users": "Потребители", "users": "Потребители",
"value": "Стойност",
"welcome": "Добре дошъл" "welcome": "Добре дошъл"
}, },
"operators": { "operators": {
@@ -274,11 +275,11 @@
"emailAddress": "Моля, въведи валиден имейл адрес.", "emailAddress": "Моля, въведи валиден имейл адрес.",
"enterNumber": "Моля, въведи валиден номер.", "enterNumber": "Моля, въведи валиден номер.",
"fieldHasNo": "Това поле няма {{label}}", "fieldHasNo": "Това поле няма {{label}}",
"greaterThanMax": "\"{{value}}\" е по-голямо от максималната позволена големина {{max}}.", "greaterThanMax": "{{value}} е по-голямо от максимално допустимото {{label}} от {{max}}.",
"invalidInput": "Това поле има невалиден вход.", "invalidInput": "Това поле има невалиден вход.",
"invalidSelection": "Това поле има невалидна селекция.", "invalidSelection": "Това поле има невалидна селекция.",
"invalidSelections": "Това поле има следните невалидни селекции:", "invalidSelections": "Това поле има следните невалидни селекции:",
"lessThanMin": "\"{{value}}\" е по-малко от минималната позволена големина {{min}}.", "lessThanMin": "{{value}} е по-малко от минимално допустимото {{label}} от {{min}}.",
"longerThanMin": "Тази стойност трябва да е по-голяма от минималната стойност от {{minLength}} символа.", "longerThanMin": "Тази стойност трябва да е по-голяма от минималната стойност от {{minLength}} символа.",
"notValidDate": "\"{{value}}\" не е валидна дата.", "notValidDate": "\"{{value}}\" не е валидна дата.",
"required": "Това поле е задължително.", "required": "Това поле е задължително.",

View File

@@ -238,6 +238,7 @@
"uploading": "Nahrávání", "uploading": "Nahrávání",
"user": "Uživatel", "user": "Uživatel",
"users": "Uživatelé", "users": "Uživatelé",
"value": "Hodnota",
"welcome": "Vítejte" "welcome": "Vítejte"
}, },
"operators": { "operators": {
@@ -271,11 +272,11 @@
"emailAddress": "Zadejte prosím platnou e-mailovou adresu.", "emailAddress": "Zadejte prosím platnou e-mailovou adresu.",
"enterNumber": "Zadejte prosím platné číslo.", "enterNumber": "Zadejte prosím platné číslo.",
"fieldHasNo": "Toto pole nemá {{label}}", "fieldHasNo": "Toto pole nemá {{label}}",
"greaterThanMax": "\"{{value}}\" je větší než maximální povolená hodnota {{max}}.", "greaterThanMax": "{{value}} je vší než maximálně povolená {{label}} {{max}}.",
"invalidInput": "Toto pole má neplatný vstup.", "invalidInput": "Toto pole má neplatný vstup.",
"invalidSelection": "Toto pole má neplatný výběr.", "invalidSelection": "Toto pole má neplatný výběr.",
"invalidSelections": "Toto pole má následující neplatné výběry:", "invalidSelections": "Toto pole má následující neplatné výběry:",
"lessThanMin": "\"{{value}}\" je menší než minimální povolená hodnota {{min}}.", "lessThanMin": "{{value}} je nižší než minimálně povolená {{label}} {{min}}.",
"longerThanMin": "Tato hodnota musí být delší než minimální délka {{minLength}} znaků.", "longerThanMin": "Tato hodnota musí být delší než minimální délka {{minLength}} znaků.",
"notValidDate": "\"{{value}}\" není platné datum.", "notValidDate": "\"{{value}}\" není platné datum.",
"required": "Toto pole je povinné.", "required": "Toto pole je povinné.",

View File

@@ -241,6 +241,7 @@
"uploading": "Hochladen", "uploading": "Hochladen",
"user": "Benutzer", "user": "Benutzer",
"users": "Benutzer", "users": "Benutzer",
"value": "Wert",
"welcome": "Willkommen" "welcome": "Willkommen"
}, },
"operators": { "operators": {
@@ -274,11 +275,11 @@
"emailAddress": "Bitte gib eine korrekte E-Mail-Adresse an.", "emailAddress": "Bitte gib eine korrekte E-Mail-Adresse an.",
"enterNumber": "Bitte gib eine gültige Nummer an,", "enterNumber": "Bitte gib eine gültige Nummer an,",
"fieldHasNo": "Dieses Feld hat kein {{label}}", "fieldHasNo": "Dieses Feld hat kein {{label}}",
"greaterThanMax": "\"{{value}}\" ist größer als der maximal erlaubte Wert von {{max}}.", "greaterThanMax": "{{value}} ist größer als der maximal erlaubte {{label}} von {{max}}.",
"invalidInput": "Dieses Feld hat einen inkorrekten Wert.", "invalidInput": "Dieses Feld hat einen inkorrekten Wert.",
"invalidSelection": "Dieses Feld hat eine inkorrekte Auswahl.", "invalidSelection": "Dieses Feld hat eine inkorrekte Auswahl.",
"invalidSelections": "'Dieses Feld enthält die folgenden inkorrekten Auswahlen:'", "invalidSelections": "'Dieses Feld enthält die folgenden inkorrekten Auswahlen:'",
"lessThanMin": "\"{{value}}\" ist weniger als der minimale erlaubte Wert von {{min}}.", "lessThanMin": "{{value}} ist kleiner als der minimal erlaubte {{label}} von {{min}}.",
"longerThanMin": "Dieser Wert muss länger als die minimale Länge von {{minLength}} Zeichen sein.", "longerThanMin": "Dieser Wert muss länger als die minimale Länge von {{minLength}} Zeichen sein.",
"notValidDate": "\"{{value}}\" ist kein gültiges Datum.", "notValidDate": "\"{{value}}\" ist kein gültiges Datum.",
"required": "Pflichtfeld", "required": "Pflichtfeld",

View File

@@ -241,6 +241,7 @@
"uploading": "Uploading", "uploading": "Uploading",
"user": "User", "user": "User",
"users": "Users", "users": "Users",
"value": "Value",
"welcome": "Welcome" "welcome": "Welcome"
}, },
"operators": { "operators": {
@@ -274,11 +275,11 @@
"emailAddress": "Please enter a valid email address.", "emailAddress": "Please enter a valid email address.",
"enterNumber": "Please enter a valid number.", "enterNumber": "Please enter a valid number.",
"fieldHasNo": "This field has no {{label}}", "fieldHasNo": "This field has no {{label}}",
"greaterThanMax": "\"{{value}}\" is greater than the max allowed value of {{max}}.", "greaterThanMax": "{{value}} is greater than the max allowed {{label}} of {{max}}.",
"invalidInput": "This field has an invalid input.", "invalidInput": "This field has an invalid input.",
"invalidSelection": "This field has an invalid selection.", "invalidSelection": "This field has an invalid selection.",
"invalidSelections": "This field has the following invalid selections:", "invalidSelections": "This field has the following invalid selections:",
"lessThanMin": "\"{{value}}\" is less than the min allowed value of {{min}}.", "lessThanMin": "{{value}} is less than the min allowed {{label}} of {{min}}.",
"longerThanMin": "This value must be longer than the minimum length of {{minLength}} characters.", "longerThanMin": "This value must be longer than the minimum length of {{minLength}} characters.",
"notValidDate": "\"{{value}}\" is not a valid date.", "notValidDate": "\"{{value}}\" is not a valid date.",
"required": "This field is required.", "required": "This field is required.",

View File

@@ -241,6 +241,7 @@
"uploading": "Subiendo", "uploading": "Subiendo",
"user": "Usuario", "user": "Usuario",
"users": "Usuarios", "users": "Usuarios",
"value": "Valor",
"welcome": "Bienvenido" "welcome": "Bienvenido"
}, },
"operators": { "operators": {
@@ -274,11 +275,11 @@
"emailAddress": "Por favor introduce un correo electrónico válido.", "emailAddress": "Por favor introduce un correo electrónico válido.",
"enterNumber": "Por favor introduce un número válido.", "enterNumber": "Por favor introduce un número válido.",
"fieldHasNo": "Este campo no tiene {{label}}", "fieldHasNo": "Este campo no tiene {{label}}",
"greaterThanMax": "\"{{value}}\" es mayor que el valor máximo permitido de {{max}}.", "greaterThanMax": "{{value}} es mayor que el {{label}} máximo permitido de {{max}}.",
"invalidInput": "La información en este campo es inválida.", "invalidInput": "La información en este campo es inválida.",
"invalidSelection": "La selección en este campo es inválida.", "invalidSelection": "La selección en este campo es inválida.",
"invalidSelections": "Este campo tiene las siguientes selecciones inválidas:", "invalidSelections": "Este campo tiene las siguientes selecciones inválidas:",
"lessThanMin": "\"{{value}}\" es menor que el valor mínimo permitido de {{min}}.", "lessThanMin": "{{value}} es menor que el {{label}} mínimo permitido de {{min}}.",
"longerThanMin": "Este dato debe ser más largo que el mínimo de {{minLength}} caracteres.", "longerThanMin": "Este dato debe ser más largo que el mínimo de {{minLength}} caracteres.",
"notValidDate": "\"{{value}}\" es una fecha inválida.", "notValidDate": "\"{{value}}\" es una fecha inválida.",
"required": "Este campo es obligatorio.", "required": "Este campo es obligatorio.",

View File

@@ -241,6 +241,7 @@
"uploading": "در حال بارگذاری", "uploading": "در حال بارگذاری",
"user": "کاربر", "user": "کاربر",
"users": "کاربران", "users": "کاربران",
"value": "مقدار",
"welcome": "خوش‌آمدید" "welcome": "خوش‌آمدید"
}, },
"operators": { "operators": {
@@ -274,11 +275,11 @@
"emailAddress": "لطفاً یک نشانی رایانامه معتبر وارد کنید.", "emailAddress": "لطفاً یک نشانی رایانامه معتبر وارد کنید.",
"enterNumber": "لطفاً یک شماره درست وارد کنید.", "enterNumber": "لطفاً یک شماره درست وارد کنید.",
"fieldHasNo": "این کادر شامل هیچ {{label}} نمی‌شود", "fieldHasNo": "این کادر شامل هیچ {{label}} نمی‌شود",
"greaterThanMax": "\"{{value}}\" بیشتر از حد مجاز است {{max}}.", "greaterThanMax": "{{value}} بیشتر از حداکثر مجاز برای {{label}} است که {{max}} است.",
"invalidInput": "این کادر دارای ورودی نامعتبر است.", "invalidInput": "این کادر دارای ورودی نامعتبر است.",
"invalidSelection": "این کادر دارای یک انتخاب نامعتبر است.", "invalidSelection": "این کادر دارای یک انتخاب نامعتبر است.",
"invalidSelections": "این کادر دارای انتخاب‌های نامعتبر زیر است:", "invalidSelections": "این کادر دارای انتخاب‌های نامعتبر زیر است:",
"lessThanMin": "\"{{value}}\" کمتر از مقدار مجاز است {{min}}.", "lessThanMin": "{{value}} کمتر از حداقل مجاز برای {{label}} است که {{min}} است.",
"longerThanMin": "ورودی باید بیش از حداقل {{minLength}} واژه باشد.", "longerThanMin": "ورودی باید بیش از حداقل {{minLength}} واژه باشد.",
"notValidDate": "\"{{value}}\" یک تاریخ معتبر نیست.", "notValidDate": "\"{{value}}\" یک تاریخ معتبر نیست.",
"required": "این کادر اجباری است.", "required": "این کادر اجباری است.",

View File

@@ -241,6 +241,7 @@
"uploading": "Téléchargement", "uploading": "Téléchargement",
"user": "Utilisateur", "user": "Utilisateur",
"users": "Utilisateurs", "users": "Utilisateurs",
"value": "Valeur",
"welcome": "Bienvenu(e)" "welcome": "Bienvenu(e)"
}, },
"operators": { "operators": {
@@ -274,11 +275,11 @@
"emailAddress": "S'il vous plaît, veuillez entrer une adresse e-mail valide.", "emailAddress": "S'il vous plaît, veuillez entrer une adresse e-mail valide.",
"enterNumber": "S'il vous plait, veuillez entrer un nombre valide.", "enterNumber": "S'il vous plait, veuillez entrer un nombre valide.",
"fieldHasNo": "Ce champ n'a pas de {{label}}", "fieldHasNo": "Ce champ n'a pas de {{label}}",
"greaterThanMax": "\"{{value}}\" est supérieur à la valeur maximale autorisée de {{max}}.", "greaterThanMax": "{{value}} est supérieur au max autorisé {{label}} de {{max}}.",
"invalidInput": "Ce champ a une entrée invalide.", "invalidInput": "Ce champ a une entrée invalide.",
"invalidSelection": "Ce champ a une sélection invalide.", "invalidSelection": "Ce champ a une sélection invalide.",
"invalidSelections": "Ce champ contient des sélections invalides suivantes :", "invalidSelections": "Ce champ contient des sélections invalides suivantes :",
"lessThanMin": "\"{{value}}\" est inférieur à la valeur minimale autorisée de {{min}}.", "lessThanMin": "{{value}} est inférieur au min autorisé {{label}} de {{min}}.",
"longerThanMin": "Cette valeur doit être supérieure à la longueur minimale de {{minLength}} caractères.", "longerThanMin": "Cette valeur doit être supérieure à la longueur minimale de {{minLength}} caractères.",
"notValidDate": "\"{{value}}\" n'est pas une date valide.", "notValidDate": "\"{{value}}\" n'est pas une date valide.",
"required": "Ce champ est requis.", "required": "Ce champ est requis.",

View File

@@ -241,6 +241,7 @@
"uploading": "Prijenos", "uploading": "Prijenos",
"user": "Korisnik", "user": "Korisnik",
"users": "Korisnici", "users": "Korisnici",
"value": "Attribute",
"welcome": "Dobrodošli" "welcome": "Dobrodošli"
}, },
"operators": { "operators": {
@@ -274,11 +275,11 @@
"emailAddress": "Molim unestie valjanu email adresu.", "emailAddress": "Molim unestie valjanu email adresu.",
"enterNumber": "Molim unesite valjani broj.", "enterNumber": "Molim unesite valjani broj.",
"fieldHasNo": "Ovo polje nema {{label}}", "fieldHasNo": "Ovo polje nema {{label}}",
"greaterThanMax": "\"{{value}}\" je veće od maksimalne dopuštene vrijednosti od {{max}}.", "greaterThanMax": "{{value}} exceeds the maximum allowable {{label}} limit of {{max}}.",
"invalidInput": "Ovo polje ima nevaljan unos.", "invalidInput": "Ovo polje ima nevaljan unos.",
"invalidSelection": "Ovo polje ima nevaljan odabir.", "invalidSelection": "Ovo polje ima nevaljan odabir.",
"invalidSelections": "Ovo polje ima sljedeće nevaljane odabire:", "invalidSelections": "Ovo polje ima sljedeće nevaljane odabire:",
"lessThanMin": "\"{{value}}\" je manja od minimalne dopuštene vrijednost od {{min}}.", "lessThanMin": "{{value}} is below the minimum allowable {{label}} limit of {{min}}.",
"longerThanMin": "Ova vrijednost mora biti duža od minimalne dužine od {{minLength}} znakova", "longerThanMin": "Ova vrijednost mora biti duža od minimalne dužine od {{minLength}} znakova",
"notValidDate": "\"{{value}}\" nije valjan datum.", "notValidDate": "\"{{value}}\" nije valjan datum.",
"required": "Ovo polje je obvezno.", "required": "Ovo polje je obvezno.",
@@ -343,4 +344,4 @@
"viewingVersions": "Pregled verzija za {{entityLabel}} {{documentTitle}}", "viewingVersions": "Pregled verzija za {{entityLabel}} {{documentTitle}}",
"viewingVersionsGlobal": "Pregled verzije za globalni {{entityLabel}}" "viewingVersionsGlobal": "Pregled verzije za globalni {{entityLabel}}"
} }
} }

View File

@@ -1,346 +1,347 @@
{ {
"$schema": "./translation-schema.json", "$schema": "./translation-schema.json",
"authentication": { "authentication": {
"account": "Fiók", "account": "Fiók",
"accountOfCurrentUser": "Az aktuális felhasználó fiókja", "accountOfCurrentUser": "Az aktuális felhasználó fiókja",
"alreadyActivated": "Már aktiválva van", "alreadyActivated": "Már aktiválva van",
"alreadyLoggedIn": "Már bejelentkezett", "alreadyLoggedIn": "Már bejelentkezett",
"apiKey": "API-kulcs", "apiKey": "API-kulcs",
"backToLogin": "Vissza a bejelentkezéshez", "backToLogin": "Vissza a bejelentkezéshez",
"beginCreateFirstUser": "Kezdésként hozza létre az első felhasználót.", "beginCreateFirstUser": "Kezdésként hozza létre az első felhasználót.",
"changePassword": "Jelszó módosítása", "changePassword": "Jelszó módosítása",
"checkYourEmailForPasswordReset": "Ellenőrizze az e-mailjét, a linkért, amellyel biztonságosan visszaállíthatja jelszavát.", "checkYourEmailForPasswordReset": "Ellenőrizze az e-mailjét, a linkért, amellyel biztonságosan visszaállíthatja jelszavát.",
"confirmGeneration": "Generálás megerősítése", "confirmGeneration": "Generálás megerősítése",
"confirmPassword": "Jelszó megerősítése", "confirmPassword": "Jelszó megerősítése",
"createFirstUser": "Első felhasználó létrehozása", "createFirstUser": "Első felhasználó létrehozása",
"emailNotValid": "A megadott e-mail cím érvénytelen", "emailNotValid": "A megadott e-mail cím érvénytelen",
"emailSent": "E-mail elküldve", "emailSent": "E-mail elküldve",
"enableAPIKey": "API-kulcs engedélyezése", "enableAPIKey": "API-kulcs engedélyezése",
"failedToUnlock": "Nem sikerült feloldani", "failedToUnlock": "Nem sikerült feloldani",
"forceUnlock": "Kényszerített feloldás", "forceUnlock": "Kényszerített feloldás",
"forgotPassword": "Elfelejtett jelszó", "forgotPassword": "Elfelejtett jelszó",
"forgotPasswordEmailInstructions": "Kérjük, adja meg e-mail címét alább. Kapni fog egy e-mail üzenetet a jelszó visszaállításához szükséges utasításokkal.", "forgotPasswordEmailInstructions": "Kérjük, adja meg e-mail címét alább. Kapni fog egy e-mail üzenetet a jelszó visszaállításához szükséges utasításokkal.",
"forgotPasswordQuestion": "Elfelejtette jelszavát?", "forgotPasswordQuestion": "Elfelejtette jelszavát?",
"generate": "Generálás", "generate": "Generálás",
"generateNewAPIKey": "Új API-kulcs generálása", "generateNewAPIKey": "Új API-kulcs generálása",
"generatingNewAPIKeyWillInvalidate": "Az új API-kulcs generálása <1>érvényteleníti</1> az előző kulcsot. Biztos, hogy folytatni szeretné?", "generatingNewAPIKeyWillInvalidate": "Az új API-kulcs generálása <1>érvényteleníti</1> az előző kulcsot. Biztos, hogy folytatni szeretné?",
"lockUntil": "Zárolás eddig", "lockUntil": "Zárolás eddig",
"logBackIn": "Jelentkezzen be újra", "logBackIn": "Jelentkezzen be újra",
"logOut": "Kijelentkezés", "logOut": "Kijelentkezés",
"loggedIn": "Ha egy másik felhasználóval szeretne bejelentkezni, először <0>ki kell jelentkeznie</0>.", "loggedIn": "Ha egy másik felhasználóval szeretne bejelentkezni, először <0>ki kell jelentkeznie</0>.",
"loggedInChangePassword": "Jelszavának megváltoztatásához lépjen be <0>fiókjába</0>, és ott szerkessze jelszavát.", "loggedInChangePassword": "Jelszavának megváltoztatásához lépjen be <0>fiókjába</0>, és ott szerkessze jelszavát.",
"loggedOutInactivity": "Inaktivitás miatt kijelentkeztünk.", "loggedOutInactivity": "Inaktivitás miatt kijelentkeztünk.",
"loggedOutSuccessfully": "Sikeresen kijelentkezett.", "loggedOutSuccessfully": "Sikeresen kijelentkezett.",
"login": "Bejelentkezés", "login": "Bejelentkezés",
"loginAttempts": "Bejelentkezési kísérletek", "loginAttempts": "Bejelentkezési kísérletek",
"loginUser": "Bejelentkezés felhasználó", "loginUser": "Bejelentkezés felhasználó",
"loginWithAnotherUser": "Ha egy másik felhasználóval szeretne bejelentkezni, először <0>ki kell jelentkeznie</0>.", "loginWithAnotherUser": "Ha egy másik felhasználóval szeretne bejelentkezni, először <0>ki kell jelentkeznie</0>.",
"logout": "Kijelentkezés", "logout": "Kijelentkezés",
"logoutUser": "Felhasználó kijelentkezése", "logoutUser": "Felhasználó kijelentkezése",
"newAPIKeyGenerated": "Új API-kulcs generálva.", "newAPIKeyGenerated": "Új API-kulcs generálva.",
"newAccountCreated": "Létrehoztunk egy új fiókot, amellyel hozzáférhet a következőhöz <a href=\"{{serverURL}}\"> {{serverURL}} </a> Kérjük, kattintson a következő linkre, vagy illessze be az alábbi URL-t a böngészőbe az e-mail-cím ellenőrzéséhez : <a href=\"{{verificationURL}}\"> {{verificationURL}} </a> <br> Az e-mail-cím ellenőrzése után sikeresen be tud majd jelentkezni.", "newAccountCreated": "Létrehoztunk egy új fiókot, amellyel hozzáférhet a következőhöz <a href=\"{{serverURL}}\"> {{serverURL}} </a> Kérjük, kattintson a következő linkre, vagy illessze be az alábbi URL-t a böngészőbe az e-mail-cím ellenőrzéséhez : <a href=\"{{verificationURL}}\"> {{verificationURL}} </a> <br> Az e-mail-cím ellenőrzése után sikeresen be tud majd jelentkezni.",
"newPassword": "Új jelszó", "newPassword": "Új jelszó",
"resetPassword": "Jelszó visszaállítása", "resetPassword": "Jelszó visszaállítása",
"resetPasswordExpiration": "Jelszóvisszaállítás lejárata", "resetPasswordExpiration": "Jelszóvisszaállítás lejárata",
"resetPasswordToken": "Jelszóvisszaállító token", "resetPasswordToken": "Jelszóvisszaállító token",
"resetYourPassword": "Jelszó visszaállítása", "resetYourPassword": "Jelszó visszaállítása",
"stayLoggedIn": "Maradjon bejelentkezve", "stayLoggedIn": "Maradjon bejelentkezve",
"successfullyUnlocked": "Sikeresen feloldva", "successfullyUnlocked": "Sikeresen feloldva",
"unableToVerify": "Sikertelen megerősítés", "unableToVerify": "Sikertelen megerősítés",
"verified": "Megerősítve", "verified": "Megerősítve",
"verifiedSuccessfully": "Sikeresen megerősítve", "verifiedSuccessfully": "Sikeresen megerősítve",
"verify": "Megerősítés", "verify": "Megerősítés",
"verifyUser": "Felhasználó megerősítése", "verifyUser": "Felhasználó megerősítése",
"verifyYourEmail": "Erősítse meg az e-mail címét", "verifyYourEmail": "Erősítse meg az e-mail címét",
"youAreInactive": "Már egy ideje nem volt aktív, és hamarosan automatikusan kijelentkeztetjük saját biztonsága érdekében. Szeretne bejelentkezve maradni?", "youAreInactive": "Már egy ideje nem volt aktív, és hamarosan automatikusan kijelentkeztetjük saját biztonsága érdekében. Szeretne bejelentkezve maradni?",
"youAreReceivingResetPassword": "Ezt azért kapja, mert Ön (vagy valaki más) kérte fiókja jelszavának visszaállítását. A folyamat befejezéséhez kattintson a következő linkre, vagy illessze be böngészőjébe:", "youAreReceivingResetPassword": "Ezt azért kapja, mert Ön (vagy valaki más) kérte fiókja jelszavának visszaállítását. A folyamat befejezéséhez kattintson a következő linkre, vagy illessze be böngészőjébe:",
"youDidNotRequestPassword": "Ha nem Ön kérte ezt, kérjük, hagyja figyelmen kívül ezt az e-mailt, és jelszava változatlan marad." "youDidNotRequestPassword": "Ha nem Ön kérte ezt, kérjük, hagyja figyelmen kívül ezt az e-mailt, és jelszava változatlan marad."
}, },
"error": { "error": {
"accountAlreadyActivated": "Ez a fiók már aktiválva van.", "accountAlreadyActivated": "Ez a fiók már aktiválva van.",
"autosaving": "Hiba történt a dokumentum automatikus mentése közben.", "autosaving": "Hiba történt a dokumentum automatikus mentése közben.",
"correctInvalidFields": "Kérjük, javítsa ki az érvénytelen mezőket.", "correctInvalidFields": "Kérjük, javítsa ki az érvénytelen mezőket.",
"deletingFile": "Hiba történt a fájl törlésekor.", "deletingFile": "Hiba történt a fájl törlésekor.",
"deletingTitle": "Hiba történt a {{title}} törlése közben. Kérjük, ellenőrizze a kapcsolatot, és próbálja meg újra.", "deletingTitle": "Hiba történt a {{title}} törlése közben. Kérjük, ellenőrizze a kapcsolatot, és próbálja meg újra.",
"emailOrPasswordIncorrect": "A megadott e-mail-cím vagy jelszó helytelen.", "emailOrPasswordIncorrect": "A megadott e-mail-cím vagy jelszó helytelen.",
"followingFieldsInvalid_many": "A következő mezők érvénytelenek:", "followingFieldsInvalid_many": "A következő mezők érvénytelenek:",
"followingFieldsInvalid_one": "A következő mező érvénytelen:", "followingFieldsInvalid_one": "A következő mező érvénytelen:",
"incorrectCollection": "Helytelen gyűjtemény", "incorrectCollection": "Helytelen gyűjtemény",
"invalidFileType": "Érvénytelen fájltípus", "invalidFileType": "Érvénytelen fájltípus",
"invalidFileTypeValue": "Érvénytelen fájltípus: {{value}}", "invalidFileTypeValue": "Érvénytelen fájltípus: {{value}}",
"loadingDocument": "Hiba történt a {{id}} azonosítójú dokumentum betöltésekor.", "loadingDocument": "Hiba történt a {{id}} azonosítójú dokumentum betöltésekor.",
"missingEmail": "Hiányzó e-mail.", "missingEmail": "Hiányzó e-mail.",
"missingIDOfDocument": "Hiányzik a frissítendő dokumentum azonosítója.", "missingIDOfDocument": "Hiányzik a frissítendő dokumentum azonosítója.",
"missingIDOfVersion": "A verzió azonosítója hiányzik.", "missingIDOfVersion": "A verzió azonosítója hiányzik.",
"missingRequiredData": "Hiányoznak kötelező adatok.", "missingRequiredData": "Hiányoznak kötelező adatok.",
"noFilesUploaded": "Nem került fájl feltöltésre.", "noFilesUploaded": "Nem került fájl feltöltésre.",
"noMatchedField": "Nem található egyező mező a következőhöz: \"{{label}}\"", "noMatchedField": "Nem található egyező mező a következőhöz: \"{{label}}\"",
"noUser": "Nincs felhasználó", "noUser": "Nincs felhasználó",
"notAllowedToAccessPage": "Ehhez az oldalhoz nem férhet hozzá.", "notAllowedToAccessPage": "Ehhez az oldalhoz nem férhet hozzá.",
"notAllowedToPerformAction": "Ezt a műveletet nem hajthatja végre.", "notAllowedToPerformAction": "Ezt a műveletet nem hajthatja végre.",
"notFound": "A kért erőforrás nem található.", "notFound": "A kért erőforrás nem található.",
"previewing": "Hiba történt a dokumentum előnézetének megtekintése közben.", "previewing": "Hiba történt a dokumentum előnézetének megtekintése közben.",
"problemUploadingFile": "Hiba történt a fájl feltöltése közben.", "problemUploadingFile": "Hiba történt a fájl feltöltése közben.",
"tokenInvalidOrExpired": "A token érvénytelen vagy lejárt.", "tokenInvalidOrExpired": "A token érvénytelen vagy lejárt.",
"unPublishingDocument": "Hiba történt a dokumentum közzétételének visszavonása közben.", "unPublishingDocument": "Hiba történt a dokumentum közzétételének visszavonása közben.",
"unableToDeleteCount": "Nem sikerült törölni {{count}}/{{total}} {{label}}.", "unableToDeleteCount": "Nem sikerült törölni {{count}}/{{total}} {{label}}.",
"unableToUpdateCount": "Nem sikerült frissíteni {{count}}/{{total}} {{label}}.", "unableToUpdateCount": "Nem sikerült frissíteni {{count}}/{{total}} {{label}}.",
"unauthorized": "Jogosulatlan, a kéréshez be kell jelentkeznie.", "unauthorized": "Jogosulatlan, a kéréshez be kell jelentkeznie.",
"unknown": "Ismeretlen hiba történt.", "unknown": "Ismeretlen hiba történt.",
"unspecific": "Hiba történt.", "unspecific": "Hiba történt.",
"userLocked": "Ez a felhasználó túl sok sikertelen bejelentkezési kísérlet miatt zárolva van.", "userLocked": "Ez a felhasználó túl sok sikertelen bejelentkezési kísérlet miatt zárolva van.",
"valueMustBeUnique": "Az értéknek egyedinek kell lennie", "valueMustBeUnique": "Az értéknek egyedinek kell lennie",
"verificationTokenInvalid": "Az ellenőrző token érvénytelen." "verificationTokenInvalid": "Az ellenőrző token érvénytelen."
}, },
"fields": { "fields": {
"addLabel": "{{label}} hozzáadása", "addLabel": "{{label}} hozzáadása",
"addLink": "Link hozzáadása", "addLink": "Link hozzáadása",
"addNew": "Új hozzáadása", "addNew": "Új hozzáadása",
"addNewLabel": "Új {{label}} hozzáadása", "addNewLabel": "Új {{label}} hozzáadása",
"addRelationship": "Kapcsolat hozzáadása", "addRelationship": "Kapcsolat hozzáadása",
"addUpload": "Feltöltés hozzáadása", "addUpload": "Feltöltés hozzáadása",
"block": "blokk", "block": "blokk",
"blockType": "Blokk típusa", "blockType": "Blokk típusa",
"blocks": "blokkok", "blocks": "blokkok",
"chooseBetweenCustomTextOrDocument": "Válasszon egy egyéni szöveges URL-cím megadása vagy egy másik dokumentumra való hivatkozás között.", "chooseBetweenCustomTextOrDocument": "Válasszon egy egyéni szöveges URL-cím megadása vagy egy másik dokumentumra való hivatkozás között.",
"chooseDocumentToLink": "Válassza ki a dokumentumot, amelyre hivatkozni kíván", "chooseDocumentToLink": "Válassza ki a dokumentumot, amelyre hivatkozni kíván",
"chooseFromExisting": "Válasszon a meglévők közül", "chooseFromExisting": "Válasszon a meglévők közül",
"chooseLabel": "Válassza ki a {{label}}", "chooseLabel": "Válassza ki a {{label}}",
"collapseAll": "Mindet összecsuk", "collapseAll": "Mindet összecsuk",
"customURL": "Egyéni URL", "customURL": "Egyéni URL",
"editLabelData": "{{label}} adatok szerkesztése", "editLabelData": "{{label}} adatok szerkesztése",
"editLink": "Link szerkesztése", "editLink": "Link szerkesztése",
"editRelationship": "Kapcsolat hozzáadása", "editRelationship": "Kapcsolat hozzáadása",
"enterURL": "Adjon meg egy URL-t", "enterURL": "Adjon meg egy URL-t",
"internalLink": "Belső link", "internalLink": "Belső link",
"itemsAndMore": "{{items}} és további {{count}}", "itemsAndMore": "{{items}} és további {{count}}",
"labelRelationship": "{{label}} Kapcsolat", "labelRelationship": "{{label}} Kapcsolat",
"latitude": "Szélesség", "latitude": "Szélesség",
"linkType": "Link típusa", "linkType": "Link típusa",
"linkedTo": "Kapcsolódik a <0>{{label}}</0>", "linkedTo": "Kapcsolódik a <0>{{label}}</0>",
"longitude": "Hosszúság", "longitude": "Hosszúság",
"newLabel": "Új {{label}}", "newLabel": "Új {{label}}",
"openInNewTab": "Megnyitás új lapon", "openInNewTab": "Megnyitás új lapon",
"passwordsDoNotMatch": "A jelszavak nem egyeznek.", "passwordsDoNotMatch": "A jelszavak nem egyeznek.",
"relatedDocument": "Kapcsolódó dokumentum", "relatedDocument": "Kapcsolódó dokumentum",
"relationTo": "Kapcsolat a következővel:", "relationTo": "Kapcsolat a következővel:",
"removeRelationship": "Kapcsolat eltávolítása", "removeRelationship": "Kapcsolat eltávolítása",
"removeUpload": "Feltöltés eltávolítása", "removeUpload": "Feltöltés eltávolítása",
"saveChanges": "Módosítások mentése", "saveChanges": "Módosítások mentése",
"searchForBlock": "Blokk keresése", "searchForBlock": "Blokk keresése",
"selectExistingLabel": "Meglévő {{label}} kiválasztása", "selectExistingLabel": "Meglévő {{label}} kiválasztása",
"selectFieldsToEdit": "Válassza ki a szerkeszteni kívánt mezőket", "selectFieldsToEdit": "Válassza ki a szerkeszteni kívánt mezőket",
"showAll": "Az összes megjelenítése", "showAll": "Az összes megjelenítése",
"swapRelationship": "Kapcsolat csere", "swapRelationship": "Kapcsolat csere",
"swapUpload": "Feltöltés csere", "swapUpload": "Feltöltés csere",
"textToDisplay": "Megjelenítendő szöveg", "textToDisplay": "Megjelenítendő szöveg",
"toggleBlock": "Blokk kinyitása", "toggleBlock": "Blokk kinyitása",
"uploadNewLabel": "Új {{label}} feltöltése" "uploadNewLabel": "Új {{label}} feltöltése"
}, },
"general": { "general": {
"aboutToDelete": "A {{label}} <1>{{title}}</1> törlésére készül. Biztos benne?", "aboutToDelete": "A {{label}} <1>{{title}}</1> törlésére készül. Biztos benne?",
"aboutToDeleteCount_many": "Törölni készül {{count}} {{label}}", "aboutToDeleteCount_many": "Törölni készül {{count}} {{label}}",
"aboutToDeleteCount_one": "Törölni készül {{count}} {{label}}", "aboutToDeleteCount_one": "Törölni készül {{count}} {{label}}",
"aboutToDeleteCount_other": "Törölni készül {{count}} {{label}}", "aboutToDeleteCount_other": "Törölni készül {{count}} {{label}}",
"addBelow": "Hozzáadás lent", "addBelow": "Hozzáadás lent",
"addFilter": "Szűrő hozzáadása", "addFilter": "Szűrő hozzáadása",
"adminTheme": "Admin téma", "adminTheme": "Admin téma",
"and": "És", "and": "És",
"ascending": "Növekvő", "ascending": "Növekvő",
"automatic": "Automatikus", "automatic": "Automatikus",
"backToDashboard": "Vissza az irányítópultra", "backToDashboard": "Vissza az irányítópultra",
"cancel": "Mégsem", "cancel": "Mégsem",
"changesNotSaved": "A módosítások nem lettek mentve. Ha most távozik, elveszíti a változtatásokat.", "changesNotSaved": "A módosítások nem lettek mentve. Ha most távozik, elveszíti a változtatásokat.",
"close": "Bezárás", "close": "Bezárás",
"collections": "Gyűjtemények", "collections": "Gyűjtemények",
"columnToSort": "Rendezendő oszlop", "columnToSort": "Rendezendő oszlop",
"columns": "Oszlopok", "columns": "Oszlopok",
"confirm": "Megerősítés", "confirm": "Megerősítés",
"confirmDeletion": "Törlés megerősítése", "confirmDeletion": "Törlés megerősítése",
"confirmDuplication": "Duplikáció megerősítése", "confirmDuplication": "Duplikáció megerősítése",
"copied": "Másolva", "copied": "Másolva",
"copy": "Másolás", "copy": "Másolás",
"create": "Létrehozás", "create": "Létrehozás",
"createNew": "Új létrehozása", "createNew": "Új létrehozása",
"createNewLabel": "Új {{label}} létrehozása", "createNewLabel": "Új {{label}} létrehozása",
"created": "Létrehozva", "created": "Létrehozva",
"createdAt": "Létrehozva:", "createdAt": "Létrehozva:",
"creating": "Létrehozás", "creating": "Létrehozás",
"dark": "Sötét", "dark": "Sötét",
"dashboard": "Irányítópult", "dashboard": "Irányítópult",
"delete": "Törlés", "delete": "Törlés",
"deletedCountSuccessfully": "{{count}} {{label}} sikeresen törölve.", "deletedCountSuccessfully": "{{count}} {{label}} sikeresen törölve.",
"deletedSuccessfully": "Sikeresen törölve.", "deletedSuccessfully": "Sikeresen törölve.",
"deleting": "Törlés...", "deleting": "Törlés...",
"descending": "Csökkenő", "descending": "Csökkenő",
"duplicate": "Duplikálás", "duplicate": "Duplikálás",
"duplicateWithoutSaving": "Duplikálás a módosítások mentése nélkül", "duplicateWithoutSaving": "Duplikálás a módosítások mentése nélkül",
"edit": "Szerkesztés", "edit": "Szerkesztés",
"editLabel": "{{label}} szerkesztése", "editLabel": "{{label}} szerkesztése",
"editing": "Szerkesztés", "editing": "Szerkesztés",
"editingLabel_many": "{{count}} {{label}} szerkesztése", "editingLabel_many": "{{count}} {{label}} szerkesztése",
"editingLabel_one": "{{count}} {{label}} szerkesztése", "editingLabel_one": "{{count}} {{label}} szerkesztése",
"editingLabel_other": "{{count}} {{label}} szerkesztése", "editingLabel_other": "{{count}} {{label}} szerkesztése",
"email": "E-mail", "email": "E-mail",
"emailAddress": "E-mail cím", "emailAddress": "E-mail cím",
"enterAValue": "Adjon meg egy értéket", "enterAValue": "Adjon meg egy értéket",
"fallbackToDefaultLocale": "Visszatérés az alapértelmezett nyelvhez", "fallbackToDefaultLocale": "Visszatérés az alapértelmezett nyelvhez",
"filter": "Szűrő", "filter": "Szűrő",
"filterWhere": "Szűrő {{label}} ahol", "filterWhere": "Szűrő {{label}} ahol",
"filters": "Szűrők", "filters": "Szűrők",
"globals": "Globálisok", "globals": "Globálisok",
"language": "Nyelv", "language": "Nyelv",
"lastModified": "Utoljára módosítva", "lastModified": "Utoljára módosítva",
"leaveAnyway": "Távozás mindenképp", "leaveAnyway": "Távozás mindenképp",
"leaveWithoutSaving": "Távozás mentés nélkül", "leaveWithoutSaving": "Távozás mentés nélkül",
"light": "Világos", "light": "Világos",
"loading": "Betöltés", "loading": "Betöltés",
"locales": "Nyelvek", "locales": "Nyelvek",
"moveDown": "Mozgatás lefelé", "moveDown": "Mozgatás lefelé",
"moveUp": "Mozgatás felfelé", "moveUp": "Mozgatás felfelé",
"newPassword": "Új jelszó", "newPassword": "Új jelszó",
"noFiltersSet": "Nincs beállítva szűrő", "noFiltersSet": "Nincs beállítva szűrő",
"noLabel": "<No {{label}}>", "noLabel": "<No {{label}}>",
"noResults": "Nem találtunk {{label}}. Vagy még nem létezik {{label}}, vagy egyik sem felel meg a fent megadott szűrőknek.", "noResults": "Nem találtunk {{label}}. Vagy még nem létezik {{label}}, vagy egyik sem felel meg a fent megadott szűrőknek.",
"noValue": "Nincs érték", "noValue": "Nincs érték",
"none": "Semmi", "none": "Semmi",
"notFound": "Nem található", "notFound": "Nem található",
"nothingFound": "Nincs találat", "nothingFound": "Nincs találat",
"of": "a", "of": "a",
"or": "Vagy", "or": "Vagy",
"order": "Sorrend", "order": "Sorrend",
"pageNotFound": "Az oldal nem található", "pageNotFound": "Az oldal nem található",
"password": "Jelszó", "password": "Jelszó",
"payloadSettings": "Payload beállítások", "payloadSettings": "Payload beállítások",
"perPage": "Oldalanként: {{limit}}", "perPage": "Oldalanként: {{limit}}",
"remove": "Törlés", "remove": "Törlés",
"row": "Sor", "row": "Sor",
"rows": "Sorok", "rows": "Sorok",
"save": "Mentés", "save": "Mentés",
"saving": "Mentés...", "saving": "Mentés...",
"searchBy": "Keresés a következő szerint: {{label}}", "searchBy": "Keresés a következő szerint: {{label}}",
"selectAll": "Az összes kijelölése: {{count}} {{label}}", "selectAll": "Az összes kijelölése: {{count}} {{label}}",
"selectValue": "Válasszon ki egy értéket", "selectValue": "Válasszon ki egy értéket",
"selectedCount": "{{count}} {{label}} kiválasztva", "selectedCount": "{{count}} {{label}} kiválasztva",
"sorryNotFound": "Sajnáljuk nincs semmi, ami megfelelne a kérésének.", "sorryNotFound": "Sajnáljuk nincs semmi, ami megfelelne a kérésének.",
"sort": "Rendezés", "sort": "Rendezés",
"stayOnThisPage": "Maradjon ezen az oldalon", "stayOnThisPage": "Maradjon ezen az oldalon",
"submissionSuccessful": "Beküldés sikeres.", "submissionSuccessful": "Beküldés sikeres.",
"submit": "Beküldés", "submit": "Beküldés",
"successfullyCreated": "{{label}} sikeresen létrehozva.", "successfullyCreated": "{{label}} sikeresen létrehozva.",
"successfullyDuplicated": "{{label}} sikeresen duplikálódott.", "successfullyDuplicated": "{{label}} sikeresen duplikálódott.",
"thisLanguage": "Magyar", "thisLanguage": "Magyar",
"titleDeleted": "{{label}} \"{{title}}\" sikeresen törölve.", "titleDeleted": "{{label}} \"{{title}}\" sikeresen törölve.",
"unauthorized": "Jogosulatlan", "unauthorized": "Jogosulatlan",
"unsavedChangesDuplicate": "Nem mentett módosításai vannak. Szeretné folytatni a duplikációt?", "unsavedChangesDuplicate": "Nem mentett módosításai vannak. Szeretné folytatni a duplikációt?",
"untitled": "Névtelen", "untitled": "Névtelen",
"updatedAt": "Frissítve:", "updatedAt": "Frissítve:",
"updatedCountSuccessfully": "{{count}} {{label}} sikeresen frissítve.", "updatedCountSuccessfully": "{{count}} {{label}} sikeresen frissítve.",
"updatedSuccessfully": "Sikeresen frissítve.", "updatedSuccessfully": "Sikeresen frissítve.",
"updating": "Frissítés", "updating": "Frissítés",
"uploading": "Feltöltés", "uploading": "Feltöltés",
"user": "Felhasználó", "user": "Felhasználó",
"users": "Felhasználók", "users": "Felhasználók",
"welcome": "Üdvözöljük" "value": "Érték",
}, "welcome": "Üdvözöljük"
"operators": { },
"equals": "egyenlő", "operators": {
"isNotEqualTo": "nem egyenlő", "equals": "egyenlő",
"isIn": "benne van", "isNotEqualTo": "nem egyenlő",
"isNotIn": "nincs benne", "isIn": "benne van",
"exists": "létezik", "isNotIn": "nincs benne",
"isGreaterThan": "nagyobb, mint", "exists": "létezik",
"isLessThan": "kisebb, mint", "isGreaterThan": "nagyobb, mint",
"isLessThanOrEqualTo": "kisebb vagy egyenlő, mint", "isLessThan": "kisebb, mint",
"isGreaterThanOrEqualTo": "nagyobb vagy egyenlő, mint", "isLessThanOrEqualTo": "kisebb vagy egyenlő, mint",
"near": "közel", "isGreaterThanOrEqualTo": "nagyobb vagy egyenlő, mint",
"isLike": "olyan, mint", "near": "közel",
"contains": "tartalmaz" "isLike": "olyan, mint",
}, "contains": "tartalmaz"
"upload": { },
"dragAndDropHere": "vagy húzzon ide egy fájlt", "upload": {
"fileName": "Fájlnév", "dragAndDropHere": "vagy húzzon ide egy fájlt",
"fileSize": "Fájl mérete", "fileName": "Fájlnév",
"height": "Magasság", "fileSize": "Fájl mérete",
"lessInfo": "Kevesebb információ", "height": "Magasság",
"moreInfo": "További információ", "lessInfo": "Kevesebb információ",
"selectCollectionToBrowse": "Válassza ki a böngészni kívánt gyűjteményt", "moreInfo": "További információ",
"selectFile": "Válasszon ki egy fájlt", "selectCollectionToBrowse": "Válassza ki a böngészni kívánt gyűjteményt",
"dragAndDrop": "Húzzon ide egy fájlt", "selectFile": "Válasszon ki egy fájlt",
"sizes": "Méretek", "dragAndDrop": "Húzzon ide egy fájlt",
"width": "Szélesség" "sizes": "Méretek",
}, "width": "Szélesség"
"validation": { },
"emailAddress": "Kérjük, adjon meg egy érvényes e-mail címet.", "validation": {
"enterNumber": "Kérjük, adjon meg egy érvényes számot.", "emailAddress": "Kérjük, adjon meg egy érvényes e-mail címet.",
"fieldHasNo": "Ennek a mezőnek nincs {{label}}", "enterNumber": "Kérjük, adjon meg egy érvényes számot.",
"greaterThanMax": "\"{{value}}\" nagyobb, mint a megengedett maximális érték {{max}}.", "fieldHasNo": "Ennek a mezőnek nincs {{label}}",
"invalidInput": "Ez a mező érvénytelen értéket tartalmaz.", "greaterThanMax": "{{value}} nagyobb, mint a megengedett maximum {{label}} érték, ami {{max}}.",
"invalidSelection": "Ez a mező érvénytelen kijelöléssel rendelkezik.", "invalidInput": "Ez a mező érvénytelen értéket tartalmaz.",
"invalidSelections": "Ez a mező a következő érvénytelen kijelöléseket tartalmazza:", "invalidSelection": "Ez a mező érvénytelen kijelöléssel rendelkezik.",
"lessThanMin": "\"{{value}}\" kisebb, mint a megengedett minimális érték {{min}}.", "invalidSelections": "Ez a mező a következő érvénytelen kijelöléseket tartalmazza:",
"longerThanMin": "Ennek az értéknek hosszabbnak kell lennie, mint a minimális {{minLength}} karakter hosszúság.", "lessThanMin": "{{value}} kisebb, mint a megengedett minimum {{label}} érték, ami {{min}}.",
"notValidDate": "\" {{value}} \" nem érvényes dátum.", "longerThanMin": "Ennek az értéknek hosszabbnak kell lennie, mint a minimális {{minLength}} karakter hosszúság.",
"required": "Ez a mező kötelező.", "notValidDate": "\" {{value}} \" nem érvényes dátum.",
"requiresAtLeast": "Ehhez a mezőhöz legalább {{count}} {{label}} szükséges.", "required": "Ez a mező kötelező.",
"requiresNoMoreThan": "Ehhez a mezőhöz legfeljebb {{count}} {{label}} szükséges.", "requiresAtLeast": "Ehhez a mezőhöz legalább {{count}} {{label}} szükséges.",
"requiresTwoNumbers": "Ehhez a mezőhöz két szám szükséges.", "requiresNoMoreThan": "Ehhez a mezőhöz legfeljebb {{count}} {{label}} szükséges.",
"shorterThanMax": "Ennek az értéknek rövidebbnek kell lennie, mint a maximálisan megengedett {{maxLength}} karakter.", "requiresTwoNumbers": "Ehhez a mezőhöz két szám szükséges.",
"trueOrFalse": "Ez a mező csak igaz vagy hamis lehet.", "shorterThanMax": "Ennek az értéknek rövidebbnek kell lennie, mint a maximálisan megengedett {{maxLength}} karakter.",
"validUploadID": "Ez a mező nem érvényes feltöltési azonosító." "trueOrFalse": "Ez a mező csak igaz vagy hamis lehet.",
}, "validUploadID": "Ez a mező nem érvényes feltöltési azonosító."
"version": { },
"aboutToPublishSelection": "Arra készül, hogy az összes {{label}} elemet közzétegye a kijelölésben. biztos vagy ebben?", "version": {
"aboutToRestore": "Arra készül, hogy visszaállítsa ezt a {{label}} dokumentumot arra az állapotra, amelyben {{versionDate}} napon volt.", "aboutToPublishSelection": "Arra készül, hogy az összes {{label}} elemet közzétegye a kijelölésben. biztos vagy ebben?",
"aboutToRestoreGlobal": "Arra készül, hogy visszaállítsa a {{label}} arra az állapotra, amelyben {{versionDate}} napon volt.", "aboutToRestore": "Arra készül, hogy visszaállítsa ezt a {{label}} dokumentumot arra az állapotra, amelyben {{versionDate}} napon volt.",
"aboutToRevertToPublished": "Arra készül, hogy visszaállítsa a dokumentum módosításait a közzétett állapotába. Biztos benne?", "aboutToRestoreGlobal": "Arra készül, hogy visszaállítsa a {{label}} arra az állapotra, amelyben {{versionDate}} napon volt.",
"aboutToUnpublish": "A dokumentum közzételének visszavonására készül. Biztos benne?", "aboutToRevertToPublished": "Arra készül, hogy visszaállítsa a dokumentum módosításait a közzétett állapotába. Biztos benne?",
"aboutToUnpublishSelection": "Arra készül, hogy visszavonja a kijelölésben szereplő összes {{label}} közzétételét. biztos vagy ebben?", "aboutToUnpublish": "A dokumentum közzétételének visszavonására készül. Biztos benne?",
"autosave": "Automatikus mentés", "aboutToUnpublishSelection": "Arra készül, hogy visszavonja a kijelölésben szereplő összes {{label}} közzétételét. biztos vagy ebben?",
"autosavedSuccessfully": "Automatikus mentés sikeres.", "autosave": "Automatikus mentés",
"autosavedVersion": "Automatikusan mentett verzió", "autosavedSuccessfully": "Automatikus mentés sikeres.",
"changed": "Megváltozott", "autosavedVersion": "Automatikusan mentett verzió",
"compareVersion": "Hasonlítsa össze a verziót a következőkkel:", "changed": "Megváltozott",
"confirmPublish": "A közzététel megerősítése", "compareVersion": "Hasonlítsa össze a verziót a következőkkel:",
"confirmRevertToSaved": "Erősítse meg a mentett verzióra való visszatérést", "confirmPublish": "A közzététel megerősítése",
"confirmUnpublish": "A közzététel visszavonásának megerősítése", "confirmRevertToSaved": "Erősítse meg a mentett verzióra való visszatérést",
"confirmVersionRestoration": "Verzió-visszaállítás megerősítése", "confirmUnpublish": "A közzététel visszavonásának megerősítése",
"currentDocumentStatus": "Jelenlegi {{docStatus}} dokumentum", "confirmVersionRestoration": "Verzió-visszaállítás megerősítése",
"draft": "Piszkozat", "currentDocumentStatus": "Jelenlegi {{docStatus}} dokumentum",
"draftSavedSuccessfully": "A piszkozat sikeresen mentve.", "draft": "Piszkozat",
"lastSavedAgo": "Utoljára mentve {{distance, relativetime(minutes)}}", "draftSavedSuccessfully": "A piszkozat sikeresen mentve.",
"noFurtherVersionsFound": "További verziók nem találhatók", "lastSavedAgo": "Utoljára mentve {{distance, relativetime(minutes)}}",
"noRowsFound": "Nem található {{label}}", "noFurtherVersionsFound": "További verziók nem találhatók",
"preview": "Előnézet", "noRowsFound": "Nem található {{label}}",
"problemRestoringVersion": "Hiba történt a verzió visszaállításakor", "preview": "Előnézet",
"publish": "Közzététel", "problemRestoringVersion": "Hiba történt a verzió visszaállításakor",
"publishChanges": "Módosítások közzététele", "publish": "Közzététel",
"published": "Közzétett", "publishChanges": "Módosítások közzététele",
"restoreThisVersion": "A verzió visszaállítása", "published": "Közzétett",
"restoredSuccessfully": "Sikeresen visszaállítva.", "restoreThisVersion": "A verzió visszaállítása",
"restoring": "Visszaállítás...", "restoredSuccessfully": "Sikeresen visszaállítva.",
"revertToPublished": "Visszatérés a közzétetthez", "restoring": "Visszaállítás...",
"reverting": "Visszaállítás...", "revertToPublished": "Visszatérés a közzétetthez",
"saveDraft": "Piszkozat mentése", "reverting": "Visszaállítás...",
"selectLocales": "Megjelenítendő nyelvek kiválasztása", "saveDraft": "Piszkozat mentése",
"selectVersionToCompare": "Válassza ki az összehasonlítani kínt verziót", "selectLocales": "Megjelenítendő nyelvek kilasztása",
"showLocales": "Nyelvek megjelenítése:", "selectVersionToCompare": "Válassza ki az összehasonlítani kívánt verziót",
"showingVersionsFor": "Verziók megjelenítése a következőkhöz:", "showLocales": "Nyelvek megjelenítése:",
"status": "Állapot", "showingVersionsFor": "Verziók megjelenítése a következőkhöz:",
"type": "Típus", "status": "Állapot",
"unpublish": "Közzététel visszavonása", "type": "Típus",
"unpublishing": "Közzététel visszavonása...", "unpublish": "Közzététel visszavonása",
"version": "Verzió", "unpublishing": "Közzététel visszavonása...",
"versionCount_many": "{{count}} verzió található", "version": "Verzió",
"versionCount_none": "Nem található verzió", "versionCount_many": "{{count}} verzió található",
"versionCount_one": "{{count}} verzió található", "versionCount_none": "Nem található verzió",
"versionCount_other": "{{count}} verzió található", "versionCount_one": "{{count}} verzió található",
"versionCreatedOn": "{{version}} létrehozva:", "versionCount_other": "{{count}} verzió található",
"versionID": "Verzióazonosító", "versionCreatedOn": "{{version}} létrehozva:",
"versions": "Verziók", "versionID": "Verzióazonosító",
"viewingVersion": "A(z) {{entityLabel}} {{documentTitle}} verziójának megtekintése", "versions": "Verziók",
"viewingVersionGlobal": "A globális {{entityLabel}} verziójának megtekintése", "viewingVersion": "A(z) {{entityLabel}} {{documentTitle}} verziójának megtekintése",
"viewingVersions": "A {{entityLabel}} {{documentTitle}} verzióinak megtekintése", "viewingVersionGlobal": "A globális {{entityLabel}} verziónak megtekintése",
"viewingVersionsGlobal": "A globális {{entityLabel}} verzióinak megtekintése" "viewingVersions": "A {{entityLabel}} {{documentTitle}} verzióinak megtekintése",
} "viewingVersionsGlobal": "A globális {{entityLabel}} verzióinak megtekintése"
}
} }

View File

@@ -241,6 +241,7 @@
"uploading": "Caricamento", "uploading": "Caricamento",
"user": "Utente", "user": "Utente",
"users": "Utenti", "users": "Utenti",
"value": "Valore",
"welcome": "Benvenuto" "welcome": "Benvenuto"
}, },
"operators": { "operators": {
@@ -274,11 +275,11 @@
"emailAddress": "Si prega di inserire un indirizzo email valido.", "emailAddress": "Si prega di inserire un indirizzo email valido.",
"enterNumber": "Si prega di inserire un numero valido.", "enterNumber": "Si prega di inserire un numero valido.",
"fieldHasNo": "Questo campo non ha {{label}}", "fieldHasNo": "Questo campo non ha {{label}}",
"greaterThanMax": "\"{{value}}\" è maggiore del valore massimo consentito di {{max}}.", "greaterThanMax": "{{value}} è superiore al massimo consentito {{label}} di {{max}}.",
"invalidInput": "Questo campo ha un input non valido.", "invalidInput": "Questo campo ha un input non valido.",
"invalidSelection": "Questo campo ha una selezione non valida.", "invalidSelection": "Questo campo ha una selezione non valida.",
"invalidSelections": "'In questo campo sono presenti le seguenti selezioni non valide:'", "invalidSelections": "'In questo campo sono presenti le seguenti selezioni non valide:'",
"lessThanMin": "\"{{value}}\" è inferiore al valore minimo consentito di {{min}}.", "lessThanMin": "{{value}} è inferiore al minimo consentito {{label}} di {{min}}.",
"longerThanMin": "Questo valore deve essere più lungo della lunghezza minima di {{minLength}} caratteri.", "longerThanMin": "Questo valore deve essere più lungo della lunghezza minima di {{minLength}} caratteri.",
"notValidDate": "\"{{value}}\" non è una data valida.", "notValidDate": "\"{{value}}\" non è una data valida.",
"required": "Questo campo è obbligatorio.", "required": "Questo campo è obbligatorio.",

View File

@@ -230,6 +230,7 @@
"uploading": "アップロード中", "uploading": "アップロード中",
"user": "ユーザー", "user": "ユーザー",
"users": "ユーザー", "users": "ユーザー",
"value": "値",
"welcome": "ようこそ" "welcome": "ようこそ"
}, },
"operators": { "operators": {
@@ -263,11 +264,11 @@
"emailAddress": "有効なメールアドレスを入力してください。", "emailAddress": "有効なメールアドレスを入力してください。",
"enterNumber": "有効な数値を入力してください。", "enterNumber": "有効な数値を入力してください。",
"fieldHasNo": "{{label}} が必要です。", "fieldHasNo": "{{label}} が必要です。",
"greaterThanMax": "\"{{value}}\" ではなく、{{max}} 以下の値にする必要があります。", "greaterThanMax": "{{value}}は許容最大{{label}}の{{max}}を超えています。",
"invalidInput": "無効な入力値です。", "invalidInput": "無効な入力値です。",
"invalidSelection": "無効な選択です。", "invalidSelection": "無効な選択です。",
"invalidSelections": "次の無効な選択があります: ", "invalidSelections": "次の無効な選択があります: ",
"lessThanMin": "\"{{value}}\" ではなく、{{min}} 以上の値にする必要があります。", "lessThanMin": "{{value}}は許容最小{{label}}の{{min}}未満です。",
"longerThanMin": "{{minLength}} 文字以上にする必要があります。", "longerThanMin": "{{minLength}} 文字以上にする必要があります。",
"notValidDate": "\"{{value}}\" は有効な日付ではありません。", "notValidDate": "\"{{value}}\" は有効な日付ではありません。",
"required": "必須フィールドです。", "required": "必須フィールドです。",

View File

@@ -241,6 +241,7 @@
"uploading": "တင်ပေးနေသည်", "uploading": "တင်ပေးနေသည်",
"user": "အသုံးပြုသူ", "user": "အသုံးပြုသူ",
"users": "အသုံးပြုသူများ", "users": "အသုံးပြုသူများ",
"value": "တန်ဖိုး",
"welcome": "ကြိုဆိုပါတယ်။" "welcome": "ကြိုဆိုပါတယ်။"
}, },
"operators": { "operators": {
@@ -274,11 +275,11 @@
"emailAddress": "မှန်ကန်သော အီးမေးလ်လိပ်စာကို ထည့်သွင်းပါ။", "emailAddress": "မှန်ကန်သော အီးမေးလ်လိပ်စာကို ထည့်သွင်းပါ။",
"enterNumber": "မှန်ကန်သောနံပါတ်တစ်ခုထည့်ပါ။", "enterNumber": "မှန်ကန်သောနံပါတ်တစ်ခုထည့်ပါ။",
"fieldHasNo": "ဤအကွက်တွင် {{label}} မရှိပါ။", "fieldHasNo": "ဤအကွက်တွင် {{label}} မရှိပါ။",
"greaterThanMax": "\"{{value}}\" သည် {{max}} အများဆုံးခွင့်ပြုထားသော တန်ဖိုးထက် ကြီးသည်။", "greaterThanMax": "{{value}} သည် {{max}} ထက် ပိုမိုကြီးသည်။ ဤသည်ဖြင့် {{label}} အများဆုံးခွင့်ပြုထားသော တန်ဖိုးထက် ကြီးသည်။",
"invalidInput": "ဤအကွက်တွင် မမှန်ကန်သော ထည့်သွင်းမှုတစ်ခုရှိသည်။", "invalidInput": "ဤအကွက်တွင် မမှန်ကန်သော ထည့်သွင်းမှုတစ်ခုရှိသည်။",
"invalidSelection": "ဤအကွက်တွင် မမှန်ကန်သော ရွေးချယ်မှုတစ်ခုရှိသည်။", "invalidSelection": "ဤအကွက်တွင် မမှန်ကန်သော ရွေးချယ်မှုတစ်ခုရှိသည်။",
"invalidSelections": "ဤအကွက်တွင် အောက်ပါ မမှန်ကန်သော ရွေးချယ်မှုများ ရှိသည်", "invalidSelections": "ဤအကွက်တွင် အောက်ပါ မမှန်ကန်သော ရွေးချယ်မှုများ ရှိသည်",
"lessThanMin": "\"{{value}}\" သည် {{min}} အနည်းဆုံးခွင့်ပြုထားသော တန်ဖိုးထက်နည်းသည်။", "lessThanMin": "{{value}} သည် {{min}} ထက် ပိုမိုနိမ့်သည်။ ဤသည်ဖြင့် {{label}} အနည်းဆုံးခွင့်ပြုထားသော တန်ဖိုးထက် နိမ့်သည်။",
"longerThanMin": "ဤတန်ဖိုးသည် အနိမ့်ဆုံးအရှည် {{minLength}} စာလုံးထက် ပိုရှည်ရမည်။", "longerThanMin": "ဤတန်ဖိုးသည် အနိမ့်ဆုံးအရှည် {{minLength}} စာလုံးထက် ပိုရှည်ရမည်။",
"notValidDate": "\"{{value}}\" သည် တရားဝင်ရက်စွဲမဟုတ်ပါ။", "notValidDate": "\"{{value}}\" သည် တရားဝင်ရက်စွဲမဟုတ်ပါ။",
"required": "ဤအကွက်ကို လိုအပ်သည်။", "required": "ဤအကွက်ကို လိုအပ်သည်။",

View File

@@ -241,6 +241,7 @@
"uploading": "Opplasting", "uploading": "Opplasting",
"user": "Bruker", "user": "Bruker",
"users": "Brukere", "users": "Brukere",
"value": "Verdi",
"welcome": "Velkommen" "welcome": "Velkommen"
}, },
"operators": { "operators": {
@@ -274,11 +275,11 @@
"emailAddress": "Vennligst skriv inn en gyldig e-postadresse.", "emailAddress": "Vennligst skriv inn en gyldig e-postadresse.",
"enterNumber": "Vennligst skriv inn et gyldig tall.", "enterNumber": "Vennligst skriv inn et gyldig tall.",
"fieldHasNo": "Dette feltet har ingen {{label}}", "fieldHasNo": "Dette feltet har ingen {{label}}",
"greaterThanMax": "\"{{value}}\" er større enn det maksimale tillatte verdien av {{max}}.", "greaterThanMax": "{{value}} er større enn den tillatte maksimale {{label}} på {{max}}.",
"invalidInput": "Dette feltet har en ugyldig inndata.", "invalidInput": "Dette feltet har en ugyldig inndata.",
"invalidSelection": "Dette feltet har en ugyldig utvalg.", "invalidSelection": "Dette feltet har en ugyldig utvalg.",
"invalidSelections": "Dette feltet har følgende ugyldige utvalg:", "invalidSelections": "Dette feltet har følgende ugyldige utvalg:",
"lessThanMin": "\"{{value}}\" er mindre enn det minste tillatte verdien av {{min}}.", "lessThanMin": "{{value}} er mindre enn den tillatte minimale {{label}} på {{min}}.",
"longerThanMin": "Denne verdien må være lengre enn minimumslengden på {{minLength}} tegn.", "longerThanMin": "Denne verdien må være lengre enn minimumslengden på {{minLength}} tegn.",
"notValidDate": "\"{{value}}\" er ikke en gyldig dato.", "notValidDate": "\"{{value}}\" er ikke en gyldig dato.",
"required": "Dette feltet er påkrevd.", "required": "Dette feltet er påkrevd.",

View File

@@ -241,6 +241,7 @@
"uploading": "Uploaden", "uploading": "Uploaden",
"user": "Gebruiker", "user": "Gebruiker",
"users": "Gebruikers", "users": "Gebruikers",
"value": "Waarde",
"welcome": "Welkom" "welcome": "Welkom"
}, },
"operators": { "operators": {
@@ -274,11 +275,11 @@
"emailAddress": "Voer een geldig e-mailadres in.", "emailAddress": "Voer een geldig e-mailadres in.",
"enterNumber": "Voer een geldig nummer in.", "enterNumber": "Voer een geldig nummer in.",
"fieldHasNo": "Dit veld heeft geen {{label}}", "fieldHasNo": "Dit veld heeft geen {{label}}",
"greaterThanMax": "\"{{value}}\" is groter dan de maximaal toegestane waarde van {{max}}.", "greaterThanMax": "{{value}} is groter dan de maximaal toegestane {{label}} van {{max}}.",
"invalidInput": "Dit veld heeft een ongeldige invoer.", "invalidInput": "Dit veld heeft een ongeldige invoer.",
"invalidSelection": "Dit veld heeft een ongeldige selectie.", "invalidSelection": "Dit veld heeft een ongeldige selectie.",
"invalidSelections": "Dit veld heeft de volgende ongeldige selecties:", "invalidSelections": "Dit veld heeft de volgende ongeldige selecties:",
"lessThanMin": "\"{{value}}\" is kleiner dan de minimaal toegestande waarde van {{min}}.", "lessThanMin": "{{value}} is kleiner dan de minimaal toegestane {{label}} van {{min}}.",
"longerThanMin": "Deze waarde moet langer zijn dan de minimale lengte van {{minLength}} tekens.", "longerThanMin": "Deze waarde moet langer zijn dan de minimale lengte van {{minLength}} tekens.",
"notValidDate": "\"{{value}}\" is geen geldige datum.", "notValidDate": "\"{{value}}\" is geen geldige datum.",
"required": "Dit veld is verplicht.", "required": "Dit veld is verplicht.",

View File

@@ -241,6 +241,7 @@
"uploading": "Wgrywanie", "uploading": "Wgrywanie",
"user": "użytkownik", "user": "użytkownik",
"users": "użytkownicy", "users": "użytkownicy",
"value": "Wartość",
"welcome": "Witaj" "welcome": "Witaj"
}, },
"operators": { "operators": {
@@ -274,11 +275,11 @@
"emailAddress": "Wprowadź poprawny adres email.", "emailAddress": "Wprowadź poprawny adres email.",
"enterNumber": "Wprowadź poprawny numer telefonu.", "enterNumber": "Wprowadź poprawny numer telefonu.",
"fieldHasNo": "To pole nie posiada {{label}}", "fieldHasNo": "To pole nie posiada {{label}}",
"greaterThanMax": "Wartość \"{{value}}\" przekracza maksymalną, dozwoloną liczbę {{max}} znaków.", "greaterThanMax": "{{value}} jest większe niż maksymalnie dozwolony {{label}} wynoszący {{max}}.",
"invalidInput": "To pole zawiera nieprawidłowe dane.", "invalidInput": "To pole zawiera nieprawidłowe dane.",
"invalidSelection": "To pole ma nieprawidłowy wybór.", "invalidSelection": "To pole ma nieprawidłowy wybór.",
"invalidSelections": "To pole zawiera następujące, nieprawidłowe wybory:", "invalidSelections": "To pole zawiera następujące, nieprawidłowe wybory:",
"lessThanMin": "Wartość \"{{value}}\" jest mniejsza niż dozwolona, minimalna wartość: {{min}}.", "lessThanMin": "{{value}} jest mniejsze niż minimalnie dozwolony {{label}} wynoszący {{min}}.",
"longerThanMin": "Ta wartość musi być dłuższa niż minimalna długość znaków: {{minLength}}.", "longerThanMin": "Ta wartość musi być dłuższa niż minimalna długość znaków: {{minLength}}.",
"notValidDate": "\"{{value}}\" nie jest prawidłową datą.", "notValidDate": "\"{{value}}\" nie jest prawidłową datą.",
"required": "To pole jest wymagane.", "required": "To pole jest wymagane.",

View File

@@ -241,6 +241,7 @@
"uploading": "Fazendo upload", "uploading": "Fazendo upload",
"user": "usuário", "user": "usuário",
"users": "usuários", "users": "usuários",
"value": "Valor",
"welcome": "Boas vindas" "welcome": "Boas vindas"
}, },
"operators": { "operators": {
@@ -274,11 +275,11 @@
"emailAddress": "Por favor, insira um endereço de email válido.", "emailAddress": "Por favor, insira um endereço de email válido.",
"enterNumber": "Por favor, insira um número válido.", "enterNumber": "Por favor, insira um número válido.",
"fieldHasNo": "Esse campo não contém {{label}}", "fieldHasNo": "Esse campo não contém {{label}}",
"greaterThanMax": "\"{{value}}\" é maior do que o valor máximo permitido de {{max}}.", "greaterThanMax": "{{value}} é maior que o máximo permitido de {{label}} que é {{max}}.",
"invalidInput": "Esse campo tem um conteúdo inválido.", "invalidInput": "Esse campo tem um conteúdo inválido.",
"invalidSelection": "Esse campo tem uma seleção inválida.", "invalidSelection": "Esse campo tem uma seleção inválida.",
"invalidSelections": "'Esse campo tem as seguintes seleções inválidas:'", "invalidSelections": "'Esse campo tem as seguintes seleções inválidas:'",
"lessThanMin": "\"{{value}}\" é menor do que o valor mínimo permitido de {{min}}.", "lessThanMin": "{{value}} é menor que o mínimo permitido de {{label}} que é {{min}}.",
"longerThanMin": "Esse valor deve ser maior do que o mínimo de {{minLength}} characters.", "longerThanMin": "Esse valor deve ser maior do que o mínimo de {{minLength}} characters.",
"notValidDate": "\"{{value}}\" não é uma data válida.", "notValidDate": "\"{{value}}\" não é uma data válida.",
"required": "Esse campo é obrigatório.", "required": "Esse campo é obrigatório.",

View File

@@ -241,6 +241,7 @@
"uploading": "Încărcare", "uploading": "Încărcare",
"user": "Utilizator", "user": "Utilizator",
"users": "Utilizatori", "users": "Utilizatori",
"value": "Valoare",
"welcome": "Bine ați venit" "welcome": "Bine ați venit"
}, },
"operators": { "operators": {
@@ -274,11 +275,11 @@
"emailAddress": "Vă rugăm să introduceți o adresă de email validă.", "emailAddress": "Vă rugăm să introduceți o adresă de email validă.",
"enterNumber": "Vă rugăm să introduceți un număr valid.", "enterNumber": "Vă rugăm să introduceți un număr valid.",
"fieldHasNo": "Acest câmp nu are un {{label}}", "fieldHasNo": "Acest câmp nu are un {{label}}",
"greaterThanMax": "\"{{value}}\" este mai mare decât valoarea maximă permisă de {{max}}.", "greaterThanMax": "{{value}} este mai mare decât valoarea maximă permisă pentru {{label}} de {{max}}.",
"invalidInput": "Acest câmp are o intrare invalidă.", "invalidInput": "Acest câmp are o intrare invalidă.",
"invalidSelection": "Acest câmp are o selecție invalidă.", "invalidSelection": "Acest câmp are o selecție invalidă.",
"invalidSelections": "Acest câmp are următoarele selecții invalide:", "invalidSelections": "Acest câmp are următoarele selecții invalide:",
"lessThanMin": "\"{{value}}\" este mai mică decât valoarea minimă permisă de {{min}}.", "lessThanMin": "{{value}} este mai mic decât valoarea minimă permisă pentru {{label}} de {{min}}.",
"longerThanMin": "Această valoare trebuie să fie mai mare decât lungimea minimă de {{minLength}} caractere.", "longerThanMin": "Această valoare trebuie să fie mai mare decât lungimea minimă de {{minLength}} caractere.",
"notValidDate": "\"{{value}}\" nu este o dată valabilă.", "notValidDate": "\"{{value}}\" nu este o dată valabilă.",
"required": "Acest câmp este obligatoriu.", "required": "Acest câmp este obligatoriu.",

View File

@@ -241,6 +241,7 @@
"uploading": "Загрузка", "uploading": "Загрузка",
"user": "пользователь", "user": "пользователь",
"users": "пользователи", "users": "пользователи",
"value": "Значение",
"welcome": "Добро пожаловать" "welcome": "Добро пожаловать"
}, },
"operators": { "operators": {
@@ -274,11 +275,11 @@
"emailAddress": "Пожалуйста, введите корректный адрес email.", "emailAddress": "Пожалуйста, введите корректный адрес email.",
"enterNumber": "Пожалуйста, введите корректный номер.", "enterNumber": "Пожалуйста, введите корректный номер.",
"fieldHasNo": "У этого поля нет {{label}}", "fieldHasNo": "У этого поля нет {{label}}",
"greaterThanMax": "\"{{value}}\" больше максимально допустимого значения {{max}}.", "greaterThanMax": "{{value}} больше максимально допустимого значения {{label}} {{max}}.",
"invalidInput": "Это поле имеет недопустимое значение.", "invalidInput": "Это поле имеет недопустимое значение.",
"invalidSelection": "В этом поле выбран недопустимый вариант.", "invalidSelection": "В этом поле выбран недопустимый вариант.",
"invalidSelections": "'Это поле содержит следующие неправильные варианты:'", "invalidSelections": "'Это поле содержит следующие неправильные варианты:'",
"lessThanMin": "\"{{value}}\" меньше минимально допустимого значения {{min}}.", "lessThanMin": "{{value}} меньше минимально допустимого значения {{label}} {{min}}.",
"longerThanMin": "Это значение должно быть больше минимальной длины символов: {{minLength}}.", "longerThanMin": "Это значение должно быть больше минимальной длины символов: {{minLength}}.",
"notValidDate": "\"{{value}}\" это не действительная дата.", "notValidDate": "\"{{value}}\" это не действительная дата.",
"required": "Это обязательное поле.", "required": "Это обязательное поле.",

View File

@@ -241,6 +241,7 @@
"uploading": "Uppladdning", "uploading": "Uppladdning",
"user": "Användare", "user": "Användare",
"users": "Användare", "users": "Användare",
"value": "Värde",
"welcome": "Välkommen" "welcome": "Välkommen"
}, },
"operators": { "operators": {
@@ -274,11 +275,11 @@
"emailAddress": "Vänligen ange en giltig e-postadress.", "emailAddress": "Vänligen ange en giltig e-postadress.",
"enterNumber": "Vänligen skriv in ett giltigt nummer.", "enterNumber": "Vänligen skriv in ett giltigt nummer.",
"fieldHasNo": "Detta fält har ingen {{label}}", "fieldHasNo": "Detta fält har ingen {{label}}",
"greaterThanMax": "\"{{value}}\" är större än det högsta tillåtna värdet på {{max}}.", "greaterThanMax": "{{value}} är större än den maximalt tillåtna {{label}} av {{max}}.",
"invalidInput": "Det här fältet har en ogiltig inmatning.", "invalidInput": "Det här fältet har en ogiltig inmatning.",
"invalidSelection": "Det här fältet har ett ogiltigt urval.", "invalidSelection": "Det här fältet har ett ogiltigt urval.",
"invalidSelections": "Det här fältet har följande ogiltiga val:", "invalidSelections": "Det här fältet har följande ogiltiga val:",
"lessThanMin": "\"{{value}}\" är mindre än det lägsta tillåtna värdet på {{min}}.", "lessThanMin": "{{value}} är mindre än den minst tillåtna {{label}} av {{min}}.",
"longerThanMin": "Detta värde måste vara längre än minimilängden på {{minLength}} tecken.", "longerThanMin": "Detta värde måste vara längre än minimilängden på {{minLength}} tecken.",
"notValidDate": "\"{{value}}\" är inte ett giltigt datum.", "notValidDate": "\"{{value}}\" är inte ett giltigt datum.",
"required": "Detta fält är obligatoriskt.", "required": "Detta fält är obligatoriskt.",

View File

@@ -241,6 +241,7 @@
"uploading": "กำลังอัปโหลด", "uploading": "กำลังอัปโหลด",
"user": "ผู้ใช้", "user": "ผู้ใช้",
"users": "ผู้ใช้", "users": "ผู้ใช้",
"value": "ค่า",
"welcome": "ยินดีต้อนรับ" "welcome": "ยินดีต้อนรับ"
}, },
"operators": { "operators": {
@@ -274,11 +275,11 @@
"emailAddress": "กรุณาระบุอีเมลที่ถูกต้อง", "emailAddress": "กรุณาระบุอีเมลที่ถูกต้อง",
"enterNumber": "กรุณาระบุตัวเลขที่ถูกต้อง", "enterNumber": "กรุณาระบุตัวเลขที่ถูกต้อง",
"fieldHasNo": "ช่องนี้ไม่มี {{label}}", "fieldHasNo": "ช่องนี้ไม่มี {{label}}",
"greaterThanMax": "\"{{value}}\" มีค่ามากกว่าค่าสูงสุดที่กำหนดคือ {{max}}", "greaterThanMax": "{{value}} มากกว่าค่าสูงสุดที่อนุญาตของ {{label}} ซึ่งคือ {{max}}.",
"invalidInput": "ข้อมูลไม่ถูกต้อง", "invalidInput": "ข้อมูลไม่ถูกต้อง",
"invalidSelection": "ค่าที่เลือกไม่ถูกต้อง", "invalidSelection": "ค่าที่เลือกไม่ถูกต้อง",
"invalidSelections": "ค่าที่เลือกไม่ถูกต้องดังนี้:", "invalidSelections": "ค่าที่เลือกไม่ถูกต้องดังนี้:",
"lessThanMin": "\"{{value}}\" มีค่าน้อยกว่าค่าต่ำสุดที่กำหนดคือ {{min}}", "lessThanMin": "{{value}} น้อยกว่าค่าต่ำสุดที่อนุญาตของ {{label}} ซึ่งคือ {{min}}.",
"longerThanMin": "ค่าต้องมีความยาวมากกว่า {{minLength}} ตัวอักษร", "longerThanMin": "ค่าต้องมีความยาวมากกว่า {{minLength}} ตัวอักษร",
"notValidDate": "วันที่ \"{{value}}\" ไม่ถูกต้อง", "notValidDate": "วันที่ \"{{value}}\" ไม่ถูกต้อง",
"required": "จำเป็นต้องระบุค่า", "required": "จำเป็นต้องระบุค่า",

View File

@@ -241,6 +241,7 @@
"uploading": "Yükleniyor", "uploading": "Yükleniyor",
"user": "kullanıcı", "user": "kullanıcı",
"users": "kullanıcı", "users": "kullanıcı",
"value": "Değer",
"welcome": "Hoşgeldiniz" "welcome": "Hoşgeldiniz"
}, },
"operators": { "operators": {
@@ -274,11 +275,11 @@
"emailAddress": "Lütfen geçerli bir e-posta adresi girin.", "emailAddress": "Lütfen geçerli bir e-posta adresi girin.",
"enterNumber": "Lütfen geçerli bir sayı girin.", "enterNumber": "Lütfen geçerli bir sayı girin.",
"fieldHasNo": "Bu alanda {{label}} girili değil.", "fieldHasNo": "Bu alanda {{label}} girili değil.",
"greaterThanMax": "\"{{value}}\", izin verilen maksimum değerden ({{max}}) fazla.", "greaterThanMax": "{{value}} izin verilen maksimum {{label}} değerinden daha büyük.",
"invalidInput": "Bu alanda geçersiz bir giriş mevcut.", "invalidInput": "Bu alanda geçersiz bir giriş mevcut.",
"invalidSelection": "Bu alanda geçersiz bir seçim mevcut.", "invalidSelection": "Bu alanda geçersiz bir seçim mevcut.",
"invalidSelections": "'Bu alan şu geçersiz seçimlere sahip:'", "invalidSelections": "'Bu alan şu geçersiz seçimlere sahip:'",
"lessThanMin": "\"{{value}}\", belirlenen minimum değerden ({{min}}) az.", "lessThanMin": "{{value}} izin verilen minimum {{label}} değerinden daha küçük.",
"longerThanMin": "Bu değer minimum {{minLength}} karakterden uzun olmalıdır.", "longerThanMin": "Bu değer minimum {{minLength}} karakterden uzun olmalıdır.",
"notValidDate": "\"{{value}}\" geçerli bir tarih değil.", "notValidDate": "\"{{value}}\" geçerli bir tarih değil.",
"required": "Bu alan gereklidir.", "required": "Bu alan gereklidir.",

View File

@@ -863,6 +863,9 @@
"users": { "users": {
"type": "string" "type": "string"
}, },
"value": {
"type": "string"
},
"welcome": { "welcome": {
"type": "string" "type": "string"
} }
@@ -976,37 +979,37 @@
"equals": { "equals": {
"type": "string" "type": "string"
}, },
"isNotEqualTo":{ "isNotEqualTo": {
"type": "string" "type": "string"
}, },
"isIn": { "isIn": {
"type": "string" "type": "string"
}, },
"isNotIn":{ "isNotIn": {
"type": "string" "type": "string"
}, },
"exists": { "exists": {
"type": "string" "type": "string"
}, },
"isGreaterThan":{ "isGreaterThan": {
"type": "string" "type": "string"
}, },
"isLessThan": { "isLessThan": {
"type": "string" "type": "string"
}, },
"isLessThanOrEqualTo":{ "isLessThanOrEqualTo": {
"type": "string" "type": "string"
}, },
"isGreaterThanOrEqualTo": { "isGreaterThanOrEqualTo": {
"type": "string" "type": "string"
}, },
"near":{ "near": {
"type": "string" "type": "string"
}, },
"isLike": { "isLike": {
"type": "string" "type": "string"
}, },
"contains":{ "contains": {
"type": "string" "type": "string"
} }
}, },

View File

@@ -237,6 +237,7 @@
"uploading": "завантаження", "uploading": "завантаження",
"user": "Користувач", "user": "Користувач",
"users": "Користувачі", "users": "Користувачі",
"value": "Значення",
"welcome": "Вітаю" "welcome": "Вітаю"
}, },
"operators": { "operators": {
@@ -270,11 +271,11 @@
"emailAddress": "Будь ласка, введіть валідну email адресу.", "emailAddress": "Будь ласка, введіть валідну email адресу.",
"enterNumber": "Будь ласка, введіть валідний номер.", "enterNumber": "Будь ласка, введіть валідний номер.",
"fieldHasNo": "В цього поля немає {{label}}", "fieldHasNo": "В цього поля немає {{label}}",
"greaterThanMax": "\"{{value}}\" більше максимального значення {{max}}.", "greaterThanMax": "{{value}} більше, ніж дозволено максимуму {{label}} в {{max}}.",
"invalidInput": "У цьому полі введено некоректне значення.", "invalidInput": "У цьому полі введено некоректне значення.",
"invalidSelection": "Це поле має некоректний вибір.", "invalidSelection": "Це поле має некоректний вибір.",
"invalidSelections": "Це поле має наступні невірні варіанти вибору:", "invalidSelections": "Це поле має наступні невірні варіанти вибору:",
"lessThanMin": "\"{{value}}\" менше мінімально допустимого значення {{min}}.", "lessThanMin": "{{value}} менше, ніж дозволено мінімуму {{label}} в {{min}}.",
"longerThanMin": "Це значення має бути більше, ніж мінімальна довжина {{minLength}} characters.", "longerThanMin": "Це значення має бути більше, ніж мінімальна довжина {{minLength}} characters.",
"notValidDate": "\"{{value}}\" - некоректна дата.", "notValidDate": "\"{{value}}\" - некоректна дата.",
"required": "Це поле є обов'язковим.", "required": "Це поле є обов'язковим.",

View File

@@ -240,6 +240,7 @@
"uploading": "Đang tải lên", "uploading": "Đang tải lên",
"user": "Người dùng", "user": "Người dùng",
"users": "Người dùng", "users": "Người dùng",
"value": "Giá trị",
"welcome": "Xin chào" "welcome": "Xin chào"
}, },
"operators": { "operators": {
@@ -273,11 +274,11 @@
"emailAddress": "Địa chỉ email không hợp lệ.", "emailAddress": "Địa chỉ email không hợp lệ.",
"enterNumber": "Vui lòng nhập số.", "enterNumber": "Vui lòng nhập số.",
"fieldHasNo": "Field này không có: {{label}}", "fieldHasNo": "Field này không có: {{label}}",
"greaterThanMax": "\"{{value}}\" đã vượt quá giá trị tối đa: {{max}}.", "greaterThanMax": "{{value}} lớn hơn giá trị tối đa cho phép của {{label}} là {{max}}.",
"invalidInput": "Dữ liệu nhập vào không hợp lệ.", "invalidInput": "Dữ liệu nhập vào không hợp lệ.",
"invalidSelection": "Lựa chọn ở field này không hợp lệ.", "invalidSelection": "Lựa chọn ở field này không hợp lệ.",
"invalidSelections": "'Field này có những lựa chọn không hợp lệ sau:'", "invalidSelections": "'Field này có những lựa chọn không hợp lệ sau:'",
"lessThanMin": "\"{{value}}\" đang thấp hơn giá trị tối thiểu: {{min}}.", "lessThanMin": "{{value}} nhỏ hơn giá trị tối thiểu cho phép của {{label}} là {{min}}.",
"longerThanMin": "Giá trị này cần có độ dài tối thiểu {{minLength}} ký tự.", "longerThanMin": "Giá trị này cần có độ dài tối thiểu {{minLength}} ký tự.",
"notValidDate": "\"{{value}}\" không phải là một ngày (date) hợp lệ.", "notValidDate": "\"{{value}}\" không phải là một ngày (date) hợp lệ.",
"required": "Field này cần được diền.", "required": "Field này cần được diền.",

View File

@@ -239,6 +239,7 @@
"updatedSuccessfully": "更新成功。", "updatedSuccessfully": "更新成功。",
"user": "用户", "user": "用户",
"users": "用户", "users": "用户",
"value": "值",
"welcome": "欢迎" "welcome": "欢迎"
}, },
"operators": { "operators": {
@@ -272,11 +273,11 @@
"emailAddress": "请输入一个有效的电子邮件地址。", "emailAddress": "请输入一个有效的电子邮件地址。",
"enterNumber": "请输入一个有效的号码。", "enterNumber": "请输入一个有效的号码。",
"fieldHasNo": "这个字段没有{{label}}", "fieldHasNo": "这个字段没有{{label}}",
"greaterThanMax": "\"{{value}}\"大于{{max}}的最大允许值", "greaterThanMax": "{{value}}超过了允许的最大{{label}},该最大值为{{max}}。",
"invalidInput": "这个字段有一个无效的输入。", "invalidInput": "这个字段有一个无效的输入。",
"invalidSelection": "这个字段有一个无效的选择。", "invalidSelection": "这个字段有一个无效的选择。",
"invalidSelections": "这个字段有以下无效的选择:", "invalidSelections": "这个字段有以下无效的选择:",
"lessThanMin": "{{value}}小于{{min}}的最小允许值", "lessThanMin": "{{value}}小于允许的最小{{label}},该最小值为{{min}}",
"longerThanMin": "该值必须大于{{minLength}}字符的最小长度", "longerThanMin": "该值必须大于{{minLength}}字符的最小长度",
"notValidDate": "\"{{value}}\"不是一个有效的日期。", "notValidDate": "\"{{value}}\"不是一个有效的日期。",
"required": "该字段为必填项目。", "required": "该字段为必填项目。",

View File

@@ -32,7 +32,10 @@ function returnOptionEnums(options: Option[]): string[] {
}); });
} }
export function generateEntitySchemas(entities: (SanitizedCollectionConfig | SanitizedGlobalConfig)[]): JSONSchema4 { /**
* This is used for generating the TypeScript types (payload-types.ts) with the payload generate:types command.
*/
function generateEntitySchemas(entities: (SanitizedCollectionConfig | SanitizedGlobalConfig)[]): JSONSchema4 {
const properties = [...entities].reduce((acc, { slug }) => { const properties = [...entities].reduce((acc, { slug }) => {
acc[slug] = { acc[slug] = {
$ref: `#/definitions/${slug}`, $ref: `#/definitions/${slug}`,
@@ -72,7 +75,11 @@ function fieldsToJSONSchema(collectionIDFieldTypes: { [key: string]: 'string' |
} }
case 'number': { case 'number': {
fieldSchema = { type: 'number' }; if (field.hasMany === true) {
fieldSchema = { type: 'array', items: { type: 'number' } };
} else {
fieldSchema = { type: 'number' };
}
break; break;
} }

View File

@@ -1,3 +1,7 @@
export function isNumber(value: unknown): boolean { export function isNumber(value: unknown): boolean {
if (typeof value === 'string' && value.trim() === ''){
return false
}
return !Number.isNaN(Number(value)); return !Number.isNaN(Number(value));
} }

View File

@@ -47,6 +47,30 @@ const NumberFields: CollectionConfig = {
type: 'number', type: 'number',
defaultValue: defaultNumber, defaultValue: defaultNumber,
}, },
{
name: 'hasMany',
type: 'number',
hasMany: true,
min: 5,
max: 100,
},
{
name: 'validatesHasMany',
type: 'number',
hasMany: true,
validate: (value: number[]) => {
if (value && !Array.isArray(value)) {
return 'value should be an array';
}
return true;
},
},
{
name: 'localizedHasMany',
type: 'number',
hasMany: true,
localized: true,
},
], ],
}; };
@@ -58,6 +82,9 @@ export const numberDoc = {
negativeNumber: -5, negativeNumber: -5,
decimalMin: 1.25, decimalMin: 1.25,
decimalMax: 0.25, decimalMax: 0.25,
hasMany: [5, 10, 15],
validatesHasMany: [5],
localizedHasMany: [10],
}; };
export default NumberFields; export default NumberFields;

View File

@@ -12,6 +12,7 @@ import { tabsSlug } from './collections/Tabs';
import { collapsibleFieldsSlug } from './collections/Collapsible'; import { collapsibleFieldsSlug } from './collections/Collapsible';
import wait from '../../src/utilities/wait'; import wait from '../../src/utilities/wait';
import { jsonDoc } from './collections/JSON'; import { jsonDoc } from './collections/JSON';
import { numberDoc } from './collections/Number';
const { beforeAll, describe } = test; const { beforeAll, describe } = test;
@@ -67,6 +68,42 @@ describe('fields', () => {
}); });
}); });
describe('number', () => {
let url: AdminUrlUtil;
beforeAll(() => {
url = new AdminUrlUtil(serverURL, 'number-fields');
});
test('should display field in list view', async () => {
await page.goto(url.list);
const textCell = page.locator('.row-1 .cell-number');
await expect(textCell)
.toHaveText(String(numberDoc.number));
});
test('should create', async () => {
const input = 5;
await page.goto(url.create);
const field = page.locator('#field-number');
await field.fill(String(input));
await saveDocAndAssert(page);
await expect(await field.inputValue()).toEqual(String(input));
});
test('should create hasMany', async () => {
const input = 5;
await page.goto(url.create);
const field = page.locator('.field-hasMany');
await field.click();
await page.keyboard.type(String(input));
await page.keyboard.press('Enter');
await saveDocAndAssert(page);
await expect(field.locator('.rs__value-container')).toContainText(String(input));
});
});
describe('json', () => { describe('json', () => {
let url: AdminUrlUtil; let url: AdminUrlUtil;
beforeAll(() => { beforeAll(() => {

View File

@@ -194,6 +194,25 @@ describe('Fields', () => {
}, },
})).rejects.toThrow('The following field is invalid: decimalMax'); })).rejects.toThrow('The following field is invalid: decimalMax');
}); });
it('should localize an array of numbers using hasMany', async () => {
const localizedHasMany = [5, 10];
const { id } = await payload.create({
collection: 'number-fields',
locale: 'en',
data: {
localizedHasMany,
},
});
const localizedDoc = await payload.findByID({
collection: 'number-fields',
locale: 'all',
id,
});
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
expect(localizedDoc.localizedHasMany.en).toEqual(localizedHasMany);
});
}); });
describe('indexes', () => { describe('indexes', () => {

View File

@@ -35,13 +35,15 @@ export interface Config {
export interface User { export interface User {
id: string; id: string;
canViewConditionalField?: boolean; canViewConditionalField?: boolean;
email?: string; updatedAt: string;
createdAt: string;
email: string;
resetPasswordToken?: string; resetPasswordToken?: string;
resetPasswordExpiration?: string; resetPasswordExpiration?: string;
salt?: string;
hash?: string;
loginAttempts?: number; loginAttempts?: number;
lockUntil?: string; lockUntil?: string;
createdAt: string;
updatedAt: string;
password?: string; password?: string;
} }
export interface ArrayField { export interface ArrayField {
@@ -50,7 +52,7 @@ export interface ArrayField {
text: string; text: string;
id?: string; id?: string;
}[]; }[];
collapsedArray: { collapsedArray?: {
text: string; text: string;
id?: string; id?: string;
}[]; }[];
@@ -74,8 +76,8 @@ export interface ArrayField {
title?: string; title?: string;
id?: string; id?: string;
}[]; }[];
createdAt: string;
updatedAt: string; updatedAt: string;
createdAt: string;
} }
export interface BlockField { export interface BlockField {
id: string; id: string;
@@ -214,8 +216,8 @@ export interface BlockField {
blockName?: string; blockName?: string;
blockType: 'text'; blockType: 'text';
}[]; }[];
createdAt: string;
updatedAt: string; updatedAt: string;
createdAt: string;
} }
export interface CodeField { export interface CodeField {
id: string; id: string;
@@ -224,8 +226,8 @@ export interface CodeField {
json?: string; json?: string;
html?: string; html?: string;
css?: string; css?: string;
createdAt: string;
updatedAt: string; updatedAt: string;
createdAt: string;
} }
export interface CollapsibleField { export interface CollapsibleField {
id: string; id: string;
@@ -244,8 +246,8 @@ export interface CollapsibleField {
innerCollapsible?: string; innerCollapsible?: string;
id?: string; id?: string;
}[]; }[];
createdAt: string;
updatedAt: string; updatedAt: string;
createdAt: string;
} }
export interface ConditionalLogic { export interface ConditionalLogic {
id: string; id: string;
@@ -253,8 +255,8 @@ export interface ConditionalLogic {
toggleField?: boolean; toggleField?: boolean;
fieldToToggle: string; fieldToToggle: string;
userConditional?: string; userConditional?: string;
createdAt: string;
updatedAt: string; updatedAt: string;
createdAt: string;
} }
export interface DateField { export interface DateField {
id: string; id: string;
@@ -263,14 +265,14 @@ export interface DateField {
dayOnly?: string; dayOnly?: string;
dayAndTime?: string; dayAndTime?: string;
monthOnly?: string; monthOnly?: string;
createdAt: string;
updatedAt: string; updatedAt: string;
createdAt: string;
} }
export interface RadioField { export interface RadioField {
id: string; id: string;
radio?: 'one' | 'two' | 'three'; radio?: 'one' | 'two' | 'three';
createdAt: string;
updatedAt: string; updatedAt: string;
createdAt: string;
} }
export interface GroupField { export interface GroupField {
id: string; id: string;
@@ -300,14 +302,27 @@ export interface GroupField {
nestedField?: string; nestedField?: string;
}; };
}; };
createdAt: string; groups: {
groupInRow?: {
field?: string;
secondField?: string;
thirdField?: string;
};
secondGroupInRow?: {
field?: string;
nestedGroup?: {
nestedField?: string;
};
};
};
updatedAt: string; updatedAt: string;
createdAt: string;
} }
export interface RowField { export interface RowField {
id: string; id: string;
title: string; title: string;
createdAt: string;
updatedAt: string; updatedAt: string;
createdAt: string;
} }
export interface IndexedField { export interface IndexedField {
id: string; id: string;
@@ -330,8 +345,8 @@ export interface IndexedField {
collapsibleTextUnique?: string; collapsibleTextUnique?: string;
partOne?: string; partOne?: string;
partTwo?: string; partTwo?: string;
createdAt: string;
updatedAt: string; updatedAt: string;
createdAt: string;
} }
export interface JsonField { export interface JsonField {
id: string; id: string;
@@ -344,8 +359,8 @@ export interface JsonField {
| number | number
| boolean | boolean
| null; | null;
createdAt: string;
updatedAt: string; updatedAt: string;
createdAt: string;
} }
export interface NumberField { export interface NumberField {
id: string; id: string;
@@ -357,8 +372,11 @@ export interface NumberField {
decimalMin?: number; decimalMin?: number;
decimalMax?: number; decimalMax?: number;
defaultNumber?: number; defaultNumber?: number;
createdAt: string; hasMany?: number[];
validatesHasMany?: number[];
localizedHasMany?: number[];
updatedAt: string; updatedAt: string;
createdAt: string;
} }
export interface PointField { export interface PointField {
id: string; id: string;
@@ -379,8 +397,8 @@ export interface PointField {
*/ */
point?: [number, number]; point?: [number, number];
}; };
createdAt: string;
updatedAt: string; updatedAt: string;
createdAt: string;
} }
export interface RelationshipField { export interface RelationshipField {
id: string; id: string;
@@ -402,8 +420,8 @@ export interface RelationshipField {
}; };
relationshipWithMin?: string[] | TextField[]; relationshipWithMin?: string[] | TextField[];
relationshipWithMax?: string[] | TextField[]; relationshipWithMax?: string[] | TextField[];
createdAt: string;
updatedAt: string; updatedAt: string;
createdAt: string;
} }
export interface TextField { export interface TextField {
id: string; id: string;
@@ -413,8 +431,8 @@ export interface TextField {
defaultFunction?: string; defaultFunction?: string;
defaultAsync?: string; defaultAsync?: string;
overrideLength?: string; overrideLength?: string;
createdAt: string;
updatedAt: string; updatedAt: string;
createdAt: string;
} }
export interface RichTextField { export interface RichTextField {
id: string; id: string;
@@ -423,11 +441,14 @@ export interface RichTextField {
richText: { richText: {
[k: string]: unknown; [k: string]: unknown;
}[]; }[];
richTextCustomFields?: {
[k: string]: unknown;
}[];
richTextReadOnly?: { richTextReadOnly?: {
[k: string]: unknown; [k: string]: unknown;
}[]; }[];
createdAt: string;
updatedAt: string; updatedAt: string;
createdAt: string;
} }
export interface SelectField { export interface SelectField {
id: string; id: string;
@@ -437,8 +458,8 @@ export interface SelectField {
selectHasManyLocalized?: ('one' | 'two')[]; selectHasManyLocalized?: ('one' | 'two')[];
selectI18n?: 'one' | 'two' | 'three'; selectI18n?: 'one' | 'two' | 'three';
simple?: 'One' | 'Two' | 'Three'; simple?: 'One' | 'Two' | 'Three';
createdAt: string;
updatedAt: string; updatedAt: string;
createdAt: string;
} }
export interface TabsField { export interface TabsField {
id: string; id: string;
@@ -522,8 +543,8 @@ export interface TabsField {
nestedTab: { nestedTab: {
text?: string; text?: string;
}; };
createdAt: string;
updatedAt: string; updatedAt: string;
createdAt: string;
} }
export interface Upload { export interface Upload {
id: string; id: string;
@@ -532,27 +553,27 @@ export interface Upload {
richText?: { richText?: {
[k: string]: unknown; [k: string]: unknown;
}[]; }[];
updatedAt: string;
createdAt: string;
url?: string; url?: string;
filename?: string; filename?: string;
mimeType?: string; mimeType?: string;
filesize?: number; filesize?: number;
width?: number; width?: number;
height?: number; height?: number;
createdAt: string;
updatedAt: string;
} }
export interface Uploads2 { export interface Uploads2 {
id: string; id: string;
text?: string; text?: string;
media?: string | Uploads2; media?: string | Uploads2;
updatedAt: string;
createdAt: string;
url?: string; url?: string;
filename?: string; filename?: string;
mimeType?: string; mimeType?: string;
filesize?: number; filesize?: number;
width?: number; width?: number;
height?: number; height?: number;
createdAt: string;
updatedAt: string;
} }
export interface Uploads3 { export interface Uploads3 {
id: string; id: string;
@@ -560,12 +581,12 @@ export interface Uploads3 {
richText?: { richText?: {
[k: string]: unknown; [k: string]: unknown;
}[]; }[];
updatedAt: string;
createdAt: string;
url?: string; url?: string;
filename?: string; filename?: string;
mimeType?: string; mimeType?: string;
filesize?: number; filesize?: number;
width?: number; width?: number;
height?: number; height?: number;
createdAt: string;
updatedAt: string;
} }