Skip to content

サイトメニューにテーブルのロック状態を出す(本体改修) ​

第1版作成 最終更新 (日本時間)
確認バージョン1.5.8.1

テーブルのロック中かどうかは、テーブルを開かないと分かりません。サイトメニューのパネルでロック中のテーブルを見分けられるようにする本体改修の設計メモです。本体の標準機能ではありません。

本体を改修せず、拡張 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() でロック情報を取る ​

csharp
column: Rds.SitesColumn()
    .SiteId()
    .Title()
    .ReferenceType()
    .SiteSettings()
    .LockedTime()   // 追加
    .LockedUser(),  // 追加

SiteModel にはすでに LockedTime / LockedUser があるので、列を足せば値が入ります。どちらも Sites の列なので JOIN は増えません。

2. 呼び出し元で判定して渡す ​

csharp
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 を足す ​

csharp
.Class(Css.Class("nav-site " + referenceType.ToLower()
        + (hasImage ? " has-image" : string.Empty)
        + (locked ? " locked" : string.Empty),
    toParent ? " to-parent" : string.Empty))
csharp
// 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 に足します。

scss
.nav-site {
    &.locked {
        position: relative;
        opacity: 0.7;
        .locked-indicator {
            position: absolute;
            top: 8px;
            right: 8px;
            font-size: 18px;
            color: var(--warning-color, #e67e22);
        }
    }
}

出力の比較 ​

html
<!-- 通常 -->
<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.csMenu() の取得列、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 は新しいクラスなので、既存のテーマのスタイルとはぶつかりません。

関連ページ ​

変更履歴

第1版リンク項目の列指定と JOIN の組み立て、一覧のスクロール読み込みの解説と、一覧・カレンダー・サイトメニューまわりの改修・設計メモを追加