From 6ed10adc31c3c476c0ef646ae4cdcf430d0befa8 Mon Sep 17 00:00:00 2001 From: Jeremy Date: Thu, 29 Jan 2026 10:56:15 +0800 Subject: [PATCH] Fix binding blocks --- crates/controller/src/edit_action/mod.rs | 1 - packages/web/src/api/workbook.ts | 7 +++++ src/components/block-composer/index.tsx | 3 ++ src/components/block-composer/types.ts | 2 +- src/components/block-interface/index.tsx | 4 +-- tests/block/mod.rs | 35 ++++++++++++++++++++++++ 6 files changed, 48 insertions(+), 4 deletions(-) diff --git a/crates/controller/src/edit_action/mod.rs b/crates/controller/src/edit_action/mod.rs index 97f1c907..3603e24e 100644 --- a/crates/controller/src/edit_action/mod.rs +++ b/crates/controller/src/edit_action/mod.rs @@ -455,7 +455,6 @@ pub struct BindFormSchema { // It is used to customize the fields' render behaviors. // The length of this vector should be the same as `fields`. pub render_ids: Vec, - pub keys: Vec, pub row: bool, } diff --git a/packages/web/src/api/workbook.ts b/packages/web/src/api/workbook.ts index 845c3512..53056197 100644 --- a/packages/web/src/api/workbook.ts +++ b/packages/web/src/api/workbook.ts @@ -1,6 +1,7 @@ import { batch_get_cell_coordinate_with_sheet_by_id, batch_get_cell_info_by_id, + bind_form_schema, block_input, block_line_name_field_update, block_line_num_fmt_update, @@ -890,6 +891,12 @@ export class Workbook { null, p.value.wrapText ) + if (p.type === 'bindFormSchema') { + return bind_form_schema(this._id, p.value) + } + if (p.type === 'upsertFieldRenderInfo') { + return upsert_field_render_info(this._id, p.value) + } // eslint-disable-next-line no-console console.log(`Unimplemented!: ${p.type}`) } diff --git a/src/components/block-composer/index.tsx b/src/components/block-composer/index.tsx index 981db104..d2136c23 100644 --- a/src/components/block-composer/index.tsx +++ b/src/components/block-composer/index.tsx @@ -44,6 +44,7 @@ export const BlockComposerComponent = (props: BlockComposerProps) => { type: 'string', description: 'Current status of the customer', required: true, + primary: false, }, ]) const [selectedFieldId, setSelectedFieldId] = useState( @@ -158,6 +159,7 @@ export const BlockComposerComponent = (props: BlockComposerProps) => { .build(), } payloads.push(createBlockPayload) + const keyIdx = fields.findIndex((f) => f.primary) const bindFormSchemaPayload: Payload = { type: 'bindFormSchema', @@ -167,6 +169,7 @@ export const BlockComposerComponent = (props: BlockComposerProps) => { .blockId(blockId) .fieldFrom(0) .row(true) + .keyIdx(keyIdx < 0 ? 0 : keyIdx) .fields(fs.map((f) => f[1].name)) .renderIds(fs.map((f) => f[0])) .build(), diff --git a/src/components/block-composer/types.ts b/src/components/block-composer/types.ts index 599adabe..71c20d5a 100644 --- a/src/components/block-composer/types.ts +++ b/src/components/block-composer/types.ts @@ -21,7 +21,7 @@ export interface FieldSetting { type: FieldTypeEnum description?: string required: boolean - primary?: boolean + primary: boolean enumId?: string defaultValue?: string format?: string // for datetime diff --git a/src/components/block-interface/index.tsx b/src/components/block-interface/index.tsx index 1b33c205..0a5c562e 100644 --- a/src/components/block-interface/index.tsx +++ b/src/components/block-interface/index.tsx @@ -63,12 +63,12 @@ export const BlockInterfaceComponent = (props: BlockInterfaceProps) => { .sort((a, b) => a.idx - b.idx) .map((fieldEntry, _idx) => { const result = BLOCK_MANAGER.fieldManager.get( - fieldEntry.field + fieldEntry.renderId ) if (!result) { throw new Error( - `Field ${fieldEntry.field} not found in block ${info.blockId}` + `Field ${fieldEntry.renderId} not found in block ${info.blockId}` ) } diff --git a/tests/block/mod.rs b/tests/block/mod.rs index 5a5be860..e75133d3 100644 --- a/tests/block/mod.rs +++ b/tests/block/mod.rs @@ -1,3 +1,7 @@ +use logisheets_controller::edit_action::{BindFormSchema, EditPayload, PayloadsAction}; + +use crate::load_script; + use super::test_script; #[test] @@ -19,3 +23,34 @@ fn test_resize_block() { fn test_convert_block() { test_script("tests/block/convert_block.script"); } + +#[test] +fn test_bind_block_schema() { + let mut workbook = load_script("tests/block/create_block.script"); + let _ = workbook.handle_action(logisheets::EditAction::Payloads(PayloadsAction { + payloads: vec![EditPayload::BindFormSchema(BindFormSchema { + sheet_idx: 0, + block_id: 1, + ref_name: "test".to_string(), + field_from: 0, + key_idx: 0, + fields: vec!["name".to_string(), "age".to_string(), "address".to_string()], + render_ids: vec![ + "test1".to_string(), + "test2".to_string(), + "test3".to_string(), + ], + row: true, + })], + undoable: true, + init: false, + })); + + let ws = workbook.get_sheet_by_idx(0).unwrap(); + let window = ws.get_display_window(0, 0, 5, 5).unwrap(); + let blocks = window.blocks; + assert_eq!(blocks.len(), 1); + let block = &blocks[0]; + println!("{:?}", &block.info.schema); + assert!(block.info.schema.is_some()); +}