Skip to content

Commit

Permalink
feat: support add table
Browse files Browse the repository at this point in the history
  • Loading branch information
tea-artist committed Mar 13, 2023
1 parent 97a75a7 commit a105b46
Show file tree
Hide file tree
Showing 16 changed files with 96 additions and 38 deletions.
11 changes: 4 additions & 7 deletions apps/nestjs-backend/src/features/table/table.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ import type {
ISetTableNameOpContext,
ISnapshotBase,
ITableSnapshot,
ITableSnapshotQuery,
ITableVo,
} from '@teable-group/core';
import { OpName, generateTableId } from '@teable-group/core';
Expand Down Expand Up @@ -74,7 +73,9 @@ export class TableService implements AdapterService {
}

async getTables(): Promise<ITableVo[]> {
const tablesMeta = await this.prismaService.tableMeta.findMany();
const tablesMeta = await this.prismaService.tableMeta.findMany({
orderBy: { order: 'asc' },
});

return tablesMeta.map((tableMeta) => ({
...tableMeta,
Expand Down Expand Up @@ -222,11 +223,7 @@ export class TableService implements AdapterService {
.sort((a, b) => ids.indexOf(a.id) - ids.indexOf(b.id));
}

async getDocIdsByQuery(
prisma: Prisma.TransactionClient,
_collection: string,
_query: ITableSnapshotQuery
) {
async getDocIdsByQuery(prisma: Prisma.TransactionClient, _collection: string, _query: unknown) {
const tables = await prisma.tableMeta.findMany({
select: { id: true },
orderBy: { order: 'asc' },
Expand Down
13 changes: 4 additions & 9 deletions apps/nestjs-backend/src/features/view/view.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import type {
ISetViewNameOpContext,
ISnapshotBase,
IViewSnapshot,
IViewSnapshotQuery,
ViewType,
} from '@teable-group/core';
import { OpName, generateViewId } from '@teable-group/core';
Expand Down Expand Up @@ -51,11 +50,11 @@ export class ViewService implements AdapterService {
async createViewTransaction(
prisma: Prisma.TransactionClient,
tableId: string,
createViewRo: CreateViewRo,
createViewRo: CreateViewRo & { id?: string },
order?: number
) {
const { name, description, type, options, sort, filter, group } = createViewRo;
const viewId = generateViewId();
const { id, name, description, type, options, sort, filter, group } = createViewRo;
const viewId = id || generateViewId();

if (!order) {
const viewAggregate = await prisma.view.aggregate({
Expand Down Expand Up @@ -197,11 +196,7 @@ export class ViewService implements AdapterService {
.sort((a, b) => ids.indexOf(a.id) - ids.indexOf(b.id));
}

async getDocIdsByQuery(
prisma: Prisma.TransactionClient,
tableId: string,
_query: IViewSnapshotQuery
) {
async getDocIdsByQuery(prisma: Prisma.TransactionClient, tableId: string, _query: unknown) {
const views = await prisma.view.findMany({
where: { tableId },
select: { id: true },
Expand Down
23 changes: 10 additions & 13 deletions apps/nextjs-app/src/backend/api/rest/table.ssr.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,13 @@ import { isJsonApiSuccessResponse } from '@teable-group/core';
import axios from 'axios';

export class SsrApi {
axios = axios.create({
baseURL: `http://localhost:${process.env.PORT}/api`,
});

async getFullSnapshot(tableId: string, viewId = ''): Promise<IFullSsrSnapshot> {
console.log(`http://localhost:${process.env.PORT}/api/table/ssr/${tableId}/${viewId}`);
return axios
.get<IJsonApiResponse<IFullSsrSnapshot>>(
`http://localhost:${process.env.PORT}/api/table/ssr/${tableId}/${viewId}`
)
return this.axios
.get<IJsonApiResponse<IFullSsrSnapshot>>(`/table/ssr/${tableId}/${viewId}`)
.then(({ data: resp }) => {
if (isJsonApiSuccessResponse(resp)) {
return resp.data;
Expand All @@ -18,10 +19,8 @@ export class SsrApi {
}

async getTableSnapshot() {
return axios
.get<IJsonApiResponse<Pick<IFullSsrSnapshot, 'tables'>>>(
`http://localhost:${process.env.PORT}/api/table/ssr`
)
return this.axios
.get<IJsonApiResponse<Pick<IFullSsrSnapshot, 'tables'>>>(`/table/ssr`)
.then(({ data: resp }) => {
if (isJsonApiSuccessResponse(resp)) {
return resp.data;
Expand All @@ -31,10 +30,8 @@ export class SsrApi {
}

async getDefaultViewId(tableId: string) {
return axios
.get<IJsonApiResponse<{ id: string }>>(
`http://localhost:${process.env.PORT}/api/table/ssr/${tableId}/view-id`
)
return this.axios
.get<IJsonApiResponse<{ id: string }>>(`/table/ssr/${tableId}/view-id`)
.then(({ data: resp }) => {
if (isJsonApiSuccessResponse(resp)) {
return resp.data;
Expand Down
4 changes: 3 additions & 1 deletion apps/nextjs-app/src/features/app/blocks/table/TableList.tsx
Original file line number Diff line number Diff line change
@@ -1,15 +1,17 @@
import { useTableId, useTables } from '@teable-group/sdk';
import AddBoldIcon from '@teable-group/ui-lib/icons/app/add-bold.svg';
import { TableListItem } from './TableListItem';
import { useAddTable } from './useAddTable';

export const TableList: React.FC = () => {
const tables = useTables();
const tableId = useTableId();
const addTable = useAddTable();

return (
<div className="py-2">
<div className="mx-2">
<button className="btn btn-xs btn-ghost btn-block">
<button className="btn btn-xs btn-ghost btn-block" onClick={addTable}>
<AddBoldIcon />
<span className="ml-1">Table</span>
</button>
Expand Down
19 changes: 19 additions & 0 deletions apps/nextjs-app/src/features/app/blocks/table/useAddTable.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import { useSpace, useTables } from '@teable-group/sdk/hooks';
import { useRouter } from 'next/router';
import { useCallback } from 'react';

export function useAddTable() {
const space = useSpace();
const tables = useTables();
const tableName = tables[tables.length - 1].name + ' ' + tables.length;
const router = useRouter();

return useCallback(async () => {
const tableDoc = await space.createTable(tableName);
const tableId = tableDoc.data.table.id;
router.push({
pathname: '/space/[tableId]',
query: { tableId: tableId },
});
}, [router, space, tableName]);
}
15 changes: 14 additions & 1 deletion apps/nextjs-app/src/features/app/blocks/view/list/useAddView.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,24 @@
import { ViewType } from '@teable-group/core';
import { useTable, useViews } from '@teable-group/sdk/hooks';
import { useRouter } from 'next/router';
import { useCallback } from 'react';

export function useAddView() {
const table = useTable();
const views = useViews();
const router = useRouter();
const viewName = views[views.length - 1].name + ' ' + views.length;

return useCallback(() => table?.createView(viewName, ViewType.Grid), [table, viewName]);
return useCallback(async () => {
if (!table) {
return;
}

const viewDoc = await table.createView(viewName, ViewType.Grid);
const viewId = viewDoc.data.view.id;
router.push({
pathname: '/space/[tableId]/[viewId]',
query: { tableId: table.id, viewId },
});
}, [router, table, viewName]);
}
2 changes: 1 addition & 1 deletion monorepo.code-workspace
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@
// https://github.com/Microsoft/vscode-eslint#mono-repository-setup
"eslint.workingDirectories": [
"./apps/nextjs-app",
"./apps/nesjs-backend",
"./apps/nestjs-backend",
"./packages/common-i18n",
"./packages/sdk",
"./packages/core",
Expand Down
2 changes: 2 additions & 0 deletions packages/sdk/src/context/app/AppContext.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { Space } from '../../model/space';
import React from 'react';
import { Connection } from 'sharedb/lib/client';

Expand All @@ -10,6 +11,7 @@ export interface IAppContext {
connection?: Connection;
connected: boolean;
theme: ThemeKey;
space?: Space;
isAutoTheme: boolean;
setTheme: (theme: ThemeKey | null) => void;
}
Expand Down
7 changes: 5 additions & 2 deletions packages/sdk/src/context/app/AppProvider.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import ReconnectingWebSocket from 'reconnecting-websocket';
import { Connection } from 'sharedb/lib/client';
import type { Socket } from 'sharedb/lib/sharedb';
import { useTheme } from './useTheme';
import { Space } from '../../model/space';

export const AppProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {
const [connection, setConnection] = useState(() => {
Expand All @@ -13,6 +14,7 @@ export const AppProvider: React.FC<{ children: React.ReactNode }> = ({ children
}
});
const [connected, setConnected] = useState(false);
const [space, setSpace] = useState<Space>();
const themeProps = useTheme();

useEffect(() => {
Expand All @@ -26,6 +28,7 @@ export const AppProvider: React.FC<{ children: React.ReactNode }> = ({ children
if (!connection) {
return;
}
setSpace(new Space(connection));
const onConnected = () => setConnected(true);
const onDisconnected = () => setConnected(false);
connection.on('connected', onConnected);
Expand All @@ -39,8 +42,8 @@ export const AppProvider: React.FC<{ children: React.ReactNode }> = ({ children
}, [connection]);

const value = useMemo(() => {
return { connection, connected, ...themeProps };
}, [connection, connected, themeProps]);
return { connection, connected, space, ...themeProps };
}, [connection, connected, space, themeProps]);

return <AppContext.Provider value={value}>{children}</AppContext.Provider>;
};
1 change: 0 additions & 1 deletion packages/sdk/src/engine/engine.ts

This file was deleted.

1 change: 0 additions & 1 deletion packages/sdk/src/engine/index.ts

This file was deleted.

1 change: 1 addition & 0 deletions packages/sdk/src/hooks/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,4 @@ export * from './use-ssr-records';
export * from './use-theme';
export * from './use-tables';
export * from './use-table';
export * from './use-space';
7 changes: 7 additions & 0 deletions packages/sdk/src/hooks/use-space.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import { AppContext } from '../context';
import { useContext } from 'react';

export function useSpace() {
const { space } = useContext(AppContext);
return space!;
}
1 change: 0 additions & 1 deletion packages/sdk/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,5 @@ export * from './api';
export * from './components';
export * from './config';
export * from './context';
export * from './engine';
export * from './hooks';
export * from './model';
24 changes: 24 additions & 0 deletions packages/sdk/src/model/space.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import { ITableSnapshot, ITableVo, IdPrefix, OpBuilder, generateTableId } from '@teable-group/core';
import { Connection, Doc } from 'sharedb/lib/client';

export class Space {
constructor(private connection: Connection) {}

async createTable(name: string, description?: string) {
const tableData: ITableVo = {
id: generateTableId(),
name,
description,
};

const createSnapshot = OpBuilder.creator.addTable.build(tableData);
const doc = this.connection.get(`${IdPrefix.Table}_node`, tableData.id);
return new Promise<Doc<ITableSnapshot>>((resolve, reject) => {
doc.create(createSnapshot, (error) => {
if (error) return reject(error);
console.log(`create table succeed!`, tableData);
resolve(doc);
});
});
}
}
3 changes: 2 additions & 1 deletion packages/sdk/src/model/table/table.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import {
generateViewId,
IdPrefix,
ITableSnapshot,
IViewSnapshot,
IViewVo,
OpBuilder,
TableCore,
Expand Down Expand Up @@ -35,7 +36,7 @@ export class Table extends TableCore {

const createSnapshot = OpBuilder.creator.addView.build(viewData);
const doc = this.connection.get(`${IdPrefix.View}_${this.id}`, viewData.id);
return new Promise<Doc>((resolve, reject) => {
return new Promise<Doc<IViewSnapshot>>((resolve, reject) => {
doc.create(createSnapshot, (error) => {
if (error) return reject(error);
console.log(`create view succeed!`, viewData);
Expand Down

0 comments on commit a105b46

Please sign in to comment.