78 Commits

Author SHA1 Message Date
Junyi
4b91d890cf
refactor(utils): move md5 to utils (#6468)
* refactor(utils): move md5 to utils

* fix(utils): fix export

* fix(utils): add missed file
2025-03-14 22:19:20 +08:00
Katherine
283e2a1a7e
fix: mobile date picker format (#6390) 2025-03-09 16:20:48 +08:00
Katherine
f856b17f02
fix: timezone-related issue causing one hour less in date picker (#6359)
* fix: timezone-related issue causing one hour less in date picker

* fix: bug

* fix: build error
2025-03-06 18:16:08 +08:00
nocobase[bot]
fe7a5547a7 Merge branch 'main' into next 2025-01-08 06:47:29 +00:00
Katherine
35238cc02e
refactor(client): set default end time for time range in filter block to 23:59:59" (#6012)
* fix: datetime format

* fix: bug
2025-01-08 14:47:05 +08:00
Katherine
7743ba64c1
fix: date range picker in filter form/action not showing time picker when showTime is set (#5994) 2025-01-06 15:11:49 +08:00
ChengLei Shao
61e7a89067
refactor: export action (#5665)
* chore: export xlsx command

* chore: container service

* chore: report export progress

* chore: export

* chore: performInsert

* chore: export command

* chore: base exporter

* chore: limit option

* chore: export

* chore: export

* chore: types

* chore: ws socket with auth

* refactor: refactor exporter, change addRows method to handleRow method to support row-by-row processing

* chore: xlsx exporter

* chore: base exporter

* chore: export limit

* chore: import action

* chore: load websocket

* chore: import action

* chore: object to cli args

* chore: import options

* chore: import action

* chore: import runner

* chore: import action

* chore: import options

* chore: import options

* chore: plugin load event

* chore: test

* chore: i18n

* chore: i18n

* chore: i18n

* fix: ws auth status

* chore: cache in data source

* chore: load datasource

* chore: import with field alias

* fix: build

* fix: test

* fix: build

* fix: import schema settings

* fix: import action

* fix: import progress

* chore: template creator

* fix: import error message

* fix: import error message

* chore: test

* chore: workflow dispatch event

* chore: export alias

* fix: typo

* chore: error render

* fix: event error

* chore: send message to tags

* fix: test

* fix: import action setting
2024-12-31 20:16:03 +08:00
Katherine
2fd614fd64
fix: date range picker in filter form/action not showing time picker when showTime=true is set (#5956) 2024-12-28 21:28:46 +08:00
mytharcher
fa5a61fc97 Merge branch 'next' into develop 2024-11-19 10:52:28 +08:00
Katherine
6f170df2f1
fix: use desktop components for select in mobile configuration mode & fix error when using variables as default values in datePicker (#5662)
* refactor: use desktop components for select in mobile configuration mode

* fix: bug
2024-11-16 21:38:53 +08:00
mytharcher
5824f1fb15 Merge branch 'next' into T-4910 2024-11-15 11:03:16 +08:00
ChengLei Shao
ef1ded8ff2
fix: import with date field (#5606)
* fix: import with dateOnly and datetimeNoTz field

* fix: import with date field

* fix: export datetime filed

* fix: test

* fix: test

* fix: test

* fix: unixtimestamp import

* chore: test
2024-11-07 21:05:58 +08:00
Junyi
45976f37b2
feat(plugin-notification-manager): support handlebars in notification message (#5559)
* feat(plugin-notification-manager): support handlebars in message

* fix(plugin-notification-manager): fix parsing null template

* fix(plugin-notification-manager): fix compile
2024-11-06 09:59:27 +08:00
ChengLei Shao
aad8fd7bab
chore: add middleware name (#5594)
* chore: middleware name

* chore: add name to middleware

* chore: logging
2024-11-06 00:29:06 +08:00
mytharcher
2ac5457583 Merge branch 'next' into T-4910 2024-10-14 17:23:56 +08:00
chenos
cc0f945dbf
feat: date type fields support setting the picker type (#5345)
* refactor: date field support picker

* refactor: date field support picker

* refactor: date time field

* refactor: date time field

* refactor: locale improve

* refactor: defaultValue

* refactor: datetime field

* refactor: remove week

* fix: bug

* fix: bug

* fix:  bug

* fix: test

* fix: test

* fix: test

* fix: test

* fix: test

* refactor: test

* refactor: test

* fix: bug

* fix:  bug

* fix: bug

* refactor: expiresRadio

* refactor: datepicker

* fix: bug

* fix: bug

* fix: bug

* fix: test

* refactor: change operator

* refactor: change picker

* refactor: datetime operator schema

* refactor: filterWithPicker

* refactor: support linkage rule

* fix: bug

* refactor: useFilterFormItemInitializerFields

* refactor: useFilterFormItemInitializerFields

* fix: default value for datetime

* fix: bug

* fix: filter date time

* fix: filter date time

* fix: bug

* fix: bug

* refactor: datePicker RangePicker

* refactor: datePicker RangePicker

* style: date picker style improve

* fix: bug

* fix: bug

* fix: bug

* fix: default value

* fix: bulk edit datetime field

* fix: picker support third party data source

* fix: test

* fix: bug

* chore: fix unit test

---------

Co-authored-by: katherinehhh <katherine_15995@163.com>
Co-authored-by: Zeke Zhang <958414905@qq.com>
2024-09-30 18:38:08 +08:00
chenos
c91c43a71b Revert "feat: date type fields support setting the picker type (#5271)"
This reverts commit dcaad79370b18ae17747e7fb1a1eb146783f88a1.
2024-09-30 08:41:51 +08:00
Katherine
dcaad79370
feat: date type fields support setting the picker type (#5271)
* refactor: date field support picker

* refactor: date field support picker

* refactor: date time field

* refactor: date time field

* refactor: locale improve

* refactor: defaultValue

* refactor: datetime field

* refactor: remove week

* fix: bug

* fix: bug

* fix:  bug

* fix: test

* fix: test

* fix: test

* fix: test

* fix: test

* refactor: test

* refactor: test

* fix: bug

* fix:  bug

* fix: bug

* refactor: expiresRadio

* refactor: datepicker

* fix: bug

* fix: bug

* fix: bug

* fix: test

* refactor: change operator

* refactor: change picker

* refactor: datetime operator schema

* refactor: filterWithPicker

* refactor: support linkage rule

* fix: bug

* refactor: useFilterFormItemInitializerFields

* refactor: useFilterFormItemInitializerFields

* fix: default value for datetime

* fix: bug

* fix: filter date time

* fix: filter date time

* fix: bug

* fix: bug

* refactor: datePicker RangePicker

* refactor: datePicker RangePicker

* style: date picker style improve

* fix: bug

* fix: bug

* fix: bug

* fix: default value

* fix: bulk edit datetime field

* fix: picker support third party data source

* fix: test
2024-09-29 17:49:44 +08:00
ChengLei Shao
a7df0e3fd3
refactor: datetime field (#5084)
* refactor: date field support timezone, defaultToCurrentTime, and onUpdateToCurrentTime

* refactor: availableTypes unixTimestamp

* chore: defaultToCurrentTime

* chore: unix timestamp field

* fix: bug

* chore: field type map

* refactor: local improve

* fix: bug

* fix: bug

* chore: timezone test

* chore: test

* fix: test

* fix: test

* chore: field setter

* chore: test

* chore: date only field

* chore: test

* chore: test

* fix: bug

* fix: unixTimestamp

* fix: unixTimestamp

* chore: accuracy

* fix: bug

* fix: bug

* fix: unixTimestamp

* fix: unixTimestamp

* fix: date & datetime

* refactor:  add DateFieldInterface

* fix: bug

* chore: test

* chore: test

* chore: test

* refactor: locale improve

* refactor: local improve

* fix: bug

* refactor: unixTimestamp not support default value

* refactor: timezone

* refactor: datetimeNoTzFieldInterface

* refactor: locale improve

* refactor: locale improve

* fix: test

* fix: bug

* chore: datetime no tz field

* refactor: datetimeNoTz

* refactor: datetime

* fix: bug

* refactor: timeFormat

* style: collection fields style improve

* refactor: defaultToCurrentTime

* fix: datetime no tz

* chore: field type map

* fix: bug

* fix: bug

* refactor: createAt & updateAt

* fix: bug

* fix: no tz field with timezone

* refactor: dateonly

* fix: test

* chore: data type map

* fix: dateonly

* fix: dateonly

* fix: datetime

* refactor: locale improve

* refactor: unixtimestamp

* fix: merge bug

* fix: bug

* fix: datetime

* fix: datetime no tz

* fix: datetime no tz

* chore: mysql datetime map

* chore: test

* chore: test

* chore: test

* chore: datetimeTz field

* fix: no interface option

* refactor: update type

* refactor: update type

* fix: pg no tz field

* chore: save iso8601 format to no tz field

* fix: test

* fix: test

* refactor: gannt & calender startTime & endTime

* refactor: unixTimestamp

* chore: filter of datetime field

* chore: test

* chore: test

* fix: test

* fix: datetime no tz filter

* chore: test

* chore: test

* fix: datetime default value in mysql

* fix: sqlite test

* chore: test

* fix: test

* fix: test

* fix: $dateOn

* fix: bug

* fix: bug

* refactor: datepicker

* fix: test

* refactor: datePicker

* refactor: gantt setting

---------

Co-authored-by: katherinehhh <katherine_15995@163.com>
2024-09-10 15:25:20 +08:00
Zeke Zhang
a429b7a4b3
feat: adapt desktop blocks to mobile (#4945)
* feat: register workflow blocks to mobile page

* fix: should hide Divider in subpage

* refactor: rename 'Data blocks' to 'Desktop data blocks'

* feat: adapt blocks within subpages for mobile

* feat: adapt Filter action

* feat: isolate block templates between desktop and mobile

* refactor: export storePopupContext

* feat: support popup URL for 'Workflow todos'

* chore: update e2e tests

* chore: make e2e tests pass

* chore: add comment

* fix: make popup style of duplicate and bulk edit right

* fix(GridCard): ensure single column display in mobile

* fix: fix goBack

* refactor: make more stable

* refactor: change name for add blocks menu

* fix: fix block template for mobile

* feat: adapt Apply action of approval block to mobile

* fix(Map): use window.open to redirect to configuration page

* Revert "fix(Map): use window.open to redirect to configuration page"

This reverts commit 248ae8b68cfd78415184dfab2442081363872fb0.

* fix: redirect to the main app page when URL is starts with 'admin'

* fix(Link): make path right

* fix: refactor Popup to fix draging bug

* fix: should auto refresh when submiting in Manual popup

* fix(Action.Container): should return null when visible is false (T-4949)

* fix: increase z-index of subpage to cover Amap elements

* fix: fix tab switching not work (T-4985)

* fix(Link): should be change Link's URL of all table rows after editing URL (T-4981)

* fix: fix URL not changed after closing popup (T-4987)

* fix: make unit tests pass

* fix: make unit tests pass

* chore: get e2e tests to pass

* fix: use Popup to display data picker (T-4965)

* fix: use mobile Popup in some bloks

* refactor: use local isMobile

* fix: increase Popup's z-index to cover subpage

* fix: optimize Popup for mobile

* style: createRecordAction style improve

* refactor(AssociationField): get Component from AssociationFieldModeProvider

* refactor(InternalPopoverNester): support custom Container component

* feat: adapt PopoverNester to mobile

* chore: update unit tests

* fix: get e2e tests to pass

* chore: make e2e more stable

* refactor: move mobile-action-page in adaptor-of-desktop folder

* fix: get the z-index of popups and subpages correct

* feat: unify the styles of popups

* chore: make e2e more stable

---------

Co-authored-by: chenos <chenlinxh@gmail.com>
Co-authored-by: katherinehhh <katherine_15995@163.com>
2024-08-07 14:25:40 +08:00
ChengLei Shao
dd08a1f5c7
chore: data source api (#4588)
* refactor: support api datasource

* refactor: support api datasource

* refactor: support api datasource

* feat: url support preview (#4559)

* feat: url support preview

* feat: add settings for Input.Preview

* refactor: refactor CollectionField.tsx to use dynamic component

* Revert "refactor: refactor CollectionField.tsx to use dynamic component"

This reverts commit 37719eb28e5866762459da3b269288340a21b661.

* test: add e2e test

* refactor(e2e): extract template

---------

Co-authored-by: Zeke Zhang <958414905@qq.com>

* fix(map): amap reset (#4574)

* chore: volta node version

* chore: data source api

* refactor: support api datasource

* chore: data source api

* chore: data source api

* chore: field options

* refactor: support api data source

* refactor: support api data source

* refactor: support api data source

* refactor: support api data source

* refactor: support api data source

* refactor: support api data source

* refactor: support api data source

* fix: load data source fields

* refactor: support api data source

* feat(data-vi): support for using url params and current role variables (#4586)

* feat(data-vi): support for using url params and current role variable

* fix: bug

* fix(variable): should remove through collection field (#4590)

* fix: style issues for gridCard in mobile client (#4593)

* fix: style issiues for gridCard in mobile client

* fix: bug

* fix: bug

* fix: bug

* fix: style issues for gridCard in mobile client (#4599)

* fix: style issiues for gridCard in mobile client

* fix: bug

* fix: bug

* fix: bug

* fix: style improve

* chore: update lerna

* chore(versions): 😊 publish v1.0.1-alpha.1

* chore: update changelog

* chore: fix typo (#4589)

* feat(plugin-workflow-smtp-mailer): add new plugin for sending email in workflow (#4584)

* feat(plugin-workflow-smtp-mailer): add new plugin for sending email in workflow

* refactor(plugin-workflow-mailer): change plugin name and locales

* fix(plugin-workflow-mailer): fix parameters

* fix(preset): add new plugin to preset

* fix(plugin-workflow-mailer): fix locale namespace

* fix: iframe block loses height when set to default (#4602)

* fix: iframe block loses height when set to default

* refactor: local improve

* feat(client): allow JSON5 value in Form Input of type JSONTextArea (#4600)

* feat(client): allow json5 value in form-item type json component

* test: fix tests

* chore: set json5 default as false

* chore: add demo

---------

Co-authored-by: xilesun <2013xile@gmail.com>

* fix: remove grid wrap (#4612)

* refactor(plugin-workflow): change variable getter from collection fields (#4567)

* refactor(plugin-workflow): change variable getter from collection fields

* fix(plugin-workflow): fix import

* chore(plugin-workflow-action-trigger): remove unused import

* fix(plugin-workflow): fix collection field in workflow variable

* refactor(plugin-workflow-manual): avoid tslint error

* fix(client): fix text wrap in variable input (#4605)

* fix(client): fix text wrap in variable input

* fix(client): revert css

* feat(tree-block): support filtering child nodes (#4603)

* feat(tree-block): support filtering child nodes

* test: add list test

* test: remove only

* fix: use isValidFilter

* fix(export): export button remaining in loading state after cancel (#4615)

* chore: rebase

* chore: collection option

* fix: update data source fields

* chore: console.log

* refactor: support api data source

* fix: data source test

* fix: sync field in data source

* chore: unavailableActions in collection option

* chore: unavailableActions in data source collections

* chore: file collection unavailableActions

* fix: test

* chore: unavailableActions  in actionInitializers

* fix: bug

* fix: destroy action

* chore: unavailableActions in plugin  actionInitializers

* fix: view

* chore: unavailableActions  in actionInitializers

* fix: missing removeCollection

* chore: test name

* fix: bug

* fix: bug

* chore: test

* refactor: availableTypes

* refactor: availableTypes

* chore: datasource options

* refactor: get current data source

* refactor: code improve

* fix: update collection with fields

* refactor: code improve

* refactor: code improve

* refactor: code improve

* refactor: code improve

* chore: datasource logger

* chore: export Schema

* refactor: rawTextArea

* refactor: loadFilterTargetKeys in external data source

* chore: unavailableFunctions

* refactor:  support unAvailableFunctions

* refactor:  support unAvailableFunctions

* refactor:  support unAvailableFunctions

* refactor:  support unAvailableFunctions

* refactor:  support unAvailableFunctions

* revert: unavailableFunctions

* refactor: code improve

* fix: test

* chore: operation

* chore: operation

* fix: input support json field

* refactor: blockInitializers support unavailableActions

* chore: availableActions

* chore: availableActions

* refactor: support availableActions

* refactor: support availableActions

* chore: magic model test case

* fix: unixTimestamp support integer

* fix: disassociate

* fix: input readPretty

* fix: resolve error when opening modal via URL

* style: input readPretty style improve

* chore: support simple pagination

* chore: skip test

* refactor: details support pagination

* refactor: details support pagination

* chore: useActionAvailable

* fix: bug

* test: fix test

* fix: detailsBlockInitializer useActionAvailable

* chore: fix unit test

* refactor: pagination

* refactor: pagination

* test: fix test

---------

Co-authored-by: katherinehhh <katherine_15995@163.com>
Co-authored-by: chenos <chenlinxh@gmail.com>
Co-authored-by: Zeke Zhang <958414905@qq.com>
Co-authored-by: YANG QIA <2013xile@gmail.com>
Co-authored-by: Katherine <shunai.tang@hand-china.com>
Co-authored-by: GitHub Actions Bot <actions@github.com>
Co-authored-by: Junyi <mytharcher@users.noreply.github.com>
Co-authored-by: David Fecke <david.fecke@eyecook.net>
2024-07-19 22:26:27 +08:00
Zeke Zhang
2dad5b32c9 Merge branch 'main' into next 2024-07-19 09:21:08 +08:00
Zeke Zhang
7d660f5a0f
feat(Link): add 'Open in new window' option (#4898)
* refactor: rename 'useURLAndParamsSchema' to 'useURLAndHTMLSchema' and improve it

* feat: add 'Open in new window' option

* test: add e2e test
2024-07-19 09:07:19 +08:00
shz
512557f80a
feat(plugin-workflow): add date range options to system variables (#4728)
* feat(plugin-workflow): add date range options to system variable in workflow plugin

* feat(plugin-workflow): fix according to code review

* feat(plugin-workflow): add more functions

* feat(plugin-workflow): fix according to code review

* feat(plugin-workflow): add test

* feat(plugin-workflow): support india timezone

* feat(plugin-workflow): fix test

* feat(plugin-workflow): add ts type

* feat(plugin-workflow): fix

* feat(plugin-workflow): fix
2024-06-30 16:30:31 +08:00
YANG QIA
0fb18b495f
fix(auth): allows to set the auth type title translation from server end (#4616)
* fix(auth): allows to set auth type title translation from server end

* chore: move tval to utils

* chore: mark deprecated

* fix: test
2024-06-11 14:25:07 +08:00
Zeke Zhang
837f4f4158
refactor(variable): support default value setting (#4583)
* refactor(variable): support default value setting

* chore: add e2e test for URL search params variable

* fix: resolve field linkage errors

* chore: fix unit test

* test: association select data scope linkage

---------

Co-authored-by: katherinehhh <katherine_15995@163.com>
2024-06-07 10:23:28 +08:00
Junyi
073e2b0d5b
fix(utils): fix json-templates (#4525) 2024-05-30 12:10:05 +08:00
chenos
6e3595c0be
fix: require resolve (#4356)
* fix: require resolve

* fix: error

* fix: skip realpath

* fix: fs.realpath
2024-05-16 18:46:56 +08:00
jack zhang
95fef86880
client components (#4216)
* docs: update docs components

* docs: add more component docs

* docs: add more docs

* fix: add more docs

* fix: build bug

* feat: docs

* fix: build error

* fix: docs

* fix: change x-read-pretty to x-patten

* fix: upgrade docs and types

* fix: build bug

* fix: add more docs

* fix: build bug

* fix: cascader component

* fix: bug

* fix: add more docs

* fix: add backend ci time

---------

Co-authored-by: katherinehhh <katherine_15995@163.com>
2024-04-30 21:21:17 +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
chenos
27962ab283
fix: parse iso week (#4068)
* fix: parse iso week

* fix: error

* test: ci

* fix: ci test

* fix: --allowOnly

* fix: parse iso week
2024-04-17 19:52:52 +05:30
ChengLei Shao
89733247bd
fix: reject update when filter is empty object (#3777)
* fix: reject update when filter is empty object

* chore: valid filter when destroy data

* fix: test

* refactor(utils): move isValidFilter to utils

* chore: test

* chore: test

* chore: test

* fix(plugin-workflow-manual): fix test case

* fix(plugin-workflow-manual): add filter check for update form in manual node

* chore: validate filter params as middleware

* chore: action filter validate in data-source-manager

* chore: acl filter params validate test

* chore: move validate filter params middleware into core

* Update nocobase-test-e2e.yml

* chore: only run workflow's tests

* chore: only run workflow's tests

* fix: updateRecordForm

* Revert "chore: only run workflow's tests"

This reverts commit 64ce1241718ef516ff9bf7245296dee963ab2e43.

* Revert "chore: only run workflow's tests"

This reverts commit b9057b35ec4f87ba13c08650ffc7919e32eb3fc3.

---------

Co-authored-by: mytharcher <mytharcher@gmail.com>
Co-authored-by: chenos <chenlinxh@gmail.com>
Co-authored-by: Zeke Zhang <958414905@qq.com>
Co-authored-by: hongboji <j414562100@qq.com>
2024-03-30 21:50:54 +08:00
Zeke Zhang
d0746b1155
test: add unit test for parseHTML (#3870) 2024-03-29 14:52:20 +08:00
Junyi
d691e4c7e6
feat(plugin-workflow): support multiple data source in workflow (#3739)
* feat(plugin-workflow): support multiple data source in workflow

* fix(plugin-workflow): fix test cases

* test(plugin-workflow-sql): debug test case

* fix(plugin-workflow): fix collection trigger creation without config

* test(plugin-workflow-sql): debug test case

* fix: workflow e2e test

* chore(ci): disable console intercept in vitest

* chore(ci): disable console intercept in vitest

* chore(ci): disable console intercept in vitest

* chore(ci): disable console intercept in vitest

* test(plugin-workflow-sql): debug test case

* test: approval e2e

* fix: remove pro-plugins from packages

* refactor(plugin-workflow): support pass collection from props to CollectionBlockInitializer

* test(plugin-workflow): add test case

* fix(plugin-workflow): disable modification of executed workflow

* fix: e2ePageObjectModel

* fix: load data source when data source load failed (#3793)

* chore: console.log

* fix(subTable): fix sorting rule setting (#3795)

* fix: through collection support search (#3800)

* fix(client): visible -> useVisible

* fix(client): fix action designer error occured in custom form (#3801)

* fix(client): fix action designer error occured in custom form

* fix(client): fix from the source

* chore(module): remove submodule

* fix(plugin-workflow): fix client cycling import

* fix(plugin-workflow): fix collection event name

* fix(plugin-workflow): fix undefined ref

---------

Co-authored-by: hongboji <j414562100@qq.com>
Co-authored-by: ChengLei Shao <chareice@live.com>
Co-authored-by: Zeke Zhang <958414905@qq.com>
Co-authored-by: katherinehhh <shunai.tang@hand-china.com>
Co-authored-by: chenos <chenlinxh@gmail.com>
2024-03-25 14:46:22 +08:00
Zeke Zhang
aa1823cd73
chore: adapt to plugin-custom-brand (#3740)
* chore: adapt to plugin-custom-brand

* chore: add parseHTML

* chore: adapt to plugin-custom-brand
2024-03-18 13:22:18 +08:00
chenos
7779cd79ac
refactor: optimize the command line (#3339)
* fix: perform load action on boot main app

* feat: add dataType option in collection duplicator

* chore: reset optional dumpable config

* chore: dump command

* chore: dump & restore command

* chore: delay restore

* fix: dump test

* chore: restore command

* chore: dump command action

* chore: dumpable collection api

* chore: client collection option

* feat: backup& restore client

* chore: content disposition header in dump response

* chore: download backup field

* feat: collection origin option

* fix: test

* chore: collection manager collection origin

* chore: upload  backup field

* chore: upload restore file

* chore: upload restore file

* fix: test

* chore: backup and restore support learn more

* refactor: upload restore file

* refactor: upload restore file

* fix: test

* fix: test

* chore: dumpable collection with title

* chore: pg only test

* chore: test

* fix: test

* chore: test sleep

* style: locale improve

* refactor: download backup file

* refactor: start restore

* fix: restore key name

* refactor: start restore

* refactor: start restore

* refactor: start restore

* refactor: start restore

* refactor: start restore

* refactor: start restore

* chore: unify duplicator option

* fix: dump empty collection

* chore: test

* chore: test

* style: style improve

* refactor: locale improve

* chore: dumpalbe collection orders

* style: style improve

* style: style improve

* style: icon adjust

* chore: nginx body size

* chore: get file status

* feat: run dump task

* feat: download api

* chore: backup files resourcer

* feat: restore destroy api

* chore: backup files resoucer

* feat: list backup files action

* chore: get collection meta from dumped file

* fix: dump file name

* fix: test

* chore: backup and restore ui

* chore: swagger api for backup & restore

* chore: api doc

* chore: api doc

* chore: api doc

* chore: backup and restore ui

* chore: backup and restore ui

* chore: backup and restore ui

* chore: backup and restore ui

* chore: backup and restore ui

* fix: restore values

* style: style improve

* fix: download field respontype

* fix: restore form local file

* refactor: local improve

* refactor: delete backup file

* fix: in progress status

* refactor: locale improve

* refactor: locale improve

* refactor: style improve

* refactor: style improve

* refactor: style improve

* test: dump collection table attribute

* chore: dump collection with table attributes

* chore: test

* chore: create new table in restore

* fix: import error

* chore: restore table from backup file

* chore: sync collection after restore collections

* fix: restore json data

* style: style improve

* chore: restore with fields

* chore: test

* fix: test

* fix: test with underscored

* style: style improve

* fix: lock file state

* chore: add test file

* refactor: backup & restore plugin

* fix: mysql test

* chore: skip import view collection

* chore: restore collection with inherits topo order

* fix: import

* style: style improve

* fix: restore sequence fields

* fix: themeConfig collection duplicator option

* fix: restore with dialectOnly meta

* fix: throw error

* fix: restore

* fix: import backup file created in postgres into mysql

* fix: repeated items in inherits

* chore: upgrade after restore

* feat: check database env before restore

* feat: handle autoincr val in postgres

* chore: sqlite & mysql queryInterface

* chore: test

* fix: test

* chore: test

* fix: build

* fix: pg test

* fix: restore with date field

* chore: theme-config collection

* chore: chage import collections method to support collection origin

* chore: fallback get autoincr value in mysql

* fix: dataType normalize

* chore: delay restore

* chore: test

* fix: build

* feat: collectin onDump

* feat: collection onDump interface

* chore: dump with view collection

* chore: sync in restore

* refactor: locale improve

* refactor: code improve

* fix: test

* fix: data sync

* chore: rename backup & restore plugin

* chore: skip test

* style: style improve

* style: style improve

* style: style improve

* style: style improve

* chore: import version check

* chore: backup file dir

* chore: build

* fix: bugs

* fix: error

* fix: pageSize

* fix: import origin

* fix: improve code

* fix: remove namespace

* chore: dump rules config

* fix: dump custom collection

* chore: version

* fix: test

* fix: test

* fix: test

* fix: test

* chore: test

* fix: load custom collection

* fix: client

* fix: translation

* chore: code

* fix: bug

* fix:  support shared option

* fix: roles collection dumpRules

* chore: test

* fix: define collections

* chore: collection group

* fix: translation

* fix: translation

* fix: restore options

* chore: restore command

* refactor: optimize the command line

* chore: dump error

* fix: test error

* fix:  test error

* fix: test error

* fix: test error

* fix: test error

* fix: skip cli test cases

* fix: test error

* fix: too many open files

* fix: update migration version

* fix: migrations

* fix: upgrade

* fix: error

* fix: migration error

* fix: upgrade

* fix: test error

* fix: timeout

* fix: width

* feat: auto load collections

* fix: test error

* fix: test error

* fix: test error

* fix: test error

* fix: test error

* fix: test error

* fix: test error

* fix: ipc error

* fix: test error

---------

Co-authored-by: Chareice <chareice@live.com>
Co-authored-by: katherinehhh <katherine_15995@163.com>
2024-01-08 19:05:14 +08:00
chenos
8108107779
fix: require module (#3277)
* fix: require module

* fix: include utils
2023-12-28 13:40:11 +08:00
ChengLei Shao
261d4c4137
refactor: establish a sound testing system (#3179)
* chore: use vitest to replace jest

* chore: support vitest

* feat: vitest 1.0

* fix: test

* chore: yarn.lock

* chore: github actions

* fix: test

* fix: test

* fix: test

* fix: test

* fix: jest.fn

* fix: require

* fix: test

* fix: build

* fix: test

* fix: test

* fix: test

* fix: test

* fix: test

* fix: test

* fix: test

* fix: dynamic import

* fix: bug

* chore: yarn run test command

* chore: package.json

* chore: package.json

* chore: vite 5

* fix: fix variable test

* fix: import json

* feat: initEnv

* fix: env.APP_ENV_PATH

* chore: get package json

* fix: remove GlobalThmeProvider

* chore: update snap

* chore: test env

* chore: test env

* chore: import module

* chore: jest

* fix: load package json

* chore: test

* fix: bug

* chore: test

* chore: test

* chore: test

* chore: test

* chore: test

* fix: import file in windows

* chore: import module with absolute file path

* fix: test error

* test: update snapshot

* chore: update yarn.lock

* fix: front-end tests do not include utils folder

* refactor: use vitest-dom

* fix: fix build

* fix: test error

* fix: change to vitest.config.mts

* fix: types error

* fix: types error

* fix: types error

* fix: error

* fix: test

* chore: test

* fix: test package

* feat: update dependencies

* refactor: test

* fix: error

* fix: error

* fix: __dirname is not defined in ES module scope

* fix: allow only

* fix: error

* fix: error

* fix: error

* fix: create-app

* fix: install-deps

* feat: update docs

---------

Co-authored-by: chenos <chenlinxh@gmail.com>
Co-authored-by: dream2023 <1098626505@qq.com>
Co-authored-by: Zeke Zhang <958414905@qq.com>
2023-12-21 20:39:11 +08:00
YANG QIA
474b09c7f2
perf(server): optimize performance of APIs (#3079)
* perf: add perf_hooks

* perf: add cache

* fix: test

* feat: support bloom filter

* feat: caching token black list

* perf: caching i18n instance

* fix: test

* fix: test

* chore: remove prePerfHooks on app

* chore: improve i18n instances cache

* chore: remove performance measure

* fix: package.json

* perf: optimize cache strategy

* fix: test

* fix: bug

* test: storer of auth-manager

* fix: afterDestroy hook when updating null value

* fix: version

* chore: fix bug and add test

* fix: test

* fix: test
2023-12-12 23:02:09 +08:00
被雨水过滤的空气-Rain
c25f51d99b
fix: fix display association fields with subform (#3036)
* fix: fix display association fields with subform

* fix: transformVariableValue

* fix: should also to request data when value is null

* fix: better way to fix
2023-11-14 14:15:47 +08:00
Dunqing
bf099a4364
feat(plugin-custom-request): support better custom-request (#2536)
* feat(plugin-custom-request): support better custom-request

* feat: re implement custom request

* feat: complete configuration

* feat: support request in server

* feat: improve usage

* feat: support request

* feat: remove customRequests when action is deleted

* feat: avoid override

* fix: the data is not latest

* feat: should autoSize in url

* feat: support title and acl

* fix: i18n

* feat: support display title

* feat: i18n supports

* refactor: acl check

* feat: better method

* fix: style

* fix: remove unused code

* fix: acl

* docs: update

* fix: upgrade

* feat: hidden skip validator option and display should display data

* feat: support root access all custom-request

* chore: update deps

* fix: limit height of modal body, Close T-1682

* fix: parse incorrect, Close T-1686

* fix: i18n, Close T-1684

* fix: linkage rules incorrect, Close T-1719

* fix: missing pass appends, Close T-1720

* fix: should update initialValues when it changed

* feat: update better message

* fix: permission incorrect

* test: setup

* refactor: fix locale

* chore: update deps

* feat: move to @nocobase

* fix: dir

* fix: ui.*

* feat: add listByCurrentRole action, add decorator instead of acl

* fix: remove title field

* feat: compatible pervious version

* feat: support passing x-* headers to custom-request

* feat: support list all keys

* fix: support baseURL, close T-2090

* fix: remove unused code

* fix: sqlite, Close T-2092

* fix: close T-2089

* feat: alert error when request settings doesn't configure, Close T-2101

* feat: improve message

* chore: fix eslint error

* fix: fix version of plugin-custom-request

* fix: build error

---------

Co-authored-by: chenos <chenlinxh@gmail.com>
Co-authored-by: Rain <958414905@qq.com>
2023-10-13 15:16:50 +08:00
ChengLei Shao
2dc964d4f1
feat: add measure execution function (#2801) 2023-10-11 19:15:59 +08:00
被雨水过滤的空气-Rain
0d67141a6b
fix(variable): should not return undefined when parsing 0 (#2766) 2023-10-09 08:46:46 +08:00
被雨水过滤的空气-Rain
573cde0a21
feat(variable): lazy load association fields (#2382)
* refactor: remove useless code

* feat: should always show user variable

* style: optimize style of variable input

* feat: change maxDepth of user varialbe to 3

* refactor: migrate getFieldDefaultValue to SchemaSettings.tsx

* feat: support to parse variables

* feat: support to parse array fields

* refactor: make testing more stable

* chore: fix CI

* feat: support to parse current user

* fix: fix tests

* feat: support to register variable

* feat: support to parse "$context"

* refactor: remove useless code

* fix: fix build

* fix: fix build

* test: make stable

* docs: add doc

* fix: fix T-1267

* fix: fix T-1268

* fix: fix T-1269

* fix: fix T-1271

* fix: fix T-1274

* refactor: improve code

* feat(variable): support local variable

* fix: fix T-1280

* refactor: close T-881

* refactor: remove useLazyLoadAssociation

* fix: fix T-1289,T-1290

* fix: fix T-1296

* refactor(AssignedField): replace user variable

* refactor: extract useBaseVariable

* refactor(AssignedField): replace variables

* feat(useVariables): support to use array as local variables

* refactor: improve variables (T-1295)

* feat: limit user choice (T-1297)

* fix: fix T-1305

* refactor: extract as SchemaSettings.DataScope

* refactor: improve linkage rules

* refactor: improve linkage rules of Action

* chore: fix build

* refactor: improve data scope of association fields

* chore: fix build

* feat: select limit

* refactor: use VariableInput to replace other

* fix: fix can not input

* fix(AssignedField): fix cannot close variables list

* test: fix errors

* refactor: migrate to new file

* fix: uniq

* fix: filter empty values

* fix: transform variables value

* fix: should sum numbers (T-1330)

* fix: fix Select (T-1337)

* refactor: use useMemo

* refactor: use hooks

* refactor: use hooks

* refactor: use hooks

* refactor: remove useless code

* refactor: rename `$form` to `$nForm` and `$record` to `$nRecord`

* fix: fix T-1334

* refactor(LinkageRuleActionGroup): use hooks

* refactor(FormButtonLinkageRuleAction): use hooks

* refactor: add type

* fix: avoid crashing

* refactor: rename `$date` to `$nDate`

* fix: fix T-1348

* perf: avoid duplicate requests

* test: fix error

* fix: fix T-1355

* fix: fix T-1355

* fix: fix T-1345

* fix: fix T-1346

* refactor(useVariableOptions): replace query with parameter

* fix: fix T-1335

* chore: fix build

* fix: fix T-1453

* refactor: remove useless code

* fix: fix T-1447

* fix: should update when seting default value

* fix: fix T-1454

* chore(eslint): ignore docker

* fix: fix T-1440

* refactor: use hooks

* fix: fix T-1332

* fix(defaultValue): should use Select mode

* fix(defaultValue): fix Checkbox

* refactor: rename and comment

* refactor: rename file name and hook name

* feat(subForm): support lazy load association fields

* fix: filter empty values

* fix(defaultValue): schema type of Checkbox should be void

* fix: fix T-1479

* fix: fix T-1491

* fix(ToOneNester): should use RecordProvider

* fix: fix T-1493

* chore: add comment

* fix: fix T-1495

* chore: fix build

* test: make pass

* fix: fix T-1503

* fix: fix T-1504

* fix: fix transformVariableValue

* fix: disable unsupport options

* refactor(useVariableOptions): add noDisabled params

* fix: data scope support to select to-many fields

* chore: add comment

* refactor: improve default value

* refactor: extract as useIsAllowToSetDefaultValue

* fix: should not support to set default value in edit mode

* fix: only the default values for sub-forms and sub-tables are valid

* fix: limit default value of association fields

* fix: fix '$nForm' variable

* fix: allow all inherit chain

* fix: optimize default value

* fix: optimize json field

* fix(currentObject): avoid error

* fix: should not show variable string

* fix: active fields

* fix: avoid errors

* feat: support special case

* fix: fix CI

* chore: fix build

* fix: json

* refactor: rename flag name

* fix: fix T-1559

* fix: fix T-1515

* fix: avoid crash

* fix: fix T-1520

* fix: fix T-1521

* fix: fix T-1523

* fix: fix T-1563

* fix: fix T-1565

* fix: fix T-1525

* fix: fix T-1524

* fix: fix T-1603

* fix: fix T-1332

* fix: fix T-1559

* fix: fix T-1602

* fix: fix T-1608

* fix: fix T-1612 T-1609

* fix: fix T-1681

* fix: fix T-1711

* fix: fix T-1713

* fix: fix T-1680

* chore: close T-1550

* fix: fix T-1507

* chore: avoid crashing

* fix: fix T-1557

* perf: close T-1726

* fix: fix T-1727

* fix: fix T-1741

* fix: fix T-1740

* chore(workflow): compact

* chore: should not to support to set default value in assign field values

* perf: compat and perf (T-1736)

* fix: fix T-1872

* fix: fix T-1877

* fix: fix quarter variables

* chore: add README

* chore: front-end should not depend on back-end code

* chore: should disable all variable options if no field is selected

* chore: should be a leaf if it has no children

* chore: fix build error

* fix: compat $form

* fix: compat $form

* chore: fix build

* chore: fix build

* fix: typeError: Cannot read properties of undefined (reading 'template')

* chore: fix test

* chore: add test

* fix: fix T-2072

* chore: optimize eslint

* perf: reduce number of requests

* fix: fix JSON

* test: fix error

* fix(e2e): avoid error

---------

Co-authored-by: chenos <chenlinxh@gmail.com>
2023-10-07 15:49:09 +08:00
被雨水过滤的空气-Rain
34b0ce06ba
fix: fix quarter variables (#2648) 2023-09-14 17:56:42 +08:00
jack zhang
705b7449f0
feat: new plugin manager, supports adding plugins through UI (#2430)
* refactor: plugin manager page

* fix: bug

* feat: addByNpm api

* fix: improve the addByNpm

* feat: improve applicationPlugins:list api

* fix: re-download npm package when restart app

* fix: plugin delete api

* feat: plugin detail api

* feat: zipUrl add api

* fix: upload api bug

* fix: plugin detail info

* feat: upgrade api

* fix: upload api

* feat: handle plugin load error

* feat: support authToken

* feat: muti lang

* fix: build error

* fix: self review

* Update plugin-manager.ts

* fix: bug

* fix: bug

* fix: bug

* fix: bug

* fix: bug

* fix: bugs

* fix: detail click and remove isOfficial

* fix: upgrade no refresh

* fix: file size and type check

* fix: bug

* fix: upgrade error

* fix: bug

* fix: bug

* fix: plugin card layout

* fix: handling exceptional cases

* fix: tgz file support

* fix: macos compress file

* fix: bug

* fix: bug

* fix: bug

* fix: bug

* fix: add upgrade npm type

* fix: bugs

* fix: bug

* fix: change plugins static expose url

* fix: api prefix

* fix: bug

* fix: add nginx `/static/plugin/` path

* fix: bugs and pr docker build no dts

* fix: bug

* fix: build tools bug

* fix: improve code

* fix: build bug

* feat: improve plugin info

* fix: ui bug

* fix: plugin document bug

* feat: improve code

* feat: improve code

* feat: process dev deps check

* feat: improve code

* feat: process.env.IS_DEV_CMD

* fix: do not delete the plugin package

* feat: plugin symlink

* fix: tsx watch --ignore=./storage/plugins/**

* fix: test error

* fix: improve code

* fix: improve code

* fix: emitStartedEvent

* fix: improve code

* fix: type error

* fix: test error

* test: console.log

* fix: createStoragePluginSymLink

* fix: clientStaticMiddleware rename to clientStaticUtils

* feat: build tools support plugins folder

* fix: 350px

* fix: error

* feat: client dev support plugin folder

* fix: clear cli options

* fix: typeError: Converting circular structure to JSON

* fix: plugin name

* chore: restart application after command

* feat: upgrade error & docs

* Update v14-changelog.md

* Update v14-changelog.md

* Update v14-changelog.md

* fix: gateway test

* refactor(plugin-workflow): add ready state for gracefully tearing down

* Revert "chore: restart application after command"

This reverts commit 5015274f8e4e06e506e15754b672330330e8c7f8.

* chore: stop application whe restart

* T 1218 change plugin folder (#2629)

* feat: change folder name

* feat: change `pm create` command

* feat:  revert plugin name change

* fix: delete samples

* feat: change plugins folder

* fix: pm create

* feat: update docs

* fix: link package error

* fix: docs

* fix: create command

* fix: pm add error

* fix: create  add build

* fix: pm creatre + add

* feat: add tar command

* fix: docs

* fix: bug

* fix: docs

---------

Co-authored-by: chenos <chenlinxh@gmail.com>

* feat: docs

* Update your-fisrt-plugin.md

* Update your-fisrt-plugin.md

* chore: application reload

* chore: test

* fix: pm add error

* chore: preset install skip exists plugin

* fix: createIfNotExists

---------

Co-authored-by: chenos <chenlinxh@gmail.com>
Co-authored-by: chareice <chareice@live.com>
Co-authored-by: Zhou <zhou.working@gmail.com>
Co-authored-by: mytharcher <mytharcher@gmail.com>
2023-09-12 22:39:23 +08:00
Dunqing
1e0bedca86
feat: api documentation plugin (#2255)
* feat: api doc plugin

* fix: merge

* chore: upgrade swagger ui to latest

* feat: get paths from recourser

* feat: configure security

* feat: add models

* feat: reimplement resource action

* feat: support render schemas correctly

* feat: support load swagger documentation

* refactor: implement `SwaggerManager`

* fix: re import

* feat: update info

* refactor: do not use the cache strategy for the time being

* feat: support collection builtin actions

* fix: incorrect tag

* feat: support different swagger json for different plugins

* feat: support load server package

* feat: support visit from plugin center

* feat: add schemas for mapConfiguration

* feat: update

* fix: update tags

* feat: support only render plugin that has swagger content

* refactor: use swagger-ui-react instead of swagger-ui-dist

* fix: clean

* fix: reset

* refactor: update plugin place

* fix: revert

* fix: remove version

* fix: type error

* feat: swagger doc

* refactor: improve apis

* feat: add doc

* feat: support destination cache

* fix: avoid authorization override

* fix: auth bug

* feat: update documentation

* fix: typo

* feat: support json

* fix: key

* fix: update yarn.lock

* feat: update swagger doc

* feat: swagger doc

* docs: add auth swagger files (#2341)

* docs: add auth swagger files

* fix: yarn.lock

* fix: skip core

* feat: swagger doc

* docs: improve auth docs

* fix(theme-editor): avoid crashing

* feat(theme-editor): improve api doc

* docs: add localization-management swagger

* docs(plugin-workflow): add api doc (#2379)

* fix: remove files

* fix: aaa

* fix: dist

* fix: load swagger

* feat: acl api doc (#2494)

* chore: acl api doc

* feat: ui schema api doc

* feat: multi apps api doc

* chore: ui schema doc

* feat: collection api doc

* chore: association api doc

* chore: single association doc

* feat: move action doc

* chore: list parameters

* feat: update swagger doc

* chore: collectionIndex to first

* fix: test error

* fix: ref

* chore: doc tags

* chore: template

* chore: doc with association options

* chore: single association doc

* chore: relation type

* chore: filter single association params

* chore: m2m api doc

* chore: params

* fix: 0.12.0-alpha.5

* fix: update yarn.lock

* chore: data wrap

---------

Co-authored-by: chenos <chenlinxh@gmail.com>
Co-authored-by: YANG QIA <2013xile@gmail.com>
Co-authored-by: Rain <958414905@qq.com>
Co-authored-by: Junyi <mytharcher@users.noreply.github.com>
Co-authored-by: ChengLei Shao <chareice@live.com>
2023-08-24 00:27:57 +08:00
Junyi
86e672e9bb
feat(plugin-workflow): add form trigger type (#2347)
* feat(plugin-workflow): add form trigger

* test(plugin-workflow): add test cases

* fix(client): fix component warning

* fix(plugin-workflow): fix context data for create and update

* fix(plugin-workflow): allow to select any form type workflow in configuration

* fix(client): fix tree component value

* fix(client): fix value render in component

* fix(plugin-workflow): fix context load

* fix(client): fix type

* fix(client): fix type

* fix(plugin-workflow): fix params

* fix(plugin-workflow): fix required

* fix(plugin): fix context not matching collection error

* fix(plugin-workflow): fix test cases

* refactor(plugin-workflow): change trigger workflow action config to cascaded

* fix(plugin-workflow): remove useless locale

* fix(client): adjust locale

* fix(client): remove useless locale
2023-08-09 12:12:57 +08:00
jack zhang
5df3b0e75d
refactor!: plugins build and plugins load (#2253)
* refactor: plugin build and plugin template

* refactor: plugins' deps

* refactor: plugins bugs

* feat: add plugin static middleware

* fix: bugs

* refactor: frontend plugin add from remote

* refactor: delete useless app/client/plugins

* fix: requirejs move to local

* fix: tests case

* refactor: add src/client and src/server dir check

* fix: lodash tree shaking

* refactor: add BUILD_TIP

* refactor: add file size tip

* fix: bugs

* fix: bug

* fix: change china-division

* fix: change plugins response

* fix: recover dynamicImport

* fix: change server src entry

* fix: test error

* fix: plugins sourcemap => false

* fix: production file error

* refactor: change build tools to vite and tsup

* fix: yarn.lock

* fix: bugs

* fix: server build bugs

* fix: delete .fatherrc.ts

* fix: bug

* fix: bug

* fix: bugs

* fix: bugs

* fix: bugs

* refactor: add plugin d.ts

* refactor: delete fatherrc

* refactor: delete father scripts

* refactor: build bug

* fix: bug

* fix: deps adjust

* fix: add build tips

* fix: bug

* refactor: ignore plugins when build client

* docs: update doc

* refactor: docs and build

* fix: bug

* refactor: build deps

* fix: add USER_REMOTE_PLUGIN env

* feat: add plugin static cache

* feat: add build deps cache

* fix: bugs

* test: add test

* fix: add plugin depden on plugin tip

* fix: adjust shouldDevDependencies

* fix: deps

* fix: ajust deps

* fix: mobile style error

* fix: map error

* fix: test

* fix: bug

* feat: lodash and dayjs import from themself

* feat: @emotion/css 、ahooks and lodash to global

* fix: theme-editor plugin error

* fix: review

* feat: move all plugins' dependencies to devDependencies

* feat: change build

* feat: add devPlugins

* fix: bug

* fix: bugs

* fix: bugs

* fix: bugs

* feat: build bugs

* fix: bugs

* fix: bugs

* fix: review

* fix: bug

* fix: change deps build

* fix: bugs

* fix: bug

* fix: bug

* fix: bugs

* fix: bug

* fix: bug

* fix: multi language

* fix: dist

* fix: cronstrue

* fix: getPackageClientStaticUrl

* fix: antd dayjs locale

* fix: plugin' d.ts import from dist

* fix: multi language

* fix: build types error

* fix: requireModule

* fix: plugin lifecycle

* fix: client resource

* fix: improve code

* fix: locale

* feat: custom build

* fix: require locale

* fix: improve code

* fix: improve code

* fix: skip preset

* fix: collection undefined

* feat: yarn build

* fix: remove enabled

* fix: update dockerfile

* fix: formily version

* docs: update v12 changelog

* fix: devDependencies

* feat: @nocobase/app

* feat: generateAppDir

* fix: improve code

* fix: 0.11.1-alpha.5

* fix: missing @nocobase/client

* fix: error

* fix: add .npmignore

* feat: upgrade antd version

* fix: dependencies

* fix: peerDependencies

* fix: remove china-division dep

* fix: toposort deps

* fix: update dockerfile

* fix: plugin template

* fix: app client outputPath

* feat: update docs

* fix: nginx server root

* fix: storage/.app-dev

* fix: getChinaDivisionData

* feat: plugin info

* feat: update docs

* fix: docs menu

---------

Co-authored-by: chenos <chenlinxh@gmail.com>
2023-08-02 00:07:52 +08:00
ChengLei Shao
0d92e59985
chore: tsx (#2329)
* chore: upgrade jest

* fix: eslint

* chore: github action backend test

* fix: import

* chore: export

* fix: test

* chore: install tsx

* chore: type

* chore: replace @koa/multer

* chore: replace ts-node-dev with tsx
2023-07-27 10:29:07 +08:00