NGW開発BLOG
← 記事一覧へ
·#041

ひとりのワガママは、みんなの設定個人設定 ngwPersonalInfo と Property枠

「カレンダーは日曜始まりがいい」「いや月曜だ」。どちらも正しい主張を、NGWはどちらかに決めず、各自で選べる個人設定に昇格させる。ngwPersonalInfo.php と NGW_STAFF_PROPERTY の汎用Property枠、そして「みんなの既定+ひとりの上書き」という設計の話。

どちらも、正しい

「カレンダーは日曜始まりがいい」「いや、月曜始まりだ」——役所の中でも、この手の小さな主張は必ずぶつかる。厄介なのは、どちらも、その人にとっては正しいことだ。伝票を数える人には日曜始まりが、週の予定を組む人には月曜始まりが、それぞれ自然に見える。

こういうとき、多数決で片方に決めても、負けた側は毎日ちょっとずつ不便を飲むことになる。管理者の一存で決めれば角が立つ。NGWの答えは、そのどちらでもない。「決めない」——ひとりの「こうしたい」を、全員が各自で選べる個人設定に昇格させる。それを一手に引き受けるのが ngwPersonalInfo.php(個人情報管理)だ。

ひとりぶんの、設定たち

設定画面を開くと、その人にだけ効くスイッチがずらりと並ぶ。

個人設定の画面。ログインで起動するAPP、表示スタイル、グループ初期値、カレンダー開始曜日、週間カレンダー表示など、職員一人ぶんの表示設定が並ぶ

職員ひとりぶんの表示設定。ログインで起動するAPP、表示スタイル、グループ初期値、予定表の改行、カレンダー開始曜日、自分の予定を含めるか、文字数制限……どれも「その人の画面」だけに効く。

並んでいるのは、たとえばこんな「好み」だ。

  • ログインで起動するAPP … ログイン直後に何を開くか(HOME画面/メール/スケジュール…)。毎朝最初に見たいものは人によって違う。
  • 表示スタイル … 画面テーマ。Cerulean など。ちなみにこのブログもCeruleanで、同じ青空の色をしている。
  • グループ初期値 … グループ表示で最初に出す所属(「所属係」など)。いつも見る顔ぶれを既定にできる。
  • 予定表 … タイトルと場所を改行して見せるか。
  • カレンダー開始曜日 … 日曜か月曜か。——そう、FullCalendarの記事で「firstDay を個人ごとに設定できるようにした」と書いた、その正体がこれだ。
  • グループ表示に自分を含める(上部の自分の予定を非表示にする)/スケジュールの文字数制限(0=制限しない)/HOMEに週間カレンダーを表示するDataTableの検索を保存する

派手な機能は、ひとつもない。だが「毎日見るもの」の細部だからこそ、選べることが効く。

どこに、どう持つか

これらは職員ひとりずつ、NGW_STAFF_PROPERTY というテーブルの1行として持つ。特徴的なのは、カラムがあえて意味を持たない汎用名 —— Property01Property10 —— になっていることだ。

中身
Property01表示スタイル
Property02グループ初期値
Property03予定表(改行)
Property04ログインで起動するAPP
Property05カレンダー開始曜日
Property06HOMEに週間カレンダー
Property07DataTableの検索を保存
Property08グループ表示に自分を含める
Property09スケジュールの文字数制限

保存の流れは、アプリの仕組みで書いた型そのままだ。画面 ngwPersonalInfo.php(器)が ajaxNgwPersonalInfo.php を呼び、SubMode CHANGE_STYLE で受ける。値の器 clsNgwStaffProperty と、その入出力を握る fncNgwStaffProperty(clsFunction)を通して、STAFF_CD をキーに1行を書く。しかも INSERT ... ON DUPLICATE KEY UPDATEupsertだから、初回保存でその人の行ができ、以降は同じ行を上書きしていく。

みんなの既定と、ひとりの上書き

ここが設計のいちばんのポイントだ。

個人がまだ何も設定していないとき、たとえばカレンダー開始曜日は空になる。そのときNGWはこうする。

// カレンダー開始曜日:個人設定が空なら、システム既定(定数)を採る
if($fdtProperty05 == ''){
  $fdtProperty05 = _SC_FIRST_DAY_;
}

_SC_FIRST_DAY_DBに置いた定数、つまりその自治体ぜんぶの既定値である。まとめると、

  • 既定は、みんな共通(DB定数。自治体ごとに一度決めておく)
  • 個人がひとつ設定すれば、その人だけ上書き

全員が同じ床の上に立ちつつ、いつでも自分だけ、そっと足元をずらせる。これが「ひとりのワガママは、みんなの設定」の実体だ。既定を捨てて全部を個人任せにするのでも、個人を切り捨てて全体で統一するのでもない。共通の土台と、個別の上書きが、重なって効く。

枠を、あえて汎用にする

Property01Property10 と、番号だけの汎用枠にしてあるのには意味がある。新しい「こうしたい」が現場から出てきても、空いている枠(10番は予備だ)に割り当て、選択肢をひとつ増やすだけで済む。テーブルに意味付きのカラムを足す——それは全自治体ぶんのDB改修を意味する——という重い一手を、避けられる。

つまりこの仕組みは、未来のワガママを受け入れるコストが、あらかじめ低い。設定が増えるほど散らかるのではなく、増えることを織り込んだ器になっている。

角を立てずに、合意する

最後は、技術の外の話。日曜か月曜かで会議をしても、たぶん決着はつかない。どちらも正しいからだ。「個人設定にする」という答えは、実装の答えであると同時に、合意形成の答えでもある。誰かのために全員を変えなくていいし、誰かの好みを却下しなくてもいい。要望は却下ではなく、枠がひとつ増える形で受け止められる。

AIとの協働作業での学び

機能で意見が割れたら、まずひとつだけ切り分ける。「これは全員に効く仕様か、その人だけの好みか」。仕様なら共通の既定(定数)に、好みなら個人設定の枠に落とす。そのどちらかに振り分けるだけで、揉めごとの多くは「設計の問題」に変わり、感情の問題ではなくなる。

NGWが10年、現場で使われ続けるのは、こういう「ひとりのワガママを、そっと全員ぶんの枠に変える」を積み重ねてきたからだ。ワガママは、切り捨てる対象ではない。うまく畳めば、それはみんなの選択肢になる。