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:
@@ -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. |
|
||||
| **`min`** | Minimum 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. |
|
||||
| **`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) |
|
||||
|
||||
@@ -23,6 +23,6 @@ export const useDraggableSortable = (props: UseDraggableArguments): UseDraggable
|
||||
isDragging,
|
||||
listeners,
|
||||
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
|
||||
};
|
||||
};
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import React from 'react';
|
||||
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) => {
|
||||
const {
|
||||
|
||||
@@ -4,12 +4,12 @@ import {
|
||||
components as SelectComponents,
|
||||
} from 'react-select';
|
||||
import { useDraggableSortable } from '../../DraggableSortable/useDraggableSortable';
|
||||
import { Option as OptionType } from '../types';
|
||||
import type { Option } from '../types';
|
||||
|
||||
import './index.scss';
|
||||
|
||||
const baseClass = 'multi-value';
|
||||
export const MultiValue: React.FC<MultiValueProps<OptionType>> = (props) => {
|
||||
export const MultiValue: React.FC<MultiValueProps<Option>> = (props) => {
|
||||
const {
|
||||
className,
|
||||
isDisabled,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import React from 'react';
|
||||
import { components as SelectComponents, MultiValueProps } from 'react-select';
|
||||
import { Option } from '../../../forms/field-types/Relationship/types';
|
||||
import type { Option } from '../types';
|
||||
import './index.scss';
|
||||
|
||||
const baseClass = 'multi-value-label';
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import React from 'react';
|
||||
import React, { KeyboardEventHandler } from 'react';
|
||||
import Select from 'react-select';
|
||||
import CreatableSelect from 'react-select/creatable';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import { arrayMove } from '@dnd-kit/sortable';
|
||||
import { Props as ReactSelectAdapterProps } from './types';
|
||||
@@ -13,11 +14,20 @@ import { ClearIndicator } from './ClearIndicator';
|
||||
import { MultiValueRemove } from './MultiValueRemove';
|
||||
import { Control } from './Control';
|
||||
import DraggableSortable from '../DraggableSortable';
|
||||
import type { Option } from './types';
|
||||
|
||||
import './index.scss';
|
||||
|
||||
|
||||
const createOption = (label: string) => ({
|
||||
label,
|
||||
value: label,
|
||||
});
|
||||
|
||||
|
||||
const SelectAdapter: React.FC<ReactSelectAdapterProps> = (props) => {
|
||||
const { t, i18n } = useTranslation();
|
||||
const [inputValue, setInputValue] = React.useState(''); // for creatable select
|
||||
|
||||
const {
|
||||
className,
|
||||
@@ -30,9 +40,11 @@ const SelectAdapter: React.FC<ReactSelectAdapterProps> = (props) => {
|
||||
isSearchable = true,
|
||||
isClearable = true,
|
||||
filterOption = undefined,
|
||||
numberOnly = false,
|
||||
isLoading,
|
||||
onMenuOpen,
|
||||
components,
|
||||
isCreatable,
|
||||
selectProps,
|
||||
} = props;
|
||||
|
||||
@@ -42,8 +54,68 @@ const SelectAdapter: React.FC<ReactSelectAdapterProps> = (props) => {
|
||||
showError && 'react-select--error',
|
||||
].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 (
|
||||
<Select
|
||||
<CreatableSelect
|
||||
isLoading={isLoading}
|
||||
placeholder={getTranslation(placeholder, i18n)}
|
||||
captureMenuScroll
|
||||
@@ -60,6 +132,9 @@ const SelectAdapter: React.FC<ReactSelectAdapterProps> = (props) => {
|
||||
filterOption={filterOption}
|
||||
onMenuOpen={onMenuOpen}
|
||||
menuPlacement="auto"
|
||||
inputValue={inputValue}
|
||||
onInputChange={(newValue) => setInputValue(newValue)}
|
||||
onKeyDown={handleKeyDown}
|
||||
components={{
|
||||
ValueContainer,
|
||||
SingleValue,
|
||||
@@ -81,8 +156,10 @@ const SortableSelect: React.FC<ReactSelectAdapterProps> = (props) => {
|
||||
value,
|
||||
} = props;
|
||||
|
||||
|
||||
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 (
|
||||
<DraggableSortable
|
||||
|
||||
@@ -33,6 +33,8 @@ declare module 'react-select/dist/declarations/src' {
|
||||
export type Option = {
|
||||
[key: string]: 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 = {
|
||||
@@ -48,7 +50,10 @@ export type Props = {
|
||||
disabled?: boolean,
|
||||
showError?: boolean,
|
||||
options: Option[] | OptionGroup[]
|
||||
/** Allows you to specify multiple values instead of just one */
|
||||
isMulti?: boolean,
|
||||
/** Allows you to create own values in the UI despite them not being pre-specified */
|
||||
isCreatable?: boolean,
|
||||
isLoading?: boolean
|
||||
isOptionSelected?: any
|
||||
isSortable?: boolean,
|
||||
@@ -61,6 +66,7 @@ export type Props = {
|
||||
filterOption?:
|
||||
| (({ label, value, data }: { label: string, value: string, data: Option }, search: string) => boolean)
|
||||
| undefined,
|
||||
numberOnly?: boolean,
|
||||
components?: {
|
||||
[key: string]: React.FC<any>
|
||||
}
|
||||
|
||||
@@ -4,8 +4,10 @@
|
||||
position: relative;
|
||||
margin-bottom: $baseline;
|
||||
|
||||
input {
|
||||
@include formInput;
|
||||
&:not(.has-many) {
|
||||
input {
|
||||
@include formInput;
|
||||
}
|
||||
}
|
||||
|
||||
&.error {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import React, { useCallback } from 'react';
|
||||
import React, { useCallback, useEffect, useState } from 'react';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import useField from '../../useField';
|
||||
import Label from '../../Label';
|
||||
@@ -8,8 +8,11 @@ import withCondition from '../../withCondition';
|
||||
import { number } from '../../../../../fields/validations';
|
||||
import { Props } from './types';
|
||||
import { getTranslation } from '../../../../../utilities/getTranslation';
|
||||
import { Option } from '../../../elements/ReactSelect/types';
|
||||
import ReactSelect from '../../../elements/ReactSelect';
|
||||
|
||||
import './index.scss';
|
||||
import { isNumber } from '../../../../../utilities/isNumber';
|
||||
|
||||
const NumberField: React.FC<Props> = (props) => {
|
||||
const {
|
||||
@@ -20,6 +23,9 @@ const NumberField: React.FC<Props> = (props) => {
|
||||
label,
|
||||
max,
|
||||
min,
|
||||
hasMany,
|
||||
minRows,
|
||||
maxRows,
|
||||
admin: {
|
||||
readOnly,
|
||||
style,
|
||||
@@ -32,7 +38,7 @@ const NumberField: React.FC<Props> = (props) => {
|
||||
} = {},
|
||||
} = props;
|
||||
|
||||
const { i18n } = useTranslation();
|
||||
const { t, i18n } = useTranslation();
|
||||
|
||||
const path = pathFromProps || name;
|
||||
|
||||
@@ -45,7 +51,7 @@ const NumberField: React.FC<Props> = (props) => {
|
||||
showError,
|
||||
setValue,
|
||||
errorMessage,
|
||||
} = useField({
|
||||
} = useField<number | number[]>({
|
||||
path,
|
||||
validate: memoizedValidate,
|
||||
condition,
|
||||
@@ -67,8 +73,46 @@ const NumberField: React.FC<Props> = (props) => {
|
||||
className,
|
||||
showError && 'error',
|
||||
readOnly && 'read-only',
|
||||
hasMany && 'has-many',
|
||||
].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 (
|
||||
<div
|
||||
className={classes}
|
||||
@@ -86,21 +130,43 @@ const NumberField: React.FC<Props> = (props) => {
|
||||
label={label}
|
||||
required={required}
|
||||
/>
|
||||
<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();
|
||||
}}
|
||||
/>
|
||||
{hasMany ? (
|
||||
<ReactSelect
|
||||
className={`field-${path.replace(/\./gi, '__')}`}
|
||||
placeholder={t('general:enterAValue')}
|
||||
onChange={handleHasManyChange}
|
||||
value={valueToRender as Option[]}
|
||||
showError={showError}
|
||||
disabled={readOnly}
|
||||
options={[]}
|
||||
isCreatable
|
||||
isMulti
|
||||
isSortable
|
||||
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
|
||||
value={value}
|
||||
description={description}
|
||||
|
||||
@@ -341,7 +341,7 @@ export type CollectionConfig = {
|
||||
* @default true
|
||||
*/
|
||||
timestamps?: boolean
|
||||
/** Extension point to add your custom data. */
|
||||
/** Extension point to add your custom data. */
|
||||
custom?: Record<string, any>;
|
||||
};
|
||||
|
||||
|
||||
@@ -194,7 +194,7 @@ export type Endpoint = {
|
||||
* @default false
|
||||
*/
|
||||
root?: boolean;
|
||||
/** Extension point to add your custom data. */
|
||||
/** Extension point to add your custom data. */
|
||||
custom?: Record<string, any>;
|
||||
};
|
||||
|
||||
@@ -528,7 +528,7 @@ export type Config = {
|
||||
telemetry?: boolean;
|
||||
/** A function that is called immediately following startup that receives the Payload instance as its only argument. */
|
||||
onInit?: (payload: Payload) => Promise<void> | void;
|
||||
/** Extension point to add your custom data. */
|
||||
/** Extension point to add your custom data. */
|
||||
custom?: Record<string, any>;
|
||||
};
|
||||
|
||||
|
||||
@@ -94,6 +94,11 @@ export const number = baseField.keys({
|
||||
autoComplete: joi.string(),
|
||||
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({
|
||||
|
||||
@@ -122,20 +122,40 @@ export interface FieldBase {
|
||||
read?: FieldAccess;
|
||||
update?: FieldAccess;
|
||||
};
|
||||
/** Extension point to add your custom data. */
|
||||
/** Extension point to add your custom data. */
|
||||
custom?: Record<string, any>;
|
||||
}
|
||||
|
||||
export type NumberField = FieldBase & {
|
||||
type: 'number';
|
||||
admin?: Admin & {
|
||||
/** Set this property to a string that will be used for browser autocomplete. */
|
||||
autoComplete?: string
|
||||
/** Set this property to define a placeholder string for the field. */
|
||||
placeholder?: Record<string, string> | string
|
||||
/** Set a value for the number field to increment / decrement using browser controls. */
|
||||
step?: number
|
||||
}
|
||||
/** Minimum value accepted. Used in the default `validation` function. */
|
||||
min?: number
|
||||
/** Maximum value accepted. Used in the default `validation` function. */
|
||||
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 & {
|
||||
type: 'text';
|
||||
@@ -261,7 +281,7 @@ export type UIField = {
|
||||
}
|
||||
}
|
||||
type: 'ui';
|
||||
/** Extension point to add your custom data. */
|
||||
/** Extension point to add your custom data. */
|
||||
custom?: Record<string, any>;
|
||||
}
|
||||
|
||||
|
||||
@@ -424,5 +424,30 @@ describe('Field Validations', () => {
|
||||
const result = number(val, { ...numberOptions, max: 1 });
|
||||
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');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -24,25 +24,45 @@ import canUseDOM from '../utilities/canUseDOM';
|
||||
import { isValidID } from '../utilities/isValidID';
|
||||
import { getIDType } from '../utilities/getIDType';
|
||||
|
||||
export const number: Validate<unknown, unknown, NumberField> = (value: string, { t, required, min, max }) => {
|
||||
const parsedValue = parseFloat(value);
|
||||
export const number: Validate<unknown, unknown, NumberField> = (value: number | number[], { t, required, min, max, minRows, maxRows, hasMany }) => {
|
||||
const toValidate: number[] = Array.isArray(value) ? value : [value];
|
||||
|
||||
if ((value && typeof parsedValue !== 'number') || (required && Number.isNaN(parsedValue)) || (value && Number.isNaN(parsedValue))) {
|
||||
return t('validation:enterNumber');
|
||||
// eslint-disable-next-line no-restricted-syntax
|
||||
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) {
|
||||
return t('validation:greaterThanMax', { value, max });
|
||||
}
|
||||
|
||||
if (typeof min === 'number' && parsedValue < min) {
|
||||
return t('validation:lessThanMin', { value, min });
|
||||
}
|
||||
|
||||
if (required && typeof parsedValue !== 'number') {
|
||||
if (required && toValidate.length === 0) {
|
||||
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;
|
||||
};
|
||||
|
||||
@@ -290,11 +310,11 @@ export const relationship: Validate<unknown, unknown, RelationshipField> = async
|
||||
|
||||
if (Array.isArray(value)) {
|
||||
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) {
|
||||
return t('validation:greaterThanMax', { count: maxRows, label: t('rows') });
|
||||
return t('validation:greaterThanMax', { value: value.length, max: maxRows, label: t('rows') });
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -132,7 +132,7 @@ export type GlobalConfig = {
|
||||
}
|
||||
fields: Field[];
|
||||
admin?: GlobalAdminOptions
|
||||
/** Extension point to add your custom data. */
|
||||
/** Extension point to add your custom data. */
|
||||
custom?: Record<string, any>;
|
||||
}
|
||||
|
||||
|
||||
@@ -43,7 +43,7 @@ function buildMutationInputType(payload: Payload, name: string, fields: Field[],
|
||||
const type = field.name === 'id' ? GraphQLInt : GraphQLFloat;
|
||||
return {
|
||||
...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) => ({
|
||||
|
||||
@@ -84,10 +84,13 @@ function buildObjectType({
|
||||
forceNullable,
|
||||
}: Args): GraphQLObjectType {
|
||||
const fieldToSchemaMap = {
|
||||
number: (objectTypeConfig: ObjectTypeConfig, field: NumberField) => ({
|
||||
...objectTypeConfig,
|
||||
[field.name]: { type: withNullableType(field, GraphQLFloat, forceNullable) },
|
||||
}),
|
||||
number: (objectTypeConfig: ObjectTypeConfig, field: NumberField) => {
|
||||
const type = field?.name === 'id' ? GraphQLInt : GraphQLFloat;
|
||||
return ({
|
||||
...objectTypeConfig,
|
||||
[field.name]: { type: withNullableType(field, field?.hasMany === true ? new GraphQLList(type) : type, forceNullable) },
|
||||
});
|
||||
},
|
||||
text: (objectTypeConfig: ObjectTypeConfig, field: TextField) => ({
|
||||
...objectTypeConfig,
|
||||
[field.name]: { type: withNullableType(field, GraphQLString, forceNullable) },
|
||||
|
||||
@@ -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 { GraphQLJSON } from 'graphql-type-json';
|
||||
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 formatName from '../utilities/formatName';
|
||||
import operators from './operators';
|
||||
@@ -27,7 +27,10 @@ type DefaultsType = {
|
||||
|
||||
const defaults: DefaultsType = {
|
||||
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],
|
||||
},
|
||||
text: {
|
||||
@@ -86,7 +89,9 @@ const defaults: DefaultsType = {
|
||||
operators: [...operators.equality, ...operators.comparison, ...operators.geo],
|
||||
},
|
||||
relationship: {
|
||||
type: GraphQLString,
|
||||
type: (field: RelationshipField): GraphQLType => {
|
||||
return field?.hasMany === true ? new GraphQLList(GraphQLString) : GraphQLString;
|
||||
},
|
||||
operators: [...operators.equality, ...operators.contains],
|
||||
},
|
||||
upload: {
|
||||
|
||||
@@ -233,12 +233,13 @@ export class ParamParser {
|
||||
hasCustomID = true;
|
||||
}
|
||||
|
||||
|
||||
paths.push({
|
||||
path: '_id',
|
||||
field: {
|
||||
name: 'id',
|
||||
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,
|
||||
collectionSlug: this.collectionSlug,
|
||||
});
|
||||
|
||||
@@ -114,7 +114,7 @@ const buildSchema = (config: SanitizedConfig, configFields: Field[], buildSchema
|
||||
|
||||
const fieldToSchemaMap: Record<string, FieldSchemaGenerator> = {
|
||||
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({
|
||||
[field.name]: localizeSchema(field, baseSchema, config.localization),
|
||||
|
||||
@@ -241,6 +241,7 @@
|
||||
"uploading": "جار الرفع",
|
||||
"user": "المستخدم",
|
||||
"users": "المستخدمين",
|
||||
"value": "القيمة",
|
||||
"welcome": "مرحبًا"
|
||||
},
|
||||
"operators": {
|
||||
@@ -274,11 +275,11 @@
|
||||
"emailAddress": "يرجى إدخال عنوان بريد إلكتروني صحيح.",
|
||||
"enterNumber": "يرجى إدخال رقم صحيح.",
|
||||
"fieldHasNo": "هذا الحقل ليس لديه {{label}}",
|
||||
"greaterThanMax": "\"{{value}}\" أكبر من الحد الأقصى المسموح به {{max}}.",
|
||||
"greaterThanMax": "{{value}} أكبر من الحد الأقصى المسموح به {{label}} الذي يبلغ {{max}}.",
|
||||
"invalidInput": "هذا الحقل لديه إدخال غير صالح.",
|
||||
"invalidSelection": "هذا الحقل لديه اختيار غير صالح.",
|
||||
"invalidSelections": "هذا الحقل لديه الاختيارات الغير صالحة التالية:",
|
||||
"lessThanMin": "\"{{value}}\" أقل من الحد الأدنى المسموح به {{min}}.",
|
||||
"lessThanMin": "{{value}} أقل من الحد الأدنى المسموح به {{label}} الذي يبلغ {{min}}.",
|
||||
"longerThanMin": "يجب أن يكون هذا القيمة أطول من الحد الأدنى للطول الذي هو {{minLength}} أحرف.",
|
||||
"notValidDate": "\"{{value}}\" ليس تاريخا صالحا.",
|
||||
"required": "هذا الحقل مطلوب.",
|
||||
|
||||
@@ -241,6 +241,7 @@
|
||||
"uploading": "Качва се",
|
||||
"user": "Потребител",
|
||||
"users": "Потребители",
|
||||
"value": "Стойност",
|
||||
"welcome": "Добре дошъл"
|
||||
},
|
||||
"operators": {
|
||||
@@ -274,11 +275,11 @@
|
||||
"emailAddress": "Моля, въведи валиден имейл адрес.",
|
||||
"enterNumber": "Моля, въведи валиден номер.",
|
||||
"fieldHasNo": "Това поле няма {{label}}",
|
||||
"greaterThanMax": "\"{{value}}\" е по-голямо от максималната позволена големина {{max}}.",
|
||||
"greaterThanMax": "{{value}} е по-голямо от максимално допустимото {{label}} от {{max}}.",
|
||||
"invalidInput": "Това поле има невалиден вход.",
|
||||
"invalidSelection": "Това поле има невалидна селекция.",
|
||||
"invalidSelections": "Това поле има следните невалидни селекции:",
|
||||
"lessThanMin": "\"{{value}}\" е по-малко от минималната позволена големина {{min}}.",
|
||||
"lessThanMin": "{{value}} е по-малко от минимално допустимото {{label}} от {{min}}.",
|
||||
"longerThanMin": "Тази стойност трябва да е по-голяма от минималната стойност от {{minLength}} символа.",
|
||||
"notValidDate": "\"{{value}}\" не е валидна дата.",
|
||||
"required": "Това поле е задължително.",
|
||||
|
||||
@@ -238,6 +238,7 @@
|
||||
"uploading": "Nahrávání",
|
||||
"user": "Uživatel",
|
||||
"users": "Uživatelé",
|
||||
"value": "Hodnota",
|
||||
"welcome": "Vítejte"
|
||||
},
|
||||
"operators": {
|
||||
@@ -271,11 +272,11 @@
|
||||
"emailAddress": "Zadejte prosím platnou e-mailovou adresu.",
|
||||
"enterNumber": "Zadejte prosím platné číslo.",
|
||||
"fieldHasNo": "Toto pole nemá {{label}}",
|
||||
"greaterThanMax": "\"{{value}}\" je větší než maximální povolená hodnota {{max}}.",
|
||||
"greaterThanMax": "{{value}} je vyšší než maximálně povolená {{label}} {{max}}.",
|
||||
"invalidInput": "Toto pole má neplatný vstup.",
|
||||
"invalidSelection": "Toto pole má neplatný výběr.",
|
||||
"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ů.",
|
||||
"notValidDate": "\"{{value}}\" není platné datum.",
|
||||
"required": "Toto pole je povinné.",
|
||||
|
||||
@@ -241,6 +241,7 @@
|
||||
"uploading": "Hochladen",
|
||||
"user": "Benutzer",
|
||||
"users": "Benutzer",
|
||||
"value": "Wert",
|
||||
"welcome": "Willkommen"
|
||||
},
|
||||
"operators": {
|
||||
@@ -274,11 +275,11 @@
|
||||
"emailAddress": "Bitte gib eine korrekte E-Mail-Adresse an.",
|
||||
"enterNumber": "Bitte gib eine gültige Nummer an,",
|
||||
"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.",
|
||||
"invalidSelection": "Dieses Feld hat eine inkorrekte Auswahl.",
|
||||
"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.",
|
||||
"notValidDate": "\"{{value}}\" ist kein gültiges Datum.",
|
||||
"required": "Pflichtfeld",
|
||||
|
||||
@@ -241,6 +241,7 @@
|
||||
"uploading": "Uploading",
|
||||
"user": "User",
|
||||
"users": "Users",
|
||||
"value": "Value",
|
||||
"welcome": "Welcome"
|
||||
},
|
||||
"operators": {
|
||||
@@ -274,11 +275,11 @@
|
||||
"emailAddress": "Please enter a valid email address.",
|
||||
"enterNumber": "Please enter a valid number.",
|
||||
"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.",
|
||||
"invalidSelection": "This field has an invalid selection.",
|
||||
"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.",
|
||||
"notValidDate": "\"{{value}}\" is not a valid date.",
|
||||
"required": "This field is required.",
|
||||
|
||||
@@ -241,6 +241,7 @@
|
||||
"uploading": "Subiendo",
|
||||
"user": "Usuario",
|
||||
"users": "Usuarios",
|
||||
"value": "Valor",
|
||||
"welcome": "Bienvenido"
|
||||
},
|
||||
"operators": {
|
||||
@@ -274,11 +275,11 @@
|
||||
"emailAddress": "Por favor introduce un correo electrónico válido.",
|
||||
"enterNumber": "Por favor introduce un número válido.",
|
||||
"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.",
|
||||
"invalidSelection": "La selección en este campo es inválida.",
|
||||
"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.",
|
||||
"notValidDate": "\"{{value}}\" es una fecha inválida.",
|
||||
"required": "Este campo es obligatorio.",
|
||||
|
||||
@@ -241,6 +241,7 @@
|
||||
"uploading": "در حال بارگذاری",
|
||||
"user": "کاربر",
|
||||
"users": "کاربران",
|
||||
"value": "مقدار",
|
||||
"welcome": "خوشآمدید"
|
||||
},
|
||||
"operators": {
|
||||
@@ -274,11 +275,11 @@
|
||||
"emailAddress": "لطفاً یک نشانی رایانامه معتبر وارد کنید.",
|
||||
"enterNumber": "لطفاً یک شماره درست وارد کنید.",
|
||||
"fieldHasNo": "این کادر شامل هیچ {{label}} نمیشود",
|
||||
"greaterThanMax": "\"{{value}}\" بیشتر از حد مجاز است {{max}}.",
|
||||
"greaterThanMax": "{{value}} بیشتر از حداکثر مجاز برای {{label}} است که {{max}} است.",
|
||||
"invalidInput": "این کادر دارای ورودی نامعتبر است.",
|
||||
"invalidSelection": "این کادر دارای یک انتخاب نامعتبر است.",
|
||||
"invalidSelections": "این کادر دارای انتخابهای نامعتبر زیر است:",
|
||||
"lessThanMin": "\"{{value}}\" کمتر از مقدار مجاز است {{min}}.",
|
||||
"lessThanMin": "{{value}} کمتر از حداقل مجاز برای {{label}} است که {{min}} است.",
|
||||
"longerThanMin": "ورودی باید بیش از حداقل {{minLength}} واژه باشد.",
|
||||
"notValidDate": "\"{{value}}\" یک تاریخ معتبر نیست.",
|
||||
"required": "این کادر اجباری است.",
|
||||
|
||||
@@ -241,6 +241,7 @@
|
||||
"uploading": "Téléchargement",
|
||||
"user": "Utilisateur",
|
||||
"users": "Utilisateurs",
|
||||
"value": "Valeur",
|
||||
"welcome": "Bienvenu(e)"
|
||||
},
|
||||
"operators": {
|
||||
@@ -274,11 +275,11 @@
|
||||
"emailAddress": "S'il vous plaît, veuillez entrer une adresse e-mail valide.",
|
||||
"enterNumber": "S'il vous plait, veuillez entrer un nombre valide.",
|
||||
"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.",
|
||||
"invalidSelection": "Ce champ a une sélection invalide.",
|
||||
"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.",
|
||||
"notValidDate": "\"{{value}}\" n'est pas une date valide.",
|
||||
"required": "Ce champ est requis.",
|
||||
|
||||
@@ -241,6 +241,7 @@
|
||||
"uploading": "Prijenos",
|
||||
"user": "Korisnik",
|
||||
"users": "Korisnici",
|
||||
"value": "Attribute",
|
||||
"welcome": "Dobrodošli"
|
||||
},
|
||||
"operators": {
|
||||
@@ -274,11 +275,11 @@
|
||||
"emailAddress": "Molim unestie valjanu email adresu.",
|
||||
"enterNumber": "Molim unesite valjani broj.",
|
||||
"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.",
|
||||
"invalidSelection": "Ovo polje ima nevaljan odabir.",
|
||||
"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",
|
||||
"notValidDate": "\"{{value}}\" nije valjan datum.",
|
||||
"required": "Ovo polje je obvezno.",
|
||||
@@ -343,4 +344,4 @@
|
||||
"viewingVersions": "Pregled verzija za {{entityLabel}} {{documentTitle}}",
|
||||
"viewingVersionsGlobal": "Pregled verzije za globalni {{entityLabel}}"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,346 +1,347 @@
|
||||
{
|
||||
"$schema": "./translation-schema.json",
|
||||
"authentication": {
|
||||
"account": "Fiók",
|
||||
"accountOfCurrentUser": "Az aktuális felhasználó fiókja",
|
||||
"alreadyActivated": "Már aktiválva van",
|
||||
"alreadyLoggedIn": "Már bejelentkezett",
|
||||
"apiKey": "API-kulcs",
|
||||
"backToLogin": "Vissza a bejelentkezéshez",
|
||||
"beginCreateFirstUser": "Kezdésként hozza létre az első felhasználót.",
|
||||
"changePassword": "Jelszó módosítása",
|
||||
"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",
|
||||
"confirmPassword": "Jelszó megerősítése",
|
||||
"createFirstUser": "Első felhasználó létrehozása",
|
||||
"emailNotValid": "A megadott e-mail cím érvénytelen",
|
||||
"emailSent": "E-mail elküldve",
|
||||
"enableAPIKey": "API-kulcs engedélyezése",
|
||||
"failedToUnlock": "Nem sikerült feloldani",
|
||||
"forceUnlock": "Kényszerített feloldás",
|
||||
"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.",
|
||||
"forgotPasswordQuestion": "Elfelejtette jelszavát?",
|
||||
"generate": "Generálás",
|
||||
"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é?",
|
||||
"lockUntil": "Zárolás eddig",
|
||||
"logBackIn": "Jelentkezzen be újra",
|
||||
"logOut": "Kijelentkezés",
|
||||
"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.",
|
||||
"loggedOutInactivity": "Inaktivitás miatt kijelentkeztünk.",
|
||||
"loggedOutSuccessfully": "Sikeresen kijelentkezett.",
|
||||
"login": "Bejelentkezés",
|
||||
"loginAttempts": "Bejelentkezési kísérletek",
|
||||
"loginUser": "Bejelentkezés felhasználó",
|
||||
"loginWithAnotherUser": "Ha egy másik felhasználóval szeretne bejelentkezni, először <0>ki kell jelentkeznie</0>.",
|
||||
"logout": "Kijelentkezés",
|
||||
"logoutUser": "Felhasználó kijelentkezése",
|
||||
"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.",
|
||||
"newPassword": "Új jelszó",
|
||||
"resetPassword": "Jelszó visszaállítása",
|
||||
"resetPasswordExpiration": "Jelszóvisszaállítás lejárata",
|
||||
"resetPasswordToken": "Jelszóvisszaállító token",
|
||||
"resetYourPassword": "Jelszó visszaállítása",
|
||||
"stayLoggedIn": "Maradjon bejelentkezve",
|
||||
"successfullyUnlocked": "Sikeresen feloldva",
|
||||
"unableToVerify": "Sikertelen megerősítés",
|
||||
"verified": "Megerősítve",
|
||||
"verifiedSuccessfully": "Sikeresen megerősítve",
|
||||
"verify": "Megerősítés",
|
||||
"verifyUser": "Felhasználó megerősítése",
|
||||
"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?",
|
||||
"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."
|
||||
},
|
||||
"error": {
|
||||
"accountAlreadyActivated": "Ez a fiók már aktiválva van.",
|
||||
"autosaving": "Hiba történt a dokumentum automatikus mentése közben.",
|
||||
"correctInvalidFields": "Kérjük, javítsa ki az érvénytelen mezőket.",
|
||||
"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.",
|
||||
"emailOrPasswordIncorrect": "A megadott e-mail-cím vagy jelszó helytelen.",
|
||||
"followingFieldsInvalid_many": "A következő mezők érvénytelenek:",
|
||||
"followingFieldsInvalid_one": "A következő mező érvénytelen:",
|
||||
"incorrectCollection": "Helytelen gyűjtemény",
|
||||
"invalidFileType": "Érvénytelen fájltípus",
|
||||
"invalidFileTypeValue": "Érvénytelen fájltípus: {{value}}",
|
||||
"loadingDocument": "Hiba történt a {{id}} azonosítójú dokumentum betöltésekor.",
|
||||
"missingEmail": "Hiányzó e-mail.",
|
||||
"missingIDOfDocument": "Hiányzik a frissítendő dokumentum azonosítója.",
|
||||
"missingIDOfVersion": "A verzió azonosítója hiányzik.",
|
||||
"missingRequiredData": "Hiányoznak kötelező adatok.",
|
||||
"noFilesUploaded": "Nem került fájl feltöltésre.",
|
||||
"noMatchedField": "Nem található egyező mező a következőhöz: \"{{label}}\"",
|
||||
"noUser": "Nincs felhasználó",
|
||||
"notAllowedToAccessPage": "Ehhez az oldalhoz nem férhet hozzá.",
|
||||
"notAllowedToPerformAction": "Ezt a műveletet nem hajthatja végre.",
|
||||
"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.",
|
||||
"problemUploadingFile": "Hiba történt a fájl feltöltése közben.",
|
||||
"tokenInvalidOrExpired": "A token érvénytelen vagy lejárt.",
|
||||
"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}}.",
|
||||
"unableToUpdateCount": "Nem sikerült frissíteni {{count}}/{{total}} {{label}}.",
|
||||
"unauthorized": "Jogosulatlan, a kéréshez be kell jelentkeznie.",
|
||||
"unknown": "Ismeretlen 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.",
|
||||
"valueMustBeUnique": "Az értéknek egyedinek kell lennie",
|
||||
"verificationTokenInvalid": "Az ellenőrző token érvénytelen."
|
||||
},
|
||||
"fields": {
|
||||
"addLabel": "{{label}} hozzáadása",
|
||||
"addLink": "Link hozzáadása",
|
||||
"addNew": "Új hozzáadása",
|
||||
"addNewLabel": "Új {{label}} hozzáadása",
|
||||
"addRelationship": "Kapcsolat hozzáadása",
|
||||
"addUpload": "Feltöltés hozzáadása",
|
||||
"block": "blokk",
|
||||
"blockType": "Blokk típusa",
|
||||
"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.",
|
||||
"chooseDocumentToLink": "Válassza ki a dokumentumot, amelyre hivatkozni kíván",
|
||||
"chooseFromExisting": "Válasszon a meglévők közül",
|
||||
"chooseLabel": "Válassza ki a {{label}}",
|
||||
"collapseAll": "Mindet összecsuk",
|
||||
"customURL": "Egyéni URL",
|
||||
"editLabelData": "{{label}} adatok szerkesztése",
|
||||
"editLink": "Link szerkesztése",
|
||||
"editRelationship": "Kapcsolat hozzáadása",
|
||||
"enterURL": "Adjon meg egy URL-t",
|
||||
"internalLink": "Belső link",
|
||||
"itemsAndMore": "{{items}} és további {{count}}",
|
||||
"labelRelationship": "{{label}} Kapcsolat",
|
||||
"latitude": "Szélesség",
|
||||
"linkType": "Link típusa",
|
||||
"linkedTo": "Kapcsolódik a <0>{{label}}</0>",
|
||||
"longitude": "Hosszúság",
|
||||
"newLabel": "Új {{label}}",
|
||||
"openInNewTab": "Megnyitás új lapon",
|
||||
"passwordsDoNotMatch": "A jelszavak nem egyeznek.",
|
||||
"relatedDocument": "Kapcsolódó dokumentum",
|
||||
"relationTo": "Kapcsolat a következővel:",
|
||||
"removeRelationship": "Kapcsolat eltávolítása",
|
||||
"removeUpload": "Feltöltés eltávolítása",
|
||||
"saveChanges": "Módosítások mentése",
|
||||
"searchForBlock": "Blokk keresése",
|
||||
"selectExistingLabel": "Meglévő {{label}} kiválasztása",
|
||||
"selectFieldsToEdit": "Válassza ki a szerkeszteni kívánt mezőket",
|
||||
"showAll": "Az összes megjelenítése",
|
||||
"swapRelationship": "Kapcsolat csere",
|
||||
"swapUpload": "Feltöltés csere",
|
||||
"textToDisplay": "Megjelenítendő szöveg",
|
||||
"toggleBlock": "Blokk kinyitása",
|
||||
"uploadNewLabel": "Új {{label}} feltöltése"
|
||||
},
|
||||
"general": {
|
||||
"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_one": "Törölni készül {{count}} {{label}}",
|
||||
"aboutToDeleteCount_other": "Törölni készül {{count}} {{label}}",
|
||||
"addBelow": "Hozzáadás lent",
|
||||
"addFilter": "Szűrő hozzáadása",
|
||||
"adminTheme": "Admin téma",
|
||||
"and": "És",
|
||||
"ascending": "Növekvő",
|
||||
"automatic": "Automatikus",
|
||||
"backToDashboard": "Vissza az irányítópultra",
|
||||
"cancel": "Mégsem",
|
||||
"changesNotSaved": "A módosítások nem lettek mentve. Ha most távozik, elveszíti a változtatásokat.",
|
||||
"close": "Bezárás",
|
||||
"collections": "Gyűjtemények",
|
||||
"columnToSort": "Rendezendő oszlop",
|
||||
"columns": "Oszlopok",
|
||||
"confirm": "Megerősítés",
|
||||
"confirmDeletion": "Törlés megerősítése",
|
||||
"confirmDuplication": "Duplikáció megerősítése",
|
||||
"copied": "Másolva",
|
||||
"copy": "Másolás",
|
||||
"create": "Létrehozás",
|
||||
"createNew": "Új létrehozása",
|
||||
"createNewLabel": "Új {{label}} létrehozása",
|
||||
"created": "Létrehozva",
|
||||
"createdAt": "Létrehozva:",
|
||||
"creating": "Létrehozás",
|
||||
"dark": "Sötét",
|
||||
"dashboard": "Irányítópult",
|
||||
"delete": "Törlés",
|
||||
"deletedCountSuccessfully": "{{count}} {{label}} sikeresen törölve.",
|
||||
"deletedSuccessfully": "Sikeresen törölve.",
|
||||
"deleting": "Törlés...",
|
||||
"descending": "Csökkenő",
|
||||
"duplicate": "Duplikálás",
|
||||
"duplicateWithoutSaving": "Duplikálás a módosítások mentése nélkül",
|
||||
"edit": "Szerkesztés",
|
||||
"editLabel": "{{label}} szerkesztése",
|
||||
"editing": "Szerkesztés",
|
||||
"editingLabel_many": "{{count}} {{label}} szerkesztése",
|
||||
"editingLabel_one": "{{count}} {{label}} szerkesztése",
|
||||
"editingLabel_other": "{{count}} {{label}} szerkesztése",
|
||||
"email": "E-mail",
|
||||
"emailAddress": "E-mail cím",
|
||||
"enterAValue": "Adjon meg egy értéket",
|
||||
"fallbackToDefaultLocale": "Visszatérés az alapértelmezett nyelvhez",
|
||||
"filter": "Szűrő",
|
||||
"filterWhere": "Szűrő {{label}} ahol",
|
||||
"filters": "Szűrők",
|
||||
"globals": "Globálisok",
|
||||
"language": "Nyelv",
|
||||
"lastModified": "Utoljára módosítva",
|
||||
"leaveAnyway": "Távozás mindenképp",
|
||||
"leaveWithoutSaving": "Távozás mentés nélkül",
|
||||
"light": "Világos",
|
||||
"loading": "Betöltés",
|
||||
"locales": "Nyelvek",
|
||||
"moveDown": "Mozgatás lefelé",
|
||||
"moveUp": "Mozgatás felfelé",
|
||||
"newPassword": "Új jelszó",
|
||||
"noFiltersSet": "Nincs beállítva szűrő",
|
||||
"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.",
|
||||
"noValue": "Nincs érték",
|
||||
"none": "Semmi",
|
||||
"notFound": "Nem található",
|
||||
"nothingFound": "Nincs találat",
|
||||
"of": "a",
|
||||
"or": "Vagy",
|
||||
"order": "Sorrend",
|
||||
"pageNotFound": "Az oldal nem található",
|
||||
"password": "Jelszó",
|
||||
"payloadSettings": "Payload beállítások",
|
||||
"perPage": "Oldalanként: {{limit}}",
|
||||
"remove": "Törlés",
|
||||
"row": "Sor",
|
||||
"rows": "Sorok",
|
||||
"save": "Mentés",
|
||||
"saving": "Mentés...",
|
||||
"searchBy": "Keresés a következő szerint: {{label}}",
|
||||
"selectAll": "Az összes kijelölése: {{count}} {{label}}",
|
||||
"selectValue": "Válasszon ki egy értéket",
|
||||
"selectedCount": "{{count}} {{label}} kiválasztva",
|
||||
"sorryNotFound": "Sajnáljuk – nincs semmi, ami megfelelne a kérésének.",
|
||||
"sort": "Rendezés",
|
||||
"stayOnThisPage": "Maradjon ezen az oldalon",
|
||||
"submissionSuccessful": "Beküldés sikeres.",
|
||||
"submit": "Beküldés",
|
||||
"successfullyCreated": "{{label}} sikeresen létrehozva.",
|
||||
"successfullyDuplicated": "{{label}} sikeresen duplikálódott.",
|
||||
"thisLanguage": "Magyar",
|
||||
"titleDeleted": "{{label}} \"{{title}}\" sikeresen törölve.",
|
||||
"unauthorized": "Jogosulatlan",
|
||||
"unsavedChangesDuplicate": "Nem mentett módosításai vannak. Szeretné folytatni a duplikációt?",
|
||||
"untitled": "Névtelen",
|
||||
"updatedAt": "Frissítve:",
|
||||
"updatedCountSuccessfully": "{{count}} {{label}} sikeresen frissítve.",
|
||||
"updatedSuccessfully": "Sikeresen frissítve.",
|
||||
"updating": "Frissítés",
|
||||
"uploading": "Feltöltés",
|
||||
"user": "Felhasználó",
|
||||
"users": "Felhasználók",
|
||||
"welcome": "Üdvözöljük"
|
||||
},
|
||||
"operators": {
|
||||
"equals": "egyenlő",
|
||||
"isNotEqualTo": "nem egyenlő",
|
||||
"isIn": "benne van",
|
||||
"isNotIn": "nincs benne",
|
||||
"exists": "létezik",
|
||||
"isGreaterThan": "nagyobb, mint",
|
||||
"isLessThan": "kisebb, mint",
|
||||
"isLessThanOrEqualTo": "kisebb vagy egyenlő, mint",
|
||||
"isGreaterThanOrEqualTo": "nagyobb vagy egyenlő, mint",
|
||||
"near": "közel",
|
||||
"isLike": "olyan, mint",
|
||||
"contains": "tartalmaz"
|
||||
},
|
||||
"upload": {
|
||||
"dragAndDropHere": "vagy húzzon ide egy fájlt",
|
||||
"fileName": "Fájlnév",
|
||||
"fileSize": "Fájl mérete",
|
||||
"height": "Magasság",
|
||||
"lessInfo": "Kevesebb információ",
|
||||
"moreInfo": "További információ",
|
||||
"selectCollectionToBrowse": "Válassza ki a böngészni kívánt gyűjteményt",
|
||||
"selectFile": "Válasszon ki egy fájlt",
|
||||
"dragAndDrop": "Húzzon ide egy fájlt",
|
||||
"sizes": "Méretek",
|
||||
"width": "Szélesség"
|
||||
},
|
||||
"validation": {
|
||||
"emailAddress": "Kérjük, adjon meg egy érvényes e-mail címet.",
|
||||
"enterNumber": "Kérjük, adjon meg egy érvényes számot.",
|
||||
"fieldHasNo": "Ennek a mezőnek nincs {{label}}",
|
||||
"greaterThanMax": "\"{{value}}\" nagyobb, mint a megengedett maximális érték {{max}}.",
|
||||
"invalidInput": "Ez a mező érvénytelen értéket tartalmaz.",
|
||||
"invalidSelection": "Ez a mező érvénytelen kijelöléssel rendelkezik.",
|
||||
"invalidSelections": "Ez a mező a következő érvénytelen kijelöléseket tartalmazza:",
|
||||
"lessThanMin": "\"{{value}}\" kisebb, mint a megengedett minimális érték {{min}}.",
|
||||
"longerThanMin": "Ennek az értéknek hosszabbnak kell lennie, mint a minimális {{minLength}} karakter hosszúság.",
|
||||
"notValidDate": "\" {{value}} \" nem érvényes dátum.",
|
||||
"required": "Ez a mező kötelező.",
|
||||
"requiresAtLeast": "Ehhez a mezőhöz legalább {{count}} {{label}} szükséges.",
|
||||
"requiresNoMoreThan": "Ehhez a mezőhöz legfeljebb {{count}} {{label}} szükséges.",
|
||||
"requiresTwoNumbers": "Ehhez a mezőhöz két szám szükséges.",
|
||||
"shorterThanMax": "Ennek az értéknek rövidebbnek kell lennie, mint a maximálisan megengedett {{maxLength}} karakter.",
|
||||
"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?",
|
||||
"aboutToRestore": "Arra készül, hogy visszaállítsa ezt a {{label}} dokumentumot arra az állapotra, amelyben {{versionDate}} napon volt.",
|
||||
"aboutToRestoreGlobal": "Arra készül, hogy visszaállítsa a {{label}} 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?",
|
||||
"aboutToUnpublish": "A dokumentum közzétételének visszavonására készül. Biztos benne?",
|
||||
"aboutToUnpublishSelection": "Arra készül, hogy visszavonja a kijelölésben szereplő összes {{label}} közzétételét. biztos vagy ebben?",
|
||||
"autosave": "Automatikus mentés",
|
||||
"autosavedSuccessfully": "Automatikus mentés sikeres.",
|
||||
"autosavedVersion": "Automatikusan mentett verzió",
|
||||
"changed": "Megváltozott",
|
||||
"compareVersion": "Hasonlítsa össze a verziót a következőkkel:",
|
||||
"confirmPublish": "A közzététel megerősítése",
|
||||
"confirmRevertToSaved": "Erősítse meg a mentett verzióra való visszatérést",
|
||||
"confirmUnpublish": "A közzététel visszavonásának megerősítése",
|
||||
"confirmVersionRestoration": "Verzió-visszaállítás megerősítése",
|
||||
"currentDocumentStatus": "Jelenlegi {{docStatus}} dokumentum",
|
||||
"draft": "Piszkozat",
|
||||
"draftSavedSuccessfully": "A piszkozat sikeresen mentve.",
|
||||
"lastSavedAgo": "Utoljára mentve {{distance, relativetime(minutes)}}",
|
||||
"noFurtherVersionsFound": "További verziók nem találhatók",
|
||||
"noRowsFound": "Nem található {{label}}",
|
||||
"preview": "Előnézet",
|
||||
"problemRestoringVersion": "Hiba történt a verzió visszaállításakor",
|
||||
"publish": "Közzététel",
|
||||
"publishChanges": "Módosítások közzététele",
|
||||
"published": "Közzétett",
|
||||
"restoreThisVersion": "A verzió visszaállítása",
|
||||
"restoredSuccessfully": "Sikeresen visszaállítva.",
|
||||
"restoring": "Visszaállítás...",
|
||||
"revertToPublished": "Visszatérés a közzétetthez",
|
||||
"reverting": "Visszaállítás...",
|
||||
"saveDraft": "Piszkozat mentése",
|
||||
"selectLocales": "Megjelenítendő nyelvek kiválasztása",
|
||||
"selectVersionToCompare": "Válassza ki az összehasonlítani kívánt verziót",
|
||||
"showLocales": "Nyelvek megjelenítése:",
|
||||
"showingVersionsFor": "Verziók megjelenítése a következőkhöz:",
|
||||
"status": "Állapot",
|
||||
"type": "Típus",
|
||||
"unpublish": "Közzététel visszavonása",
|
||||
"unpublishing": "Közzététel visszavonása...",
|
||||
"version": "Verzió",
|
||||
"versionCount_many": "{{count}} verzió található",
|
||||
"versionCount_none": "Nem található verzió",
|
||||
"versionCount_one": "{{count}} verzió található",
|
||||
"versionCount_other": "{{count}} verzió található",
|
||||
"versionCreatedOn": "{{version}} létrehozva:",
|
||||
"versionID": "Verzióazonosító",
|
||||
"versions": "Verziók",
|
||||
"viewingVersion": "A(z) {{entityLabel}} {{documentTitle}} verziójának megtekintése",
|
||||
"viewingVersionGlobal": "A globális {{entityLabel}} verziójának megtekintése",
|
||||
"viewingVersions": "A {{entityLabel}} {{documentTitle}} verzióinak megtekintése",
|
||||
"viewingVersionsGlobal": "A globális {{entityLabel}} verzióinak megtekintése"
|
||||
}
|
||||
"$schema": "./translation-schema.json",
|
||||
"authentication": {
|
||||
"account": "Fiók",
|
||||
"accountOfCurrentUser": "Az aktuális felhasználó fiókja",
|
||||
"alreadyActivated": "Már aktiválva van",
|
||||
"alreadyLoggedIn": "Már bejelentkezett",
|
||||
"apiKey": "API-kulcs",
|
||||
"backToLogin": "Vissza a bejelentkezéshez",
|
||||
"beginCreateFirstUser": "Kezdésként hozza létre az első felhasználót.",
|
||||
"changePassword": "Jelszó módosítása",
|
||||
"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",
|
||||
"confirmPassword": "Jelszó megerősítése",
|
||||
"createFirstUser": "Első felhasználó létrehozása",
|
||||
"emailNotValid": "A megadott e-mail cím érvénytelen",
|
||||
"emailSent": "E-mail elküldve",
|
||||
"enableAPIKey": "API-kulcs engedélyezése",
|
||||
"failedToUnlock": "Nem sikerült feloldani",
|
||||
"forceUnlock": "Kényszerített feloldás",
|
||||
"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.",
|
||||
"forgotPasswordQuestion": "Elfelejtette jelszavát?",
|
||||
"generate": "Generálás",
|
||||
"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é?",
|
||||
"lockUntil": "Zárolás eddig",
|
||||
"logBackIn": "Jelentkezzen be újra",
|
||||
"logOut": "Kijelentkezés",
|
||||
"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.",
|
||||
"loggedOutInactivity": "Inaktivitás miatt kijelentkeztünk.",
|
||||
"loggedOutSuccessfully": "Sikeresen kijelentkezett.",
|
||||
"login": "Bejelentkezés",
|
||||
"loginAttempts": "Bejelentkezési kísérletek",
|
||||
"loginUser": "Bejelentkezés felhasználó",
|
||||
"loginWithAnotherUser": "Ha egy másik felhasználóval szeretne bejelentkezni, először <0>ki kell jelentkeznie</0>.",
|
||||
"logout": "Kijelentkezés",
|
||||
"logoutUser": "Felhasználó kijelentkezése",
|
||||
"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.",
|
||||
"newPassword": "Új jelszó",
|
||||
"resetPassword": "Jelszó visszaállítása",
|
||||
"resetPasswordExpiration": "Jelszóvisszaállítás lejárata",
|
||||
"resetPasswordToken": "Jelszóvisszaállító token",
|
||||
"resetYourPassword": "Jelszó visszaállítása",
|
||||
"stayLoggedIn": "Maradjon bejelentkezve",
|
||||
"successfullyUnlocked": "Sikeresen feloldva",
|
||||
"unableToVerify": "Sikertelen megerősítés",
|
||||
"verified": "Megerősítve",
|
||||
"verifiedSuccessfully": "Sikeresen megerősítve",
|
||||
"verify": "Megerősítés",
|
||||
"verifyUser": "Felhasználó megerősítése",
|
||||
"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?",
|
||||
"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."
|
||||
},
|
||||
"error": {
|
||||
"accountAlreadyActivated": "Ez a fiók már aktiválva van.",
|
||||
"autosaving": "Hiba történt a dokumentum automatikus mentése közben.",
|
||||
"correctInvalidFields": "Kérjük, javítsa ki az érvénytelen mezőket.",
|
||||
"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.",
|
||||
"emailOrPasswordIncorrect": "A megadott e-mail-cím vagy jelszó helytelen.",
|
||||
"followingFieldsInvalid_many": "A következő mezők érvénytelenek:",
|
||||
"followingFieldsInvalid_one": "A következő mező érvénytelen:",
|
||||
"incorrectCollection": "Helytelen gyűjtemény",
|
||||
"invalidFileType": "Érvénytelen fájltípus",
|
||||
"invalidFileTypeValue": "Érvénytelen fájltípus: {{value}}",
|
||||
"loadingDocument": "Hiba történt a {{id}} azonosítójú dokumentum betöltésekor.",
|
||||
"missingEmail": "Hiányzó e-mail.",
|
||||
"missingIDOfDocument": "Hiányzik a frissítendő dokumentum azonosítója.",
|
||||
"missingIDOfVersion": "A verzió azonosítója hiányzik.",
|
||||
"missingRequiredData": "Hiányoznak kötelező adatok.",
|
||||
"noFilesUploaded": "Nem került fájl feltöltésre.",
|
||||
"noMatchedField": "Nem található egyező mező a következőhöz: \"{{label}}\"",
|
||||
"noUser": "Nincs felhasználó",
|
||||
"notAllowedToAccessPage": "Ehhez az oldalhoz nem férhet hozzá.",
|
||||
"notAllowedToPerformAction": "Ezt a műveletet nem hajthatja végre.",
|
||||
"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.",
|
||||
"problemUploadingFile": "Hiba történt a fájl feltöltése közben.",
|
||||
"tokenInvalidOrExpired": "A token érvénytelen vagy lejárt.",
|
||||
"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}}.",
|
||||
"unableToUpdateCount": "Nem sikerült frissíteni {{count}}/{{total}} {{label}}.",
|
||||
"unauthorized": "Jogosulatlan, a kéréshez be kell jelentkeznie.",
|
||||
"unknown": "Ismeretlen 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.",
|
||||
"valueMustBeUnique": "Az értéknek egyedinek kell lennie",
|
||||
"verificationTokenInvalid": "Az ellenőrző token érvénytelen."
|
||||
},
|
||||
"fields": {
|
||||
"addLabel": "{{label}} hozzáadása",
|
||||
"addLink": "Link hozzáadása",
|
||||
"addNew": "Új hozzáadása",
|
||||
"addNewLabel": "Új {{label}} hozzáadása",
|
||||
"addRelationship": "Kapcsolat hozzáadása",
|
||||
"addUpload": "Feltöltés hozzáadása",
|
||||
"block": "blokk",
|
||||
"blockType": "Blokk típusa",
|
||||
"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.",
|
||||
"chooseDocumentToLink": "Válassza ki a dokumentumot, amelyre hivatkozni kíván",
|
||||
"chooseFromExisting": "Válasszon a meglévők közül",
|
||||
"chooseLabel": "Válassza ki a {{label}}",
|
||||
"collapseAll": "Mindet összecsuk",
|
||||
"customURL": "Egyéni URL",
|
||||
"editLabelData": "{{label}} adatok szerkesztése",
|
||||
"editLink": "Link szerkesztése",
|
||||
"editRelationship": "Kapcsolat hozzáadása",
|
||||
"enterURL": "Adjon meg egy URL-t",
|
||||
"internalLink": "Belső link",
|
||||
"itemsAndMore": "{{items}} és további {{count}}",
|
||||
"labelRelationship": "{{label}} Kapcsolat",
|
||||
"latitude": "Szélesség",
|
||||
"linkType": "Link típusa",
|
||||
"linkedTo": "Kapcsolódik a <0>{{label}}</0>",
|
||||
"longitude": "Hosszúság",
|
||||
"newLabel": "Új {{label}}",
|
||||
"openInNewTab": "Megnyitás új lapon",
|
||||
"passwordsDoNotMatch": "A jelszavak nem egyeznek.",
|
||||
"relatedDocument": "Kapcsolódó dokumentum",
|
||||
"relationTo": "Kapcsolat a következővel:",
|
||||
"removeRelationship": "Kapcsolat eltávolítása",
|
||||
"removeUpload": "Feltöltés eltávolítása",
|
||||
"saveChanges": "Módosítások mentése",
|
||||
"searchForBlock": "Blokk keresése",
|
||||
"selectExistingLabel": "Meglévő {{label}} kiválasztása",
|
||||
"selectFieldsToEdit": "Válassza ki a szerkeszteni kívánt mezőket",
|
||||
"showAll": "Az összes megjelenítése",
|
||||
"swapRelationship": "Kapcsolat csere",
|
||||
"swapUpload": "Feltöltés csere",
|
||||
"textToDisplay": "Megjelenítendő szöveg",
|
||||
"toggleBlock": "Blokk kinyitása",
|
||||
"uploadNewLabel": "Új {{label}} feltöltése"
|
||||
},
|
||||
"general": {
|
||||
"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_one": "Törölni készül {{count}} {{label}}",
|
||||
"aboutToDeleteCount_other": "Törölni készül {{count}} {{label}}",
|
||||
"addBelow": "Hozzáadás lent",
|
||||
"addFilter": "Szűrő hozzáadása",
|
||||
"adminTheme": "Admin téma",
|
||||
"and": "És",
|
||||
"ascending": "Növekvő",
|
||||
"automatic": "Automatikus",
|
||||
"backToDashboard": "Vissza az irányítópultra",
|
||||
"cancel": "Mégsem",
|
||||
"changesNotSaved": "A módosítások nem lettek mentve. Ha most távozik, elveszíti a változtatásokat.",
|
||||
"close": "Bezárás",
|
||||
"collections": "Gyűjtemények",
|
||||
"columnToSort": "Rendezendő oszlop",
|
||||
"columns": "Oszlopok",
|
||||
"confirm": "Megerősítés",
|
||||
"confirmDeletion": "Törlés megerősítése",
|
||||
"confirmDuplication": "Duplikáció megerősítése",
|
||||
"copied": "Másolva",
|
||||
"copy": "Másolás",
|
||||
"create": "Létrehozás",
|
||||
"createNew": "Új létrehozása",
|
||||
"createNewLabel": "Új {{label}} létrehozása",
|
||||
"created": "Létrehozva",
|
||||
"createdAt": "Létrehozva:",
|
||||
"creating": "Létrehozás",
|
||||
"dark": "Sötét",
|
||||
"dashboard": "Irányítópult",
|
||||
"delete": "Törlés",
|
||||
"deletedCountSuccessfully": "{{count}} {{label}} sikeresen törölve.",
|
||||
"deletedSuccessfully": "Sikeresen törölve.",
|
||||
"deleting": "Törlés...",
|
||||
"descending": "Csökkenő",
|
||||
"duplicate": "Duplikálás",
|
||||
"duplicateWithoutSaving": "Duplikálás a módosítások mentése nélkül",
|
||||
"edit": "Szerkesztés",
|
||||
"editLabel": "{{label}} szerkesztése",
|
||||
"editing": "Szerkesztés",
|
||||
"editingLabel_many": "{{count}} {{label}} szerkesztése",
|
||||
"editingLabel_one": "{{count}} {{label}} szerkesztése",
|
||||
"editingLabel_other": "{{count}} {{label}} szerkesztése",
|
||||
"email": "E-mail",
|
||||
"emailAddress": "E-mail cím",
|
||||
"enterAValue": "Adjon meg egy értéket",
|
||||
"fallbackToDefaultLocale": "Visszatérés az alapértelmezett nyelvhez",
|
||||
"filter": "Szűrő",
|
||||
"filterWhere": "Szűrő {{label}} ahol",
|
||||
"filters": "Szűrők",
|
||||
"globals": "Globálisok",
|
||||
"language": "Nyelv",
|
||||
"lastModified": "Utoljára módosítva",
|
||||
"leaveAnyway": "Távozás mindenképp",
|
||||
"leaveWithoutSaving": "Távozás mentés nélkül",
|
||||
"light": "Világos",
|
||||
"loading": "Betöltés",
|
||||
"locales": "Nyelvek",
|
||||
"moveDown": "Mozgatás lefelé",
|
||||
"moveUp": "Mozgatás felfelé",
|
||||
"newPassword": "Új jelszó",
|
||||
"noFiltersSet": "Nincs beállítva szűrő",
|
||||
"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.",
|
||||
"noValue": "Nincs érték",
|
||||
"none": "Semmi",
|
||||
"notFound": "Nem található",
|
||||
"nothingFound": "Nincs találat",
|
||||
"of": "a",
|
||||
"or": "Vagy",
|
||||
"order": "Sorrend",
|
||||
"pageNotFound": "Az oldal nem található",
|
||||
"password": "Jelszó",
|
||||
"payloadSettings": "Payload beállítások",
|
||||
"perPage": "Oldalanként: {{limit}}",
|
||||
"remove": "Törlés",
|
||||
"row": "Sor",
|
||||
"rows": "Sorok",
|
||||
"save": "Mentés",
|
||||
"saving": "Mentés...",
|
||||
"searchBy": "Keresés a következő szerint: {{label}}",
|
||||
"selectAll": "Az összes kijelölése: {{count}} {{label}}",
|
||||
"selectValue": "Válasszon ki egy értéket",
|
||||
"selectedCount": "{{count}} {{label}} kiválasztva",
|
||||
"sorryNotFound": "Sajnáljuk – nincs semmi, ami megfelelne a kérésének.",
|
||||
"sort": "Rendezés",
|
||||
"stayOnThisPage": "Maradjon ezen az oldalon",
|
||||
"submissionSuccessful": "Beküldés sikeres.",
|
||||
"submit": "Beküldés",
|
||||
"successfullyCreated": "{{label}} sikeresen létrehozva.",
|
||||
"successfullyDuplicated": "{{label}} sikeresen duplikálódott.",
|
||||
"thisLanguage": "Magyar",
|
||||
"titleDeleted": "{{label}} \"{{title}}\" sikeresen törölve.",
|
||||
"unauthorized": "Jogosulatlan",
|
||||
"unsavedChangesDuplicate": "Nem mentett módosításai vannak. Szeretné folytatni a duplikációt?",
|
||||
"untitled": "Névtelen",
|
||||
"updatedAt": "Frissítve:",
|
||||
"updatedCountSuccessfully": "{{count}} {{label}} sikeresen frissítve.",
|
||||
"updatedSuccessfully": "Sikeresen frissítve.",
|
||||
"updating": "Frissítés",
|
||||
"uploading": "Feltöltés",
|
||||
"user": "Felhasználó",
|
||||
"users": "Felhasználók",
|
||||
"value": "Érték",
|
||||
"welcome": "Üdvözöljük"
|
||||
},
|
||||
"operators": {
|
||||
"equals": "egyenlő",
|
||||
"isNotEqualTo": "nem egyenlő",
|
||||
"isIn": "benne van",
|
||||
"isNotIn": "nincs benne",
|
||||
"exists": "létezik",
|
||||
"isGreaterThan": "nagyobb, mint",
|
||||
"isLessThan": "kisebb, mint",
|
||||
"isLessThanOrEqualTo": "kisebb vagy egyenlő, mint",
|
||||
"isGreaterThanOrEqualTo": "nagyobb vagy egyenlő, mint",
|
||||
"near": "közel",
|
||||
"isLike": "olyan, mint",
|
||||
"contains": "tartalmaz"
|
||||
},
|
||||
"upload": {
|
||||
"dragAndDropHere": "vagy húzzon ide egy fájlt",
|
||||
"fileName": "Fájlnév",
|
||||
"fileSize": "Fájl mérete",
|
||||
"height": "Magasság",
|
||||
"lessInfo": "Kevesebb információ",
|
||||
"moreInfo": "További információ",
|
||||
"selectCollectionToBrowse": "Válassza ki a böngészni kívánt gyűjteményt",
|
||||
"selectFile": "Válasszon ki egy fájlt",
|
||||
"dragAndDrop": "Húzzon ide egy fájlt",
|
||||
"sizes": "Méretek",
|
||||
"width": "Szélesség"
|
||||
},
|
||||
"validation": {
|
||||
"emailAddress": "Kérjük, adjon meg egy érvényes e-mail címet.",
|
||||
"enterNumber": "Kérjük, adjon meg egy érvényes számot.",
|
||||
"fieldHasNo": "Ennek a mezőnek nincs {{label}}",
|
||||
"greaterThanMax": "{{value}} nagyobb, mint a megengedett maximum {{label}} érték, ami {{max}}.",
|
||||
"invalidInput": "Ez a mező érvénytelen értéket tartalmaz.",
|
||||
"invalidSelection": "Ez a mező érvénytelen kijelöléssel rendelkezik.",
|
||||
"invalidSelections": "Ez a mező a következő érvénytelen kijelöléseket tartalmazza:",
|
||||
"lessThanMin": "{{value}} kisebb, mint a megengedett minimum {{label}} érték, ami {{min}}.",
|
||||
"longerThanMin": "Ennek az értéknek hosszabbnak kell lennie, mint a minimális {{minLength}} karakter hosszúság.",
|
||||
"notValidDate": "\" {{value}} \" nem érvényes dátum.",
|
||||
"required": "Ez a mező kötelező.",
|
||||
"requiresAtLeast": "Ehhez a mezőhöz legalább {{count}} {{label}} szükséges.",
|
||||
"requiresNoMoreThan": "Ehhez a mezőhöz legfeljebb {{count}} {{label}} szükséges.",
|
||||
"requiresTwoNumbers": "Ehhez a mezőhöz két szám szükséges.",
|
||||
"shorterThanMax": "Ennek az értéknek rövidebbnek kell lennie, mint a maximálisan megengedett {{maxLength}} karakter.",
|
||||
"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?",
|
||||
"aboutToRestore": "Arra készül, hogy visszaállítsa ezt a {{label}} dokumentumot arra az állapotra, amelyben {{versionDate}} napon volt.",
|
||||
"aboutToRestoreGlobal": "Arra készül, hogy visszaállítsa a {{label}} 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?",
|
||||
"aboutToUnpublish": "A dokumentum közzétételének visszavonására készül. Biztos benne?",
|
||||
"aboutToUnpublishSelection": "Arra készül, hogy visszavonja a kijelölésben szereplő összes {{label}} közzétételét. biztos vagy ebben?",
|
||||
"autosave": "Automatikus mentés",
|
||||
"autosavedSuccessfully": "Automatikus mentés sikeres.",
|
||||
"autosavedVersion": "Automatikusan mentett verzió",
|
||||
"changed": "Megváltozott",
|
||||
"compareVersion": "Hasonlítsa össze a verziót a következőkkel:",
|
||||
"confirmPublish": "A közzététel megerősítése",
|
||||
"confirmRevertToSaved": "Erősítse meg a mentett verzióra való visszatérést",
|
||||
"confirmUnpublish": "A közzététel visszavonásának megerősítése",
|
||||
"confirmVersionRestoration": "Verzió-visszaállítás megerősítése",
|
||||
"currentDocumentStatus": "Jelenlegi {{docStatus}} dokumentum",
|
||||
"draft": "Piszkozat",
|
||||
"draftSavedSuccessfully": "A piszkozat sikeresen mentve.",
|
||||
"lastSavedAgo": "Utoljára mentve {{distance, relativetime(minutes)}}",
|
||||
"noFurtherVersionsFound": "További verziók nem találhatók",
|
||||
"noRowsFound": "Nem található {{label}}",
|
||||
"preview": "Előnézet",
|
||||
"problemRestoringVersion": "Hiba történt a verzió visszaállításakor",
|
||||
"publish": "Közzététel",
|
||||
"publishChanges": "Módosítások közzététele",
|
||||
"published": "Közzétett",
|
||||
"restoreThisVersion": "A verzió visszaállítása",
|
||||
"restoredSuccessfully": "Sikeresen visszaállítva.",
|
||||
"restoring": "Visszaállítás...",
|
||||
"revertToPublished": "Visszatérés a közzétetthez",
|
||||
"reverting": "Visszaállítás...",
|
||||
"saveDraft": "Piszkozat mentése",
|
||||
"selectLocales": "Megjelenítendő nyelvek kiválasztása",
|
||||
"selectVersionToCompare": "Válassza ki az összehasonlítani kívánt verziót",
|
||||
"showLocales": "Nyelvek megjelenítése:",
|
||||
"showingVersionsFor": "Verziók megjelenítése a következőkhöz:",
|
||||
"status": "Állapot",
|
||||
"type": "Típus",
|
||||
"unpublish": "Közzététel visszavonása",
|
||||
"unpublishing": "Közzététel visszavonása...",
|
||||
"version": "Verzió",
|
||||
"versionCount_many": "{{count}} verzió található",
|
||||
"versionCount_none": "Nem található verzió",
|
||||
"versionCount_one": "{{count}} verzió található",
|
||||
"versionCount_other": "{{count}} verzió található",
|
||||
"versionCreatedOn": "{{version}} létrehozva:",
|
||||
"versionID": "Verzióazonosító",
|
||||
"versions": "Verziók",
|
||||
"viewingVersion": "A(z) {{entityLabel}} {{documentTitle}} verziójának megtekintése",
|
||||
"viewingVersionGlobal": "A globális {{entityLabel}} verziójának megtekintése",
|
||||
"viewingVersions": "A {{entityLabel}} {{documentTitle}} verzióinak megtekintése",
|
||||
"viewingVersionsGlobal": "A globális {{entityLabel}} verzióinak megtekintése"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -241,6 +241,7 @@
|
||||
"uploading": "Caricamento",
|
||||
"user": "Utente",
|
||||
"users": "Utenti",
|
||||
"value": "Valore",
|
||||
"welcome": "Benvenuto"
|
||||
},
|
||||
"operators": {
|
||||
@@ -274,11 +275,11 @@
|
||||
"emailAddress": "Si prega di inserire un indirizzo email valido.",
|
||||
"enterNumber": "Si prega di inserire un numero valido.",
|
||||
"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.",
|
||||
"invalidSelection": "Questo campo ha una selezione non valida.",
|
||||
"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.",
|
||||
"notValidDate": "\"{{value}}\" non è una data valida.",
|
||||
"required": "Questo campo è obbligatorio.",
|
||||
|
||||
@@ -230,6 +230,7 @@
|
||||
"uploading": "アップロード中",
|
||||
"user": "ユーザー",
|
||||
"users": "ユーザー",
|
||||
"value": "値",
|
||||
"welcome": "ようこそ"
|
||||
},
|
||||
"operators": {
|
||||
@@ -263,11 +264,11 @@
|
||||
"emailAddress": "有効なメールアドレスを入力してください。",
|
||||
"enterNumber": "有効な数値を入力してください。",
|
||||
"fieldHasNo": "{{label}} が必要です。",
|
||||
"greaterThanMax": "\"{{value}}\" ではなく、{{max}} 以下の値にする必要があります。",
|
||||
"greaterThanMax": "{{value}}は許容最大{{label}}の{{max}}を超えています。",
|
||||
"invalidInput": "無効な入力値です。",
|
||||
"invalidSelection": "無効な選択です。",
|
||||
"invalidSelections": "次の無効な選択があります: ",
|
||||
"lessThanMin": "\"{{value}}\" ではなく、{{min}} 以上の値にする必要があります。",
|
||||
"lessThanMin": "{{value}}は許容最小{{label}}の{{min}}未満です。",
|
||||
"longerThanMin": "{{minLength}} 文字以上にする必要があります。",
|
||||
"notValidDate": "\"{{value}}\" は有効な日付ではありません。",
|
||||
"required": "必須フィールドです。",
|
||||
|
||||
@@ -241,6 +241,7 @@
|
||||
"uploading": "တင်ပေးနေသည်",
|
||||
"user": "အသုံးပြုသူ",
|
||||
"users": "အသုံးပြုသူများ",
|
||||
"value": "တန်ဖိုး",
|
||||
"welcome": "ကြိုဆိုပါတယ်။"
|
||||
},
|
||||
"operators": {
|
||||
@@ -274,11 +275,11 @@
|
||||
"emailAddress": "မှန်ကန်သော အီးမေးလ်လိပ်စာကို ထည့်သွင်းပါ။",
|
||||
"enterNumber": "မှန်ကန်သောနံပါတ်တစ်ခုထည့်ပါ။",
|
||||
"fieldHasNo": "ဤအကွက်တွင် {{label}} မရှိပါ။",
|
||||
"greaterThanMax": "\"{{value}}\" သည် {{max}} ၏ အများဆုံးခွင့်ပြုထားသော တန်ဖိုးထက် ကြီးသည်။",
|
||||
"greaterThanMax": "{{value}} သည် {{max}} ထက် ပိုမိုကြီးသည်။ ဤသည်ဖြင့် {{label}} အများဆုံးခွင့်ပြုထားသော တန်ဖိုးထက် ကြီးသည်။",
|
||||
"invalidInput": "ဤအကွက်တွင် မမှန်ကန်သော ထည့်သွင်းမှုတစ်ခုရှိသည်။",
|
||||
"invalidSelection": "ဤအကွက်တွင် မမှန်ကန်သော ရွေးချယ်မှုတစ်ခုရှိသည်။",
|
||||
"invalidSelections": "ဤအကွက်တွင် အောက်ပါ မမှန်ကန်သော ရွေးချယ်မှုများ ရှိသည်",
|
||||
"lessThanMin": "\"{{value}}\" သည် {{min}} ၏ အနည်းဆုံးခွင့်ပြုထားသော တန်ဖိုးထက်နည်းသည်။",
|
||||
"lessThanMin": "{{value}} သည် {{min}} ထက် ပိုမိုနိမ့်သည်။ ဤသည်ဖြင့် {{label}} အနည်းဆုံးခွင့်ပြုထားသော တန်ဖိုးထက် နိမ့်သည်။",
|
||||
"longerThanMin": "ဤတန်ဖိုးသည် အနိမ့်ဆုံးအရှည် {{minLength}} စာလုံးထက် ပိုရှည်ရမည်။",
|
||||
"notValidDate": "\"{{value}}\" သည် တရားဝင်ရက်စွဲမဟုတ်ပါ။",
|
||||
"required": "ဤအကွက်ကို လိုအပ်သည်။",
|
||||
|
||||
@@ -241,6 +241,7 @@
|
||||
"uploading": "Opplasting",
|
||||
"user": "Bruker",
|
||||
"users": "Brukere",
|
||||
"value": "Verdi",
|
||||
"welcome": "Velkommen"
|
||||
},
|
||||
"operators": {
|
||||
@@ -274,11 +275,11 @@
|
||||
"emailAddress": "Vennligst skriv inn en gyldig e-postadresse.",
|
||||
"enterNumber": "Vennligst skriv inn et gyldig tall.",
|
||||
"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.",
|
||||
"invalidSelection": "Dette feltet har en ugyldig 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.",
|
||||
"notValidDate": "\"{{value}}\" er ikke en gyldig dato.",
|
||||
"required": "Dette feltet er påkrevd.",
|
||||
|
||||
@@ -241,6 +241,7 @@
|
||||
"uploading": "Uploaden",
|
||||
"user": "Gebruiker",
|
||||
"users": "Gebruikers",
|
||||
"value": "Waarde",
|
||||
"welcome": "Welkom"
|
||||
},
|
||||
"operators": {
|
||||
@@ -274,11 +275,11 @@
|
||||
"emailAddress": "Voer een geldig e-mailadres in.",
|
||||
"enterNumber": "Voer een geldig nummer in.",
|
||||
"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.",
|
||||
"invalidSelection": "Dit veld heeft een ongeldige selectie.",
|
||||
"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.",
|
||||
"notValidDate": "\"{{value}}\" is geen geldige datum.",
|
||||
"required": "Dit veld is verplicht.",
|
||||
|
||||
@@ -241,6 +241,7 @@
|
||||
"uploading": "Wgrywanie",
|
||||
"user": "użytkownik",
|
||||
"users": "użytkownicy",
|
||||
"value": "Wartość",
|
||||
"welcome": "Witaj"
|
||||
},
|
||||
"operators": {
|
||||
@@ -274,11 +275,11 @@
|
||||
"emailAddress": "Wprowadź poprawny adres email.",
|
||||
"enterNumber": "Wprowadź poprawny numer telefonu.",
|
||||
"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.",
|
||||
"invalidSelection": "To pole ma nieprawidłowy wybór.",
|
||||
"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}}.",
|
||||
"notValidDate": "\"{{value}}\" nie jest prawidłową datą.",
|
||||
"required": "To pole jest wymagane.",
|
||||
|
||||
@@ -241,6 +241,7 @@
|
||||
"uploading": "Fazendo upload",
|
||||
"user": "usuário",
|
||||
"users": "usuários",
|
||||
"value": "Valor",
|
||||
"welcome": "Boas vindas"
|
||||
},
|
||||
"operators": {
|
||||
@@ -274,11 +275,11 @@
|
||||
"emailAddress": "Por favor, insira um endereço de email válido.",
|
||||
"enterNumber": "Por favor, insira um número válido.",
|
||||
"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.",
|
||||
"invalidSelection": "Esse campo tem uma seleção inválida.",
|
||||
"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.",
|
||||
"notValidDate": "\"{{value}}\" não é uma data válida.",
|
||||
"required": "Esse campo é obrigatório.",
|
||||
|
||||
@@ -241,6 +241,7 @@
|
||||
"uploading": "Încărcare",
|
||||
"user": "Utilizator",
|
||||
"users": "Utilizatori",
|
||||
"value": "Valoare",
|
||||
"welcome": "Bine ați venit"
|
||||
},
|
||||
"operators": {
|
||||
@@ -274,11 +275,11 @@
|
||||
"emailAddress": "Vă rugăm să introduceți o adresă de email validă.",
|
||||
"enterNumber": "Vă rugăm să introduceți un număr valid.",
|
||||
"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ă.",
|
||||
"invalidSelection": "Acest câmp are o selecție invalidă.",
|
||||
"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.",
|
||||
"notValidDate": "\"{{value}}\" nu este o dată valabilă.",
|
||||
"required": "Acest câmp este obligatoriu.",
|
||||
|
||||
@@ -241,6 +241,7 @@
|
||||
"uploading": "Загрузка",
|
||||
"user": "пользователь",
|
||||
"users": "пользователи",
|
||||
"value": "Значение",
|
||||
"welcome": "Добро пожаловать"
|
||||
},
|
||||
"operators": {
|
||||
@@ -274,11 +275,11 @@
|
||||
"emailAddress": "Пожалуйста, введите корректный адрес email.",
|
||||
"enterNumber": "Пожалуйста, введите корректный номер.",
|
||||
"fieldHasNo": "У этого поля нет {{label}}",
|
||||
"greaterThanMax": "\"{{value}}\" больше максимально допустимого значения {{max}}.",
|
||||
"greaterThanMax": "{{value}} больше максимально допустимого значения {{label}} {{max}}.",
|
||||
"invalidInput": "Это поле имеет недопустимое значение.",
|
||||
"invalidSelection": "В этом поле выбран недопустимый вариант.",
|
||||
"invalidSelections": "'Это поле содержит следующие неправильные варианты:'",
|
||||
"lessThanMin": "\"{{value}}\" меньше минимально допустимого значения {{min}}.",
|
||||
"lessThanMin": "{{value}} меньше минимально допустимого значения {{label}} {{min}}.",
|
||||
"longerThanMin": "Это значение должно быть больше минимальной длины символов: {{minLength}}.",
|
||||
"notValidDate": "\"{{value}}\" это не действительная дата.",
|
||||
"required": "Это обязательное поле.",
|
||||
|
||||
@@ -241,6 +241,7 @@
|
||||
"uploading": "Uppladdning",
|
||||
"user": "Användare",
|
||||
"users": "Användare",
|
||||
"value": "Värde",
|
||||
"welcome": "Välkommen"
|
||||
},
|
||||
"operators": {
|
||||
@@ -274,11 +275,11 @@
|
||||
"emailAddress": "Vänligen ange en giltig e-postadress.",
|
||||
"enterNumber": "Vänligen skriv in ett giltigt nummer.",
|
||||
"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.",
|
||||
"invalidSelection": "Det här fältet har ett ogiltigt urval.",
|
||||
"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.",
|
||||
"notValidDate": "\"{{value}}\" är inte ett giltigt datum.",
|
||||
"required": "Detta fält är obligatoriskt.",
|
||||
|
||||
@@ -241,6 +241,7 @@
|
||||
"uploading": "กำลังอัปโหลด",
|
||||
"user": "ผู้ใช้",
|
||||
"users": "ผู้ใช้",
|
||||
"value": "ค่า",
|
||||
"welcome": "ยินดีต้อนรับ"
|
||||
},
|
||||
"operators": {
|
||||
@@ -274,11 +275,11 @@
|
||||
"emailAddress": "กรุณาระบุอีเมลที่ถูกต้อง",
|
||||
"enterNumber": "กรุณาระบุตัวเลขที่ถูกต้อง",
|
||||
"fieldHasNo": "ช่องนี้ไม่มี {{label}}",
|
||||
"greaterThanMax": "\"{{value}}\" มีค่ามากกว่าค่าสูงสุดที่กำหนดคือ {{max}}",
|
||||
"greaterThanMax": "{{value}} มากกว่าค่าสูงสุดที่อนุญาตของ {{label}} ซึ่งคือ {{max}}.",
|
||||
"invalidInput": "ข้อมูลไม่ถูกต้อง",
|
||||
"invalidSelection": "ค่าที่เลือกไม่ถูกต้อง",
|
||||
"invalidSelections": "ค่าที่เลือกไม่ถูกต้องดังนี้:",
|
||||
"lessThanMin": "\"{{value}}\" มีค่าน้อยกว่าค่าต่ำสุดที่กำหนดคือ {{min}}",
|
||||
"lessThanMin": "{{value}} น้อยกว่าค่าต่ำสุดที่อนุญาตของ {{label}} ซึ่งคือ {{min}}.",
|
||||
"longerThanMin": "ค่าต้องมีความยาวมากกว่า {{minLength}} ตัวอักษร",
|
||||
"notValidDate": "วันที่ \"{{value}}\" ไม่ถูกต้อง",
|
||||
"required": "จำเป็นต้องระบุค่า",
|
||||
|
||||
@@ -241,6 +241,7 @@
|
||||
"uploading": "Yükleniyor",
|
||||
"user": "kullanıcı",
|
||||
"users": "kullanıcı",
|
||||
"value": "Değer",
|
||||
"welcome": "Hoşgeldiniz"
|
||||
},
|
||||
"operators": {
|
||||
@@ -274,11 +275,11 @@
|
||||
"emailAddress": "Lütfen geçerli bir e-posta adresi girin.",
|
||||
"enterNumber": "Lütfen geçerli bir sayı girin.",
|
||||
"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.",
|
||||
"invalidSelection": "Bu alanda geçersiz bir seçim mevcut.",
|
||||
"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.",
|
||||
"notValidDate": "\"{{value}}\" geçerli bir tarih değil.",
|
||||
"required": "Bu alan gereklidir.",
|
||||
|
||||
@@ -863,6 +863,9 @@
|
||||
"users": {
|
||||
"type": "string"
|
||||
},
|
||||
"value": {
|
||||
"type": "string"
|
||||
},
|
||||
"welcome": {
|
||||
"type": "string"
|
||||
}
|
||||
@@ -976,37 +979,37 @@
|
||||
"equals": {
|
||||
"type": "string"
|
||||
},
|
||||
"isNotEqualTo":{
|
||||
"isNotEqualTo": {
|
||||
"type": "string"
|
||||
},
|
||||
"isIn": {
|
||||
"type": "string"
|
||||
},
|
||||
"isNotIn":{
|
||||
"isNotIn": {
|
||||
"type": "string"
|
||||
},
|
||||
"exists": {
|
||||
"type": "string"
|
||||
},
|
||||
"isGreaterThan":{
|
||||
"isGreaterThan": {
|
||||
"type": "string"
|
||||
},
|
||||
"isLessThan": {
|
||||
"type": "string"
|
||||
},
|
||||
"isLessThanOrEqualTo":{
|
||||
"isLessThanOrEqualTo": {
|
||||
"type": "string"
|
||||
},
|
||||
"isGreaterThanOrEqualTo": {
|
||||
"type": "string"
|
||||
},
|
||||
"near":{
|
||||
"near": {
|
||||
"type": "string"
|
||||
},
|
||||
"isLike": {
|
||||
"type": "string"
|
||||
},
|
||||
"contains":{
|
||||
"contains": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
|
||||
@@ -237,6 +237,7 @@
|
||||
"uploading": "завантаження",
|
||||
"user": "Користувач",
|
||||
"users": "Користувачі",
|
||||
"value": "Значення",
|
||||
"welcome": "Вітаю"
|
||||
},
|
||||
"operators": {
|
||||
@@ -270,11 +271,11 @@
|
||||
"emailAddress": "Будь ласка, введіть валідну email адресу.",
|
||||
"enterNumber": "Будь ласка, введіть валідний номер.",
|
||||
"fieldHasNo": "В цього поля немає {{label}}",
|
||||
"greaterThanMax": "\"{{value}}\" більше максимального значення {{max}}.",
|
||||
"greaterThanMax": "{{value}} більше, ніж дозволено максимуму {{label}} в {{max}}.",
|
||||
"invalidInput": "У цьому полі введено некоректне значення.",
|
||||
"invalidSelection": "Це поле має некоректний вибір.",
|
||||
"invalidSelections": "Це поле має наступні невірні варіанти вибору:",
|
||||
"lessThanMin": "\"{{value}}\" менше мінімально допустимого значення {{min}}.",
|
||||
"lessThanMin": "{{value}} менше, ніж дозволено мінімуму {{label}} в {{min}}.",
|
||||
"longerThanMin": "Це значення має бути більше, ніж мінімальна довжина {{minLength}} characters.",
|
||||
"notValidDate": "\"{{value}}\" - некоректна дата.",
|
||||
"required": "Це поле є обов'язковим.",
|
||||
|
||||
@@ -240,6 +240,7 @@
|
||||
"uploading": "Đang tải lên",
|
||||
"user": "Người dùng",
|
||||
"users": "Người dùng",
|
||||
"value": "Giá trị",
|
||||
"welcome": "Xin chào"
|
||||
},
|
||||
"operators": {
|
||||
@@ -273,11 +274,11 @@
|
||||
"emailAddress": "Địa chỉ email không hợp lệ.",
|
||||
"enterNumber": "Vui lòng nhập số.",
|
||||
"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ệ.",
|
||||
"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:'",
|
||||
"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ự.",
|
||||
"notValidDate": "\"{{value}}\" không phải là một ngày (date) hợp lệ.",
|
||||
"required": "Field này cần được diền.",
|
||||
|
||||
@@ -239,6 +239,7 @@
|
||||
"updatedSuccessfully": "更新成功。",
|
||||
"user": "用户",
|
||||
"users": "用户",
|
||||
"value": "值",
|
||||
"welcome": "欢迎"
|
||||
},
|
||||
"operators": {
|
||||
@@ -272,11 +273,11 @@
|
||||
"emailAddress": "请输入一个有效的电子邮件地址。",
|
||||
"enterNumber": "请输入一个有效的号码。",
|
||||
"fieldHasNo": "这个字段没有{{label}}",
|
||||
"greaterThanMax": "\"{{value}}\"大于{{max}}的最大允许值",
|
||||
"greaterThanMax": "{{value}}超过了允许的最大{{label}},该最大值为{{max}}。",
|
||||
"invalidInput": "这个字段有一个无效的输入。",
|
||||
"invalidSelection": "这个字段有一个无效的选择。",
|
||||
"invalidSelections": "这个字段有以下无效的选择:",
|
||||
"lessThanMin": "{{value}}小于{{min}}的最小允许值",
|
||||
"lessThanMin": "{{value}}小于允许的最小{{label}},该最小值为{{min}}。",
|
||||
"longerThanMin": "该值必须大于{{minLength}}字符的最小长度",
|
||||
"notValidDate": "\"{{value}}\"不是一个有效的日期。",
|
||||
"required": "该字段为必填项目。",
|
||||
|
||||
@@ -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 }) => {
|
||||
acc[slug] = {
|
||||
$ref: `#/definitions/${slug}`,
|
||||
@@ -72,7 +75,11 @@ function fieldsToJSONSchema(collectionIDFieldTypes: { [key: string]: 'string' |
|
||||
}
|
||||
|
||||
case 'number': {
|
||||
fieldSchema = { type: 'number' };
|
||||
if (field.hasMany === true) {
|
||||
fieldSchema = { type: 'array', items: { type: 'number' } };
|
||||
} else {
|
||||
fieldSchema = { type: 'number' };
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
export function isNumber(value: unknown): boolean {
|
||||
if (typeof value === 'string' && value.trim() === ''){
|
||||
return false
|
||||
}
|
||||
|
||||
return !Number.isNaN(Number(value));
|
||||
}
|
||||
}
|
||||
@@ -47,6 +47,30 @@ const NumberFields: CollectionConfig = {
|
||||
type: 'number',
|
||||
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,
|
||||
decimalMin: 1.25,
|
||||
decimalMax: 0.25,
|
||||
hasMany: [5, 10, 15],
|
||||
validatesHasMany: [5],
|
||||
localizedHasMany: [10],
|
||||
};
|
||||
|
||||
export default NumberFields;
|
||||
|
||||
@@ -12,6 +12,7 @@ import { tabsSlug } from './collections/Tabs';
|
||||
import { collapsibleFieldsSlug } from './collections/Collapsible';
|
||||
import wait from '../../src/utilities/wait';
|
||||
import { jsonDoc } from './collections/JSON';
|
||||
import { numberDoc } from './collections/Number';
|
||||
|
||||
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', () => {
|
||||
let url: AdminUrlUtil;
|
||||
beforeAll(() => {
|
||||
|
||||
@@ -194,6 +194,25 @@ describe('Fields', () => {
|
||||
},
|
||||
})).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', () => {
|
||||
|
||||
@@ -35,13 +35,15 @@ export interface Config {
|
||||
export interface User {
|
||||
id: string;
|
||||
canViewConditionalField?: boolean;
|
||||
email?: string;
|
||||
updatedAt: string;
|
||||
createdAt: string;
|
||||
email: string;
|
||||
resetPasswordToken?: string;
|
||||
resetPasswordExpiration?: string;
|
||||
salt?: string;
|
||||
hash?: string;
|
||||
loginAttempts?: number;
|
||||
lockUntil?: string;
|
||||
createdAt: string;
|
||||
updatedAt: string;
|
||||
password?: string;
|
||||
}
|
||||
export interface ArrayField {
|
||||
@@ -50,7 +52,7 @@ export interface ArrayField {
|
||||
text: string;
|
||||
id?: string;
|
||||
}[];
|
||||
collapsedArray: {
|
||||
collapsedArray?: {
|
||||
text: string;
|
||||
id?: string;
|
||||
}[];
|
||||
@@ -74,8 +76,8 @@ export interface ArrayField {
|
||||
title?: string;
|
||||
id?: string;
|
||||
}[];
|
||||
createdAt: string;
|
||||
updatedAt: string;
|
||||
createdAt: string;
|
||||
}
|
||||
export interface BlockField {
|
||||
id: string;
|
||||
@@ -214,8 +216,8 @@ export interface BlockField {
|
||||
blockName?: string;
|
||||
blockType: 'text';
|
||||
}[];
|
||||
createdAt: string;
|
||||
updatedAt: string;
|
||||
createdAt: string;
|
||||
}
|
||||
export interface CodeField {
|
||||
id: string;
|
||||
@@ -224,8 +226,8 @@ export interface CodeField {
|
||||
json?: string;
|
||||
html?: string;
|
||||
css?: string;
|
||||
createdAt: string;
|
||||
updatedAt: string;
|
||||
createdAt: string;
|
||||
}
|
||||
export interface CollapsibleField {
|
||||
id: string;
|
||||
@@ -244,8 +246,8 @@ export interface CollapsibleField {
|
||||
innerCollapsible?: string;
|
||||
id?: string;
|
||||
}[];
|
||||
createdAt: string;
|
||||
updatedAt: string;
|
||||
createdAt: string;
|
||||
}
|
||||
export interface ConditionalLogic {
|
||||
id: string;
|
||||
@@ -253,8 +255,8 @@ export interface ConditionalLogic {
|
||||
toggleField?: boolean;
|
||||
fieldToToggle: string;
|
||||
userConditional?: string;
|
||||
createdAt: string;
|
||||
updatedAt: string;
|
||||
createdAt: string;
|
||||
}
|
||||
export interface DateField {
|
||||
id: string;
|
||||
@@ -263,14 +265,14 @@ export interface DateField {
|
||||
dayOnly?: string;
|
||||
dayAndTime?: string;
|
||||
monthOnly?: string;
|
||||
createdAt: string;
|
||||
updatedAt: string;
|
||||
createdAt: string;
|
||||
}
|
||||
export interface RadioField {
|
||||
id: string;
|
||||
radio?: 'one' | 'two' | 'three';
|
||||
createdAt: string;
|
||||
updatedAt: string;
|
||||
createdAt: string;
|
||||
}
|
||||
export interface GroupField {
|
||||
id: string;
|
||||
@@ -300,14 +302,27 @@ export interface GroupField {
|
||||
nestedField?: string;
|
||||
};
|
||||
};
|
||||
createdAt: string;
|
||||
groups: {
|
||||
groupInRow?: {
|
||||
field?: string;
|
||||
secondField?: string;
|
||||
thirdField?: string;
|
||||
};
|
||||
secondGroupInRow?: {
|
||||
field?: string;
|
||||
nestedGroup?: {
|
||||
nestedField?: string;
|
||||
};
|
||||
};
|
||||
};
|
||||
updatedAt: string;
|
||||
createdAt: string;
|
||||
}
|
||||
export interface RowField {
|
||||
id: string;
|
||||
title: string;
|
||||
createdAt: string;
|
||||
updatedAt: string;
|
||||
createdAt: string;
|
||||
}
|
||||
export interface IndexedField {
|
||||
id: string;
|
||||
@@ -330,8 +345,8 @@ export interface IndexedField {
|
||||
collapsibleTextUnique?: string;
|
||||
partOne?: string;
|
||||
partTwo?: string;
|
||||
createdAt: string;
|
||||
updatedAt: string;
|
||||
createdAt: string;
|
||||
}
|
||||
export interface JsonField {
|
||||
id: string;
|
||||
@@ -344,8 +359,8 @@ export interface JsonField {
|
||||
| number
|
||||
| boolean
|
||||
| null;
|
||||
createdAt: string;
|
||||
updatedAt: string;
|
||||
createdAt: string;
|
||||
}
|
||||
export interface NumberField {
|
||||
id: string;
|
||||
@@ -357,8 +372,11 @@ export interface NumberField {
|
||||
decimalMin?: number;
|
||||
decimalMax?: number;
|
||||
defaultNumber?: number;
|
||||
createdAt: string;
|
||||
hasMany?: number[];
|
||||
validatesHasMany?: number[];
|
||||
localizedHasMany?: number[];
|
||||
updatedAt: string;
|
||||
createdAt: string;
|
||||
}
|
||||
export interface PointField {
|
||||
id: string;
|
||||
@@ -379,8 +397,8 @@ export interface PointField {
|
||||
*/
|
||||
point?: [number, number];
|
||||
};
|
||||
createdAt: string;
|
||||
updatedAt: string;
|
||||
createdAt: string;
|
||||
}
|
||||
export interface RelationshipField {
|
||||
id: string;
|
||||
@@ -402,8 +420,8 @@ export interface RelationshipField {
|
||||
};
|
||||
relationshipWithMin?: string[] | TextField[];
|
||||
relationshipWithMax?: string[] | TextField[];
|
||||
createdAt: string;
|
||||
updatedAt: string;
|
||||
createdAt: string;
|
||||
}
|
||||
export interface TextField {
|
||||
id: string;
|
||||
@@ -413,8 +431,8 @@ export interface TextField {
|
||||
defaultFunction?: string;
|
||||
defaultAsync?: string;
|
||||
overrideLength?: string;
|
||||
createdAt: string;
|
||||
updatedAt: string;
|
||||
createdAt: string;
|
||||
}
|
||||
export interface RichTextField {
|
||||
id: string;
|
||||
@@ -423,11 +441,14 @@ export interface RichTextField {
|
||||
richText: {
|
||||
[k: string]: unknown;
|
||||
}[];
|
||||
richTextCustomFields?: {
|
||||
[k: string]: unknown;
|
||||
}[];
|
||||
richTextReadOnly?: {
|
||||
[k: string]: unknown;
|
||||
}[];
|
||||
createdAt: string;
|
||||
updatedAt: string;
|
||||
createdAt: string;
|
||||
}
|
||||
export interface SelectField {
|
||||
id: string;
|
||||
@@ -437,8 +458,8 @@ export interface SelectField {
|
||||
selectHasManyLocalized?: ('one' | 'two')[];
|
||||
selectI18n?: 'one' | 'two' | 'three';
|
||||
simple?: 'One' | 'Two' | 'Three';
|
||||
createdAt: string;
|
||||
updatedAt: string;
|
||||
createdAt: string;
|
||||
}
|
||||
export interface TabsField {
|
||||
id: string;
|
||||
@@ -522,8 +543,8 @@ export interface TabsField {
|
||||
nestedTab: {
|
||||
text?: string;
|
||||
};
|
||||
createdAt: string;
|
||||
updatedAt: string;
|
||||
createdAt: string;
|
||||
}
|
||||
export interface Upload {
|
||||
id: string;
|
||||
@@ -532,27 +553,27 @@ export interface Upload {
|
||||
richText?: {
|
||||
[k: string]: unknown;
|
||||
}[];
|
||||
updatedAt: string;
|
||||
createdAt: string;
|
||||
url?: string;
|
||||
filename?: string;
|
||||
mimeType?: string;
|
||||
filesize?: number;
|
||||
width?: number;
|
||||
height?: number;
|
||||
createdAt: string;
|
||||
updatedAt: string;
|
||||
}
|
||||
export interface Uploads2 {
|
||||
id: string;
|
||||
text?: string;
|
||||
media?: string | Uploads2;
|
||||
updatedAt: string;
|
||||
createdAt: string;
|
||||
url?: string;
|
||||
filename?: string;
|
||||
mimeType?: string;
|
||||
filesize?: number;
|
||||
width?: number;
|
||||
height?: number;
|
||||
createdAt: string;
|
||||
updatedAt: string;
|
||||
}
|
||||
export interface Uploads3 {
|
||||
id: string;
|
||||
@@ -560,12 +581,12 @@ export interface Uploads3 {
|
||||
richText?: {
|
||||
[k: string]: unknown;
|
||||
}[];
|
||||
updatedAt: string;
|
||||
createdAt: string;
|
||||
url?: string;
|
||||
filename?: string;
|
||||
mimeType?: string;
|
||||
filesize?: number;
|
||||
width?: number;
|
||||
height?: number;
|
||||
createdAt: string;
|
||||
updatedAt: string;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user