Kozaneba開発日記2021-09-02
2021-09-02Kozaneba開発日記
リリースノート
タイトルのついているグループをungroupした時、そのタイトルのついた空のグループが左上隅に残る
以前はタイトルが新しいこざねになっていた
これは「グループにつけたタイトル」はグループの要約として新しく生み出されたものだから消してはいけない、という思想
こざねではなくグループとして残すことで、たとえばいくつも要素があるグループの半分を別のグループに出したい時、ungroupして、半分を選択して元のグループに入れ、もう半分を別のグループにすることができる
https://gyazo.com/c1dca0c13c52d22defed38e53e39921b
リリースノート
ペーストのバグを修正
場の削除機能をとりあえず開発者メニューに追加した
削除してリロードすると「ない」とエラーダイアログが出る
変更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に保存すれば良い
リリースノート
こざね追加時にちょうどぴったり長方形に並ぶとグループをドラッグするために掴む場所がない問題を修正
うーん…
code: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を受け取るの第二引数にして「省略されたら自分で作る」にしようか?
code:ts
export const normalize_group_position = (gid: ItemId) => {
updateGlobal((g) => {
...
});
};
これを
こうする
code:ts
export const normalize_group_position = (gid: ItemId, draft?: State) => {
const body = (g: State) => {
...
};
if (draft === undefined) {
updateGlobal(body);
} else {
body(draft);
}
};
さらにこうか
code: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を別名保存して別のユーザが編集した際、「別名保存」の段階で僕の編集権限ごと保存されてるので僕の一覧にも出るし書き換えられちゃう
この挙動はおかしいな