Katherine 5d5f455b3c
feat: supports configuring dynamic environment variables and secrets (#5966)
* feat: environments plugin

* feat: improve code

* fix: improve code

* feat: improve code

* refactor: package description

* feat: bulk import

* fix: remove

* refactor: file manager support environment variables

* refactor: file manager support environment variables

* refactor: map manager support environment variables

* refactor: support environment variables

* refactor: support environment variables

* refactor: support delete environment variables

* fix: bug

* refactor: workflow support environment variables

* refactor: email  environment variables

* refactor: support bulk import

* refactor: support bulk import

* refactor: support bulk import

* refactor: support bulk import

* refactor: code improve

* feat: env

* chore: update

* feat: environment

* fix: bug

* fix: acl snippet

* fix: acl snippets

* chore: map manager

* refactor: support line break

* refactor: support password

* chore: environment variables

* fix: bug

* fix: bug

* chore: enviroment variables

* chore: system settings

* fix: improve code

* feat: verification

* feat: map

* feat: file-manager

* feat: notification

* fix: bug

* feat: workflow

* fix: improve code

* fix: bug

* feat: data-source

* feat: auth

* fix: error

* fix: bug

* refactor: description

* refactor: locale

* refactor: locale

* refactor: locale

* refactor: code improve

* refactor: locale

* refactor: locale

* style: style improve

* fix: error

* fix: bug

* fix: bug

* refactor: environment

* fix: ellipsis

* refactor: password

* fix: bug

* fix: bug

* fix: bug

* fix: bug

* fix: bug

* chore: test

* fix: cache

* fix: mysql dialect options

* refactor: email config form

* fix: bug

* fix: bug

* fix: authenticator.dataValues parse

* fix: include undefined

* fix: json

* fix: json parse

* chore: enviromentProvider

* fix: acl

* fix: rowKey

* fix: update ProviderOptions.tsx

* feat: get app instance

* fix: bug

* fix: text

* fix: build error

* fix: error

* chore: migration rules options

* chore: migration rules

* refactor: code improve

* feat: env v2

* chore: environment varibales

* chore: environment serve

* fix: getVariables

* feat: improve code

* fix: bug

* chore: collection options for migration

* chore: tree collection options

* chore: migration rules

* chore: migration rules

* chore: env api

* chore: env api

* fix: optionsKeysNotAllowedInEnv

* fix: required true

* fix: improve code

* fix: app refresh

* fix: remove db.import

* fix: type error

* fix: map

* refactor: locale improve

* refactor: tx-cos

* fix: undefined

* refactor: code improve

* chore: use bookworm

* fix: npm add user

* fix: npm login

* fix: npm adduser

* fix: npm adduser

* fix: expect

* fix: expect

* fix: environmentVariables

* refactor: support bulk delete & filter

* refactor: locale improve

* feat: filter

* refactor: useGlobalVariable

* fix: scope

* fix: bug

* fix: optionsKeysNotAllowedInEnv

* fix: test error

* fix: test

* fix: test

* feat: improve code

---------

Co-authored-by: chenos <chenlinxh@gmail.com>
Co-authored-by: Chareice <chareice@live.com>
2025-01-08 09:32:49 +08:00

157 lines
4.5 KiB
TypeScript

/**
* This file is part of the NocoBase (R) project.
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
* Authors: NocoBase Team.
*
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
* For more information, please refer to: https://www.nocobase.com/agreement.
*/
import { FormLayout } from '@formily/antd-v5';
import { Field } from '@formily/core';
import { observer, RecursionField, Schema, useField, useForm } from '@formily/react';
import React, { useEffect, useState } from 'react';
import { NAMESPACE } from './locale';
const schema = {
local: {
properties: {
documentRoot: {
title: `{{t("Destination", { ns: "${NAMESPACE}" })}}`,
type: 'string',
'x-decorator': 'FormItem',
'x-component': 'Input',
default: 'storage/uploads',
},
},
},
'ali-oss': {
properties: {
region: {
title: `{{t("Region", { ns: "${NAMESPACE}" })}}`,
type: 'string',
'x-decorator': 'FormItem',
'x-component': 'TextAreaWithGlobalScope',
required: true,
},
accessKeyId: {
title: `{{t("AccessKey ID", { ns: "${NAMESPACE}" })}}`,
type: 'string',
'x-decorator': 'FormItem',
'x-component': 'TextAreaWithGlobalScope',
required: true,
},
accessKeySecret: {
title: `{{t("AccessKey Secret", { ns: "${NAMESPACE}" })}}`,
type: 'string',
'x-decorator': 'FormItem',
'x-component': 'TextAreaWithGlobalScope',
'x-component-props': { password: true },
required: true,
},
bucket: {
title: `{{t("Bucket", { ns: "${NAMESPACE}" })}}`,
type: 'string',
'x-decorator': 'FormItem',
'x-component': 'TextAreaWithGlobalScope',
required: true,
},
thumbnailRule: {
title: 'Thumbnail rule',
type: 'string',
'x-decorator': 'FormItem',
'x-component': 'TextAreaWithGlobalScope',
},
},
},
'tx-cos': {
properties: {
Region: {
title: `{{t("Region", { ns: "${NAMESPACE}" })}}`,
type: 'string',
'x-decorator': 'FormItem',
'x-component': 'TextAreaWithGlobalScope',
required: true,
},
SecretId: {
title: `{{t("SecretId", { ns: "${NAMESPACE}" })}}`,
type: 'string',
'x-decorator': 'FormItem',
'x-component': 'TextAreaWithGlobalScope',
required: true,
},
SecretKey: {
title: `{{t("SecretKey", { ns: "${NAMESPACE}" })}}`,
type: 'string',
'x-decorator': 'FormItem',
'x-component': 'Password',
required: true,
},
Bucket: {
title: `{{t("Bucket", { ns: "${NAMESPACE}" })}}`,
type: 'string',
'x-decorator': 'FormItem',
'x-component': 'TextAreaWithGlobalScope',
required: true,
},
},
},
s3: {
properties: {
region: {
title: `{{t("Region", { ns: "${NAMESPACE}" })}}`,
type: 'string',
'x-decorator': 'FormItem',
'x-component': 'TextAreaWithGlobalScope',
required: true,
},
accessKeyId: {
title: `{{t("AccessKey ID", { ns: "${NAMESPACE}" })}}`,
type: 'string',
'x-decorator': 'FormItem',
'x-component': 'TextAreaWithGlobalScope',
required: true,
},
secretAccessKey: {
title: `{{t("AccessKey Secret", { ns: "${NAMESPACE}" })}}`,
type: 'string',
'x-decorator': 'FormItem',
'x-component': 'TextAreaWithGlobalScope',
'x-component-props': { password: true },
required: true,
},
bucket: {
title: `{{t("Bucket", { ns: "${NAMESPACE}" })}}`,
type: 'string',
'x-decorator': 'FormItem',
'x-component': 'TextAreaWithGlobalScope',
required: true,
},
endpoint: {
title: `{{t("Endpoint", { ns: "${NAMESPACE}" })}}`,
type: 'string',
'x-decorator': 'FormItem',
'x-component': 'TextAreaWithGlobalScope',
},
},
},
};
export const StorageOptions = observer(
(props) => {
const form = useForm();
const field = useField<Field>();
const [s, setSchema] = useState(new Schema({}));
useEffect(() => {
// form.clearFormGraph('options.*');
setSchema(new Schema(schema[form.values.type] || {}));
}, [form.values.type]);
return (
<FormLayout layout={'vertical'}>
<RecursionField key={form.values.type || 'local'} basePath={field.address} onlyRenderProperties schema={s} />
</FormLayout>
);
},
{ displayName: 'StorageOptions' },
);