サイトメニューにテーブルのロック状態を出す(本体改修)
テーブルのロック中かどうかは、テーブルを開かないと分かりません。サイトメニューのパネルでロック中のテーブルを見分けられるようにする本体改修の設計メモです。本体の標準機能ではありません。
本体を改修せず、拡張 SQL と拡張スクリプトでパネルを赤くする方法は 一覧画面のカスタマイズ > サイト一覧にテーブルのロック状態を表示する にあります。
前提にした現行実装(1.5.8.1)
ロックの判定
| 項目 | 内容 |
|---|---|
| 有効にする設定 | テーブルの管理の AllowLockTable |
| 保存先 | Sites テーブルの LockedTime(日時)と LockedUser(ユーザー ID) |
| ロック | LockedTime を現在、LockedUser を操作したユーザーにする |
| 解除・強制解除 | LockedTime を現在、LockedUser を null にする |
| 判定 | LockedTime が有効な範囲内で、LockedUser が匿名ユーザーでない |
| 制限 | 権限を Read・Export・SendMail だけに絞る |
| 対象 | 記録テーブル・期限付きテーブル(ss.IsTable()) |
- ロックと解除の更新は SiteUtilities.cs です。
- 判定は
SiteSettings.LockedTable()、権限の絞り込みはSetPermissions()の中です(SiteSettings.cs)。権限の詳細は アクセス権限の実装 を参照してください。 SiteSettingsのLockedTableTime/LockedTableUserは、SiteSettingsUtilitiesのGet系でSiteModelのLockedTime/LockedUserから写されます(SiteSettingsUtilities.cs)。
テーブルを開いたあとのナビゲーションメニューでは、未ロックなら「テーブルをロック」、ロックした本人なら「ロックを解除」、特権ユーザーなら「強制解除」が出ます(HtmlNavigationMenu.cs)。
サイトメニューの取得列
サイトメニューの子サイトは Menu() が取得しますが、取る列は SiteId・Title・ReferenceType・SiteSettings の 4 つだけで、LockedTime・LockedUser は取っていません(SiteUtilities.cs)。パネルを出す SiteMenu() にも、ロック状態を渡す引数はありません(SiteUtilities.cs)。
設計
方針
| 方針 | 内容 | 長所 | 短所 |
|---|---|---|---|
| A. クラスを付ける | li.nav-site に locked | 変更が小さい | 見た目は CSS 次第 |
| B. アイコンを出す | パネルの中に鍵のアイコン | 見て分かる | 要素の追加が要る |
| C. A と B の両方(推奨) | クラスとアイコン | テーマ側で調整でき、見ても分かる | 改修箇所がやや多い |
1. Menu() でロック情報を取る
column: Rds.SitesColumn()
.SiteId()
.Title()
.ReferenceType()
.SiteSettings()
.LockedTime() // 追加
.LockedUser(), // 追加SiteModel にはすでに LockedTime / LockedUser があるので、列を足せば値が入ります。どちらも Sites の列なので JOIN は増えません。
2. 呼び出し元で判定して渡す
Menu(context: context, ss: ss).ForEach(siteModelChild => hb
.SiteMenu(
context: context,
ss: ss,
currentSs: siteModelChild.SiteSettings,
siteId: siteModelChild.SiteId,
referenceType: siteModelChild.ReferenceType,
title: siteModelChild.Title.Value,
locked: siteModelChild.LockedTime.Value.InRange()
&& !siteModelChild.LockedUser.Anonymous(), // 追加
siteConditions: siteConditions))SiteSettings.LockedTable() は SiteSettingsUtilities の Get 系で値を写したあとでないと使えないので、SiteModel の値で同じ条件を書きます。フォルダ(Sites)はロックの対象外で LockedUser が匿名のままなので、特別な除外は要りません。
3. SiteMenu() と SiteMenuInnerElements() に locked を足す
.Class(Css.Class("nav-site " + referenceType.ToLower()
+ (hasImage ? " has-image" : string.Empty)
+ (locked ? " locked" : string.Empty),
toParent ? " to-parent" : string.Empty))// SiteMenuInnerElements() の中
if (locked)
{
hb.Span(
attributes: new HtmlAttributes()
.Class("locked-indicator material-symbols-outlined")
.Title(Displays.Locked(context: context)),
action: () => hb.Text("lock"));
}Displays.Locked は日本語で「ロック」です。ロックした人と日時を出したい場合は、LockedTable(「このテーブルは {0} が {1} にロックしました。」)を title に使えます。
4. スタイル
Implem.PleasanterFrontend/wwwroot/src/styles/style.scss の .nav-site に足します。
.nav-site {
&.locked {
position: relative;
opacity: 0.7;
.locked-indicator {
position: absolute;
top: 8px;
right: 8px;
font-size: 18px;
color: var(--warning-color, #e67e22);
}
}
}出力の比較
<!-- 通常 -->
<li class="nav-site results" data-value="123" data-type="Results">
<a href="/items/123/index">…<span class="title">受注管理</span>…</a>
</li>
<!-- ロック中 -->
<li class="nav-site results locked" data-value="123" data-type="Results">
<a href="/items/123/index">
…<span class="title">受注管理</span>
<span class="locked-indicator material-symbols-outlined" title="ロック">lock</span>…
</a>
</li>改修箇所と影響
| ファイル | 内容 |
|---|---|
Models/Sites/SiteUtilities.cs | Menu() の取得列、SiteMenu() と SiteMenuInnerElements() の引数、locked クラス、アイコン、呼び出し元での判定 |
wwwroot/src/styles/style.scss | .nav-site.locked |
Menu()・SiteMenu()・SiteMenuInnerElements()には/// Fixed:のコメントが付いていて、CodeDefiner の生成対象ではありません。- DB の変更は要りません。取得列が 2 つ増えるだけです。
LockedTableTime/LockedTableUserはサイト設定の JSON には保存されない項目なので、サイト設定の JSON は変わりません。locked・locked-indicatorは新しいクラスなので、既存のテーマのスタイルとはぶつかりません。