fix(editor): a read-only table's rows fit their cells
A table keeps each row's height on its cells and corrects it after layout through a transaction, which a read-only editor never applies: in a path step, a note or a card, a cell of several lines (る, う, つ in Tae Kim's conjugation tables) ran over its row's borders. Our fork of the editor now sizes the rows of a read-only table in place, as it already did the table's height (81c3006c on halkyon/win32-v6; upstream's main has the same code). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MMm7usAo6q9ZZRoPkWjoxi Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
parent
7d99feca7f
commit
192291d35a
4 changed files with 44 additions and 4 deletions
|
|
@ -89,7 +89,7 @@ A spaced-repetition learning app: studysets of flashcards, reviewed on an FSRS s
|
|||
- **Material's `Card` widget clashes with the domain's `Card`**: files that need both import `material_ui` with `hide Card`.
|
||||
- **State: `flutter_bloc`, uniformly.** Blocs fold repository streams into immutable states with value equality, are provided as close to their consumer as possible, and log through one global `BlocObserver`. Why: the data layer is stream-shaped, event → state machines test without widgets, and one pattern everywhere is itself the point.
|
||||
- **Value equality comes from `equatable`**, mixed in (`with Equatable`), for models and states alike; `leancode_lint`'s `missing_equatable_props` catches a field left out of `props`.
|
||||
- **Rich text is `RichContent`** (`lib/src/core/content/`): the editor's document JSON plus a `formatVersion`, pure Dart, so models and the server can use it. `lib/src/core/editor/` converts it to and from the editor's `Document` (giving tables the decimal sizes the editor casts to: JSON from imports and archives may hold whole numbers, or none) and holds the one editing widget (`RichContentEditor`) and the one read-only renderer (`RichContentView`).
|
||||
- **Rich text is `RichContent`** (`lib/src/core/content/`): the editor's document JSON plus a `formatVersion`, pure Dart, so models and the server can use it. `lib/src/core/editor/` converts it to and from the editor's `Document` (giving tables the decimal sizes the editor casts to: JSON from imports and archives may hold whole numbers, or none; our fork of the editor fits a read-only table's rows to their cells, which upstream's leaves at their stored height) and holds the one editing widget (`RichContentEditor`) and the one read-only renderer (`RichContentView`).
|
||||
- **Blocks** beyond the editor's own (callout, spoiler, formula, image, sound, YouTube video, study button) keep their type and attributes as named in `core/content/content_blocks.dart`, which `RichContent` reads too (their text counts in `plainText`, and a video or study button isn't blank). An `EditorBlocks` lists how each type is built, which can be inserted (the format bar's Insert sheet and the desktop's `/` menu show the same list) and its typing rules; the core's are `coreBlocks`, and a feature's (the study button, `feature/study/`) reach the editors through `EditorBlocksScope`, which `PersonApp` fills, since the core can't know features. One builder serves editor and view: a block asks `editorState.editable`, and read-only shows what it is for (a spoiler hidden until revealed, a formula set, a video's play). A block taken whole mixes in `AtomicBlock` (selection, the remove button); unknown types show "needs a newer version" and stay as they are. New block types keep `formatVersion` 1: raising it would hide whole studysets and paths in older apps.
|
||||
- **Time comes from `clock.now()`** (`package:clock`), never `DateTime.now()`, in server and app. Why: scheduling, streaks and expiry are deterministic under test (`withClock`, `fakeAsync`), and because Serverpod itself reads `clock.now()` (e.g. session expiry), `withClock` controls its behaviour too.
|
||||
- **UTC for storing and sending, local time for display and day boundaries.** Serverpod sends `DateTime` as UTC and stores it in `timestamp without time zone` columns. Compare and compute in UTC; call `.toLocal()` only to display. "Due today", streaks and daily goals use the learner's **local** calendar day, computed on the client; the server never needs day boundaries.
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@ dependencies:
|
|||
appflowy_editor:
|
||||
git:
|
||||
url: https://code.halkyon.app/project-halkyon/appflowy-editor.git
|
||||
ref: 83bdb2a3e66881eff9b2f8afe416b57fc791daf9
|
||||
ref: 81c3006c74e789ed2e470b8612529541b358fd26
|
||||
# Anki packages are zip files.
|
||||
archive: ^4.0.7
|
||||
# Sounds in content (pronunciations): one package for all five platforms; on
|
||||
|
|
|
|||
|
|
@ -92,6 +92,46 @@ void main() {
|
|||
}
|
||||
});
|
||||
|
||||
testWidgets('a row holding a cell of several lines grows to fit it, read '
|
||||
'only as in the editor', (tester) async {
|
||||
Map<String, Object?> cell(int row, String text) => {
|
||||
'type': 'table/cell',
|
||||
'data': {'colPosition': 0, 'rowPosition': row},
|
||||
'children': [
|
||||
{
|
||||
'type': 'paragraph',
|
||||
'data': {
|
||||
'delta': [
|
||||
{'insert': text},
|
||||
],
|
||||
},
|
||||
},
|
||||
],
|
||||
};
|
||||
await show(
|
||||
tester,
|
||||
RichContent({
|
||||
'document': {
|
||||
'type': 'page',
|
||||
'children': [
|
||||
{
|
||||
'type': 'table',
|
||||
'data': {'colsLen': 1, 'rowsLen': 2},
|
||||
'children': [cell(0, 'る\nう\nつ'), cell(1, 'す')],
|
||||
},
|
||||
],
|
||||
},
|
||||
}),
|
||||
);
|
||||
await tester.pump();
|
||||
|
||||
final cells = find.byType(TableCelBlockWidget);
|
||||
expect(
|
||||
tester.getSize(cells.at(0)).height,
|
||||
greaterThan(2 * tester.getSize(cells.at(1)).height),
|
||||
);
|
||||
});
|
||||
|
||||
testWidgets('shows the content', (tester) async {
|
||||
await show(tester, paragraph('猫は動物です。'));
|
||||
|
||||
|
|
|
|||
|
|
@ -53,8 +53,8 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
path: "."
|
||||
ref: "83bdb2a3e66881eff9b2f8afe416b57fc791daf9"
|
||||
resolved-ref: "83bdb2a3e66881eff9b2f8afe416b57fc791daf9"
|
||||
ref: "81c3006c74e789ed2e470b8612529541b358fd26"
|
||||
resolved-ref: "81c3006c74e789ed2e470b8612529541b358fd26"
|
||||
url: "https://code.halkyon.app/project-halkyon/appflowy-editor.git"
|
||||
source: git
|
||||
version: "6.1.0"
|
||||
|
|
|
|||
Loading…
Reference in a new issue