107 lines
4.2 KiB
TypeScript
Raw Normal View History

Feat/appflowy tauri 2 (#1902) * chore: rename classes to models * refactor: add effects and reducers folder * chore: update user data storage path * chore: subscribe callback * chore: nav items persist, board layout (#1879) * chore: load workspace items, load folders and pages from workspace, load raw document data, load raw grid data * chore: clear folders and pages before load, new folder event * chore: update folder name backend call * chore: folder expand animation * chore: hide arrow on empty folder * chore: Board page layout, board store, board sample data * chore: board block item * chore: test db id * chore: persist new page, persist page rename, create workspace on read error * chore: boardblockitem details btn * chore: boardblockitem multiselect data and colors * chore: board item drag * chore: drag start on move * chore: remove databaseId * chore: remove databaseId * chore: import service classes into auth hook * chore: sign out option * chore: login page event * chore: signup event * chore: make workspace hook to use service * chore: page and folder hooks use backend services * chore: new folder use backend service * chore: error handler page * chore: try catch hooks to show error page * chore: install i18n package and use flutters i18n files * fix: signin signup margin * chore: fix compile errors * chore: remove unused codes * chore: open workspace after user register * chore: open workspace after user register * chore: add create grid demo * chore: load the cell data * chore: print the cell data * chore: fix project errors * fix: tauri UI issues (#1899) * chore: load workspace items, load folders and pages from workspace, load raw document data, load raw grid data * chore: clear folders and pages before load, new folder event * chore: update folder name backend call * chore: folder expand animation * chore: hide arrow on empty folder * chore: Board page layout, board store, board sample data * chore: board block item * chore: test db id * chore: persist new page, persist page rename, create workspace on read error * chore: boardblockitem details btn * chore: boardblockitem multiselect data and colors * chore: board item drag * chore: drag start on move * chore: remove databaseId * chore: remove databaseId * chore: import service classes into auth hook * chore: sign out option * chore: login page event * chore: signup event * chore: make workspace hook to use service * chore: page and folder hooks use backend services * chore: new folder use backend service * chore: error handler page * chore: try catch hooks to show error page * chore: install i18n package and use flutters i18n files * fix: signin signup margin * fix: new page overflow with folder * fix: sign out button * fix: sign out icon * chore: floating navigation panel * refactor: notify with error * chore: config window size * fix: test demo error * chore: update tests --------- Co-authored-by: Askarbek Zadauly <ascarbek@gmail.com>
2023-02-28 22:42:41 +08:00
import { FieldType, ViewLayoutTypePB, ViewPB, WorkspaceSettingPB } from '../../../services/backend';
import { FolderEventReadCurrentWorkspace } from '../../../services/backend/events/flowy-folder';
import { AppBackendService } from '../../stores/effects/folder/app/app_bd_svc';
import { DatabaseController } from '../../stores/effects/database/database_controller';
import { RowInfo } from '../../stores/effects/database/row/row_cache';
import { RowController } from '../../stores/effects/database/row/row_controller';
import {
CellControllerBuilder,
DateCellController,
NumberCellController,
SelectOptionCellController,
TextCellController,
} from '../../stores/effects/database/cell/controller_builder';
import assert from 'assert';
import { None, Option, Some } from 'ts-results';
// Create a database view for specific layout type
// Do not use it production code. Just for testing
export async function createTestDatabaseView(layout: ViewLayoutTypePB): Promise<ViewPB> {
const workspaceSetting: WorkspaceSettingPB = await FolderEventReadCurrentWorkspace().then((result) => result.unwrap());
const app = workspaceSetting.workspace.apps.items[0];
const appService = new AppBackendService(app.id);
return await appService.createView({ name: 'New Grid', layoutType: layout });
}
export async function openTestDatabase(viewId: string): Promise<DatabaseController> {
return new DatabaseController(viewId);
}
export async function assertTextCell(rowInfo: RowInfo, databaseController: DatabaseController, expectedContent: string) {
const cellController = await makeTextCellController(rowInfo, databaseController).then((result) => result.unwrap());
cellController.subscribeChanged({
onCellChanged: (value) => {
const cellContent = value.unwrap();
if (cellContent !== expectedContent) {
throw Error();
}
},
});
cellController.getCellData();
}
export async function editTextCell(rowInfo: RowInfo, databaseController: DatabaseController, content: string) {
const cellController = await makeTextCellController(rowInfo, databaseController).then((result) => result.unwrap());
await cellController.saveCellData(content);
}
export async function makeTextCellController(
rowInfo: RowInfo,
databaseController: DatabaseController
): Promise<Option<TextCellController>> {
const builder = await makeCellControllerBuilder(rowInfo, FieldType.RichText, databaseController).then((result) =>
result.unwrap()
);
return Some(builder.build() as TextCellController);
}
export async function makeNumberCellController(
rowInfo: RowInfo,
databaseController: DatabaseController
): Promise<Option<NumberCellController>> {
const builder = await makeCellControllerBuilder(rowInfo, FieldType.Number, databaseController).then((result) =>
result.unwrap()
);
return Some(builder.build() as NumberCellController);
}
export async function makeSingleSelectCellController(
rowInfo: RowInfo,
databaseController: DatabaseController
): Promise<Option<SelectOptionCellController>> {
const builder = await makeCellControllerBuilder(rowInfo, FieldType.SingleSelect, databaseController).then((result) =>
result.unwrap()
);
return Some(builder.build() as SelectOptionCellController);
}
export async function makeDateCellController(
rowInfo: RowInfo,
databaseController: DatabaseController
): Promise<Option<DateCellController>> {
const builder = await makeCellControllerBuilder(rowInfo, FieldType.DateTime, databaseController).then((result) =>
result.unwrap()
);
return Some(builder.build() as DateCellController);
}
export async function makeCellControllerBuilder(
rowInfo: RowInfo,
fieldType: FieldType,
databaseController: DatabaseController
): Promise<Option<CellControllerBuilder>> {
const rowCache = databaseController.databaseViewCache.getRowCache();
const cellCache = rowCache.getCellCache();
const fieldController = databaseController.fieldController;
const rowController = new RowController(rowInfo, fieldController, rowCache);
const cellByFieldId = await rowController.loadCells();
for (const cellIdentifier of cellByFieldId.values()) {
const builder = new CellControllerBuilder(cellIdentifier, cellCache, fieldController);
if (cellIdentifier.fieldType === fieldType) {
return Some(builder);
}
}
return None;
}