# Design (※ TBD)
- 編集しているユーザーがわかるようにする
- sync しているかを表示する（オフラインオンライン、保存済み、など）
- 未更新の編集データがあることを表示する
- [opt] awareness の調整

# 外部仕様 (※ は未実装）
### 同時多人数編集
- ページの edit モードを開くと同時多人数編集できる
### 自動保存
- Editor に入力した内容が自動保存される
### ※History でさかのぼれる
- History モーダルによる diff は revision のみ
- 自動保存のrevision はその時点に戻れればいい
- 自動保存の戻られる範囲は 2 リビジョン更新まで
    - 自動保存1、保存１、自動保存2、保存２ とあったとき、
    - 自動保存3, して 保存3 を実行したタイミングで 自動保存1 が消える
    - この時点でユーザーは 自動保存2 自動保存3 であればもとに戻ることができる
    - もとに戻るのは編集画面から 
- 自動保存された変更履歴は GROWI v6 の History や Google Spreadsheet のような感覚でさかのぼることができない
### ※Undo 操作
- `Ctrl + z` 等による undo 操作ができる
- ※ HackMD のように自分が入力した内容のみ Undo する
### データの見え方
- Editor および Preview には同時多人数編集および自動保存された最新データが表示される
- しかし、View にはページの最新リビジョン (revision ドキュメントと同期) のデータが表示される

### ※オフライン時も操作できる
- テストプレイでは一時的なオフラインであればすでに対応できていた
    - オフライン時の挙動については、今の段階で実験をして方向性を探りたいのはある。View を表示してからオフラインになり、その状態で編集開始できないというのは許容してもよさそうだが、エディタを表示してからオフラインになった場合に HackMD のように編集不可能になる(エコーバックが返ってこないので入力できない)のはなんとかして回避したい。
### ※コンフリクトを解消できる

### 自動削除機能
- 編集画面の Editor に Markdown を入力しただけでページに保存していないデータを Draft データと呼ぶ
- Draft データは、ページ更新せずとも残り続け、一定期間で自動削除される
- 削除期間は管理画面から設定できる（デフォルト 2 week）



# コンフリクト

## origin の概念
ページの更新方法は大きく分けて3種ある (origin と呼ぶ)

- Editor を使って更新
- View から更新
    - HandsontableModal, DrawioModal による編集など
- API から更新

## origin の強弱

- 基本的にページを更新するには前の revision の ID を含んだリクエストを送る必要がある
    - latest revision が一致していなければ、サーバーはリクエストを弾く
- 例外
    - Editor origin は View origin よりも強い
        - **ストレス:** 複数メンバーが Editor を使っているときに View からの変更に割り込まれて `Posted param "revisionId" is outdated.` のエラーが出るのは避けたい
        - latest revision の origin が View の場合に限り、Editor origin の変更リクエストは revision ID 不要で更新できる


|        | Editor | View | API |
| ------ | ------ | :--- | --- |
| Editor | ⭕️    | ⭕️  | ❌  |
| View   | ❌     | ❌   | ❌  |
| API    | ❌     | ❌   | ❌  |

## 編集中ステータス (理想)

あるページの編集状況のステータスは以下 3 種

| ステータス | Editor ボタンの状態 | 説明                                                                                               |
| ---------- | ------------------- | -------------------------------------------------------------------------------------------------- |
| Active     | 青い印(仮)          | Editor を開いているユーザーが一人以上存在し、かつ現在時刻より3分以内に作成されたドラフトが存在する |
| Drafted    | グレーの印(仮)      | Editor を開いているユーザーが存在せず、かつ最新リビジョンより新しいドラフトが存在する              |
| Updated    | 印なし              | Active でもなく Drafted でもない場合                                                               |

## 編集中のステータス (現状)
| ステータス | Editor ボタンの状態 | 説明                                                                                  |
| ---------- | ------------------- | ------------------------------------------------------------------------------------- |
| Active     | 青い印              | Editor を開いているユーザーが一人以上存在する                                         |
| Drafted    | グレーの印          | Editor を開いているユーザーが存在せず、かつ最新の revisionBody とドラフトに差分がある |
| Updated    | 印なし              | Active でもなく Drafted でもない場合                                                  |


## View からの更新機能に対する制限

あるページの編集状況のステータスが Active の場合は、編集のための UI を利用することができない(disabled)




# ---以下 TBD ---

# ユーザーストーリー
- ビルトインエディタで同時多人数編集できる
- ビルトインエディタへの入力内容を自動保存できる
- オフラインでもデータが揮発しないでエディタを使用できる
- エディタ入力内容のコンフリクトを解消できる

## その他
- edit モードになってから WebScoket コネクションするまでの仕様
    - HackMD のような画面を見せるかどうか > 却下
- Editor (ydoc) にデータがある場合に View に編集中であることのアラートを表示させるかどうか
    - アラートは表示させない。v6 までよりも、ドラフトが存在するということをもっと軽く取り扱いたい


## いまのところ考えている方針 
- ナレッジベースアプリとして一度入力した内容が消えないことを最優先にする
    - データが消えないという安全寄り
- オフライン側に制約を設ける

# 制限
## 1. オンラインでないといけない
### オンライン状態とは？
- ユーザーが GROWI のクライアントを開くことができ、WebSocket コネクションを GROWI サーバーと張れる
- 自分の変更と WebSocket コネクションしているほかのすべてのユーザーの変更がリアルタイムで相互に反映される
    - リアルタイムについて: 具体的な数値は定めていない、感覚値で HackMD レベルで進めている
- GROWI サーバーが DB と連携できており Editor の入力内容や「更新」ボタンの押下によって対象のコレクションが更新されていく
### オフライン状態とは？
- ユーザーがインターネットにつながっておらず、ブラウザから GROWI App クライアントを開けない
- インターネットにつながっていてブラウザから GROWI App クライアントを開けるが、WebSocket コネクションできない
- インターネットにつながっていてブラウザから GROWI App クライアントを開けるが、GROWI App サーバーと通信できない
- インターネットにつながっていてブラウザから GROWI App クライアントを開け、GGROWI App サーバーとも通信できるが、DB と通信できない
- WebSocket コネクションできているが、リアルタイムに反映されない

### TBD
- 一度コネクションできた後に、コネクションが切れてしまったときの挙動
- オフラインの後途中でオンラインになった場合

## 2. コンフリクト
### コンフリクトが発生するのはどんなとき？
#### initialValue 同士のコンフリクト
- 発生条件:
    - TBD
- 解消方法:
    - TBD
#### ydoc 同士のコンフリクト
- 発生条件:
    - TBD
- 解消方法:
    - TBD
#### ydoc と initialValue のコンフリクト
- 発生条件:
    - TBD
- 解消方法:
    - TBD
#### y-writings コレクション内でのコンフリクト
- 発生条件: 
    - 同時多人数編集中に複数ユーザーが同じ個所を変更する
    - オフライン時の対応
- 解消方法: 
    - 基本は yjs が持つ CRDT によって解消してくれる（はず）
#### revisions コレクション同士のコンフリクト
- 発生条件:
    - TBD
- 解消方法:
    - TBD
#### y-writings と revisions のコンフリクト
- y-writings が先（先とはなにか, timestamp）
    - コンフリクトする場面は「更新」ボタンを押したときに限定される？
        - 基準を timestamp として y-writings が先ならばそのまま y-writings コレクション、つまり ydoc がそのまま revisions を上書きする
- revisions が先（先とはなにか）
    - コンフリクトする場面は？
        - ★
        - ここで少し内部仕様：initialValue を revisions から取得する。もし ydoc がなければ initialValue を初期値として ydoc に insert し、ydoc の値を Editor に読み込ませ表示する
            - 「ydoc がなければ」とは socket コネクションを張ったうえで y-writings コレクションを参照し、id: pageId を持つドキュメントがないかを探す。これをしても、見つからなかったとき。

# この機能によって不要になるもの
- ページ遷移やブラウザクローズ時に Editor に更新されていないデータがあるときのアラート
- HackMD 関連
- 「○○さんが更新しました」のアラート

# 確認すべきこと
- メモのような位置づけ。内部仕様
- 「基本」に書くことは動作確認で確認する。
## 基本
- ユーザーストーリーを達成できるか
    - 同時多人数編集できるか
    - 自動保存されるか
    - コンフリクトを解消できるか
- オフライン時を考慮できているか
- UI/UX が考慮されているか
- ドキュメントがあるか
- テストコードがあるか
- 不要になった機能を omit できているか

## 詳細
- 基本機能/考慮漏れがないか
    - ページを削除した場合は対象の y-writing ドキュメントも削除できているか
    - pageId によって page ドキュメントと y-writings ドキュメントを紐づけているので、page ドキュメントと y-writings ドキュメントのキー参照が必要だが、pageId が変わる場合がないか
    - 自動保存でも誰が更新したか確認できないかどうか
- 自動保存性が守られているか
    - y-writing のデータはいつまで保存されるか
    - オフライン時でも Editor に入力した内容は保持されるか
    - 他ユーザーによって上書きされた場合に復元できるか
- yjs の仕様・DB 制約
    - ydoc の update イベントで DB ドキュメントが作成されるはずだがそれはどの頻度か
    - y-writings の clean up/flush db はどの頻度/契機か？ ドキュメントが大量に残って DB を圧迫し続ける可能性はないか
    - 同時編集時にの Undo について、他ユーザーの入力を Undo できるか
    - 何人まで同時多人数編集できるか
- 内部仕様
    - 図を用いて同時多人数編集と自動保存のライブラリ関係とライフライクルを説明できているか
- UI/UX
    - Awareness 等のデザインを相談できているか
    - テストプレイを用いて UX を相談できているか
- GROWI v6 の Editor の機能のうち、保存/コンフリクト解消/アラート等について考慮漏れやがないか
    - 「更新と同時にすべての配下スコープを上書き」機能を洗い出す
    - slacknotification の仕様
        - 「更新」ボタンがおされたら
    - Auditlog、Activity、Action
    - TBD

---

## Page Navigation

- Canonical URL: https://dev.growi.org/資料/外部仕様/ビルトインエディタでの同時多人数編集
- Permalink: https://dev.growi.org/651a6f4a008fee2f99187431
- Parent: [外部仕様](/5f9996b89d9ead0049f0ab65.md)
- Children: 1 total
  - [20231006_テストプレイ会](/651f702c795a17785e2810cc.md)
- Total descendants: 1
- Siblings: 36 total
  - [Audit Log Bulk Export](/68b694cdabc93bd7957d265c.md)
  - [G2G Transfer](/6346925ae4791185c5e853e0.md)
  - [LDAPグループ同期](/646d5637019e02272a42cf86.md)
  - [Page Bulk Export](/6555604cc364daae3a0a0946.md)
  - [S3のACL設定](/5d091f611fe336003eec5bfd.md)
  - [WIP ページ](/65699af6f32b6358c8efa636.md)
  - [audit-log](/61d6ecdae1ae10d6e19f891f.md)
  - [growi-database-plugin](/634784884b3568aa883bfe05.md)
  - [お知らせ機能](/650d5e7f1647c0285cbb8ae0.md)
  - [アンカーによるページのScroll](/60262e7f15f624004857eb4b.md)
  - [アンケート機能](/6385912d1632aa30f4dae840.md)
  - [インストールプロセス](/600908ded3b38b00486b4b8e.md)
  - [インラインコメント機能](/6503fa29ccf8a72c114fd223.md)
  - [ゲストユーザーが取得できる情報](/5fa395329d8cee004846bb2b.md)
  - [コンテキスト別表示条件一覧](/5fabddf8bbeb1a0048bcb9e9.md)
  - [コンテンツ多言語対応](/6915d04fbdc3b77cabf237ec.md)
  - [サイドバー](/64f551e3bd1b000bf8acccdd.md)
  - [タグに関する仕様](/61713f737000780eeb72f0c8.md)
  - [タグの更新](/5f97e26eb269d70048a2bdc8.md)
  - [ファイルアップローダー管理画面での操作](/5f99a08e9d9ead0049f0ab80.md)
  - [ページ&ユーザーグループv5](/61b2cdabaa330ce7d8152844.md)
  - [ページの削除](/62271ba808e08bfffd17d07e.md)
  - [ページの移動・リネーム](/6260ff12175c306030e8748f.md)
  - [ページへの複数グループ紐付け](/65253f66b8492a62fc75865f.md)
  - [ページ新規作成時に添付ファイルをアップロードした時の挙動](/645cb75e97cc638e5f3d43f0.md)
  - [ユーザーAPI](/5fd7466a31d89500488248e3.md)
  - [ワークフロー機能](/64d1ee0d67e9a7482fe87ca5.md)
  - [一括削除ボタン、一括削除機能の追加](/625d4ed354f617fa1264d2a3.md)
  - [子孫ページの権限をまとめて更新](/635a314eac6bcd85cbf359fc.md)
  - [検索v5](/619b61e74f3f92073de6964b.md)
  - [検索結果ページのコメント表示](/621ca4cfd9a9f09266ad1503.md)
  - [権限修正が可能なページのアラート](/626f59d70e471e40b93c736a.md)
  - [添付ファイルの差し替え](/6a6c9403e6d2eebb58289b6a.md)
  - [添付ファイル内全文検索](/69f2e686317cd5dede8898fc.md)
  - [環境変数によるファイルアップローダー設定](/5f9a4106431b5c0048050a2a.md)
  - [複数グループが紐づいたページの操作](/656745fa52eafe1cf1879508.md)
- Last updated: 2024-05-15T06:42:37.552Z by shun-m
- Full page listing (all children regardless of count): https://dev.growi.org/_api/v3/page-listing/children?id=651a6f4a008fee2f99187431
