サーバースクリプトのメソッドを拡張する
サーバースクリプトのメソッドは本体コードを改修すれば拡張できます。このページでは例として、選択肢を制御する columns.AddChoiceHash(キーと値の 2 引数)を、値だけで呼べるようにします。結論としては、キーと値に同じ値を渡すオーバーロード(またはデフォルト引数)を追加するだけで実現できます。
1.5.8.1 では標準で使える
1.5.8.1 のソースには、この記事のオーバーロードと同じ AddChoiceHash(object key) => AddChoiceHash(key, key) が含まれています(ServerScriptModel.cs)。1.5.8.1 以降では、本体を改修しなくても columns.ClassA.AddChoiceHash('値') のように値だけで呼べます。以下は、メソッドを拡張する手順の例として読んでください。
本体改変について
本体コードの改変が必要です。試すには、Visual Studio や Visual Studio Code など、ビルドして実行する環境が必要です。ビルド環境は 公式リポジトリの CONTRIBUTING.md を参照してください。
サーバースクリプトのメソッドの在りか
- サーバースクリプトは
Implem.Pleasanter/Libraries/ServerScripts配下のファイル群で定義されています。 $ps.で始まるメソッドは ClearScript(JavaScript)で、それ以外は C# で実装されています。columns配下のメソッドはServerScriptModel.csにあります。AddChoiceHashは ServerScriptModel.cs#L272-L280 です。
下調べ:ChoiceHash がどう使われるか
columns にセットされた値は _BaseModel.cs で処理され、クライアントに渡すために Choice モデルへ詰め替えられます。
- _BaseModel.cs#L828-L860(
columnsの処理) - _BaseModel.cs#L851-L853(
Choiceモデルへの詰め替え) - Choice.cs
Choice モデルは、項目ごとの選択肢一覧や Wiki の選択肢化でも使われるモデルです。やりたいことは「選択肢一覧で値だけを設定する」のと同じなので、選択肢一覧を Choice に詰め替える処理(Choice.cs#L45-L59)を見ます。
選択肢の文字列はセパレータで分割されて配列になり、_序数 で始まる拡張メソッド(N 番目の値があれば返し、なければ null)と Strings.CoalesceEmpty(第 1 引数が null / 空でなければそれを、そうでなければ第 2 引数を返す)で各プロパティに割り当てられます。結果は次のとおりです。
| 選択肢設定 | Value | Text | TextMini | CssClass | Style |
|---|---|---|---|---|---|
完了 | 完了 | 完了 | 完了 | ||
900,完了 | 900 | 完了 | 完了 | ||
900,完了,完 | 900 | 完了 | 完 | ||
900,完了,完,status-closed | 900 | 完了 | 完 | status-closed | |
900,完了,完,status-closed,color:red; | 900 | 完了 | 完 | status-closed | color:red; |
値だけを与えるときは、Value、Text、TextMini に同じ値が入ればよいことが分かります。
一方、サーバースクリプトの ChoiceHash からの詰め替えは Choice のコンストラクタ(Choice.cs#L15-L29)で、第 3 引数以降は省略されています。
| サーバースクリプト側 | 選択肢の実体 |
|---|---|
o.Key.ToString() | Value |
o.Value?.ToString() | Text |
o.Value?.ToString() | TextMini |
2 つの表を突き合わせると、サーバースクリプト側では Key と Value に同じ値をセットすればよい ことが分かります。
実装
オーバーロードを使う方法と、デフォルト引数を使う方法の 2 通りがあります。
オーバーロード
//オーバーロードを追加する
public void AddChoiceHash(object key) => AddChoiceHash(key, key);
//下記は既存コード
public void AddChoiceHash(object key, object value)
{
if (ChoiceHash == null)
{
ChoiceHash = new Dictionary<object, object>();
}
ChoiceHash.Add(key, value);
_choiceHashChanged = true;
}デフォルト引数
public void AddChoiceHash(object key, object value = null)
{
value ??= key; //ここを追加
if (ChoiceHash == null)
{
ChoiceHash = new Dictionary<object, object>();
}
ChoiceHash.Add(key, value);
_choiceHashChanged = true;
}どちらを選ぶかは好みですが、本体へコントリビュートする場合はデフォルト引数のほうが優勢と考えられます。
TIP
本体コードの改修は、サーバースクリプト周りから手をつけると分かりやすくおすすめです。