generated at
Kozaneba開発日記2021-09-02
2021-09-02Kozaneba開発日記

リリースノート
タイトルのついているグループをungroupした時、そのタイトルのついた空のグループが左上隅に残る
以前はタイトルが新しいこざねになっていた
これは「グループにつけたタイトル」はグループの要約として新しく生み出されたものだから消してはいけない、という思想
こざねではなくグループとして残すことで、たとえばいくつも要素があるグループの半分を別のグループに出したい時、ungroupして、半分を選択して元のグループに入れ、もう半分を別のグループにすることができる

リリースノート
ペーストのバグを修正

場の削除機能をとりあえず開発者メニューに追加した
削除してリロードすると「ない」とエラーダイアログが出る
変更subscriptionが切れる
これを検知してオートセーブがオフになる
もう一度オンにすれば別のキーで新規保存される
ユーザに直接使わせても大丈夫そうだな

リリースノート
場の削除機能

リリースノート
リンクこざね
こざねの custom.url が空文字列でもundefinedでもない場合:
右上隅にリンクアイコンが表示され、メニューに visit が追加される

グループにminSizeをつけたけど「ピッチリしてて選択しにくい」ケースが出る
どうするのが良いのか
面積で判断?

リリースノート
URLをペーストした時に custom.url を持ったこざねが作られる
表示する文字列は貼り付けた後コンテキストメニューからeditできる


「Baの一部を別のBaにする」ができる
コピーしたものがJSONになってクリップボードに入る
他のBaにペーストすることもできる
だから「選択してコピーして新規Baにペースト」すれば良い
これを一つのメニューにするかどうか
それほど頻繁に使うものでもないよなと思う
作るとするなら、ユーザ拡張で再利用可能なように
選択範囲のJSONとしての取得
JSONを新規Baに書き込み、IDを得る
の2つが必要


他のものに使っていく
pKeichobot
pIntellitech

選択範囲が空の場合、選択モードから抜ける

名前のないグループをコピーペーストした後中のグループをungroupするとクラッシュする

リリースノート
Firestoreの権限ルールのバグを修正
リードオンリー共有しているBaに対して、ローカルで開発サーバを起動するなどして開発メニューから削除コマンドを実行すると削除できてしまう状態にあった

ローカルバックアップが必要だな
JSONにする機能と、それをユーザがペーストすることで復元する機能はあるわけだから難しくなさそう
15分に1回くらい、直前のバックアップと比較して更新されてたらローカルのIndexedDBに保存すれば良い

リリースノート
こざね追加時にちょうどぴったり長方形に並ぶとグループをドラッグするために掴む場所がない問題を修正

うーん…
ts
const p = get_group(getGlobal(), parent); if (p.items.length === 0 && p.text === "") { updateGlobal((g) => { remove_item(g, parent); }); } else { normalize_group_position(parent); }
部品の構造が3通りある…

A: 内部でupdateGlobalする: normalize_group_position
B: draftを受け取ってそれを破壊的更新する: remove_item
C: 破壊的更新はしないのでdraftでもそうでなくてもOK: get_group

うーん、draftを受け取るの第二引数にして「省略されたら自分で作る」にしようか?
ts
export const normalize_group_position = (gid: ItemId) => { updateGlobal((g) => { ... }); };
これを

こうする
ts
export const normalize_group_position = (gid: ItemId, draft?: State) => { const body = (g: State) => { ... }; if (draft === undefined) { updateGlobal(body); } else { body(draft); } };

さらにこうか
ts
export const normalize_group_position = (gid: ItemId, draft?: State) => { optional_draft(draft, (g) => { ... }); }; const optional_draft = ( draft: State | undefined, f: (g: State) => void ): void => { if (draft === undefined) { updateGlobal(f); } else { f(draft); } };

これで optional_draft 部分は共通化されて、既存のdraftを受け取らないユーティリティの冒頭2行を書き換えるだけで良くなる




あ、そうか、なるほど
リードオンリー共有した(僕が編集権限を持ってる)Baを別名保存して別のユーザが編集した際、「別名保存」の段階で僕の編集権限ごと保存されてるので僕の一覧にも出るし書き換えられちゃう
この挙動はおかしいな