mirror of
https://github.com/strapi/strapi.git
synced 2025-10-17 11:08:14 +00:00
Merge branch 'main' into feature/private-s3-bucket
This commit is contained in:
commit
2f6afb9695
@ -86,6 +86,27 @@ const sidebars = {
|
||||
},
|
||||
items: ['example'],
|
||||
},
|
||||
{
|
||||
type: 'category',
|
||||
label: 'Database',
|
||||
link: {
|
||||
type: 'doc',
|
||||
id: 'core/database/intro',
|
||||
},
|
||||
items: [
|
||||
{
|
||||
type: 'category',
|
||||
label: 'Relations',
|
||||
items: [
|
||||
{
|
||||
type: 'doc',
|
||||
label: 'Reordering',
|
||||
id: 'core/database/relations/reordering',
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
type: 'category',
|
||||
label: 'Helper Plugin',
|
||||
|
@ -2174,9 +2174,9 @@
|
||||
"@hapi/hoek" "^9.0.0"
|
||||
|
||||
"@sideway/formula@^3.0.0":
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.0.tgz#fe158aee32e6bd5de85044be615bc08478a0a13c"
|
||||
integrity sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==
|
||||
version "3.0.1"
|
||||
resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.1.tgz#80fcbcbaf7ce031e0ef2dd29b1bfc7c3f583611f"
|
||||
integrity sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==
|
||||
|
||||
"@sideway/pinpoint@^2.0.0":
|
||||
version "2.0.0"
|
||||
@ -7805,9 +7805,9 @@ webpack-sources@^3.2.2, webpack-sources@^3.2.3:
|
||||
integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==
|
||||
|
||||
webpack@^5.73.0:
|
||||
version "5.74.0"
|
||||
resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.74.0.tgz#02a5dac19a17e0bb47093f2be67c695102a55980"
|
||||
integrity sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==
|
||||
version "5.76.1"
|
||||
resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.76.1.tgz#7773de017e988bccb0f13c7d75ec245f377d295c"
|
||||
integrity sha512-4+YIK4Abzv8172/SGqObnUjaIHjLEuUasz9EwQj/9xmPPkYJy2Mh03Q/lJfSD3YLzbxy5FeTq5Uw0323Oh6SJQ==
|
||||
dependencies:
|
||||
"@types/eslint-scope" "^3.7.3"
|
||||
"@types/estree" "^0.0.51"
|
||||
|
@ -216,6 +216,10 @@ const createYupSchemaAttribute = (type, validations, options) => {
|
||||
schema = yup
|
||||
.mixed(errorsTrads.json)
|
||||
.test('isJSON', errorsTrads.json, (value) => {
|
||||
if (!value || !value.length) {
|
||||
return true;
|
||||
}
|
||||
|
||||
try {
|
||||
JSON.parse(value);
|
||||
|
||||
@ -226,7 +230,9 @@ const createYupSchemaAttribute = (type, validations, options) => {
|
||||
})
|
||||
.nullable()
|
||||
.test('required', errorsTrads.required, (value) => {
|
||||
if (validations.required && !value.length) return false;
|
||||
if (validations.required && (!value || !value.length)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
});
|
||||
|
@ -5,14 +5,6 @@ const createDefaultForm = (attributes, allComponentsSchema) => {
|
||||
const attribute = get(attributes, [current], {});
|
||||
const { default: defaultValue, component, type, required, min, repeatable } = attribute;
|
||||
|
||||
if (type === 'json') {
|
||||
acc[current] = null;
|
||||
}
|
||||
|
||||
if (type === 'json' && required === true) {
|
||||
acc[current] = {};
|
||||
}
|
||||
|
||||
if (defaultValue !== undefined) {
|
||||
acc[current] = defaultValue;
|
||||
}
|
||||
|
@ -11,11 +11,6 @@ describe('CONTENT MANAGER | utils | createDefaultForm', () => {
|
||||
expect(createDefaultForm(attributes, {})).toEqual({});
|
||||
});
|
||||
|
||||
it('should set the json type with the correct value', () => {
|
||||
expect(createDefaultForm({ test: { type: 'json' } }, {})).toEqual({ test: null });
|
||||
expect(createDefaultForm({ test: { type: 'json', required: true } }, {})).toEqual({ test: {} });
|
||||
});
|
||||
|
||||
it('should init the requide dynamic zone type with an empty array', () => {
|
||||
expect(createDefaultForm({ test: { type: 'dynamiczone', required: true } })).toEqual({
|
||||
test: [],
|
||||
|
@ -69,6 +69,7 @@ const FormHead = ({
|
||||
})}
|
||||
</Link>
|
||||
}
|
||||
ellipsis
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
@ -63,8 +63,8 @@ const Table = ({
|
||||
condition: canUpdate,
|
||||
})}
|
||||
>
|
||||
<Td>
|
||||
<Typography textColor="neutral800" fontWeight="bold">
|
||||
<Td maxWidth={pxToRem(250)}>
|
||||
<Typography textColor="neutral800" fontWeight="bold" ellipsis>
|
||||
{token.name}
|
||||
</Typography>
|
||||
</Td>
|
||||
|
@ -275,6 +275,10 @@ exports[`ADMIN | Pages | API TOKENS | EditView renders and matches the snapshot
|
||||
font-weight: 600;
|
||||
font-size: 2rem;
|
||||
line-height: 1.25;
|
||||
display: block;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
color: #32324d;
|
||||
}
|
||||
|
||||
@ -1824,6 +1828,10 @@ exports[`ADMIN | Pages | API TOKENS | EditView renders and matches the snapshot
|
||||
font-weight: 600;
|
||||
font-size: 2rem;
|
||||
line-height: 1.25;
|
||||
display: block;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
color: #32324d;
|
||||
}
|
||||
|
||||
|
@ -2,7 +2,7 @@ import * as yup from 'yup';
|
||||
import { translatedErrors } from '@strapi/helper-plugin';
|
||||
|
||||
const schema = yup.object().shape({
|
||||
name: yup.string(translatedErrors.string).required(translatedErrors.required),
|
||||
name: yup.string(translatedErrors.string).max(100).required(translatedErrors.required),
|
||||
type: yup
|
||||
.string(translatedErrors.string)
|
||||
.oneOf(['read-only', 'full-access', 'custom'])
|
||||
|
@ -158,7 +158,7 @@ describe('ADMIN | Pages | API TOKENS | ListPage', () => {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.c36 {
|
||||
.c35 {
|
||||
max-width: 15.625rem;
|
||||
}
|
||||
|
||||
@ -255,9 +255,13 @@ describe('ADMIN | Pages | API TOKENS | ListPage', () => {
|
||||
color: #666687;
|
||||
}
|
||||
|
||||
.c35 {
|
||||
.c36 {
|
||||
font-size: 0.875rem;
|
||||
line-height: 1.43;
|
||||
display: block;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
font-weight: 600;
|
||||
color: #32324d;
|
||||
}
|
||||
@ -919,19 +923,19 @@ describe('ADMIN | Pages | API TOKENS | ListPage', () => {
|
||||
>
|
||||
<td
|
||||
aria-colindex="1"
|
||||
class="c25"
|
||||
class="c35 c25"
|
||||
role="gridcell"
|
||||
tabindex="-1"
|
||||
>
|
||||
<span
|
||||
class="c5 c35"
|
||||
class="c5 c36"
|
||||
>
|
||||
My super token
|
||||
</span>
|
||||
</td>
|
||||
<td
|
||||
aria-colindex="2"
|
||||
class="c36 c25"
|
||||
class="c35 c25"
|
||||
role="gridcell"
|
||||
tabindex="-1"
|
||||
>
|
||||
|
@ -148,6 +148,10 @@ exports[`ADMIN | Pages | TRANSFER TOKENS | EditView renders and matches the snap
|
||||
font-weight: 600;
|
||||
font-size: 2rem;
|
||||
line-height: 1.25;
|
||||
display: block;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
color: #32324d;
|
||||
}
|
||||
|
||||
@ -1121,6 +1125,10 @@ exports[`ADMIN | Pages | TRANSFER TOKENS | EditView renders and matches the snap
|
||||
font-weight: 600;
|
||||
font-size: 2rem;
|
||||
line-height: 1.25;
|
||||
display: block;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
color: #32324d;
|
||||
}
|
||||
|
||||
|
@ -2,7 +2,7 @@ import * as yup from 'yup';
|
||||
import { translatedErrors } from '@strapi/helper-plugin';
|
||||
|
||||
const schema = yup.object().shape({
|
||||
name: yup.string(translatedErrors.string).required(translatedErrors.required),
|
||||
name: yup.string(translatedErrors.string).max(100).required(translatedErrors.required),
|
||||
description: yup.string().nullable(),
|
||||
lifespan: yup.number().integer().min(0).nullable().defined(translatedErrors.required),
|
||||
});
|
||||
|
@ -158,7 +158,7 @@ describe('ADMIN | Pages | TRANSFER TOKENS | ListPage', () => {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.c36 {
|
||||
.c35 {
|
||||
max-width: 15.625rem;
|
||||
}
|
||||
|
||||
@ -255,9 +255,13 @@ describe('ADMIN | Pages | TRANSFER TOKENS | ListPage', () => {
|
||||
color: #666687;
|
||||
}
|
||||
|
||||
.c35 {
|
||||
.c36 {
|
||||
font-size: 0.875rem;
|
||||
line-height: 1.43;
|
||||
display: block;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
font-weight: 600;
|
||||
color: #32324d;
|
||||
}
|
||||
@ -919,19 +923,19 @@ describe('ADMIN | Pages | TRANSFER TOKENS | ListPage', () => {
|
||||
>
|
||||
<td
|
||||
aria-colindex="1"
|
||||
class="c25"
|
||||
class="c35 c25"
|
||||
role="gridcell"
|
||||
tabindex="-1"
|
||||
>
|
||||
<span
|
||||
class="c5 c35"
|
||||
class="c5 c36"
|
||||
>
|
||||
My super token
|
||||
</span>
|
||||
</td>
|
||||
<td
|
||||
aria-colindex="2"
|
||||
class="c36 c25"
|
||||
class="c35 c25"
|
||||
role="gridcell"
|
||||
tabindex="-1"
|
||||
>
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -132,7 +132,7 @@
|
||||
"style-loader": "3.3.1",
|
||||
"styled-components": "5.3.3",
|
||||
"typescript": "4.6.2",
|
||||
"webpack": "^5.75.0",
|
||||
"webpack": "^5.76.0",
|
||||
"webpack-cli": "^5.0.1",
|
||||
"webpack-dev-server": "^4.11.1",
|
||||
"webpackbar": "^5.0.2",
|
||||
|
@ -48,6 +48,7 @@ const formatAttribute = (key, attribute) => {
|
||||
multiple: !!attribute.multiple,
|
||||
required: !!required,
|
||||
configurable: configurable === false ? false : undefined,
|
||||
private: !!attribute.private,
|
||||
allowedTypes: attribute.allowedTypes,
|
||||
pluginOptions,
|
||||
};
|
||||
|
@ -303,15 +303,19 @@ class RemoteStrapiDestinationProvider implements IDestinationProvider {
|
||||
const startAssetsTransferOnce = this.#startStepOnce('assets');
|
||||
|
||||
const flush = async () => {
|
||||
await this.#streamStep('assets', batch);
|
||||
const streamError = await this.#streamStep('assets', batch);
|
||||
batch = [];
|
||||
return streamError;
|
||||
};
|
||||
|
||||
const safePush = async (chunk: client.TransferAssetFlow) => {
|
||||
batch.push(chunk);
|
||||
|
||||
if (batchLength() >= batchSize) {
|
||||
await flush();
|
||||
const streamError = await flush();
|
||||
if (streamError) {
|
||||
throw streamError;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@ -347,15 +351,25 @@ class RemoteStrapiDestinationProvider implements IDestinationProvider {
|
||||
const assetID = v4();
|
||||
const { filename, filepath, stats, stream } = asset;
|
||||
|
||||
await safePush({ action: 'start', assetID, data: { filename, filepath, stats } });
|
||||
try {
|
||||
await safePush({
|
||||
action: 'start',
|
||||
assetID,
|
||||
data: { filename, filepath, stats },
|
||||
});
|
||||
|
||||
for await (const chunk of stream) {
|
||||
await safePush({ action: 'stream', assetID, data: chunk });
|
||||
for await (const chunk of stream) {
|
||||
await safePush({ action: 'stream', assetID, data: chunk });
|
||||
}
|
||||
|
||||
await safePush({ action: 'end', assetID });
|
||||
|
||||
callback();
|
||||
} catch (error) {
|
||||
if (error instanceof Error) {
|
||||
callback(error);
|
||||
}
|
||||
}
|
||||
|
||||
await safePush({ action: 'end', assetID });
|
||||
|
||||
callback();
|
||||
},
|
||||
});
|
||||
}
|
||||
|
@ -4,20 +4,20 @@ import { useState } from 'react';
|
||||
import { Meta, Story, Canvas } from '@storybook/addon-docs/blocks';
|
||||
import DateTimePicker from './index';
|
||||
|
||||
<Meta
|
||||
title="components/DateTimePicker"
|
||||
<Meta
|
||||
title="components/DateTimePicker"
|
||||
component={DateTimePicker}
|
||||
argTypes={{
|
||||
label: {
|
||||
control: {
|
||||
type: 'text'
|
||||
}
|
||||
control: {
|
||||
type: 'text',
|
||||
},
|
||||
},
|
||||
value: {
|
||||
control: {
|
||||
type: 'date'
|
||||
}
|
||||
}
|
||||
type: 'date',
|
||||
},
|
||||
},
|
||||
}}
|
||||
/>
|
||||
|
||||
@ -37,7 +37,7 @@ Description...
|
||||
<DateTimePicker
|
||||
onClear={() => setValue(undefined)}
|
||||
value={value}
|
||||
onChange={e => setValue(e)}
|
||||
onChange={(e) => setValue(e)}
|
||||
label="Date time picker"
|
||||
hint="This is a super description"
|
||||
/>
|
||||
@ -53,6 +53,7 @@ Description...
|
||||
<Canvas>
|
||||
<Story name="error">
|
||||
<DateTimePicker
|
||||
label="Date time picker"
|
||||
hint="This is a super description"
|
||||
error="Very very very very very very very long error"
|
||||
/>
|
||||
|
@ -4,6 +4,7 @@ import { useEffect, useState, useRef } from 'react';
|
||||
import { Meta, ArgsTable, Canvas, Story } from '@storybook/addon-docs';
|
||||
import { Button, Box, Main, Flex } from '@strapi/design-system';
|
||||
import useQueryParams from '../../hooks/useQueryParams';
|
||||
import useTracking from '../../hooks/useTracking';
|
||||
import FilterListURLQuery from '../FilterListURLQuery';
|
||||
import FilterPopoverURLQuery from './index';
|
||||
|
||||
@ -51,6 +52,7 @@ import { FilterListURLQuery } from '@strapi/helper-plugin';
|
||||
metadatas: { label: 'city' },
|
||||
},
|
||||
];
|
||||
const { trackUsage } = useTracking();
|
||||
return (
|
||||
<Main>
|
||||
<Flex direction="column" alignItems="stretch" gap={6}>
|
||||
|
@ -142,11 +142,12 @@ const GenericInput = ({
|
||||
labelAction={labelAction}
|
||||
value={value}
|
||||
error={errorMessage}
|
||||
disabled={disabled}
|
||||
hint={hint}
|
||||
required={required}
|
||||
onChange={(json) => {
|
||||
// Default to null when the field is not required and there is no input value
|
||||
const value = !attribute.required && !json.length ? 'null' : json;
|
||||
const value = !attribute.required && !json.length ? null : json;
|
||||
onChange({ target: { name, value } });
|
||||
}}
|
||||
minHeight={pxToRem(252)}
|
||||
|
@ -77,7 +77,7 @@
|
||||
"rimraf": "3.0.2",
|
||||
"styled-components": "5.3.3",
|
||||
"typescript": "4.6.2",
|
||||
"webpack": "^5.75.0",
|
||||
"webpack": "^5.76.0",
|
||||
"webpack-cli": "^5.0.1"
|
||||
},
|
||||
"peerDependencies": {
|
||||
|
@ -31,8 +31,8 @@ export const AssetGridList = ({
|
||||
|
||||
if (onReorderAsset) {
|
||||
return (
|
||||
<GridItem col={3} height="100%">
|
||||
<Draggable key={asset.id} index={index} moveItem={onReorderAsset} id={asset.id}>
|
||||
<GridItem key={asset.id} col={3} height="100%">
|
||||
<Draggable index={index} moveItem={onReorderAsset} id={asset.id}>
|
||||
<AssetCard
|
||||
allowedTypes={allowedTypes}
|
||||
asset={asset}
|
||||
|
@ -144,4 +144,27 @@ describe('Env helper', () => {
|
||||
expect(envHelper.date('DATE_VAR')).toEqual(new Date(2010, 1, 21, 12, 34, 12));
|
||||
});
|
||||
});
|
||||
|
||||
describe('env with union cast', () => {
|
||||
test('Throws if expectedValues is not provided', () => {
|
||||
expect(() => envHelper.oneOf('NO_VAR')).toThrow();
|
||||
});
|
||||
|
||||
test('Throws if defaultValue not included in expectedValues', () => {
|
||||
expect(() => envHelper.oneOf('NO_VAR', ['lorem', 'ipsum'], 'test')).toThrow();
|
||||
});
|
||||
|
||||
test('Return undefined if value is missing in expectedValues and no defaultValue', () => {
|
||||
expect(envHelper.oneOf('NO_VAR', ['lorem', 'ipsum'])).toBeUndefined();
|
||||
});
|
||||
|
||||
test('Return defaultValue if value does not exist in expectedValues', () => {
|
||||
expect(envHelper.oneOf('NO_VAR', ['lorem', 'ipsum'], 'ipsum')).toBe('ipsum');
|
||||
});
|
||||
|
||||
test('Return defaultValue if value exists and is missing in expectedValues', () => {
|
||||
process.env.WITH_VAR = 'test';
|
||||
expect(envHelper.oneOf('WITH_VAR', ['lorem', 'ipsum'], 'ipsum')).toBe('ipsum');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -71,6 +71,26 @@ const utils = {
|
||||
const value = process.env[key];
|
||||
return new Date(value);
|
||||
},
|
||||
|
||||
/**
|
||||
* Gets a value from env that matches oneOf provided values
|
||||
* @param {string} key
|
||||
* @param {string[]} expectedValues
|
||||
* @param {string|undefined} defaultValue
|
||||
* @returns {string|undefined}
|
||||
*/
|
||||
oneOf(key, expectedValues, defaultValue) {
|
||||
if (!expectedValues) {
|
||||
throw new Error(`env.oneOf requires expectedValues`);
|
||||
}
|
||||
|
||||
if (defaultValue && !expectedValues.includes(defaultValue)) {
|
||||
throw new Error(`env.oneOf requires defaultValue to be included in expectedValues`);
|
||||
}
|
||||
|
||||
const rawValue = env(key, defaultValue);
|
||||
return expectedValues.includes(rawValue) ? rawValue : defaultValue;
|
||||
},
|
||||
};
|
||||
|
||||
Object.assign(env, utils);
|
||||
|
@ -1,62 +1,82 @@
|
||||
{
|
||||
"BoundRoute.title": "绑定路由到",
|
||||
"EditForm.inputSelect.description.role": "新验证身份的用户将被赋予所选角色。",
|
||||
"EditForm.inputSelect.label.role": "认证用户的默认角色",
|
||||
"EditForm.inputToggle.description.email": "不允许用户使用不同的认证提供者(绑定的相同的电子邮件地址)来创建多个帐户。",
|
||||
"EditForm.inputToggle.description.email-confirmation": "启用(ON)后,新注册的用户会收到一封确认电子邮件。",
|
||||
"EditForm.inputToggle.description.email-confirmation-redirection": "确认您的电子邮件后,选择将您重定向到的位置。",
|
||||
"EditForm.inputToggle.description.email-reset-password": "应用程序的重置密码页面的 URL",
|
||||
"EditForm.inputToggle.description.sign-up": "当禁用(OFF)时,注册过程将被禁止。任何人无论使用任何的供应商都不可以订阅。",
|
||||
"EditForm.inputToggle.label.email": "每个电子邮件地址一个帐户",
|
||||
"EditForm.inputToggle.label.email-confirmation": "启用电子邮件确认",
|
||||
"EditForm.inputToggle.label.email-confirmation-redirection": "重定向 URL",
|
||||
"EditForm.inputToggle.label.email-reset-password": "重置密码页面 URL",
|
||||
"EditForm.inputToggle.label.sign-up": "启用注册",
|
||||
"EditForm.inputToggle.placeholder.email-confirmation-redirection": "例如: https://yourfrontend.com/reset-password",
|
||||
"EditForm.inputToggle.placeholder.email-reset-password": "例如: https://yourfrontend.com/reset-password",
|
||||
"EditPage.form.roles": "角色详情",
|
||||
"Email.template.email_confirmation": "邮箱地址确认",
|
||||
"HeaderNav.link.advancedSettings": "高级设置",
|
||||
"HeaderNav.link.emailTemplates": "电子邮件模板",
|
||||
"HeaderNav.link.providers": "提供者",
|
||||
"Plugin.permissions.plugins.description": "定义 {name} 插件所有允许的操作。",
|
||||
"Plugins.header.description": "下面只列出路由绑定的操作。",
|
||||
"Plugins.header.title": "权限",
|
||||
"Policies.header.hint": "选择应用程序或插件的操作,然后点击 COG 图标显示绑定的路由",
|
||||
"Policies.header.title": "高级设置",
|
||||
"PopUpForm.Email.email_templates.inputDescription": "如果你不确定如何使用变量, {link}",
|
||||
"PopUpForm.Email.link.documentation": "查看我们的文档",
|
||||
"PopUpForm.Email.options.from.email.label": "发件人地址",
|
||||
"PopUpForm.Email.options.from.email.placeholder": "kai@doe.com",
|
||||
"PopUpForm.Email.options.from.name.label": "发件人名称",
|
||||
"PopUpForm.Email.options.from.name.placeholder": "Kai Doe",
|
||||
"PopUpForm.Email.options.message.label": "消息",
|
||||
"PopUpForm.Email.options.object.label": "主题",
|
||||
"PopUpForm.Email.options.object.placeholder": "请为%APP_NAME%确认邮箱地址",
|
||||
"PopUpForm.Email.options.response_email.label": "回复邮件",
|
||||
"PopUpForm.Email.options.response_email.placeholder": "kai@doe.com",
|
||||
"PopUpForm.Providers.enabled.description": "如果禁用,用户将无法使用此供应商。",
|
||||
"PopUpForm.Providers.enabled.label": "启用",
|
||||
"PopUpForm.Providers.key.label": "客户端 ID",
|
||||
"PopUpForm.Providers.key.placeholder": "文本",
|
||||
"PopUpForm.Providers.redirectURL.front-end.label": "重定向 URL",
|
||||
"PopUpForm.Providers.redirectURL.label": "添加到{provider}应用配置的跳转URL",
|
||||
"PopUpForm.Providers.secret.label": "客户端秘钥",
|
||||
"PopUpForm.Providers.secret.placeholder": "文本",
|
||||
"PopUpForm.Providers.subdomain.label": "Host URI (Subdomain)",
|
||||
"PopUpForm.Providers.subdomain.placeholder": "my.subdomain.com",
|
||||
"PopUpForm.header.edit.email-templates": "编辑电子邮件模版",
|
||||
"PopUpForm.header.edit.providers": "编辑提供商",
|
||||
"Settings.roles.deleted": "角色已被删除",
|
||||
"Settings.roles.edited": "角色编辑完成",
|
||||
"Settings.section-label": "用户及权限插件",
|
||||
"notification.success.submit": "设置已被更新",
|
||||
"page.title": "设置 - 角色",
|
||||
"plugin.description.long": "使用基于 JWT 的完整身份验证过程来保护 API。这个插件还有一个 ACL 策略,允许你管理用户组之间的权限。",
|
||||
"plugin.description.short": "使用基于 JWT 的完整身份验证过程保护 API",
|
||||
"plugin.name": "角色及权限",
|
||||
"popUpWarning.button.cancel": "取消",
|
||||
"popUpWarning.button.confirm": "确认",
|
||||
"popUpWarning.title": "请确认",
|
||||
"popUpWarning.warning.cancel": "你确定你要取消你的修改?"
|
||||
"BoundRoute.title": "绑定路由到",
|
||||
"EditForm.inputSelect.description.role": "新验证身份的用户将被赋予所选角色。",
|
||||
"EditForm.inputSelect.label.role": "认证用户的默认角色",
|
||||
"EditForm.inputToggle.description.email": "不允许用户使用不同的认证提供者(绑定的相同的电子邮件地址)来创建多个帐户。",
|
||||
"EditForm.inputToggle.description.email-confirmation": "启用(ON)后,新注册的用户会收到一封确认电子邮件。",
|
||||
"EditForm.inputToggle.description.email-confirmation-redirection": "确认您的电子邮件后,选择将您重定向到的位置。",
|
||||
"EditForm.inputToggle.description.email-reset-password": "应用程序的重置密码页面的 URL",
|
||||
"EditForm.inputToggle.description.sign-up": "当禁用(OFF)时,注册过程将被禁止。任何人无论使用任何的供应商都不可以订阅。",
|
||||
"EditForm.inputToggle.label.email": "每个电子邮件地址一个帐户",
|
||||
"EditForm.inputToggle.label.email-confirmation": "启用电子邮件确认",
|
||||
"EditForm.inputToggle.label.email-confirmation-redirection": "重定向 URL",
|
||||
"EditForm.inputToggle.label.email-reset-password": "重置密码页面 URL",
|
||||
"EditForm.inputToggle.label.sign-up": "启用注册",
|
||||
"EditForm.inputToggle.placeholder.email-confirmation-redirection": "例如: https://yourfrontend.com/reset-password",
|
||||
"EditForm.inputToggle.placeholder.email-reset-password": "例如: https://yourfrontend.com/reset-password",
|
||||
"EditPage.form.roles": "角色详情",
|
||||
"Email.template.data.loaded": "电子邮件模板已加载",
|
||||
"Email.template.email_confirmation": "邮箱地址确认",
|
||||
"Email.template.form.edit.label": "编辑模板",
|
||||
"Email.template.table.action.label": "操作",
|
||||
"Email.template.table.icon.label": "图标",
|
||||
"Email.template.table.name.label": "名称",
|
||||
"Form.advancedSettings.data.loaded": "高级设置数据已加载",
|
||||
"HeaderNav.link.advancedSettings": "高级设置",
|
||||
"HeaderNav.link.emailTemplates": "电子邮件模板",
|
||||
"HeaderNav.link.providers": "提供者",
|
||||
"Plugin.permissions.plugins.description": "定义 {name} 插件所有允许的操作。",
|
||||
"Plugins.header.description": "下面只列出路由绑定的操作。",
|
||||
"Plugins.header.title": "权限",
|
||||
"Policies.header.hint": "选择应用程序或插件的操作,然后点击 COG 图标显示绑定的路由",
|
||||
"Policies.header.title": "高级设置",
|
||||
"PopUpForm.Email.email_templates.inputDescription": "如果你不确定如何使用变量, {link}",
|
||||
"PopUpForm.Email.link.documentation": "查看我们的文档",
|
||||
"PopUpForm.Email.options.from.email.label": "发件人地址",
|
||||
"PopUpForm.Email.options.from.email.placeholder": "kai@doe.com",
|
||||
"PopUpForm.Email.options.from.name.label": "发件人名称",
|
||||
"PopUpForm.Email.options.from.name.placeholder": "Kai Doe",
|
||||
"PopUpForm.Email.options.message.label": "消息",
|
||||
"PopUpForm.Email.options.object.label": "主题",
|
||||
"PopUpForm.Email.options.object.placeholder": "请为%APP_NAME%确认邮箱地址",
|
||||
"PopUpForm.Email.options.response_email.label": "回复邮件",
|
||||
"PopUpForm.Email.options.response_email.placeholder": "kai@doe.com",
|
||||
"PopUpForm.Providers.enabled.description": "如果禁用,用户将无法使用此供应商。",
|
||||
"PopUpForm.Providers.enabled.label": "启用",
|
||||
"PopUpForm.Providers.key.label": "客户端 ID",
|
||||
"PopUpForm.Providers.key.placeholder": "文本",
|
||||
"PopUpForm.Providers.redirectURL.front-end.label": "重定向 URL",
|
||||
"PopUpForm.Providers.redirectURL.label": "添加到{provider}应用配置的跳转URL",
|
||||
"PopUpForm.Providers.secret.label": "客户端秘钥",
|
||||
"PopUpForm.Providers.secret.placeholder": "文本",
|
||||
"PopUpForm.Providers.subdomain.label": "主机URI(子域名)",
|
||||
"PopUpForm.Providers.subdomain.placeholder": "my.subdomain.com",
|
||||
"PopUpForm.header.edit.email-templates": "编辑电子邮件模版",
|
||||
"PopUpForm.header.edit.providers": "编辑提供商",
|
||||
"Providers.data.loaded": "提供商已加载",
|
||||
"Providers.status": "状态",
|
||||
"Roles.empty": "您还没有任何角色。",
|
||||
"Roles.empty.search": "没有与搜索相匹配的角色。",
|
||||
"Settings.roles.deleted": "角色已被删除",
|
||||
"Settings.roles.edited": "角色编辑完成",
|
||||
"Settings.section-label": "用户及权限插件",
|
||||
"components.Input.error.validation.email": "这是一个无效的电子邮件",
|
||||
"components.Input.error.validation.json": "这不符合JSON格式",
|
||||
"components.Input.error.validation.max": "值过高。",
|
||||
"components.Input.error.validation.maxLength": "值过长。",
|
||||
"components.Input.error.validation.min": "值太低。",
|
||||
"components.Input.error.validation.minLength": "值太短。",
|
||||
"components.Input.error.validation.minSupMax": "不能超过上限",
|
||||
"components.Input.error.validation.regex": "该值不符合正则表达式。",
|
||||
"components.Input.error.validation.required": "该值为必填项。",
|
||||
"components.Input.error.validation.unique": "该值已被使用。",
|
||||
"notification.success.submit": "设置已被更新",
|
||||
"page.title": "设置 - 角色",
|
||||
"plugin.description.long": "使用基于 JWT 的完整身份验证过程来保护 API。这个插件还有一个 ACL 策略,允许你管理用户组之间的权限。",
|
||||
"plugin.description.short": "使用基于 JWT 的完整身份验证过程保护 API",
|
||||
"plugin.name": "角色及权限",
|
||||
"popUpWarning.button.cancel": "取消",
|
||||
"popUpWarning.button.confirm": "确认",
|
||||
"popUpWarning.title": "请确认",
|
||||
"popUpWarning.warning.cancel": "你确定你要取消你的修改?"
|
||||
}
|
||||
|
74
yarn.lock
74
yarn.lock
@ -8467,18 +8467,7 @@ browserslist-to-esbuild@1.2.0:
|
||||
dependencies:
|
||||
browserslist "^4.17.3"
|
||||
|
||||
browserslist@^4.12.0, browserslist@^4.14.5:
|
||||
version "4.20.2"
|
||||
resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.20.2.tgz#567b41508757ecd904dab4d1c646c612cd3d4f88"
|
||||
integrity sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==
|
||||
dependencies:
|
||||
caniuse-lite "^1.0.30001317"
|
||||
electron-to-chromium "^1.4.84"
|
||||
escalade "^3.1.1"
|
||||
node-releases "^2.0.2"
|
||||
picocolors "^1.0.0"
|
||||
|
||||
browserslist@^4.17.3, browserslist@^4.21.4:
|
||||
browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.17.3, browserslist@^4.20.2, browserslist@^4.21.0, browserslist@^4.21.3, browserslist@^4.21.4:
|
||||
version "4.21.4"
|
||||
resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.4.tgz#e7496bbc67b9e39dd0f98565feccdcb0d4ff6987"
|
||||
integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==
|
||||
@ -8488,26 +8477,6 @@ browserslist@^4.17.3, browserslist@^4.21.4:
|
||||
node-releases "^2.0.6"
|
||||
update-browserslist-db "^1.0.9"
|
||||
|
||||
browserslist@^4.20.2:
|
||||
version "4.21.0"
|
||||
resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.0.tgz#7ab19572361a140ecd1e023e2c1ed95edda0cefe"
|
||||
integrity sha512-UQxE0DIhRB5z/zDz9iA03BOfxaN2+GQdBYH/2WrSIWEUrnpzTPJbhqt+umq6r3acaPRTW1FNTkrcp0PXgtFkvA==
|
||||
dependencies:
|
||||
caniuse-lite "^1.0.30001358"
|
||||
electron-to-chromium "^1.4.164"
|
||||
node-releases "^2.0.5"
|
||||
update-browserslist-db "^1.0.0"
|
||||
|
||||
browserslist@^4.21.0, browserslist@^4.21.3:
|
||||
version "4.21.3"
|
||||
resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.3.tgz#5df277694eb3c48bc5c4b05af3e8b7e09c5a6d1a"
|
||||
integrity sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==
|
||||
dependencies:
|
||||
caniuse-lite "^1.0.30001370"
|
||||
electron-to-chromium "^1.4.202"
|
||||
node-releases "^2.0.6"
|
||||
update-browserslist-db "^1.0.5"
|
||||
|
||||
bs-logger@0.x:
|
||||
version "0.2.6"
|
||||
resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8"
|
||||
@ -8814,7 +8783,7 @@ camelize@^1.0.0:
|
||||
resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.0.tgz#164a5483e630fa4321e5af07020e531831b2609b"
|
||||
integrity sha512-W2lPwkBkMZwFlPCXhIlYgxu+7gC/NUlCtdK652DAJ1JdgV0sTrvuPFshNPrFa1TY2JOkLhgdeEBplB4ezEa+xg==
|
||||
|
||||
caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001317, caniuse-lite@^1.0.30001358, caniuse-lite@^1.0.30001370, caniuse-lite@^1.0.30001400:
|
||||
caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001400:
|
||||
version "1.0.30001449"
|
||||
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001449.tgz#a8d11f6a814c75c9ce9d851dc53eb1d1dfbcd657"
|
||||
integrity sha512-CPB+UL9XMT/Av+pJxCKGhdx+yg1hzplvFJQlJ2n68PyQGMz9L/E2zCyLdOL8uasbouTUgnPl+y0tccI/se+BEw==
|
||||
@ -10698,26 +10667,11 @@ ee-first@1.1.1:
|
||||
resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
|
||||
integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==
|
||||
|
||||
electron-to-chromium@^1.4.164:
|
||||
version "1.4.170"
|
||||
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.170.tgz#0415fc489402e09bfbe1f0c99bbf4d73f31d48d4"
|
||||
integrity sha512-rZ8PZLhK4ORPjFqLp9aqC4/S1j4qWFsPPz13xmWdrbBkU/LlxMcok+f+6f8YnQ57MiZwKtOaW15biZZsY5Igvw==
|
||||
|
||||
electron-to-chromium@^1.4.202:
|
||||
version "1.4.208"
|
||||
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.208.tgz#ecb5b47c8cc212a43172ffc5ce50178a638a5d74"
|
||||
integrity sha512-diMr4t69FigAGUk2KovP0bygEtN/9AkqEVkzjEp0cu+zFFbZMVvwACpTTfuj1mAmFR5kNoSW8wGKDFWIvmThiQ==
|
||||
|
||||
electron-to-chromium@^1.4.251:
|
||||
version "1.4.284"
|
||||
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592"
|
||||
integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==
|
||||
|
||||
electron-to-chromium@^1.4.84:
|
||||
version "1.4.106"
|
||||
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.106.tgz#e7a3bfa9d745dd9b9e597616cb17283cc349781a"
|
||||
integrity sha512-ZYfpVLULm67K7CaaGP7DmjyeMY4naxsbTy+syVVxT6QHI1Ww8XbJjmr9fDckrhq44WzCrcC5kH3zGpdusxwwqg==
|
||||
|
||||
elliptic@^6.5.3, elliptic@^6.5.4:
|
||||
version "6.5.4"
|
||||
resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb"
|
||||
@ -16827,7 +16781,7 @@ node-plop@0.26.3, node-plop@^0.26.3:
|
||||
mkdirp "^0.5.1"
|
||||
resolve "^1.12.0"
|
||||
|
||||
node-releases@^2.0.2, node-releases@^2.0.5, node-releases@^2.0.6:
|
||||
node-releases@^2.0.6:
|
||||
version "2.0.6"
|
||||
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503"
|
||||
integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==
|
||||
@ -21967,14 +21921,6 @@ upath@^2.0.1:
|
||||
resolved "https://registry.yarnpkg.com/upath/-/upath-2.0.1.tgz#50c73dea68d6f6b990f51d279ce6081665d61a8b"
|
||||
integrity sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==
|
||||
|
||||
update-browserslist-db@^1.0.0, update-browserslist-db@^1.0.5:
|
||||
version "1.0.5"
|
||||
resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz#be06a5eedd62f107b7c19eb5bcefb194411abf38"
|
||||
integrity sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==
|
||||
dependencies:
|
||||
escalade "^3.1.1"
|
||||
picocolors "^1.0.0"
|
||||
|
||||
update-browserslist-db@^1.0.9:
|
||||
version "1.0.10"
|
||||
resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3"
|
||||
@ -22527,9 +22473,9 @@ webpack@4:
|
||||
webpack-sources "^1.4.1"
|
||||
|
||||
"webpack@>=4.43.0 <6.0.0", webpack@^5.9.0:
|
||||
version "5.74.0"
|
||||
resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.74.0.tgz#02a5dac19a17e0bb47093f2be67c695102a55980"
|
||||
integrity sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==
|
||||
version "5.76.1"
|
||||
resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.76.1.tgz#7773de017e988bccb0f13c7d75ec245f377d295c"
|
||||
integrity sha512-4+YIK4Abzv8172/SGqObnUjaIHjLEuUasz9EwQj/9xmPPkYJy2Mh03Q/lJfSD3YLzbxy5FeTq5Uw0323Oh6SJQ==
|
||||
dependencies:
|
||||
"@types/eslint-scope" "^3.7.3"
|
||||
"@types/estree" "^0.0.51"
|
||||
@ -22556,10 +22502,10 @@ webpack@4:
|
||||
watchpack "^2.4.0"
|
||||
webpack-sources "^3.2.3"
|
||||
|
||||
webpack@^5.75.0:
|
||||
version "5.75.0"
|
||||
resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.75.0.tgz#1e440468647b2505860e94c9ff3e44d5b582c152"
|
||||
integrity sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==
|
||||
webpack@^5.76.0:
|
||||
version "5.76.0"
|
||||
resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.76.0.tgz#f9fb9fb8c4a7dbdcd0d56a98e56b8a942ee2692c"
|
||||
integrity sha512-l5sOdYBDunyf72HW8dF23rFtWq/7Zgvt/9ftMof71E/yUb1YLOBmTgA2K4vQthB3kotMrSj609txVE0dnr2fjA==
|
||||
dependencies:
|
||||
"@types/eslint-scope" "^3.7.3"
|
||||
"@types/estree" "^0.0.51"
|
||||
|
Loading…
x
Reference in New Issue
Block a user