refactor: migrate names (#1050)

Reviewed-on: daoyoucloud/tachybase#1050
This commit is contained in:
sealday 2024-05-24 13:06:59 +08:00
parent 95d2c2f1ee
commit ccd799f85f
314 changed files with 1260 additions and 1510 deletions

View File

@ -6,10 +6,10 @@ DB_POSTGRES_PORT=10103
VERDACCIO_PORT=10104
# VERDACCIO_URL=http://host.docker.internal:10104/
################# NOCOBASE APPLICATION #################
################# TACHYBASE APPLICATION #################
# !!! When `APP_ENV=production`, opening http://localhost:13000/ will show "Not Found".
# !!! It is recommended to use nginx to proxy static files. For example https://github.com/nocobase/nocobase/blob/main/docker/nocobase/nocobase.conf
# !!! It is recommended to use nginx to proxy static files. For example https://github.com/tachybase/tachybase/blob/main/docker/tachybase/tachybase.conf
APP_ENV=development
APP_PORT=20000
APP_KEY=test-key-e2e
@ -31,13 +31,13 @@ LOGGER_BASE_PATH=storage/e2e/logs
################# DATABASE #################
DB_DIALECT=postgres
DB_STORAGE=storage/e2e/db/nocobase.sqlite
DB_STORAGE=storage/e2e/db/tachybase.sqlite
DB_TABLE_PREFIX=
DB_HOST=localhost
DB_PORT=5432
DB_DATABASE=nocobase-e2e
DB_USER=nocobase
DB_PASSWORD=nocobase
DB_DATABASE=tachybase-e2e
DB_USER=tachybase
DB_PASSWORD=tachybase
# DB_LOGGING=on
# DB_UNDERSCORED=false
@ -56,7 +56,7 @@ DB_PASSWORD=nocobase
INIT_ROOT_EMAIL=admin@tachybase.com
INIT_ROOT_PASSWORD=admin123
INIT_ROOT_NICKNAME=Super Admin
INIT_ROOT_USERNAME=nocobase
INIT_ROOT_USERNAME=tachybase
# local or ali-oss
DEFAULT_STORAGE_TYPE=local

View File

@ -6,10 +6,10 @@ DB_POSTGRES_PORT=10103
VERDACCIO_PORT=10104
# VERDACCIO_URL=http://host.docker.internal:10104/
################# NOCOBASE APPLICATION #################
################# TACHYBASE APPLICATION #################
# !!! When `APP_ENV=production`, opening http://localhost:13000/ will show "Not Found".
# !!! It is recommended to use nginx to proxy static files. For example https://github.com/nocobase/nocobase/blob/main/docker/nocobase/nocobase.conf
# !!! It is recommended to use nginx to proxy static files. For example https://github.com/tachybase/tachybase/blob/main/docker/tachybase/tachybase.conf
APP_ENV=development
APP_PORT=13000
APP_KEY=test-key
@ -32,13 +32,13 @@ LOGGER_FORMAT=
################# DATABASE #################
DB_DIALECT=sqlite
DB_STORAGE=storage/db/nocobase.sqlite
DB_STORAGE=storage/db/tachybase.sqlite
DB_TABLE_PREFIX=
# DB_HOST=localhost
# DB_PORT=5432
# DB_DATABASE=postgres
# DB_USER=nocobase
# DB_PASSWORD=nocobase
# DB_USER=tachybase
# DB_PASSWORD=tachybase
# DB_LOGGING=on
# DB_UNDERSCORED=false

View File

@ -1,4 +1,4 @@
################# NOCOBASE APPLICATION #################
################# TACHYBASE APPLICATION #################
APP_ENV=development
APP_PORT=13000
@ -12,12 +12,12 @@ PROXY_TARGET_URL=
################# DATABASE #################
DB_DIALECT=sqlite
DB_STORAGE=storage/db/nocobase-test.sqlite
DB_STORAGE=storage/db/tachybase-test.sqlite
# DB_HOST=localhost
# DB_PORT=5432
# DB_DATABASE=nocobase-test
# DB_USER=nocobase
# DB_PASSWORD=nocobase
# DB_DATABASE=tachybase-test
# DB_USER=tachybase
# DB_PASSWORD=tachybase
# DB_LOGGING=on
################# CACHE #################
@ -29,7 +29,7 @@ DB_STORAGE=storage/db/nocobase-test.sqlite
INIT_ROOT_EMAIL=admin@tachybase.com
INIT_ROOT_PASSWORD=admin123
INIT_ROOT_NICKNAME=Super Admin
INIT_ROOT_USERNAME=nocobase
INIT_ROOT_USERNAME=tachybase
# local or ali-oss
DEFAULT_STORAGE_TYPE=local

View File

@ -1,7 +1,7 @@
FROM node:20-bullseye-slim as base
RUN apt-get update && apt-get install -y nginx
RUN rm -rf /etc/nginx/sites-enabled/default
COPY ./docker/nocobase/nocobase.conf /etc/nginx/sites-enabled/nocobase.conf
COPY ./docker/tachybase/tachybase.conf /etc/nginx/sites-enabled/tachybase.conf
FROM node:20-bullseye as build-template-app
ARG NPM_REGISTRY=https://registry.npmjs.org/
@ -12,25 +12,25 @@ ENV PATH="$PNPM_HOME:$PATH"
RUN corepack enable
WORKDIR /app
RUN cd /app && npx --registry $NPM_REGISTRY create-tachybase-app@$TACHYBASE_VERSION my-nocobase-app -a -e APP_ENV=production
RUN cd /app && npx --registry $NPM_REGISTRY create-tachybase-app@$TACHYBASE_VERSION my-tachybase-app -a -e APP_ENV=production
RUN pnpm config set registry $NPM_REGISTRY
RUN --mount=type=cache,id=pnpm,target=/pnpm/store cd /app/my-nocobase-app && pnpm install --production
RUN --mount=type=cache,id=pnpm,target=/pnpm/store cd /app/my-tachybase-app && pnpm install --production
WORKDIR /app/my-nocobase-app
WORKDIR /app/my-tachybase-app
RUN cd /app \
&& rm -rf my-nocobase-app/packages/app/client/src/.umi \
&& rm -rf nocobase.tar.gz \
&& tar -zcf ./nocobase.tar.gz -C /app/my-nocobase-app .
&& rm -rf my-tachybase-app/packages/app/client/src/.umi \
&& rm -rf tachybase.tar.gz \
&& tar -zcf ./tachybase.tar.gz -C /app/my-tachybase-app .
FROM base AS build-app
COPY --from=build-template-app /app/nocobase.tar.gz /app/nocobase.tar.gz
COPY --from=build-template-app /app/tachybase.tar.gz /app/tachybase.tar.gz
WORKDIR /app/nocobase
WORKDIR /app/tachybase
RUN mkdir -p /app/nocobase/storage/uploads/ && echo "$COMMIT_HASH" >> /app/nocobase/storage/uploads/COMMIT_HASH
RUN mkdir -p /app/tachybase/storage/uploads/ && echo "$COMMIT_HASH" >> /app/tachybase/storage/uploads/COMMIT_HASH
COPY ./docker/nocobase/docker-entrypoint.sh /app/
COPY ./docker/tachybase/docker-entrypoint.sh /app/
ENV PNPM_HOME="/pnpm"
ENV PATH="$PNPM_HOME:$PATH"

View File

@ -2,4 +2,4 @@
TachyCode is a scalability-first, open-source no-code development platform.
It is based on the last Apache version fork of the open-source NocoBase.
It is based on the last Apache version fork of the open-source TachyBase.

View File

@ -2,11 +2,6 @@
"name": "@tachybase/actions",
"version": "0.21.34",
"description": "",
"repository": {
"type": "git",
"url": "git+https://github.com/nocobase/nocobase.git",
"directory": "packages/actions"
},
"license": "Apache-2.0",
"main": "./lib/index.js",
"types": "./lib/index.d.ts",
@ -18,6 +13,5 @@
"koa": "^2.13.4",
"lodash": "4.17.21",
"sequelize": "^6.26.0"
},
"gitHead": "d0b4efe4be55f8c79a98a331d99d9f8cf99021a1"
}
}

View File

@ -38,10 +38,10 @@ export default defineConfig({
{
content: isDevCmd ? '' : `
window['__webpack_public_path__'] = '{{env.APP_PUBLIC_PATH}}';
window['__nocobase_public_path__'] = '{{env.APP_PUBLIC_PATH}}';
window['__nocobase_api_base_url__'] = '{{env.API_BASE_URL}}';
window['__nocobase_ws_url__'] = '{{env.WS_URL}}';
window['__nocobase_ws_path__'] = '{{env.WS_PATH}}';
window['__tachybase_public_path__'] = '{{env.APP_PUBLIC_PATH}}';
window['__tachybase_api_base_url__'] = '{{env.API_BASE_URL}}';
window['__tachybase_ws_url__'] = '{{env.WS_URL}}';
window['__tachybase_ws_path__'] = '{{env.WS_PATH}}';
`,
},
],
@ -75,7 +75,7 @@ export default defineConfig({
},
chainWebpack(config, { env }) {
if (env === 'production') {
config.plugin('ignore nocobase plugins').use(require('webpack').IgnorePlugin, [
config.plugin('ignore tachybase plugins').use(require('webpack').IgnorePlugin, [
{
resourceRegExp: new RegExp(pluginPrefix.join('|')),
},

View File

@ -1,20 +1,21 @@
import { Application } from '@tachybase/client';
import { TachyBaseClientPresetPlugin } from '@tachybase/preset-tachybase/client';
import devDynamicImport from '../.plugins/index';
export const app = new Application({
apiClient: {
// @ts-ignore
baseURL: window['__nocobase_api_base_url__'] || process.env.API_BASE_URL || '/api/',
baseURL: window['__tachybase_api_base_url__'] || process.env.API_BASE_URL || '/api/',
},
// @ts-ignore
publicPath: window['__nocobase_public_path__'] || process.env.APP_PUBLIC_PATH || '/',
publicPath: window['__tachybase_public_path__'] || process.env.APP_PUBLIC_PATH || '/',
plugins: [TachyBaseClientPresetPlugin],
ws: {
// @ts-ignore
url: window['__nocobase_ws_url__'] || process.env.WEBSOCKET_URL || '',
url: window['__tachybase_ws_url__'] || process.env.WEBSOCKET_URL || '',
// @ts-ignore
basename: window['__nocobase_ws_path__'] || process.env.WS_PATH || '/ws',
basename: window['__tachybase_ws_path__'] || process.env.WS_PATH || '/ws',
},
loadRemotePlugins: true,
devDynamicImport,

View File

@ -17,6 +17,5 @@
"@tachybase/cache": "workspace:*",
"@tachybase/client": "workspace:*",
"@tachybase/logger": "workspace:*"
},
"gitHead": "d0b4efe4be55f8c79a98a331d99d9f8cf99021a1"
}
}

View File

@ -1,8 +1,9 @@
import { resolve } from 'path';
import { mockDatabase } from '@tachybase/database';
import { uid } from '@tachybase/utils';
import axios from 'axios';
import execa from 'execa';
import { resolve } from 'path';
import { getPortPromise } from 'portfinder';
const delay = (timeout) => {
@ -53,7 +54,7 @@ const run = (command, args, options) => {
const createDatabase = async () => {
if (process.env.DB_DIALECT === 'sqlite') {
return 'nocobase';
return 'tachybase';
}
const db = mockDatabase();
const name = `d_${uid()}`;
@ -69,7 +70,7 @@ describe.skip('cli', () => {
port: 13000,
});
console.log(process.env.DB_DIALECT, port);
const dbFile = `storage/tests/db/nocobase-${uid()}.sqlite`;
const dbFile = `storage/tests/db/tachybase-${uid()}.sqlite`;
const env = {
...process.env,
APP_PORT: `${port}`,
@ -78,15 +79,15 @@ describe.skip('cli', () => {
SOCKET_PATH: `storage/tests/gateway-e2e-${uid()}.sock`,
PM2_HOME: resolve(process.cwd(), `storage/tests/.pm2-${uid()}`),
};
const subprocess1 = await execa('pnpm', ['nocobase', 'install'], {
const subprocess1 = await execa('pnpm', ['tachybase', 'install'], {
env,
});
expect(subprocess1.stdout.includes('app installed successfully')).toBeTruthy();
const subprocess2 = await execa('pnpm', ['nocobase', 'install'], {
const subprocess2 = await execa('pnpm', ['tachybase', 'install'], {
env,
});
expect(subprocess2.stdout.includes('app is installed')).toBeTruthy();
const subprocess3 = await execa('pnpm', ['nocobase', 'install', '-f'], {
const subprocess3 = await execa('pnpm', ['tachybase', 'install', '-f'], {
env,
});
expect(subprocess3.stdout.includes('app reinstalled successfully')).toBeTruthy();
@ -98,7 +99,7 @@ describe.skip('cli', () => {
const port = await getPortPromise({
port: 13000,
});
const dbFile = `storage/tests/db/nocobase-${uid()}.sqlite`;
const dbFile = `storage/tests/db/tachybase-${uid()}.sqlite`;
const env = {
...process.env,
APP_PORT: `${port}`,
@ -107,13 +108,13 @@ describe.skip('cli', () => {
SOCKET_PATH: `storage/tests/gateway-e2e-${uid()}.sock`,
PM2_HOME: resolve(process.cwd(), `storage/tests/.pm2-${uid()}`),
};
const subprocess1 = execa('pnpm', ['nocobase', 'dev', '--server'], {
const subprocess1 = execa('pnpm', ['tachybase', 'dev', '--server'], {
env,
});
const code = await checkServer(port);
console.log(code);
expect(code).toBe('APP_NOT_INSTALLED_ERROR');
execa('pnpm', ['nocobase', 'install'], {
execa('pnpm', ['tachybase', 'install'], {
env,
});
await delay(5000);
@ -128,7 +129,7 @@ describe.skip('cli', () => {
const port = await getPortPromise({
port: 13000,
});
const dbFile = `storage/tests/db/nocobase-${uid()}.sqlite`;
const dbFile = `storage/tests/db/tachybase-${uid()}.sqlite`;
const env = {
...process.env,
APP_PORT: `${port}`,
@ -137,10 +138,10 @@ describe.skip('cli', () => {
SOCKET_PATH: `storage/tests/gateway-e2e-${uid()}.sock`,
PM2_HOME: resolve(process.cwd(), `storage/tests/.pm2-${uid()}`),
};
await execa('pnpm', ['nocobase', 'install'], {
await execa('pnpm', ['tachybase', 'install'], {
env,
});
const subprocess1 = execa('pnpm', ['nocobase', 'dev', '--server'], {
const subprocess1 = execa('pnpm', ['tachybase', 'dev', '--server'], {
env,
});
const code = await checkServer(port);
@ -154,7 +155,7 @@ describe.skip('cli', () => {
const port = await getPortPromise({
port: 13000,
});
const dbFile = `storage/tests/db/nocobase-${uid()}.sqlite`;
const dbFile = `storage/tests/db/tachybase-${uid()}.sqlite`;
const env = {
...process.env,
APP_PORT: `${port}`,
@ -164,13 +165,13 @@ describe.skip('cli', () => {
PM2_HOME: resolve(process.cwd(), `storage/tests/.pm2-${uid()}`),
};
console.log('DB_STORAGE:', dbFile);
const subprocess1 = execa('pnpm', ['nocobase', 'dev', '--server', '--quickstart'], {
const subprocess1 = execa('pnpm', ['tachybase', 'dev', '--server', '--quickstart'], {
env,
});
const code = await checkServer(port);
expect(code).toBe(true);
subprocess1.cancel();
const subprocess2 = execa('pnpm', ['nocobase', 'dev', '--server', '--quickstart'], {
const subprocess2 = execa('pnpm', ['tachybase', 'dev', '--server', '--quickstart'], {
env,
});
const code2 = await checkServer(port);
@ -184,7 +185,7 @@ describe.skip('cli', () => {
const port = await getPortPromise({
port: 13000,
});
const dbFile = `storage/tests/db/nocobase-${uid()}.sqlite`;
const dbFile = `storage/tests/db/tachybase-${uid()}.sqlite`;
const env = {
...process.env,
APP_PORT: `${port}`,
@ -194,13 +195,13 @@ describe.skip('cli', () => {
PM2_HOME: resolve(process.cwd(), `storage/tests/.pm2-${uid()}`),
};
console.log('DB_STORAGE:', dbFile);
await execa('pnpm', ['nocobase', 'install'], {
await execa('pnpm', ['tachybase', 'install'], {
env,
});
const subprocess2 = await execa('pnpm', ['nocobase', 'upgrade'], {
const subprocess2 = await execa('pnpm', ['tachybase', 'upgrade'], {
env,
});
expect(subprocess2.stdout.includes('NocoBase has been upgraded')).toBe(true);
expect(subprocess2.stdout.includes('TachyBase has been upgraded')).toBe(true);
});
test('quickstart + upgrade', async () => {
@ -209,7 +210,7 @@ describe.skip('cli', () => {
const port = await getPortPromise({
port: 13000,
});
const dbFile = `storage/tests/db/nocobase-${uid()}.sqlite`;
const dbFile = `storage/tests/db/tachybase-${uid()}.sqlite`;
const env = {
...process.env,
APP_PORT: `${port}`,
@ -219,12 +220,12 @@ describe.skip('cli', () => {
PM2_HOME: resolve(process.cwd(), `storage/tests/.pm2-${uid()}`),
};
console.log('DB_STORAGE:', dbFile);
const subprocess1 = execa('pnpm', ['nocobase', 'dev', '--server', '--quickstart'], {
const subprocess1 = execa('pnpm', ['tachybase', 'dev', '--server', '--quickstart'], {
env,
});
const code = await checkServer(port);
expect(code).toBe(true);
await execa('pnpm', ['nocobase', 'upgrade'], {
await execa('pnpm', ['tachybase', 'upgrade'], {
env,
});
await delay(5000);

View File

@ -2,11 +2,6 @@
"name": "@tachybase/auth",
"version": "0.21.34",
"description": "",
"repository": {
"type": "git",
"url": "git+https://github.com/nocobase/nocobase.git",
"directory": "packages/auth"
},
"license": "Apache-2.0",
"main": "./lib/index.js",
"types": "./lib/index.d.ts",
@ -18,6 +13,5 @@
"@tachybase/utils": "workspace:*",
"@types/jsonwebtoken": "^8.5.8",
"jsonwebtoken": "^8.5.1"
},
"gitHead": "d0b4efe4be55f8c79a98a331d99d9f8cf99021a1"
}
}

View File

@ -7,7 +7,7 @@
"types": "./lib/index.d.ts",
"typings": "./index.d.ts",
"bin": {
"nocobase-build": "./bin/nocobase-build.js"
"tachybase-build": "./bin/tachybase-build.js"
},
"scripts": {
"build": "tsup",
@ -40,6 +40,5 @@
"vite-plugin-css-injected-by-js": "^3.2.1",
"vite-plugin-lib-inject-css": "1.2.0",
"yargs-parser": "13.1.2"
},
"gitHead": "d0b4efe4be55f8c79a98a331d99d9f8cf99021a1"
}
}

View File

@ -27,7 +27,7 @@ const clientGlobalFiles: string[] = ['src/**', '!src/server/**', ...globExcludeF
const sourceGlobalFiles: string[] = ['src/**/*.{ts,js,tsx,jsx,mjs}', '!src/**/__tests__'];
const external = [
// nocobase
// tachybase
'@tachybase/acl',
'@tachybase/actions',
'@tachybase/auth',
@ -187,7 +187,7 @@ export async function buildServerDeps(cwd: string, serverFiles: string[], log: P
if (excludePackages.length) {
tips.push(`These packages ${chalk.yellow(excludePackages.join(', '))} will be ${chalk.italic('exclude')}.`);
}
tips.push(`For more information, please refer to: ${chalk.blue('https://docs.nocobase.com/development/deps')}.`);
tips.push(`For more information, please refer to: ${chalk.blue('https://docs.tachybase.com/development/deps')}.`);
log(tips.join(' '));
if (!includePackages.length) return;

View File

@ -103,7 +103,7 @@ export function checkDependencies(packageJson: Record<string, any>, log: Log) {
chalk.yellow(packages.join(', ')),
chalk.yellow('dependencies'),
chalk.yellow('devDependencies'),
chalk.blue(chalk.blue('https://docs.nocobase.com/development/deps')),
chalk.blue(chalk.blue('https://docs.tachybase.com/development/deps')),
);
}

View File

@ -81,7 +81,7 @@ export function getUserConfig(cwd: string) {
return config;
}
const CACHE_DIR = path.join(NODE_MODULES, '.cache', 'nocobase');
const CACHE_DIR = path.join(NODE_MODULES, '.cache', 'tachybase');
export function writeToCache(key: string, data: Record<string, any>) {
const cachePath = path.join(CACHE_DIR, `${key}.json`);
fs.ensureDirSync(path.dirname(cachePath));

View File

@ -14,6 +14,5 @@
"deepmerge": "^4.2.2",
"lodash": "4.17.21",
"redis": "^4.6.10"
},
"gitHead": "d0b4efe4be55f8c79a98a331d99d9f8cf99021a1"
}
}

View File

@ -14,7 +14,7 @@
"bin",
"dist",
"templates",
"nocobase.conf.tpl"
"tachybase.conf.tpl"
],
"scripts": {
"build": "rimraf dist && rollup -c",

View File

@ -27,7 +27,7 @@ export default (cli: Command) => {
}
process.env['VITE_CJS_IGNORE_WARNING'] = 'true';
await run('nocobase-build', [
await run('tachybase-build', [
...pkgs,
options.version ? '--version' : '',
!options.dts ? '--no-dts' : '',

View File

@ -7,14 +7,14 @@ const __dirname = new URL('.', import.meta.url).pathname;
export default (cli: Command) => {
cli.command('create-nginx-conf').action(async (name, options) => {
const file = resolve(__dirname, '../../nocobase.conf.tpl');
const file = resolve(__dirname, '../../tachybase.conf.tpl');
const data = readFileSync(file, 'utf-8');
const replaced = data
.replace(/\{\{cwd\}\}/g, '/app/nocobase')
.replace(/\{\{cwd\}\}/g, '/app/tachybase')
.replace(/\{\{publicPath\}\}/g, process.env.APP_PUBLIC_PATH!)
.replace(/\{\{apiPort\}\}/g, process.env.APP_PORT!);
const targetFile = resolve(process.cwd(), 'storage', 'nocobase.conf');
const targetFile = resolve(process.cwd(), 'storage', 'tachybase.conf');
writeFileSync(targetFile, replaced);
});
};

View File

@ -18,6 +18,6 @@ export default (cli: Command) => {
});
if (options.watch) return;
}
await run('nocobase-build', [...pkgs, '--only-tar', options.version ? '--version' : '']);
await run('tachybase-build', [...pkgs, '--only-tar', options.version ? '--version' : '']);
});
};

View File

@ -40,7 +40,7 @@ export class PluginGenerator extends Generator {
...this.context,
packageName: name,
packageVersion,
nocobaseVersion: "0.0.1",
tachybaseVersion: "0.0.1",
pascalCaseName: capitalize(camelize(name.split('/').pop())),
};
}

View File

@ -311,7 +311,7 @@ export function initEnv() {
APP_PORT: 13000,
API_BASE_PATH: '/api/',
DB_DIALECT: 'sqlite',
DB_STORAGE: 'storage/db/nocobase.sqlite',
DB_STORAGE: 'storage/db/tachybase.sqlite',
DB_TIMEZONE: '+00:00',
DB_UNDERSCORED: parseEnv('DB_UNDERSCORED'),
DEFAULT_STORAGE_TYPE: 'local',

View File

@ -18,7 +18,7 @@ server {
root {{cwd}}/node_modules/@tachybase/app/dist/client;
index index.html;
client_max_body_size 1000M;
access_log /var/log/nginx/nocobase.log apm;
access_log /var/log/nginx/tachybase.log apm;
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

View File

@ -74,6 +74,5 @@
"react": ">=18.0.0",
"react-dom": ">=18.0.0",
"react-is": ">=18.0.0"
},
"gitHead": "d0b4efe4be55f8c79a98a331d99d9f8cf99021a1"
}
}

View File

@ -45,7 +45,7 @@ const apiClient = new APIClient(instance);
// 常规请求
const response = await apiClient.request({ url });
// NocoBase 特有的资源操作
// TachyBase 特有的资源操作
const response = await apiClient.resource('posts').list();
// 请求共享
@ -100,7 +100,7 @@ run({
<code src="./demos/demo2.tsx"></code>
或者是 NocoBase 的 resource & action 请求:
或者是 TachyBase 的 resource & action 请求:
```ts
const { data, run } = useRequest({
@ -137,7 +137,7 @@ run(...params);
function useResource(name: string, of?: string | number): IResource;
```
资源是 NocoBase 的核心概念,包括:
资源是 TachyBase 的核心概念,包括:
- 独立资源,如 `posts`
- 关系资源,如 `posts.tags` `posts.user` `posts.comments`

View File

@ -1,13 +1,15 @@
import { useLocalStorageState } from 'ahooks';
import React from 'react';
import { useLocalStorageState } from 'ahooks';
import { SchemaComponentProvider } from '../schema-component/core';
import { ISchemaComponentProvider } from '../schema-component/types';
const getKeyByName = (name) => {
if (!name) {
return 'nocobase_designable'.toUpperCase();
return 'tachybase_designable'.toUpperCase();
}
return `nocobase_${name}_designable`.toUpperCase();
return `tachybase_${name}_designable`.toUpperCase();
};
const SchemaComponentProviderWithLocalStorageState: React.FC<ISchemaComponentProvider & { appName?: string }> = (

View File

@ -1,5 +1,6 @@
import { define, observable } from '@tachybase/schema';
import { getSubAppName } from '@tachybase/sdk';
import { Application } from './Application';
export type WebSocketClientOptions = {
@ -89,7 +90,7 @@ export class WebSocketClient {
return;
}
if (this._reconnectTimes === 0) {
console.log('[nocobase-ws]: connecting...');
console.log('[tachybase-ws]: connecting...');
}
if (this._reconnectTimes >= this.reconnectAttempts) {
return;
@ -101,7 +102,7 @@ export class WebSocketClient {
const ws = new WebSocket(this.getURL(), this.options.protocols);
let pingIntervalTimer: any;
ws.onopen = () => {
console.log('[nocobase-ws]: connected.');
console.log('[tachybase-ws]: connected.');
this.serverDown = false;
if (this._ws) {
this.removeAllListeners();

View File

@ -1,5 +1,6 @@
import { Application, Plugin } from '@tachybase/client';
import React, { FC } from 'react';
import { Application, Plugin } from '@tachybase/client';
import { Link, Outlet, useLocation } from 'react-router-dom';
const Root = () => {
@ -52,7 +53,7 @@ class Test2Plugin extends Plugin {
}
}
class NocobasePresetPlugin extends Plugin {
class TachybasePresetPlugin extends Plugin {
async afterAdd() {
// mock load remote plugin
await this.addRemotePlugin();
@ -82,7 +83,7 @@ const app = new Application({
router: {
type: 'hash',
},
plugins: [NocobasePresetPlugin],
plugins: [TachybasePresetPlugin],
components: { Root, Home, Team, About },
});

View File

@ -1,5 +1,6 @@
import { Application, Plugin, RouterManager, useApp } from '@tachybase/client';
import React, { useMemo } from 'react';
import { Application, Plugin, RouterManager, useApp } from '@tachybase/client';
import { Link, Navigate, Outlet, useParams } from 'react-router-dom';
const Root = () => {
@ -67,7 +68,7 @@ const AdminSetting = () => {
);
};
class NocobasePresetPlugin extends Plugin {
class TachybasePresetPlugin extends Plugin {
async load() {
this.router.add('root', {
path: '/',
@ -90,7 +91,7 @@ class NocobasePresetPlugin extends Plugin {
const app = new Application({
router: { type: 'hash' },
plugins: [NocobasePresetPlugin],
plugins: [TachybasePresetPlugin],
});
export default app.getRootComponent();

View File

@ -1,10 +1,10 @@
import { Application, NocoBaseBuildInPlugin } from '@tachybase/client';
import { Application, BuildinPlugin } from '@tachybase/client';
export const app = new Application({
apiClient: {
baseURL: process.env.API_BASE_URL,
},
plugins: [NocoBaseBuildInPlugin],
plugins: [BuildinPlugin],
});
export default app.getRootComponent();

View File

@ -6,7 +6,7 @@ group:
# Application V2
<img src="https://nocobase.oss-cn-beijing.aliyuncs.com/5be7ebc2f47effef85be7a0c75cf76f9.png" style="max-width: 800px;" />
<img src="https://tachybase.oss-cn-beijing.aliyuncs.com/5be7ebc2f47effef85be7a0c75cf76f9.png" style="max-width: 800px;" />
## Usage

View File

@ -1,5 +1,7 @@
import { ButtonProps } from 'antd';
import React, { FC, ReactNode, useCallback, useMemo } from 'react';
import { ButtonProps } from 'antd';
import { useCompile } from '../../../schema-component';
import { useApp } from '../../hooks';
import { SchemaInitializerChild, SchemaInitializerItems } from '../components';
@ -148,7 +150,7 @@ export function useSchemaInitializerRender<P1 = ButtonProps, P2 = {}>(
}
if (!initializer) {
console.error(`[nocobase]: SchemaInitializer "${name}" not found`);
console.error(`[tachybase]: SchemaInitializer "${name}" not found`);
return {
exists: false,
render: () => null,

View File

@ -1,13 +1,12 @@
import { useMemo } from 'react';
import { useApp } from '../../hooks';
import { SchemaSettingOptions } from '../types';
import React from 'react';
import { SchemaSettingsWrapper } from '../components';
import { SchemaSettingsProps } from '../../../schema-settings';
import { Schema } from '@tachybase/schema';
import { GeneralField } from '@tachybase/schema';
import React, { useMemo } from 'react';
import { GeneralField, Schema } from '@tachybase/schema';
import { Designable } from '../../../schema-component';
import { SchemaSettingsProps } from '../../../schema-settings';
import { useApp } from '../../hooks';
import { SchemaSettingsWrapper } from '../components';
import { defaultSettingItems } from '../SchemaSettingsDefaults';
import { SchemaSettingOptions } from '../types';
type UseSchemaSettingsRenderOptions<T = {}> = Omit<SchemaSettingOptions<T>, 'name' | 'items'> &
Omit<SchemaSettingsProps, 'title' | 'children'> & {
@ -28,7 +27,7 @@ export function useSchemaSettingsRender<T = {}>(name: string, options?: UseSchem
}
if (!schemaSetting) {
console.error(`[nocobase]: SchemaSettings "${name}" not found`);
console.error(`[tachybase]: SchemaSettings "${name}" not found`);
return {
exists: false,
render: () => null,

View File

@ -1,11 +1,6 @@
import * as antdCssinjs from '@ant-design/cssinjs';
import * as antdIcons from '@ant-design/icons';
import * as dndKitAccessibility from '@dnd-kit/accessibility';
import * as dndKitCore from '@dnd-kit/core';
import * as dndKitModifiers from '@dnd-kit/modifiers';
import * as dndKitSortable from '@dnd-kit/sortable';
import * as dndKitUtilities from '@dnd-kit/utilities';
import * as emotionCss from '@emotion/css';
import React from 'react';
import * as tachybaseComponents from '@tachybase/components';
import * as tachybaseEvaluators from '@tachybase/evaluators/client';
import * as formilyCore from '@tachybase/schema';
import * as formilyJsonSchema from '@tachybase/schema';
import * as formilyPath from '@tachybase/schema';
@ -14,26 +9,32 @@ import * as formilyJsonReactive from '@tachybase/schema';
import * as formilyReactiveReact from '@tachybase/schema';
import * as formilyShared from '@tachybase/schema';
import * as formilyValidator from '@tachybase/schema';
import * as nocobaseEvaluators from '@tachybase/evaluators/client';
import * as nocobaseClientUtils from '@tachybase/utils/client';
import * as nocobaseSDK from '@tachybase/sdk';
import * as nocobaseSchema from '@tachybase/schema';
import * as nocobaseComponents from '@tachybase/components';
import * as tachybaseSchema from '@tachybase/schema';
import * as tachybaseSDK from '@tachybase/sdk';
import * as tachybaseClientUtils from '@tachybase/utils/client';
import { dayjs } from '@tachybase/utils/client';
import * as antdCssinjs from '@ant-design/cssinjs';
import * as antdIcons from '@ant-design/icons';
import * as dndKitAccessibility from '@dnd-kit/accessibility';
import * as dndKitCore from '@dnd-kit/core';
import * as dndKitModifiers from '@dnd-kit/modifiers';
import * as dndKitSortable from '@dnd-kit/sortable';
import * as dndKitUtilities from '@dnd-kit/utilities';
import * as emotionCss from '@emotion/css';
import * as ahooks from 'ahooks';
import * as antd from 'antd';
import * as antdStyle from 'antd-style';
import axios from 'axios';
import * as i18next from 'i18next';
import lodash from 'lodash';
import React from 'react';
import ReactDOM from 'react-dom';
import * as reactI18next from 'react-i18next';
import * as ReactRouter from 'react-router';
import * as ReactRouterDom from 'react-router-dom';
import jsxRuntime from 'react/jsx-runtime';
import * as nocobaseClient from '../../index';
import * as tachybaseClient from '../../index';
import type { RequireJS } from './requirejs';
/**
@ -69,16 +70,16 @@ export function defineGlobalDeps(requirejs: RequireJS) {
requirejs.define('@formily/validator', () => formilyValidator);
requirejs.define('@formily/reactive-react', () => formilyReactiveReact);
// nocobase
requirejs.define('@tachybase/utils', () => nocobaseClientUtils);
requirejs.define('@tachybase/utils/client', () => nocobaseClientUtils);
requirejs.define('@tachybase/client', () => nocobaseClient);
requirejs.define('@tachybase/client/client', () => nocobaseClient);
requirejs.define('@tachybase/evaluators', () => nocobaseEvaluators);
requirejs.define('@tachybase/evaluators/client', () => nocobaseEvaluators);
requirejs.define('@tachybase/sdk', () => nocobaseSDK);
requirejs.define('@tachybase/schema', () => nocobaseSchema);
requirejs.define('@tachybase/components', () => nocobaseComponents);
// tachybase
requirejs.define('@tachybase/utils', () => tachybaseClientUtils);
requirejs.define('@tachybase/utils/client', () => tachybaseClientUtils);
requirejs.define('@tachybase/client', () => tachybaseClient);
requirejs.define('@tachybase/client/client', () => tachybaseClient);
requirejs.define('@tachybase/evaluators', () => tachybaseEvaluators);
requirejs.define('@tachybase/evaluators/client', () => tachybaseEvaluators);
requirejs.define('@tachybase/sdk', () => tachybaseSDK);
requirejs.define('@tachybase/schema', () => tachybaseSchema);
requirejs.define('@tachybase/components', () => tachybaseComponents);
// dnd-kit 相关
requirejs.define('@dnd-kit/accessibility', () => dndKitAccessibility);

View File

@ -1,7 +1,7 @@
import type { DevDynamicImport } from '../Application';
import type { Plugin } from '../Plugin';
import type { PluginData } from '../PluginManager';
import type { RequireJS } from './requirejs';
import type { DevDynamicImport } from '../Application';
/**
* @internal
@ -63,7 +63,7 @@ export function processRemotePlugins(pluginData: PluginData[], resolve: (plugins
if (emptyPlugins.length > 0) {
console.error(
'[nocobase load plugin error]: These plugins do not have an `export.default` exported content or there is an error in the plugins. error plugins: \r\n%s',
'[tachybase load plugin error]: These plugins do not have an `export.default` exported content or there is an error in the plugins. error plugins: \r\n%s',
emptyPlugins.join(', \r\n'),
);
}

View File

@ -1313,7 +1313,7 @@ function getTargetField(obj) {
/**
* 使 form.reset()
* https://nocobase.height.app/T-3106
* https://tachybase.height.app/T-3106
* @param form
*/
async function resetFormCorrectly(form: Form) {

View File

@ -15,7 +15,7 @@ import {
* recordData parentRecordData ; schema
* `通过点击关系字段按钮打开的弹窗中创建的非关系字段区块``关系字段区块`使 hook
*
* schema https://nocobase.height.app/T-3848/description
* schema https://tachybase.height.app/T-3848/description
*
* @param param0
* @returns

View File

@ -1,4 +1,4 @@
import React, { FC } from 'react';
import React from 'react';
import { observer } from '@tachybase/schema';
import { getSubAppName } from '@tachybase/sdk';
@ -26,6 +26,11 @@ import { SystemSettingsPlugin } from '../system-settings';
import { CurrentUserProvider, CurrentUserSettingsMenuProvider } from '../user';
import { LocalePlugin } from './plugins/LocalePlugin';
interface AppStatusProps {
error: Error;
app: Application;
}
const AppSpin = () => {
return (
<Spin style={{ position: 'fixed', top: '50%', left: '50%', fontSize: 72, transform: 'translate(-50%, -50%)' }} />
@ -78,8 +83,8 @@ const useErrorProps = (app: Application, error: any) => {
}
};
const AppError: FC<{ error: Error; app: Application }> = observer(
({ app, error }) => {
const AppError = observer(
({ app, error }: AppStatusProps) => {
const props = useErrorProps(app, error);
const { styles } = useStyles();
return (
@ -207,8 +212,8 @@ const getProps = (app: Application) => {
return {};
};
const AppMaintaining: FC<{ app: Application; error: Error }> = observer(
({ app }) => {
const AppMaintaining = observer(
({ app }: AppStatusProps) => {
const { icon, status, title, subTitle } = getProps(app);
const { styles } = useStyles();
return (
@ -231,8 +236,8 @@ const AppMaintaining: FC<{ app: Application; error: Error }> = observer(
{ displayName: 'AppMaintaining' },
);
const AppMaintainingDialog: FC<{ app: Application; error: Error }> = observer(
({ app }) => {
const AppMaintainingDialog = observer(
({ app }: AppStatusProps) => {
const { icon, status, title, subTitle } = getProps(app);
return (
<Modal open={true} footer={null} closable={false}>
@ -259,7 +264,7 @@ const AppNotFound = () => {
);
};
export class NocoBaseBuildInPlugin extends Plugin {
export class BuildinPlugin extends Plugin {
async afterAdd() {
this.app.addComponents({
AppSpin,

View File

@ -1,6 +1,8 @@
import { setValidateLanguage } from '@tachybase/schema';
import { App, ConfigProvider } from 'antd';
import dayjs from 'dayjs';
import { loadConstrueLocale } from '../../antd-config-provider/loadConstrueLocale';
import { Plugin } from '../../application/Plugin';
import { dayjsLocale } from '../../locale';

View File

@ -1,10 +1,12 @@
import { useCallback, useEffect, useMemo } from 'react';
import { useField, useForm } from '@tachybase/schema';
import { message } from 'antd';
import _ from 'lodash';
import cloneDeep from 'lodash/cloneDeep';
import omit from 'lodash/omit';
import { useCallback, useEffect, useMemo } from 'react';
import { useTranslation } from 'react-i18next';
import { useCollection_deprecated, useCollectionManager_deprecated } from '.';
import { useRequest } from '../api-client';
import { useRecord } from '../record-provider';
@ -585,7 +587,7 @@ export const useFilterActionProps = () => {
const options = useFilterFieldOptions(collection.fields);
const service = useResourceActionContext();
return useFilterFieldProps({
// 目前仅需要支持筛选 title 和 name其它字段可能会报错。详见https://nocobase.height.app/T-2745
// 目前仅需要支持筛选 title 和 name其它字段可能会报错。详见https://tachybase.height.app/T-2745
options: options.filter((option) => ['title', 'name'].includes(option.name)),
params: service.state?.params?.[0] || service.params,
service,

View File

@ -1,5 +1,7 @@
import { TinyColor } from '@ctrl/tinycolor';
import { useEffect, useMemo } from 'react';
import { TinyColor } from '@ctrl/tinycolor';
import { defaultTheme } from '../global-theme';
import { useToken } from '../style';
@ -20,11 +22,11 @@ export const CSSVariableProvider = ({ children }) => {
}, [token.colorBgElevated]);
useEffect(() => {
document.body.style.setProperty('--nb-spacing', `${token.marginLG}px`);
document.body.style.setProperty('--nb-designer-offset', `${token.marginXS}px`);
document.body.style.setProperty('--nb-header-height', `${token.sizeXXL - 2}px`);
document.body.style.setProperty('--nb-box-bg', token.colorBgLayout);
document.body.style.setProperty('--nb-box-bg', token.colorBgLayout);
document.body.style.setProperty('--tb-spacing', `${token.marginLG}px`);
document.body.style.setProperty('--tb-designer-offset', `${token.marginXS}px`);
document.body.style.setProperty('--tb-header-height', `${token.sizeXXL - 2}px`);
document.body.style.setProperty('--tb-box-bg', token.colorBgLayout);
document.body.style.setProperty('--tb-box-bg', token.colorBgLayout);
document.body.style.setProperty('--controlHeightLG', `${token.controlHeightLG}px`);
document.body.style.setProperty('--paddingContentVerticalSM', `${token.paddingContentVerticalSM}px`);
document.body.style.setProperty('--marginSM', `${token.marginSM}px`);

View File

@ -1,13 +1,14 @@
import { useDeepCompareEffect, useUpdateEffect } from 'ahooks';
import React, { FC, createContext, useContext, useMemo } from 'react';
import React, { createContext, FC, useContext, useMemo } from 'react';
import { UseRequestResult, useAPIClient, useRequest } from '../../api-client';
import { CollectionRecordProvider, CollectionRecord } from '../collection-record';
import { AllDataBlockProps, useDataBlockProps } from './DataBlockProvider';
import { useDataBlockResource } from './DataBlockResourceProvider';
import { useDataSourceHeaders } from '../utils';
import { useDeepCompareEffect, useUpdateEffect } from 'ahooks';
import { useAPIClient, useRequest, UseRequestResult } from '../../api-client';
import { useDataLoadingMode } from '../../modules/blocks/data-blocks/details-multi/setDataLoadingModeSettingsItem';
import { useSourceKey } from '../../modules/blocks/useSourceKey';
import { CollectionRecord, CollectionRecordProvider } from '../collection-record';
import { useDataSourceHeaders } from '../utils';
import { AllDataBlockProps, useDataBlockProps } from './DataBlockProvider';
import { useDataBlockResource } from './DataBlockResourceProvider';
export const BlockRequestContext = createContext<UseRequestResult<any>>(null);
BlockRequestContext.displayName = 'BlockRequestContext';
@ -26,7 +27,7 @@ function useCurrentRequest<T>(options: Omit<AllDataBlockProps, 'type'>) {
if (record) return Promise.resolve({ data: record });
if (!action) {
throw new Error(
`[nocobase]: The 'action' parameter is missing in the 'DataBlockRequestProvider' component`,
`[tachybase]: The 'action' parameter is missing in the 'DataBlockRequestProvider' component`,
);
}
return resource[action]({ ...params, ...customParams }).then((res) => res.data);

View File

@ -9,7 +9,7 @@ group:
## DocumentTitleProvider
```tsx | pure
<DocumentTitleProvider addonBefore={'!!'} addonAfter={'NocoBase'}>
<DocumentTitleProvider addonBefore={'!!'} addonAfter={'TachyBase'}>
</DocumentTitleProvider>
```

View File

@ -1,3 +1,3 @@
export const useAdminSchemaUid = () => {
return 'nocobase-admin-menu';
return 'default-admin-menu';
};

View File

@ -1,5 +1,6 @@
import i18next, { TFuncKey, TOptions } from 'i18next';
import { initReactI18next } from 'react-i18next';
import locale from '../locale';
export function tval(text: TFuncKey | TFuncKey[], options?: TOptions) {
@ -21,7 +22,7 @@ i18n
// .use(Backend)
.use(initReactI18next)
.init({
lng: localStorage.getItem('NOCOBASE_LOCALE') || 'en-US',
lng: localStorage.getItem('TACHYBASE_LOCALE') || 'en-US',
// debug: true,
defaultNS: 'client',
// fallbackNS: 'client',
@ -40,5 +41,5 @@ i18n
});
i18n.on('languageChanged', (lng) => {
localStorage.setItem('NOCOBASE_LOCALE', lng);
localStorage.setItem('TACHYBASE_LOCALE', lng);
});

View File

@ -33,7 +33,7 @@ export * from './hooks';
export * from './i18n';
export * from './icon';
export { default as locale } from './locale';
export * from './nocobase-buildin-plugin';
export * from './buildin-plugin';
export * from './plugin-manager';
export * from './pm';
export * from './powered-by-v2';

View File

@ -80,7 +80,7 @@ export const disassociatePage: PageConfig = {
'x-component': 'ActionBar',
'x-component-props': {
style: {
marginBottom: 'var(--nb-spacing)',
marginBottom: 'var(--tb-spacing)',
},
},
'x-uid': 'b678n93qa6y',
@ -270,7 +270,7 @@ export const disassociatePage: PageConfig = {
'x-component': 'ActionBar',
'x-component-props': {
style: {
marginBottom: 'var(--nb-spacing)',
marginBottom: 'var(--tb-spacing)',
},
},
'x-uid': 'oe1qrytmueq',

View File

@ -1,8 +1,9 @@
import { test, expect } from '@tachybase/test/e2e';
import { expect, test } from '@tachybase/test/e2e';
import { T3529 } from './templatesOfBug';
test.describe('association form block', () => {
// https://nocobase.height.app/T-3529
// https://tachybase.height.app/T-3529
test('should be created instead of updated', async ({ page, mockPage, mockRecord }) => {
const nocoPage = await mockPage(T3529).waitForInit();
await mockRecord('general');

View File

@ -6,6 +6,7 @@ import {
oneTableSubtableWithMultiLevelAssociationFields,
test,
} from '@tachybase/test/e2e';
import { T2200, T2614, T2615, T2845, T2993 } from './templatesOfBug';
test.describe('display association fields', () => {
@ -49,7 +50,7 @@ test.describe('display association fields', () => {
);
});
// https://nocobase.height.app/T-2615
// https://tachybase.height.app/T-2615
test('should load association data', async ({ page, mockPage, mockRecord }) => {
const nocoPage = await mockPage(T2615).waitForInit();
await mockRecord('T2615');
@ -87,7 +88,7 @@ test.describe('display association fields', () => {
);
});
// https://nocobase.height.app/T-2845
// https://tachybase.height.app/T-2845
test('should load association data of subform', async ({ page, mockPage, mockRecord }) => {
const nocoPage = await mockPage(T2845).waitForInit();
// 和 T2615 使用一样的数据表结构
@ -136,7 +137,7 @@ test.describe('display association fields', () => {
);
});
// https://nocobase.height.app/T-2614
// https://tachybase.height.app/T-2614
test('should load association data in subform', async ({ page, mockPage, mockRecord }) => {
const nocoPage = await mockPage(T2614).waitForInit();
await mockRecord('T2614');
@ -164,7 +165,7 @@ test.describe('display association fields', () => {
).toHaveText(`ID:1`);
});
// https://nocobase.height.app/T-2993
// https://tachybase.height.app/T-2993
test('should load association data of sub details', async ({ page, mockPage, mockRecord }) => {
const nocoPage = await mockPage(T2993).waitForInit();
const record = await mockRecord('T2993');
@ -264,7 +265,7 @@ test.describe('association fields', () => {
}
});
// fix https://nocobase.height.app/T-2200
// fix https://tachybase.height.app/T-2200
test('should be possible to change the value of the association field normally', async ({ page, mockPage }) => {
await mockPage(T2200).goto();

View File

@ -19,7 +19,7 @@ test.describe('variables with default value', () => {
.getByRole('textbox'),
).toHaveValue('1');
// https://nocobase.height.app/T-2805 ----------------------------------------------------------------------
// https://tachybase.height.app/T-2805 ----------------------------------------------------------------------
await page
.getByLabel('block-item-CollectionField-general-form-general.m2oField0-m2oField0')
.getByTestId('select-object-single')

View File

@ -1,6 +1,7 @@
import { createBlockInPage, expect, oneEmptyForm, test } from '@tachybase/test/e2e';
import { T3106, T3469 } from './templatesOfBug';
import { uid } from '@tachybase/schema';
import { createBlockInPage, expect, oneEmptyForm, test } from '@tachybase/test/e2e';
import { T3106, T3469 } from './templatesOfBug';
test.describe('where creation form block can be added', () => {
test('page', async ({ page, mockPage }) => {
@ -80,7 +81,7 @@ test.describe('configure actions', () => {
await expect(page.getByRole('button', { name: 'Submit' })).not.toBeVisible();
});
// https://nocobase.height.app/T-3106
// https://tachybase.height.app/T-3106
test('subTable: should clear form value after submit', async ({ page, mockPage }) => {
await mockPage(T3106).goto();
@ -102,7 +103,7 @@ test.describe('configure actions', () => {
).toHaveValue('test name');
});
// https://nocobase.height.app/T-3469
// https://tachybase.height.app/T-3469
test('default values for fields should not be cleared after submission', async ({ page, mockPage }) => {
await mockPage(T3469).goto();

View File

@ -1,5 +1,4 @@
import {
Page,
expect,
expectSettingsMenu,
oneEmptyForm,
@ -7,8 +6,10 @@ import {
oneTableBlockWithActionsAndFormBlocks,
oneTableBlockWithAddNewAndViewAndEditAndAssociationFields,
oneTableBlockWithAddNewAndViewAndEditAndBasicFields,
Page,
test,
} from '@tachybase/test/e2e';
import { T2165, T2174, T3251, T3806 } from './templatesOfBug';
const clickOption = async (page: Page, optionName: string) => {
@ -211,7 +212,7 @@ test.describe('creation form block schema settings', () => {
).toHaveValue('123');
});
// https://nocobase.height.app/T-2165
// https://tachybase.height.app/T-2165
test('variable labels should be displayed normally', async ({ page, mockPage }) => {
await mockPage(T2165).goto();
@ -223,7 +224,7 @@ test.describe('creation form block schema settings', () => {
await expect(page.getByText('Current form / Phone')).toBeVisible();
});
// https://nocobase.height.app/T-3251
// https://tachybase.height.app/T-3251
test('nested conditions', async ({ page, mockPage }) => {
await mockPage(T3251).goto();
@ -255,7 +256,7 @@ test.describe('creation form block schema settings', () => {
).toBeEditable();
});
// https://nocobase.height.app/T-3806
// https://tachybase.height.app/T-3806
test('after save as block template', async ({ page, mockPage }) => {
await mockPage(T3806).goto();
@ -731,7 +732,7 @@ test.describe('creation form block schema settings', () => {
).toHaveValue('new value');
});
// fix https://nocobase.height.app/T-2174
// fix https://tachybase.height.app/T-2174
test('should show default value option', async ({ page, mockPage, mockRecord }) => {
const nocoPage = await mockPage(T2174).waitForInit();
await mockRecord('test2174');
@ -964,7 +965,7 @@ test.describe('creation form block schema settings', () => {
'x-component': 'ActionBar',
'x-component-props': {
style: {
marginBottom: 'var(--nb-spacing)',
marginBottom: 'var(--tb-spacing)',
},
},
properties: {

View File

@ -1,4 +1,4 @@
import { PageConfig, generalWithM2oSingleSelect, generalWithMultiLevelM2mFields } from '@tachybase/test/e2e';
import { generalWithM2oSingleSelect, generalWithMultiLevelM2mFields, PageConfig } from '@tachybase/test/e2e';
export const T2165 = {
pageSchema: {
@ -339,7 +339,7 @@ export const T2174 = {
'x-component': 'ActionBar',
'x-component-props': {
style: {
marginBottom: 'var(--nb-spacing)',
marginBottom: 'var(--tb-spacing)',
},
},
'x-index': 1,
@ -932,7 +932,7 @@ export const T2614: PageConfig = {
'x-component': 'ActionBar',
'x-component-props': {
style: {
marginBottom: 'var(--nb-spacing)',
marginBottom: 'var(--tb-spacing)',
},
},
'x-uid': 'vq4vg5mpbxz',
@ -1770,7 +1770,7 @@ export const T2993: PageConfig = {
'x-component': 'ActionBar',
'x-component-props': {
style: {
marginBottom: 'var(--nb-spacing)',
marginBottom: 'var(--tb-spacing)',
},
},
'x-index': 1,
@ -2353,7 +2353,7 @@ export const T2615: PageConfig = {
'x-component': 'ActionBar',
'x-component-props': {
style: {
marginBottom: 'var(--nb-spacing)',
marginBottom: 'var(--tb-spacing)',
},
},
properties: {
@ -3259,7 +3259,7 @@ export const T2845: PageConfig = {
'x-component': 'ActionBar',
'x-component-props': {
style: {
marginBottom: 'var(--nb-spacing)',
marginBottom: 'var(--tb-spacing)',
},
},
'x-index': 1,
@ -4735,7 +4735,7 @@ export const T2200 = {
'x-component': 'ActionBar',
'x-component-props': {
style: {
marginBottom: 'var(--nb-spacing)',
marginBottom: 'var(--tb-spacing)',
},
},
'x-uid': 'farfrcvsydq',
@ -5696,7 +5696,7 @@ export const T3469: PageConfig = {
},
};
// https://nocobase.height.app/T-3529
// https://tachybase.height.app/T-3529
export const T3529: PageConfig = {
collections: generalWithMultiLevelM2mFields,
pageSchema: {
@ -5756,7 +5756,7 @@ export const T3529: PageConfig = {
'x-component': 'ActionBar',
'x-component-props': {
style: {
marginBottom: 'var(--nb-spacing)',
marginBottom: 'var(--tb-spacing)',
},
},
'x-uid': 'gcqzwfc98cz',

View File

@ -20,7 +20,7 @@ describe('createGridCardBlockSchema', () => {
"x-component": "ActionBar",
"x-component-props": {
"style": {
"marginBottom": "var(--nb-spacing)",
"marginBottom": "var(--tb-spacing)",
},
},
"x-initializer": "gridCard:configureActions",
@ -96,7 +96,7 @@ describe('createGridCardBlockSchema', () => {
"x-component": "ActionBar",
"x-component-props": {
"style": {
"marginBottom": "var(--nb-spacing)",
"marginBottom": "var(--tb-spacing)",
},
},
"x-initializer": "gridCard:configureActions",

View File

@ -45,7 +45,7 @@ export const createGridCardBlockUISchema = (options: {
'x-component': 'ActionBar',
'x-component-props': {
style: {
marginBottom: 'var(--nb-spacing)',
marginBottom: 'var(--tb-spacing)',
},
},
},

View File

@ -30,7 +30,7 @@ describe('createListBlockSchema', () => {
"x-component": "ActionBar",
"x-component-props": {
"style": {
"marginBottom": "var(--nb-spacing)",
"marginBottom": "var(--tb-spacing)",
},
},
"x-initializer": "list:configureActions",

View File

@ -37,7 +37,7 @@ export const createListBlockUISchema = (options: {
'x-component': 'ActionBar',
'x-component-props': {
style: {
marginBottom: 'var(--nb-spacing)',
marginBottom: 'var(--tb-spacing)',
},
},
},

View File

@ -76,7 +76,7 @@ export const tableSelectorDataScopeVariable: PageConfig = {
'x-component': 'ActionBar',
'x-component-props': {
style: {
marginBottom: 'var(--nb-spacing)',
marginBottom: 'var(--tb-spacing)',
},
},
'x-uid': 'vdvzzbfp53e',
@ -341,7 +341,7 @@ export const tableSelectorDataScopeVariable: PageConfig = {
{
style: {
marginBottom:
'var(--nb-spacing)',
'var(--tb-spacing)',
},
},
'x-uid':

View File

@ -22,7 +22,7 @@ describe('createTableSelectorSchema', () => {
"x-component": "ActionBar",
"x-component-props": {
"style": {
"marginBottom": "var(--nb-spacing)",
"marginBottom": "var(--tb-spacing)",
},
},
"x-initializer": "table:configureActions",

View File

@ -1,5 +1,4 @@
import { ISchema } from '@tachybase/schema';
import { uid } from '@tachybase/schema';
import { ISchema, uid } from '@tachybase/schema';
export const createTableSelectorUISchema = (options: {
collectionName: string;
@ -36,7 +35,7 @@ export const createTableSelectorUISchema = (options: {
'x-component': 'ActionBar',
'x-component-props': {
style: {
marginBottom: 'var(--nb-spacing)',
marginBottom: 'var(--tb-spacing)',
},
},
},

View File

@ -1,7 +1,8 @@
import { expect, test } from '@tachybase/test/e2e';
import { T2187 } from '../templatesOfBug';
// fix https://nocobase.height.app/T-2187
// fix https://tachybase.height.app/T-2187
test('in the Duplicate mode, the Roles field should not have a value after clicking it because it is not selected', async ({
page,
mockPage,

View File

@ -1,7 +1,8 @@
import { expect, test } from '@tachybase/test/e2e';
import { T2183, T2186 } from '../templatesOfBug';
// fix https://nocobase.height.app/T-2183
// fix https://tachybase.height.app/T-2183
test('should save conditions', async ({ page, mockPage }) => {
await mockPage(T2183).goto();
await page.getByLabel('action-Filter.Action-Filter-filter-users-table').click();
@ -18,7 +19,7 @@ test('should save conditions', async ({ page, mockPage }) => {
await expect(page.getByTestId('select-filter-operator').getByText('is')).toBeVisible();
});
// fix https://nocobase.height.app/T-2186
// fix https://tachybase.height.app/T-2186
test('the input box displayed should correspond to the field type', async ({ page, mockPage }) => {
await mockPage(T2186).goto();

View File

@ -56,7 +56,7 @@ export const T2183 = {
'x-component': 'ActionBar',
'x-component-props': {
style: {
marginBottom: 'var(--nb-spacing)',
marginBottom: 'var(--tb-spacing)',
},
},
properties: {
@ -215,7 +215,7 @@ export const T2186 = {
'x-component': 'ActionBar',
'x-component-props': {
style: {
marginBottom: 'var(--nb-spacing)',
marginBottom: 'var(--tb-spacing)',
},
},
properties: {
@ -374,7 +374,7 @@ export const T2187 = {
'x-component': 'ActionBar',
'x-component-props': {
style: {
marginBottom: 'var(--nb-spacing)',
marginBottom: 'var(--tb-spacing)',
},
},
'x-uid': 't2drja2eg9p',
@ -771,7 +771,7 @@ export const T3686: PageConfig = {
'x-component': 'ActionBar',
'x-component-props': {
style: {
marginBottom: 'var(--nb-spacing)',
marginBottom: 'var(--tb-spacing)',
},
},
'x-uid': '42xfns3215b',

View File

@ -20,7 +20,7 @@ describe('createTableBLockSchemaV2', () => {
"x-component": "ActionBar",
"x-component-props": {
"style": {
"marginBottom": "var(--nb-spacing)",
"marginBottom": "var(--tb-spacing)",
},
},
"x-initializer": "table:configureActions",

View File

@ -1,5 +1,4 @@
import { ISchema } from '@tachybase/schema';
import { uid } from '@tachybase/schema';
import { ISchema, uid } from '@tachybase/schema';
export const createTableBlockUISchema = (options: {
dataSource: string;
@ -41,7 +40,7 @@ export const createTableBlockUISchema = (options: {
'x-component': 'ActionBar',
'x-component-props': {
style: {
marginBottom: 'var(--nb-spacing)',
marginBottom: 'var(--tb-spacing)',
},
},
properties: {},

View File

@ -1,4 +1,4 @@
import { PageConfig, generalWithMultiLevelM2oFields } from '@tachybase/test/e2e';
import { generalWithMultiLevelM2oFields, PageConfig } from '@tachybase/test/e2e';
export const T2797: PageConfig = {
pageSchema: {
@ -63,7 +63,7 @@ export const T2797: PageConfig = {
'x-component': 'ActionBar',
'x-component-props': {
style: {
marginBottom: 'var(--nb-spacing)',
marginBottom: 'var(--tb-spacing)',
},
},
'x-index': 1,
@ -642,7 +642,7 @@ export const T2838: PageConfig = {
'x-component': 'ActionBar',
'x-component-props': {
style: {
marginBottom: 'var(--nb-spacing)',
marginBottom: 'var(--tb-spacing)',
},
},
'x-index': 1,
@ -1531,7 +1531,7 @@ export const tableWithRoles: PageConfig = {
'x-component': 'ActionBar',
'x-component-props': {
style: {
marginBottom: 'var(--nb-spacing)',
marginBottom: 'var(--tb-spacing)',
},
},
'x-uid': 'w07zcu825vu',
@ -1746,7 +1746,7 @@ export const tableWithUsers = {
'x-component': 'ActionBar',
'x-component-props': {
style: {
marginBottom: 'var(--nb-spacing)',
marginBottom: 'var(--tb-spacing)',
},
},
'x-uid': 'e7ukdkylglc',
@ -1992,7 +1992,7 @@ export const tableWithInherit = {
'x-component': 'ActionBar',
'x-component-props': {
style: {
marginBottom: 'var(--nb-spacing)',
marginBottom: 'var(--tb-spacing)',
},
},
'x-uid': '6j0p8tmwey7',
@ -2223,7 +2223,7 @@ export const tableWithInheritWithoutAssociation = {
'x-component': 'ActionBar',
'x-component-props': {
style: {
marginBottom: 'var(--nb-spacing)',
marginBottom: 'var(--tb-spacing)',
},
},
'x-uid': '6j0p8tmwey7',

View File

@ -1,8 +1,9 @@
import { expect, test } from '@tachybase/test/e2e';
import { T2797, T2838 } from './templatesOfBug';
test.describe('z-index of dialog', () => {
// https://nocobase.height.app/T-2797
// https://tachybase.height.app/T-2797
test('edit block title', async ({ page, mockPage }) => {
await mockPage(T2797).goto();
@ -17,7 +18,7 @@ test.describe('z-index of dialog', () => {
await expect(page.getByLabel('block-item-Input-users-Block')).not.toBeVisible();
});
// https://nocobase.height.app/T-2838
// https://tachybase.height.app/T-2838
test('multilevel modal', async ({ page, mockPage, mockRecord }) => {
const nocoPage = await mockPage(T2838).waitForInit();
await mockRecord('general');

View File

@ -1,4 +1,5 @@
import { generalWithDatetime, PageConfig } from '@tachybase/test/e2e';
/**
* 1. Table
* 5. datetime
@ -62,7 +63,7 @@ export const oneTableBlockWithDatetimeFields: PageConfig = {
'x-component': 'ActionBar',
'x-component-props': {
style: {
marginBottom: 'var(--nb-spacing)',
marginBottom: 'var(--tb-spacing)',
},
},
'x-uid': 'nd5jqapjy3w',

View File

@ -47,8 +47,8 @@ const useStyles = createStyles(({ css, token }) => {
position: fixed;
left: 0;
right: 0;
height: var(--nb-header-height);
line-height: var(--nb-header-height);
height: var(--tb-header-height);
line-height: var(--tb-header-height);
padding: 0;
z-index: 100;
background-color: ${token.colorBgHeader} !important;
@ -114,10 +114,10 @@ const useStyles = createStyles(({ css, token }) => {
background: rgba(0, 0, 0, 0);
z-index: 100;
.ant-layout-sider-children {
top: var(--nb-header-height);
top: var(--tb-header-height);
position: fixed;
width: 200px;
height: calc(100vh - var(--nb-header-height));
height: calc(100vh - var(--tb-header-height));
}
`,
main: css`
@ -141,8 +141,8 @@ const useStyles = createStyles(({ css, token }) => {
`,
mainHeader: css`
flex-shrink: 0;
height: var(--nb-header-height);
line-height: var(--nb-header-height);
height: var(--tb-header-height);
line-height: var(--tb-header-height);
background: transparent;
pointer-events: none;
`,

View File

@ -18,7 +18,7 @@ const useStyles = createStyles(({ css }) => {
}
.ant-modal-content {
background: var(--nb-box-bg);
background: var(--tb-box-bg);
}
}
`,

View File

@ -1,13 +1,16 @@
import React, { useCallback, useEffect, useMemo, useState } from 'react';
import { observer, RecursionField, useField, useFieldSchema, useForm } from '@tachybase/schema';
import { isPortalInBody } from '@tachybase/utils/client';
import { App, Button } from 'antd';
import classnames from 'classnames';
import { default as lodash } from 'lodash';
import React, { useCallback, useEffect, useMemo, useState } from 'react';
import { useTranslation } from 'react-i18next';
import { StablePopover, useActionContext } from '../..';
import { useDesignable } from '../../';
import { useACLActionParamsContext } from '../../../acl';
import { withDynamicSchemaProps } from '../../../application/hoc/withDynamicSchemaProps';
import { Icon } from '../../../icon';
import { RecordProvider, useRecord } from '../../../record-provider';
import { useLocalVariables, useVariables } from '../../../variables';
@ -26,7 +29,6 @@ import { useA } from './hooks';
import { useGetAriaLabelOfAction } from './hooks/useGetAriaLabelOfAction';
import { ComposedAction } from './types';
import { linkageAction } from './utils';
import { withDynamicSchemaProps } from '../../../application/hoc/withDynamicSchemaProps';
export const Action: ComposedAction = withDynamicSchemaProps(
observer((props: any) => {
@ -172,7 +174,7 @@ export const Action: ComposedAction = withDynamicSchemaProps(
</ActionContextProvider>
);
// fix https://nocobase.height.app/T-3235/description
// fix https://tachybase.height.app/T-3235/description
if (addChild) {
return wrapSSR(
<RecordProvider record={null} parent={record}>

View File

@ -45,7 +45,7 @@ group:
## API
基于 antd 的 [DatePicker](https://ant.design/components/date-picker/#API),新增了以下扩展属性,用于支持 NocoBase 的日期字段设置。
基于 antd 的 [DatePicker](https://ant.design/components/date-picker/#API),新增了以下扩展属性,用于支持 TachyBase 的日期字段设置。
- `dateFormat` 设置日期格式
- `timeFormat` 设置时间格式

View File

@ -1,5 +1,6 @@
import { render, screen } from '@tachybase/test/client';
import React from 'react';
import { render, screen } from '@tachybase/test/client';
import App1 from '../demos/demo1';
describe('ErrorFallback', () => {
@ -7,7 +8,7 @@ describe('ErrorFallback', () => {
render(<App1 />);
expect(screen.getByText(/render failed/i)).toBeInTheDocument();
expect(screen.getByText(/this is likely a nocobase internals bug\. please open an issue at/i)).toBeInTheDocument();
expect(screen.getByText(/this is likely a tachybase internals bug\. please open an issue at/i)).toBeInTheDocument();
expect(screen.getByRole('link', { name: /feedback/i })).toBeInTheDocument();
expect(screen.getByText(/try again/i)).toBeInTheDocument();
expect(screen.getByText(/error: error message/i)).toBeInTheDocument();

View File

@ -1,5 +1,6 @@
import { render, screen, userEvent, waitFor, within } from '@tachybase/test/client';
import React from 'react';
import { render, screen, userEvent, waitFor, within } from '@tachybase/test/client';
import App2 from '../demos/demo2';
import App3 from '../demos/demo3';
import App4 from '../demos/demo4';
@ -30,7 +31,7 @@ describe('Filter', () => {
expect(inputs[0]).toHaveValue('aa');
expect(inputs[1]).toHaveValue('aaa');
// 点击下拉框中的选项Popover 不应该关闭。详见https://nocobase.height.app/T-1508
// 点击下拉框中的选项Popover 不应该关闭。详见https://tachybase.height.app/T-1508
await userEvent.click(screen.getByText(/any/i));
await userEvent.click(screen.getByText(/all/i));
expect(tooltip).toBeInTheDocument();
@ -96,7 +97,7 @@ describe('Filter', () => {
expect(inputs[0]).toHaveValue('');
expect(inputs[1]).toHaveValue('aaa');
// 点击下拉框中的选项Popover 不应该关闭。详见https://nocobase.height.app/T-1508
// 点击下拉框中的选项Popover 不应该关闭。详见https://tachybase.height.app/T-1508
await userEvent.click(screen.getByText(/any/i));
await userEvent.click(screen.getByText(/all/i));
expect(tooltip).toBeInTheDocument();

View File

@ -1,12 +1,26 @@
import { createForm, Form, IFormProps } from '@tachybase/schema';
import { FormProvider, Observer, observer, ReactFC } from '@tachybase/schema';
import { toJS } from '@tachybase/schema';
import { applyMiddleware, IMiddleware, isBool, isFn, isNum, isStr } from '@tachybase/schema';
import { Modal, ModalProps, ThemeConfig } from 'antd';
import React, { Fragment, useLayoutEffect, useRef, useState } from 'react';
import {
applyMiddleware,
createForm,
Form,
FormProvider,
IFormProps,
IMiddleware,
isBool,
isFn,
isNum,
isStr,
Observer,
observer,
ReactFC,
toJS,
} from '@tachybase/schema';
import { Modal, ModalProps, ThemeConfig } from 'antd';
import { createPortal } from 'react-dom';
import { GlobalThemeProvider } from '../../../global-theme';
import { createPortalProvider, createPortalRoot, loading, usePrefixCls, useToken } from '../__builtins__';
import { GlobalThemeProvider } from '../../../global-theme';
type FormDialogRenderer = React.ReactElement | ((form: Form) => React.ReactElement);
@ -96,8 +110,8 @@ export function FormDialog(title: any, id: any, renderer?: any, theme?: any): IF
return (
<Modal
// fix https://nocobase.height.app/T-2797
// fix https://nocobase.height.app/T-2838
// fix https://tachybase.height.app/T-2797
// fix https://tachybase.height.app/T-2838
zIndex={token.zIndexPopupBase + 1000}
{...modal}
open={open}

View File

@ -1,10 +1,11 @@
import { Field } from '@tachybase/schema';
import { useField, useFieldSchema, useForm } from '@tachybase/schema';
import { nextTick } from '@tachybase/utils/client';
import _ from 'lodash';
import { useEffect, useMemo, useRef } from 'react';
import { Field, useField, useFieldSchema, useForm } from '@tachybase/schema';
import { nextTick } from '@tachybase/utils/client';
import _ from 'lodash';
import { useAssociationNames } from '../../../../block-provider/hooks';
import { useCollectionManager_deprecated, useCollection_deprecated } from '../../../../collection-manager';
import { useCollection_deprecated, useCollectionManager_deprecated } from '../../../../collection-manager';
import { useCollectionRecordData } from '../../../../data-source/collection-record/CollectionRecordProvider';
import { useFlag } from '../../../../flag-provider';
import { useVariables } from '../../../../variables';
@ -86,7 +87,7 @@ const useLazyLoadDisplayAssociationFieldsOfForm = () => {
.then((value) => {
nextTick(() => {
const result = transformVariableValue(value, { targetCollectionField: collectionFieldRef.current });
// fix https://nocobase.height.app/T-2608
// fix https://tachybase.height.app/T-2608
if (_.isEmpty(result) && !_.isNumber(result)) {
field.value = null;
} else {

View File

@ -1,9 +1,9 @@
import { Field } from '@tachybase/schema';
import { useField, useFieldSchema } from '@tachybase/schema';
import { reaction } from '@tachybase/schema';
import { getValuesByPath } from '@tachybase/utils/client';
import _ from 'lodash';
import { useCallback, useEffect } from 'react';
import { Field, reaction, useField, useFieldSchema } from '@tachybase/schema';
import { getValuesByPath } from '@tachybase/utils/client';
import _ from 'lodash';
import { useRecordIndex } from '../../../../../src/record-provider';
import { useCollection_deprecated } from '../../../../collection-manager';
import { useCollectionRecord } from '../../../../data-source/collection-record/CollectionRecordProvider';
@ -82,7 +82,7 @@ const useParseDefaultValue = () => {
});
if (value == null || value === '') {
// fix https://nocobase.height.app/T-2805
// fix https://tachybase.height.app/T-2805
field.setInitialValue(null);
await field.reset({ forceClear: true });
} else if (isSpecialCase()) {
@ -122,7 +122,7 @@ const useParseDefaultValue = () => {
const obj = { [variableName]: variable?.ctx || {} };
const path = getPath(fieldSchema.default);
const value = getValuesByPath(obj, path);
// fix https://nocobase.height.app/T-2212
// fix https://tachybase.height.app/T-2212
if (value === undefined) {
// 返回一个随机值,确保能触发 run 函数
return Math.random();

View File

@ -1,14 +1,15 @@
import { Field } from '@tachybase/schema';
import { Schema, useFieldSchema, useForm } from '@tachybase/schema';
import _ from 'lodash';
import { useCallback, useEffect, useMemo } from 'react';
import { Field, Schema, useFieldSchema, useForm } from '@tachybase/schema';
import _ from 'lodash';
import {
CollectionFieldOptions_deprecated,
useCollection_deprecated,
useCollectionManager_deprecated,
} from '../../../../collection-manager';
import { isSubMode } from '../../association-field/util';
import { markRecordAsNew } from '../../../../data-source/collection-record/isNewRecord';
import { isSubMode } from '../../association-field/util';
/**
* #### `子表单` `子表格`
@ -46,7 +47,7 @@ export const useSpecialCase = () => {
return {
/**
* `对一` `对多` `子表格` `子表单`
* https://nocobase.feishu.cn/docx/EmNEdEBOnoQohUx2UmBcqIQ5nyh#CUdLdy6OpoPKjyx9DLPc3lqknVc
* https://tachybase.feishu.cn/docx/EmNEdEBOnoQohUx2UmBcqIQ5nyh#CUdLdy6OpoPKjyx9DLPc3lqknVc
*/
isSpecialCase,
setDefaultValue,
@ -71,7 +72,7 @@ export function getParentFieldSchema(fieldSchema: Schema) {
/**
* `对一` `对多` `子表格` `子表单`
* https://nocobase.feishu.cn/docx/EmNEdEBOnoQohUx2UmBcqIQ5nyh#CUdLdy6OpoPKjyx9DLPc3lqknVc
* https://tachybase.feishu.cn/docx/EmNEdEBOnoQohUx2UmBcqIQ5nyh#CUdLdy6OpoPKjyx9DLPc3lqknVc
* @returns
*/
export function isSpecialCaseField({

View File

@ -332,7 +332,7 @@ function getFieldValuesInCondition({ linkageRules, formValues }) {
return conditions
.map((condition) => {
// fix https://nocobase.height.app/T-3251
// fix https://tachybase.height.app/T-3251
if ('$and' in condition || '$or' in condition) {
return run(condition);
}

View File

@ -1,5 +1,6 @@
import { render, screen, sleep, userEvent, waitFor } from '@tachybase/test/client';
import React from 'react';
import { render, screen, sleep, userEvent, waitFor } from '@tachybase/test/client';
import App1 from '../demos/demo1';
import App2 from '../demos/demo2';
import App3 from '../demos/demo3';
@ -145,7 +146,7 @@ describe('Form', () => {
const closeBtn = screen.getByText('Close');
expect(input).toBeInTheDocument();
expect(input).toHaveValue('hello nocobase');
expect(input).toHaveValue('hello tachybase');
expect(closeBtn).toBeInTheDocument();
expect(screen.getByText(/drawer title/i)).toBeInTheDocument();
});

View File

@ -1,5 +1,4 @@
import { FormItem } from '@tachybase/components';
import { ISchema, observer } from '@tachybase/schema';
import React, { useEffect, useState } from 'react';
import {
Action,
ActionContextProvider,
@ -11,8 +10,10 @@ import {
useCloseAction,
useRequest,
} from '@tachybase/client';
import { FormItem } from '@tachybase/components';
import { ISchema, observer } from '@tachybase/schema';
import { Button } from 'antd';
import React, { useEffect, useState } from 'react';
const useValues = (options) => {
const { visible } = useActionContext();
@ -21,7 +22,7 @@ const useValues = (options) => {
Promise.resolve({
data: {
id: 1,
name: 'hello nocobase',
name: 'hello tachybase',
},
}),
{ ...options, manual: true },

View File

@ -1,5 +1,6 @@
import { fireEvent, render, screen, userEvent, waitFor } from '@tachybase/test/client';
import React from 'react';
import { fireEvent, render, screen, userEvent, waitFor } from '@tachybase/test/client';
import App1 from '../demos/input';
import App4 from '../demos/json';
import App2 from '../demos/textarea';
@ -64,9 +65,9 @@ describe('Input.URL', () => {
const { container } = render(<App3 />);
const input = container.querySelector('input') as HTMLInputElement;
await userEvent.type(input, 'https://www.nocobase.com');
expect(input.value).toBe('https://www.nocobase.com');
expect(screen.getByText('https://www.nocobase.com')).toBeInTheDocument();
await userEvent.type(input, 'https://www.tachybase.com');
expect(input.value).toBe('https://www.tachybase.com');
expect(screen.getByText('https://www.tachybase.com')).toBeInTheDocument();
});
it('should display the error when the value is invalid', async () => {
@ -98,15 +99,15 @@ describe('Input.JSON', () => {
await waitFor(() => {
const textarea = container.querySelector('textarea') as HTMLTextAreaElement;
const pre = container.querySelector('pre') as HTMLPreElement;
fireEvent.change(textarea, { target: { value: '{"name":"nocobase"}' } });
fireEvent.blur(textarea, { target: { value: '{"name":"nocobase"}' } });
expect(JSON.parse(textarea.value)).toEqual({ name: 'nocobase' });
fireEvent.change(textarea, { target: { value: '{"name":"tachybase"}' } });
fireEvent.blur(textarea, { target: { value: '{"name":"tachybase"}' } });
expect(JSON.parse(textarea.value)).toEqual({ name: 'tachybase' });
expect(pre).toMatchInlineSnapshot(`
<pre
class="ant-json css-4dta7v"
>
{
"name": "nocobase"
"name": "tachybase"
}
</pre>
`);
@ -118,8 +119,8 @@ describe('Input.JSON', () => {
await waitFor(() => {
const textarea = container.querySelector('textarea') as HTMLTextAreaElement;
fireEvent.change(textarea, { target: { value: '{"name":nocobase}' } });
fireEvent.blur(textarea, { target: { value: '{"name":nocobase}' } });
fireEvent.change(textarea, { target: { value: '{"name":tachybase}' } });
fireEvent.blur(textarea, { target: { value: '{"name":tachybase}' } });
expect(screen.getByText(/Unexpected token/)).toBeInTheDocument();
});
});

View File

@ -136,7 +136,7 @@ const SideMenu = ({
const { Component, getMenuItems } = useMenuItem();
const { styles } = useStyles();
// fix https://nocobase.height.app/T-3331/description
// fix https://tachybase.height.app/T-3331/description
// 使用 ref 用来防止闭包问题
const sideMenuSchemaRef = useRef(sideMenuSchema);
sideMenuSchemaRef.current = sideMenuSchema;

View File

@ -1,5 +1,6 @@
import { render, screen, waitFor } from '@tachybase/test/client';
import React from 'react';
import { render, screen, waitFor } from '@tachybase/test/client';
import App1 from '../demos/demo1';
describe('Page', () => {
@ -13,7 +14,7 @@ describe('Page', () => {
expect(screen.getByText(/page content/i)).toBeInTheDocument();
});
await waitFor(() => {
expect(document.title).toBe('Page Title - NocoBase');
expect(document.title).toBe('Page Title - TachyBase');
});
});
});

View File

@ -1,6 +1,6 @@
import { ISchema } from '@tachybase/schema';
import { DocumentTitleProvider, Page, SchemaComponent, SchemaComponentProvider, Application } from '@tachybase/client';
import React from 'react';
import { Application, DocumentTitleProvider, Page, SchemaComponent, SchemaComponentProvider } from '@tachybase/client';
import { ISchema } from '@tachybase/schema';
const schema: ISchema = {
type: 'object',
@ -23,7 +23,7 @@ const schema: ISchema = {
const Root = () => {
return (
<SchemaComponentProvider components={{ Page }}>
<DocumentTitleProvider addonAfter={'NocoBase'}>
<DocumentTitleProvider addonAfter={'TachyBase'}>
<SchemaComponent schema={schema} />
</DocumentTitleProvider>
</SchemaComponentProvider>

View File

@ -1,9 +1,10 @@
import { Popover as AntdPopover, PopoverProps } from 'antd';
import React, { useCallback, useRef } from 'react';
import { Popover as AntdPopover, PopoverProps } from 'antd';
/**
* https://github.com/ant-design/ant-design/issues/44119
* fix https://nocobase.height.app/T-1508
* fix https://tachybase.height.app/T-1508
* @param props
* @returns
*/

View File

@ -1,9 +1,10 @@
/**
* title: Preview
*/
import { FormItem } from '@tachybase/components';
import { SchemaComponent, SchemaComponentProvider } from '@tachybase/client';
import React from 'react';
import { SchemaComponent, SchemaComponentProvider } from '@tachybase/client';
import { FormItem } from '@tachybase/components';
import Preview from '../Preview';
const defaultValue = [
@ -19,7 +20,7 @@ const defaultValue = [
meta: {},
status: 'uploading',
percent: 60,
url: 'https://nocobase.oss-cn-beijing.aliyuncs.com/cd48dc833ab01aa3959ac39309fc39de.jpg',
url: 'https://tachybase.oss-cn-beijing.aliyuncs.com/cd48dc833ab01aa3959ac39309fc39de.jpg',
created_at: '2021-08-13T15:00:17.423Z',
updated_at: '2021-08-13T15:00:17.423Z',
created_by_id: null,
@ -35,7 +36,7 @@ const defaultValue = [
mimetype: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
path: '',
meta: {},
url: 'https://nocobase.oss-cn-beijing.aliyuncs.com/d9f6ad6669902a9a8a1229d9f362235a.docx',
url: 'https://tachybase.oss-cn-beijing.aliyuncs.com/d9f6ad6669902a9a8a1229d9f362235a.docx',
created_at: '2021-09-12T01:22:06.229Z',
updated_at: '2021-09-12T01:22:06.229Z',
created_by_id: null,

View File

@ -119,7 +119,7 @@ const useTableColumns = () => {
const index = field.value?.indexOf(record);
return (
<RecordIndexProvider index={index}>
{/* fix https://nocobase.height.app/T-3232/description */}
{/* fix https://tachybase.height.app/T-3232/description */}
{/* 如果作为关系表格区块,则 parentRecordData 应该有值;如果作为普通表格使用(如数据源管理页面的表格)则应该使用 recordData且 parentRecordData 为空 */}
<RecordProvider record={record} parent={parentRecordData || recordData}>
<RecursionField schema={s} name={record.__index || index} onlyRenderProperties />

View File

@ -21,7 +21,7 @@ mockRequest.onPost('/attachments:create').reply(async (config) => {
extname: '.docx',
path: '',
size: null,
url: 'https://nocobase.oss-cn-beijing.aliyuncs.com/7edb55e4e3145e5ac59ea3a44ca840e9.docx',
url: 'https://tachybase.oss-cn-beijing.aliyuncs.com/7edb55e4e3145e5ac59ea3a44ca840e9.docx',
mimetype: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
meta: {},
storage_id: 2,

View File

@ -1,9 +1,10 @@
/**
* title: Upload
*/
import { FormItem } from '@tachybase/components';
import { APIClientProvider, SchemaComponent, SchemaComponentProvider, Upload } from '@tachybase/client';
import React from 'react';
import { APIClientProvider, SchemaComponent, SchemaComponentProvider, Upload } from '@tachybase/client';
import { FormItem } from '@tachybase/components';
import apiClient from './apiClient';
const schema = {
@ -25,7 +26,7 @@ const schema = {
meta: {},
status: 'uploading',
percent: 60,
url: 'https://nocobase.oss-cn-beijing.aliyuncs.com/cd48dc833ab01aa3959ac39309fc39de.jpg',
url: 'https://tachybase.oss-cn-beijing.aliyuncs.com/cd48dc833ab01aa3959ac39309fc39de.jpg',
created_at: '2021-08-13T15:00:17.423Z',
updated_at: '2021-08-13T15:00:17.423Z',
created_by_id: null,
@ -41,7 +42,7 @@ const schema = {
mimetype: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
path: '',
meta: {},
url: 'https://nocobase.oss-cn-beijing.aliyuncs.com/d9f6ad6669902a9a8a1229d9f362235a.docx',
url: 'https://tachybase.oss-cn-beijing.aliyuncs.com/d9f6ad6669902a9a8a1229d9f362235a.docx',
created_at: '2021-09-12T01:22:06.229Z',
updated_at: '2021-09-12T01:22:06.229Z',
created_by_id: null,

View File

@ -1,4 +1,5 @@
import _, { every, findIndex, some } from 'lodash';
import { VariableOption, VariablesContextType } from '../../../variables/types';
import { isVariable } from '../../../variables/utils/isVariable';
import { transformVariableValue } from '../../../variables/utils/transformVariableValue';
@ -78,7 +79,7 @@ export const conditionAnalyses = async ({
const conditions = ruleGroup[type];
let results = conditions.map(async (condition) => {
// fix https://nocobase.height.app/T-3152
// fix https://tachybase.height.app/T-3152
if ('$and' in condition || '$or' in condition) {
return await conditionAnalyses({ ruleGroup: condition, variables, localVariables });
}

View File

@ -1,12 +1,21 @@
import { GeneralField, Query } from '@tachybase/schema';
import { ISchema, Schema, SchemaOptionsContext, useField, useFieldSchema } from '@tachybase/schema';
import { uid } from '@tachybase/schema';
import React, { ComponentType, useCallback, useContext, useEffect, useMemo } from 'react';
import {
GeneralField,
ISchema,
Query,
Schema,
SchemaOptionsContext,
uid,
useField,
useFieldSchema,
} from '@tachybase/schema';
import { message } from 'antd';
import cloneDeep from 'lodash/cloneDeep';
import get from 'lodash/get';
import set from 'lodash/set';
import React, { ComponentType, useCallback, useContext, useEffect, useMemo } from 'react';
import { useTranslation } from 'react-i18next';
import { APIClient, useAPIClient } from '../../api-client';
import { SchemaComponentContext } from '../context';
@ -691,7 +700,7 @@ export function useFindComponent() {
}
const res = get(components, component);
if (!res) {
console.error(`[nocobase]: Component "${component}" not found`);
console.error(`[tachybase]: Component "${component}" not found`);
}
return res;
};

View File

@ -1,11 +1,13 @@
import { ISchema, useField, useFieldSchema, useForm } from '@tachybase/schema';
import React, { useMemo } from 'react';
import { SchemaComponent, useAPIClient, useActionContext, useDesignable, useProps, useRecord } from '../..';
import { SchemaInitializer } from '../../application/schema-initializer/SchemaInitializer';
import { useGetAriaLabelOfSchemaInitializer } from '../hooks/useGetAriaLabelOfSchemaInitializer';
import { ISchema, useField, useFieldSchema, useForm } from '@tachybase/schema';
import { message } from 'antd';
import { saveAs } from 'file-saver';
import { SchemaComponent, useActionContext, useAPIClient, useDesignable, useProps, useRecord } from '../..';
import { SchemaInitializer } from '../../application/schema-initializer/SchemaInitializer';
import { useGetAriaLabelOfSchemaInitializer } from '../hooks/useGetAriaLabelOfSchemaInitializer';
export const TabPaneInitializers = (props?: any) => {
const { designable, insertBeforeEnd } = useDesignable();
const fieldSchema = useFieldSchema();
@ -120,7 +122,7 @@ export const TabPaneInitializers = (props?: any) => {
style: {
borderColor: 'var(--colorSettings)',
color: 'var(--colorSettings)',
marginRight: 'var(--nb-spacing)',
marginRight: 'var(--tb-spacing)',
},
type: 'dashed',
useAction: useDumpAction,
@ -136,7 +138,7 @@ export const TabPaneInitializers = (props?: any) => {
style: {
borderColor: 'var(--colorSettings)',
color: 'var(--colorSettings)',
marginRight: 'var(--nb-spacing)',
marginRight: 'var(--tb-spacing)',
},
type: 'dashed',
'aria-label': getAriaLabel(),

View File

@ -1,8 +1,8 @@
import { Field } from '@tachybase/schema';
import { useField, useFieldSchema } from '@tachybase/schema';
import { merge } from '@tachybase/schema';
import _ from 'lodash';
import React, { useCallback, useEffect, useMemo } from 'react';
import { Field, merge, useField, useFieldSchema } from '@tachybase/schema';
import _ from 'lodash';
import { useFormBlockContext } from '../../../block-provider';
import {
useCollection_deprecated,
@ -10,13 +10,13 @@ import {
useCollectionFilterOptions,
useCollectionManager_deprecated,
} from '../../../collection-manager';
import { CollectionFieldProvider } from '../../../data-source';
import { useRecord } from '../../../record-provider';
import { useCompile, useComponent } from '../../../schema-component';
import { VariableInput, getShouldChange } from '../../../schema-settings/VariableInput/VariableInput';
import { Option } from '../../../schema-settings/VariableInput/type';
import { formatVariableScop } from '../../../schema-settings/VariableInput/utils/formatVariableScop';
import { getShouldChange, VariableInput } from '../../../schema-settings/VariableInput/VariableInput';
import { useLocalVariables, useVariables } from '../../../variables';
import { CollectionFieldProvider } from '../../../data-source';
interface AssignedFieldProps {
value: any;
@ -116,7 +116,7 @@ export const AssignedField = (props: AssignedFieldProps) => {
const currentForm = scope.find((item) => item.value === '$nForm');
const fields = getCollectionFields(name);
// fix https://nocobase.height.app/T-1355
// fix https://tachybase.height.app/T-1355
// 工作流人工节点的 `自定义表单` 区块,与其它表单区块不同,根据它的数据表名称,获取到的字段列表为空,所以需要在这里特殊处理一下
if (!fields?.length && currentForm) {
currentForm.children = formatVariableScop(currentFormFields);

View File

@ -46,7 +46,7 @@ group:
### Built Type
NocoBase 提供了几个内置的组件,可以直接使用。
TachyBase 提供了几个内置的组件,可以直接使用。
<code src="./demos/build-type.tsx"></code>

View File

@ -1,9 +1,9 @@
import { Field, Form } from '@tachybase/schema';
import { ISchema, Schema, useFieldSchema, useForm } from '@tachybase/schema';
import { uid } from '@tachybase/schema';
import _ from 'lodash';
import { useMemo } from 'react';
import { Field, Form, ISchema, Schema, uid, useFieldSchema, useForm } from '@tachybase/schema';
import _ from 'lodash';
import { useTranslation } from 'react-i18next';
import {
DataBlockInitializer,
DataSource,
@ -14,7 +14,7 @@ import {
useFormActiveFields,
useFormBlockContext,
} from '../';
import { FieldOptions, useCollectionManager_deprecated, useCollection_deprecated } from '../collection-manager';
import { FieldOptions, useCollection_deprecated, useCollectionManager_deprecated } from '../collection-manager';
import { Collection, CollectionFieldOptions } from '../data-source/collection/Collection';
import { useDataSourceManager } from '../data-source/data-source/DataSourceManagerProvider';
import { isAssocField } from '../filter-provider/utils';
@ -890,7 +890,7 @@ export const useCollectionDataSourceItems = ({
getTemplatesByCollection,
t,
}).sort((item) => {
// fix https://nocobase.height.app/T-3551
// fix https://tachybase.height.app/T-3551
const inherits = _.toArray(collection?.inherits || []);
if (item.name === collection?.name || inherits.some((inheritName) => inheritName === item.name)) return -1;
}),
@ -898,7 +898,7 @@ export const useCollectionDataSourceItems = ({
}));
}, [allCollections, collection?.inherits, collection?.name, componentName, getTemplatesByCollection, t]);
// https://nocobase.height.app/T-3821
// https://tachybase.height.app/T-3821
// showAssociationFields 的值是固定不变的,所以在 if 语句里使用 hooks 是安全的
if (showAssociationFields) {
// eslint-disable-next-line react-hooks/rules-of-hooks
@ -1178,7 +1178,7 @@ export const createFormBlockSchema = (options: {
'x-component': 'ActionBar',
'x-component-props': {
style: {
marginBottom: 'var(--nb-spacing)',
marginBottom: 'var(--tb-spacing)',
},
},
properties: actions,
@ -1313,7 +1313,7 @@ export const createTableBlockSchema = (options) => {
'x-component': 'ActionBar',
'x-component-props': {
style: {
marginBottom: 'var(--nb-spacing)',
marginBottom: 'var(--tb-spacing)',
},
},
properties: {},

View File

@ -81,7 +81,7 @@ export const SchemaSettingsDefaultValue = function DefaultValueConfigure(props:
const currentForm = scope.find((item) => item.value === '$nForm');
const fields = getCollectionFields(name);
// fix https://nocobase.height.app/T-1355
// fix https://tachybase.height.app/T-1355
// 工作流人工节点的 `自定义表单` 区块,与其它表单区块不同,根据它的数据表名称,获取到的字段列表为空,所以需要在这里特殊处理一下
if (!fields?.length && currentForm) {
currentForm.children = formatVariableScop(getFields());

View File

@ -1,11 +1,12 @@
import { Form } from '@tachybase/schema';
// @ts-ignore
import { Schema } from '@tachybase/schema';
import _ from 'lodash';
import React, { useCallback } from 'react';
// @ts-ignore
import { Form, Schema } from '@tachybase/schema';
import _ from 'lodash';
import { useTranslation } from 'react-i18next';
import { CollectionFieldOptions_deprecated } from '../../collection-manager';
import { Variable, useVariableScope } from '../../schema-component';
import { useVariableScope, Variable } from '../../schema-component';
import { useValues } from '../../schema-component/antd/filter/useValues';
import { VariableOption, VariablesContextType } from '../../variables/types';
import { isVariable } from '../../variables/utils/isVariable';
@ -160,7 +161,7 @@ export const getShouldChange = ({
return true;
}
// `json` 可以选择任意类型的变量详见https://nocobase.feishu.cn/docx/EmNEdEBOnoQohUx2UmBcqIQ5nyh#FPLfdSRDEoXR65xW0mBcdfL5n0c
// `json` 可以选择任意类型的变量详见https://tachybase.feishu.cn/docx/EmNEdEBOnoQohUx2UmBcqIQ5nyh#FPLfdSRDEoXR65xW0mBcdfL5n0c
if (collectionField.interface === 'json') {
return true;
}

View File

@ -1,6 +1,7 @@
import { Form } from '@tachybase/schema';
import { Schema } from '@tachybase/schema';
import { Form, Schema } from '@tachybase/schema';
import { useTranslation } from 'react-i18next';
import { useFormBlockContext } from '../../../block-provider';
import { CollectionFieldOptions_deprecated } from '../../../collection-manager';
import { useBaseVariable } from './useBaseVariable';
@ -36,7 +37,7 @@ export const useFormVariable = ({ collectionName, collectionField, schema, noDis
collectionName: collectionName,
noDisabled,
returnFields: (fields, option) => {
// fix https://nocobase.height.app/T-2277
// fix https://tachybase.height.app/T-2277
return fields;
// const activeFieldsName = getActiveFieldsName?.('form') || [];
@ -76,7 +77,7 @@ export const useCurrentFormVariable = ({
collectionName: collectionName,
noDisabled,
returnFields: (fields, option) => {
// fix https://nocobase.height.app/T-2277
// fix https://tachybase.height.app/T-2277
return fields;
// const activeFieldsName = getActiveFieldsName?.('form') || [];

Some files were not shown because too many files have changed in this diff Show More