Commit Graph

150 Commits

Author SHA1 Message Date
katherinehhh
70890f2f50
feat(association field):quick add new (#1953)
* refactor: association select support quieck add

* chore: tmp commit

* refactor: association select support quick add

* feat: firstOrCreate

* refactor: locale

* refactor: create api

* chore: firstOrCreate

* feat: updateOrCreate

* chore: test

* refactor: save mode edit in add new form

* feat: values to filter

* refactor: loacle improve

* refactor: loacle improve

* refactor: loacle improve

* feat: firstOrCreate http api

* refactor: code improve

* fix: build error

* refactor: local

* refactor: locale improve

* refactor: useCollectionFieldsOptions

* fix: code imprtove

* refactor: code improve

* refactor: dropdown open

* refactor: add new mode

* refactor: add new mode code improve

* refactor: add new mode code improve

* refactor: add new mode code improve

---------

Co-authored-by: chareice <chareice@live.com>
2023-06-15 16:40:42 +08:00
katherinehhh
7abfbe7be4
fix: duplicate action locale (#2052) 2023-06-15 16:04:27 +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
katherinehhh
c3c02d8925
feat: duplicate action (#1973)
* feat: depulicate action

* feat: depulicate action

* refactor: duplicate action

* refactor: duplicate action

* refactor: duplicate action

* refactor:  support quick duplicate

* refactor: local improve

* refactor: local improve

* fix: duplicate intialValue

* refactor: detail action support duplicate

* refactor: action role check

* fix: duplicate support linkage rule

* fix: duplicate action support openMode and openSize

* fix: duplicate action support linkage rule

* refactor: locale

* refactor: detail block support duplicate action

* refactor: code improve

* refactor: code improve

* refactor: duplicate action improve

* refactor:  wait time after click is too long, a Duplicating is required

---------

Co-authored-by: chenos <chenlinxh@gmail.com>
2023-06-07 11:25:32 +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
Junyi
2c9ce09304
feat(plugin-workflow): manual forms (#1748)
* feat(plugin-workflow): add create record form for manual node

* feat(plugin-workflow): add update form for manual node

* fix(plugin-workflow): fix antd version and menu

* refactor(plugin-workflow): change collection config modal to initializer sub-menu

* test(plugin-workflow): add test case

* fix(plugin-workflow): fix todo components based on forms

* fix(plugin-workflow): fix cycling trigger when create or update

* fix(plugin-workflow): fix transaction in manual processor

* refactor(plugin-workflow): optimize todo list data loading

* fix(plugin-workflow): fix uncommitted manual action effects

* fix(plugin-workflow): fix save multiple forms and only submit one

* chore(plugin-workflow): fix lint

* fix(plugin-workflow): fix lint error

* refactor(plugin-workflow): abstract workflow scoped FormBlockProvider

* fix(plugin-workflow): adjust designable api to use current schema in refresh

* fix(plugin-workflow): fix schema config and support block template

* fix(plugin-workflow): fix lint and build error

* fix(plugin-workflow): adjust components and scope to inner schema component

* fix(plugin-workflow): fix ref template in todo drawer

* fix(plugin-workflow): fix todo form undefined

* fix(plugin-workflow): fix manual form schema

* fix(plugin-workflow): fix manual createdBy/updatedBy user

* fix(plugin-workflow): disable save to template on create form

* fix(plugin-workflow): fix manual form variables

* fix(plugin-workflow): fix FormBlockProvider for default field value

* fix(plugin-workflow): fix manual node variables
2023-06-05 16:52:43 +08:00
chenos
c3d359925c
fix(association-field): allow dissociate (#1940) 2023-05-26 12:36:09 +08:00
chenos
efbd7c7020
fix(association-field): allow multiple (#1938) 2023-05-26 11:38:03 +08:00
被雨水过滤的空气-Rairn
c722ca41d9
feat(data-template): support for unlimited levels of fields selection (#1910)
* refactor: use useMemo

* refactor: use useCallback

* feat(Data-template): change maxDepth from 3 to 10

* feat(Data-template): support for unlimited levels of fields selection

* fix: fix invalid selection

* fix: should be updated when data changes

* feat: parent treeNode and children treeNodes are not associated

* fix: avoid error

* fix: fix error

* chore: remove notification

* fix: parant node should be selected when child is selected

* fix: auto select all ancester nodes
2023-05-25 15:23:32 +08:00
xilesun
518ca740f8 fix(locale): translation typo 2023-05-22 19:58:55 +08:00
被雨水过滤的空气-Rairn
110b00bc01
fix(Data-template): fix bug when deleting fields (#1907)
* chore: add translation

* fix(Data-template): fix bug when deleting fields

---------

Co-authored-by: chenos <chenlinxh@gmail.com>
2023-05-22 17:17:33 +08:00
YANG QIA
d35f67d2e1
feat(app): add clear cache button (#1909) 2023-05-22 17:16:12 +08:00
YANG QIA
eac034cb23
feat: support reboot application manually (#1889)
* feat(reload-btn): reload application manually

* feat(app): support reboot

* feat: collections load after upgrade

* feat(reboot): support reboot manually

* chore(reboot): some typo

* fix(reboot): fix storage path

* fix(reboot): change restart file path

* fix: menu divider

---------

Co-authored-by: chenos <chenlinxh@gmail.com>
2023-05-19 20:34:22 +08:00
JoGosGitHub
770f53ec4e
Feat/translation es_ES (#1801)
* feat: client and plugin translation ES

* fix: es translation

* fix: es translation
2023-05-17 11:39:37 +08:00
Dunqing
3a77e4376a
feat: support List and Grid Card block (#1753)
* feat: support details block

* feat: rename to list

* fix: imports

* feat: improve list block

* feat: support title hidden

* fix: showTitle default value

* feat: support table column actions

* feat: support appendsOnDemand

* feat: reuse same schema items

* feat: shouldn't display pagination when pages only one

* feat: block order

* feat: support card list

* fix: appends on demand

* fix: remove unused code

* fix: params

* fix: improve default pageSize

* feat: improve performance

* feat: add title designer

* feat: improve huge performance

* fix: better key

* feat: improve schema perf

* feat: improve initializer

* fix: improve grid perf

* fix: avoid haven't properties

* feat: support automatic run service when params changed

* fix: revert params

* fix: grid col width

* refactor: improve CardList performance

* fix: initializer related

* feat: i18n supports

* fix: improve get schema

* fix: create new form

* fix: revert code

* feat: css improve

* fix: i18n copy

* refactor: the CardList rename to GridCard

* feat: remove AssociationFilter item

* fix: edit and view data is incorrect

* feat: remove bulk actions

* feat: improve action bar

* feat: supports configuration of columns with different screen sizes

* fix: incorrect place to save the template

* feat: keep height in all card

* fix: remove console

* fix: rename

* refactor: improve GridCard implementation

* feat: support import/export actions

* fix: remove padding when actions is empty

* fix: remove incorrect import

* fix: remove unused props

* fix: action place

* feat: improve column count

* refactor: remove appendsOnDemand, and use useAssociationNames instated it

* fix: incorrect component

---------

Co-authored-by: chenos <chenlinxh@gmail.com>
2023-05-16 09:05:47 +08:00
李小斐
975b7dfe93
fix: action error when field deleted (#1849)
* fix: action error when field deleted

* fix: delete field cannot set dynamic value
2023-05-15 09:34:14 +08:00
Rairn
d34b3fc5e3 chore: add translations 2023-05-11 16:56:05 +08:00
katherinehhh
55efa40cdd
refactor: association field (#1838)
* feat: association field

* fix: bug

* refactor: association field

* style: style improve

* style: style improve

* refactor: support subtable

* refactor: support file collection

* refactor: locale improve

* refactor: subtable improve

* refactor: association select  improve

* refactor: association select  improve

* refactor: association select  improve

* refactor: useAssociationNames

* refactor: enable link

* refactor: selector

* refactor: selector

* refactor: locale improve

* refactor: on demand loading of relational data

* refactor: locale improve

* refactor: select button

* refactor: association field

* refactor: formformBlock provider

* refactor: formformBlock provider

* refactor: internalSelect recordPicker

* refactor: formBlocklockProvider

* fix: addNewer schema

* fix: useServiceOptions

* fix: useCreateActionProps

* fix: useCreateActionProps

* refactor: nester delete

* refactor: nester delete in detail

* refactor: subTable suport select

* refactor: subTable suport select

* style: style improve

* style: style improve

* chore: fileManger

* fix: association readPrety

* fix: filemanger

* refactor: field mode

* refactor: enable link

* chore: error message

* refactor: association schemaInitialize

* refactor: association schemaInitialize

* refactor: currentMode

* refactor: field mode default value

* fix: file manage readPretty

* fix: appends

* chore: file manage readPretty

* fix: updateAssociationValues

* fix: updateAssociationValues

* fix: updateAssociationValues

* fix: nester appends

* fix: nester appends

* fix:  tree collection association fields

* fix:  tree collection association fields

* fix: nester appends

* fix: subtable to select field value missing

* fix: subtable to select field value missing

* fix: compatible with historical blocks

* fix: compatible with historical blocks

* fix: compatible with historical blocks

* feat: add migration

* fix: filter block allow add new

* fix: compatible with historical blocks

* fix: skip if not RecordPicker

* fix: compatible with historical blocks

* fix: detail block not support nester

* fix: association select support data scope and sort setting

* fix: appends on demand loading

* fix: asociationSelect support multiple

* fix: recordPicker -> AssociationField

* fix: add migration

* fix: audit logs not show assication data

* fix: flattenNestedList

* refactor: file manager field mode

* refactor: field mode refactor

* fix: subtable action

* fix: subtable appends

* refactor: code improve

* fix: nester add new

* feat: sub table

* fix: data scope not effect immediately

* fix: association add new

* fix: association field failed to  add new and mutual influence

* style: style improve

* style: style improve

* refactor: updateAssociationValues

* refactor: form init values

* refactor: select options

* fix: form initialValues

* fix: record picker values

* fix: field value change when field mode change

* fix: select data scope

* feat: add migration

* fix: table column enable link

* fix: table column enable link

* refactor: locale improve

* fix: migration

* fix: mutiple config

* fix: readPretty enable link

* fix: appends on demand

* fix: enable link style

* refactor: locale improve

* refactor: locale improve

* feat: sub-form migration

* fix: skip migration

* fix: translation

* fix: skip migration

* fix: getLabelFormatValue

* fix: error TS2339: Property 'find' does not exist on type 'string | SchemaEnum<any>'

* refactor: remove the logic code for converting old record picker

* refactor: locale

* refactor: locale

* fix: sub-table should not support add new

* refactor: code improve

* refactor: locale

* fix: compatibility history Subtable

* fix: improve

---------

Co-authored-by: chenos <chenlinxh@gmail.com>
Co-authored-by: Chareice <chareice@live.com>
2023-05-11 12:47:31 +08:00
Jack
d0edc6ce3f
fix: table configuration delete button problem (#1764)
* fix: table configuration delete button problem

* fix: change copy

* refactor: optimize code

---------

Co-authored-by: Rairn <958414905@qq.com>
2023-05-05 11:30:10 +08:00
black
00b3c8c257
fix(filter-block): fix association fields not being filtered (#1758) 2023-04-26 10:43:48 +08:00
李小斐
c03d271481
feat: deleted collection field give some tips (#1744)
* feat: deleted collection field give some tips

* chore: optimize traslation

---------

Co-authored-by: Rairn <958414905@qq.com>
2023-04-24 21:49:56 +08:00
被雨水过滤的空气-Rairn
cd596925ee
chore: optimize the white screen problem (#1639)
* chore: add react-error-boundary

* fix: optimize the white screen problem

* fix: fix translation
2023-04-24 16:40:02 +08:00
李小斐
6d693a5ab6
fix: custom column title, same as form field title (#1745) 2023-04-23 18:29:17 +08:00
被雨水过滤的空气-Rairn
3c884cdd36
feat(collection-manager): support for setting the title field (#1729)
* feat: configure fields

* feat: edit

* feat: enable delete action

* style: indent style

* feat: support to override and view inherited fields

* feat: support to delete and add field and sync

* fix: should delete the seleted option

* feat: support to setting title field

* feat: avoid infinite loops and add default title field

* feat(data-templates): use titleField to display title

* fix: fix the pagination of collection manager

* feat: add prompt for title field switch

* feat: filter field types

* feat: not use title switch when field interface is icon

* feat: translate

* fix: sync update collections data

* feat: translate

* fix: fix build error

---------

Co-authored-by: chenos <chenlinxh@gmail.com>
2023-04-21 11:19:59 +08:00
Junyi
a5b4684a48
refactor(plugin-workflow): change single form to custom form block (#1707)
* refactor(plugin-workflow): change single form to custom form block

* fix(plugin-workflow): fix migration

* fix(plugin-workflow): fix manual node initializer

* test(plugin-workflow): migrate test cases

* refactor(plugin-workflow): split custom form code

* fix(plugin-workflow): fix types

* refactor(plugin-workflow): change manual form config data structure

* fix(plugin-workflow): fix no options manual node variable

* fix(plugin-workflow): fix migration script
2023-04-18 18:41:18 -07:00
katherinehhh
e8bb962389
refactor: improve linkage rule enable (#1700) 2023-04-17 09:28:22 +08:00
被雨水过滤的空气-Rairn
69bc18e166
feat(form-block): data templates (#1704)
* feat(Form): support to select existing data as template

* refactor: extract useDataTemplates

* feat(Form): support to use template

* fix: template switch

* fix: fix association field

* fix: filter fields

* fix: fix unselected default value

* fix: avoid errors

* refactor: remove useless code

* refactor: move templateSelect to FormBlockProvider

* feat: add a checkbox to toggle template selector

* feat: change the options order

* feat: hide Collection option when no inherit

* fix: optimize the label text

* fix: should empty form

* fix: should hide configuration when is not added

* chore: change text

* fix: template selector not displayed

* feat: optimize template

* feat: data template middleware

* fix: template select

* fix: default

* fix: fields

* feat: field delete button changed from hidden to disabled

* fix: improve code

* fix: prefix error

* fix: items

* feat: use Tree

* fix: maxDepth

---------

Co-authored-by: chenos <chenlinxh@gmail.com>
2023-04-16 14:22:46 +08:00
Dunqing
1fdc456c0b
feat: improve plugin manager ui (#1650)
* feat: improve plugin view

* feat: work compatibility

* feat: avoid cause error

* feat: complete

* docs: revert

* fix: header cannot displayed

* feat: improve

* feat: update page css

* feat: update fixedblock design

* chore: upgrade antd

* fix: improve code

* fix: build error

* fix: build error

* fix: pagination cannot be fully displayed

* feat: improve

* fix: ts error

* chore: sqlite view field test

---------

Co-authored-by: chenos <chenlinxh@gmail.com>
Co-authored-by: chareice <chareice@live.com>
2023-04-12 12:24:09 +08:00
katherinehhh
1a933315e4
feat: gantt block (#1393)
* feat: add Gantt block

* feat:  gantt block congiure action

* feat:  gantt block congiure fields

* feat:  gantt block congiure fields

* feat:  gantt block congiure fields

* feat:  gantt block code improve

* feat:  gantt block code improve

* feat:  gantt block code improve

* feat:  gantt block time range

* feat:  gantt block date change

* feat:  gantt block progress change

* feat:  gantt block columnWidth fix

* feat:  gantt block action configure

* feat: gant block init fix

* feat: gant block table configure

* feat: gant block table configure

* feat: gant block table configure

* feat: gant expend when table expend

* feat: modulecss ->less

* feat: style improve

* feat: style module -> emotion css

* feat: gantt process handle

* feat: gantt block empty state placeholder

* feat: table actions suport config

* feat: gantt block suprt  time range change

* feat: gantt block suprt process update

* feat: gantt block suprt process update

* feat: gantt block suprt process update

* feat: gantt block suprt process update

* feat: gantt block configure actions

* feat: gantt block style improve

* feat: gantt table actions column is configured by default

* feat: gantt block surport bulk update

* feat: gantt block surport bulk update&bulk edit

* feat: gantt block action configure fix

* feat: gant block code improve

* feat: do not display  gantt bar when the start date is empty

* feat: gant configure actions

* feat: gant task change

* feat: gant calendar style improve

* style: gant local

* style: gant grid style improve

* style: gant calendar style improve

* style: gant style improve

* refactor: gant bar suport click

* feat: adjacency list

* fix: error

* feat: collection extender

* Revert "feat: collection extender"

This reverts commit a942eee769.

* fix: registerBuiltInListeners

* chore: getAllNodeIds

# Conflicts:
#	packages/plugins/acl/src/server.ts

* fix: get list data tree ids

# Conflicts:
#	packages/plugins/acl/src/__tests__/list-action.test.ts

* feat: suport add child

* feat: demo3

* feat: suport add child

* feat: support add child

* feat: support add child

* fix: tree true

* feat: suport expend and collapse

* feat: support expend and collapse

* feat: support expend and collapse

* feat:  table block of the selector supports tree table

* feat: expand and collapse are only displayed in the tree table

* fix: when the tree table is closed and opened, it needs to be refreshed to take effect

* fix: test

* refactor: add child is hidden when the tree table is closed

* refactor: tree table filter the children field

* refactor: tree table filter the children field

* refactor: tree table filter the children field

* refactor: expand and collapse button does not support modify name and icon

* refactor: parent cannot be modified when adding child

* refactor: expand and collapse button hide when treetable is closed

* refactor: expand and collapse button hide when treetable is closed

* refactor: expand and collapse button hide when treetable is closed

* refactor: expand and collapse button hide when treetable is closed

* refactor: expand and collapse button hide when treetable is closed

* refactor: expand and collapse button hide when treetable is closed

* refactor: expand and collapse button hide when treetable is closed

* refactor: expand and collapse button hide when treetable is closed

* refactor: filter out the node itself when selecting parent

* refactor: filter out the node itself when selecting parent

* refactor:  tree collection locale

* refactor:  tree collection locale

* feat: gantt block support tree collection

* fix: parameter exception when creating data selector

* feat: gantt block support tree collection

* feat: gantt block support tree collection

* fix: tableActionColumnInitializers

* style: style improve

* fix: gantt  expansion exception

* style: style improve

* style: style improve

* style: calendar style improve

* style: style improve

* style: code  improve

* refactor: gantt chart also highlights when table rows are selected

* fix: time scale default value

* fix: end field is nor requried to set

* fix:  detailed blocks not appear when child record is clicked

* fix:  detailed blocks not appear when child record is clicked

* refactor: gantt default  expand all

* feat: gantt adapt to compact themes

* feat: gantt adapt to compact themes

* refactor: style improve

* refactor: style improve

* refactor: style improve

* refactor: style improve

* refactor: style improve

* refactor: style improve

* refactor: style improve

* refactor: sort by start date

* refactor: style improve

* refactor: style improve

* fix: styling

* fix: font-family

* fix: font-weight: 400

* feat: custom color

* fix: styling

* fix: style

* refactor: style improve

* refactor: style improve

---------

Co-authored-by: chenos <chenlinxh@gmail.com>
2023-04-12 11:19:22 +08:00
katherinehhh
7821af4024
feat: collection template summary (#1672)
* feat: collection template description

* refactor: improve translation

* refactor: improve translation
2023-04-08 14:18:20 +08:00
Junyi
52329df140
feat: (plugin-workflow) dynamic expression (#1560)
* feat(plugin-formula): add dynamic expression field

* feat(plugin-workflow): add dynamic expression for calculation

* refactor(client): allow select part of paths in variable component

* fix(client): fix types

* feat(plugin-formula): add dynamic expression config

* feat(plugin-workflow): add dynamic calculation

* refactor(plugin-formula): move expression field type to workflow plugin

* fix(plugin-workflow): fix types

* fix(plugin-workflow): fix register field in client

* fix(plugin-workflow): fix expression result value default

* fix(plugin-workflow): fix dynamic expression field error when switch collection

* fix(plugin-workflow): test component value change

* test(plugin-workflow): test component linkages

* refactor(plugin-workflow): change to expression collection template

* fix(client): fix hooks of Variable.TextArea

* fix(client): fix to import evaluators in client

* fix(evaluators): move renderReference method to plugin

* fix(plugin-workflow): fix missed component

* fix(plugin-workflow): fix dynamic expression test case

* refactor(client): change popover to double click to choose entire object

* refactor(plugin-workflow): make variable options and filter more sensible

* fix(plugin-workflow): fix form effect

* fix(plugin-workflow): fix variable filtering in collection trigger

* fix(plugin-workflow): fix types

---------

Co-authored-by: chenos <chenlinxh@gmail.com>
2023-04-07 19:52:31 -07:00
katherinehhh
1d6417f7f9
feat: support tableoid filter (#1657)
* feat: support inherited collection filter

* refactor: improve translation

* chore: filter inherted collectiion

* feat: data scope support inherited collection filter
2023-04-07 16:48:32 +08:00
katherinehhh
28ee5d1477
refactor(client): improve translation (#1654)
* refactor(enabled child collection ): locale

* refactor: locale
2023-04-06 16:15:44 +08:00
被雨水过滤的空气-Rairn
53d0c2dd23
feat: support file collection (#1636)
* feat: support to add File collection

* feat: support to upload files

* refactor: rename 'ReadPretty.Attachment' to 'ReadPretty.File'

* feat: support to associate the File collection

* refactor: add Preview and replace Upload.Selector

* fix(Preview): fix some problems in ReadPretty mode

* feat: use 'preview' as a default title field

* feat: support only local storage now

* fix: should not show 'Add new' button

* chore: add default value for file storage

* fix: fix preview field of file collection cannot be displayed normally

* fix: only Table and Details can display File collection

* chore: translate

* refactor: migration to plugin from core

* refactor: change 'preview' to 'url'

* fix: only 'belongsTo' and 'belongsToMany' can linked file collection

* fix: fix storage and add a field called storage in file collection

* feat: add 'deletable' to configure the visibility of the delete button

* fix: fix can't upload attachment problem

* fix: remove more option

* fix: can't use preview to filter

* fix: remove Import action option

* refactor: remove useless code

* chore: optimize condition

* chore: remove comment

* test: windows compatible

* refactor: optimize upload

* fix: upload action

* fix: createAction

* fix: uploads

* fix: file collection cannot be inherited by other collections

* fix: url should be editable

* fix: url is filterable

* fix: use input interface for url field

* fix: fix error

* fix: remove subform

* Revert "chore: translate"

This reverts commit 53cd346dab.

* refactor: move translation to plugin

* fix: title is editable

* fix: collection?.template === 'file'

* fix: fix order of URL

* fix(collection-manager): allow collectionCategories:list

* chore: add translation

* fix(upload): should enable to use drawer

* refactor: move code to plugin

---------

Co-authored-by: chenos <chenlinxh@gmail.com>
2023-04-06 12:43:40 +08:00
ChengLei Shao
4f87de7da5
feat: database view collection (#1587)
* test: create view collection

* feat: view collection class

* feat: list view

* chore: skip sync view collection

* test: should create view collection in difference schema

* test: create view collection in collection manager

* feat: create view collection by user sql

* test: view resourcer

* feat: view collection

* feat: view collection cannot be added, deleted, or modified

* feat: view collection cannot be added, deleted, or modified

* feat: view collection cannot be added, deleted, or modified

* feat: view collection cannot be added, deleted, or modified

* refactor: connect to database view

* refactor: sync from database

* chore: rename list view sql

* chore: list view fields api

* chore: create collection without viewName

* feat: bring out fields when selecting a view

* chore: bring out fields when selecting a view

* feat: view field inference class

* chore: bring out fields when selecting a view

* chore: sync form database view

* chore: sync form database view

* refactor: view collection local

* feat: view get api

* feat: database type infer

* feat: integer map

* chore: remove from in view list

* chore: build error

* chore: uniq collection

* fix: typo

* chore: replace collection list source field

* fix: destroy view collection

* chore: timestamp field map

* refactor: interface avalableTypes

* refactor: interface avalableTypes

* chore: list fields test

* refactor: interface avalableTypes

* chore: uiSchema response in field source

* fix: view query

* chore: collection snippet

* refactor: view collection support preview

* fix: handle field source

* fix: typo

* fix: configure fileds title

* fix: configure fileds title

* fix: configure fileds title

* fix: sync from databse interface

* fix: sync from databse interface

* feat: set fields api

* fix: sync from databse fix

* feat: possibleTypes

* chore: fields get

* fix: sync from databse

* fix: list view test

* fix: view test in difference schema

* chore: comment

* feat: when there is only one source  collection, the view is a subset of a Collection

* feat: view collection add field

* fix: inherit query with schema

* fix: test

* fix: ci test

* fix: test with schema

* chore: set pg default search path

* chore: mysql test

* fix: test with schema

* chore: test

* chore: action test

* chore: view column usage return type

* feat: mysql field inference

* fix: tableName

* chore: node sql parser

* fix: sql build

* fix: database build

* fix: mysql test

* feat: view collection uiSchema title

* fix: incorrect field source display  when switching views

* refactor: view collection not allow modify

* fix: view collection is allow add, delete, and modify

* fix: mysql test

* fix: sqlite test

* fix: sqlite test

* fix: sqlite test

* fix: sqlite test

* chore: add id field as default target key

* style: style improve

* feat: load source field options

* style: style improve

* chore: disable remove column in view collection

* chore: support creating view collection with different schemas with the same name

* chore: support creating view collection with different schemas with the same name

* fix: query view in difference schema

* refactor: view collection viewname

* fix: query view collection in difference schema

* fix: field load

* chore: field options

* fix: mysql test

* fix: uiSchema component error when using a view field in a block

* fix: sqlite test

* chore: test

* fix: dump user views

* fix: view collection can be updated and edited in table block

* chore: sync from database display last field configuration

* chore: loadCollections

* chore: sync from database display last field configuration

* fix: field options merge issues

* style: preview table

* fix: view collection is allow using in kanban blocks

* refactor: code improve

* fix: view collection can be updated an edited in calendar block

* chore: disable infer field without interface

* feat: preview only shows source or interface fields

* fix: test

* refactor: locale

* feat: sql parser

* chore: remove node-sql-parser

* fix: yarn.lock

* test: view repository

* fix: view repository test

* chore: console.log

* chore: console.log

* fix: mysql without schema

* fix: mysql without schema

* chore: preview with field schema

* chore: tableActionInitializers

* style: preview style improve

* chore:  parameter is filter when there is no filterByTk

* fix: preview pagination

* fix: preview pagination

* style: preview table style improve

* fix: sync from database loading

* chore: preview performance optimization

* chore: preview performance optimization

* feat: limit & offset

* chore: preview performance optimization

* test: field with dot column

* fix: datetime interface display

* fix: missing boolean type

* fix: sync

* fix: sync from database

* style: style improve

* style: style improve

* style: style improve

* chore: preview table

* chore: preview table

* chore: preview table

* fix: styling

---------

Co-authored-by: katherinehhh <katherine_15995@163.com>
Co-authored-by: chenos <chenlinxh@gmail.com>
2023-04-01 21:56:01 +08:00
被雨水过滤的空气-Rairn
098140d511
feat(parse-variables): support to parse variables in filter params (#1558)
* fix: add field linkage on setting default datetime

* fix: fix dateonly timezone problem

* fix: improve test

* docs(DatePicker): add demos

* fix(DatePicker): should return the beginning of a second

* feat(DatePicker): support non-UTC

* refactor: rename

* fix(RangePicker): get correct end date

* test(mapDatePicker): add test

* test(mapRangePicker): add test

* feat(Filter): use non-UTC to filter

* feat(FilterBlock): use non-UTC to filter

* feat: add '$dateBetween' operator in datetime

* feat: use RangePicker on toggled to 'dateBetween' operator

* feat: set ranges for RangePicker

* feat: backend support to parse 'dateBetween' operator

* fix: fix build error

* fix: adaptive content width

* feat: support to use var on data scope

* feat: add parse-variables plugin

* feat: support to parse variables

* feat: support only to set system variables

* test: rename

* feat: cover all

* fix: fix build error

* feat(RangePicker): extend more shortcut keys

* feat(parse-variables): support more date var

* feat: support user variables

* feat: disable unmatched options

* fix: use component name to filter option

* fix: fix build error

* feat: remove some operator of id

* chore: remove useless operators

* fix: built in plugin

* refactor: move to core from plugin

* refactor: remove code of plugin

* refactor: remove useless code

* fix: should after acl

* Update server.ts

* fix: compatible with old version

* feat: test cases

* refactor: rename to 'is between'

* refactor: parse filter

* fix: improve code

* feat: test cases

* fix: fix error

* fix: improve parse date

* fix: date variables

* fix: day range

* fix: test error

* fix: typo

* fix: test error

* feat: $user variable

* fix: toDate

* fix: fix the value range of shortcuts

* feat: add quarter and test

* feat: support to use user's association fields to filter

* refactor: use maxDepth

* refactor: remove useless code

* fix: make AssociationSelect.Designer to support variables

* fix: getField

* fix: parse utc

* fix: remove only

* fix: filter by ctx.db.getFieldByPath

* fix: avoid error

* fix: add translation

* fix(RangePicker): can be set to empty

* feat(utils): add hasEmptyValue

* fix: should not save empty

* fix: last few days should include today

* fix: limit user variable type to display

* fix: parse filter error

* fix: empty

* test: [skip ci]

* fix: remove ';'

* feat: improve code

---------

Co-authored-by: chenos <chenlinxh@gmail.com>
2023-03-30 23:49:57 +08:00
katherinehhh
c2885ee1d6
fix(linkage rules) : support naming, enabling and disabling, copying, and assigning null values (#1511)
* fix: condiction suport empty

* fix: condiction suport empty

* fix: condiction suport empty

* fix: condiction suport empty

* feat: detailed operations support linkage rules

* fix: button linkage failed during page change of detail block

* fix: button linkage failed during page change of detail block

* fix: linkage values not suport formula

* fix: linkage value suport empty

* fix:  checkbox value  linkage failed

* refactor: using evaluators package

* refactor: using evaluators package

* refactor: linkage field

* fix: relation field is limited to one level

* fix: relation field is limited to one level

* fix: linkage local

* feat: support copy linkage rules

* feat:  support naming linkage rules

* feat:  support naming linkage rules

* style: style improve

* fix: missing operation when copying linkage

* feat: linkage rules support disabling and enabling

* fix: linkage rule update is not updated immediately

* feat: action support linkage enabled

* feat: action support linkage enabled

* feat: action support linkage enabled

* fix: linkage rules title update exception

* feat: action support linkage enabled

* fix: linkage rules copy failed

* fix: linkage rules copy failed

* fix: linkage rules copy failed

* fix: linkage rules copy failed

* refactor: code improve

* refactor: code improve

* fix: linkage rules copy failed

* fix: linkage rules copy failed

* fix: the first input is cleared

* refactor: code improve

* refactor: code improve

* refactor: delete redundant variables

* fix: action modal automatically closes

* fix: action automatically closes

* fix: action automatically closes

* fix: details block chang  page  action linkage failed

* fix: details block chang  page  action linkage failed

* feat: syntax references

* feat: syntax references

* fix: current time

* fix: current time

* fix: action linkage

* fix: formulajs tyy catch

* fix: multi-level linkage

* chore: linkage support

* chore: linkage support

* chore: linkage code improve

---------

Co-authored-by: chenos <chenlinxh@gmail.com>
2023-03-30 23:40:18 +08:00
katherinehhh
99ee409fce
fix: history add new button does not support enabling child collection (#1536)
* fix:  history add new button does not support enabling child collection

* fix:  history add new button does not support enabling child collection
2023-03-30 17:46:39 +08:00
Dunqing
0853915f23
feat: association-filter-improve (#1606)
* feat: snapshot-i18n fix

* feat: association-filter-improve

add data scope for association filter
add default sort for association filter

* feat(association-filter-improve): close association-filter filter fix

* feat(association-filter-improve): refresh on table refresh

* feat(association-filter-improve): refresh on table refresh

* feat(association-filter-improve): remove field filter fixed

* feat(association-filter-improve): filter fix

* fix: missing props

* refactor: re design

* fix: data scope not work

* feat: support sorting rule

* feat: support configure default collapse

* fix: multiple association item will not work

* fix: ts error

* fix: ts error

---------

Co-authored-by: anuoua <anuoua@gmail.com>
2023-03-30 09:00:56 +08:00
Italo A. G
726b08e87a
Translation pt-BR (Brazilian Portuguese) (#1591)
* feat: portuguese brazil translations

* feat: add pt-BR languate to the plugins

* feat: add pt-BR languate to the plugins
2023-03-23 22:53:33 +08:00
被雨水过滤的空气-Rairn
070c9c21ec
feat(filter-blocks): support filter-blocks (#1505)
* refactor: audit log (#1516)

* refactor: audit-log

* refactor: audit-log fix view action

* refactor: audit-log view fix

* refactor(audit-log): collection field fix

* refactor: audit-log view field fix

* refactor(audit-log): support fixedBlock

* refactor(audit-log): i18n fix

* feat(filter-blocks): support form-block

* feat(filter-blocks): add FilterProvider

* feat: filter data blocks

* perf: use useMemo

* refactor: rename

* feat: collect filter params

* refactor: rename

* refactor: remove useless code

* feat: add 'Connect data blocks' option

* feat: support 'x-filter-targets' to save data-blocks

* refactor: extract Form.FilterFormDesigner

* feat: extract FormItem.FilterFormDesigner

* refactor: extract common editing options

* feat: support to set operator

* feat: use operator created by user

* fix: improve loading

* fix: merge prev params

* feat: support reset

* refactor: rename

* chore: left a TODO

* feat: add Table.FilterDesigner

* feat: support filter-table

* refactor: reduce code

* feat: handle click event of table row

* feat: support to connect association collection

* feat: support Collapse

* feat: show empty

* refactor: optimize readability

* fix: keep state as latest

* fix: highlight row on selected

* feat: highlight data block on hover

* fix: avoid misuse

* chore: reduce code

* fix(Table): support to cancel select

* fix(Collapse): merge multiple filter params

* chore: make to pass CI

* feat: merge all filter params

* refactor: remove useless code

* fix: undefined

* fix(Form): fix bug with association fields

* chore: fix typo

* fix: use title

* chore: avoid infinite loops

* test: cancel comments

* fix: make ci normal

* fix: filter down non-association fields

* fix: fix page crash

* fix: use correct operator

* fix: avoid infinte loops

* style: optimize style on hover

* fix: avoid crash

* chore: optimize empty description

* fix: avoid targetKey empty

* refactor: use getTargetKey instead

* fix: filter out unfilterable fields

* refactor: avoid to invoke hook multiple times

* refactor: reduce the judgment conditions of component

* fix: group fields in the right way

* fix: fix error of type

* fix: fix error on no FilterBlockProvider

* fix(Table): fix fexed-block bug

* chore: reduce gap

* fix(Form): use AssociationSelect by default

* fix: remove g2plot blocks

* fix(Form): remove 'Display association fields'

* fix(Table): use radio

* fix(Table): no need Actions

* fix: fix template problem

* fix(Table): keep only 'filter' and 'refresh'

* fix: use collection name as identifier for data blocks

* fix: make sure all fields are editable

* fix(Form): remove custom actions

* fix(Details): display empty component on no data

* feat(Form): support association fields

* refactor: rename

* feat(Form): support for deep-level association fields

* Revert "fix(Table): keep only 'filter' and 'refresh'"

This reverts commit 61a1d101a7d15223cfd3523adb33567fff545568.

* Revert "fix(Table): no need Actions"

This reverts commit 8314629e92fb3b5b7ec1c97904a42c76c43e4d4a.

* Revert "fix(Table): use radio"

This reverts commit c6f009740e1835f9762653a721ff64f52d0994cf.

* feat(Table): highlight row on selected

* feat: support to cacel highlight

* fix: type error

* feat: remove Table from filter list

* fix(Table): highlight rows problem

* refactor: remove usless code

* refactor(Collapse): detach from Table

* fix(Table): highlighting row problem

* fix: translate problem

* fix(Collapse): fix error of useProps

* fix(Table): avoid undefined

* Update Details.tsx

* Update DetailsBlockProvider.tsx

* refactor: rename target.name to target.uid

* fix: add translate

* style: add padding

---------

Co-authored-by: anuoua <anuoua@gmail.com>
Co-authored-by: chenos <chenlinxh@gmail.com>
2023-03-20 17:40:16 +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
Dunqing
3cce8f75e5
feat: support cron field (#1421)
* feat(calendar): replace cron component with CronSet

* fix: same exported

* fix: type incorrect

* fix: locale

* feat: upgrade react-js-cron and update some text

* fix: cron path

* fix: edge case

* feat: support FixedBlock
2023-03-19 10:55:05 +08:00
chenos
a9e5e14429
feat: tree collection (#1561)
* feat: adjacency list

* fix: error

* feat: collection extender

* Revert "feat: collection extender"

This reverts commit a942eee769.

* fix: registerBuiltInListeners

* chore: getAllNodeIds

# Conflicts:
#	packages/plugins/acl/src/server.ts

* fix: get list data tree ids

# Conflicts:
#	packages/plugins/acl/src/__tests__/list-action.test.ts

* feat: suport add child

* feat: demo3

* feat: suport add child

* feat: support add child

* feat: support add child

* fix: tree true

* feat: suport expend and collapse

* feat: support expend and collapse

* feat: support expend and collapse

* feat:  table block of the selector supports tree table

* feat: expand and collapse are only displayed in the tree table

* fix: when the tree table is closed and opened, it needs to be refreshed to take effect

* fix: test

* refactor: add child is hidden when the tree table is closed

* refactor: tree table filter the children field

* refactor: tree table filter the children field

* refactor: tree table filter the children field

* refactor: expand and collapse button does not support modify name and icon

* refactor: parent cannot be modified when adding child

* refactor: expand and collapse button hide when treetable is closed

* refactor: expand and collapse button hide when treetable is closed

* refactor: expand and collapse button hide when treetable is closed

* refactor: expand and collapse button hide when treetable is closed

* refactor: expand and collapse button hide when treetable is closed

* refactor: expand and collapse button hide when treetable is closed

* refactor: expand and collapse button hide when treetable is closed

* refactor: expand and collapse button hide when treetable is closed

* refactor: filter out the node itself when selecting parent

* refactor: filter out the node itself when selecting parent

* refactor:  tree collection locale

* refactor:  tree collection locale

* fix: parameter exception when creating data selector

* fix: translation

* refactor:  tree collection locale

* feat: data selector Support tree table

* fix: failed to uncheck when multiple data selectors are selected

* fix: open or disabled the tree table, and add child does not respond immediately

* feat: data selector Support tree table

* fix: can not hide add child button

* fix: improve code

* fix: tree table

* fix: dynamic children column

---------

Co-authored-by: Chareice <chareice@live.com>
Co-authored-by: katherinehhh <katherine_15995@163.com>
2023-03-17 09:20:56 +08:00
anuoua
7313307210
feat: record picker support to enable links (#1515)
* feat: link-tag-switch

* feat(link-tag-switch): add interface

* feat(link-tag-switch): i18n fix

* feat(link-tag-switch): fix link enable

* feat(link-tag-switch): cr fix

* fix: error

* fix: skip test

---------

Co-authored-by: chenos <chenlinxh@gmail.com>
2023-03-12 17:16:17 +08:00
Junyi
acc5656490
fix(client): fix checkbox unchecked display (#1508)
* fix(client): fix checkbox unchecked display

* fix(client): revert global option back
2023-02-28 07:58:10 -08:00
justwho
4e81a26805
Update zh_CN.ts (#1481)
Co-authored-by: chenos <chenlinxh@gmail.com>
2023-02-25 17:53:45 +08:00
katherinehhh
94e38e453a
feat: form/button linkage rules (#1456)
* feat(plugin-workflow): add prompt node

* feat(plugin-workflow): useValueGetter for all instructions and triggers

* feat(plugin-workflow): add workflow block initializer

* refactor(plugin-workflow): change prompt node type to manual

* feat(plugin-workflow): add ModeConfig component for mode

* feat(plugin-workflow): add todo drawer

* feat(plugin-workflow): add block value provider

* feat(plugin-workflow): improve todo block and drawer

* fix(plugin-workflow): fix instruction name in test cases

* fix(plugin-workflow): fix test cases

* refactor(plugin-workflow): change param type of collection field initializer

* feat(plugin-workflow): add filter types for getters

* fix(plugin-workflow): fix assignees variable

* fix(plugin-workflow): filter todo by exist workflow

* fix(plugin-workflow): fix duplicated save action in manual config

* fix(plugin-workflow): fix transaction

* feat(plugin-workflow): destroy workflow will be cascaded

* fix(plugin-workflow): fix merge

* fix(plugin-workflow): fix locale

* fix(plugin-workflow): allow open ui view when executed

* fix(plugin-workflow): change todo table filter

* feat(plugin-workflow): use formula for calculation

* fix(plugin-workflow): fix variable template regexp

* fix(plugin-workflow): fix sub-options logic with types

* refactor(plugin-workflow): drop useless component

* fix(plugin-workflow): fix manual node action button

* feat(plugin-workflow): add new variable input component

* refactor(plugin-workflow): change all variable to new component

* fix(plugin-workflow): fix type

* fix(plugin-workflow): fix functions init

* fix(plugin-workflow): change jsonb to json for stable order

* fix(plugin-workflow): fix duplicated field name when initialize

* fix(plugin-workflow): fix manual result in manual block

* test(plugin-workflow): log field initializer props

* fix(plugin-workflow): fix nullable arguments

* test(plugin-workflow): test initializer fields schema

* fix: observer

* fix(plugin-workflow): adjust hints

* fix(plugin-workflow): fix locale and cursor in variable input

* refactor(plugin-workflow): change status keys

* fix(plugin-workflow): fix parallel instruction

* feat: linkage rules

* refactor: linkage rules

* refactor: linkage rules update

* refactor: linkage rules button

* refactor(linakge rules): suport value action

* refactor(linakge rules): suport value action

* fix(workflow test): workflow test

* refactor(linakge rules): action linkage only for detail form

* refactor(linakge rules):  logic calculation

* refactor(linakge rules):  logic calculation

* refactor(linakge rules):  logic calculation

* refactor(linakge rules):  logic calculation

* refactor(linakge rules):  linkageAction

* refactor(linakge rules):  linkageAction

* refactor(linakge rules): field value  linkageAction

* refactor(linakge rules): local

* refactor(linakge rules): local

* fix(linakge rules): value property

* fix(linakge rules): value property

* fix(linakge rules): value property

* fix(linakge rules): conditionAnalyse

* fix(linakge rules): conditionAnalyse

* fix(linakge rules): conditionAnalyse

* fix(linakge rules): conditionAnalyse form fields

* fix(linakge rules): conditionAnalyse form fields

* fix(linakge rules): conditionAnalyse operators

* fix(linakge rules): form button linkage

* fix(linakge rules): form button linkage

* fix(linakge rules): select component suport pattern

* fix(linakge rules):  component suport field patter for disabled

* fix(linakge rules):  component suport field patter for disabled

* fix(linakge rules):  component suport field patter for disabled

* fix(linakge rules):  component suport field patter for disabled

* fix(action): action desginer suport linkage

* refactor: formula calculation assignment

* refactor: formula calculation assignment

* style: unified component disable style

* feat: richText suport disabled

* feat: condiction suport varible

* feat: condiction suport varible

* refactor: variableInput

* refactor: condiction scope

* refactor: multi level linkage

* fix: empry value linkage

* refactor: components using core schema-component

* fix: fix template reference linkage

* refactor: evalute foumala

* fix: mutual linkage fix

* refactor: variables suport obo&oho

* style: style improve

* style: style improve

* style: style improve

* feat: variables suport m2o

* refactor: code improve

* refactor: code improve

* refactor: code improve

* refactor: code improve

* refactor: code improve

* fix: actions path

* refactor: code improve

* refactor: code improve

* refactor: code improve

* refactor: code improve

* refactor: code improve

* refactor: code improve

* refactor: code improve

---------

Co-authored-by: mytharcher <mytharcher@gmail.com>
Co-authored-by: Junyi <mytharcher@users.noreply.github.com>
Co-authored-by: chenos <chenlinxh@gmail.com>
2023-02-25 00:40:51 +08:00
Junyi
86d9eaf2fb
refactor(plugin-workflow): migrate evaluators (#1485)
* fix(plugin-formula): fix locale

* refactor(client): migrate variable component

* refactor(plugin-workflow): use core evaluators

* refactor(plugin-workflow): migrate calculation engines to evaluators
2023-02-22 23:45:03 +08:00
Junyi
139ca9a635
refactor(plugin-formula): combine 2 formula field type into 1 (#1457)
* fix: observer

* refactor(plugin-formula): merge 2 formula field type

* fix(plugin-formula): fix types

* fix(plugin-formula): fix type

* fix(plugin-formula): fix formulajs version

* fix(plugin-formula): change to VariableInput to avoid range error

* test(plugin-formula): add test

* fix(plugin-formula): fix test case

* fix(plugin-formula): fix test case

* fix(plugin-formula): fix test case

* refactor(plugin-formula): move components into plugin

* fix(plugin-formula): fix migration

* fix(plugin-formula): revert legacy component to fix build

* fix(plugin-formula): fix test case

* fix(plugin-formula): fix test case

* fix(plugin-formula): fix read-pretty component

* fix(plugin-formula): fix formula result component

* feat(plugin-formula): add checkbox display X

---------

Co-authored-by: chenos <chenlinxh@gmail.com>
2023-02-21 20:12:21 +08:00