from Kozaneba開発日記2021-09-01 2021-09-02Kozaneba開発日記

リリースノート

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

リリースノート

  • ペーストのバグを修正

場の削除機能をとりあえず開発者メニューに追加した

  • 削除してリロードすると「ない」とエラーダイアログが出る
  • 変更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行を書き換えるだけで良くなる

https://twitter.com/nishio/status/1433356592620081155?s=20

矢印は明確な関係を表現し壊れなくする方法

ソースコードをScrapbox的に管理

あ、そうか、なるほど

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

next: Kozaneba開発日記2021-09-03