├── .codeclimate.yml
├── .dockerignore
├── .gitattributes
├── .github
├── FUNDING.yml
├── ISSUE_TEMPLATE
│ ├── bug_report.md
│ └── feature_request.md
├── actions
│ ├── docker-build-push
│ │ └── action.yml
│ └── pnpm-install
│ │ └── action.yml
└── workflows
│ ├── docker-push.yml
│ ├── integration-tests.yml
│ ├── linting.yml
│ ├── manual-preview.yml
│ ├── preview-cleanup.yml
│ ├── templates
│ └── preview-template.yaml
│ └── unit-tests.yml
├── .gitignore
├── .gitpod.yml
├── .husky
├── commit-msg
├── install.mjs
└── pre-commit
├── .idea
├── modules.xml
└── teable.iml
├── .ncurc.yml
├── .npmrc
├── .prettierignore
├── .prettierrc.js
├── .vscode
├── extensions.json
├── launch.json
└── settings.json
├── AGPL_LICENSE
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── Makefile
├── README.md
├── apps
├── nestjs-backend
│ ├── .eslintrc.js
│ ├── .gitignore
│ ├── .idea
│ │ ├── modules.xml
│ │ └── nestjs-backend.iml
│ ├── README.md
│ ├── nest-cli.json
│ ├── package.json
│ ├── src
│ │ ├── app.module.ts
│ │ ├── bootstrap.ts
│ │ ├── cache
│ │ │ ├── cache.module.ts
│ │ │ ├── cache.provider.ts
│ │ │ ├── cache.service.ts
│ │ │ └── types.ts
│ │ ├── configs
│ │ │ ├── auth.config.ts
│ │ │ ├── base.config.ts
│ │ │ ├── bootstrap.config.ts
│ │ │ ├── cache.config.ts
│ │ │ ├── config.module.ts
│ │ │ ├── config.spec.ts
│ │ │ ├── env.validation.schema.ts
│ │ │ ├── logger.config.ts
│ │ │ ├── mail.config.ts
│ │ │ ├── oauth.config.ts
│ │ │ ├── storage.ts
│ │ │ └── threshold.config.ts
│ │ ├── const.ts
│ │ ├── custom.exception.ts
│ │ ├── db-provider
│ │ │ ├── aggregation-query
│ │ │ │ ├── aggregation-function.abstract.ts
│ │ │ │ ├── aggregation-function.interface.ts
│ │ │ │ ├── aggregation-query.abstract.ts
│ │ │ │ ├── aggregation-query.interface.ts
│ │ │ │ ├── postgres
│ │ │ │ │ ├── aggregation-function.postgres.ts
│ │ │ │ │ ├── aggregation-query.postgres.ts
│ │ │ │ │ ├── multiple-value
│ │ │ │ │ │ └── multiple-value-aggregation.adapter.ts
│ │ │ │ │ └── single-value
│ │ │ │ │ │ └── single-value-aggregation.adapter.ts
│ │ │ │ └── sqlite
│ │ │ │ │ ├── aggregation-function.sqlite.ts
│ │ │ │ │ ├── aggregation-query.sqlite.ts
│ │ │ │ │ ├── multiple-value
│ │ │ │ │ └── multiple-value-aggregation.adapter.ts
│ │ │ │ │ └── single-value
│ │ │ │ │ └── single-value-aggregation.adapter.ts
│ │ │ ├── base-query
│ │ │ │ ├── abstract.ts
│ │ │ │ ├── base-query.postgres.ts
│ │ │ │ └── base-query.sqlite.ts
│ │ │ ├── db.provider.interface.ts
│ │ │ ├── db.provider.ts
│ │ │ ├── duplicate-table
│ │ │ │ ├── abstract.ts
│ │ │ │ ├── duplicate-attachment-table-query.abstract.ts
│ │ │ │ ├── duplicate-attachment-table-query.postgres.ts
│ │ │ │ ├── duplicate-attachment-table-query.sqlite.ts
│ │ │ │ ├── duplicate-query.postgres.ts
│ │ │ │ └── duplicate-query.sqlite.ts
│ │ │ ├── filter-query
│ │ │ │ ├── cell-value-filter.abstract.ts
│ │ │ │ ├── cell-value-filter.interface.ts
│ │ │ │ ├── filter-query.abstract.ts
│ │ │ │ ├── filter-query.interface.ts
│ │ │ │ ├── postgres
│ │ │ │ │ ├── cell-value-filter
│ │ │ │ │ │ ├── cell-value-filter.postgres.ts
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── multiple-value
│ │ │ │ │ │ │ ├── multiple-boolean-cell-value-filter.adapter.ts
│ │ │ │ │ │ │ ├── multiple-datetime-cell-value-filter.adapter.ts
│ │ │ │ │ │ │ ├── multiple-json-cell-value-filter.adapter.ts
│ │ │ │ │ │ │ ├── multiple-number-cell-value-filter.adapter.ts
│ │ │ │ │ │ │ └── multiple-string-cell-value-filter.adapter.ts
│ │ │ │ │ │ └── single-value
│ │ │ │ │ │ │ ├── boolean-cell-value-filter.adapter.ts
│ │ │ │ │ │ │ ├── datetime-cell-value-filter.adapter.ts
│ │ │ │ │ │ │ ├── json-cell-value-filter.adapter.ts
│ │ │ │ │ │ │ ├── number-cell-value-filter.adapter.ts
│ │ │ │ │ │ │ └── string-cell-value-filter.adapter.ts
│ │ │ │ │ └── filter-query.postgres.ts
│ │ │ │ └── sqlite
│ │ │ │ │ ├── cell-value-filter
│ │ │ │ │ ├── cell-value-filter.sqlite.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── multiple-value
│ │ │ │ │ │ ├── multiple-boolean-cell-value-filter.adapter.ts
│ │ │ │ │ │ ├── multiple-datetime-cell-value-filter.adapter.ts
│ │ │ │ │ │ ├── multiple-json-cell-value-filter.adapter.ts
│ │ │ │ │ │ ├── multiple-number-cell-value-filter.adapter.ts
│ │ │ │ │ │ └── multiple-string-cell-value-filter.adapter.ts
│ │ │ │ │ └── single-value
│ │ │ │ │ │ ├── boolean-cell-value-filter.adapter.ts
│ │ │ │ │ │ ├── datetime-cell-value-filter.adapter.ts
│ │ │ │ │ │ ├── json-cell-value-filter.adapter.ts
│ │ │ │ │ │ ├── number-cell-value-filter.adapter.ts
│ │ │ │ │ │ └── string-cell-value-filter.adapter.ts
│ │ │ │ │ └── filter-query.sqlite.ts
│ │ │ ├── group-query
│ │ │ │ ├── format-string.ts
│ │ │ │ ├── group-query.abstract.ts
│ │ │ │ ├── group-query.interface.ts
│ │ │ │ ├── group-query.postgres.ts
│ │ │ │ └── group-query.sqlite.ts
│ │ │ ├── index-query
│ │ │ │ └── index-abstract-builder.ts
│ │ │ ├── integrity-query
│ │ │ │ ├── abstract.ts
│ │ │ │ ├── integrity-query.postgres.ts
│ │ │ │ └── integrity-query.sqlite.ts
│ │ │ ├── postgres.provider.ts
│ │ │ ├── search-query
│ │ │ │ ├── abstract.ts
│ │ │ │ ├── get-offset.ts
│ │ │ │ ├── search-index-builder.postgres.ts
│ │ │ │ ├── search-index-builder.sqlite.ts
│ │ │ │ ├── search-query.postgres.ts
│ │ │ │ ├── search-query.sqlite.ts
│ │ │ │ └── types.ts
│ │ │ ├── sort-query
│ │ │ │ ├── function
│ │ │ │ │ ├── sort-function.abstract.ts
│ │ │ │ │ └── sort-function.interface.ts
│ │ │ │ ├── postgres
│ │ │ │ │ ├── multiple-value
│ │ │ │ │ │ ├── multiple-datetime-sort.adapter.ts
│ │ │ │ │ │ ├── multiple-json-sort.adapter.ts
│ │ │ │ │ │ └── multiple-number-sort.adapter.ts
│ │ │ │ │ ├── single-value
│ │ │ │ │ │ ├── date-sort.adapter.ts
│ │ │ │ │ │ ├── json-sort.adapter.ts
│ │ │ │ │ │ └── string-sort.adapter.ts
│ │ │ │ │ ├── sort-query.function.ts
│ │ │ │ │ └── sort-query.postgres.ts
│ │ │ │ ├── sort-query.abstract.ts
│ │ │ │ ├── sort-query.interface.ts
│ │ │ │ └── sqlite
│ │ │ │ │ ├── multiple-value
│ │ │ │ │ ├── multiple-datetime-sort.adapter.ts
│ │ │ │ │ ├── multiple-json-sort.adapter.ts
│ │ │ │ │ └── multiple-number-sort.adapter.ts
│ │ │ │ │ ├── single-value
│ │ │ │ │ ├── date-sort.adapter.ts
│ │ │ │ │ ├── json-sort.adapter.ts
│ │ │ │ │ └── string-sort.adapter.ts
│ │ │ │ │ ├── sort-query.function.ts
│ │ │ │ │ └── sort-query.sqlite.ts
│ │ │ └── sqlite.provider.ts
│ │ ├── event-emitter
│ │ │ ├── decorators
│ │ │ │ └── emit-controller-event.decorator.ts
│ │ │ ├── event-emitter.module.ts
│ │ │ ├── event-emitter.service.ts
│ │ │ ├── event-job
│ │ │ │ ├── event-job.module.ts
│ │ │ │ └── fallback
│ │ │ │ │ ├── event-emitter.ts
│ │ │ │ │ ├── fallback-queue.module.ts
│ │ │ │ │ ├── fallback-queue.service.ts
│ │ │ │ │ └── local-queue.provider.ts
│ │ │ ├── events
│ │ │ │ ├── base
│ │ │ │ │ └── base.event.ts
│ │ │ │ ├── core-event.ts
│ │ │ │ ├── event.enum.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── op-event.ts
│ │ │ │ ├── space
│ │ │ │ │ ├── collaborator.event.ts
│ │ │ │ │ └── space.event.ts
│ │ │ │ ├── table
│ │ │ │ │ ├── field.event.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── record.event.ts
│ │ │ │ │ ├── table.event.ts
│ │ │ │ │ └── view.event.ts
│ │ │ │ └── user
│ │ │ │ │ └── user.event.ts
│ │ │ ├── interceptor
│ │ │ │ └── event.Interceptor.ts
│ │ │ └── listeners
│ │ │ │ ├── action-trigger.listener.ts
│ │ │ │ ├── attachment.listener.ts
│ │ │ │ ├── base-permission-update.listener.ts
│ │ │ │ ├── collaborator-notification.listener.ts
│ │ │ │ ├── pin.listener.ts
│ │ │ │ ├── record-history.listener.ts
│ │ │ │ └── trash.listener.ts
│ │ ├── features
│ │ │ ├── access-token
│ │ │ │ ├── access-token.controller.spec.ts
│ │ │ │ ├── access-token.controller.ts
│ │ │ │ ├── access-token.encryptor.ts
│ │ │ │ ├── access-token.module.ts
│ │ │ │ ├── access-token.service.spec.ts
│ │ │ │ └── access-token.service.ts
│ │ │ ├── aggregation
│ │ │ │ ├── aggregation.module.ts
│ │ │ │ ├── aggregation.service.spec.ts
│ │ │ │ ├── aggregation.service.ts
│ │ │ │ └── open-api
│ │ │ │ │ ├── aggregation-open-api.controller.spec.ts
│ │ │ │ │ ├── aggregation-open-api.controller.ts
│ │ │ │ │ ├── aggregation-open-api.module.ts
│ │ │ │ │ ├── aggregation-open-api.service.spec.ts
│ │ │ │ │ └── aggregation-open-api.service.ts
│ │ │ ├── ai
│ │ │ │ ├── ai.controller.ts
│ │ │ │ ├── ai.module.ts
│ │ │ │ ├── ai.service.ts
│ │ │ │ └── constant.ts
│ │ │ ├── attachments
│ │ │ │ ├── attachments-crop.module.ts
│ │ │ │ ├── attachments-crop.processor.ts
│ │ │ │ ├── attachments-storage.module.ts
│ │ │ │ ├── attachments-storage.service.ts
│ │ │ │ ├── attachments-table.module.ts
│ │ │ │ ├── attachments-table.service.spec.ts
│ │ │ │ ├── attachments-table.service.ts
│ │ │ │ ├── attachments.controller.spec.ts
│ │ │ │ ├── attachments.controller.ts
│ │ │ │ ├── attachments.module.ts
│ │ │ │ ├── attachments.service.spec.ts
│ │ │ │ ├── attachments.service.ts
│ │ │ │ ├── constant.ts
│ │ │ │ ├── guard
│ │ │ │ │ └── auth.guard.ts
│ │ │ │ └── plugins
│ │ │ │ │ ├── adapter.ts
│ │ │ │ │ ├── local.spec.ts
│ │ │ │ │ ├── local.ts
│ │ │ │ │ ├── minio.ts
│ │ │ │ │ ├── s3.ts
│ │ │ │ │ ├── storage.module.ts
│ │ │ │ │ ├── storage.ts
│ │ │ │ │ ├── types.ts
│ │ │ │ │ └── utils.ts
│ │ │ ├── auth
│ │ │ │ ├── auth.controller.spec.ts
│ │ │ │ ├── auth.controller.ts
│ │ │ │ ├── auth.module.ts
│ │ │ │ ├── auth.service.spec.ts
│ │ │ │ ├── auth.service.ts
│ │ │ │ ├── decorators
│ │ │ │ │ ├── disabled-permission.decorator.ts
│ │ │ │ │ ├── ensure-login.decorator.ts
│ │ │ │ │ ├── permissions.decorator.ts
│ │ │ │ │ ├── public.decorator.ts
│ │ │ │ │ ├── resource_meta.decorator.ts
│ │ │ │ │ └── token.decorator.ts
│ │ │ │ ├── guard
│ │ │ │ │ ├── auth.guard.ts
│ │ │ │ │ ├── github.guard.ts
│ │ │ │ │ ├── google.guard.ts
│ │ │ │ │ ├── local-auth.guard.ts
│ │ │ │ │ ├── oidc.guard.ts
│ │ │ │ │ ├── permission.guard.ts
│ │ │ │ │ └── social.guard.ts
│ │ │ │ ├── local-auth
│ │ │ │ │ ├── local-auth.controller.ts
│ │ │ │ │ ├── local-auth.module.ts
│ │ │ │ │ └── local-auth.service.ts
│ │ │ │ ├── oauth
│ │ │ │ │ └── oauth.store.ts
│ │ │ │ ├── permission.module.ts
│ │ │ │ ├── permission.service.spec.ts
│ │ │ │ ├── permission.service.ts
│ │ │ │ ├── session
│ │ │ │ │ ├── session-handle.module.ts
│ │ │ │ │ ├── session-handle.service.ts
│ │ │ │ │ ├── session-store.service.spec.ts
│ │ │ │ │ ├── session-store.service.ts
│ │ │ │ │ ├── session.module.ts
│ │ │ │ │ ├── session.serializer.ts
│ │ │ │ │ └── session.service.ts
│ │ │ │ ├── social
│ │ │ │ │ ├── controller.adapter.ts
│ │ │ │ │ ├── github
│ │ │ │ │ │ ├── github.controller.ts
│ │ │ │ │ │ └── github.module.ts
│ │ │ │ │ ├── google
│ │ │ │ │ │ ├── google.controller.ts
│ │ │ │ │ │ └── google.module.ts
│ │ │ │ │ ├── oidc
│ │ │ │ │ │ ├── oidc.controller.ts
│ │ │ │ │ │ └── oidc.module.ts
│ │ │ │ │ └── social.module.ts
│ │ │ │ ├── strategies
│ │ │ │ │ ├── access-token.passport.ts
│ │ │ │ │ ├── access-token.strategy.ts
│ │ │ │ │ ├── constant.ts
│ │ │ │ │ ├── github.strategy.ts
│ │ │ │ │ ├── google.strategy.ts
│ │ │ │ │ ├── jwt.strategy.ts
│ │ │ │ │ ├── local.strategy.spec.ts
│ │ │ │ │ ├── local.strategy.ts
│ │ │ │ │ ├── oidc.strategy.ts
│ │ │ │ │ ├── session.passport.ts
│ │ │ │ │ ├── session.strategy.ts
│ │ │ │ │ └── types.ts
│ │ │ │ └── utils.ts
│ │ │ ├── base-sql-executor
│ │ │ │ ├── base-sql-executor.module.ts
│ │ │ │ ├── base-sql-executor.service.ts
│ │ │ │ ├── const.ts
│ │ │ │ ├── utils.spec.ts
│ │ │ │ └── utils.ts
│ │ │ ├── base
│ │ │ │ ├── BatchProcessor.class.ts
│ │ │ │ ├── base-duplicate.service.spec.ts
│ │ │ │ ├── base-duplicate.service.ts
│ │ │ │ ├── base-export.service.ts
│ │ │ │ ├── base-import-processor
│ │ │ │ │ ├── base-import-attachments-csv.module.ts
│ │ │ │ │ ├── base-import-attachments-csv.processor.ts
│ │ │ │ │ ├── base-import-attachments.module.ts
│ │ │ │ │ ├── base-import-attachments.processor.ts
│ │ │ │ │ ├── base-import-csv.module.ts
│ │ │ │ │ ├── base-import-csv.processor.ts
│ │ │ │ │ ├── base-import-junction-csv.module.ts
│ │ │ │ │ └── base-import-junction.processor.ts
│ │ │ │ ├── base-import.service.ts
│ │ │ │ ├── base-query
│ │ │ │ │ ├── base-query.service.ts
│ │ │ │ │ └── parse
│ │ │ │ │ │ ├── aggregation.ts
│ │ │ │ │ │ ├── filter.ts
│ │ │ │ │ │ ├── group.ts
│ │ │ │ │ │ ├── order.ts
│ │ │ │ │ │ ├── select.ts
│ │ │ │ │ │ └── utils.ts
│ │ │ │ ├── base.controller.ts
│ │ │ │ ├── base.module.ts
│ │ │ │ ├── base.service.spec.ts
│ │ │ │ ├── base.service.ts
│ │ │ │ ├── constant.ts
│ │ │ │ ├── db-connection.service.spec.ts
│ │ │ │ ├── db-connection.service.ts
│ │ │ │ ├── utils.spec.ts
│ │ │ │ └── utils.ts
│ │ │ ├── calculation
│ │ │ │ ├── README.md
│ │ │ │ ├── batch.service.spec.ts
│ │ │ │ ├── batch.service.ts
│ │ │ │ ├── calculation.module.ts
│ │ │ │ ├── field-calculation.service.spec.ts
│ │ │ │ ├── field-calculation.service.ts
│ │ │ │ ├── link.service.spec.ts
│ │ │ │ ├── link.service.ts
│ │ │ │ ├── reference.service.spec.ts
│ │ │ │ ├── reference.service.ts
│ │ │ │ ├── system-field.service.ts
│ │ │ │ └── utils
│ │ │ │ │ ├── changes.spec.ts
│ │ │ │ │ ├── changes.ts
│ │ │ │ │ ├── compose-maps.spec.ts
│ │ │ │ │ ├── compose-maps.ts
│ │ │ │ │ ├── detect-link.spec.ts
│ │ │ │ │ ├── detect-link.ts
│ │ │ │ │ ├── dfs.spec.ts
│ │ │ │ │ ├── dfs.ts
│ │ │ │ │ └── name-console.ts
│ │ │ ├── chat
│ │ │ │ ├── chart-completion.ro.ts
│ │ │ │ ├── chat.controller.spec.ts
│ │ │ │ ├── chat.controller.ts
│ │ │ │ ├── chat.module.ts
│ │ │ │ ├── chat.service.spec.ts
│ │ │ │ └── chat.service.ts
│ │ │ ├── collaborator
│ │ │ │ ├── collaborator.controller.spec.ts
│ │ │ │ ├── collaborator.controller.ts
│ │ │ │ ├── collaborator.module.ts
│ │ │ │ ├── collaborator.service.spec.ts
│ │ │ │ └── collaborator.service.ts
│ │ │ ├── comment
│ │ │ │ ├── comment-open-api.controller.spec.ts
│ │ │ │ ├── comment-open-api.controller.ts
│ │ │ │ ├── comment-open-api.module.ts
│ │ │ │ └── comment-open-api.service.ts
│ │ │ ├── dashboard
│ │ │ │ ├── dashboard.controller.spec.ts
│ │ │ │ ├── dashboard.controller.ts
│ │ │ │ ├── dashboard.module.ts
│ │ │ │ ├── dashboard.service.spec.ts
│ │ │ │ └── dashboard.service.ts
│ │ │ ├── export
│ │ │ │ └── open-api
│ │ │ │ │ ├── export-open-api.controller.ts
│ │ │ │ │ ├── export-open-api.module.ts
│ │ │ │ │ └── export-open-api.service.ts
│ │ │ ├── field
│ │ │ │ ├── constant.ts
│ │ │ │ ├── field-calculate
│ │ │ │ │ ├── field-calculate.module.ts
│ │ │ │ │ ├── field-converting-link.service.spec.ts
│ │ │ │ │ ├── field-converting-link.service.ts
│ │ │ │ │ ├── field-converting.service.spec.ts
│ │ │ │ │ ├── field-converting.service.ts
│ │ │ │ │ ├── field-creating.service.spec.ts
│ │ │ │ │ ├── field-creating.service.ts
│ │ │ │ │ ├── field-deleting.service.spec.ts
│ │ │ │ │ ├── field-deleting.service.ts
│ │ │ │ │ ├── field-supplement.service.ts
│ │ │ │ │ └── field-view-sync.service.ts
│ │ │ │ ├── field-duplicate
│ │ │ │ │ ├── field-duplicate.module.ts
│ │ │ │ │ └── field-duplicate.service.ts
│ │ │ │ ├── field.module.ts
│ │ │ │ ├── field.service.spec.ts
│ │ │ │ ├── field.service.ts
│ │ │ │ ├── model
│ │ │ │ │ ├── factory.ts
│ │ │ │ │ ├── field-base.ts
│ │ │ │ │ └── field-dto
│ │ │ │ │ │ ├── attachment-field.dto.ts
│ │ │ │ │ │ ├── auto-number-field.dto.ts
│ │ │ │ │ │ ├── checkbox-field.dto.ts
│ │ │ │ │ │ ├── created-by-field.dto.ts
│ │ │ │ │ │ ├── created-time-field.dto.ts
│ │ │ │ │ │ ├── date-field.dto.ts
│ │ │ │ │ │ ├── formula-field.dto.ts
│ │ │ │ │ │ ├── last-modified-by-field.dto.ts
│ │ │ │ │ │ ├── last-modified-time-field.dto.ts
│ │ │ │ │ │ ├── link-field.dto.ts
│ │ │ │ │ │ ├── long-text-field.dto.ts
│ │ │ │ │ │ ├── multiple-select-field.dto.ts
│ │ │ │ │ │ ├── number-field.dto.ts
│ │ │ │ │ │ ├── rating-field.dto.ts
│ │ │ │ │ │ ├── rollup-field.dto.ts
│ │ │ │ │ │ ├── single-line-text-field.dto.ts
│ │ │ │ │ │ ├── single-select-field.dto.ts
│ │ │ │ │ │ └── user-field.dto.ts
│ │ │ │ ├── open-api
│ │ │ │ │ ├── field-open-api.controller.ts
│ │ │ │ │ ├── field-open-api.module.ts
│ │ │ │ │ ├── field-open-api.service.spec.ts
│ │ │ │ │ └── field-open-api.service.ts
│ │ │ │ └── util.ts
│ │ │ ├── graph
│ │ │ │ ├── graph.module.ts
│ │ │ │ ├── graph.service.spec.ts
│ │ │ │ └── graph.service.ts
│ │ │ ├── health
│ │ │ │ ├── health.controller.spec.ts
│ │ │ │ ├── health.controller.ts
│ │ │ │ └── health.module.ts
│ │ │ ├── import
│ │ │ │ └── open-api
│ │ │ │ │ ├── NOTICE.md
│ │ │ │ │ ├── delimiter-stream.ts
│ │ │ │ │ ├── import-open-api.controller.ts
│ │ │ │ │ ├── import-open-api.module.ts
│ │ │ │ │ ├── import-open-api.service.ts
│ │ │ │ │ └── import.class.ts
│ │ │ ├── integrity
│ │ │ │ ├── foreign-key.service.ts
│ │ │ │ ├── integrity.controller.ts
│ │ │ │ ├── integrity.module.ts
│ │ │ │ ├── link-field.service.ts
│ │ │ │ └── link-integrity.service.ts
│ │ │ ├── invitation
│ │ │ │ ├── invitation.controller.spec.ts
│ │ │ │ ├── invitation.controller.ts
│ │ │ │ ├── invitation.module.ts
│ │ │ │ ├── invitation.service.spec.ts
│ │ │ │ └── invitation.service.ts
│ │ │ ├── mail-sender
│ │ │ │ ├── mail-helpers.ts
│ │ │ │ ├── mail-sender.module.ts
│ │ │ │ ├── mail-sender.service.ts
│ │ │ │ └── templates
│ │ │ │ │ ├── pages
│ │ │ │ │ └── normal.hbs
│ │ │ │ │ └── partials
│ │ │ │ │ ├── collaborator-cell-tag.hbs
│ │ │ │ │ ├── collaborator-multi-row-tag.hbs
│ │ │ │ │ ├── common-body.hbs
│ │ │ │ │ ├── email-verify-code.hbs
│ │ │ │ │ ├── footer.hbs
│ │ │ │ │ ├── header.hbs
│ │ │ │ │ ├── html-body.hbs
│ │ │ │ │ ├── invite.hbs
│ │ │ │ │ └── reset-password.hbs
│ │ │ ├── next
│ │ │ │ ├── next.controller.ts
│ │ │ │ ├── next.module.ts
│ │ │ │ ├── next.service.ts
│ │ │ │ └── plugin
│ │ │ │ │ ├── plugin-proxy.middleware.ts
│ │ │ │ │ ├── plugin-proxy.module.ts
│ │ │ │ │ └── plugin.module.ts
│ │ │ ├── notification
│ │ │ │ ├── notification.controller.ts
│ │ │ │ ├── notification.module.ts
│ │ │ │ └── notification.service.ts
│ │ │ ├── oauth
│ │ │ │ ├── guard
│ │ │ │ │ └── oauth2-client.guard.ts
│ │ │ │ ├── oauth-server.controller.ts
│ │ │ │ ├── oauth-server.service.spec.ts
│ │ │ │ ├── oauth-server.service.ts
│ │ │ │ ├── oauth-tx-store.ts
│ │ │ │ ├── oauth.controller.spec.ts
│ │ │ │ ├── oauth.controller.ts
│ │ │ │ ├── oauth.module.ts
│ │ │ │ ├── oauth.service.spec.ts
│ │ │ │ ├── oauth.service.ts
│ │ │ │ ├── strategies
│ │ │ │ │ └── oauth2-client.strategies.ts
│ │ │ │ └── types.ts
│ │ │ ├── organization
│ │ │ │ ├── organization.controller.ts
│ │ │ │ └── organization.module.ts
│ │ │ ├── pin
│ │ │ │ ├── pin.controller.ts
│ │ │ │ ├── pin.module.ts
│ │ │ │ └── pin.service.ts
│ │ │ ├── plugin-context-menu
│ │ │ │ ├── plugin-context-menu.controller.ts
│ │ │ │ ├── plugin-context-menu.module.ts
│ │ │ │ └── plugin-context-menu.service.ts
│ │ │ ├── plugin-panel
│ │ │ │ ├── plugin-panel.controller.ts
│ │ │ │ ├── plugin-panel.module.ts
│ │ │ │ └── plugin-panel.service.ts
│ │ │ ├── plugin
│ │ │ │ ├── official
│ │ │ │ │ ├── config
│ │ │ │ │ │ ├── chart.ts
│ │ │ │ │ │ ├── sheet-form-view.ts
│ │ │ │ │ │ └── types.ts
│ │ │ │ │ └── official-plugin-init.service.ts
│ │ │ │ ├── plugin-auth.service.ts
│ │ │ │ ├── plugin.controller.spec.ts
│ │ │ │ ├── plugin.controller.ts
│ │ │ │ ├── plugin.module.ts
│ │ │ │ ├── plugin.service.spec.ts
│ │ │ │ ├── plugin.service.ts
│ │ │ │ └── utils.ts
│ │ │ ├── record
│ │ │ │ ├── constant.ts
│ │ │ │ ├── open-api
│ │ │ │ │ ├── field-key.pipe.ts
│ │ │ │ │ ├── record-open-api.controller.ts
│ │ │ │ │ ├── record-open-api.module.ts
│ │ │ │ │ ├── record-open-api.service.spec.ts
│ │ │ │ │ ├── record-open-api.service.ts
│ │ │ │ │ ├── record-undo-redo-service.ts
│ │ │ │ │ └── tql.pipe.ts
│ │ │ │ ├── record-calculate
│ │ │ │ │ ├── record-calculate.module.ts
│ │ │ │ │ └── record-calculate.service.ts
│ │ │ │ ├── record-permission.service.ts
│ │ │ │ ├── record.module.ts
│ │ │ │ ├── record.service.spec.ts
│ │ │ │ ├── record.service.ts
│ │ │ │ ├── type.ts
│ │ │ │ ├── typecast.validate.spec.ts
│ │ │ │ ├── typecast.validate.ts
│ │ │ │ └── user-name.listener.service.ts
│ │ │ ├── selection
│ │ │ │ ├── selection.controller.spec.ts
│ │ │ │ ├── selection.controller.ts
│ │ │ │ ├── selection.module.ts
│ │ │ │ ├── selection.service.spec.ts
│ │ │ │ └── selection.service.ts
│ │ │ ├── setting
│ │ │ │ ├── admin.controller.ts
│ │ │ │ ├── admin.service.ts
│ │ │ │ ├── setting.controller.ts
│ │ │ │ ├── setting.module.ts
│ │ │ │ └── setting.service.ts
│ │ │ ├── share
│ │ │ │ ├── guard
│ │ │ │ │ ├── auth.guard.ts
│ │ │ │ │ ├── constant.ts
│ │ │ │ │ ├── share-auth-local.guard.ts
│ │ │ │ │ └── submit.decorator.ts
│ │ │ │ ├── share-auth.module.ts
│ │ │ │ ├── share-auth.service.ts
│ │ │ │ ├── share-socket.service.ts
│ │ │ │ ├── share.controller.spec.ts
│ │ │ │ ├── share.controller.ts
│ │ │ │ ├── share.module.ts
│ │ │ │ ├── share.service.spec.ts
│ │ │ │ ├── share.service.ts
│ │ │ │ └── strategies
│ │ │ │ │ └── jwt.strategy.ts
│ │ │ ├── space
│ │ │ │ ├── space.controller.spec.ts
│ │ │ │ ├── space.controller.ts
│ │ │ │ ├── space.module.ts
│ │ │ │ ├── space.service.spec.ts
│ │ │ │ ├── space.service.ts
│ │ │ │ └── template-space-init
│ │ │ │ │ └── template-space.init.service.ts
│ │ │ ├── table
│ │ │ │ ├── constant.ts
│ │ │ │ ├── open-api
│ │ │ │ │ ├── table-open-api.controller.ts
│ │ │ │ │ ├── table-open-api.module.ts
│ │ │ │ │ ├── table-open-api.service.spec.ts
│ │ │ │ │ ├── table-open-api.service.ts
│ │ │ │ │ └── table.pipe.ts
│ │ │ │ ├── table-duplicate.service.ts
│ │ │ │ ├── table-index.service.ts
│ │ │ │ ├── table-permission.service.ts
│ │ │ │ ├── table.module.ts
│ │ │ │ ├── table.service.spec.ts
│ │ │ │ └── table.service.ts
│ │ │ ├── template
│ │ │ │ ├── template-open-api.controller.spec.ts
│ │ │ │ ├── template-open-api.controller.ts
│ │ │ │ ├── template-open-api.module.ts
│ │ │ │ └── template-open-api.service.ts
│ │ │ ├── trash
│ │ │ │ ├── listener
│ │ │ │ │ └── table-trash.listener.ts
│ │ │ │ ├── trash.controller.ts
│ │ │ │ ├── trash.module.ts
│ │ │ │ └── trash.service.ts
│ │ │ ├── undo-redo
│ │ │ │ ├── open-api
│ │ │ │ │ ├── undo-redo.controller.ts
│ │ │ │ │ ├── undo-redo.module.ts
│ │ │ │ │ └── undo-redo.service.ts
│ │ │ │ ├── operations
│ │ │ │ │ ├── convert-field.operation.ts
│ │ │ │ │ ├── create-fields.operation.ts
│ │ │ │ │ ├── create-records.operation.ts
│ │ │ │ │ ├── create-view.operation.ts
│ │ │ │ │ ├── delete-fields.operation.ts
│ │ │ │ │ ├── delete-records.operation.ts
│ │ │ │ │ ├── delete-view.operation.ts
│ │ │ │ │ ├── paste-selection.operation.ts
│ │ │ │ │ ├── update-records-order.operation.ts
│ │ │ │ │ ├── update-records.operation.ts
│ │ │ │ │ └── update-view.operation.ts
│ │ │ │ └── stack
│ │ │ │ │ ├── undo-redo-operation.service.ts
│ │ │ │ │ ├── undo-redo-stack.module.ts
│ │ │ │ │ └── undo-redo-stack.service.ts
│ │ │ ├── user
│ │ │ │ ├── last-visit
│ │ │ │ │ ├── last-visit.controller.ts
│ │ │ │ │ ├── last-visit.module.ts
│ │ │ │ │ └── last-visit.service.ts
│ │ │ │ ├── user-init.service.ts
│ │ │ │ ├── user.controller.spec.ts
│ │ │ │ ├── user.controller.ts
│ │ │ │ ├── user.module.ts
│ │ │ │ ├── user.service.spec.ts
│ │ │ │ └── user.service.ts
│ │ │ └── view
│ │ │ │ ├── constant.ts
│ │ │ │ ├── model
│ │ │ │ ├── calendar-view.dto.ts
│ │ │ │ ├── factory.ts
│ │ │ │ ├── form-view.dto.ts
│ │ │ │ ├── gallery-view.dto.ts
│ │ │ │ ├── grid-view.dto.ts
│ │ │ │ ├── kanban-view.dto.ts
│ │ │ │ └── plugin-view.dto.ts
│ │ │ │ ├── open-api
│ │ │ │ ├── view-open-api.controller.ts
│ │ │ │ ├── view-open-api.module.ts
│ │ │ │ ├── view-open-api.service.spec.ts
│ │ │ │ └── view-open-api.service.ts
│ │ │ │ ├── view.module.ts
│ │ │ │ ├── view.service.spec.ts
│ │ │ │ └── view.service.ts
│ │ ├── filter
│ │ │ └── global-exception.filter.ts
│ │ ├── global
│ │ │ ├── global.module.ts
│ │ │ ├── init-bootstrap.provider.ts
│ │ │ ├── init-bootstrap.service.ts
│ │ │ └── knex
│ │ │ │ ├── index.ts
│ │ │ │ ├── knex.extend.ts
│ │ │ │ └── knex.module.ts
│ │ ├── index.ts
│ │ ├── logger
│ │ │ └── logger.module.ts
│ │ ├── middleware
│ │ │ └── request-info.middleware.ts
│ │ ├── share-db
│ │ │ ├── auth.middleware.ts
│ │ │ ├── interface.ts
│ │ │ ├── readonly
│ │ │ │ ├── field-readonly.service.ts
│ │ │ │ ├── readonly.module.ts
│ │ │ │ ├── readonly.service.ts
│ │ │ │ ├── record-readonly.service.ts
│ │ │ │ ├── table-readonly.service.ts
│ │ │ │ └── view-readonly.service.ts
│ │ │ ├── repair-attachment-op
│ │ │ │ ├── repair-attachment-op.module.ts
│ │ │ │ └── repair-attachment-op.service.ts
│ │ │ ├── share-db.adapter.ts
│ │ │ ├── share-db.module.ts
│ │ │ ├── share-db.service.ts
│ │ │ ├── share-db.spec.ts
│ │ │ ├── sharedb-redis.pubsub.ts
│ │ │ └── utils.ts
│ │ ├── tracing.ts
│ │ ├── tracing
│ │ │ └── decorators
│ │ │ │ └── span.ts
│ │ ├── types
│ │ │ ├── cls.ts
│ │ │ └── session.ts
│ │ ├── utils
│ │ │ ├── code-generate.ts
│ │ │ ├── db-helpers.ts
│ │ │ ├── db-validation-error.ts
│ │ │ ├── encryptor.ts
│ │ │ ├── exception-parse.ts
│ │ │ ├── extract-field-reference.ts
│ │ │ ├── file-utils.spec.ts
│ │ │ ├── file-utils.ts
│ │ │ ├── filter.ts
│ │ │ ├── generate-thumbnail-path.ts
│ │ │ ├── get-max-level-role.ts
│ │ │ ├── index.ts
│ │ │ ├── is-not-hidden-field.ts
│ │ │ ├── is-user-or-link.ts
│ │ │ ├── major-field-keys-changed.spec.ts
│ │ │ ├── major-field-keys-changed.ts
│ │ │ ├── metadata.ts
│ │ │ ├── name-conversion.ts
│ │ │ ├── second.ts
│ │ │ ├── string-hash.ts
│ │ │ ├── timing.ts
│ │ │ ├── update-order.spec.ts
│ │ │ ├── update-order.ts
│ │ │ └── value-convert.ts
│ │ ├── worker
│ │ │ └── parse.ts
│ │ ├── ws
│ │ │ ├── wjs.d.ts
│ │ │ ├── ws.gateway.dev.ts
│ │ │ ├── ws.gateway.spec.ts
│ │ │ ├── ws.gateway.ts
│ │ │ ├── ws.module.ts
│ │ │ ├── ws.service.spec.ts
│ │ │ └── ws.service.ts
│ │ └── zod.validation.pipe.ts
│ ├── static
│ │ ├── plugin
│ │ │ ├── chart-logo.png
│ │ │ ├── chart.png
│ │ │ └── sheet-form-logo.png
│ │ └── system
│ │ │ ├── anonymous.png
│ │ │ └── automation-robot.png
│ ├── test
│ │ ├── access-token.e2e-spec.ts
│ │ ├── aggregation-search.e2e-spec.ts
│ │ ├── aggregation.e2e-spec.ts
│ │ ├── attachment.e2e-spec.ts
│ │ ├── auth.e2e-spec.ts
│ │ ├── base-duplicate.e2e-spec.ts
│ │ ├── base-query.e2e-spec.ts
│ │ ├── base.e2e-spec.ts
│ │ ├── comment.e2e-spec.ts
│ │ ├── computed-user-field.e2e-spec.ts
│ │ ├── credit.e2e-spec.ts
│ │ ├── dashboard.e2e-spec.ts
│ │ ├── data-helpers
│ │ │ ├── 20x-link.ts
│ │ │ ├── 20x.ts
│ │ │ └── caces
│ │ │ │ ├── aggregation-query
│ │ │ │ ├── checkbox-field.ts
│ │ │ │ ├── date-field.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── multiple-select-field.ts
│ │ │ │ ├── number-field.ts
│ │ │ │ ├── single-select-field.ts
│ │ │ │ ├── text-field.ts
│ │ │ │ └── user-field.ts
│ │ │ │ ├── record-filter-query
│ │ │ │ ├── checkbox-field.ts
│ │ │ │ ├── date-field
│ │ │ │ │ ├── date-field.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── is-after-sets.ts
│ │ │ │ │ ├── is-before-sets.ts
│ │ │ │ │ ├── is-not-sets.ts
│ │ │ │ │ ├── is-on-or-after-sets.ts
│ │ │ │ │ ├── is-on-or-before-sets.ts
│ │ │ │ │ ├── is-sets.ts
│ │ │ │ │ ├── is-with-in-sets.ts
│ │ │ │ │ └── utils.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── multiple-select-field.ts
│ │ │ │ ├── number-field.ts
│ │ │ │ ├── single-select-field.ts
│ │ │ │ ├── text-field.ts
│ │ │ │ └── user-field.ts
│ │ │ │ └── view-default-share-meta.ts
│ │ ├── db-connection.e2e-spec.ts
│ │ ├── field-calculation.e2e-spec.ts
│ │ ├── field-converting.e2e-spec.ts
│ │ ├── field-duplicate.e2e-spec.ts
│ │ ├── field-reference.e2e-spec.ts
│ │ ├── field-view-sync.e2e-spec.ts
│ │ ├── field.e2e-spec.ts
│ │ ├── filter.e2e-spec.ts
│ │ ├── formula.e2e-spec.ts
│ │ ├── graph.e2e-spec.ts
│ │ ├── group.e2e-spec.ts
│ │ ├── import-base.e2e-spec.ts
│ │ ├── integrity.e2e-spec.ts
│ │ ├── invitation.e2e-spec.ts
│ │ ├── link-api.e2e-spec.ts
│ │ ├── lookup.e2e-spec.ts
│ │ ├── oauth-server.e2e-spec.ts
│ │ ├── oauth.e2e-spec.ts
│ │ ├── order-update.e2e-spec.ts
│ │ ├── performance.e2e-spec.ts
│ │ ├── pin.e2e-spec.ts
│ │ ├── plugin-context-menu.e2e-spec.ts
│ │ ├── plugin-panel.e2e-spec.ts
│ │ ├── plugin.e2e-spec.ts
│ │ ├── record-field-key.e2e-spec.ts
│ │ ├── record-filter-query.e2e-spec.ts
│ │ ├── record-history.e2e-spec.ts
│ │ ├── record-link-select-query.e2e-spec.ts
│ │ ├── record-search-query.e2e-spec.ts
│ │ ├── record-typecast.e2e-spec.ts
│ │ ├── record.e2e-spec.ts
│ │ ├── reference.e2e-spec.ts.bak
│ │ ├── rollup.e2e-spec.ts
│ │ ├── scheduled-computing.e2e-spec.ts
│ │ ├── selection.e2e-spec.ts
│ │ ├── set-column-meta.e2e-spec.ts
│ │ ├── share-socket.e2e-spec.ts
│ │ ├── share.e2e-spec.ts
│ │ ├── sort.e2e-spec.ts
│ │ ├── space.e2e-spec.ts
│ │ ├── table-duplicate.e2e-spec.ts
│ │ ├── table-export.e2e-spec.ts
│ │ ├── table-import.e2e-spec.ts
│ │ ├── table-trash.e2e-spec.ts
│ │ ├── table.e2e-spec.ts
│ │ ├── template.e2e-spec.ts
│ │ ├── trash.e2e-spec.ts
│ │ ├── undo-redo.e2e-spec.ts
│ │ ├── user-last-visit.e2e-spec.ts
│ │ ├── utils
│ │ │ ├── axios-instance
│ │ │ │ ├── anonymous-user.ts
│ │ │ │ └── new-user.ts
│ │ │ ├── data.generator.ts
│ │ │ ├── event-promise.ts
│ │ │ ├── field-mock.ts
│ │ │ ├── get-error.ts
│ │ │ ├── init-app.ts
│ │ │ ├── record-mock.ts
│ │ │ ├── seed.ts
│ │ │ └── testing-logger.ts
│ │ ├── view-option.e2e-spec.ts
│ │ └── view.e2e-spec.ts
│ ├── tsconfig.build.json
│ ├── tsconfig.eslint.json
│ ├── tsconfig.json
│ ├── vitest-e2e.config.ts
│ ├── vitest-e2e.setup.ts
│ ├── vitest.config.ts
│ ├── webpack.config.js
│ └── webpack.dev.js
└── nextjs-app
│ ├── .env
│ ├── .env.development
│ ├── .env.example
│ ├── .env.test
│ ├── .escheckrc
│ ├── .eslintrc.js
│ ├── .gitignore
│ ├── .idea
│ ├── modules.xml
│ └── nextjs-app.iml
│ ├── .size-limit.js
│ ├── README.md
│ ├── babel.config.backup.js
│ ├── components.json
│ ├── config
│ └── tests
│ │ ├── AppTestProviders.tsx
│ │ ├── I18nextTestStubProvider.tsx
│ │ ├── ReactSvgrMock.tsx
│ │ ├── setupVitest.ts
│ │ └── test-utils.tsx
│ ├── e2e
│ └── pages
│ │ ├── index
│ │ ├── index-chinese.spec.ts
│ │ └── index.spec.ts
│ │ └── system
│ │ └── 404.spec.ts
│ ├── lint-staged.config.js
│ ├── next-env.d.ts
│ ├── next-i18next.config.js
│ ├── next.config.js
│ ├── package.json
│ ├── playwright.config.ts
│ ├── postcss.config.js
│ ├── public
│ ├── favicon.ico
│ └── images
│ │ ├── example
│ │ ├── Boy1.png
│ │ ├── Boy3.png
│ │ ├── Girl1.png
│ │ ├── Girl2.png
│ │ └── Girl3.png
│ │ ├── favicon
│ │ ├── .readme
│ │ ├── android-144x144.png
│ │ ├── android-192x192.png
│ │ ├── android-36x36.png
│ │ ├── android-48x48.png
│ │ ├── android-72x72.png
│ │ ├── android-96x96.png
│ │ ├── android-chrome-192x192.png
│ │ ├── android-chrome-512x512.png
│ │ ├── android-chrome-maskable-192x192.png
│ │ ├── android-chrome-maskable-512x512.png
│ │ ├── apple-touch-icon.png
│ │ ├── browserconfig.xml
│ │ ├── favicon-16x16.png
│ │ ├── favicon-32x32.png
│ │ ├── favicon.ico
│ │ ├── favicon.svg
│ │ ├── msapplication-icon-144x144.png
│ │ ├── mstile-150x150.png
│ │ ├── safari-pinned-tab.svg
│ │ └── site.webmanifest
│ │ └── layout
│ │ └── footer-waves.svg
│ ├── sentry.client.config.ts
│ ├── sentry.server.config.ts
│ ├── src
│ ├── AppProviders.tsx
│ ├── backend
│ │ └── api
│ │ │ └── rest
│ │ │ ├── axios.ts
│ │ │ ├── get-user.ts
│ │ │ └── ssr-api.ts
│ ├── components
│ │ ├── Banner.tsx
│ │ ├── Guide.tsx
│ │ ├── Metrics.tsx
│ │ ├── RouterProgress.tsx
│ │ ├── Selector.tsx
│ │ ├── TeableLogo.tsx
│ │ ├── layout
│ │ │ ├── MainFooter.tsx
│ │ │ ├── MainLayout.tsx
│ │ │ ├── __tests__
│ │ │ │ └── MainLayout.test.tsx
│ │ │ └── index.ts
│ │ └── store
│ │ │ ├── guide.ts
│ │ │ └── index.ts
│ ├── features
│ │ ├── app
│ │ │ ├── automation
│ │ │ │ └── Pages.tsx
│ │ │ ├── blocks
│ │ │ │ ├── AuthorityMatrix.tsx
│ │ │ │ ├── Error.tsx
│ │ │ │ ├── admin
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── setting
│ │ │ │ │ │ ├── SettingPage.tsx
│ │ │ │ │ │ ├── components
│ │ │ │ │ │ │ ├── Branding.tsx
│ │ │ │ │ │ │ ├── BrandingLogo.tsx
│ │ │ │ │ │ │ ├── CopyInstance.tsx
│ │ │ │ │ │ │ ├── ai-config
│ │ │ │ │ │ │ │ ├── AIModelPreferencesCard.tsx
│ │ │ │ │ │ │ │ ├── AIProviderCard.tsx
│ │ │ │ │ │ │ │ ├── AiForm.tsx
│ │ │ │ │ │ │ │ ├── AiModelSelect.tsx
│ │ │ │ │ │ │ │ ├── LlmProviderForm.tsx
│ │ │ │ │ │ │ │ ├── LlmproviderManage.tsx
│ │ │ │ │ │ │ │ ├── constant.ts
│ │ │ │ │ │ │ │ └── utils.tsx
│ │ │ │ │ │ │ └── index.ts
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ └── template
│ │ │ │ │ │ ├── TemplatePage.tsx
│ │ │ │ │ │ ├── components
│ │ │ │ │ │ ├── BaseSelectPanel.tsx
│ │ │ │ │ │ ├── MarkdownEditor.tsx
│ │ │ │ │ │ ├── TemplateCategorySelect.tsx
│ │ │ │ │ │ ├── TemplateCover.tsx
│ │ │ │ │ │ ├── TemplateTable.tsx
│ │ │ │ │ │ ├── TemplateTooltips.tsx
│ │ │ │ │ │ ├── TextEditor.tsx
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── upload-panel
│ │ │ │ │ │ │ ├── Process.tsx
│ │ │ │ │ │ │ ├── TemplateCoverPreview.tsx
│ │ │ │ │ │ │ ├── Trigger.tsx
│ │ │ │ │ │ │ ├── UploadPanel.tsx
│ │ │ │ │ │ │ └── index.ts
│ │ │ │ │ │ └── index.ts
│ │ │ │ ├── base
│ │ │ │ │ ├── BasePermissionListener.tsx
│ │ │ │ │ ├── base-side-bar
│ │ │ │ │ │ ├── BaseSideBar.tsx
│ │ │ │ │ │ ├── BaseSidebarHeaderLeft.tsx
│ │ │ │ │ │ └── QuickAction.tsx
│ │ │ │ │ └── duplicate
│ │ │ │ │ │ ├── DuplicateBaseModal.tsx
│ │ │ │ │ │ ├── TemplateCreateBaseModal.tsx
│ │ │ │ │ │ ├── useDuplicateBaseStore.ts
│ │ │ │ │ │ ├── useTemplateCreateBaseStore.ts
│ │ │ │ │ │ └── useTemplateMonitor.ts
│ │ │ │ ├── billing
│ │ │ │ │ ├── SpaceSubscriptionModal.tsx
│ │ │ │ │ ├── useSpaceSubscriptionMonitor.ts
│ │ │ │ │ └── useSpaceSubscriptionStore.ts
│ │ │ │ ├── dashboard
│ │ │ │ │ └── Dashboard.tsx
│ │ │ │ ├── db-connection
│ │ │ │ │ └── Panel.tsx
│ │ │ │ ├── design
│ │ │ │ │ ├── BaseDetail.tsx
│ │ │ │ │ ├── Design.tsx
│ │ │ │ │ ├── TableDetail.tsx
│ │ │ │ │ ├── TableTabs.tsx
│ │ │ │ │ ├── components
│ │ │ │ │ │ ├── Actions.tsx
│ │ │ │ │ │ ├── FieldPropertyEditor.tsx
│ │ │ │ │ │ └── Integrity.tsx
│ │ │ │ │ └── data-table
│ │ │ │ │ │ ├── DataTable.tsx
│ │ │ │ │ │ ├── FieldGraph.tsx
│ │ │ │ │ │ └── useDataColumns.tsx
│ │ │ │ ├── graph
│ │ │ │ │ ├── DynamicFieldGraph.tsx
│ │ │ │ │ ├── FieldGraph.tsx
│ │ │ │ │ ├── ProgressBar.tsx
│ │ │ │ │ ├── useGraph.tsx
│ │ │ │ │ └── usePlan.ts
│ │ │ │ ├── import-table
│ │ │ │ │ ├── TableImport.tsx
│ │ │ │ │ ├── UrlPanel.tsx
│ │ │ │ │ ├── field-config-panel
│ │ │ │ │ │ ├── CollapsePanel.tsx
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── inplace-panel
│ │ │ │ │ │ │ ├── FieldSelector.tsx
│ │ │ │ │ │ │ ├── InplaceFieldConfigPanel.tsx
│ │ │ │ │ │ │ └── InplacePreviewColumn.tsx
│ │ │ │ │ │ └── new-create-panel
│ │ │ │ │ │ │ ├── FieldConfigPanel.tsx
│ │ │ │ │ │ │ └── PreviewColumn.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── upload-panel
│ │ │ │ │ │ ├── Process.tsx
│ │ │ │ │ │ ├── Trigger.tsx
│ │ │ │ │ │ ├── UploadPanel.tsx
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── utils.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── setting
│ │ │ │ │ ├── SettingRight.tsx
│ │ │ │ │ ├── SettingRightTitle.tsx
│ │ │ │ │ ├── access-token
│ │ │ │ │ │ ├── AccessTokenList.tsx
│ │ │ │ │ │ ├── PersonAccessTokenForm.tsx
│ │ │ │ │ │ ├── PersonAccessTokenPage.tsx
│ │ │ │ │ │ ├── PersonAccessTokenTitle.tsx
│ │ │ │ │ │ └── form
│ │ │ │ │ │ │ ├── AccessList.tsx
│ │ │ │ │ │ │ ├── AccessSelect.tsx
│ │ │ │ │ │ │ ├── AccessTokenForm.tsx
│ │ │ │ │ │ │ ├── AccessTokenFormEdit.tsx
│ │ │ │ │ │ │ ├── ExpirationSelect.tsx
│ │ │ │ │ │ │ └── RefreshToken.tsx
│ │ │ │ │ ├── components
│ │ │ │ │ │ ├── FormItem.tsx
│ │ │ │ │ │ ├── FormPageLayout.tsx
│ │ │ │ │ │ ├── RequireCom.tsx
│ │ │ │ │ │ └── ScopesSelect.tsx
│ │ │ │ │ ├── oauth-app
│ │ │ │ │ │ ├── OAuthAppDecisionPage.tsx
│ │ │ │ │ │ ├── OAuthAppPage.tsx
│ │ │ │ │ │ ├── constant.ts
│ │ │ │ │ │ └── manage
│ │ │ │ │ │ │ ├── CallbackEditor.tsx
│ │ │ │ │ │ │ ├── List.tsx
│ │ │ │ │ │ │ ├── OAuthAppEdit.tsx
│ │ │ │ │ │ │ ├── OAuthAppForm.tsx
│ │ │ │ │ │ │ └── OAuthAppNew.tsx
│ │ │ │ │ ├── plugin
│ │ │ │ │ │ ├── MarkDownEditor.tsx
│ │ │ │ │ │ ├── PluginEdit.tsx
│ │ │ │ │ │ ├── PluginList.tsx
│ │ │ │ │ │ ├── PluginNew.tsx
│ │ │ │ │ │ ├── PluginPage.tsx
│ │ │ │ │ │ ├── component
│ │ │ │ │ │ │ ├── JsonEditor.tsx
│ │ │ │ │ │ │ ├── LogoEditor.tsx
│ │ │ │ │ │ │ ├── NewSecret.tsx
│ │ │ │ │ │ │ ├── PositionSelector.tsx
│ │ │ │ │ │ │ ├── StatusBadge.tsx
│ │ │ │ │ │ │ └── StatusDot.tsx
│ │ │ │ │ │ └── hooks
│ │ │ │ │ │ │ └── useStatusStatic.ts
│ │ │ │ │ └── query-builder
│ │ │ │ │ │ ├── FilterBuilder.tsx
│ │ │ │ │ │ ├── PreviewScript.tsx
│ │ │ │ │ │ ├── PreviewTable.tsx
│ │ │ │ │ │ ├── QueryBuilder.tsx
│ │ │ │ │ │ ├── SearchBuilder.tsx
│ │ │ │ │ │ ├── SortBuilder.tsx
│ │ │ │ │ │ ├── ViewBuilder.tsx
│ │ │ │ │ │ └── useTransformFieldKey.ts
│ │ │ │ ├── share
│ │ │ │ │ └── view
│ │ │ │ │ │ ├── AuthPage.tsx
│ │ │ │ │ │ ├── EmbedFooter.tsx
│ │ │ │ │ │ ├── ShareTablePermissionProvider.tsx
│ │ │ │ │ │ ├── ShareView.tsx
│ │ │ │ │ │ ├── ShareViewPage.tsx
│ │ │ │ │ │ └── component
│ │ │ │ │ │ ├── calendar
│ │ │ │ │ │ ├── CalendarView.tsx
│ │ │ │ │ │ └── toolbar
│ │ │ │ │ │ │ ├── Toolbar.tsx
│ │ │ │ │ │ │ └── index.ts
│ │ │ │ │ │ ├── form
│ │ │ │ │ │ ├── FormView.tsx
│ │ │ │ │ │ └── FormViewBase.tsx
│ │ │ │ │ │ ├── gallery
│ │ │ │ │ │ ├── GalleryView.tsx
│ │ │ │ │ │ └── toolbar
│ │ │ │ │ │ │ ├── Toolbar.tsx
│ │ │ │ │ │ │ └── index.ts
│ │ │ │ │ │ ├── grid
│ │ │ │ │ │ ├── GridView.tsx
│ │ │ │ │ │ ├── GridViewBase.tsx
│ │ │ │ │ │ ├── aggregation
│ │ │ │ │ │ │ ├── AggregationProvider.tsx
│ │ │ │ │ │ │ ├── GroupPointProvider.tsx
│ │ │ │ │ │ │ └── index.ts
│ │ │ │ │ │ └── toolbar
│ │ │ │ │ │ │ ├── Sort.tsx
│ │ │ │ │ │ │ ├── Toolbar.tsx
│ │ │ │ │ │ │ └── index.ts
│ │ │ │ │ │ ├── kanban
│ │ │ │ │ │ ├── KanbanView.tsx
│ │ │ │ │ │ └── toolbar
│ │ │ │ │ │ │ ├── Toolbar.tsx
│ │ │ │ │ │ │ └── index.ts
│ │ │ │ │ │ ├── plugin
│ │ │ │ │ │ └── SharePluginView.tsx
│ │ │ │ │ │ └── share-view-filter
│ │ │ │ │ │ ├── FilterUser.tsx
│ │ │ │ │ │ ├── ShareViewFilter.tsx
│ │ │ │ │ │ ├── filter-link
│ │ │ │ │ │ ├── FilterLink.tsx
│ │ │ │ │ │ ├── FilterLinkSelectList.tsx
│ │ │ │ │ │ ├── FilterLinkSelectTrigger.tsx
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ │ └── index.ts
│ │ │ │ ├── space-setting
│ │ │ │ │ ├── collaborator
│ │ │ │ │ │ ├── CollaboratorPage.tsx
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── general
│ │ │ │ │ │ ├── GeneralPage.tsx
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── integration
│ │ │ │ │ │ ├── IntegrationPage.tsx
│ │ │ │ │ │ ├── components
│ │ │ │ │ │ ├── AiConfig.tsx
│ │ │ │ │ │ ├── IntegrationCard.tsx
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ │ └── index.ts
│ │ │ │ ├── space
│ │ │ │ │ ├── BaseCard.tsx
│ │ │ │ │ ├── ColorBg.tsx
│ │ │ │ │ ├── DraggableBaseGrid.tsx
│ │ │ │ │ ├── RecentlyBase.tsx
│ │ │ │ │ ├── SharedBasePage.tsx
│ │ │ │ │ ├── SpaceCard.tsx
│ │ │ │ │ ├── SpaceInnerPage.tsx
│ │ │ │ │ ├── SpacePage.tsx
│ │ │ │ │ ├── component
│ │ │ │ │ │ ├── BaseActionTrigger.tsx
│ │ │ │ │ │ ├── BaseListTrigger.tsx
│ │ │ │ │ │ ├── EditableSpaceSelect.tsx
│ │ │ │ │ │ ├── SpaceActionTrigger.tsx
│ │ │ │ │ │ └── upload-panel
│ │ │ │ │ │ │ ├── Process.tsx
│ │ │ │ │ │ │ ├── Trigger.tsx
│ │ │ │ │ │ │ ├── UploadPanel.tsx
│ │ │ │ │ │ │ ├── UploadPanelDialog.tsx
│ │ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── space-side-bar
│ │ │ │ │ │ ├── ItemButton.tsx
│ │ │ │ │ │ ├── PinItem.tsx
│ │ │ │ │ │ ├── PinList.tsx
│ │ │ │ │ │ ├── SpaceItem.tsx
│ │ │ │ │ │ ├── SpaceList.tsx
│ │ │ │ │ │ ├── SpaceOperation.tsx
│ │ │ │ │ │ ├── SpaceSideBar.tsx
│ │ │ │ │ │ └── StarButton.tsx
│ │ │ │ │ ├── useBaseList.tsx
│ │ │ │ │ ├── usePinMap.ts
│ │ │ │ │ └── useSpaceListOrdered.tsx
│ │ │ │ ├── table-list
│ │ │ │ │ ├── DraggableList.tsx
│ │ │ │ │ ├── NoDraggableList.tsx
│ │ │ │ │ ├── TableList.tsx
│ │ │ │ │ ├── TableListItem.tsx
│ │ │ │ │ ├── TableOperation.tsx
│ │ │ │ │ ├── useAddTable.ts
│ │ │ │ │ └── useTableHref.tsx
│ │ │ │ ├── table
│ │ │ │ │ ├── FailAlert.tsx
│ │ │ │ │ ├── Table.tsx
│ │ │ │ │ ├── hooks
│ │ │ │ │ │ ├── use-aggregations-query.ts
│ │ │ │ │ │ ├── use-import-status.ts
│ │ │ │ │ │ ├── use-row-count-query.ts
│ │ │ │ │ │ └── use-view-error-handler.tsx
│ │ │ │ │ ├── store
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── use-locked-view-tip-store.ts
│ │ │ │ │ └── table-header
│ │ │ │ │ │ ├── AddPluginView.tsx
│ │ │ │ │ │ ├── AddView.tsx
│ │ │ │ │ │ ├── Collaborators.tsx
│ │ │ │ │ │ ├── LockedViewTip.tsx
│ │ │ │ │ │ ├── TableHeader.tsx
│ │ │ │ │ │ └── TableInfo.tsx
│ │ │ │ ├── trash
│ │ │ │ │ ├── BaseTrashPage.tsx
│ │ │ │ │ ├── SpaceTrashPage.tsx
│ │ │ │ │ └── components
│ │ │ │ │ │ ├── TableTrash.tsx
│ │ │ │ │ │ └── TableTrashDialog.tsx
│ │ │ │ └── view
│ │ │ │ │ ├── View.tsx
│ │ │ │ │ ├── calendar
│ │ │ │ │ ├── CalendarView.tsx
│ │ │ │ │ ├── CalendarViewBase.tsx
│ │ │ │ │ ├── components
│ │ │ │ │ │ ├── AddDateFieldDialog.tsx
│ │ │ │ │ │ ├── AddEventButton.tsx
│ │ │ │ │ │ ├── Calendar.tsx
│ │ │ │ │ │ ├── CalendarConfig.tsx
│ │ │ │ │ │ ├── EventList.tsx
│ │ │ │ │ │ ├── EventListContainer.tsx
│ │ │ │ │ │ └── EventMenu.tsx
│ │ │ │ │ ├── context
│ │ │ │ │ │ ├── CalendarContext.ts
│ │ │ │ │ │ ├── CalendarProvider.tsx
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── hooks
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── useCalendar.ts
│ │ │ │ │ │ ├── useCalendarFields.ts
│ │ │ │ │ │ └── useEventMenuStore.ts
│ │ │ │ │ ├── type.ts
│ │ │ │ │ └── util.ts
│ │ │ │ │ ├── constant.ts
│ │ │ │ │ ├── field
│ │ │ │ │ ├── FieldSetting.tsx
│ │ │ │ │ └── useFieldSettingStore.ts
│ │ │ │ │ ├── form
│ │ │ │ │ ├── FormView.tsx
│ │ │ │ │ ├── FormViewBase.tsx
│ │ │ │ │ ├── components
│ │ │ │ │ │ ├── BrandFooter.tsx
│ │ │ │ │ │ ├── Drag.tsx
│ │ │ │ │ │ ├── FormCellEditor.tsx
│ │ │ │ │ │ ├── FormEditor.tsx
│ │ │ │ │ │ ├── FormEditorMain.tsx
│ │ │ │ │ │ ├── FormField.tsx
│ │ │ │ │ │ ├── FormFieldEditor.tsx
│ │ │ │ │ │ ├── FormPreviewer.tsx
│ │ │ │ │ │ ├── FormSidebar.tsx
│ │ │ │ │ │ ├── FromBody.tsx
│ │ │ │ │ │ ├── ShareUserEditor.tsx
│ │ │ │ │ │ ├── SortableItem.tsx
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── share-link-editor
│ │ │ │ │ │ │ ├── FormLinkEditor.tsx
│ │ │ │ │ │ │ └── LinkRecordList.tsx
│ │ │ │ │ ├── constant.ts
│ │ │ │ │ └── util.ts
│ │ │ │ │ ├── gallery
│ │ │ │ │ ├── GalleryView.tsx
│ │ │ │ │ ├── GalleryViewBase.tsx
│ │ │ │ │ ├── components
│ │ │ │ │ │ ├── Card.tsx
│ │ │ │ │ │ ├── CardCarousel.tsx
│ │ │ │ │ │ ├── SortableItem.tsx
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── context
│ │ │ │ │ │ ├── GalleryContext.ts
│ │ │ │ │ │ ├── GalleryProvider.tsx
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── hooks
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── useCacheRecords.ts
│ │ │ │ │ │ └── useGallery.ts
│ │ │ │ │ ├── type.ts
│ │ │ │ │ └── utils
│ │ │ │ │ │ ├── card.ts
│ │ │ │ │ │ ├── columns.ts
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── grid
│ │ │ │ │ ├── DomBox.tsx
│ │ │ │ │ ├── GridView.tsx
│ │ │ │ │ ├── GridViewBase.tsx
│ │ │ │ │ ├── GridViewBaseInner.tsx
│ │ │ │ │ ├── components
│ │ │ │ │ │ ├── AiGenerateButton.tsx
│ │ │ │ │ │ ├── ConfirmNewRecords.tsx
│ │ │ │ │ │ ├── FieldMenu.tsx
│ │ │ │ │ │ ├── GroupHeaderMenu.tsx
│ │ │ │ │ │ ├── PluginMenu.tsx
│ │ │ │ │ │ ├── PrefillingRowContainer.tsx
│ │ │ │ │ │ ├── PresortRowContainer.tsx
│ │ │ │ │ │ ├── RecordMenu.tsx
│ │ │ │ │ │ ├── StatisticMenu.tsx
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── const.ts
│ │ │ │ │ ├── hooks
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── useCollaborate.ts
│ │ │ │ │ │ ├── useIsSelectionLoaded.ts
│ │ │ │ │ │ ├── useSelectionOperation.ts
│ │ │ │ │ │ └── useSelectionStore.ts
│ │ │ │ │ ├── useGridSearchStore.ts
│ │ │ │ │ └── utils
│ │ │ │ │ │ ├── copyAndPaste.ts
│ │ │ │ │ │ ├── getSyncCopyData.ts
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── selection.ts
│ │ │ │ │ ├── hooks
│ │ │ │ │ └── useToolbarChange.ts
│ │ │ │ │ ├── kanban
│ │ │ │ │ ├── KanbanView.tsx
│ │ │ │ │ ├── KanbanViewBase.tsx
│ │ │ │ │ ├── components
│ │ │ │ │ │ ├── KanbanCard.tsx
│ │ │ │ │ │ ├── KanbanContainer.tsx
│ │ │ │ │ │ ├── KanbanStack.tsx
│ │ │ │ │ │ ├── KanbanStackContainer.tsx
│ │ │ │ │ │ ├── KanbanStackCreator.tsx
│ │ │ │ │ │ ├── KanbanStackHeader.tsx
│ │ │ │ │ │ ├── KanbanStackTitle.tsx
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── interface.ts
│ │ │ │ │ ├── constant.ts
│ │ │ │ │ ├── context
│ │ │ │ │ │ ├── KanbanContext.ts
│ │ │ │ │ │ ├── KanbanProvider.tsx
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── hooks
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── useInView.ts
│ │ │ │ │ │ └── useKanban.ts
│ │ │ │ │ ├── store
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── useKanbanStackCollapsed.ts
│ │ │ │ │ ├── type.ts
│ │ │ │ │ └── utils
│ │ │ │ │ │ ├── card.ts
│ │ │ │ │ │ ├── drag.ts
│ │ │ │ │ │ ├── filter.ts
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── list
│ │ │ │ │ ├── DraggableWrapper.tsx
│ │ │ │ │ ├── ExpandViewList.tsx
│ │ │ │ │ ├── PinViewItem.tsx
│ │ │ │ │ ├── ViewList.tsx
│ │ │ │ │ ├── ViewListItem.tsx
│ │ │ │ │ ├── useAddView.ts
│ │ │ │ │ ├── useDeleteView.ts
│ │ │ │ │ └── useDuplicateView.ts
│ │ │ │ │ ├── plugin
│ │ │ │ │ └── PluginView.tsx
│ │ │ │ │ ├── search
│ │ │ │ │ ├── SearchButton.tsx
│ │ │ │ │ ├── SearchCommand.tsx
│ │ │ │ │ └── SearchCountPagination.tsx
│ │ │ │ │ ├── tool-bar
│ │ │ │ │ ├── CalendarToolBar.tsx
│ │ │ │ │ ├── FormToolBar.tsx
│ │ │ │ │ ├── GalleryToolBar.tsx
│ │ │ │ │ ├── GridToolBar.tsx
│ │ │ │ │ ├── KanbanToolBar.tsx
│ │ │ │ │ ├── Others.tsx
│ │ │ │ │ ├── SharePopover.tsx
│ │ │ │ │ ├── ToolBarButton.tsx
│ │ │ │ │ ├── components
│ │ │ │ │ │ ├── CalendarViewOperators.tsx
│ │ │ │ │ │ ├── CoverFieldSelect.tsx
│ │ │ │ │ │ ├── GalleryViewOperators.tsx
│ │ │ │ │ │ ├── GridViewOperators.tsx
│ │ │ │ │ │ ├── KanbanViewOperators.tsx
│ │ │ │ │ │ ├── PersonalViewSwitch.tsx
│ │ │ │ │ │ ├── UndoRedoButtons.tsx
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── useToolBarStore.tsx
│ │ │ │ │ ├── hook
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── useViewConfigurable.ts
│ │ │ │ │ ├── store
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── useFormModeStore.ts
│ │ │ │ │ └── useViewFilterLinkContext.ts
│ │ │ │ │ └── types.ts
│ │ │ ├── components
│ │ │ │ ├── Chart
│ │ │ │ │ ├── Chart.tsx
│ │ │ │ │ ├── bar.ts
│ │ │ │ │ ├── base.ts
│ │ │ │ │ ├── createChart.ts
│ │ │ │ │ ├── line.tsx
│ │ │ │ │ ├── pie.tsx
│ │ │ │ │ └── type.ts
│ │ │ │ ├── CopyButton.tsx
│ │ │ │ ├── LanguagePicker.tsx
│ │ │ │ ├── MenuDeleteItem.tsx
│ │ │ │ ├── SideBarFooter.tsx
│ │ │ │ ├── SpaceSettingContainer.tsx
│ │ │ │ ├── ThemePicker.tsx
│ │ │ │ ├── Welcom.tsx
│ │ │ │ ├── ai-chat
│ │ │ │ │ ├── components
│ │ │ │ │ │ ├── LoadingDot.tsx
│ │ │ │ │ │ ├── Message.tsx
│ │ │ │ │ │ ├── MessageContext.tsx
│ │ │ │ │ │ ├── MessageInput.tsx
│ │ │ │ │ │ ├── MessageMeta.tsx
│ │ │ │ │ │ ├── Messages.tsx
│ │ │ │ │ │ ├── ModelSelector.tsx
│ │ │ │ │ │ ├── message-part
│ │ │ │ │ │ │ ├── Markdown.tsx
│ │ │ │ │ │ │ ├── ReasonMessagePart.tsx
│ │ │ │ │ │ │ ├── TextMessagePart.tsx
│ │ │ │ │ │ │ └── ToolMessagePart.tsx
│ │ │ │ │ │ ├── types.ts
│ │ │ │ │ │ └── use-scroll-to-bottom.ts
│ │ │ │ │ ├── context
│ │ │ │ │ │ ├── ChatContext.tsx
│ │ │ │ │ │ ├── ChatProvider.tsx
│ │ │ │ │ │ └── useChatContext.ts
│ │ │ │ │ ├── hooks
│ │ │ │ │ │ ├── useActiveChat.ts
│ │ │ │ │ │ ├── useChatEnabled.ts
│ │ │ │ │ │ ├── useChatHistory.ts
│ │ │ │ │ │ └── useChatMessages.ts
│ │ │ │ │ ├── panel
│ │ │ │ │ │ ├── ChatContainer.tsx
│ │ │ │ │ │ ├── ChatHistory.tsx
│ │ │ │ │ │ ├── ChatPanel.tsx
│ │ │ │ │ │ ├── ChatPanelHeader.tsx
│ │ │ │ │ │ ├── ChatTriggerButton.tsx
│ │ │ │ │ │ └── PanelContainer.tsx
│ │ │ │ │ ├── store
│ │ │ │ │ │ ├── useChatPanelStore.ts
│ │ │ │ │ │ └── useChatStore.ts
│ │ │ │ │ └── utils.ts
│ │ │ │ ├── billing
│ │ │ │ │ ├── Level.tsx
│ │ │ │ │ ├── LevelWithUpgrade.tsx
│ │ │ │ │ ├── Status.tsx
│ │ │ │ │ └── UsageLimitModal.tsx
│ │ │ │ ├── collaborator-manage
│ │ │ │ │ ├── base
│ │ │ │ │ │ ├── BaseCollaboratorContent.tsx
│ │ │ │ │ │ ├── BaseCollaboratorModal.tsx
│ │ │ │ │ │ ├── BaseCollaborators.tsx
│ │ │ │ │ │ ├── BaseInvite.tsx
│ │ │ │ │ │ ├── BaseInviteLink.tsx
│ │ │ │ │ │ └── useFilteredRoleStatic.ts
│ │ │ │ │ ├── components
│ │ │ │ │ │ ├── Collaborator.tsx
│ │ │ │ │ │ ├── CollaboratorAdd.tsx
│ │ │ │ │ │ ├── CollaboratorItem.tsx
│ │ │ │ │ │ ├── CollaboratorList.tsx
│ │ │ │ │ │ ├── Invite.tsx
│ │ │ │ │ │ ├── InviteLinkItem.tsx
│ │ │ │ │ │ └── RoleSelect.tsx
│ │ │ │ │ ├── space-inner
│ │ │ │ │ │ └── Collaborators.tsx
│ │ │ │ │ ├── space
│ │ │ │ │ │ ├── Collaborators.tsx
│ │ │ │ │ │ ├── SpaceCollaboratorModal.tsx
│ │ │ │ │ │ ├── SpaceCollaboratorModalTrigger.tsx
│ │ │ │ │ │ ├── SpaceInvite.tsx
│ │ │ │ │ │ ├── SpaceInviteLink.tsx
│ │ │ │ │ │ └── useFilteredRoleStatic.ts
│ │ │ │ │ ├── types.ts
│ │ │ │ │ ├── useRoleStatic.ts
│ │ │ │ │ └── utils.ts
│ │ │ │ ├── emoji
│ │ │ │ │ ├── Emoji.tsx
│ │ │ │ │ └── EmojiPicker.tsx
│ │ │ │ ├── expand-record-container
│ │ │ │ │ ├── ExpandRecordContainer.tsx
│ │ │ │ │ ├── ExpandRecordContainerBase.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── types.ts
│ │ │ │ ├── field-setting
│ │ │ │ │ ├── DefaultValue.tsx
│ │ │ │ │ ├── DynamicFieldEditor.tsx
│ │ │ │ │ ├── FieldEditor.spec.tsx
│ │ │ │ │ ├── FieldEditor.tsx
│ │ │ │ │ ├── FieldOptions.tsx
│ │ │ │ │ ├── FieldSetting.tsx
│ │ │ │ │ ├── SelectFieldType.tsx
│ │ │ │ │ ├── SelectTable.tsx
│ │ │ │ │ ├── SystemInfo.tsx
│ │ │ │ │ ├── field-ai-config
│ │ │ │ │ │ ├── AttachmentFieldAiConfig.tsx
│ │ │ │ │ │ ├── FieldAiConfig.tsx
│ │ │ │ │ │ ├── MultipleSelectFieldAiConfig.tsx
│ │ │ │ │ │ ├── RatingFieldAiConfig.tsx
│ │ │ │ │ │ ├── SingleSelectFieldAiConfig.tsx
│ │ │ │ │ │ ├── TextFieldAiConfig.tsx
│ │ │ │ │ │ ├── components
│ │ │ │ │ │ │ ├── attachment-select
│ │ │ │ │ │ │ │ ├── AttachmentSelect.tsx
│ │ │ │ │ │ │ │ └── index.ts
│ │ │ │ │ │ │ ├── field-select
│ │ │ │ │ │ │ │ ├── FieldSelect.tsx
│ │ │ │ │ │ │ │ └── index.ts
│ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ └── prompt-editor
│ │ │ │ │ │ │ │ ├── PromptEditor.tsx
│ │ │ │ │ │ │ │ ├── PromptEditorContainer.tsx
│ │ │ │ │ │ │ │ ├── extensions
│ │ │ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ │ │ ├── theme.ts
│ │ │ │ │ │ │ │ └── variable.ts
│ │ │ │ │ │ │ │ └── index.ts
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── field-validation
│ │ │ │ │ │ └── FieldValidation.tsx
│ │ │ │ │ ├── formatting
│ │ │ │ │ │ ├── DatetimeFormatting.tsx
│ │ │ │ │ │ ├── NumberFormatting.tsx
│ │ │ │ │ │ ├── TimeZoneFormatting.tsx
│ │ │ │ │ │ └── UnionFormatting.tsx
│ │ │ │ │ ├── hooks
│ │ │ │ │ │ ├── useDefaultFieldName.ts
│ │ │ │ │ │ ├── useUpdateLookupOptions.spec.ts
│ │ │ │ │ │ └── useUpdateLookupOptions.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── lookup-options
│ │ │ │ │ │ ├── LookupFilterOptions.tsx
│ │ │ │ │ │ └── LookupOptions.tsx
│ │ │ │ │ ├── options
│ │ │ │ │ │ ├── CheckboxOptions.tsx
│ │ │ │ │ │ ├── CreatedTimeOptions.tsx
│ │ │ │ │ │ ├── DateOptions.tsx
│ │ │ │ │ │ ├── FormulaOptions.tsx
│ │ │ │ │ │ ├── LinkOptions
│ │ │ │ │ │ │ ├── LinkOptions.tsx
│ │ │ │ │ │ │ ├── MoreLinkOptions.tsx
│ │ │ │ │ │ │ ├── SelectTable.tsx
│ │ │ │ │ │ │ └── index.ts
│ │ │ │ │ │ ├── LongTextOptions.tsx
│ │ │ │ │ │ ├── NumberOptions.tsx
│ │ │ │ │ │ ├── RatingOptions.tsx
│ │ │ │ │ │ ├── RollupOptions.tsx
│ │ │ │ │ │ ├── SelectOptions
│ │ │ │ │ │ │ ├── ChoiceItem.tsx
│ │ │ │ │ │ │ ├── ColorPicker.tsx
│ │ │ │ │ │ │ ├── SelectDefaultValue.tsx
│ │ │ │ │ │ │ ├── SelectOptions.tsx
│ │ │ │ │ │ │ └── index.ts
│ │ │ │ │ │ ├── SingleLineTextOptions.tsx
│ │ │ │ │ │ └── UserOptions.tsx
│ │ │ │ │ ├── show-as
│ │ │ │ │ │ ├── MultiNumberShowAs.tsx
│ │ │ │ │ │ ├── SingleLineTextShowAs.tsx
│ │ │ │ │ │ ├── SingleNumberShowAs.tsx
│ │ │ │ │ │ └── UnionShowAs.tsx
│ │ │ │ │ ├── type.ts
│ │ │ │ │ └── useFieldTypeSubtitle.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── notifications
│ │ │ │ │ ├── NotificationActionBar.tsx
│ │ │ │ │ ├── NotificationIcon.tsx
│ │ │ │ │ ├── NotificationItem.tsx
│ │ │ │ │ ├── NotificationList.tsx
│ │ │ │ │ ├── NotificationsManage.tsx
│ │ │ │ │ └── notification-component
│ │ │ │ │ │ ├── LinkNotification.tsx
│ │ │ │ │ │ └── index.ts
│ │ │ │ ├── oauth
│ │ │ │ │ ├── OAuthLogo.tsx
│ │ │ │ │ └── OAuthScope.tsx
│ │ │ │ ├── plugin-context-menu
│ │ │ │ │ ├── PluginContextMenu.tsx
│ │ │ │ │ ├── PluginContextMenuManageDialog.tsx
│ │ │ │ │ ├── components
│ │ │ │ │ │ ├── FloatPlugin.tsx
│ │ │ │ │ │ └── useFloatPluginPosition.tsx
│ │ │ │ │ └── useActiveMenuPlugin.ts
│ │ │ │ ├── plugin-panel
│ │ │ │ │ ├── PluginLayout.tsx
│ │ │ │ │ ├── PluginPanel.tsx
│ │ │ │ │ ├── PluginPanelContainer.tsx
│ │ │ │ │ ├── PluginPanelEmpty.tsx
│ │ │ │ │ ├── PluginPanelHeader.tsx
│ │ │ │ │ ├── PluginPanelSelector.tsx
│ │ │ │ │ ├── components
│ │ │ │ │ │ ├── CreatePluginDialog.tsx
│ │ │ │ │ │ ├── CreatePluginPanelDialog.tsx
│ │ │ │ │ │ └── PluginItem.tsx
│ │ │ │ │ └── hooks
│ │ │ │ │ │ ├── useActivePluginPanelId.tsx
│ │ │ │ │ │ ├── usePluginPanelStorage.ts
│ │ │ │ │ │ └── usePluginPanelStore.ts
│ │ │ │ ├── plugin
│ │ │ │ │ ├── PluginCenterDialog.tsx
│ │ │ │ │ ├── PluginContent.tsx
│ │ │ │ │ ├── PluginDetail.tsx
│ │ │ │ │ ├── PluginHeader.tsx
│ │ │ │ │ ├── PluginRender.tsx
│ │ │ │ │ ├── hooks
│ │ │ │ │ │ ├── iframe-url
│ │ │ │ │ │ │ ├── useIframeUrl.tsx
│ │ │ │ │ │ │ └── utils.ts
│ │ │ │ │ │ ├── useIframeSize.tsx
│ │ │ │ │ │ ├── useSyncBasePermissions.ts
│ │ │ │ │ │ ├── useSyncSelection.ts
│ │ │ │ │ │ ├── useSyncUIConfig.ts
│ │ │ │ │ │ ├── useSyncUrlParams.tsx
│ │ │ │ │ │ ├── useUIEvent.ts
│ │ │ │ │ │ ├── useUtilsEvent.ts
│ │ │ │ │ │ └── utils
│ │ │ │ │ │ │ └── getSelectionRecords.ts
│ │ │ │ │ └── types.ts
│ │ │ │ ├── setting
│ │ │ │ │ ├── Account.tsx
│ │ │ │ │ ├── InteractionSelect.tsx
│ │ │ │ │ ├── Notifications.tsx
│ │ │ │ │ ├── SettingDialog.tsx
│ │ │ │ │ ├── System.tsx
│ │ │ │ │ ├── account
│ │ │ │ │ │ ├── AddPassword.tsx
│ │ │ │ │ │ ├── ChangeEmailDialog.tsx
│ │ │ │ │ │ └── ChangePasswordDialog.tsx
│ │ │ │ │ ├── integration
│ │ │ │ │ │ ├── Detail.tsx
│ │ │ │ │ │ ├── Integration.tsx
│ │ │ │ │ │ ├── List.tsx
│ │ │ │ │ │ └── RevokeButton.tsx
│ │ │ │ │ └── useSettingStore.ts
│ │ │ │ ├── sidebar
│ │ │ │ │ ├── Sidebar.tsx
│ │ │ │ │ ├── SidebarContent.tsx
│ │ │ │ │ ├── SidebarHeader.tsx
│ │ │ │ │ └── SidebarHeaderLeft.tsx
│ │ │ │ ├── space
│ │ │ │ │ ├── CreateBaseModal.tsx
│ │ │ │ │ ├── SpaceActionBar.tsx
│ │ │ │ │ ├── SpaceRenaming.tsx
│ │ │ │ │ └── template
│ │ │ │ │ │ ├── CategoryMenu.tsx
│ │ │ │ │ │ ├── CategoryMenuItem.tsx
│ │ │ │ │ │ ├── TemplateCard.tsx
│ │ │ │ │ │ ├── TemplateDetail.tsx
│ │ │ │ │ │ ├── TemplateList.tsx
│ │ │ │ │ │ ├── TemplateMain.tsx
│ │ │ │ │ │ ├── TemplateModal.tsx
│ │ │ │ │ │ ├── TemplateSheet.tsx
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── hooks
│ │ │ │ │ │ └── use-space-id.ts
│ │ │ │ │ │ └── index.ts
│ │ │ │ ├── toggle-side-bar
│ │ │ │ │ ├── HoverWrapper.tsx
│ │ │ │ │ ├── SheetWrapper.tsx
│ │ │ │ │ └── constant.ts
│ │ │ │ └── user
│ │ │ │ │ ├── UserAvatar.tsx
│ │ │ │ │ └── UserNav.tsx
│ │ │ ├── dashboard
│ │ │ │ ├── DashboardGrid.tsx
│ │ │ │ ├── DashboardHeader.tsx
│ │ │ │ ├── DashboardMain.tsx
│ │ │ │ ├── EmptyDashboard.tsx
│ │ │ │ ├── Pages.tsx
│ │ │ │ ├── TestBaseQuery.tsx
│ │ │ │ ├── components
│ │ │ │ │ ├── AddPluginDialog.tsx
│ │ │ │ │ ├── CreateDashboardDialog.tsx
│ │ │ │ │ ├── DashboardSwitcher.tsx
│ │ │ │ │ └── PluginItem.tsx
│ │ │ │ └── hooks
│ │ │ │ │ └── useIsExpandPlugin.ts
│ │ │ ├── hooks
│ │ │ │ ├── useAI.ts
│ │ │ │ ├── useAutoFavicon.tsx
│ │ │ │ ├── useBaseUsage.ts
│ │ │ │ ├── useBillingLevelConfig.ts
│ │ │ │ ├── useBrand.tsx
│ │ │ │ ├── useDownLoad.ts
│ │ │ │ ├── useEnv.ts
│ │ │ │ ├── useHiddenFields.ts
│ │ │ │ ├── useInitializationZodI18n.ts
│ │ │ │ ├── useIsCloud.ts
│ │ │ │ ├── useIsEE.ts
│ │ │ │ ├── usePreviewUrl.ts
│ │ │ │ ├── useSdkLocale.ts
│ │ │ │ └── useSetting.ts
│ │ │ ├── layouts
│ │ │ │ ├── AdminLayout.tsx
│ │ │ │ ├── AppLayout.tsx
│ │ │ │ ├── BaseLayout.tsx
│ │ │ │ ├── SettingLayout.tsx
│ │ │ │ ├── SpaceLayout.tsx
│ │ │ │ ├── SpacePageTitle.tsx
│ │ │ │ ├── SpaceSettingLayout.tsx
│ │ │ │ ├── index.ts
│ │ │ │ └── useSettingRoute.tsx
│ │ │ └── utils
│ │ │ │ ├── clipboard.spec.ts
│ │ │ │ ├── clipboard.ts
│ │ │ │ ├── file.ts
│ │ │ │ ├── get-mod-key-str.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── is-https.ts
│ │ │ │ ├── is-local.ts
│ │ │ │ └── uploadFile.ts
│ │ ├── auth
│ │ │ ├── components
│ │ │ │ ├── DescContent.tsx
│ │ │ │ ├── LayoutMain.tsx
│ │ │ │ ├── Rectangles.tsx
│ │ │ │ ├── SendVerificationButton.tsx
│ │ │ │ ├── SignForm.tsx
│ │ │ │ ├── SocialAuth.tsx
│ │ │ │ ├── TeableFooter.tsx
│ │ │ │ └── Terms.tsx
│ │ │ ├── pages
│ │ │ │ ├── ForgetPasswordPage.tsx
│ │ │ │ ├── LoginPage.tsx
│ │ │ │ └── ResetPasswordPage.tsx
│ │ │ └── useDisallowSignUp.ts
│ │ ├── i18n
│ │ │ ├── auth.config.ts
│ │ │ ├── automation.tsx
│ │ │ ├── base.config.ts
│ │ │ ├── dashboard.config.ts
│ │ │ ├── developer.config.ts
│ │ │ ├── oauth-app.config.ts
│ │ │ ├── personal-access-token.config.ts
│ │ │ ├── setting-plugin.config.ts
│ │ │ ├── share.config.ts
│ │ │ ├── space.config.ts
│ │ │ ├── system.config.ts
│ │ │ └── table.config.ts
│ │ └── system
│ │ │ └── pages
│ │ │ ├── ErrorPage.tsx
│ │ │ ├── ForbiddenPage.tsx
│ │ │ ├── NotFoundPage.tsx
│ │ │ ├── PaymentRequired.tsx
│ │ │ ├── __tests__
│ │ │ ├── ErrorPage.test.tsx
│ │ │ └── NotFoundPage.test.tsx
│ │ │ └── index.ts
│ ├── lib
│ │ ├── emoji-color.ts
│ │ ├── ensureLogin.ts
│ │ ├── get-brand.ts
│ │ ├── i18n
│ │ │ ├── I18nNamespace.types.ts
│ │ │ ├── acceptHeader.ts
│ │ │ ├── getLocale.ts
│ │ │ ├── getServerSideTranslations.ts
│ │ │ ├── getTranslationsProps.ts
│ │ │ └── index.ts
│ │ ├── server-env.ts
│ │ ├── space-role-checker.ts
│ │ ├── type.ts
│ │ ├── view-pages-data.ts
│ │ ├── withAuthSSR.ts
│ │ └── withEnv.ts
│ ├── middleware.ts
│ ├── pages
│ │ ├── 402.tsx
│ │ ├── 403.tsx
│ │ ├── 404.tsx
│ │ ├── _app.tsx
│ │ ├── _document.tsx
│ │ ├── _error.tsx
│ │ ├── _monitor
│ │ │ ├── preview
│ │ │ │ └── error-page.tsx
│ │ │ └── sentry
│ │ │ │ ├── csr-page.tsx
│ │ │ │ └── ssr-page.tsx
│ │ ├── admin
│ │ │ ├── setting.tsx
│ │ │ └── template.tsx
│ │ ├── api
│ │ │ └── _monitor
│ │ │ │ ├── healthcheck.ts
│ │ │ │ └── sentry.ts
│ │ ├── auth
│ │ │ ├── forget-password.tsx
│ │ │ ├── login.tsx
│ │ │ ├── reset-password.tsx
│ │ │ └── signup.tsx
│ │ ├── base
│ │ │ ├── [baseId].tsx
│ │ │ └── [baseId]
│ │ │ │ ├── [tableId].tsx
│ │ │ │ ├── [tableId]
│ │ │ │ └── [viewId].tsx
│ │ │ │ ├── authority-matrix.tsx
│ │ │ │ ├── automation.tsx
│ │ │ │ ├── dashboard.tsx
│ │ │ │ ├── design.tsx
│ │ │ │ └── trash.tsx
│ │ ├── developer
│ │ │ └── tool
│ │ │ │ └── query-builder.tsx
│ │ ├── index.tsx
│ │ ├── invite
│ │ │ └── index.tsx
│ │ ├── oauth
│ │ │ └── decision.tsx
│ │ ├── setting
│ │ │ ├── index.tsx
│ │ │ ├── oauth-app.tsx
│ │ │ ├── personal-access-token.tsx
│ │ │ └── plugin.tsx
│ │ ├── share
│ │ │ └── [shareId]
│ │ │ │ └── view
│ │ │ │ ├── auth.tsx
│ │ │ │ └── index.tsx
│ │ └── space
│ │ │ ├── [spaceId].tsx
│ │ │ ├── [spaceId]
│ │ │ └── setting
│ │ │ │ ├── collaborator.tsx
│ │ │ │ ├── general.tsx
│ │ │ │ └── integration.tsx
│ │ │ ├── index.tsx
│ │ │ ├── shared-base.tsx
│ │ │ └── trash.tsx
│ ├── store
│ │ ├── message.ts
│ │ └── user.ts
│ ├── styles
│ │ ├── github-markdown.css
│ │ └── global.css
│ ├── themes
│ │ ├── colors
│ │ │ └── index.ts
│ │ ├── shared
│ │ │ ├── __tests__
│ │ │ │ └── colors.test.ts
│ │ │ ├── browser-fonts.js
│ │ │ └── colors.js
│ │ ├── tailwind
│ │ │ └── tailwind.theme.js
│ │ ├── type.ts
│ │ └── utils.ts
│ └── types.d
│ │ ├── i18next.d.ts
│ │ ├── next-i18next.d.ts
│ │ ├── react-svgr.d.ts
│ │ └── umami.d.ts
│ ├── tailwind.config.js
│ ├── tsconfig.eslint.json
│ ├── tsconfig.json
│ ├── tsconfig.scripts.json
│ └── vitest.config.ts
├── commitlint.config.js
├── crowdin.yml
├── docker-bake.hcl
├── dockers
├── .env
├── cache-redis.yml
├── database-postgres.yml
├── examples
│ ├── cluster
│ │ ├── .env
│ │ ├── README.md
│ │ ├── docker-compose.yaml
│ │ └── gateway
│ │ │ └── conf.d
│ │ │ ├── default.conf
│ │ │ └── minio.conf
│ ├── docker-swarm
│ │ ├── .env
│ │ ├── README.md
│ │ ├── deploy.sh
│ │ ├── docker-compose.app.yml
│ │ ├── docker-compose.default.yml
│ │ ├── docker-compose.gateway.yml
│ │ ├── docker-compose.kit.yml
│ │ └── gateway
│ │ │ └── conf.d
│ │ │ ├── default.conf
│ │ │ └── minio.conf
│ └── standalone
│ │ ├── .env
│ │ ├── README.md
│ │ └── docker-compose.yaml
├── integration-test.yml
├── networks.yml
├── storage-minio.yml
└── teable
│ ├── Dockerfile
│ └── Dockerfile.db-migrate
├── lint-staged.common.js
├── lint-staged.config.js
├── monorepo.code-workspace
├── package.json
├── packages
├── common-i18n
│ ├── .eslintrc.cjs
│ ├── .gitignore
│ ├── .idea
│ │ ├── common-i18n.iml
│ │ └── modules.xml
│ ├── LICENSE
│ ├── lint-staged.config.js
│ ├── package.json
│ ├── src
│ │ ├── I18nNamespaces.ts
│ │ ├── index.ts
│ │ └── locales
│ │ │ ├── de
│ │ │ ├── auth.json
│ │ │ ├── common.json
│ │ │ ├── dashboard.json
│ │ │ ├── developer.json
│ │ │ ├── oauth.json
│ │ │ ├── plugin.json
│ │ │ ├── sdk.json
│ │ │ ├── setting.json
│ │ │ ├── share.json
│ │ │ ├── space.json
│ │ │ ├── system.json
│ │ │ ├── table.json
│ │ │ ├── token.json
│ │ │ └── zod.json
│ │ │ ├── en
│ │ │ ├── auth.json
│ │ │ ├── common.json
│ │ │ ├── dashboard.json
│ │ │ ├── developer.json
│ │ │ ├── oauth.json
│ │ │ ├── plugin.json
│ │ │ ├── sdk.json
│ │ │ ├── setting.json
│ │ │ ├── share.json
│ │ │ ├── space.json
│ │ │ ├── system.json
│ │ │ ├── table.json
│ │ │ ├── token.json
│ │ │ └── zod.json
│ │ │ ├── es
│ │ │ ├── auth.json
│ │ │ ├── common.json
│ │ │ ├── dashboard.json
│ │ │ ├── developer.json
│ │ │ ├── oauth.json
│ │ │ ├── plugin.json
│ │ │ ├── sdk.json
│ │ │ ├── setting.json
│ │ │ ├── share.json
│ │ │ ├── space.json
│ │ │ ├── system.json
│ │ │ ├── table.json
│ │ │ ├── token.json
│ │ │ └── zod.json
│ │ │ ├── fr
│ │ │ ├── auth.json
│ │ │ ├── common.json
│ │ │ ├── developer.json
│ │ │ ├── oauth.json
│ │ │ ├── sdk.json
│ │ │ ├── setting.json
│ │ │ ├── share.json
│ │ │ ├── space.json
│ │ │ ├── system.json
│ │ │ ├── table.json
│ │ │ ├── token.json
│ │ │ └── zod.json
│ │ │ ├── it
│ │ │ ├── auth.json
│ │ │ ├── common.json
│ │ │ ├── dashboard.json
│ │ │ ├── developer.json
│ │ │ ├── oauth.json
│ │ │ ├── plugin.json
│ │ │ ├── sdk.json
│ │ │ ├── setting.json
│ │ │ ├── share.json
│ │ │ ├── space.json
│ │ │ ├── system.json
│ │ │ ├── table.json
│ │ │ ├── token.json
│ │ │ └── zod.json
│ │ │ ├── ja
│ │ │ ├── auth.json
│ │ │ ├── common.json
│ │ │ ├── developer.json
│ │ │ ├── oauth.json
│ │ │ ├── sdk.json
│ │ │ ├── setting.json
│ │ │ ├── share.json
│ │ │ ├── space.json
│ │ │ ├── system.json
│ │ │ ├── table.json
│ │ │ ├── token.json
│ │ │ └── zod.json
│ │ │ ├── ru
│ │ │ ├── auth.json
│ │ │ ├── common.json
│ │ │ ├── dashboard.json
│ │ │ ├── developer.json
│ │ │ ├── oauth.json
│ │ │ ├── plugin.json
│ │ │ ├── sdk.json
│ │ │ ├── setting.json
│ │ │ ├── share.json
│ │ │ ├── space.json
│ │ │ ├── system.json
│ │ │ ├── table.json
│ │ │ ├── token.json
│ │ │ └── zod.json
│ │ │ ├── tr
│ │ │ ├── auth.json
│ │ │ ├── common.json
│ │ │ ├── dashboard.json
│ │ │ ├── developer.json
│ │ │ ├── oauth.json
│ │ │ ├── plugin.json
│ │ │ ├── sdk.json
│ │ │ ├── setting.json
│ │ │ ├── share.json
│ │ │ ├── space.json
│ │ │ ├── system.json
│ │ │ ├── table.json
│ │ │ ├── token.json
│ │ │ └── zod.json
│ │ │ ├── uk
│ │ │ ├── auth.json
│ │ │ ├── common.json
│ │ │ ├── dashboard.json
│ │ │ ├── developer.json
│ │ │ ├── oauth.json
│ │ │ ├── plugin.json
│ │ │ ├── sdk.json
│ │ │ ├── setting.json
│ │ │ ├── share.json
│ │ │ ├── space.json
│ │ │ ├── system.json
│ │ │ ├── table.json
│ │ │ ├── token.json
│ │ │ └── zod.json
│ │ │ └── zh
│ │ │ ├── auth.json
│ │ │ ├── common.json
│ │ │ ├── dashboard.json
│ │ │ ├── developer.json
│ │ │ ├── oauth.json
│ │ │ ├── plugin.json
│ │ │ ├── sdk.json
│ │ │ ├── setting.json
│ │ │ ├── share.json
│ │ │ ├── space.json
│ │ │ ├── system.json
│ │ │ ├── table.json
│ │ │ ├── token.json
│ │ │ └── zod.json
│ └── tsconfig.json
├── core
│ ├── .escheckrc
│ ├── .eslintrc.cjs
│ ├── .gitignore
│ ├── .idea
│ │ ├── core.iml
│ │ └── modules.xml
│ ├── .size-limit.cjs
│ ├── LICENSE
│ ├── lint-staged.config.js
│ ├── package.json
│ ├── src
│ │ ├── array
│ │ │ ├── ArrayUtils.spec.ts
│ │ │ ├── ArrayUtils.ts
│ │ │ └── index.ts
│ │ ├── asserts
│ │ │ ├── __tests__
│ │ │ │ └── asserts.test.ts
│ │ │ ├── asserts.ts
│ │ │ ├── index.ts
│ │ │ └── lang.ts
│ │ ├── auth
│ │ │ ├── actions.ts
│ │ │ ├── anonymous.ts
│ │ │ ├── index.ts
│ │ │ ├── me-tag.ts
│ │ │ ├── oauth.ts
│ │ │ ├── permission.ts
│ │ │ ├── role
│ │ │ │ ├── base.ts
│ │ │ │ ├── constant.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── share.ts
│ │ │ │ ├── space.ts
│ │ │ │ ├── table.ts
│ │ │ │ ├── types.ts
│ │ │ │ └── utils.ts
│ │ │ ├── system.ts
│ │ │ └── types.ts
│ │ ├── convert
│ │ │ ├── __tests__
│ │ │ │ └── string-convert.test.ts
│ │ │ ├── index.ts
│ │ │ ├── nulls-to-undefined.ts
│ │ │ └── string-convert.ts
│ │ ├── errors
│ │ │ ├── http
│ │ │ │ ├── constant.ts
│ │ │ │ ├── http-response.types.ts
│ │ │ │ ├── http.error.ts
│ │ │ │ └── index.ts
│ │ │ └── index.ts
│ │ ├── formula
│ │ │ ├── conversion.visitor.spec.ts
│ │ │ ├── conversion.visitor.ts
│ │ │ ├── error.listener.ts
│ │ │ ├── evaluate.ts
│ │ │ ├── field-reference.visitor.spec.ts
│ │ │ ├── field-reference.visitor.ts
│ │ │ ├── functions
│ │ │ │ ├── array.spec.ts
│ │ │ │ ├── array.ts
│ │ │ │ ├── common.ts
│ │ │ │ ├── date-time.spec.ts
│ │ │ │ ├── date-time.ts
│ │ │ │ ├── factory.ts
│ │ │ │ ├── logical.spec.ts
│ │ │ │ ├── logical.ts
│ │ │ │ ├── numeric.spec.ts
│ │ │ │ ├── numeric.ts
│ │ │ │ ├── system.spec.ts
│ │ │ │ ├── system.ts
│ │ │ │ ├── text.spec.ts
│ │ │ │ └── text.ts
│ │ │ ├── index.ts
│ │ │ ├── parser
│ │ │ │ ├── Formula.g4
│ │ │ │ ├── Formula.interp
│ │ │ │ ├── Formula.tokens
│ │ │ │ ├── Formula.ts
│ │ │ │ ├── FormulaLexer.g4
│ │ │ │ ├── FormulaLexer.interp
│ │ │ │ ├── FormulaLexer.tokens
│ │ │ │ ├── FormulaLexer.ts
│ │ │ │ ├── FormulaVisitor.ts
│ │ │ │ └── README.md
│ │ │ ├── typed-value-converter.spec.ts
│ │ │ ├── typed-value-converter.ts
│ │ │ ├── typed-value.ts
│ │ │ ├── visitor.spec.ts
│ │ │ └── visitor.ts
│ │ ├── index.ts
│ │ ├── models
│ │ │ ├── aggregation
│ │ │ │ ├── index.ts
│ │ │ │ ├── statistic.spec.ts
│ │ │ │ ├── statistic.ts
│ │ │ │ └── statistics-func.enum.ts
│ │ │ ├── channel.ts
│ │ │ ├── field
│ │ │ │ ├── ai-config
│ │ │ │ │ ├── attachment.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── multiple-select.ts
│ │ │ │ │ ├── rating.ts
│ │ │ │ │ ├── single-select.ts
│ │ │ │ │ └── text.ts
│ │ │ │ ├── cell-value-validation.ts
│ │ │ │ ├── color-utils.spec.ts
│ │ │ │ ├── color-utils.ts
│ │ │ │ ├── colors.ts
│ │ │ │ ├── constant.ts
│ │ │ │ ├── derivate
│ │ │ │ │ ├── abstract
│ │ │ │ │ │ ├── formula.field.abstract.ts
│ │ │ │ │ │ ├── select.field.abstract.spec.ts
│ │ │ │ │ │ ├── select.field.abstract.ts
│ │ │ │ │ │ └── user.field.abstract.ts
│ │ │ │ │ ├── attachment.field.spec.ts
│ │ │ │ │ ├── attachment.field.ts
│ │ │ │ │ ├── auto-number.field.spec.ts
│ │ │ │ │ ├── auto-number.field.ts
│ │ │ │ │ ├── checkbox.field.spec.ts
│ │ │ │ │ ├── checkbox.field.ts
│ │ │ │ │ ├── created-by.field.ts
│ │ │ │ │ ├── created-time.field.spec.ts
│ │ │ │ │ ├── created-time.field.ts
│ │ │ │ │ ├── date.field.spec.ts
│ │ │ │ │ ├── date.field.ts
│ │ │ │ │ ├── formula.field.spec.ts
│ │ │ │ │ ├── formula.field.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── last-modified-by.field.ts
│ │ │ │ │ ├── last-modified-time.field.spec.ts
│ │ │ │ │ ├── last-modified-time.field.ts
│ │ │ │ │ ├── link.field.spec.ts
│ │ │ │ │ ├── link.field.ts
│ │ │ │ │ ├── long-text.field.spec.ts
│ │ │ │ │ ├── long-text.field.ts
│ │ │ │ │ ├── multiple-select.field.spec.ts
│ │ │ │ │ ├── multiple-select.field.ts
│ │ │ │ │ ├── number.field.spec.ts
│ │ │ │ │ ├── number.field.ts
│ │ │ │ │ ├── rating.field.spec.ts
│ │ │ │ │ ├── rating.field.ts
│ │ │ │ │ ├── rollup.field.spec.ts
│ │ │ │ │ ├── rollup.field.ts
│ │ │ │ │ ├── single-line-text.field.spec.ts
│ │ │ │ │ ├── single-line-text.field.ts
│ │ │ │ │ ├── single-select.field.spec.ts
│ │ │ │ │ ├── single-select.field.ts
│ │ │ │ │ ├── user.field.spec.ts
│ │ │ │ │ └── user.field.ts
│ │ │ │ ├── field-validation.ts
│ │ │ │ ├── field.schema.spec.ts
│ │ │ │ ├── field.schema.ts
│ │ │ │ ├── field.ts
│ │ │ │ ├── formatting
│ │ │ │ │ ├── datetime.spec.ts
│ │ │ │ │ ├── datetime.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── number.spec.ts
│ │ │ │ │ ├── number.ts
│ │ │ │ │ └── time-zone.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── options.schema.ts
│ │ │ │ └── show-as
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── number.ts
│ │ │ │ │ └── text.ts
│ │ │ ├── index.ts
│ │ │ ├── interface.ts
│ │ │ ├── notification
│ │ │ │ ├── action-trigger.schema.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── notification.enum.ts
│ │ │ │ └── notification.schema.ts
│ │ │ ├── op.ts
│ │ │ ├── record
│ │ │ │ ├── index.ts
│ │ │ │ └── record.ts
│ │ │ ├── table
│ │ │ │ ├── index.ts
│ │ │ │ └── table.ts
│ │ │ └── view
│ │ │ │ ├── column-meta.schema.ts
│ │ │ │ ├── constant.ts
│ │ │ │ ├── derivate
│ │ │ │ ├── calendar.view.ts
│ │ │ │ ├── form.view.ts
│ │ │ │ ├── gallery.view.ts
│ │ │ │ ├── grid.view.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── kanban.view.ts
│ │ │ │ └── plugin.view.ts
│ │ │ │ ├── filter
│ │ │ │ ├── conjunction.ts
│ │ │ │ ├── filter-item.ts
│ │ │ │ ├── filter.spec.ts
│ │ │ │ ├── filter.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── operator.spec.ts
│ │ │ │ └── operator.ts
│ │ │ │ ├── group
│ │ │ │ ├── group.ts
│ │ │ │ └── index.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── option.schema.spec.ts
│ │ │ │ ├── option.schema.ts
│ │ │ │ ├── query.replace.ts
│ │ │ │ ├── sort
│ │ │ │ ├── index.ts
│ │ │ │ ├── sort-func.enum.ts
│ │ │ │ ├── sort.schema.spec.ts
│ │ │ │ └── sort.ts
│ │ │ │ ├── view.schema.ts
│ │ │ │ └── view.ts
│ │ ├── op-builder
│ │ │ ├── common.spec.ts
│ │ │ ├── common.ts
│ │ │ ├── field
│ │ │ │ ├── add-column-meta.spec.ts
│ │ │ │ ├── add-column-meta.ts
│ │ │ │ ├── add-field.ts
│ │ │ │ ├── delete-column-meta.spec.ts
│ │ │ │ ├── delete-column-meta.ts
│ │ │ │ ├── field-op-builder.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── set-field-property.spec.ts
│ │ │ │ └── set-field-property.ts
│ │ │ ├── index.ts
│ │ │ ├── interface.ts
│ │ │ ├── op-builder.abstract.ts
│ │ │ ├── record
│ │ │ │ ├── add-record.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── record-op-builder.ts
│ │ │ │ └── set-record.ts
│ │ │ ├── table
│ │ │ │ ├── add-table.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── set-table-property.ts
│ │ │ │ └── table-op-builder.ts
│ │ │ └── view
│ │ │ │ ├── add-view.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── set-view-property.ts
│ │ │ │ ├── update-view-column-meta.ts
│ │ │ │ └── view-op-builder.ts
│ │ ├── query
│ │ │ ├── index.ts
│ │ │ ├── json-error.strategy.ts
│ │ │ ├── json.visitor.spec.ts
│ │ │ ├── json.visitor.ts
│ │ │ └── parser
│ │ │ │ ├── Query.g4
│ │ │ │ ├── Query.interp
│ │ │ │ ├── Query.tokens
│ │ │ │ ├── Query.ts
│ │ │ │ ├── QueryLexer.g4
│ │ │ │ ├── QueryLexer.interp
│ │ │ │ ├── QueryLexer.tokens
│ │ │ │ ├── QueryLexer.ts
│ │ │ │ └── QueryVisitor.ts
│ │ ├── typeguards
│ │ │ ├── __tests__
│ │ │ │ └── typeguards.test.ts
│ │ │ ├── index.ts
│ │ │ ├── json-api
│ │ │ │ ├── __tests__
│ │ │ │ │ └── json-api-typeguard.test.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── json-api-response.types.ts
│ │ │ │ └── json-api.typeguard.ts
│ │ │ └── typeguards.ts
│ │ ├── types
│ │ │ ├── either-or.ts
│ │ │ ├── ensure-keys.ts
│ │ │ ├── index.ts
│ │ │ ├── make-optional.ts
│ │ │ ├── make-required.ts
│ │ │ ├── remove-null.ts
│ │ │ ├── snapshot-query.ts
│ │ │ └── un-promisify.ts
│ │ ├── utils
│ │ │ ├── clipboard.spec.ts
│ │ │ ├── clipboard.ts
│ │ │ ├── date.spec.ts
│ │ │ ├── date.ts
│ │ │ ├── dsn-parser.ts
│ │ │ ├── enum.ts
│ │ │ ├── get-random-int.spec.ts
│ │ │ ├── get-random-int.ts
│ │ │ ├── get-uniq-name.spec.ts
│ │ │ ├── get-uniq-name.ts
│ │ │ ├── id-generator.spec.ts
│ │ │ ├── id-generator.ts
│ │ │ ├── index.ts
│ │ │ ├── minidenticon.ts
│ │ │ └── replace-suffix.ts
│ │ └── zod.ts
│ ├── tsconfig.build.json
│ ├── tsconfig.eslint.json
│ ├── tsconfig.json
│ ├── vitest.config.ts
│ └── vitest.setup.js
├── db-main-prisma
│ ├── .eslintrc.cjs
│ ├── .gitignore
│ ├── .idea
│ │ ├── db-main-prisma.iml
│ │ └── modules.xml
│ ├── LICENSE
│ ├── README.md
│ ├── lint-staged.config.js
│ ├── package.json
│ ├── prisma
│ │ ├── postgres
│ │ │ ├── migrations
│ │ │ │ ├── 20240308114704_initial_database
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20240313062534_add_credit
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20240409081450_field_order
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20240410190501_primary_field_visible
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20240416092001_clean_useless_tables
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20240528060827_add_pin_resource
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20240625032002_add_admin
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20240626072754_add_setting_table
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20240628115120_add_space_invitation
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20240702084258_add_oauth
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20240708080014_oauth_revoke
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20240712040045_remove_bucket
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20240716070632_notification_url_path
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20240806110415_add_record_history
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20240814074637_update_collaborator
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20240906084530_add_trash
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20240913075702_add_dashboard_plugin
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20240919032636_add_comment
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20241008161823_share_meta
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20241031080906_add_attachment_thumbnail
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20241126085325_add_ref_meta
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20241128112023_add_ai_config
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20241205121129_add_table_trash
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20241223100142_collaborator_support_org
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20241226111824_remove_collaborator_foreign_user
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20250115084212_add_enable_email_verification_setting
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20250117105433_update_view
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20250214080105_add_integration
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20250217092955_add_table_plugin
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20250218075500_add_plugin_context_menu
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20250320062220_user_last_visit
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20250328035739_brand
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20250402105144_add_template
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20250406145144_add_share_id_unique
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20250409093339_add_task_tables
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20250410102941_update_task_table
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20250416113238_add_template_markdown_description
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20250418091636_add_db_table_name_index
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20250509062715_require_primary_key
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20250513085306_add_ai_robot_user
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20250520081803_update_user_last_visit
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20250520103546_add_user_trial_used
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20250526042029_repair_reference_caused_by_formula_duplicate
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20250604101438_update_access_token_full_access
│ │ │ │ │ └── migration.sql
│ │ │ │ └── migration_lock.toml
│ │ │ └── schema.prisma
│ │ ├── seed.ts
│ │ ├── sqlite
│ │ │ ├── migrations
│ │ │ │ ├── 20240308114656_initial_database
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20240313061543_add_credit
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20240409081445_field_order
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20240416091909_clean_useless_tables
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20240528055850_add_pin_resource
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20240528060824_add_pin_resource
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20240625031955_add_admin
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20240626072703_add_setting_table
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20240628115107_add_space_invitation
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20240702084255_add_oauth
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20240708080010_oauth_revoke
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20240712040040_remove_bucket
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20240716070608_notification_url_path
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20240806110404_add_record_history
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20240814074632_update_collaborator
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20240906084521_add_trash
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20240913075658_add_dashboard_plugin
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20240919032621_add_comment
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20241031080903_add_attachment_thumbnail
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20241126081006_add_ref_meta
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20241128112016_add_ai_config
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20241205121154_add_table_trash
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20241223100135_collaborator_support_org
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20241226111815_remove_collaborator_foreign_user
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20250115084207_add_enable_email_verification_setting
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20250117105406_update_view
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20250214080102_add_integration
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20250217092948_add_table_plugin
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20250218075455_add_plugin_context_menu
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20250320062213_user_last_visit
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20250328040207_brand
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20250402105138_add_template
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20250406145126_add_share_id_unique
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20250409093334_add_task_tables
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20250410102938_update_task_table
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20250416113234_add_template_markdown_description
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20250418091633_add_db_table_name_index
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20250509062710_require_primary_key
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20250513085303_add_ai_robot_user
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20250520081750_update_user_last_visit
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20250520103541_add_user_trial_used
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20250526042154_repair_reference_caused_by_formula_duplicate
│ │ │ │ │ └── migration.sql
│ │ │ │ ├── 20250604101438_update_access_token_full_access
│ │ │ │ │ └── migration.sql
│ │ │ │ └── migration_lock.toml
│ │ │ └── schema.prisma
│ │ └── template.prisma
│ ├── src
│ │ ├── index.ts
│ │ ├── prisma.module.ts
│ │ ├── prisma.service.ts
│ │ ├── seeds
│ │ │ ├── e2e
│ │ │ │ ├── space-seeds.ts
│ │ │ │ └── user-seeds.ts
│ │ │ └── seed.abstract.ts
│ │ └── utils.ts
│ ├── tsconfig.eslint.json
│ └── tsconfig.json
├── eslint-config-bases
│ ├── .eslintrc.cjs
│ ├── .idea
│ │ ├── eslint-config-bases.iml
│ │ └── modules.xml
│ ├── LICENSE
│ ├── lint-staged.config.js
│ ├── package.json
│ ├── src
│ │ ├── bases
│ │ │ ├── index.js
│ │ │ ├── jest.js
│ │ │ ├── mdx.js
│ │ │ ├── playwright.js
│ │ │ ├── prettier-config.js
│ │ │ ├── prettier-plugin.js
│ │ │ ├── react-query.js
│ │ │ ├── react.js
│ │ │ ├── regexp.js
│ │ │ ├── rtl.js
│ │ │ ├── sonar.js
│ │ │ ├── storybook.js
│ │ │ ├── tailwind.js
│ │ │ └── typescript.js
│ │ ├── helpers
│ │ │ ├── getDefaultIgnorePatterns.js
│ │ │ ├── getPrettierConfig.js
│ │ │ └── index.js
│ │ ├── index.js
│ │ ├── patch
│ │ │ └── modern-module-resolution.js
│ │ └── prettier.base.config.js
│ └── tsconfig.json
├── icons
│ ├── .eslintrc.cjs
│ ├── .gitignore
│ ├── .idea
│ │ ├── icons.iml
│ │ └── modules.xml
│ ├── LICENSE
│ ├── package.json
│ ├── scripts
│ │ └── generate.mjs
│ ├── src
│ │ ├── components
│ │ │ ├── A.tsx
│ │ │ ├── Admin.tsx
│ │ │ ├── AiAction.tsx
│ │ │ ├── AlertCircle.tsx
│ │ │ ├── AlertTriangle.tsx
│ │ │ ├── Anthropic.tsx
│ │ │ ├── Apple.tsx
│ │ │ ├── Array.tsx
│ │ │ ├── ArrowDown.tsx
│ │ │ ├── ArrowLeft.tsx
│ │ │ ├── ArrowRight.tsx
│ │ │ ├── ArrowUp.tsx
│ │ │ ├── ArrowUpDown.tsx
│ │ │ ├── ArrowUpRight.tsx
│ │ │ ├── Audio.tsx
│ │ │ ├── Azure.tsx
│ │ │ ├── BarChart2.tsx
│ │ │ ├── Bell.tsx
│ │ │ ├── Boolean.tsx
│ │ │ ├── Building2.tsx
│ │ │ ├── Calendar.tsx
│ │ │ ├── Check.tsx
│ │ │ ├── CheckCircle2.tsx
│ │ │ ├── CheckSquare.tsx
│ │ │ ├── Checked.tsx
│ │ │ ├── ChevronDown.tsx
│ │ │ ├── ChevronLeft.tsx
│ │ │ ├── ChevronRight.tsx
│ │ │ ├── ChevronUp.tsx
│ │ │ ├── ChevronsLeft.tsx
│ │ │ ├── ChevronsRight.tsx
│ │ │ ├── ChevronsUpDown.tsx
│ │ │ ├── Circle.tsx
│ │ │ ├── ClipboardList.tsx
│ │ │ ├── Clock4.tsx
│ │ │ ├── Code.tsx
│ │ │ ├── Code2.tsx
│ │ │ ├── Cohere.tsx
│ │ │ ├── Component.tsx
│ │ │ ├── Condition.tsx
│ │ │ ├── Copy.tsx
│ │ │ ├── CreateRecord.tsx
│ │ │ ├── CreditCard.tsx
│ │ │ ├── Database.tsx
│ │ │ ├── DeepThinking.tsx
│ │ │ ├── Deepseek.tsx
│ │ │ ├── DivideCircle.tsx
│ │ │ ├── DivideSquare.tsx
│ │ │ ├── DollarSign.tsx
│ │ │ ├── Download.tsx
│ │ │ ├── DraggableHandle.tsx
│ │ │ ├── Edit.tsx
│ │ │ ├── Expand.tsx
│ │ │ ├── ExpandAll.tsx
│ │ │ ├── Export.tsx
│ │ │ ├── Eye.tsx
│ │ │ ├── EyeOff.tsx
│ │ │ ├── File.tsx
│ │ │ ├── FileAudio.tsx
│ │ │ ├── FileCsv.tsx
│ │ │ ├── FileDocument.tsx
│ │ │ ├── FileExcel.tsx
│ │ │ ├── FileFont.tsx
│ │ │ ├── FileImage.tsx
│ │ │ ├── FileJson.tsx
│ │ │ ├── FilePack.tsx
│ │ │ ├── FilePdf.tsx
│ │ │ ├── FilePresentation.tsx
│ │ │ ├── FileQuestion.tsx
│ │ │ ├── FileScript.tsx
│ │ │ ├── FileSpreadsheet.tsx
│ │ │ ├── FileText.tsx
│ │ │ ├── FileUnknown.tsx
│ │ │ ├── FileVideo.tsx
│ │ │ ├── Filter.tsx
│ │ │ ├── Flame.tsx
│ │ │ ├── FreezeColumn.tsx
│ │ │ ├── Frown.tsx
│ │ │ ├── Gauge.tsx
│ │ │ ├── GetRecord.tsx
│ │ │ ├── Github.tsx
│ │ │ ├── GithubLogo.tsx
│ │ │ ├── GoogleLogo.tsx
│ │ │ ├── Hash.tsx
│ │ │ ├── Heart.tsx
│ │ │ ├── HelpCircle.tsx
│ │ │ ├── History.tsx
│ │ │ ├── Home.tsx
│ │ │ ├── HttpRequest.tsx
│ │ │ ├── Image.tsx
│ │ │ ├── ImageGeneration.tsx
│ │ │ ├── Import.tsx
│ │ │ ├── Inbox.tsx
│ │ │ ├── Integration.tsx
│ │ │ ├── Kanban.tsx
│ │ │ ├── Key.tsx
│ │ │ ├── Layers.tsx
│ │ │ ├── LayoutGrid.tsx
│ │ │ ├── LayoutList.tsx
│ │ │ ├── LayoutTemplate.tsx
│ │ │ ├── License.tsx
│ │ │ ├── Lingyiwanwu.tsx
│ │ │ ├── Link.tsx
│ │ │ ├── ListChecks.tsx
│ │ │ ├── ListOrdered.tsx
│ │ │ ├── Loader2.tsx
│ │ │ ├── Lock.tsx
│ │ │ ├── LongText.tsx
│ │ │ ├── MagicAi.tsx
│ │ │ ├── Mail.tsx
│ │ │ ├── MarkUnread.tsx
│ │ │ ├── Maximize2.tsx
│ │ │ ├── Menu.tsx
│ │ │ ├── MessageSquare.tsx
│ │ │ ├── Minimize2.tsx
│ │ │ ├── Mistral.tsx
│ │ │ ├── Moon.tsx
│ │ │ ├── MoreHorizontal.tsx
│ │ │ ├── Network.tsx
│ │ │ ├── Object.tsx
│ │ │ ├── Ollama.tsx
│ │ │ ├── Openai.tsx
│ │ │ ├── PackageCheck.tsx
│ │ │ ├── PaintBucket.tsx
│ │ │ ├── Pencil.tsx
│ │ │ ├── Percent.tsx
│ │ │ ├── Phone.tsx
│ │ │ ├── Play.tsx
│ │ │ ├── Plus.tsx
│ │ │ ├── PlusCircle.tsx
│ │ │ ├── Puzzle.tsx
│ │ │ ├── Qrcode.tsx
│ │ │ ├── Qwen.tsx
│ │ │ ├── Redo2.tsx
│ │ │ ├── RefreshCcw.tsx
│ │ │ ├── RotateCw.tsx
│ │ │ ├── Search.tsx
│ │ │ ├── SendMail.tsx
│ │ │ ├── Settings.tsx
│ │ │ ├── Share2.tsx
│ │ │ ├── Sheet.tsx
│ │ │ ├── ShieldCheck.tsx
│ │ │ ├── Sidebar.tsx
│ │ │ ├── SortAsc.tsx
│ │ │ ├── Square.tsx
│ │ │ ├── Star.tsx
│ │ │ ├── StretchHorizontal.tsx
│ │ │ ├── Sun.tsx
│ │ │ ├── SunMedium.tsx
│ │ │ ├── Table2.tsx
│ │ │ ├── Teable.tsx
│ │ │ ├── TeableNew.tsx
│ │ │ ├── ThumbsUp.tsx
│ │ │ ├── Translation.tsx
│ │ │ ├── Trash.tsx
│ │ │ ├── Trash2.tsx
│ │ │ ├── Undo2.tsx
│ │ │ ├── UpdateRecord.tsx
│ │ │ ├── User.tsx
│ │ │ ├── UserEdit.tsx
│ │ │ ├── UserPlus.tsx
│ │ │ ├── Users.tsx
│ │ │ ├── Video.tsx
│ │ │ ├── Webhook.tsx
│ │ │ ├── X.tsx
│ │ │ ├── Xai.tsx
│ │ │ ├── Zap.tsx
│ │ │ ├── Zhipu.tsx
│ │ │ ├── ZoomIn.tsx
│ │ │ └── ZoomOut.tsx
│ │ └── index.ts
│ ├── tsconfig.eslint.json
│ └── tsconfig.json
├── openapi
│ ├── .eslintrc.cjs
│ ├── .gitignore
│ ├── .idea
│ │ ├── modules.xml
│ │ └── openapi.iml
│ ├── LICENSE
│ ├── lint-staged.config.js
│ ├── package.json
│ ├── src
│ │ ├── access-token
│ │ │ ├── create.ts
│ │ │ ├── delete.ts
│ │ │ ├── get.ts
│ │ │ ├── index.ts
│ │ │ ├── list.ts
│ │ │ ├── refresh.ts
│ │ │ ├── types.ts
│ │ │ └── update.ts
│ │ ├── admin
│ │ │ ├── index.ts
│ │ │ ├── plugin
│ │ │ │ ├── index.ts
│ │ │ │ ├── publish.ts
│ │ │ │ └── unpublish.ts
│ │ │ └── setting
│ │ │ │ ├── get-public.ts
│ │ │ │ ├── get.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── update.ts
│ │ │ │ └── upload-logo.ts
│ │ ├── aggregation
│ │ │ ├── get-aggregation.ts
│ │ │ ├── get-calendar-daily-collection.ts
│ │ │ ├── get-group-points.ts
│ │ │ ├── get-row-count.ts
│ │ │ ├── get-search-by-index.ts
│ │ │ ├── get-search-count.ts
│ │ │ ├── get-task-status-collection.ts
│ │ │ ├── index.ts
│ │ │ └── type.ts
│ │ ├── ai
│ │ │ ├── generate-stream.ts
│ │ │ ├── get-config.ts
│ │ │ └── index.ts
│ │ ├── attachment
│ │ │ ├── index.ts
│ │ │ ├── notify.ts
│ │ │ ├── read-file.ts
│ │ │ ├── signature.ts
│ │ │ └── upload-file.ts
│ │ ├── auth
│ │ │ ├── add-password.ts
│ │ │ ├── change-email.ts
│ │ │ ├── change-password.ts
│ │ │ ├── index.ts
│ │ │ ├── reset-password.ts
│ │ │ ├── send-change-email-code.ts
│ │ │ ├── send-reset-password-email.ts
│ │ │ ├── send-signup-verification-code.ts
│ │ │ ├── signin.ts
│ │ │ ├── signout.ts
│ │ │ ├── signup.ts
│ │ │ ├── temp-token.ts
│ │ │ ├── types.ts
│ │ │ ├── user-me.ts
│ │ │ └── user.ts
│ │ ├── axios.ts
│ │ ├── base
│ │ │ ├── all-list.ts
│ │ │ ├── collaborator-add.ts
│ │ │ ├── collaborator-delete.ts
│ │ │ ├── collaborator-get-list-user.ts
│ │ │ ├── collaborator-get-list.ts
│ │ │ ├── collaborator-update.ts
│ │ │ ├── create-from-template.ts
│ │ │ ├── create.ts
│ │ │ ├── delete.ts
│ │ │ ├── duplicate.ts
│ │ │ ├── export.ts
│ │ │ ├── get-permission.ts
│ │ │ ├── get-shared-base.ts
│ │ │ ├── get.ts
│ │ │ ├── import.ts
│ │ │ ├── index.ts
│ │ │ ├── invitation-create-link.ts
│ │ │ ├── invitation-delete-link.ts
│ │ │ ├── invitation-email.ts
│ │ │ ├── invitation-get-link-list.ts
│ │ │ ├── invitation-update-link.ts
│ │ │ ├── move.ts
│ │ │ ├── permanent-delete.ts
│ │ │ ├── query-data
│ │ │ │ ├── index.ts
│ │ │ │ ├── route.ts
│ │ │ │ └── types.ts
│ │ │ ├── update-order.ts
│ │ │ └── update.ts
│ │ ├── billing
│ │ │ ├── index.ts
│ │ │ └── subscription
│ │ │ │ ├── get-subscription-summary-list.ts
│ │ │ │ ├── get-subscription-summary.ts
│ │ │ │ └── index.ts
│ │ ├── chat
│ │ │ ├── chat-delete.ts
│ │ │ ├── chat-rename.ts
│ │ │ ├── get-messages.ts
│ │ │ ├── history.ts
│ │ │ ├── index.ts
│ │ │ └── types.ts
│ │ ├── comment
│ │ │ ├── create.ts
│ │ │ ├── delete.ts
│ │ │ ├── get-attachment-url.ts
│ │ │ ├── get-count.ts
│ │ │ ├── get-counts-by-query.ts
│ │ │ ├── get-list.ts
│ │ │ ├── get.ts
│ │ │ ├── index.ts
│ │ │ ├── reaction
│ │ │ │ ├── constant.ts
│ │ │ │ ├── create-reaction.ts
│ │ │ │ ├── delete-reaction.ts
│ │ │ │ └── index.ts
│ │ │ ├── subscribe
│ │ │ │ ├── create-subscribe.ts
│ │ │ │ ├── delete-subscribe.ts
│ │ │ │ ├── get-subscribe.ts
│ │ │ │ └── index.ts
│ │ │ ├── types.ts
│ │ │ └── update.ts
│ │ ├── dashboard
│ │ │ ├── create.ts
│ │ │ ├── delete.ts
│ │ │ ├── duplicate-installed.ts
│ │ │ ├── duplicate.ts
│ │ │ ├── get-list.ts
│ │ │ ├── get.ts
│ │ │ ├── index.ts
│ │ │ ├── plugin-get.ts
│ │ │ ├── plugin-install.ts
│ │ │ ├── plugin-remove.ts
│ │ │ ├── plugin-rename.ts
│ │ │ ├── plugin-update-storage.ts
│ │ │ ├── rename.ts
│ │ │ ├── types.ts
│ │ │ └── update-layout.ts
│ │ ├── db-connection
│ │ │ ├── create.ts
│ │ │ ├── delete.ts
│ │ │ ├── get.ts
│ │ │ └── index.ts
│ │ ├── export
│ │ │ ├── export-csv.ts
│ │ │ └── index.ts
│ │ ├── field
│ │ │ ├── auto-fill-field.ts
│ │ │ ├── convert.ts
│ │ │ ├── create.ts
│ │ │ ├── delete-list.ts
│ │ │ ├── delete.ts
│ │ │ ├── duplicate.ts
│ │ │ ├── filter-link-records.ts
│ │ │ ├── get-list.ts
│ │ │ ├── get.ts
│ │ │ ├── index.ts
│ │ │ ├── stop-fill-field.ts
│ │ │ └── update.ts
│ │ ├── generate.schema.ts
│ │ ├── import
│ │ │ ├── analyze.ts
│ │ │ ├── constant.ts
│ │ │ ├── import-table.ts
│ │ │ ├── index.ts
│ │ │ ├── inplace-import-table.ts
│ │ │ └── types.ts
│ │ ├── index.ts
│ │ ├── integrity
│ │ │ ├── index.ts
│ │ │ ├── link-check.ts
│ │ │ └── link-fix.ts
│ │ ├── invitation
│ │ │ ├── accept.ts
│ │ │ └── index.ts
│ │ ├── notification
│ │ │ ├── get-list.ts
│ │ │ ├── index.ts
│ │ │ ├── read-all.ts
│ │ │ ├── unread-count.ts
│ │ │ └── update-status.ts
│ │ ├── oauth
│ │ │ ├── authorized-list.ts
│ │ │ ├── create.ts
│ │ │ ├── decision-info.ts
│ │ │ ├── delete.ts
│ │ │ ├── get-list.ts
│ │ │ ├── get.ts
│ │ │ ├── index.ts
│ │ │ ├── revoke.ts
│ │ │ ├── secret-delete.ts
│ │ │ ├── secret-generate.ts
│ │ │ └── update.ts
│ │ ├── openapi-snippet
│ │ │ ├── index.js
│ │ │ └── openapi-to-har.js
│ │ ├── organization
│ │ │ ├── departments.ts
│ │ │ ├── get-me.ts
│ │ │ ├── index.ts
│ │ │ └── user-get.ts
│ │ ├── pin
│ │ │ ├── add.ts
│ │ │ ├── delete.ts
│ │ │ ├── get-list.ts
│ │ │ ├── index.ts
│ │ │ ├── types.ts
│ │ │ └── update-order.ts
│ │ ├── plan
│ │ │ ├── index.ts
│ │ │ ├── plan-convert.ts
│ │ │ ├── plan-create.ts
│ │ │ └── plan.ts
│ │ ├── plugin-context-menu
│ │ │ ├── index.ts
│ │ │ ├── plugin-get-list.ts
│ │ │ ├── plugin-get-storage.ts
│ │ │ ├── plugin-get.ts
│ │ │ ├── plugin-install.ts
│ │ │ ├── plugin-move.ts
│ │ │ ├── plugin-remove.ts
│ │ │ ├── plugin-rename.ts
│ │ │ └── plugin-update-storage.ts
│ │ ├── plugin-panel
│ │ │ ├── create.ts
│ │ │ ├── delete.ts
│ │ │ ├── duplicate-panel-installed.ts
│ │ │ ├── duplicate.ts
│ │ │ ├── get.ts
│ │ │ ├── index.ts
│ │ │ ├── list.ts
│ │ │ ├── plugin-get.ts
│ │ │ ├── plugin-install.ts
│ │ │ ├── plugin-remove.ts
│ │ │ ├── plugin-rename.ts
│ │ │ ├── plugin-update-storage.ts
│ │ │ ├── rename.ts
│ │ │ └── update-layout.ts
│ │ ├── plugin
│ │ │ ├── create.ts
│ │ │ ├── delete.ts
│ │ │ ├── get-auth-code.ts
│ │ │ ├── get-center-list.ts
│ │ │ ├── get-list.ts
│ │ │ ├── get-token.ts
│ │ │ ├── get.ts
│ │ │ ├── index.ts
│ │ │ ├── refresh-token.ts
│ │ │ ├── regenerate-secret.ts
│ │ │ ├── submit.ts
│ │ │ ├── types.ts
│ │ │ ├── unpublish.ts
│ │ │ └── update.ts
│ │ ├── record
│ │ │ ├── README.ts
│ │ │ ├── auto-fill-cell.ts
│ │ │ ├── create.ts
│ │ │ ├── delete-list.ts
│ │ │ ├── delete.ts
│ │ │ ├── duplicate.ts
│ │ │ ├── get-list.ts
│ │ │ ├── get-record-history.ts
│ │ │ ├── get-record-list-history.ts
│ │ │ ├── get-record-status.ts
│ │ │ ├── get.ts
│ │ │ ├── index.ts
│ │ │ ├── record.schema.spec.ts
│ │ │ ├── update-records.ts
│ │ │ ├── update.ts
│ │ │ └── upload-attachment.ts
│ │ ├── selection
│ │ │ ├── clear.ts
│ │ │ ├── copy.ts
│ │ │ ├── delete.ts
│ │ │ ├── index.ts
│ │ │ ├── paste.ts
│ │ │ ├── range.ts
│ │ │ └── temporary-paste.ts
│ │ ├── share
│ │ │ ├── index.ts
│ │ │ ├── view-aggregations.ts
│ │ │ ├── view-auth.ts
│ │ │ ├── view-calendar-daily-collection.ts
│ │ │ ├── view-collaborators.ts
│ │ │ ├── view-copy.ts
│ │ │ ├── view-form-submit.ts
│ │ │ ├── view-get.ts
│ │ │ ├── view-group-points.ts
│ │ │ ├── view-link-records.ts
│ │ │ ├── view-row-count.ts
│ │ │ ├── view-search-count.ts
│ │ │ └── view-search-index.ts
│ │ ├── space
│ │ │ ├── collaborator-add.ts
│ │ │ ├── collaborator-delete.ts
│ │ │ ├── collaborator-get-list.ts
│ │ │ ├── collaborator-update.ts
│ │ │ ├── create.ts
│ │ │ ├── delete.ts
│ │ │ ├── get-base-list.ts
│ │ │ ├── get-list.ts
│ │ │ ├── get.ts
│ │ │ ├── index.ts
│ │ │ ├── integration-create.ts
│ │ │ ├── integration-delete.ts
│ │ │ ├── integration-get-list.ts
│ │ │ ├── integration-update.ts
│ │ │ ├── invitation-create-link.ts
│ │ │ ├── invitation-delete-link.ts
│ │ │ ├── invitation-email.ts
│ │ │ ├── invitation-get-link-list.ts
│ │ │ ├── invitation-update-link.ts
│ │ │ ├── permanent-delete.ts
│ │ │ ├── types.ts
│ │ │ └── update.ts
│ │ ├── table
│ │ │ ├── create.ts
│ │ │ ├── default-view-id.ts
│ │ │ ├── delete.ts
│ │ │ ├── duplicate.ts
│ │ │ ├── get-abnormal-index.ts
│ │ │ ├── get-activated-index.ts
│ │ │ ├── get-list.ts
│ │ │ ├── get-permission.ts
│ │ │ ├── get.ts
│ │ │ ├── index.ts
│ │ │ ├── permanent-delete.ts
│ │ │ ├── repair-table-index.ts
│ │ │ ├── toggle-table-index.ts
│ │ │ ├── update-db-table-name.ts
│ │ │ ├── update-description.ts
│ │ │ ├── update-icon.ts
│ │ │ ├── update-name.ts
│ │ │ └── update-order.ts
│ │ ├── template
│ │ │ ├── category
│ │ │ │ ├── create.ts
│ │ │ │ ├── delete.ts
│ │ │ │ ├── get-published.ts
│ │ │ │ ├── get.ts
│ │ │ │ ├── index.ts
│ │ │ │ └── update.ts
│ │ │ ├── create-snapshot.ts
│ │ │ ├── create.ts
│ │ │ ├── delete.ts
│ │ │ ├── get-published.ts
│ │ │ ├── get-template-detail.ts
│ │ │ ├── get.ts
│ │ │ ├── index.ts
│ │ │ ├── pin-top.ts
│ │ │ └── update.ts
│ │ ├── trash
│ │ │ ├── get-items.ts
│ │ │ ├── get.ts
│ │ │ ├── index.ts
│ │ │ ├── reset-items.ts
│ │ │ └── restore.ts
│ │ ├── types.ts
│ │ ├── undo-redo
│ │ │ ├── index.ts
│ │ │ ├── redo.ts
│ │ │ └── undo.ts
│ │ ├── usage
│ │ │ ├── get-base-usage.ts
│ │ │ ├── get-instance-usage.ts
│ │ │ ├── get-space-usage.ts
│ │ │ └── index.ts
│ │ ├── user
│ │ │ ├── index.ts
│ │ │ ├── last-visit
│ │ │ │ ├── get.ts
│ │ │ │ ├── getMap.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── list-base.ts
│ │ │ │ └── update.ts
│ │ │ ├── update-avatar.ts
│ │ │ ├── update-name.ts
│ │ │ └── update-notify-meta.ts
│ │ ├── utils.ts
│ │ ├── view
│ │ │ ├── create.ts
│ │ │ ├── delete.ts
│ │ │ ├── filter-link-records.ts
│ │ │ ├── get-list.ts
│ │ │ ├── get.ts
│ │ │ ├── index.ts
│ │ │ ├── manual-sort.ts
│ │ │ ├── plugin-get.ts
│ │ │ ├── plugin-install.ts
│ │ │ ├── plugin-update-storage.ts
│ │ │ ├── refresh-share-id.ts
│ │ │ ├── share-disable.ts
│ │ │ ├── share-enable.ts
│ │ │ ├── update-description.ts
│ │ │ ├── update-fields-column-meta.ts
│ │ │ ├── update-filter.ts
│ │ │ ├── update-group.ts
│ │ │ ├── update-locked.ts
│ │ │ ├── update-name.ts
│ │ │ ├── update-options.ts
│ │ │ ├── update-order.ts
│ │ │ ├── update-record-order.ts
│ │ │ ├── update-share-meta.ts
│ │ │ └── update-sort.ts
│ │ └── zod.ts
│ ├── tsconfig.build.json
│ ├── tsconfig.eslint.json
│ ├── tsconfig.json
│ ├── vitest.config.ts
│ └── vitest.setup.js
├── sdk
│ ├── .eslintrc.cjs
│ ├── .gitignore
│ ├── .idea
│ │ ├── modules.xml
│ │ └── sdk.iml
│ ├── LICENSE
│ ├── components.json
│ ├── config
│ │ └── tests
│ │ │ └── setupVitest.ts
│ ├── lint-staged.config.js
│ ├── package.json
│ ├── plate-components.json
│ ├── src
│ │ ├── components
│ │ │ ├── FileZone.tsx
│ │ │ ├── base-query
│ │ │ │ ├── FormItem.tsx
│ │ │ │ ├── QueryBuilder.tsx
│ │ │ │ ├── QueryEditor.tsx
│ │ │ │ ├── QueryEditorContainer.tsx
│ │ │ │ ├── QueryFom.tsx
│ │ │ │ ├── QueryOperators.tsx
│ │ │ │ ├── common
│ │ │ │ │ ├── ContextColumnCommand.tsx
│ │ │ │ │ ├── ContextColumnSelector.tsx
│ │ │ │ │ ├── NewPopover.tsx
│ │ │ │ │ └── useAllColumns.ts
│ │ │ │ ├── constant.ts
│ │ │ │ ├── context
│ │ │ │ │ ├── QueryEditorContext.tsx
│ │ │ │ │ ├── QueryEditorProvider.tsx
│ │ │ │ │ ├── QueryFormContext.tsx
│ │ │ │ │ └── QueryFormProvider.tsx
│ │ │ │ ├── editors
│ │ │ │ │ ├── QueryAggregation.tsx
│ │ │ │ │ ├── QueryFilter
│ │ │ │ │ │ ├── FieldComponent.tsx
│ │ │ │ │ │ ├── OperatorComponent.tsx
│ │ │ │ │ │ ├── QueryFilter.tsx
│ │ │ │ │ │ ├── ValueComponent.tsx
│ │ │ │ │ │ └── types.ts
│ │ │ │ │ ├── QueryGroup.tsx
│ │ │ │ │ ├── QueryJoin.tsx
│ │ │ │ │ ├── QueryOrder.tsx
│ │ │ │ │ ├── QuerySelect.tsx
│ │ │ │ │ └── types.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── query-from
│ │ │ │ │ ├── QueryFrom.tsx
│ │ │ │ │ ├── QueryFromValue.tsx
│ │ │ │ │ └── useQueryFromTableValidation.ts
│ │ │ │ ├── useQueryContext.ts
│ │ │ │ └── useQueryOperatorsStatic.ts
│ │ │ ├── billing
│ │ │ │ └── store
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── usage-limit-modal.ts
│ │ │ ├── cell-value-editor
│ │ │ │ ├── CellEditor.tsx
│ │ │ │ ├── CellEditorMain.tsx
│ │ │ │ ├── index.ts
│ │ │ │ └── type.ts
│ │ │ ├── cell-value
│ │ │ │ ├── CellValue.tsx
│ │ │ │ ├── cell-attachment
│ │ │ │ │ ├── CellAttachment.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ ├── cell-checkbox
│ │ │ │ │ ├── CellCheckbox.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ ├── cell-date
│ │ │ │ │ ├── CellDate.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ ├── cell-link
│ │ │ │ │ ├── CellLink.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ ├── cell-number
│ │ │ │ │ ├── CellNumber.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ ├── cell-rating
│ │ │ │ │ ├── CellRating.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ ├── cell-select
│ │ │ │ │ ├── CellSelect.tsx
│ │ │ │ │ ├── SelectTag.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ ├── cell-text
│ │ │ │ │ ├── CellText.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ ├── cell-user
│ │ │ │ │ ├── CellUser.tsx
│ │ │ │ │ ├── UserAvatar.tsx
│ │ │ │ │ ├── UserTag.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ ├── components
│ │ │ │ │ ├── OverflowTooltip.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ ├── hooks
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── useTagVisibility.ts
│ │ │ │ ├── index.ts
│ │ │ │ └── type.ts
│ │ │ ├── collaborator
│ │ │ │ ├── CollaboratorWithHoverCard.tsx
│ │ │ │ └── index.ts
│ │ │ ├── color
│ │ │ │ ├── Color.tsx
│ │ │ │ └── index.ts
│ │ │ ├── comment
│ │ │ │ ├── CommentHeader.tsx
│ │ │ │ ├── CommentPanel.tsx
│ │ │ │ ├── comment-editor
│ │ │ │ │ ├── CommentEditor.tsx
│ │ │ │ │ ├── CommentQuote.tsx
│ │ │ │ │ ├── Editor.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── transform.tsx
│ │ │ │ ├── comment-list
│ │ │ │ │ ├── CommentContent.tsx
│ │ │ │ │ ├── CommentItem.tsx
│ │ │ │ │ ├── CommentList.tsx
│ │ │ │ │ ├── CommentSkeleton.tsx
│ │ │ │ │ ├── context.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── node
│ │ │ │ │ │ ├── block-element
│ │ │ │ │ │ │ ├── Image.tsx
│ │ │ │ │ │ │ ├── Paragraph.tsx
│ │ │ │ │ │ │ └── index.ts
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── inline-element
│ │ │ │ │ │ │ ├── Link.tsx
│ │ │ │ │ │ │ ├── MentionUser.tsx
│ │ │ │ │ │ │ └── index.ts
│ │ │ │ │ │ └── type.ts
│ │ │ │ │ ├── reaction
│ │ │ │ │ │ ├── Reaction.tsx
│ │ │ │ │ │ ├── ReactionPicker.tsx
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── useCommentPatchListener.ts
│ │ │ │ │ └── useIsMe.ts
│ │ │ │ ├── context.ts
│ │ │ │ ├── hooks
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── useBaseId.ts
│ │ │ │ │ ├── useRecordCommentCount.ts
│ │ │ │ │ └── useRecordId.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── types.ts
│ │ │ │ └── useCommentStore.ts
│ │ │ ├── create-record
│ │ │ │ ├── CreateRecordModal.tsx
│ │ │ │ └── index.ts
│ │ │ ├── editor
│ │ │ │ ├── attachment
│ │ │ │ │ ├── Editor.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── upload-attachment
│ │ │ │ │ │ ├── AttachmentItem.tsx
│ │ │ │ │ │ ├── FileInput.tsx
│ │ │ │ │ │ ├── UploadAttachment.tsx
│ │ │ │ │ │ └── uploadManage.ts
│ │ │ │ │ └── utils.ts
│ │ │ │ ├── checkbox
│ │ │ │ │ ├── Editor.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ ├── date
│ │ │ │ │ ├── Editor.tsx
│ │ │ │ │ ├── EditorMain.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── utils.ts
│ │ │ │ ├── formula
│ │ │ │ │ ├── Editor.tsx
│ │ │ │ │ ├── components
│ │ │ │ │ │ ├── AiPromptContainer.tsx
│ │ │ │ │ │ ├── CodeEditor.tsx
│ │ │ │ │ │ ├── FunctionGuide.tsx
│ │ │ │ │ │ ├── FunctionHelper.tsx
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── constants.ts
│ │ │ │ │ ├── extensions
│ │ │ │ │ │ ├── ai.ts
│ │ │ │ │ │ ├── autocomplete.ts
│ │ │ │ │ │ ├── history.ts
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── theme.ts
│ │ │ │ │ │ ├── token.ts
│ │ │ │ │ │ └── variable.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── interface.ts
│ │ │ │ │ └── visitor.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── link
│ │ │ │ │ ├── Editor.tsx
│ │ │ │ │ ├── EditorMain.tsx
│ │ │ │ │ ├── LinkCard.tsx
│ │ │ │ │ ├── LinkList.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── interface.ts
│ │ │ │ ├── long-text
│ │ │ │ │ ├── Editor.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ ├── number
│ │ │ │ │ ├── Editor.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ ├── rating
│ │ │ │ │ ├── Editor.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ ├── select
│ │ │ │ │ ├── Editor.tsx
│ │ │ │ │ ├── EditorMain.tsx
│ │ │ │ │ ├── components
│ │ │ │ │ │ ├── OptionList.tsx
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── text
│ │ │ │ │ ├── Editor.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── utils.ts
│ │ │ │ ├── type.ts
│ │ │ │ └── user
│ │ │ │ │ ├── Editor.tsx
│ │ │ │ │ ├── EditorBase.tsx
│ │ │ │ │ ├── EditorMain.tsx
│ │ │ │ │ ├── UserOption.tsx
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ └── types.ts
│ │ │ ├── expand-record
│ │ │ │ ├── CellEditorWrap.tsx
│ │ │ │ ├── ExpandRecord.tsx
│ │ │ │ ├── ExpandRecordHeader.tsx
│ │ │ │ ├── ExpandRecordWrap.tsx
│ │ │ │ ├── ExpandRecorder.tsx
│ │ │ │ ├── Modal.tsx
│ │ │ │ ├── ModalContext.ts
│ │ │ │ ├── Panel.tsx
│ │ │ │ ├── RecordEditor.tsx
│ │ │ │ ├── RecordEditorItem.tsx
│ │ │ │ ├── RecordHistory.tsx
│ │ │ │ ├── TooltipWrap.tsx
│ │ │ │ ├── components
│ │ │ │ │ ├── CopyButton.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── type.ts
│ │ │ │ └── useModalRefElement.ts
│ │ │ ├── field
│ │ │ │ ├── FieldCommand.tsx
│ │ │ │ ├── FieldSelector.tsx
│ │ │ │ └── index.ts
│ │ │ ├── filter
│ │ │ │ ├── BaseFilter.tsx
│ │ │ │ ├── condition
│ │ │ │ │ ├── Condition.tsx
│ │ │ │ │ ├── Conjunction.tsx
│ │ │ │ │ ├── ConjunctionSelect.tsx
│ │ │ │ │ ├── condition-item
│ │ │ │ │ │ ├── ConditionGroup.tsx
│ │ │ │ │ │ ├── ConditionItem.tsx
│ │ │ │ │ │ ├── base-component
│ │ │ │ │ │ │ ├── FieldSelect.tsx
│ │ │ │ │ │ │ ├── FieldValue.tsx
│ │ │ │ │ │ │ ├── OperatorSelect.tsx
│ │ │ │ │ │ │ └── index.ts
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ └── index.ts
│ │ │ │ ├── context.ts
│ │ │ │ ├── filter-with-table
│ │ │ │ │ ├── FilterWithTable.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ ├── hooks
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── useCallbackRef.ts
│ │ │ │ │ ├── useComponent.ts
│ │ │ │ │ ├── useControllableState.ts
│ │ │ │ │ ├── useCrud.ts
│ │ │ │ │ └── useDepth.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── types.ts
│ │ │ │ └── view-filter
│ │ │ │ │ ├── BaseViewFilter.tsx
│ │ │ │ │ ├── ViewFilter.tsx
│ │ │ │ │ ├── component
│ │ │ │ │ ├── DefaultErrorLabel.tsx
│ │ │ │ │ ├── FileTypeSelect.tsx
│ │ │ │ │ ├── FilterCheckBox.tsx
│ │ │ │ │ ├── FilterInput.tsx
│ │ │ │ │ ├── FilterMultipleSelect.tsx
│ │ │ │ │ ├── FilterSingleSelect.tsx
│ │ │ │ │ ├── FilterUserSelect.tsx
│ │ │ │ │ ├── base
│ │ │ │ │ │ ├── BaseMultipleSelect.tsx
│ │ │ │ │ │ ├── BaseSingleSelect.tsx
│ │ │ │ │ │ ├── __tests__
│ │ │ │ │ │ │ ├── BaseMultipleSelect.test.tsx
│ │ │ │ │ │ │ └── BaseSingleSelect.test.tsx
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── types.ts
│ │ │ │ │ ├── filter-link
│ │ │ │ │ │ ├── DefaultList.tsx
│ │ │ │ │ │ ├── DefaultTrigger.tsx
│ │ │ │ │ │ ├── FilterLink.tsx
│ │ │ │ │ │ ├── FilterLinkInput.tsx
│ │ │ │ │ │ ├── FilterLinkSelect.tsx
│ │ │ │ │ │ ├── StandDefaultList.tsx
│ │ │ │ │ │ ├── constant.ts
│ │ │ │ │ │ ├── context.ts
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── storage.ts
│ │ │ │ │ │ └── types.ts
│ │ │ │ │ ├── filterDatePicker
│ │ │ │ │ │ ├── DatePicker.tsx
│ │ │ │ │ │ ├── FilterDatePicker.tsx
│ │ │ │ │ │ ├── constant.ts
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ └── index.ts
│ │ │ │ │ ├── constant.ts
│ │ │ │ │ ├── context.ts
│ │ │ │ │ ├── custom-component
│ │ │ │ │ ├── BaseFieldValue.tsx
│ │ │ │ │ ├── FieldSelect.tsx
│ │ │ │ │ ├── FieldValue.tsx
│ │ │ │ │ ├── OperatorSelect.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ │ ├── hooks
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── useDateI18nMap.ts
│ │ │ │ │ ├── useFieldFilterLinkContext.ts
│ │ │ │ │ ├── useFields.ts
│ │ │ │ │ ├── useFilterNode.ts
│ │ │ │ │ ├── useOperatorI18nMap.ts
│ │ │ │ │ ├── useOperators.ts
│ │ │ │ │ ├── useViewFilterContext.ts
│ │ │ │ │ └── useViewFilterLinkContext.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── type-guard.ts
│ │ │ │ │ ├── types.ts
│ │ │ │ │ └── utils.ts
│ │ │ ├── grid-enhancements
│ │ │ │ ├── components
│ │ │ │ │ ├── grid-tooltip
│ │ │ │ │ │ ├── GridTooltip.tsx
│ │ │ │ │ │ ├── grid-tooltip.ts
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── row-counter
│ │ │ │ │ │ ├── RowCounter.tsx
│ │ │ │ │ │ └── index.ts
│ │ │ │ ├── editor
│ │ │ │ │ ├── GridAttachmentEditor.tsx
│ │ │ │ │ ├── GridDateEditor.tsx
│ │ │ │ │ ├── GridFilePreviewer.tsx
│ │ │ │ │ ├── GridLinkEditor.tsx
│ │ │ │ │ ├── GridNumberEditor.tsx
│ │ │ │ │ ├── GridSelectEditor.tsx
│ │ │ │ │ ├── GridUserEditor.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── type.ts
│ │ │ │ ├── hooks
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── use-grid-async-records.ts
│ │ │ │ │ ├── use-grid-collapsed-group.ts
│ │ │ │ │ ├── use-grid-column-order.ts
│ │ │ │ │ ├── use-grid-column-resize.ts
│ │ │ │ │ ├── use-grid-column-statistics.ts
│ │ │ │ │ ├── use-grid-columns.tsx
│ │ │ │ │ ├── use-grid-file-event.ts
│ │ │ │ │ ├── use-grid-group-collection.ts
│ │ │ │ │ ├── use-grid-icons.ts
│ │ │ │ │ ├── use-grid-popup-position.tsx
│ │ │ │ │ ├── use-grid-prefilling-row.ts
│ │ │ │ │ ├── use-grid-row-order.ts
│ │ │ │ │ ├── use-grid-selection.ts
│ │ │ │ │ └── use-grid-theme.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── store
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── type.ts
│ │ │ │ │ ├── useGridCollapsedGroupStore.ts
│ │ │ │ │ └── useGridViewStore.ts
│ │ │ │ └── utils
│ │ │ │ │ ├── generate-id.ts
│ │ │ │ │ ├── group-value.ts
│ │ │ │ │ ├── image-handler.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── persist-editing.ts
│ │ │ ├── grid
│ │ │ │ ├── CellScroller.tsx
│ │ │ │ ├── Grid.tsx
│ │ │ │ ├── InfiniteScroller.tsx
│ │ │ │ ├── InteractionLayer.tsx
│ │ │ │ ├── RenderLayer.tsx
│ │ │ │ ├── TouchLayer.tsx
│ │ │ │ ├── components
│ │ │ │ │ ├── LoadingIndicator.tsx
│ │ │ │ │ ├── editor
│ │ │ │ │ │ ├── BooleanEditor.tsx
│ │ │ │ │ │ ├── EditorContainer.tsx
│ │ │ │ │ │ ├── RatingEditor.tsx
│ │ │ │ │ │ ├── SelectEditor.tsx
│ │ │ │ │ │ ├── TextEditor.tsx
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ └── index.ts
│ │ │ │ ├── configs
│ │ │ │ │ ├── grid.ts
│ │ │ │ │ ├── gridTheme.ts
│ │ │ │ │ └── index.ts
│ │ │ │ ├── hooks
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── useAutoScroll.ts
│ │ │ │ │ ├── useColumnFreeze.ts
│ │ │ │ │ ├── useColumnResize.ts
│ │ │ │ │ ├── useDrag.ts
│ │ │ │ │ ├── useEventListener.ts
│ │ │ │ │ ├── useKeyboardSelection.ts
│ │ │ │ │ ├── useResizeObserver.ts
│ │ │ │ │ ├── useScrollFrameRate.ts
│ │ │ │ │ ├── useSelection.ts
│ │ │ │ │ └── useVisibleRegion.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── interface.ts
│ │ │ │ ├── managers
│ │ │ │ │ ├── coordinate-manager
│ │ │ │ │ │ ├── Coordinate-manager.spec.ts
│ │ │ │ │ │ ├── CoordinateManager.ts
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── interface.ts
│ │ │ │ │ ├── image-manager
│ │ │ │ │ │ ├── ImageManager.ts
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── performance-tracker
│ │ │ │ │ │ ├── PerformanceTracker.ts
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ ├── selection-manager
│ │ │ │ │ │ ├── CombinedSelection.ts
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ └── sprite-manager
│ │ │ │ │ │ ├── SpriteManager.ts
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── sprites.tsx
│ │ │ │ ├── renderers
│ │ │ │ │ ├── base-renderer
│ │ │ │ │ │ ├── baseRenderer.ts
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ └── interface.ts
│ │ │ │ │ ├── cell-renderer
│ │ │ │ │ │ ├── booleanCellRenderer.ts
│ │ │ │ │ │ ├── chartCellRenderer.ts
│ │ │ │ │ │ ├── imageCellRenderer.ts
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── interface.ts
│ │ │ │ │ │ ├── linkCellRenderer.ts
│ │ │ │ │ │ ├── loadingCellRenderer.ts
│ │ │ │ │ │ ├── numberCellRenderer.ts
│ │ │ │ │ │ ├── ratingCellRenderer.ts
│ │ │ │ │ │ ├── selectCellRenderer.ts
│ │ │ │ │ │ ├── textCellRenderer.ts
│ │ │ │ │ │ ├── userCellRenderer.ts
│ │ │ │ │ │ └── utils.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── layout-renderer
│ │ │ │ │ │ ├── index.ts
│ │ │ │ │ │ ├── interface.ts
│ │ │ │ │ │ └── layoutRenderer.ts
│ │ │ │ └── utils
│ │ │ │ │ ├── element.ts
│ │ │ │ │ ├── group.ts
│ │ │ │ │ ├── hotkey.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── measure.ts
│ │ │ │ │ ├── range.ts
│ │ │ │ │ ├── region.ts
│ │ │ │ │ └── utils.ts
│ │ │ ├── group
│ │ │ │ ├── Group.tsx
│ │ │ │ └── index.ts
│ │ │ ├── hide-fields
│ │ │ │ ├── HideFields.tsx
│ │ │ │ ├── HideFieldsBase.tsx
│ │ │ │ ├── VisibleFields.tsx
│ │ │ │ └── index.ts
│ │ │ ├── hooks
│ │ │ │ ├── index.ts
│ │ │ │ └── useAttachmentPreviewI18Map.ts
│ │ │ ├── index.ts
│ │ │ ├── markdown-editor
│ │ │ │ ├── EditorContainer.tsx
│ │ │ │ ├── MarkDownEditor.tsx
│ │ │ │ ├── MarkDownPreview.tsx
│ │ │ │ └── index.ts
│ │ │ ├── member-selector
│ │ │ │ ├── DepartmentList.tsx
│ │ │ │ ├── DepartmentSelector.tsx
│ │ │ │ ├── MemberContent.tsx
│ │ │ │ ├── MemberSelected.tsx
│ │ │ │ ├── MemberSelectorDialog.tsx
│ │ │ │ ├── SearchInput.tsx
│ │ │ │ ├── components
│ │ │ │ │ ├── DepartmentItem.tsx
│ │ │ │ │ └── UserItem.tsx
│ │ │ │ ├── index.ts
│ │ │ │ ├── types.ts
│ │ │ │ └── use-debounce.ts
│ │ │ ├── plate
│ │ │ │ └── ui
│ │ │ │ │ ├── button.tsx
│ │ │ │ │ ├── hooks
│ │ │ │ │ ├── useMounted.ts
│ │ │ │ │ └── useUploadFile.ts
│ │ │ │ │ ├── image-element.tsx
│ │ │ │ │ ├── image-preview.tsx
│ │ │ │ │ ├── inline-combobox.tsx
│ │ │ │ │ ├── input.tsx
│ │ │ │ │ ├── link-element-static.tsx
│ │ │ │ │ ├── link-element.tsx
│ │ │ │ │ ├── link-floating-toolbar.tsx
│ │ │ │ │ ├── link-toolbar-button.tsx
│ │ │ │ │ ├── media-placeholder-element.tsx
│ │ │ │ │ ├── media-toolbar-button.tsx
│ │ │ │ │ ├── media-upload-toast.tsx
│ │ │ │ │ ├── mention-element-static.tsx
│ │ │ │ │ ├── mention-element.tsx
│ │ │ │ │ ├── mention-input-element.tsx
│ │ │ │ │ ├── paragraph-element.tsx
│ │ │ │ │ ├── popover.tsx
│ │ │ │ │ ├── resize-handle.tsx
│ │ │ │ │ ├── separator.tsx
│ │ │ │ │ ├── toolbar.tsx
│ │ │ │ │ └── tooltip.tsx
│ │ │ ├── record-list
│ │ │ │ ├── ApiRecordList.tsx
│ │ │ │ ├── RecordItem.tsx
│ │ │ │ ├── RecordList.tsx
│ │ │ │ ├── RecordSearch.tsx
│ │ │ │ ├── SocketRecordList.tsx
│ │ │ │ └── index.ts
│ │ │ ├── row-height
│ │ │ │ ├── RowHeight.tsx
│ │ │ │ ├── RowHeightBase.tsx
│ │ │ │ ├── index.ts
│ │ │ │ ├── useFieldNameDisplayLinesNodes.ts
│ │ │ │ ├── useRowHeightNode.ts
│ │ │ │ └── useRowHeightNodes.ts
│ │ │ ├── search
│ │ │ │ ├── SearchInput.tsx
│ │ │ │ └── index.ts
│ │ │ ├── select-field-dialog
│ │ │ │ ├── FieldCreateOrSelectModal.tsx
│ │ │ │ ├── FieldCreator.tsx
│ │ │ │ └── index.ts
│ │ │ ├── sort
│ │ │ │ ├── DraggableSortList.tsx
│ │ │ │ ├── OrderSelect.tsx
│ │ │ │ ├── Sort.tsx
│ │ │ │ ├── SortBase.tsx
│ │ │ │ ├── SortConfig.tsx
│ │ │ │ ├── SortContent.tsx
│ │ │ │ ├── SortFieldAddButton.tsx
│ │ │ │ ├── SortItem.tsx
│ │ │ │ ├── index.ts
│ │ │ │ └── useSortNode.ts
│ │ │ ├── table
│ │ │ │ ├── InfiniteTable.tsx
│ │ │ │ ├── VirtualizedInfiniteTable.tsx
│ │ │ │ └── index.ts
│ │ │ └── view
│ │ │ │ ├── ViewSelect.tsx
│ │ │ │ ├── constant.ts
│ │ │ │ └── index.ts
│ │ ├── config
│ │ │ ├── index.ts
│ │ │ ├── local-storage-keys.ts
│ │ │ └── react-query-keys.ts
│ │ ├── context
│ │ │ ├── __tests__
│ │ │ │ ├── createAppContext.tsx
│ │ │ │ ├── createConnectionContext.tsx
│ │ │ │ └── createSessionContext.tsx
│ │ │ ├── aggregation
│ │ │ │ ├── AggregationContext.ts
│ │ │ │ ├── AggregationProvider.tsx
│ │ │ │ ├── CalendarDailyCollectionContext.ts
│ │ │ │ ├── CalendarDailyCollectionProvider.tsx
│ │ │ │ ├── GroupPointContext.ts
│ │ │ │ ├── GroupPointProvider.tsx
│ │ │ │ ├── RowCountContext.ts
│ │ │ │ ├── RowCountProvider.tsx
│ │ │ │ ├── TaskStatusCollectionContext.ts
│ │ │ │ ├── TaskStatusCollectionProvider.tsx
│ │ │ │ └── index.ts
│ │ │ ├── anchor
│ │ │ │ ├── AnchorContext.ts
│ │ │ │ └── index.ts
│ │ │ ├── app
│ │ │ │ ├── AppContext.ts
│ │ │ │ ├── AppProvider.tsx
│ │ │ │ ├── ConnectionContext.tsx
│ │ │ │ ├── ConnectionProvider.tsx
│ │ │ │ ├── QueryClientProvider.tsx
│ │ │ │ ├── i18n
│ │ │ │ │ ├── const.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── types.ts
│ │ │ │ │ └── useTranslation.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── queryClient.tsx
│ │ │ │ └── useConnection.tsx
│ │ │ ├── base
│ │ │ │ ├── BaseContext.ts
│ │ │ │ ├── BaseProvider.tsx
│ │ │ │ └── index.ts
│ │ │ ├── field
│ │ │ │ ├── FieldContext.ts
│ │ │ │ ├── FieldProvider.tsx
│ │ │ │ └── index.ts
│ │ │ ├── index.ts
│ │ │ ├── notification
│ │ │ │ ├── NotificationContext.ts
│ │ │ │ ├── NotificationProvider.tsx
│ │ │ │ └── index.ts
│ │ │ ├── query
│ │ │ │ ├── LinkFilterContext.ts
│ │ │ │ ├── LinkFilterProvider.tsx
│ │ │ │ ├── SearchContext.ts
│ │ │ │ ├── SearchProvider.tsx
│ │ │ │ └── index.ts
│ │ │ ├── record
│ │ │ │ ├── RecordContext.ts
│ │ │ │ ├── RecordProvider.tsx
│ │ │ │ └── index.ts
│ │ │ ├── session
│ │ │ │ ├── SessionContext.ts
│ │ │ │ ├── SessionProvider.tsx
│ │ │ │ └── index.ts
│ │ │ ├── table-permission
│ │ │ │ ├── TablePermissionContext.ts
│ │ │ │ ├── TablePermissionProvider.tsx
│ │ │ │ └── index.ts
│ │ │ ├── table
│ │ │ │ ├── LinkViewProvider.tsx
│ │ │ │ ├── ShareViewContext.tsx
│ │ │ │ ├── ShareViewProxy.tsx
│ │ │ │ ├── StandaloneViewProvider.tsx
│ │ │ │ ├── TableContext.ts
│ │ │ │ ├── TableProvider.tsx
│ │ │ │ └── index.ts
│ │ │ ├── use-instances
│ │ │ │ ├── index.ts
│ │ │ │ ├── opListener.ts
│ │ │ │ ├── reducer.ts
│ │ │ │ ├── use-instances.spec.tsx
│ │ │ │ └── useInstances.ts
│ │ │ └── view
│ │ │ │ ├── PersonalViewContext.tsx
│ │ │ │ ├── PersonalViewProvider.tsx
│ │ │ │ ├── PersonalViewProxy.tsx
│ │ │ │ ├── ViewContext.ts
│ │ │ │ ├── ViewProvider.tsx
│ │ │ │ ├── index.ts
│ │ │ │ └── store
│ │ │ │ ├── index.ts
│ │ │ │ └── usePersonalViewStore.ts
│ │ ├── hooks
│ │ │ ├── index.ts
│ │ │ ├── use-aggregation.ts
│ │ │ ├── use-ai.ts
│ │ │ ├── use-base-id.ts
│ │ │ ├── use-base-permission.ts
│ │ │ ├── use-base.ts
│ │ │ ├── use-comment-count-map.ts
│ │ │ ├── use-connection.ts
│ │ │ ├── use-deep-compare-memoize.ts
│ │ │ ├── use-field-operations.ts
│ │ │ ├── use-field-permission.ts
│ │ │ ├── use-field-static-getter.ts
│ │ │ ├── use-field.ts
│ │ │ ├── use-fields.ts
│ │ │ ├── use-group-point.ts
│ │ │ ├── use-infinite-records.ts
│ │ │ ├── use-is-hydrated.ts
│ │ │ ├── use-is-mobile.ts
│ │ │ ├── use-is-touch-device.ts
│ │ │ ├── use-lan-dayjs.ts
│ │ │ ├── use-link-filter.ts
│ │ │ ├── use-notification.ts
│ │ │ ├── use-organization.ts
│ │ │ ├── use-permission-actions-static.spec.ts
│ │ │ ├── use-permission-actions-static.ts
│ │ │ ├── use-permission-update-listener.ts
│ │ │ ├── use-personal-view.ts
│ │ │ ├── use-presence.ts
│ │ │ ├── use-record-operations.ts
│ │ │ ├── use-record.ts
│ │ │ ├── use-records.ts
│ │ │ ├── use-row-count.ts
│ │ │ ├── use-search.ts
│ │ │ ├── use-session.ts
│ │ │ ├── use-ssr-record.ts
│ │ │ ├── use-ssr-records.ts
│ │ │ ├── use-table-id.ts
│ │ │ ├── use-table-listener.ts
│ │ │ ├── use-table-permission.ts
│ │ │ ├── use-table.ts
│ │ │ ├── use-tables.ts
│ │ │ ├── use-undo-redo.ts
│ │ │ ├── use-view-id.ts
│ │ │ ├── use-view-listener.ts
│ │ │ ├── use-view.ts
│ │ │ └── use-views.ts
│ │ ├── index.ts
│ │ ├── model
│ │ │ ├── base.ts
│ │ │ ├── field
│ │ │ │ ├── attachment.field.ts
│ │ │ │ ├── auto-number.field.ts
│ │ │ │ ├── checkbox.field.ts
│ │ │ │ ├── created-by.field.ts
│ │ │ │ ├── created-time.field.ts
│ │ │ │ ├── date.field.ts
│ │ │ │ ├── factory.ts
│ │ │ │ ├── field.ts
│ │ │ │ ├── formula.field.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── last-modified-by.field.ts
│ │ │ │ ├── last-modified-time.field.ts
│ │ │ │ ├── link.field.ts
│ │ │ │ ├── long-text.field.ts
│ │ │ │ ├── mixin
│ │ │ │ │ └── select.field.ts
│ │ │ │ ├── multiple-select.field.ts
│ │ │ │ ├── number.field.ts
│ │ │ │ ├── rating.field.ts
│ │ │ │ ├── rollup.field.ts
│ │ │ │ ├── single-line-text.field.ts
│ │ │ │ ├── single-select.field.ts
│ │ │ │ └── user.field.ts
│ │ │ ├── index.ts
│ │ │ ├── record
│ │ │ │ ├── factory.ts
│ │ │ │ ├── index.ts
│ │ │ │ └── record.ts
│ │ │ ├── table
│ │ │ │ ├── factory.ts
│ │ │ │ ├── index.ts
│ │ │ │ └── table.ts
│ │ │ └── view
│ │ │ │ ├── calendar.view.ts
│ │ │ │ ├── factory.ts
│ │ │ │ ├── form.view.ts
│ │ │ │ ├── gallery.view.ts
│ │ │ │ ├── grid.view.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── kanban.view.ts
│ │ │ │ ├── plugin.view.ts
│ │ │ │ └── view.ts
│ │ ├── plugin-bridge
│ │ │ ├── bridge.ts
│ │ │ ├── hooks
│ │ │ │ ├── index.ts
│ │ │ │ └── use-bridge.ts
│ │ │ ├── index.ts
│ │ │ ├── types.ts
│ │ │ └── utils.ts
│ │ ├── store
│ │ │ ├── index.ts
│ │ │ └── use-interaction-mode-store.ts
│ │ └── utils
│ │ │ ├── copy.ts
│ │ │ ├── fieldType.ts
│ │ │ ├── filterWithDefaultValue.ts
│ │ │ ├── index.ts
│ │ │ ├── order.ts
│ │ │ ├── personalView.ts
│ │ │ ├── requestWrap.ts
│ │ │ ├── sprite.tsx
│ │ │ ├── statistic.ts
│ │ │ └── urlParams.ts
│ ├── tailwind.config.js
│ ├── tsconfig.build.json
│ ├── tsconfig.eslint.json
│ ├── tsconfig.json
│ ├── ui.config.d.ts
│ ├── ui.config.js
│ └── vitest.config.ts
└── ui-lib
│ ├── .eslintrc.cjs
│ ├── .gitignore
│ ├── .idea
│ ├── modules.xml
│ └── ui-lib.iml
│ ├── .storybook
│ ├── main.js
│ └── preview.js
│ ├── LICENSE
│ ├── components.json
│ ├── lint-staged.config.js
│ ├── package.json
│ ├── postcss.config.js
│ ├── scripts
│ ├── shadcn-ui.mjs
│ └── update-shadcn-ui.mjs
│ ├── src
│ ├── _stories
│ │ ├── Introduction.stories.mdx
│ │ ├── icons
│ │ │ ├── code-brackets.svg
│ │ │ ├── colors.svg
│ │ │ ├── comments.svg
│ │ │ ├── direction.svg
│ │ │ ├── flow.svg
│ │ │ ├── plugin.svg
│ │ │ ├── repo.svg
│ │ │ └── stackalt.svg
│ │ └── tailwind.css
│ ├── async-message.tsx
│ ├── base
│ │ ├── Error.tsx
│ │ ├── card
│ │ │ └── BasicCard.tsx
│ │ ├── dialog
│ │ │ ├── ConfirmDialog.tsx
│ │ │ └── index.ts
│ │ ├── dnd-kit
│ │ │ └── index.tsx
│ │ ├── file
│ │ │ ├── index.ts
│ │ │ └── preview
│ │ │ │ ├── FilePreview.tsx
│ │ │ │ ├── FilePreviewContent.tsx
│ │ │ │ ├── FilePreviewContext.tsx
│ │ │ │ ├── FilePreviewDialog.tsx
│ │ │ │ ├── FilePreviewItem.tsx
│ │ │ │ ├── FilePreviewProvider.tsx
│ │ │ │ ├── Thumb.tsx
│ │ │ │ ├── audio
│ │ │ │ └── AudioPreview.tsx
│ │ │ │ ├── genFileId.ts
│ │ │ │ ├── getFileIcon.ts
│ │ │ │ ├── image
│ │ │ │ └── ImagePreview.tsx
│ │ │ │ ├── index.tsx
│ │ │ │ ├── office
│ │ │ │ ├── ExcelPreview.tsx
│ │ │ │ ├── WordPreview.tsx
│ │ │ │ └── utils.ts
│ │ │ │ ├── pdf
│ │ │ │ ├── PDFPreview.tsx
│ │ │ │ └── utils.ts
│ │ │ │ ├── utils.ts
│ │ │ │ └── video
│ │ │ │ └── VideoPreview.tsx
│ │ ├── index.ts
│ │ ├── selector
│ │ │ └── Selector.tsx
│ │ └── spin
│ │ │ └── Spin.tsx
│ ├── icons
│ │ ├── app
│ │ │ ├── 3column.svg
│ │ │ ├── add-bold.svg
│ │ │ ├── add-circle.svg
│ │ │ ├── add.svg
│ │ │ ├── adjust.svg
│ │ │ ├── arrow-double-left.svg
│ │ │ ├── arrow-double-right.svg
│ │ │ ├── arrow-down-bold.svg
│ │ │ ├── arrow-down.svg
│ │ │ ├── arrow-left-bold.svg
│ │ │ ├── arrow-left-circle.svg
│ │ │ ├── arrow-right-bold.svg
│ │ │ ├── arrow-right-circle.svg
│ │ │ ├── arrow-right.svg
│ │ │ ├── arrow-up-bold.svg
│ │ │ ├── arrow-up-circle.svg
│ │ │ ├── ashbin.svg
│ │ │ ├── attachment.svg
│ │ │ ├── back.svg
│ │ │ ├── bad.svg
│ │ │ ├── bottom.svg
│ │ │ ├── browse.svg
│ │ │ ├── calendar.svg
│ │ │ ├── camera.svg
│ │ │ ├── caps-lock.svg
│ │ │ ├── chart-bar.svg
│ │ │ ├── chart-pie.svg
│ │ │ ├── check-item.svg
│ │ │ ├── close-bold.svg
│ │ │ ├── close.svg
│ │ │ ├── code.svg
│ │ │ ├── color.svg
│ │ │ ├── column-4.svg
│ │ │ ├── column-horizontal.svg
│ │ │ ├── column-vertical.svg
│ │ │ ├── comment.svg
│ │ │ ├── complete.svg
│ │ │ ├── copy.svg
│ │ │ ├── copy1.svg
│ │ │ ├── cry.svg
│ │ │ ├── customer-service.svg
│ │ │ ├── cut.svg
│ │ │ ├── dashboard.svg
│ │ │ ├── data-view.svg
│ │ │ ├── delete.svg
│ │ │ ├── direction-down-circle.svg
│ │ │ ├── direction-down.svg
│ │ │ ├── direction-left.svg
│ │ │ ├── direction-right.svg
│ │ │ ├── direction-up.svg
│ │ │ ├── discount.svg
│ │ │ ├── download.svg
│ │ │ ├── drag.svg
│ │ │ ├── duplicate.svg
│ │ │ ├── duplicate1.svg
│ │ │ ├── edit.svg
│ │ │ ├── electronics.svg
│ │ │ ├── elipsis.svg
│ │ │ ├── email.svg
│ │ │ ├── error.svg
│ │ │ ├── explain.svg
│ │ │ ├── export.svg
│ │ │ ├── eye-close.svg
│ │ │ ├── fabulous.svg
│ │ │ ├── favorite.svg
│ │ │ ├── field-number.svg
│ │ │ ├── field-select.svg
│ │ │ ├── field-text.svg
│ │ │ ├── file-add.svg
│ │ │ ├── file-common.svg
│ │ │ ├── file-delete.svg
│ │ │ ├── file-open.svg
│ │ │ ├── file.svg
│ │ │ ├── film.svg
│ │ │ ├── filter.svg
│ │ │ ├── folder-close.svg
│ │ │ ├── forward.svg
│ │ │ ├── fullscreen-expand.svg
│ │ │ ├── fullscreen-shrink.svg
│ │ │ ├── good.svg
│ │ │ ├── group.svg
│ │ │ ├── help.svg
│ │ │ ├── hide.svg
│ │ │ ├── history.svg
│ │ │ ├── home.svg
│ │ │ ├── image-text.svg
│ │ │ ├── import.svg
│ │ │ ├── keyboard-26.svg
│ │ │ ├── keyboard-9.svg
│ │ │ ├── layers.svg
│ │ │ ├── layout.svg
│ │ │ ├── link.svg
│ │ │ ├── loading.svg
│ │ │ ├── lock.svg
│ │ │ ├── map.svg
│ │ │ ├── meh.svg
│ │ │ ├── menu.svg
│ │ │ ├── mic.svg
│ │ │ ├── minus-bold.svg
│ │ │ ├── minus-circle.svg
│ │ │ ├── minus.svg
│ │ │ ├── mobile-phone.svg
│ │ │ ├── modular.svg
│ │ │ ├── more.svg
│ │ │ ├── move.svg
│ │ │ ├── navigation.svg
│ │ │ ├── notification.svg
│ │ │ ├── operation.svg
│ │ │ ├── pad.svg
│ │ │ ├── pdf.svg
│ │ │ ├── picture.svg
│ │ │ ├── pin.svg
│ │ │ ├── play.svg
│ │ │ ├── print.svg
│ │ │ ├── prompt.svg
│ │ │ ├── refresh.svg
│ │ │ ├── row-height.svg
│ │ │ ├── run-in.svg
│ │ │ ├── run-up.svg
│ │ │ ├── save.svg
│ │ │ ├── scanning.svg
│ │ │ ├── search.svg
│ │ │ ├── security.svg
│ │ │ ├── select-bold.svg
│ │ │ ├── select.svg
│ │ │ ├── send.svg
│ │ │ ├── setting.svg
│ │ │ ├── share.svg
│ │ │ ├── shouye-zhihui.svg
│ │ │ ├── sign-out.svg
│ │ │ ├── skip.svg
│ │ │ ├── smile.svg
│ │ │ ├── sorting.svg
│ │ │ ├── stop.svg
│ │ │ ├── success.svg
│ │ │ ├── survey.svg
│ │ │ ├── switch.svg
│ │ │ ├── task.svg
│ │ │ ├── telephone-out.svg
│ │ │ ├── telephone.svg
│ │ │ ├── text.svg
│ │ │ ├── time.svg
│ │ │ ├── toggle-left.svg
│ │ │ ├── toggle-right.svg
│ │ │ ├── top.svg
│ │ │ ├── training.svg
│ │ │ ├── unknown-file.svg
│ │ │ ├── unlock.svg
│ │ │ ├── upload.svg
│ │ │ ├── user.svg
│ │ │ ├── warning.svg
│ │ │ ├── work.svg
│ │ │ ├── zoom-in.svg
│ │ │ └── zoom-out.svg
│ │ └── social
│ │ │ ├── README.md
│ │ │ └── github.svg
│ ├── index.ts
│ ├── message.tsx
│ └── shadcn
│ │ ├── global.shadcn.css
│ │ ├── index.ts
│ │ ├── ui
│ │ ├── accordion.tsx
│ │ ├── alert-dialog.tsx
│ │ ├── alert.tsx
│ │ ├── avatar.tsx
│ │ ├── badge.tsx
│ │ ├── breadcrumb.tsx
│ │ ├── button.tsx
│ │ ├── calendar.tsx
│ │ ├── card.tsx
│ │ ├── carousel.tsx
│ │ ├── chart.tsx
│ │ ├── checkbox.tsx
│ │ ├── collapsible.tsx
│ │ ├── command.tsx
│ │ ├── context-menu.tsx
│ │ ├── dialog.tsx
│ │ ├── dropdown-menu.tsx
│ │ ├── form.tsx
│ │ ├── hover-card.tsx
│ │ ├── input-otp.tsx
│ │ ├── input.tsx
│ │ ├── label.tsx
│ │ ├── popover.tsx
│ │ ├── progress.tsx
│ │ ├── radio-group.tsx
│ │ ├── resizable.tsx
│ │ ├── scroll-area.tsx
│ │ ├── select.tsx
│ │ ├── separator.tsx
│ │ ├── sheet.tsx
│ │ ├── skeleton.tsx
│ │ ├── slider.tsx
│ │ ├── sonner.tsx
│ │ ├── switch.tsx
│ │ ├── table.tsx
│ │ ├── tabs.tsx
│ │ ├── textarea.tsx
│ │ ├── toast.tsx
│ │ ├── toaster.tsx
│ │ ├── toggle-group.tsx
│ │ ├── toggle.tsx
│ │ ├── tooltip.tsx
│ │ └── use-toast.ts
│ │ └── utils.ts
│ ├── tailwind.config.js
│ ├── tailwind.shadcnui.config.js
│ ├── tsconfig.build.json
│ ├── tsconfig.eslint.json
│ ├── tsconfig.json
│ ├── ui.config.d.ts
│ └── ui.config.js
├── plugins
├── .eslintrc.js
├── .gitignore
├── .idea
│ ├── modules.xml
│ └── plugins.iml
├── LICENSE
├── README.md
├── next-env.d.ts
├── next.config.mjs
├── package.json
├── postcss.config.js
├── scripts
│ └── build-replace.js
├── src
│ ├── api.ts
│ ├── app
│ │ ├── api
│ │ │ ├── backend.ts
│ │ │ └── plugin
│ │ │ │ └── getToken
│ │ │ │ └── route.ts
│ │ ├── chart
│ │ │ ├── components
│ │ │ │ ├── ChartProvider.tsx
│ │ │ │ ├── Hydrated.tsx
│ │ │ │ ├── Pages.tsx
│ │ │ │ ├── chart
│ │ │ │ │ ├── ChartLayout.tsx
│ │ │ │ │ ├── ChartPage.tsx
│ │ │ │ │ ├── ChartQuery.tsx
│ │ │ │ │ ├── chart-config
│ │ │ │ │ │ ├── ChartForm.tsx
│ │ │ │ │ │ ├── ChartSetting.tsx
│ │ │ │ │ │ ├── QueryStatus.tsx
│ │ │ │ │ │ ├── TypeSelector.tsx
│ │ │ │ │ │ ├── common
│ │ │ │ │ │ │ ├── AxisDisplayBaseContent.tsx
│ │ │ │ │ │ │ ├── ColumnSelector.tsx
│ │ │ │ │ │ │ ├── ComboLineStyleEditor.tsx
│ │ │ │ │ │ │ ├── ComboTypeEditor.tsx
│ │ │ │ │ │ │ ├── ComboXAxisDisplayEditor.tsx
│ │ │ │ │ │ │ ├── ComboYAisxDisplayEditor.tsx
│ │ │ │ │ │ │ ├── ConfigItem.tsx
│ │ │ │ │ │ │ ├── GoalLineEditor.tsx
│ │ │ │ │ │ │ ├── NumberInput.tsx
│ │ │ │ │ │ │ ├── PaddingEditor.tsx
│ │ │ │ │ │ │ ├── SwitchEditor.tsx
│ │ │ │ │ │ │ └── YAxisPositionEditor.tsx
│ │ │ │ │ │ └── form
│ │ │ │ │ │ │ ├── AreaForm.tsx
│ │ │ │ │ │ │ ├── BarForm.tsx
│ │ │ │ │ │ │ ├── ComboForm.tsx
│ │ │ │ │ │ │ ├── ComboXAxisEditor.tsx
│ │ │ │ │ │ │ ├── ComboYAxisEditor.tsx
│ │ │ │ │ │ │ ├── LineForm.tsx
│ │ │ │ │ │ │ ├── PieForm.tsx
│ │ │ │ │ │ │ ├── TableForm.tsx
│ │ │ │ │ │ │ └── utils.ts
│ │ │ │ │ ├── chart-show
│ │ │ │ │ │ ├── ChartDisplay.tsx
│ │ │ │ │ │ ├── combo
│ │ │ │ │ │ │ ├── Combo.tsx
│ │ │ │ │ │ │ ├── TooltipItem.tsx
│ │ │ │ │ │ │ └── useComboConfig.ts
│ │ │ │ │ │ ├── pie
│ │ │ │ │ │ │ ├── Pie.tsx
│ │ │ │ │ │ │ ├── PieLegendContent.tsx
│ │ │ │ │ │ │ ├── usePieConfig.tsx
│ │ │ │ │ │ │ └── useRefObserve.ts
│ │ │ │ │ │ ├── table
│ │ │ │ │ │ │ └── ChartTable.tsx
│ │ │ │ │ │ ├── types.ts
│ │ │ │ │ │ └── utils.ts
│ │ │ │ │ └── utils.ts
│ │ │ │ └── types.ts
│ │ │ ├── constant.ts
│ │ │ ├── favicon.ico
│ │ │ ├── globals.css
│ │ │ ├── hooks
│ │ │ │ ├── useBasePermissions.ts
│ │ │ │ ├── useBaseQueryData.ts
│ │ │ │ ├── useFilterNumberColumns.ts
│ │ │ │ └── useUIConfig.ts
│ │ │ ├── layout.tsx
│ │ │ ├── page.tsx
│ │ │ └── query.ts
│ │ └── sheet-form-view
│ │ │ ├── components
│ │ │ ├── CopyButton.tsx
│ │ │ ├── Pages.tsx
│ │ │ ├── SharePopover.tsx
│ │ │ ├── SheetShareView.tsx
│ │ │ ├── SheetView.tsx
│ │ │ ├── sheet
│ │ │ │ ├── DesignPanel.tsx
│ │ │ │ ├── PreviewPanel.tsx
│ │ │ │ ├── SheetSkeleton.tsx
│ │ │ │ ├── UniverSheet.tsx
│ │ │ │ ├── constant.ts
│ │ │ │ └── utils.ts
│ │ │ └── theme.ts
│ │ │ ├── favicon.ico
│ │ │ ├── layout.tsx
│ │ │ └── page.tsx
│ ├── components
│ │ ├── EnvProvider.tsx
│ │ ├── I18nProvider.tsx
│ │ ├── QueryClientProvider.tsx
│ │ ├── get-query-client.ts
│ │ └── types.ts
│ ├── hooks
│ │ ├── useEnv.ts
│ │ └── useInitializationZodI18n.ts
│ ├── locales
│ │ ├── chart
│ │ │ ├── en.json
│ │ │ ├── es.json
│ │ │ ├── it.json
│ │ │ └── zh.json
│ │ └── sheet-form-view
│ │ │ ├── en.json
│ │ │ ├── es.json
│ │ │ ├── it.json
│ │ │ └── zh.json
│ ├── types.d
│ │ └── i18next.d.ts
│ └── types.ts
├── tailwind.config.ts
└── tsconfig.json
├── pnpm-lock.yaml
├── pnpm-workspace.yaml
├── renovate.json5
├── scripts
├── build-image.mjs
├── build-yaml-doc.sh
├── db-migrate.mjs
├── entrypoint
│ └── docker-entrypoint.sh
├── generate-openapi-types.mjs
├── post-build-cleanup.mjs
├── publish.mjs
├── start.sh
└── wait-for
├── static
└── assets
│ ├── example
│ ├── Boy1.png
│ ├── Boy3.png
│ ├── Girl1.png
│ ├── Girl2.png
│ └── Girl3.png
│ └── images
│ ├── comments.png
│ ├── dashboard.png
│ ├── record-history.png
│ ├── search.png
│ ├── teable-interface-dark.png
│ ├── teable-interface-light.png
│ ├── teable-vertical-dark.png
│ ├── teable-vertical-light.png
│ ├── view-calendar.png
│ ├── view-form.png
│ ├── view-gallery.png
│ ├── view-grid.png
│ └── view-kanban.png
└── tsconfig.base.json
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | github: teableio
2 | ko_fi: teable
3 |
--------------------------------------------------------------------------------
/.gitpod.yml:
--------------------------------------------------------------------------------
1 | tasks:
2 | - init: pnpm install
3 | command: make sqlite-mode && cd apps/nestjs-backend && pnpm dev
4 |
--------------------------------------------------------------------------------
/.husky/commit-msg:
--------------------------------------------------------------------------------
1 | pnpm commitlint --edit $1
--------------------------------------------------------------------------------
/.husky/install.mjs:
--------------------------------------------------------------------------------
1 | // Skip Husky install in production and CI
2 | if (process.env.NODE_ENV === 'production' || process.env.CI === 'true') {
3 | process.exit(0);
4 | }
5 | const husky = (await import('husky')).default;
6 | console.log(husky());
7 |
--------------------------------------------------------------------------------
/.husky/pre-commit:
--------------------------------------------------------------------------------
1 | pnpm g:lint-staged-files --debug
--------------------------------------------------------------------------------
/.ncurc.yml:
--------------------------------------------------------------------------------
1 | # npm-check-updates configuration used by yarn deps:check && yarn deps:update
2 | # convenience scripts.
3 | # @link https://github.com/raineorshine/npm-check-updates
4 |
5 | # Add here exclusions on packages if any
6 | reject: [
7 | 'vite-plugin-svgr',
8 |
9 | # Too early cause in esm
10 | 'is-port-reachable',
11 | 'nanoid',
12 | 'node-fetch',
13 | ]
14 |
--------------------------------------------------------------------------------
/.npmrc:
--------------------------------------------------------------------------------
1 | engine-strict=true
2 | strict-peer-dependencies=false
3 | auto-install-peers=true
4 | lockfile=true
5 | # force use npmjs.org registry
6 | registry=https://registry.npmjs.org/
7 | use-node-version=20.9.0
8 | save-prefix=''
9 |
--------------------------------------------------------------------------------
/.prettierignore:
--------------------------------------------------------------------------------
1 | .idea/
2 | .vscode/
3 | pnpm-lock.yaml
4 | **/.next
5 | **/.out
6 | **/dist
7 | **/build
8 | **/.tmp
9 | **/.cache
10 |
--------------------------------------------------------------------------------
/.vscode/extensions.json:
--------------------------------------------------------------------------------
1 | {
2 | "recommendations": ["bradlc.vscode-tailwindcss"]
3 | }
4 |
--------------------------------------------------------------------------------
/apps/nestjs-backend/.gitignore:
--------------------------------------------------------------------------------
1 | # build
2 | build
3 | dist
4 |
5 | # testing
6 | /coverage
7 |
8 | # misc
9 | .DS_Store
10 | *.pem
11 | .assets
12 | .temporary
--------------------------------------------------------------------------------
/apps/nestjs-backend/.idea/modules.xml:
--------------------------------------------------------------------------------
1 |
2 |
{{message}}
5 |©{{currentYear}} {{brandName}}
5 | Help Center 6 |, IP = P> = NextPage
& {
5 | // eslint-disable-next-line @typescript-eslint/no-explicit-any
6 | getLayout?: (page: ReactElement, appProps: any) => ReactNode;
7 | };
8 |
--------------------------------------------------------------------------------
/apps/nextjs-app/src/pages/auth/signup.tsx:
--------------------------------------------------------------------------------
1 | import LoginRoute from './login';
2 |
3 | export { getServerSideProps } from './login';
4 |
5 | export default LoginRoute;
6 |
--------------------------------------------------------------------------------
/apps/nextjs-app/src/themes/tailwind/tailwind.theme.js:
--------------------------------------------------------------------------------
1 | // @ts-check
2 | // Keep this file as '.js' as it's included in tailwind.config.js
3 |
4 | const { browserFonts } = require('../shared/browser-fonts');
5 |
6 | module.exports = {
7 | fontFamily: {
8 | sans: ['Inter Variable', ...browserFonts.sans],
9 | },
10 | };
11 |
--------------------------------------------------------------------------------
/apps/nextjs-app/src/themes/type.ts:
--------------------------------------------------------------------------------
1 | import type { IColor } from './colors';
2 |
3 | export enum ThemeName {
4 | Light = 'light',
5 | Dark = 'dark',
6 | }
7 |
8 | export interface ITheme {
9 | color: IColor;
10 | }
11 |
--------------------------------------------------------------------------------
/apps/nextjs-app/src/types.d/umami.d.ts:
--------------------------------------------------------------------------------
1 | declare interface Window {
2 | umami?: {
3 | identify: (props: { email?: string; id?: string; name?: string }) => void;
4 | };
5 | }
6 |
--------------------------------------------------------------------------------
/apps/nextjs-app/tsconfig.scripts.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "strictNullChecks": true,
4 | "module": "NodeNext",
5 | "esModuleInterop": true
6 | },
7 | "include": ["**/*.ts", "**/*.tsx"]
8 | }
9 |
--------------------------------------------------------------------------------
/crowdin.yml:
--------------------------------------------------------------------------------
1 | files:
2 | - source: /packages/common-i18n/src/locales/en/*.json
3 | translation: /packages/common-i18n/src/locales/%two_letters_code%/%original_file_name%
4 |
--------------------------------------------------------------------------------
/dockers/.env:
--------------------------------------------------------------------------------
1 | TIMEZONE=Asia/Singapore
2 |
3 | # PostgreSQL Env
4 | POSTGRES_DB=teable
5 | POSTGRES_USER=teable
6 | POSTGRES_PASSWORD=teable
7 |
8 | # Redis env
9 | REDIS_PASSWORD=teable
10 |
11 | # Minio env
12 | MINIO_ACCESS_KEY=teable
13 | MINIO_SECRET_KEY=teable123
--------------------------------------------------------------------------------
/dockers/examples/docker-swarm/docker-compose.default.yml:
--------------------------------------------------------------------------------
1 | version: '3.9'
2 |
3 | networks:
4 | teable-swarm:
5 | external: true
6 |
7 | volumes:
8 | teable-db:
9 | teable-cache:
10 | teable-storage:
11 |
--------------------------------------------------------------------------------
/dockers/examples/standalone/README.md:
--------------------------------------------------------------------------------
1 | # Example with teable standalone
2 |
3 | Look into the `.env` file and update the vaiables before executing `docker compose up -d`.
4 |
5 | ## Teable
6 |
7 | - Accessible via `http://127.0.0.1:3000`
8 | - Uses postgres db for storage
9 | - Telemetry is disabled
10 |
--------------------------------------------------------------------------------
/dockers/networks.yml:
--------------------------------------------------------------------------------
1 | version: '3.9'
2 |
3 | networks:
4 | teable-net:
5 | name: ${NETWORK_MODE:-teablenet}
6 | external: true
7 |
--------------------------------------------------------------------------------
/dockers/teable/Dockerfile.db-migrate:
--------------------------------------------------------------------------------
1 | FROM alpine:3.19
2 | CMD echo "[DEPRECATED] db-migrate image is deprecated and no longer needed. This image will be removed in v2.0.0." && exit 0
3 |
--------------------------------------------------------------------------------
/packages/common-i18n/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # build
4 | /dist
5 |
6 | # dependencies
7 | node_modules
8 |
9 | # testing
10 | /coverage
11 |
12 | # misc
13 | .DS_Store
14 | *.pem
15 |
--------------------------------------------------------------------------------
/packages/common-i18n/.idea/modules.xml:
--------------------------------------------------------------------------------
1 |
2 | ;
8 | };
9 |
--------------------------------------------------------------------------------
/packages/ui-lib/src/base/file/preview/index.tsx:
--------------------------------------------------------------------------------
1 | export * from './FilePreviewProvider';
2 | export * from './FilePreviewItem';
3 | export * from './FilePreviewDialog';
4 | export * from './getFileIcon';
5 | export * from './utils';
6 |
--------------------------------------------------------------------------------
/packages/ui-lib/src/base/file/preview/pdf/utils.ts:
--------------------------------------------------------------------------------
1 | import { getBlobFromUrl } from '../office/utils';
2 |
3 | export const getBlobUrlFromUrl = async (url: string) => {
4 | const blob = await getBlobFromUrl(url);
5 | return URL.createObjectURL(blob);
6 | };
7 |
--------------------------------------------------------------------------------
/packages/ui-lib/src/base/index.ts:
--------------------------------------------------------------------------------
1 | export * from './card/BasicCard';
2 | export * from './spin/Spin';
3 | export * from './selector/Selector';
4 | export * from './file';
5 | export * from './dialog';
6 | export * from './dnd-kit';
7 | export * from './Error';
8 |
--------------------------------------------------------------------------------
/packages/ui-lib/src/icons/social/README.md:
--------------------------------------------------------------------------------
1 | ## Credits
2 |
3 | - **github.svg** by https://www.iconfinder.com/Adi_Sinchetru from https://www.iconfinder.com/icons/1390302/github_icon
4 |
--------------------------------------------------------------------------------
/packages/ui-lib/src/index.ts:
--------------------------------------------------------------------------------
1 | export { Message } from './message';
2 | export { AsyncMessage } from './async-message';
3 | export * from './shadcn';
4 | export * from './base';
5 |
--------------------------------------------------------------------------------
/packages/ui-lib/src/message.tsx:
--------------------------------------------------------------------------------
1 | import type { FC } from 'react';
2 |
3 | type Props = {
4 | message: string;
5 | children?: never;
6 | };
7 |
8 | export const Message: FC