Giter Site home page Giter Site logo

apitable / apitable Goto Github PK

View Code? Open in Web Editor NEW
11.9K 89.0 1.0K 366.08 MB

🚀🎉📚 APITable, an API-oriented low-code platform for building collaborative apps and better than all other Airtable open-source alternatives.

Home Page: https://aitable.ai

License: GNU Affero General Public License v3.0

Shell 0.04% Makefile 0.06% Java 22.23% HTML 0.15% JavaScript 1.12% Dockerfile 0.04% TypeScript 72.07% Less 3.74% CSS 0.14% Lua 0.01% HCL 0.01% MDX 0.41%
airtable airtable-alternative nocodb nestjs nextjs spring low-code no-code notion api

apitable's Introduction

APITable Cover Image

APITable Gitpod Development Environment TypeScript Language, NestJS Framework Java Language, Spring Framework Deploy to DO
APITable License Badge AGPL

English | Français | Español | Deutsch | 简体中文 | 繁體中文 | 日本語

✨ Quick Start

If you just want to try out APITable1, use our cloud-hosted AI version at aitable.ai.

If you want to demo this APITable open-source project, click here for ⚡️Gitpod Online Demo.

If you want to try the self-hosted APITable, 🚀 one-click deploy with Dome here

If you want to install APITable in your local or cloud computing environment, see 💾 Installation

If you want to set up your local development environment, read our 🧑‍💻 Developer Guide

Join Discord or Twitter to keep in touch.

🔥 Features

Realtime Collaboration Automatic Form
API-first Panel Unlimited cross-table links
Powerful Rows/Columns Permissions Embed

APITable provides a range of amazing features, from the personal to the enterprise.

  • Advanced technology stack and open-source
    • Realtime collaboration allows multiple users to edit together in real time, or simultaneously with the Operational Transformation (OT) Algorithm.
    • Extremely smooth, user-friendly, super-fast database-spreadsheet interface in <canvas> Rendering Engine.
    • Database native architecture: Changeset / Operation / Action / Snapshot and so on.
    • 100k+ data rows with real-time collaboration.
    • Full-stack API access, from Data to Metadata.
    • One-direction / Bi-direction Table Link and Infinite Cross Links
    • Community-friendly programming languages and framework, TypeScript (NextJS + NestJS) and Java (Spring Boot).
  • Beautiful and Rich Database-Spreadsheet UI
    • CRUD: Create, Read, Update, Delete the Tables, Columns, and Rows
    • Fields Operations: sort, filter, grouping, hide/unhide, height setting.
    • Space based: Use separated workspaces in place of App/Base-based structure, make unlimited tables link together possible.
    • Dark mode and theme customization available.
    • 7 View Types: Grid View (Datasheet) / Gallery View / Mindmap View / Kanban View / Full-Feature Gantt View / Calendar View
    • One-click API Panel
  • Batteries included
    • Built-in 10+ official templates.
    • Robot Automation and customization available.
    • BI dashboard
    • One-click auto-generated form
    • Shareable and embeddable page.
    • Multi-language support.
    • Integration with n8n.io / Zapier / Appsmith... and more.
  • Excellent extensibility
    • Extensible Widget System with over 20 officials open-source widgets.
    • Customizable Graph & Chart & Dashboard
    • Customizable Data Column Types
    • Customizable Formulas
    • Customizable Automation Robot Actions.
  • Enterprise-grade permissions
    • Mirror, turn a View into a mirror to implement Row Permission.
    • Activate Column Permission through a very simple operation.
    • Folders / Sub-Folders / Files Permission.
    • Tree structure folders and customizable node (file);
    • Team Management & Organization Structure.
  • Enterprise features:
    • SAML
    • Single-Sign-On (SSO)
    • Audit
    • Database Auto Backup
    • Data Exporter
    • Watermark
  • ....

With extensible widgets and plugins, you can add more features.

💥 Use Cases

Why you must know APITable for your next software?

  • As super management software
    • Flexible Project Management & Tasks / Issues Management.
    • Marketing Lead Management.
    • Most flexible and connectable CRM.
    • Flexible Business Intelligence (BI).
    • People-Friendly Forms and Surveys
    • Flexible ERP.
    • Low-code and no-code platform.
    • ...and more, APITable puts 1000 softwares in your pocket.
  • As a visual database infrastructure
    • Embed APITable into your own software UIs.
    • Visual Database with REST API.
    • Admin dashboard.
    • Central configuration management.
    • All-in-one enterprise database that connect all your software.
    • ...and more, APITable connects everything.
  • Also, it is open source and extensible

💞 API-oriented

API UI Panel

Clicking the API button in the right corner will show the API Panel

SQL-like query

APITable will provides a Datasheet Query Language (DQL) to query your database-spreadsheet contents.

💝 Embed-friendly

Share and Embed

Share your datasheet table or folder. Embed them by copying and pasting HTML scripts.

Enterprise-ready Embedding

AITable.ai provides more Enterprise-ready Embedding features for securities.

Installation

Before you begin:

  • A host with docker and docker-compose v2 installed.
  • 4 CPUs/8GB RAM or more are recommended.
  • A bash shell with basic utilities like curl installed.
  • Native arm64 (apple silicon) container images is not ready yet and may cause bad performance.

To install apitable using docker compose, open your terminal and run this:

curl https://apitable.github.io/install.sh | bash

Then open http://localhost:80 in your browser to visit it.

We also provide an all-in-one image based on pm2 for demo or testing purpose (not recommended for enterprise or production usage):

sudo docker run -d -v ${PWD}/.data:/apitable -p 80:80 --name apitable apitable/all-in-one:latest

Depending on your environment, you may need to wait several minutes for all the services to start. This image is amd64 (x86_64) only, you may encounter pretty bad performance on arm64 or apple silicon.

If you want to set up your local development environment, read our 🧑‍💻 Developer Guide

🧑‍💻 Contributing

Welcome, and thank you for your interest in contributing to APITable!

In addition to writing code, there are many ways for you to contribute.

You can contribute as following:

You can read this repository’s Contributing Guidelines to learn how to contribute.

Here's a quick guide to help you contribute to APITable.

Development environment

Learn how to set up your local environment, go to our Developer Guide.

Git workflow basic

Here's a general APITable git workflow:

  1. Create an issue and describe features you want -> APITable issues
  2. Fork this project -> Fork APITable project
  3. Create your feature branch (git checkout -b my-new-feature)
  4. Commit your changes (git commit -am 'Add some features')
  5. Publish the branch (git push origin my-new-feature)
  6. Create a new Pull Request -> Create pull request across forks

Work conventions

APITable use these common conventions:

Documentations

🛣 Roadmap

Please refer to the Roadmap of AITable

Future Features

  • Heavy-code Interface Builder
  • Embeddable 3rd party documentation components
  • SQL-like Domain-Specific Languages
  • As an IdP
  • Advanced automation robot
  • Web 3 features
  • ...

Hosted and Enterprise versions offer advanced features

  • As an IdP;
  • SAML
  • Single-Sign-On
  • Audit
  • Database Backup
  • Integrate with ChatGPT, Zapier, Slack, Google Workspace……
  • Watermark

For more information on our product, including enterprise self-hosted license, please contact us at [email protected] or book a demo.

👫 Get Involved

🌏 Why we create APITable and open-source?

  • We believe that Database is the cornerstone of all the software.
  • We believe that making a Visual Database with rich and easy user interface for everyone can reduce the difficulty of software industry and increase the world's digitalization adoption.
  • We believe that open-sourcing APITable work can Push Human Beings Forward.

We are hiring remotely!

We always search for good talents for APITable:

  • Full-stack developer: You have experience with React, NestJS, TypeScript, Spring Boot, Java, Terraform. And you like to write high quality code with clear documentation and unit tests.
  • Back-end developer: You have experience with NestJS, TypeScript, Spring Boot, Java, SQL, Kubernetes, Terraform. And you like to write high quality code with clear documentation and unit tests.
  • Front-end developer: You have experience with React, NextJS, TypeScript, WebPack. And you like to write high quality code with clear documentation and unit tests.

Regardless of time and conditions, if you want to get involved to the team of APITable, do not hesitate to fill out this form or send your CV to [email protected].

📺 Screenshot

APITable Screenshot Image

APITable Screenshot Image

APITable Screenshot Image

APITable Screenshot Image

APITable Screenshot Image

APITable Screenshot Image

APITable Screenshot Image

APITable Screenshot Image

APITable Screenshot Image

APITable Screenshot Image

🥰 License

This repository contains the source code for the Open Source edition of APITable, released under the AGPL.

If you'd like to run your own copy of APITable or contribute to development then this is the place for you.

See LICENSING for details.

If you want to use APITable online then you don't need to run this code, we offer a hosted version of the app at AITable.ai which optimized for global accelerator.


Footnotes

  1. Licensed with AGPL-3.0. Designed by APITable Ltd.

apitable's People

Contributors

arucil avatar boris-w avatar bronlau avatar chalme avatar chamberschan avatar dage233 avatar dependabot[bot] avatar functionchenguofeng avatar itou-ng avatar janesu avatar jbgh avatar jeremyyin2012 avatar joverzhang avatar llkevin13579 avatar luoyunyao avatar mr-kelly avatar networkhermit avatar okisdev avatar paylm avatar ranglang avatar robot518 avatar shawndenggh avatar sheehan0802 avatar sky-fe avatar wangkailang avatar wmevie avatar xukecheng avatar yo-ooiii avatar ziqiangai avatar zoe-icu avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

apitable's Issues

Integrate pull request preview environments

I would like to support Apitable by implementing Uffizzi preview environments.
Disclaimer: I work on Uffizzi.

Uffizzi is a Open Source full stack previews engine and our platform is available completely free for Apitable (and all open source projects). This will provide maintainers with preview environments of every PR in the cloud, which enables faster iterations and reduces time to merge. You can see the open source repos which are currently using Uffizzi over here

Uffizzi is purpose-built for the task of previewing PRs and it integrates with your workflow to deploy preview environments in the background without any manual steps for maintainers or contributors.

We can go ahead and create an Initial PoC for you right away if you think there is value in this proposal.

fix: error loading space list page

Describe the bug
cause fetch error when load space list

To Reproduce
Steps to reproduce the behavior:

  1. click the space icon on upper left corner
  2. loading white page always

Expected behavior
normally open the space list page

Screenshots
img_v2_785797b8-127a-462d-a0e0-02b9fb33103g

Desktop (please complete the following information):

  • OS: MacOS
  • Browser: chrome
  • Version 13.1 (22C65)

Additional context

fix: it couldn't be reset to empty when the default value of the percent field is filled in

Describe the bug
After i filled in a default value of percent field, i couldn't get it back to "empty" state, it always showed a "0" in the input box

To Reproduce
Steps to reproduce the behavior:

  1. Create a field and type is Percent
  2. filled a "5" into the input box of Default value in the field setting modal, and then click the button "OK"
  3. double-click the field name for reopenning the field setting modal, empty the input box of Default value, and then click the button "OK"
  4. double-click the field name again, you will see "0" in the input box of Default value

Expected behavior
Leave it empty when I remove all content from the input box.

Screenshots

image

Desktop (please complete the following information):

  • OS: Windows 10
  • Browser Chrome
  • Version 108.0.5359.125

feat: Helm Chart

I have an idea for this project.

First, this project is amazing. I have test for few hours, the possibilities are incredible.

Why?

Possibility to have helm chart to install self-hosted apiTable easilly on kubernetes

What?

Everyone (include me) interrested to deploy apiTable in their infrastructure are interrested by this

How?

I have not enough knowledge in kubernetes/helm to do that, that is why I'm asking for this 👍

question: init db script missing

Describe the bug
Hello APITable team, thank you for open-sourcing such a good product, I am very interested in this project, and I am going to study it. If possible, I hope to participate in open-source work with APITable, because I also love open-source, but now I'm having a problem with not being able to initialize the database, I looked at the current project version up to 0.17.0, but I noticed that our init-db doesn't have a db script for 0.17.0, is this a problem please? thank you for your reply!

To Reproduce
Steps to reproduce the behavior:

  1. Go to '...'
  2. Click on '....'
  3. Scroll down to '....'
  4. See error

Expected behavior
A clear and concise description of what you expected to happen.

Screenshots
If applicable, add screenshots to help explain your problem.

Desktop (please complete the following information):

  • OS: [e.g. iOS]
  • Browser [e.g. chrome, safari]
  • Version [e.g. 22]

Smartphone (please complete the following information):

  • Device: [e.g. iPhone6]
  • OS: [e.g. iOS8.1]
  • Browser [e.g. stock browser, safari]
  • Version [e.g. 22]

Additional context
Add any other context about the problem here.

fix: BUG...Click on the settings button for the user's profile picture, and the console reports an error

Describe the bug
Click on the settings button for the user's profile picture, and the console reports an error. and the page keeps reloading.

To Reproduce
Steps to reproduce the behavior:
image

Expected behavior
A clear and concise description of what you expected to happen.

Screenshots
If applicable, add screenshots to help explain your problem.

Desktop (please complete the following information):

  • OS: [window10]
  • Browser [chrome]
  • Version : 109.0.5414.75 X64

Additional context
Add any other context about the problem here.

feat: all-in-one Docker image - like Budibase

Greetings,

I tested your software and I am very impressed! Hope this project will develop further.

Let me show you, how Budibase solved problems of maintaining applications dependent on different services. They prepared an all-in-one docker image, which works well with a few lines of docker-compose.yml. A lot of businesses use containers on their VMs: smaller ones simple Docker ones, eventually in Swarm mode, and bigger Kubernetes-like solutions. Just check their DockerHub:

hub.docker.com/r/budibase/budibase

In their case, CouchDB, Redis, MinIO, and Budibase core services are packed into one container, configured with a few environmental variables.

As a business founder and IT passionate I clearly understand your idea, but to make it accessible, you have to prepare the simplest possible method to prepare a self-hosted instance of your app. An All-in-one Docker image seems to fit into this very well.

Regards,
Dominik

fix: It does not send email when notified members

Describe the bug
It does not send email when notified members

To Reproduce
【apitable.integration】

  1. open “Notify members once they're selected” in the member field
  2. add someone in the member field
  3. no email received

Expected behavior
can recevied email

Screenshots
If applicable, add screenshots to help explain your problem.

Desktop (please complete the following information):

  • OS: [e.g. iOS]
  • Browser [e.g. chrome, safari]
  • Version [e.g. 22] v0.17.0-alpha+vika.build2091

Smartphone (please complete the following information):

  • Device: [e.g. iPhone6]
  • OS: [e.g. iOS8.1]
  • Browser [e.g. stock browser, safari]
  • Version [e.g. 22]

Additional context
Add any other context about the problem here.

fix: first trigger on the get-started button sends you to the bottom of page

Describe the bug
When a user clicks on the get started button, they are sent to the bottom of the page, below the get-saas-notice id section. The purpose for sending user to subscribe section is lost. The screenshot attached below explains the issue better. Also this happens only on the initial trigger of the button

To Reproduce
Steps to reproduce the behavior:

  1. Go to homepage
  2. Click on 'Get Started'

Expected behavior
Should land user at saas notice segment

Screenshots
User lands here.
Screenshot from 2023-01-04 00-34-27

Desktop :

  • OS: Ubuntu 20.04 LTS
  • Browser: Chrome

Importing from Airtable is broken

The URL to Airtable should be https://api.airtable.com/v0/<BaseID>/<TableID>?offset=&view= but the table ID appears twice and ApiTable currently invoques https://api.airtable.com/v0/<BaseID>/<TableID>/<TableID>?offset=&view=

When the view id is set it does not use it and call the base id instead too.

docs: why we separate two backend-server, one in Spring Boot, one in NestJS

APITable has two backend servers.

One called "backend-server" with Java code and the Spring Boot framework.

The other is called "room-server" and includes NodeJS TypeScript code and the NestJS framework.

  • Why do we separate servers' code into two programming languages?
  • Have you ever seen a similar architect in another case?
  • What are the philosophical differences between the NestJS framework and Spring Boot?

TIPS: related with product features.

fix: The robot performs history page have a style exception

Describe the bug
A blinding white box appears on the page

To Reproduce
image

Expected behavior
A clear and concise description of what you expected to happen.

Screenshots
If applicable, add screenshots to help explain your problem.

Desktop (please complete the following information):

  • OS: [win10]
  • Browser [chrome]
  • Version [latest]

Additional context
Add any other context about the problem here.

Cannot find module canvas.node

Installing the project in local for contributing base on the developer guide.
the make run # -> 4 runs the web-server on port 3000.

When starting the web page in my browser the following error occurs:

Error: Cannot find module '../build/Release/canvas.node'
Require stack:
- /Users/vinyll/Projects/apitable/node_modules/canvas/lib/bindings.js
- /Users/vinyll/Projects/apitable/node_modules/canvas/lib/canvas.js
- /Users/vinyll/Projects/apitable/node_modules/canvas/index.js
- /Users/vinyll/Projects/apitable/node_modules/konva/cmj/index-node.js
- /Users/vinyll/Projects/apitable/packages/datasheet/web_build/server/pages/_app.js
- /Users/vinyll/Projects/apitable/node_modules/next/dist/server/require.js
- /Users/vinyll/Projects/apitable/node_modules/next/dist/server/next-server.js
- /Users/vinyll/Projects/apitable/node_modules/next/dist/server/next.js
- /Users/vinyll/Projects/apitable/packages/datasheet/server.js

fix: Cannot invite user

A blank content appears when inviting a future member by link.
A 403 "not allowed" error comes along with the following response: requested URL is not allowed.

To Reproduce

  1. Connect as an admin
  2. Go to the users > invite > invite via link. Copy the URL (ex: "http://apitable.local/invite/link?token=1721726062f24c4fb0ad09c57104f15e From APITable: admin invited you to join "Cool workspace" Space. Open it via a computer browser for a better experience.")
  3. Paste that link in another browser or in private mode
  4. click "confirm to join"

Expected behavior
A window should confirm the account creation with an email and password creation

Screenshots

Screenshot 2023-01-14 at 12 34 52

That occurs on Firefox and Chromium with a remote server (HTTP no SSL).

refactor(core): DataBus support frontend engineering

Suggest an idea for this project.

Why?

Optimize performance by removing all doCommands and Selectors from frontend packages.

What?

Adapt the StoreProvider, SaveProvider, Load Provider for browser.

How?

  • write StoreProvider, DBSaveProvider, DBLoadProvider for frontend package.
  • refactor one call in frontend project and run success;

fix: the menu item "Copy cell" should be hidden in gallery view

Describe the bug
Nothing happened when I clicked "Copy cell" on the right-clicked menu of a card in the gallery view.

To Reproduce
Steps to reproduce the behavior:

  1. Create a gallery view
  2. Right click a card of gallery
  3. Click the menu item "Copy cell"

Expected behavior
The gallery view has no "cell" concept. Please hide the menu item "Copy cell" in gallery view.

Screenshots
image

Desktop (please complete the following information):

  • OS: Windows 10
  • Browser: Chrome
  • Version: 108.0.5359.125

refactor: stop importing repositories outside

I have an idea for this project.

Why?

Repositories are installed by multiple modules, it'll lead to two issues:

  • Compatibility issues: Importing other modules' repositories directly could potentially lead to compatibility issues with your application, as the module may not have been designed to be used in the way you are trying to use it.
  • Maintenance: If you import other modules' repositories directly, you will be responsible for maintaining those repositories and ensuring that they are up-to-date. This can be time-consuming and can take away from your ability to focus on your own application.

What?

  • RobotModule imported DatasheetRecordRepository directly
  • DatabaseModule imported AutomationTriggerRepository directly
  • FusionApiModule imported DatasheetRecordRepository directly

How?

If you want to use the repository outside of the module which imports TypeOrmModule.forFeature, you'd better use the service instead. You'll need to re-export the service providers generated by it. like this:

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { User } from './user.entity';

@Module({
  imports: [TypeOrmModule.forFeature([User])],
  providers: [UserService],
  exports: [UserService]
})
export class UsersModule {}

fix: Error in creating new form in working directory

Describe the bug
Error in creating new form in working directory

To Reproduce
1.Enter the apitable space station
2.Click the "+" button in the working directory
3. Click the new form button in the list
4.Error is reported on the console

Expected behavior
Click the new form button to pop up all the created tables in the space station

Screenshots
image

Desktop (please complete the following information):

  • OS: windows 10
  • Browser : Chrome 108.0.5359.125

test: add property based tests to DataBus

I have an idea for this project.

Why?

Property based testing is a testing technique that makes sure the inherent properties of the tested object always hold. Currently there are little guarantee that objects in DataBus satisfy their inherent properties, so property based testing can be added to improve the robustness of DataBus.

What?

Add property based tests to DataBus that test the following properties:

  • After a doCommand operation,
    • the revision of a Datasheet is always increased by one.
    • the id, name, and type field of the Datasheet are not changed.
  • If a field is added to a Datasheet through the doCommand operation,
    • the number of fields in the Datasheet and all Views is always increased by one.

How?

The simple way is to conceive some example data and add them to jest tests. Even better, you can use fast-check to generate random tests.

feat: ESLint Automation

I have an idea for this project.

Why?

Make the TypeScript and JavaScript cleaner and improve code quality.

What?

Make the ESLint Github Action for automation.

How?

fix: docker is not stable for running backend server on M1 chip MacBook

Describe the bug

I am attempting to set up the API Table project on my local development environment and have followed the developer guide to ensure that all dependencies are properly installed. However, when running docker compose up -d, in the terminal, the containers for apitable-backend-server-1 and apitable-init-db-1 are stuck in a waiting state and take an excessively long time to start up. I am seeking assistance in resolving this issue as I am unable to properly run the project.

To Reproduce
Steps to reproduce the behavior:

  1. clone the project to your local git clone https://github.com/apitable/apitable.git
  2. go to project folder : cd apitable
  3. run command on your termianl: docker compose up -d

Expected behavior
The expected behavior of the API Table project is to start up the backend server without any issues. However, the current behavior is that the containers for apitable-backend-server-1 and apitable-init-db-1 are taking an excessively long time to start up and are stuck in a waiting state. This prevents the project from running as intended and requires resolution in order to proceed.

Screenshots

Screen Shot 2022-12-28 at 19 02 23

Desktop (please complete the following information):

  • OS: macOS Monterey Version 12.4

Additional context
I am using a MacBook Pro with an M1 chip and a total of 16GB of memory. The M1 chip has a total of 8 cores

fix: Cannot reset password

Describe the bug
There is no entrance for resetting the account password in the product, cannot reset the account password.

Expected behavior
Can reset the account password in the product.

feat: dependencies in gantt diagram

I have an idea for this project.

Why?

basic feature for gantt diagrams

What?

set dependencies between tasks so as we could move them around and see their connections. If we move the dependency, the dependent tasks should also move if their start date is not valid after the change.

Do you have plans on implementing this feature?

question: How to make APITable take into compatible with different public cloud OSS storage?

APITable's default OSS storage is MinIO, uploading attachments follows the s3 protocol

So, assuming you want to access the OSS cloud storage of Azure or AWS, how do you modify the code?

you can choose a public cloud OSS and try to access it
Expectation: After accessing, create a new "attachment column" on the APITable, and any attachment can be uploaded and stored normally.

feat: arm64 dual image build

I have an idea for this project.

Why?

Let APITable image runs on ARM64 architect server.

Currently we are using the AMD64 docker image which some users will encounter some problems on ARM64 computer like macOS under M1 chip.

Related issue #67

What?

Use buildx command to build dual architect image.

How?

  • Github Action modify to support buildx multi-platform

fix: the robot doesn't seem to work

Describe the bug
The robot doesn't seem to work, it doesn't run tasks based on trigger conditions.

To Reproduce
Steps to reproduce the behavior:

  1. finished config robot.
  2. action based on trigger conditions.

Expected behavior
User open robot and config it right, then user should see some information after action.

Screenshots
If applicable, add screenshots to help explain your problem.

2023-01-27_23-23-28.mp4

fix: ERROR: Invalid interpolation format [...] when installing using the script

Describe the bug
Whenever I try to install APITable using the provided script, it fails with the following error:

ERROR: Invalid interpolation format for "web-server" option in service "services": "${IMAGE_POLL_POLICY:-missing}"

To Reproduce
Try to run curl https://apitable.github.io/install.sh | bash on an Ubuntu box.

Expected behavior
Start using APITable

Desktop (please complete the following information):

  • Ubuntu 20.04

question: AGPL License & Embedding

Hello 👋,

Just came across this project and I was intrigued by the license text, specifically the following:

GNU Affero General Public License (AGPL)

If you remove the “Powered by APITable” logo on embedded APITable page, you’d then need to release your own embedding application under the AGPL. To avoid this, you can instead purchase an Enterprise Edition package.

Just to be up-front, I am not a lawyer but have spent some time attempting to understand the AGPLv3. Also not sure how this application approaches embedding but I'll generally assume there's direct network communication between the "embedding application" and APITable (Instead of just embedding via iframes which would be working around the embedding application anyway). My main intent of opening this is to clarify the use of the AGPL here, since It's often mis-quoted/applied which can further push confusion in the open source community.

From my understanding, if a someone modified an APITable, to remove the logo for example (Upon any other changes), they'd have to make their sources available to those they distribute to, where network use includes distribution. Therefore if APITable was embedded into another application, and parts of APITable were also distributed (again, including just network use) then the source of the modified APITable instance would need to be accessible to the users of that embedding application.

Your definition above advises I'd need to release the embedding application under the AGPL also. I'm not sure what part of the AGPL requires this. While the AGPL extends distribution to network use, I don't believe it extends to what's considered a derivative work and therefore I don't believe the embedding application needs to be released under a compatible license in any manner.

Have I misunderstood how embedding works and how the license applies here?

fix:Click "Share" to trigger a page to crash

Describe the bug
Click "Share" to trigger a page to crash

To Reproduce
Steps to reproduce the behavior:

  1. Open the menu by right click
  2. Click on "Share"
  3. The page displays "something went wrong and the page crashed"

Expected behavior
Open "Share" model normally

Screenshots
7LsbAVAasK
image
image

Desktop (please complete the following information):

  • OS: [e.g. iOS]
  • Browser [e.g. chrome, safari] Chrome
  • Version [e.g. 22]

Smartphone (please complete the following information):

  • Device: [e.g. iPhone6]
  • OS: [e.g. iOS8.1]
  • Browser [e.g. stock browser, safari]
  • Version [e.g. 22]

Additional context

question: Implementing Calculation for Formula-based Cells in a Datasheet

Any questions?

Given a datasheet that contains formula-based cells, which depend on other cells within the same datasheet or other related datasheets, how can the calculation for these formula-based cells be implemented?

Tips: some considerations for this question, include:

  1. constructing a dependency tree of the cells
  2. building a calculation chain
  3. re-calculating the cells

docs: quick search technical proposal

What documentation do you want?

Technical proposal of quick search feature

Tasks

  • Requirement investigation
  • Product & Marketing Research
  • Technical proposal

fix: "view application" button jump link error

Describe the bug
"view application" button jump link error.

To Reproduce
【apitable.integration】
1.someone applied to join my space station, so I received an email
2.click the "view application" button in the email
3.link jumps to "https://integration.apitable.com/notification"

image

image

Expected behavior
link jumps to "https://integration.apitable.com/notify"

Screenshots
If applicable, add screenshots to help explain your problem.

Desktop (please complete the following information):

  • OS: [e.g. iOS]
  • Browser [e.g. chrome, safari]
  • Version [e.g. 22] v0.17.0-alpha+vika.build2091

Smartphone (please complete the following information):

  • Device: [e.g. iPhone6]
  • OS: [e.g. iOS8.1]
  • Browser [e.g. stock browser, safari]
  • Version [e.g. 22]

Additional context
Add any other context about the problem here.

fix: response SERVER_ERROR(4000) when I fill data in table

Describe the bug
can not fill data into table, create robot pending on "Next".

To Reproduce
Steps to reproduce the behavior:

  1. deploy apitable through "curl https://apitable.github.io/install.sh | bash"
  2. craete space and table after login
  3. fill data into table or create robot.
  4. See error: "SERVER_ERROR(4000) Report issues

Screenshots
image

Desktop (please complete the following information):

  • OS: MacOS
  • Browser: chrome
  • Version: Version 108.0.5359.124 (Official Build) (x86_64)

Additional context
Log」>>> 2022-12-26 19:24:42,747 ERROR [http-nio-8081-exec-7] ?: Request path [/marketplace/integration/space/spco8MM947lAx/apps] is not exist
「Log」>>> 2022-12-26 19:24:42,751 ERROR [http-nio-8081-exec-7] ?: Servlet.service() for servlet [dispatcherServlet] in context with path [/api/v1] threw exception [Request processing failed; nested exception is com.apitable.core.exception.BusinessException: resource does not exist] with root cause
com.apitable.core.exception.BusinessException: resource does not exist
at com.apitable.shared.interceptor.ResourceInterceptor.preHandle(ResourceInterceptor.java:83)
at org.springframework.web.servlet.HandlerExecutionChain.applyPreHandle(HandlerExecutionChain.java:148)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1066)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:964)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:645)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:750)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:111)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at io.sentry.spring.SentryUserFilter.doFilterInternal(SentryUserFilter.java:56)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at com.apitable.shared.filter.RequestThreadHolderFilter.doFilterInternal(RequestThreadHolderFilter.java:63)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at ch.qos.logback.classic.helpers.MDCInsertingServletFilter.doFilter(MDCInsertingServletFilter.java:49)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:337)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:115)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:81)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346)
at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:122)
at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:116)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346)
at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:126)
at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:81)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346)
at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:109)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346)
at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:149)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346)
at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346)
at org.springframework.security.web.session.ConcurrentSessionFilter.doFilter(ConcurrentSessionFilter.java:147)
at org.springframework.security.web.session.ConcurrentSessionFilter.doFilter(ConcurrentSessionFilter.java:125)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346)
at org.springframework.security.web.csrf.CsrfFilter.doFilterInternal(CsrfFilter.java:117)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346)
at com.apitable.shared.config.security.CsrfBeforeFilter.doFilterInternal(CsrfBeforeFilter.java:58)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346)
at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346)
at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90)
at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346)
at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:112)
at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:82)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346)
at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346)
at org.springframework.security.web.session.DisableEncodeUrlFilter.doFilterInternal(DisableEncodeUrlFilter.java:42)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346)
at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:221)
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:186)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:354)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:267)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.springframework.session.web.http.SessionRepositoryFilter.doFilterInternal(SessionRepositoryFilter.java:142)
at org.springframework.session.web.http.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:82)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.springframework.cloud.sleuth.instrument.web.servlet.TracingFilter.doFilter(TracingFilter.java:68)
at org.springframework.cloud.sleuth.autoconfig.instrument.web.TraceWebServletConfiguration$LazyTracingFilter.doFilter(TraceWebServletConfiguration.java:131)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at io.sentry.spring.tracing.SentryTracingFilter.doFilterInternal(SentryTracingFilter.java:91)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at io.sentry.spring.SentrySpringFilter.doFilterInternal(SentrySpringFilter.java:62)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:177)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
at org.springframework.cloud.sleuth.instrument.web.tomcat.TraceValve.invoke(TraceValve.java:103)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:891)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1784)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:750)
「Log」>>> 2022-12-26 19:24:50,345 INFO [http-nio-8081-exec-8] com.apitable.shared.config.RedisConfig$MagicalKeyStringRedisSerializer: Magical Key String Redis Serializer Load Environment: apitable
「Log」>>> 2022-12-26 19:24:50,348 INFO [http-nio-8081-exec-8] com.apitable.shared.config.RedisConfig$MagicalKeyStringRedisSerializer: Magical Key String Redis Serializer Load Environment: apitable

Support for deploying on Windows Server

Your docker deploy script only takes in to account linux, where as windows server is still around 75% of the onprem market and about 50% of the cloud market. You need to create a powershell docker deploy script for your app.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.