diff --git a/i18n/README.zh.md b/i18n/README.zh.md new file mode 100644 index 0000000000..7e4dffd387 --- /dev/null +++ b/i18n/README.zh.md @@ -0,0 +1,193 @@ +

+ + Budibase + +

+

+ Budibase +

+

+ 在您自己的设施上快速构建应用 +

+

+ Budibase是一个开放源代码的低代码平台,可帮助开发人员和IT专业人员在几分钟内在自己的设施上构建、自动化和交付部署定制业务应用。 +

+ + +

+ 🤖 🎨 🚀 +

+ + +

+ +

+ +

+ + GitHub all releases + + + GitHub release (latest by date) + + + Discord + + + Follow @budibase + + Code of conduct + + + +

+

+ 注册 + · + 文档 + · + 提出需求 + · + 报告Bug + · + 支持: 讨论区 + & + Discord +

+ + + +## ✨ 功能 +当其他平台选择闭源路线时,我们决定采用开放源代码。当其他平台选择云服务时,我们决定提供本地构建器提供更好的开发体验。我们喜欢在Budibase上做不同的事情。 + +- **构建和发布真实的软件** 与其他平台不同,使用Budibase可以构建和交付单页应用程序。Budibase应用程序具有增强的性能,并且可以进行响应式设计,从而为您的用户提供出色的体验。 +- **开源且可扩展** Budibase是开源的。Builder使用AGPLv3许可,Server使用GPLv3,Client使用MPL。这会让您充满信心,Budibase将永远存在。您还可以针对Budibase进行修改或对其进行分叉,并根据需要进行更改,以提供开发人员友好的体验。 +- **连接数据库或直接开始** Budibase从多个来源(包括MongoDB,CouchDB,PostgreSQL,mySQL,Airtable,Google Sheets,S3,DyanmoDB或REST API)提取数据。与其他平台不同,使用Budibase可以从头开始,创建没有数据源的业务应用程序。[新的数据源需求](https://github.com/Budibase/budibase/discussions?discussions_q=category%3AIdeas)。 +- **使用强大的预制组件设计和构建应用程序** Budibase开箱即用,具有精美设计,功能强大的组件,您可以使用它们像构建基块来构建UI。我们还提供了许多您最喜欢的CSS样式选项,因此您可以发挥更多的创意。[新的组件需求](https://github.com/Budibase/budibase/discussions?discussions_q=category%3AIdeas)。 +- **自动化流程,与其他工具集成,并连接到Webhooks** 通过自动化手动流程和工作流来节省时间。从连接到Webhook,到自动发送电子邮件,只需告诉Budibase要做些什么,然后让它为您工作。您可以[在此处](https://github.com/Budibase/automations)轻松地[为Budibase创建新的自动化,](https://github.com/Budibase/automations)或[在此处](https://github.com/Budibase/automations)[新的集成需求](https://github.com/Budibase/budibase/discussions?discussions_q=category%3AIdeas)。 +- **云托管和自我托管** 用户可以自行托管(请参见下文),或使用Budibase托管其应用。目前,我们的云托管产品仅限于免费套餐,但我们会在将来进行更改。对于大量使用,我们建议用户进行自我托管。 + +

+ Budibase design ui +

+ + +## ⌛ 状态 +- [x] Alpha:我们正在将Budibase演示给用户并收到反馈 +- [x] 内部测试:我们正在与一组封闭的客户一起测试Budibase +- [x] 公开测试:任何人都可以[注册并使用Budibase](https://portal.budi.live/signup) +- [ ] 正式发布 + +关注此存储库的“release”以获取主要更新的通知,并给我们一个star~。 + +

+ +

+ +### Star时序图 + +[![Stargazers over time](https://starchart.cc/Budibase/budibase.svg)](https://starchart.cc/Budibase/budibase) + +如果您在两个版本之间遇到问题,请使用[此处](https://github.com/Budibase/budibase/blob/HEAD/.github/CONTRIBUTING.md#troubleshooting)的指南清理您的环境。 + + +## 🏁 Budibase入门 + +Budibase构建器在Mac,PC和Linux上的Electron中运行。请按照以下步骤开始: + +- [ ] [注册Budibase](https://portal.budi.live/signup) +- [ ] 创建用户名和密码 +- [ ] 复制您的API密钥 +- [ ] 下载Budibase +- [ ] 打开Budibase并输入您的API密钥 + +如果您需要其他帮助,请[参阅以下指导教程](https://docs.budibase.com/tutorial/tutorial-signing-up)。 + + +## 🤖 自托管 + +Budibase希望确保任何人都可以使用我们开发的工具,并且我们知道很多人需要能够在自己的系统上托管他们制作的应用程序——这就是为什么我们决定尝试使自托管服务变得如此简单的原因! + +当前,您可以使用Docker或Digital Ocean托管您的应用程序。可以在[此处](https://docs.budibase.com/self-hosting/introduction-to-self-hosting)找到有关自我托管的文档。 + +[![Deploy to DO](https://www.deploytodo.com/do-btn-blue.svg)](https://cloud.digitalocean.com/droplets/new?onboarding_origin=marketplace&i=09038e&fleetUuid=bb04f9c8-1de8-4687-b2ae-1d5177a0535b&appId=77729671&type=applications&size=s-4vcpu-8gb®ion=nyc1&refcode=0caaa6085a82&image=budibase-20-04) + + +## 🎓 学习Budibase + +Budibase[文档](https://docs.budibase.com/)位于[此处](https://docs.budibase.com/)。 + +您还可以按照有关[如何使用Budibase构建CRM](https://docs.budibase.com/tutorial/tutorial-introduction)的快速教程进行[操作](https://docs.budibase.com/tutorial/tutorial-introduction) + + +## 路线图 +查看我们的[公共路线图](https://github.com/Budibase/budibase/projects/10)。如果您想讨论路线图上的某些项目,请与[Discord](https://discord.gg/rCYayfe)或通过Github进行[讨论](https://github.com/Budibase/budibase/discussions) + + +## ❗ 行为守则 + +Budibase致力于为每个人提供热情,多样且无烦恼的体验。我们希望Budibase社区中的每个人都遵守我们的[**行为准则**](https://github.com/Budibase/budibase/blob/HEAD/.github/CODE_OF_CONDUCT.md)。 + +## 🙌 为Budibase贡献 + +从错误报告到PR请求:每一个贡献都将受到赞赏和欢迎。如果您打算实施一项新功能或更改API,请先创建一个Issue。这样我们可以确保您的工作没有白费。 + +### 不知道从哪里开始? + +[第一次提出Issue](https://github.com/Budibase/budibase/projects/22)是一个开始做出贡献的好地方。 + +### 存储库的组织方式 + +Budibase是由lerna管理的项目。Lerna管理budibase软件包的构建和发布。在较高的层次上,这里是构成Budibase的软件包。 + +- [packages/builder](https://github.com/Budibase/budibase/tree/HEAD/packages/builder)-包含budibase构建器客户端苗条应用程序的代码。 +- [packages/client](https://github.com/Budibase/budibase/tree/HEAD/packages/client)-在浏览器中运行的模块,负责读取JSON定义并从中创建生动的Web应用程序。 +- [packages/server](https://github.com/Budibase/budibase/tree/HEAD/packages/server)-budibase服务器。该Koa应用程序负责为构建器和budibase应用程序提供JS服务,并提供与数据库和文件系统交互的API。 + +有关更多信息,请参见[CONTRIBUTING.md](https://github.com/Budibase/budibase/blob/HEAD/.github/CONTRIBUTING.md) + +## 📝 开源协议 + +Budibase是开源的。该构建器的许可证为[AGPL v3](https://www.gnu.org/licenses/agpl-3.0.en.html),服务器的许可证为[GPL v3](https://www.gnu.org/licenses/gpl-3.0.en.html),客户端的许可证为[MPL](https://directory.fsf.org/wiki/License:MPL-2.0)。 + +## 💬 保持联系 + +如果您有任何疑问或想与其他Budibase用户交谈,请跳至[Github讨论](https://github.com/Budibase/budibase/discussions)或加入我们的Discord服务器: + +[Discord 聊天室](https://discord.gg/rCYayfe) + +![Discord Shield](https://discordapp.com/api/guilds/733030666647765003/widget.png?style=shield) + + +## 贡献者 ✨ + +感谢这些出色的人 ([emoji key](https://allcontributors.org/docs/en/emoji-key)): + + + + + + + + + + + + + + + + + + + + + +

Martin McKeaveney

💻 📖 ⚠️ 🚇

Michael Drury

📖 💻 ⚠️ 🚇

Andrew Kingston

📖 💻 ⚠️ 🎨

Michael Shanks

📖 💻 ⚠️

Kevin Åberg Kultalahti

📖 💻 ⚠️

Joe

📖 💻 🖋 🎨

Conor_Mack

💻 ⚠️

pngwn

💻 ⚠️

HugoLd

💻

victoriasloan

💻

yashank09

💻

SOVLOOKUP

💻
+ + + + + + +该项目遵循[所有参与者的](https://github.com/all-contributors/all-contributors)规范。欢迎任何形式的捐助! diff --git a/packages/auth/src/db/utils.js b/packages/auth/src/db/utils.js index b5e5242cb5..91a682d859 100644 --- a/packages/auth/src/db/utils.js +++ b/packages/auth/src/db/utils.js @@ -166,7 +166,9 @@ exports.getAllApps = async (devApps = false) => { const appDbNames = allDbs.filter(dbName => dbName.startsWith(exports.APP_PREFIX) ) - const appPromises = appDbNames.map(db => new CouchDB(db).get(DocumentTypes.APP_METADATA)) + const appPromises = appDbNames.map(db => + new CouchDB(db).get(DocumentTypes.APP_METADATA) + ) if (appPromises.length === 0) { return [] } else { diff --git a/packages/auth/src/redis/index.js b/packages/auth/src/redis/index.js index 544f2b729b..5db80a216b 100644 --- a/packages/auth/src/redis/index.js +++ b/packages/auth/src/redis/index.js @@ -143,7 +143,6 @@ class RedisWrapper { } async clear() { - const db = this._db let items = await this.scan() await Promise.all(items.map(obj => this.delete(obj.key))) } diff --git a/packages/bbui/package.json b/packages/bbui/package.json index 056f4229cb..c4c7e14b4b 100644 --- a/packages/bbui/package.json +++ b/packages/bbui/package.json @@ -56,6 +56,7 @@ "@spectrum-css/link": "^3.1.1", "@spectrum-css/menu": "^3.0.1", "@spectrum-css/modal": "^3.0.1", + "@spectrum-css/pagination": "^3.0.3", "@spectrum-css/picker": "^1.0.1", "@spectrum-css/popover": "^3.0.1", "@spectrum-css/progressbar": "^1.0.2", diff --git a/packages/bbui/src/Avatar/Avatar.svelte b/packages/bbui/src/Avatar/Avatar.svelte index 7a6ad5f004..f4e42b28a3 100644 --- a/packages/bbui/src/Avatar/Avatar.svelte +++ b/packages/bbui/src/Avatar/Avatar.svelte @@ -16,7 +16,10 @@ function getInitials(name) { let parts = name.split(" ") - return parts.map(name => name[0]).join("") + if (parts.length > 0) { + return parts.map(name => name[0]).join("") + } + return name } diff --git a/packages/bbui/src/Form/Checkbox.svelte b/packages/bbui/src/Form/Checkbox.svelte index 1f3e439c2a..90a2cddda5 100644 --- a/packages/bbui/src/Form/Checkbox.svelte +++ b/packages/bbui/src/Form/Checkbox.svelte @@ -17,6 +17,6 @@ } - + diff --git a/packages/bbui/src/Form/Combobox.svelte b/packages/bbui/src/Form/Combobox.svelte index e08e609732..b718921325 100644 --- a/packages/bbui/src/Form/Combobox.svelte +++ b/packages/bbui/src/Form/Combobox.svelte @@ -8,7 +8,7 @@ export let disabled = false export let labelPosition = "above" export let error = null - export let placeholder = "Choose an option" + export let placeholder = "Choose an option or type" export let options = [] export let getOptionLabel = option => extractProperty(option, "label") export let getOptionValue = option => extractProperty(option, "value") @@ -26,7 +26,7 @@ } - + { // Always use placeholder if no value if (value == null || value === "") { - return placeholder || "Choose an option" + return placeholder || "Choose an option or type" } // Wait for options to load if there is a value but no options @@ -45,10 +45,16 @@ } -
+
(focus = false)} on:change={onChange} {value} + {disabled} {placeholder} class="spectrum-Textfield-input spectrum-InputGroup-input" /> @@ -65,7 +72,7 @@ class="spectrum-Picker spectrum-Picker--sizeM spectrum-InputGroup-button" tabindex="-1" aria-haspopup="true" - disabled={!!error} + {disabled} on:click={() => (open = true)} > - + - + diff --git a/packages/bbui/src/Form/Input.svelte b/packages/bbui/src/Form/Input.svelte index 327fefa32c..07ebf4f4db 100644 --- a/packages/bbui/src/Form/Input.svelte +++ b/packages/bbui/src/Form/Input.svelte @@ -19,7 +19,7 @@ } - + - + - + - + - +
+ +
+ + Page {page} + +
+ +
+ + + diff --git a/packages/bbui/src/ProgressCircle/ProgressCircle.svelte b/packages/bbui/src/ProgressCircle/ProgressCircle.svelte index 711517ec7b..9c8181ec7c 100644 --- a/packages/bbui/src/ProgressCircle/ProgressCircle.svelte +++ b/packages/bbui/src/ProgressCircle/ProgressCircle.svelte @@ -42,7 +42,7 @@
diff --git a/packages/bbui/src/Table/Table.svelte b/packages/bbui/src/Table/Table.svelte index 048ded2b5b..74bbda278c 100644 --- a/packages/bbui/src/Table/Table.svelte +++ b/packages/bbui/src/Table/Table.svelte @@ -4,6 +4,16 @@ import CellRenderer from "./CellRenderer.svelte" import SelectEditRenderer from "./SelectEditRenderer.svelte" + /** + * The expected schema is our normal couch schemas for our tables. + * Each field schema can be enriched with a few extra properties to customise + * the behaviour. + * All of these are optional and do not need to be added. + * displayName: Overrides the field name displayed as the column title + * sortable: Set to false to disable sorting data by a certain column + * editable: Set to false to disable editing a certain column if the + * allowEditColumns prop is true + */ export let data = [] export let schema = {} export let showAutoColumns = false @@ -272,6 +282,7 @@ {#if sortedRows?.length && fields.length} {#each sortedRows as row, idx} dispatch("click", row)} on:click={() => toggleSelectRow(row)} class="spectrum-Table-row" class:hidden={idx < firstVisibleRow || idx > lastVisibleRow} @@ -462,10 +473,6 @@ tbody tr.hidden { height: calc(var(--row-height) + 1px); } - tbody tr.offset { - background-color: red; - display: block; - } td { padding-top: 0; padding-bottom: 0; diff --git a/packages/bbui/src/TreeView/Item.svelte b/packages/bbui/src/TreeView/Item.svelte index ef6b0aa021..104c392b65 100644 --- a/packages/bbui/src/TreeView/Item.svelte +++ b/packages/bbui/src/TreeView/Item.svelte @@ -1,6 +1,7 @@ @@ -10,7 +11,7 @@ class:is-open={open} class="spectrum-TreeView-item" > - + {#if $$slots.default} { await initialise() }) - const config = {} + const queryHandler = { parse, stringify } - +