30 Commits

Author SHA1 Message Date
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
Zeke Zhang
c0055ce826
perf(Page): improve performance (#5515)
* refactor(Tabs): remove observer and add memo

* refactor(useFilterFieldProps): use useCallback

* perf(FilterProvider): use startTransition

* perf(BlockRequestProvider): split context to improve rendering performance

* fix: make e2e tests pass

* perf(FilterBlockProvider): avoid rerender when updating state

* perf(DocumentTitleProvider): avoid rerender when updating state

* chore: set the default page title to empty string

* perf(BlockRequestProvider_deprecated): remove useless code

* perf(RecordProvider): add memo

* chore(Table): add comment

* perf: add memo to avoid rerender

* perf(InternalSchemaToolbar): improve style performance

* perf(ActionPage): improve style performance

* perf(BlockItem): improve style performance

* perf(Grid): improve style performance

* perf(IconField): improve style performance

* perf(MenuItem): improve style performance

* refactor(style): remove useless code

* perf(ArrayCollapse): improve style performance

* perf(acl): improve style performance

* perf(LinkageRules): improve style performance

* perf(ActionDrawerUsedInMobile): improve style performance

* perf(InternalPopoverNesterUsedInMobile): improve style performance

* perf(MobileActionPage): improve style performance

* perf(MobileTabsForMobileActionPage): improve style performance

* perf(Mobile): improve style performance

* perf(MobileTabBar): improve style performance

* perf(MobilePageContentContainer): improve style performance

* perf(MobilePageHeader): improve style performance

* perf(MobilePageNavigationBar): improve style performance

* perf(MobileNavigationBarAction): improve style performance

* chore: fix build error

* perf: some minor optimizations

* perf(CollectionFieldInternalField): optimize performance of default value processing

* refactor(CollectionFieldInternalField): remove useless code

* perf(PageContent): improve performance

* refactor(Table): use skeleton component

* perf(Table): improve pagination performance

* perf(TableSkeleton): improve skeleton component performance

* style(TableSkeleton): optimize style

* perf(PageTabs): cache rendered content to prevent re-rendering

* fix: fix add tab

* chore: make unit tests pass

* refactor: remove deprecated API

* fix(filterBlocks): make e2e tests pass

* fix(Action): make e2e tests pass

* perf(CollectionField): use custom RecursionField component to avoid unnecessary re-renders

* perf(Map): extract style

* Revert "perf(CollectionField): use custom RecursionField component to avoid unnecessary re-renders"

This reverts commit 203ecc1334429a8b77177337c8649ece1abdaeed.

* fix: fix e2e error

* fix: fix unit tests

* chore: fix build error

* perf(useResourceName): avoid unnecessary re-renders

* perf(TableBlockProvider): prevent unnecessary re-renders by splitting context

* perf(useDataBlockRequest): prevent unnecessary re-renders

* perf(useBlockCollection): avoid unnecessary re-renders

* perf(ActionContextProvider): add useMemo for context value

* perf(useTableBlockProps): avoid unnecessary re-renders

* perf(Details): add skeleton component

* chore(SchemaSettingsDropdown): make menu visibility more stable

* perf(withSkeletonComponent): use useDeferredValue

* refactor(ErrorBoundary): optimize code

* perf(plugin-charts-old): ignore old plugin context

* perf(CollectionHistoryProvider): optimize location context

* perf(MenuEditor): optimize router context

* fix(InternalAdminLayout): fix the issue of missing left sidebar menu

* perf(MenuEditor): prevent unnecessary re-renders

* perf(RouteSchemaComponent): prevent unnecessary re-renders

* perf(react-router-hooks): improve performance

* perf: add skeleton component for other blocks

* perf(CurrentUserProvider): remove loading

* refactor: remove useless code

* fix: fix the issue of redirecting to the homepage after refreshing the page

* perf(SystemSettingsProvider): remove loading

* perf(CollectionHistoryProvider): remove loading

* perf(useCurrentAppInfo): remove loading

* perf(RemoteCollectionManagerProvider): remove loading

* perf(RequestSchemaComponent): remove loading

* refactor(MenuEditor): remove useless code

* refactor: remove useless code

* perf(Page): reduce white screen time

* Revert "Revert "perf(CollectionField): use custom RecursionField component to avoid unnecessary re-renders""

This reverts commit b3a4201a82617534b9f5c3d16d4769f1327b3b02.

* perf(wip): add custom RecursionField component

* perf(RecursionField): complete custom RecursionField component

* perf(FilterAction): avoid unnecessary re-rendering

* perf(InputReadPretty): improve render performance

* fix(NocoBaseRecursionField): fix the issue where the page does not update

* perf(ReadPrettyInternalViewer): remove observer

* perf(Table): remove unnecessary context

* perf(NocoBaseField): customize a Field component

* chore: add comments

* fix(ButtonEditor): fix the issue where button title does not update after modification

* fix(ellipsis): fix the issue where the page does not refresh after modification

* refactor(NocoBaseField): rename and improve performance

* fix(NocoBaseField): add compile

* perf(Table): avoid rendering popup content

* chore: fix build error

* fix(popup): fix the issue where popups cannot be opened in embedded pages

* perf(CollectionField): remove ErrorBoundary

* chore(NocoBaseRecursionField): add isUseFormilyField

* perf(TemplateBlockProvider): use performance hooks

* refactor(FormV2): optimize skeleton screen effect

* perf(EditableAssociationField): remove observer

* perf(CollectionField): reduce nested component hierarchy

* refactor(SchemaSettingsSwitchItem): prevent UI refresh issues

* fix: fix field issues

* refactor(CollectionField): extract CollectionFieldInternalField component

* fix(DataSources): fix table error issue

* fix(drawer): fix drawer error

* fix(CollectionManagerSchemaComponentProvider): fix incorrect scope value

* fix(BodyRowComponent): fix issue with empty record

* fix(usePopupSettings): fix issue with popup not opening

* fix(BlockTemplates): fix table error issue

* refactor(NocoBaseRecursionField): set default value of isUseFormilyField to true

* refactor(Action): replace RecursionField with NocoBaseRecursionField

* fix(RequestSchemaComponent): fix issue with subpage not opening on mobile devices

* feat(loading): add delay for loading component

* fix(workflow): fix workflow table display issue

* chore(NocoBaseField): add compile method for default value

* fix(CollectionField): compatibility with legacy version

* fix(CollectionField): compatibility with legacy version

* fix(e2e): remove memoize function

* fix: add back dn.refresh

* refactor(CollectionField): reduce component rendering in specific cases

* Revert "fix(drawer): fix drawer error"

This reverts commit da8b43d9322aed39a1adf0ccdf24beca52a228ef.

* fix(popup): fix the issue where the second layer popup cannot be opened

* Revert "fix(popup): fix the issue where the second layer popup cannot be opened"

This reverts commit 71e9a43f361dd806affe9707254ed30882c27178.

* fix(popup): fix the issue where the second layer popup cannot be opened

* fix(popup): fix the issue where content is not displayed when reopening the popup

* fix(NocoBaseRecursionField): add default value

* refactor: revert to RecursionField version

* fix(Duplicate): fix the issue where values are not displayed

* Revert "refactor: revert to RecursionField version"

This reverts commit 087dcd4dc4d8d83f41272ac1b270dea281f49e08.

* fix(association-field): use NocoBaseRecursionField

* fix(menu): fix the issue where menu items are not displayed after adding

* fix(grid-card): make e2e pass

* fix(NocoBasePageHeader): fix the issue where title is not updated after modification

* fix(AdminLayout): fix page navigation issue

* fix(e2e): make e2e pass

* fix(e2e): fix the issue where data is not refreshed after closing the popup

* fix(e2e): fix the issue where relationship field popup variables are displayed incorrectly

* fix(e2e): fix JSON.stringify circular reference issue

* fix(e2e): make mobile e2e more stable

* fix(e2e): fix subform display issue

* fix(e2e): fix field pattern state

* chore(test): make some unit tests pass

* fix(test): make some unit tests pass

* fix(test): make unit tests pass

* perf(SortableItem): reduce unnecessary component rendering in non-configuration mode

* chore(Table): use startTransition

* perf(page): implement keep-alive effect

* chore: remove loading delay

* chore(e2e): skip one e2e

* chore: fix build error

* refactor: extract KeepAlive component and fix e2e test errors

* fix(test): make unit tests pass

* fix(KeepAlive): children should be a function

* fix(popup): avoid being affected by KeepAlive

* perf(KeepAlive): reduce lag when switching pages

* refactor(DndContext): extract InternalDndContext component

* refactor(KeepAlive): avoid memory overflow

* chore: limit maximum number of cached pages

* refactor: use useEffect instead of useLayoutEffect

* refactor(AdminLayout): extract NocoBaseLogo component

* perf: reduce lag when switching pages

* chore(KeepAlive): increase maximum number of cached pages

* perf(Grid): optimize rendering performance in non-configuration mode

* perf(Table): reduce one re-render when switching pagination

* refactor(SubTable): separate SubTable's Table component from normal Table component

* chore(test): make unit tests pass

* fix(e2e): fix the issue where table data does not refresh after form submission

* chore(e2e): update some e2e tests

* fix(Table): fix the issue where Dropdown component disappears after adding association fields

* perf(Table): optimize refresh performance

* refactor(NocoBaseField): simplify code writing

* perf(Context): improve performance

* perf(Context): improve render performance

* perf(Menu): improve menu performance

* perf: lower the priority of updating title

* perf(Page): avoid re-layout when switching pages

* perf(Table): reduce repainting time

* perf(popup): improve popup opening speed

* perf(popup): using toJSON for deep clone, faster than lodash's cloneDeep

* perf(withSkeletonComponent): defer loading state update

* perf(PopupRouteContextResetter): improve render performance

* perf(popup): improve popup closing speed

* perf(popup): improve popup closing performance

* perf(SchemaToolbar): avoid excessive style calculations

* perf(SchemaSettingsDropdown): avoid using useLayoutEffect

* perf(popup): improve popup opening speed

* fix(pageTab): fix the error when switching tab pages

* fix(popup): fix the issue of duplicate URLs caused by rapid button clicks

* refactor: extract NocoBasePageHeaderTabs

* fix(pageTabs): fix settings not refreshing after changes

* chore(test): make unit tests pass

* chore(test): update test case

* chore(SchemaInitializerSwitch): update unit test

* chore(useVariables): update unit tests

* chore(e2e): make some e2e tests pass

* chore(e2e): make e2e tests pass

* chore(e2e): update tests to make it pass

* fix(SideMenu): fix the issue where is not refresh when adding a page

* fix(Menu): fix the issue where is not refresh when changing menu

* fix(e2e): fix e2e error

* fix(e2e): fix refresh issues

* fix(e2e): fix some bugs

* fix(e2e): fix e2e error

* fix(test): fix unit tests

* fix(popup): prevent rapid clicking issues

* fix(e2e): fix e2e error

* fix(e2e): fix refresh issues

* fix(Table): do not change table pagination after switching pages

* perf(Menu): improve performance

* perf(Table): reduce row render times

* fix(KeepAlive): fix lag when switching designable

* fix(e2e): fix e2e error

---------

Co-authored-by: chenos <chenlinxh@gmail.com>
2024-11-27 07:19:52 +08:00
chenos
3e9ff85305
feat: support line break in system title (#5211) 2024-09-05 22:14:32 +08:00
Junyi
924a328501
fix(client): fix upload logo in system settings (#4564) 2024-06-05 14:50:55 +08:00
Junyi
1dc7a39780
feat(plugin-fm): make rules configurable (#4118)
* feat(plugin-fm): make rules configurable

* fix(client): fix upload test cases

* refactor(client): remove dulicated code

* refactor(client): upload component

* refactor(client): remove a lot of duplicated code

* fix(client): fix upload in system settings

* fix(client): fix test case

* fix(client): fix test case

* fix(client): fix test case

* chore: update yarn.lock

* fix(client): fix test case

* fix: api mock

* refactor(client): refactor hooks

* docs(client): add demo code

* fix: ci

* fix(client): fix import package

* fix: filesize

* fix(client): fix upload component

* fix(client): deprecate preview component and move to file-manager

* fix(plugin-fm): fix storage changes in attachment field and locales

* refactor(plugin-fm): add migration for attachment field storage

* test(plugin-fm): add test case

* feat(plugin-fm): add storage size component

* fix(plugin-fm): fix component

* refactor(plugin-fm): adjust constant

* fix(plugin-fm): fix default local size limit

* fix(plugin-fm): fix test cases

* fix(plugin-fm): fix test case

* fix(plugin-fm): fix rule hook

---------

Co-authored-by: chenos <chenlinxh@gmail.com>
2024-05-29 09:33:23 +08:00
jack zhang
62b2b5c68b
chore: add copyright information to the file header (#4028)
* fix: add license code

* fix: bug

* fix: bug

* fix: upgrade

* fix: improve

* chore: add copyright information to the file header

* fix: d.ts bug

* fix: bug

* fix: e2e bug

* fix: merge main

---------

Co-authored-by: chenos <chenlinxh@gmail.com>
2024-04-30 15:51:31 +08:00
jack zhang
454d1d34ed
fix: add displayName (#3628)
* fix: context add displayName

* fix: observer add displayName

* fix: memo component add displayName

* fix: forwordRef component add displayName
2024-03-06 18:22:31 +08:00
chenos
05040a1c5f
fix: client docs (#2965)
* fix: application bug

* fix: test error

* feat: client doc

* fix: delete it.only

* fix: demos

* fix: ci

* fix: create index.md

---------

Co-authored-by: dream2023 <1098626505@qq.com>
2023-11-06 11:50:13 +08:00
被雨水过滤的空气-Rain
a57c93d35b
feat: support e2e (#2624)
* chore: upgrade vitest to v0.34.3

* feat: setup NocoBase

* chore: preparing test env

* test: add a test of rigster

* refactor: rename test dir to testUtils

* chore: add tests

* chore: add ci for e2e

* chore: fix ci

* chore: avoid error in CI

* chore: add some utils for test

* chore: make more stable

* chore: should not close server in CI

* chore: add comments

* chore: change output dir

* fix: should use current branch to run tests

* chore: should request systemSettings by api in e2e

* chore: should build first in e2e CI

* chore: remove key

* chore: use execa to replace execSync

* refactor: extract test suite

* chore: add gotoPage

* chore: update uid of pageSchema

* chore: update collection name

* chore: use faker.js to generate data

* refactor: extract page config

* chore: ignore for association fields in faker

* chore: add testid

* chore: optimize action designer

* chore: associationFilter.Item designer

* chore: AssiciationFilter & BlockItem

* Revert "chore: AssiciationFilter & BlockItem"

This reverts commit b418df650e106fd0c8e23035d2f75acf60dcafe4.

* Revert "chore: associationFilter.Item designer"

This reverts commit 7aa4d35c1af7f3a780b370d8b1b44aac01697be3.

* Revert "chore: optimize action designer"

This reverts commit ff717b972ffd64f7968d565a3a84ad617ff889e2.

* chore: optimize Designer

* chore: compat with older browsers

* chore: use describe to avoid hooks is not run

* chore: add no-floating-promises to eslint rules

* chore: support argv

* chore: demo

* chore: better testId

* chore: change .e2e.ts to .test.ts

* fix(SchemaInitializer): avoid error

* refactor: move e2eUtils.ts to @nocobase/test

* fix: move e2eUtils to client

* chore: remove uselesscode

* refactor: add .env.e2e.example

* chore: optimize log

* refactor: use mockPage to replace gotoPage

* chore: update env.e2e

* chore: add APP_BASE_URL

* chore: gitigore

* test: add test related of menu

* chore: add SOCKET_PATH in env

* fix(vscode): load env when using vscode plugin
2023-09-27 20:00:17 +08:00
Rain
893b2d71bc chore: add NOCOBASE_SYSTEM_SETTINGS to localStorage 2023-09-10 00:27:09 +08:00
ChengLei Shao
39ee4b8873
feat: application supervisor (#2353)
* chore: skip sync localization-management plugin enable status

* chore: unSyncPlugins array

* chore: remove install at dev

* chore: gateway and supervisor

* chore: install command

* chore: remove app manager

* chore: share plugin

* chore: wsserver

* chore: websocket server

* chore: websocket connection with app status

* feat: socket server at gateway

* chore: loading message

* chore: ready status

* chore: handle app error

* feat: restart app at supervisor

* feat: health check endpoint

* chore: test

* chore: test

* chore: test

* chore: test

* chore: build

* chore: test

* chore: build

* chore: application ready status

* chore: error message

* chore: handle application error

* chore: handle error in load

* chore: report error in websocket

* chore: ws error

* chore: ws error

* chore: typo

* chore: switch app ready status at install

* chore: test

* chore: test

* chore: test

* chore: test

* feat: add WebSocket client

* chore: start gateway

* chore: start command in application

* chore: code

* chore: pm command

* chore: run start after load sub app

* feat: application fsm

* refactor: server life cycle (#2402)

* refactor: server life cycle

* fix: test error

* fix: test error

* fix: test error

* fix: app.start

* fix: cronjob stop

* fix: db.sync before upgrade

* fix: pm.get

* fix: test error

* fix: test error

* fix: test error

* test: add test cases

* fix: remove PluginType

* chore: start application after install

* chore: fsm

* chore: working status

* chore: working command

* chore: remove swith app ready status

* chore: switch status after working done

* chore: ws status

* chore: gateway error

* chore: test

* chore: stopping status

* chore: test

* chore: test

* feat: app proxy

* chore: application destory

* chore: application message changed with status

* chore: test

* chore: test timeout

* test: remove listener add by plugin

* test: remove listener add by plugin

* chore: test

* feat: app maintaining

* fix: add AppMaintainingDialog

* feat: off

* test: gateway http response

* test: gateway with errors

* chore: unkown error

* chore: websocket message

* chore: ws message

* chore: code

* chore: error format

* chore: delay app load

* feat: improve code

* chore: application initializing status

* chore: supervisor with app status

* chore: command status response

* chore: test

* chore: ws message

* chore: test

* fix: command running message

* feat: restart

* chore: code

* chore: status transition

* chore: test

* fix: improve code

* fix: error

* fix: restart

* fix: command

* chore: reset client app tag when app selector changed

* chore: error report

* fix: application status

* fix: build

* chore: disable help command dispatch

* chore: test

* test: multi apps test

* fix: improve code

* fix: test

* fix: test

* fix: multi apps single running

* fix: improve code

* fix: app status

* chore: move plugin static file to gateway

* feat: static file handler

* chore: test

* chore: enable plugins in share collection

* chore: gateway serve upload files

* fix: improve client

* chore: ws nginx config

* fix: gateway with naonoid

* fix: db sync

* fix: loading

* fix: ping

* fix: locale load

* fix: yarn start --quickstart

* fix: add debug log

* chore: application started event

* chore: running working message payload

* chore: nginx log

* chore: nginxconf

* chore: working message log

* feat: logs

* feat: compression

* fix: remove koa-send and koa-static

* fix: remove -e

* fix: remove nginx

* fix: remove -e

* fix: __appName

* chore: delay install sub application

* chore: sync plugin status

* fix: boot sub app

* fix: main app reload

* fix: test

* fix: app status

* test: field.bind block event loop

* feat: newrelic

* feat: debug log

* chore: upgrade

* fix(file-manager): test error

* fix: default app selector

* fix: reload after maintained

* chore: boot sub app

* chore: application destroy command

* chore: destroy command

* chore: clean code

* chore: package.json

* chore: maintaining message

* chore: test

* fix: collection.sync

* feat: add test cases

* chore: application

* fix: test error

* feat: improve codes and add test cases

* fix: test error

* fix: pm enable and disable

* fix: pm.disable

* feat: update docs

* chore: update dockerfile

---------

Co-authored-by: chenos <chenlinxh@gmail.com>
2023-08-24 17:47:45 +08:00
被雨水过滤的空气-Rain
4812cc5692
feat: support custome themes (#2228)
* feat: create custom-theme plugin

* feat: add custom-theme

* chore: add plugin name and description

* chore: add deps

* chore: optimize deps

* refactor: rename

* chore: add antd-token-previewer

* chore: add deps in plugin

* feat: add theme-editor

* feat: add theme-editor

* feat: add settings

* feat: add theme collection

* refactor: migration to the components folder

* feat: add ThemeList

* refactor: be better

* feat: export createStyles

* feat: implement ThemeCard (T-723)

* style: optimize style

* feat: add ThemeEditorProvider

* feat: add ToEditTheme

* chore: add isBuiltIn field

* feat: implement WYSIWYG

* refactor: migrate i18n

* feat: support to save config

* feat: add validation rule

* refactor: remove useless code

* refactor: optimize GlobalThemeProvider

* feat: add CurrentUserSettingsMenuProvider

* feat: support switching themes

* refactor: migrate CurrentUserProvider to app root

* feat: add InitializeTheme

* fix: fix preview demo

* fix: filter themes

* fix: not valid when editing theme

* fix: should restore the previous theme when closing theme editor

* fix: fix algorithm

* fix: the theme that was just saved should be applied

* refactor: loacl antd-token-previewer

* fix: should be based on the current theme when editing themes

* feat: support to edit theme

* perf: reduce executions

* feat: add animation

* fix: fix the type error of useRequest

* feat: remove built-in themes

* chore: reinstall deps

* fix: fix version of deps

* fix: delete client.d.ts to fix build error

* chore: reinstall deps

* fix: fix build

* fix: fix build

* fix: avoid build errors

* fix: fix crashing

* fix: use value instead of defaultValue

* fix: avoid error

* fix: avoid closure

* fix: fix build

* fix: fix style of login page

* refactor(page): fix style

* fix: fix style of PageHeader

* refactor: fix style of Drawer

* refactor: add FormDialog to loacl

* refactor: fix style of SchemaSettings.ModalItem

* refactor: fix style of pm/Card

* fix: fix text color of pm/Marketplace

* fix: fix table error

* refactor: fix style of collection-manager/summary

* refactor: fix style of fields drawer

* chore: reinstall deps

* fix: fix build

* fix: fix build of custom-theme

* fix: should export Plugin

* refactor: fix style of GraphDrawPage

* chore: upgrade plugin version

* refactor: fix style of Modal by using antd App

* refactor: fix style of FormDialog by using local version

* refactor(workflow): refactor style using antd-style in workflow

* fix(workflow): fix style of workflow

* fix: fix size

* refactor: add --nb-header-height

* feat: remove theme configuration from system settings

* refactor: migrate useUpdateThemeSettings to a new file

* refactor: rename theme to themeId

* feat: add updateSystemThemeSettings

* refactor: migrate utils function

* feat: use localStorage to avoid theme invalid in login page

* fix: fix style of login page

* fix: fix style of Drawer

* feat: optimize style of theme card

* fix: should use a empty object to reset theme

* fix: fix test of Page

* fix: fix test of Application

* fix: change backgroundColor of login page

* fix: fix all style of modal

* fix: fix gap between blocks (T-896)

* fix: fix color of font (T-905)

* fix: fix build

* fix: fix can not scroll in Drawer (T-897)

* fix: fix width of built-in plugins page (T-900)

* fix: fix style of import Modal (T-907)

* fix: fix style of calendar (T-908)

* fix: fix style of kanban (T-909)

* fix: fix style of Gantt (T-910)

* fix: fix style of Collapse (T-915)

* fix: fix style of mobile (T-916)

* fix: fix style of PageHeader (T-958)

* fix: optimize background color of Drawer

* fix: fix style of notification

* fix: fix T-1000

* fix: fix style of LinkageHeader (T-1003)

* fix: fix T-1004

* fix: fix style of scroll bar of chart (T-911)

* fix: fix style of workflow drawer (T-997)

* fix: fix T-922

* fix: fix T-924

* refactor: rename custom-theme to theme-editor

* fix: fix T-999

* fix: fix T-1011

* fix: fix error

* fix: optimize dark mode (T-921)

* fix: fix style of markdown (T-1020)

* fix: fix style of data template (T-1025)

* fix: fix style of rich text (T-1026)

* fix: fix style of a

* fix: fix style of XButton (T-1028)

* fix: fix T-1027

* fix: fix color of variable tag (T-1030)

* chore: translation

* feat: add a modal before create new theme (T-1024)

* feat: highlight card when editing theme (T-1031)

* feat: support to change theme name (T-1023)

* fix: api.auth.getOption('theme')

* fix: fix T-1032

* fix: fix feedback in feishu group

* refactor: code review

* fix: fix test

* chore: rename

* fix: useNotificationMiddleware

* refactor: revert

* fix: fix build

* fix: notification

* refactor: migrate CurrentUserProvider from Application to NocoBaseBuildInPlugin

* fix: fix test

* refactor: fix code review

* chore: avoid test error

---------

Co-authored-by: chenos <chenlinxh@gmail.com>
2023-07-16 12:46:25 +08:00
被雨水过滤的空气-Rairn
fd36c970bc
refactor(client)!: upgrade antd to v5 (#2078)
* refactor: change moment to dayjs

* refactor: remove antd css

* refactor: change @formily/antd to @formily/antd-v5

* chore: add dep

* chore: upgrade babel/core and typescript

* refactor: rename moment to dayjs

* fix(dayjs): add plugins

* refactor: fix type errors

* refactor: change default export to named export

* chore: upgrade ts-loader

* refactor: rename moment to dayjs

* refactor: fix type errors

* chore: upgrade deps for build

* fix: fix build errors

* fix: add antd reset css

* fix: fix build error

* chore: add __builtins__

* chore: optimize genStyleHook

* refactor(Calendar): less to css-in-js

* refactor(acl): less to css-in-js

* refactor(board): less to css-in-js

* chore: add antd-style

* refactor(acl): use antd-style

* refactor(board): use antd-style

* refactor: schema-initializer

* refactor: refactor genStyleHook

* refactor: kanban

* refactor: filter

* refactor: upload

* refactor: markdown

* refactor: rename className to componentCls

* refactor: rich-text

* style: fix style

* fix: fix merge error

* chore: update yarn.lock

* chore: upgrade formily

* style: fix pageHeader

* style: fix add button style

* style: fix header menu color

* chore: update yarn.lock

* chore: upgrade deps

* test: fix tests

* test: fix tests

* fix: fix build error

* fix: fix style of plugin doc

* fix: fix tests

* fix: fix drag bug

* refactor: remove useless code

* fix: fix Modal style (T-621)

* fix: fix box-shadow of subMenu (T-622)

* fix: fix style of linkage rules (T-623)

* fix: fix style of DataTemplate

* fix: fix style of variable (T-620)

* chore: update yarn.lock

* fix: avoid test failed

* test: fix error

* chore: update yarn.lock

* test: fix error

* test(dayjs): fix error

* fix: should delay show menu to avoid the menu not hidden

* test: skip failure test

* fix(mouseEnterDelay): change default value from 100 to 150

* test: avoid failed

* refactor: rename component names

* chore: optimize types

* chore: lock antd version

* fix: fix build

* fix: fix build

* fix: layout bg color use variable

* fix: fix style of buttons

* feat: remove theme config

* fix(calendar): fix style

* fix(mobile-client): fix dialog style

* fix: fix test

* refactor: make code gooder

* chore: change code

* fix: fix T-847

* fix: fix T-845

* fix: display block

* fix: danger button

* refactor: make tester better

* fix: change moment to dayjs

* fix: build error

* fix: import dayjs/plugin/isSameOrBefore

* refactor: downgrade @testing-library/react to fix warning

* fix: fix CI

* fix: upgrade deps to fix build

* fix: fix test

* fix: skip some filed tests to avoid error

* fix: fix build errors that maked by merge code

* refactor: remove moment

* fix: error

* feat: update doc

---------

Co-authored-by: chenos <chenlinxh@gmail.com>
2023-07-08 08:26:27 +08:00
jack zhang
2cb1203aa4
refactor(client)!: application, router and plugin (#2068)
BREAKING CHANGE:

* refactor: update umi version 3.x to version 4.x

* refactor: update react-router-dom version to 6.x

* refactor(react-router-dom): change Layout Component `props.children` to `<Outlet />`

* refactor(react-router-dom): change <Route /> props and <RouteSwitch /> correct

* refactor(react-router-dom): replace `<Redirect />` to `<Navigate replace />`

* refactor(react-router-dom): replace `useHistory` to `useNavigate`

* refactor(react-router-dom): replace `useRouteMatch` to `useParams`

* refactor(react-router-dom & dumi): fix <RouteSwitch /> & umi document bug

* refactor(react-router-dom): `useRoutes` Optimize `<RouteSwitch />` code

* refactor(react-router-dom): update `Route` types and docs

* refactor(react-router-dom): optimize RouteSwitch code

* refactor(react-router-dom): `useLocation` no generics type

* refactor(react-router-dom): add `less v3.9.0` to `resolutions` to solve the error of `gulp-less`

* refactor(react-router-dom): fix `<RouteSwitch />`  `props.routes` as an array is not handled

* chore: upgrade `dumi` and refactor docs

* fix: completed code review, add `targets` to solve browser compatibility & removed `chainWebpack`

* refactor(dumi): upgraded dumi under `packages/core/client`

* refactor(dumi): delete `packages/core/dumi-theme-nocobase`

* refactor(dumi): degrade `react`  & replace `dumi-theme-antd` to `dumi-theme-nocobase`

* refactor(dumi): solve conflicts between multiple dumi applications

* fix: login page error in react 17

* refactor(dumi): remove less resolutions

* refactor(dumi): umi add `msfu: true` config

* fix: merge bug

* fix: self code review

* fix: code reivew and test bug

* refactor: upgrade react to 18

* refactor: degrade react types to 17

* chore: fix ci error

* fix: support routerBase & fix workflow page params

* fix(doc): menu externel link

* fix: build error

* fix: delete

* fix: vitest error

* fix: react-router new code replace

* fix: vitest markdown error

* fix: title is none when refresh

* fix: merge error

* fix: sidebar width is wrong

* fix: useProps error

* fix: side-menu-width

* fix: menu selectId is wrong & useProps is string

* fix: menu selected first default & side menu hide when change

* fix: test error & v0.10 change log

* fix: new compnent doc modify

* fix: set umi `fastRefresh=false`

* refactor: application v2

* fix: improve code

* fix: bug

* fix: page = 0 error

* fix: workflow navigate error

* feat: plugin manager

* fix: afterAdd

* feat: complete basic functional refactor

* fix: performance Application

* feat: support client and server build

* refactor: nocobase build-in plugin and providers

* fix: server can't start

* refactor: all plugins package `Prodiver` change to `Plugin`

* feat: nested router and change mobile client

* feat: delete application-v1 and router-switch

* feat: improve routes

* fix: change mobile not nested

* feat: delete RouteSwitchContext and change buildin Provider to Plugin

* feat: delete RouteSwitchContext plugins

* fix: refactor SchemaComponentOptions

* feat: improve SchemaComponentOptions

* fix: add useAdminSchemaUid

* fix: merge master error

* fix: vitest error

* fix: bug

* feat: bugs

* fix: improve code

* fix: restore code

* feat: vitest

* fix: bugs

* fix: bugs

* docs: update doc

* feat: improve code

* feat: add docs and imporve code

* fix: bugs

* feat: add tests

* fix: remove deps

* fix: muti app router error

* fix: router error

* fix: workflow error

* fix: cli error

* feat: change NoCobase -> Nocobase

* fix: code review

* fix: type error

* fix: cli error and plugin demo

* feat: update doc theme

* fix: build error

* fix: mobile router

* fix: code rewview

* fix: bug

* fix: test bug

* fix: bug

* refactor: add the "client" directory to all plugins

* refactor: modify samples client and plugin template

* fix: merge error

* fix: add files in package.json

* refactor: add README to files in package.json

* fix: adjust plugins depencies

* refactor: completing plugins' devDependencies and dependencies

* fix: bug

* refactor: remove @emotion/css

* refactor: jsonwebtoken deps

* refactor: remove sequelize

* refactor: dayjs and moment deps

* fix: bugs

* fix: bug

* fix: cycle detect

* fix: merge bug

* feat: new plugin bug

* fix: lang bug

* fix: dynamic import bug

* refactor: plugins and example add father config

* feat: improve code

* fix: add AppSpin and AppError components

* Revert "refactor: plugins and example add father config"

This reverts commit 483315bca5524e4b8cbbb20cbad77986f081089d.

# Conflicts:
#	packages/plugins/auth/package.json
#	packages/plugins/multi-app-manager/package.json
#	packages/samples/command/package.json
#	packages/samples/custom-collection-template/package.json
#	packages/samples/ratelimit/package.json
#	packages/samples/shop-actions/package.json
#	packages/samples/shop-events/package.json
#	packages/samples/shop-modeling/package.json

* feat: update doc

---------

Co-authored-by: chenos <chenlinxh@gmail.com>
2023-07-07 14:35:22 +08:00
jack zhang
d76e8fb87f
refactor: upgrade umi, react and react-router-dom (#1921)
* refactor: update umi version 3.x to version 4.x

* refactor: update react-router-dom version to 6.x

* refactor(react-router-dom): change Layout Component `props.children` to `<Outlet />`

* refactor(react-router-dom): change <Route /> props and <RouteSwitch /> correct

* refactor(react-router-dom): replace `<Redirect />` to `<Navigate replace />`

* refactor(react-router-dom): replace `useHistory` to `useNavigate`

* refactor(react-router-dom): replace `useRouteMatch` to `useParams`

* refactor(react-router-dom & dumi): fix <RouteSwitch /> & umi document bug

* refactor(react-router-dom): `useRoutes` Optimize `<RouteSwitch />` code

* refactor(react-router-dom): update `Route` types and docs

* refactor(react-router-dom): optimize RouteSwitch code

* refactor(react-router-dom): `useLocation` no generics type

* refactor(react-router-dom): add `less v3.9.0` to `resolutions` to solve the error of `gulp-less`

* refactor(react-router-dom): fix `<RouteSwitch />`  `props.routes` as an array is not handled

* chore: upgrade `dumi` and refactor docs

* fix: completed code review, add `targets` to solve browser compatibility & removed `chainWebpack`

* refactor(dumi): upgraded dumi under `packages/core/client`

* refactor(dumi): delete `packages/core/dumi-theme-nocobase`

* refactor(dumi): degrade `react`  & replace `dumi-theme-antd` to `dumi-theme-nocobase`

* refactor(dumi): solve conflicts between multiple dumi applications

* fix: login page error in react 17

* refactor(dumi): remove less resolutions

* refactor(dumi): umi add `msfu: true` config

* fix: merge bug

* fix: self code review

* fix: code reivew and test bug

* refactor: upgrade react to 18

* refactor: degrade react types to 17

* chore: fix ci error

* fix: support routerBase & fix workflow page params

* fix(doc): menu externel link

* fix: build error

* fix: delete

* fix: vitest error

* fix: react-router new code replace

* fix: vitest markdown error

* fix: title is none when refresh

* fix: merge error

* fix: sidebar width is wrong

* fix: useProps error

* fix: side-menu-width

* fix: menu selectId is wrong & useProps is string

* fix: menu selected first default & side menu hide when change

* fix: test error & v0.10 change log

* fix: new compnent doc modify

* fix: set umi `fastRefresh=false`

* refactor: application v2

* fix: improve code

* fix: bug

* fix: page = 0 error

* fix: workflow navigate error

* feat: plugin manager

* fix: afterAdd

* feat: update docs

* feat: update docs

* fix: page tab change not work

* fix: login redirect query param doesn't work

* fix: bug and doc

* feat: update docs

* fix: ci error

* fix: merge main

* feat: update docs

* feat: update docs

* feat: update docs

* chore(versions): 😊 publish v0.10.0-alpha.1

* fix: translations

* chore: backend node test max old space size

* docs: add useSearchParams

---------

Co-authored-by: chenos <chenlinxh@gmail.com>
Co-authored-by: ChengLei Shao <chareice@live.com>
2023-06-20 11:48:02 +08:00
被雨水过滤的空气-Rairn
58840e5fab
refactor(PluginManager): remove useless code (#2022)
* refactor(PluginManager): remove useless code

* chore: fix build error
2023-06-14 09:35:09 +08:00
Dunqing
69bbfee67a
feat: use ActionContextProvider instated of ActionContext.Provider (#2019) 2023-06-09 13:05:05 +08:00
YANG QIA
24601aa66f
feat(auth): support custom authentication (#2007)
* feat(auth): init auth package & collection

* feat(auth): register

* feat(auth): use authenticator

* feat(auth): mapRoles

* feat(auth): refactor

* feat(auth): base auth class

* feat(auth): add plugin

* chore(auth): test

* chore(auth): add test cases

* feat(auth): authenticators pane

* chore(auth): custom hook useAuthTypes

* feat(auth): authenticator pane

* chore(auth): store options schema using context

* feat(auth): signInPage provider

* feat(auth): signUpPage provider

* chore(auth): solve build errors

* chore(auth): add dependency

* chore(auth): remove dependency cycles

* chore(auth): add plugin-auth to preset

* chore(auth): fix test

* feat(auth): authenticator enable status

* fix(test): fix test using new authentication

* feat(auth): migration, set up basic auth

* chore(auth): can set options ui by component

* fix(test): workflow manunal.test

* fix(test): typo

* feat(auth): support multi-language

* chore(auth): imporve code

* chore(auth): hide button if no configuration

* chore(auth): readme

* chore(auth): remove allowSignup prop

* chore(auth): move configure pane to edit form

* fix(auth): jwt options bug

* feat(auth): init sms-auth

* chore(auth): at least authenticator required

* chore(auth): add test

* feat(auth): support sms auth

* fix(auth): fix test

* chore(auth): move findOrCreateUser to AuthModel

* chore(auth): history compatible processing

* feat(auth): support SAML auth

* chore(auth): saml auth list

* chore(saml-auth): improve ui

* Merge branch 'main' into feat/authentication

* chore(auth): improve code

* fix(saml-auth): fix bug

* fix(saml-auth): fix saml options

* chore(saml-auth): compatible processing && ut

* fix(auth): signin page bug

* chore(auth): saml compatible processing

* feat(auth): oidc-auth

* fix(oidc-auth): bug

* fix(oidc-auth): bug

* fix(auth): fix test

* chore(auth): filter enabled authenticator

* chore(oidc): add field map

* chore(auth): update readme

* docs(auth): create sms-auth readme

* feat(auth): allow signup config

* test(auth): fix test

* feat(auth): allow saml and oidc use http

* chore(oidc-auth): extends timeout

* docs(auth): update readme

* feat(auth): support sort

* docs(saml): update readme

* feat(auth): support sort all authenticator

* Merge branch 'main' into feat/authentication

* Merge branch 'main' into feat/authentication

* feat: improve code

* docs(auth): add doc

* Merge branch 'main' into feat/authentication

* chore: update yarn.lock

* feat: improve code

* chore(acl): write role to acl if it exists in database and not found … (#2001)

* chore(acl): write role to acl if it exists in database and not found in acl

* fix: test

* fix: eager load with nested association (#2002)

* chore: upgrade vitest

* chore: edit

* refactor: auth class

* fix: set options

* chore(acl): write role to acl if it exists in database and not found … (#2001)

* chore(acl): write role to acl if it exists in database and not found in acl

* fix: test

* fix: eager load with nested association (#2002)

* chore: upgrade vitest

* chore: add migrations

* test: fix api-client test

* chore: add sms-auth

* feat: avoid no permission after auth type disabled

* fix: translation

---------

Co-authored-by: chenos <chenlinxh@gmail.com>
2023-06-07 23:46:42 +08:00
被雨水过滤的空气-Rairn
47838889f4
test: add tests for client (#1960)
* feat: add test utils

* test: fix compatibility problem

* refactor: use esm

* refactor: change require to import

* test: add a test

* chore: optimize launch.json

* chore(jest): optimize config

* test: fix failed

* test(Action): fix failed

* test: migration test from nocobase-next

* test: fix failed

* chore: set css to false

* fix: fix errors

* test(Filter): add test

* test(BlockItem): add test

* test(Calendar): add test

* refactor: migrate testUtils to client

* fix: avoid error

* refactor: fix lint error

* Revert "refactor: migrate testUtils to client"

This reverts commit ae569e2021a5c720111518cf3f2236e761a7186d.

* test: fix test failed

* refactor: migrate tesetUtils to @nocobase/test/client

* fix(Select): fix BUG

* refactor: remove useless code

* Revert "refactor: migrate tesetUtils to @nocobase/test/client"

This reverts commit 70d2211d5af546ae3fffaf5b53a326be8e194b34.

* test(AssociationSelect): add test

* test(CardItem): add test

* test(CollectionSelect): add test

* test(Cron): add test

* test(Details): add test

* test(ErrorFallback): add test

* test(Form): add test

* fix: fix CI

* test(FormItem): add test

* test(FormV2): add test

* test(G2Plot): add test

* test(Gantt): add test

* test(Grid): add test

* test(GridCard): add test

* test(Kanban): add test

* test(List): add test

* test(Menu): add test

* test(Page): add test

* test(Pagination): add test

* test(Preview): add test

* test(RemoteSelect): add test

* test: fix: failed

* refactor: remove useless code

* test(Table): add test

* test(TableV2): add test

* test(Tabs): add test

* test(Variable): add test

* test(Upload): add test

* chore: comment

* Revert "refactor: change require to import"

This reverts commit 3a23607e6faeda6f8b5bee02b9d8fa33bf9d2684.

* refactor: remove useless code

* fix: fix translation bug

* fix: fix export position

* test: update snap
2023-06-07 10:37:10 +08:00
Junyi
36d16bc015
refactor(plugin-fm): change api and allow to select storage (#1250)
* refactor(plugin-fm): change api and allow to select storage

* fix(plugin-fm): fix lint errors and demo actions

* refactor(plugin-fm): refactor action codes

* fix(plugin-fm): fix api in test

* fix(plugin-fm): fix build

* fix(plugin-fm): fix locale

* refactor(plugin-fm): hide storage from api and use sourceField param

* fix(plugin-fm): fix storage select load

* fix: improve code

* fix(plugin-fm): change to attachmentField

* refactor(plugin-fm): change middleware name

* fix(plugin-fm): fix params in test cases

---------

Co-authored-by: chenos <chenlinxh@gmail.com>
2023-06-06 19:30:42 +08:00
chenos
883f1e6fd1
fix: eslint (#1759)
* fix: eslint

* fix: eslint --fix

* fix: changelog
2023-04-25 13:12:14 +08:00
chenos
4427c70087
feat: compact theme (#1574)
* feat: compact theme

* fix: theme

* fix: styling

* fix: margin

* feat: improve

* fix: remove console.log
2023-03-19 23:40:11 +08:00
chenos
e913af7f32
fix: improve translation 2023-03-02 11:36:26 +08:00
chenos
cc47041519
feat: load multiple languages dynamically (#1355)
* feat: load multiple languages dynamically

* fix: map locale

* fix: antd

* fix: locale

* fix: th

* fix: cronstrue locales

* fix: improve code

* fix: defaults
2023-01-13 10:55:04 +08:00
chenos
f9f8dc78f4
refactor: plugin manager (#775)
* feat: dynamic import plugin client

* refactor: pm

* chore: improve cli

* feat: improve code

* feat: update dependences

* feat: hello plugin

* fix: plugin.enabled

* fix: test error

* feat: improve code

* feat: pm command

* feat: add samples

* fix: redirect

* feat: transitions

* feat: bookmark

* feat: add pm script
2022-09-18 14:10:01 +08:00
Junyi
7e6a394f73
feat(plugin-verification): add plugin-verification and phone for users (#722)
* feat(plugin-verification): add plugin-verification and phone for users

* feat(plugin-verification): add env example

* fix(plugin-verification): fix locales

* fix(plugin-verification): remove sending comment

* fix(plugin-verification): fix i18n

* refactor(plugin-verification): move invalid error message to action

* fix(plugin-verification): add field migration

* chore(plugin-verification): update packages version

* test(plugin-verification): temp remove new package dependency

* refactor(plugin-verification): make sms authentication configurable in system settings

* fix: smsAuthEnabled

* feat: update preset-nocobase

Co-authored-by: chenos <chenlinxh@gmail.com>
2022-08-20 18:06:12 +08:00
金昶
c9dfc2682c
feat: improve language settings (#627)
* feat: fix system local setting

* feat: improve language settings

* fix: improve code

* feat: update doc

* feat: add migration

Co-authored-by: chenos <chenlinxh@gmail.com>
2022-07-14 20:57:26 +08:00
chenos
d2837740bf fix(client): language settings 2022-06-10 08:38:24 +08:00
chenos
b466b8f6fb feat(client): improve locale 2022-06-10 00:33:59 +08:00
ChengLei Shao
24ea83f0ff
Feat/create nocobase app (#273)
* create-nocobase-app template from [develop]

* change create-nocobase-app package.json config

* feat: load configuration from directory

* feat: configuration repository toObject

* feat: create application from configuration dir

* feat: application factory with plugins options

* export type

* feat: read application config &  application with plugins options

* feat: release command

* fix: database release

* chore: workflow package.json

* feat: nocobase cli package

* feat: console command

* chore: load application in command

* fix: load packages from process.cwd

* feat: cli load env file

* feat: create-nocobase-app

* fix: gitignore create-nocobase-app lib

* fix: sqlite path

* feat: create plugin

* chore: plugin files template

* chore: move cli into application

* chore: create-nocobase-app

* fix: create plugin

* chore: app-client && app-server

* chore: package.json

* feat: create-nocobase-app download template from npm

* chore: create-nocobase-app template

* fix: config of plugin-users

* fix: yarn.lock

* fix: database build error

* fix: yarn.lock

* fix: resourcer config

* chore: cross-env

* chore: app-client dependents

* fix: env

* chore: v0.6.0-alpha.1

* chore: verdaccio

* chore(versions): 😊 publish v0.6.0

* chore(versions): 😊 publish v0.6.1-alpha.0

* chore(versions): 😊 publish v0.6.2-alpha.0

* chore(versions): 😊 publish v0.6.2-alpha.1

* chore: 0.6.2-alpha.2

* feat: workspaces

* chore(versions): 😊 publish v0.6.2-alpha.3

* chore(versions): 😊 publish v0.6.2-alpha.4

* chore: create-nocobase-app

* chore: create-nocobase-app lib

* fix: update tsconfig.jest.json

* chore: .env

* chore(versions): 😊 publish v0.6.2-alpha.5

* chore(versions): 😊 publish v0.6.2-alpha.6

* feat: improve code

* chore(versions): 😊 publish v0.6.2-alpha.7

* fix: cleanup

* chore(versions): 😊 publish v0.6.2-alpha.8

* chore: tsconfig for app server package

* fix: move files

* fix: move files

Co-authored-by: chenos <chenlinxh@gmail.com>
2022-04-17 10:00:42 +08:00