1.5.9.0 の変更点
リリース日: 2026年10月13日。1.5.8.1 からの変更です。機能追加・仕様変更と不具合修正を分けて記載します。
機能追加・仕様変更
- 利用者・権限 — ユーザ・組織・グループの管理画面に「権限ビューア」タブを追加。Enterprise Edition ベーシックプラン以上(およびトライアル)限定の機能。
- API・拡張 — API キーごとに、利用を許可する IP アドレス範囲(CIDR 表記・改行区切りで複数指定可)を設定できるようになった。
- 運用・設定 — キューイング機能に一括削除を追加。
- 運用・設定 — キューイング機能で、インポート・エクスポートなどジョブ種別ごとにキュー利用の有効/無効を設定できるようになった。
- API・拡張 — サイトを移動するための専用 API「MoveSite」を追加。
- 画面・表示 — カレンダーの週の開始曜日を設定できるようになった。
- 画面・表示 — 操作中のテーブルにバックグラウンドジョブが予約されている場合、一覧画面や各ダイアログ(エクスポート・インポート・一括削除・一括更新)にメッセージを表示するようになった。
- 画面・表示 — エディタに「変更差分」タブを追加し、旧バージョンと新バージョンを左右に並べて比較できるようになった。
不具合修正
- API・拡張 — サーバスクリプトなどで数値項目に値をセットした際に桁落ちが発生する問題を修正。
- 画面・表示 — 明細画面(MCP ログ・システムログ・組織・グループ・ユーザー)で、再読込後に「戻る」ボタンを押すと一覧へ戻れない問題を修正。
- 画面・表示 — 英語環境などの期間フィルタのダイアログで、「-」区切りで表示される日付範囲の初期値が失われる問題を修正。
- API・拡張 — MCP ログにユーザー ID が記録されない問題を修正。
- 画面・表示 — MCP ログ明細の JSON-RPC エラーコード欄に「?0」と表示される問題を修正。
- 画面・表示 — MCP ログ画面でフィルタ条件がセッションに保存されない問題を修正。
- 画面・表示 — MCP ログ画面の絞り込みで、JSON-RPC エラーコードの「エラーなし(0)」を条件に指定しても絞り込めない問題を修正。
- API・拡張 — Pleasanter MCP 経由のツール呼び出しで特定条件下に「Headers are read-only」例外が発生する問題を修正。
- API・拡張 — Pleasanter MCP の CreateViewJson で、columnFilterHash にスカラー値を指定するとエラーになる問題を修正。
- 画面・表示 — 「選択肢にブランクを挿入しない」がオンの場合、正しく選択・保存できない場合がある問題を修正。
- 利用者・権限 — サイトのドラッグ&ドロップ移動時に移動先フォルダの権限が検証されず、権限のないフォルダへ移動できてしまう問題を修正。
- 画面・表示 — 参照先が未設定のクイックアクセスパーツを含むダッシュボードで、トップ画面のサイト画像アイコンが既定アイコンになる問題を修正。
- 画面・表示 — ナビゲーションメニューの「パスワード変更」でパスワード自動生成が利用できない問題を修正。
- 運用・設定 — 通知の Cc・Bcc に設定した
[RelatedUsers]が展開されない問題を修正。 - 画面・表示 — エディタで「非表示」に設定した項目が一括更新できなくなっていた問題を修正。
- 実行環境・DB — リンク列に bigint の範囲を超える数値文字列が格納されている場合に、一覧取得が失敗する問題を修正(PostgreSQL / MySQL)。
- 実行環境・DB — CodeDefiner 実行時に、Passkeys テーブルが毎回マイグレーション対象と誤検出される問題を修正(PostgreSQL / MySQL)。
- 画面・表示 — リッチテキストエディタで、リスト形式で記述されている文字サイズの変更が保存されない問題を修正。
- 運用・設定 — キューイング機能を使用してインポートを行った際に、通知が送信されない問題を修正。
実装を読む
1.5.8.1 とのソース差分(221 ファイル)を確認しています。ソースの引用は 1.5.9.0 のコミット(1b7b6e6)に固定しています。公式のリリース記録に載っていない変更(フォームの月間受付件数の上限)も、ソースで確認できたものは書いています。
| 分類 | 追加された主なもの | ライセンス・既定値 |
|---|---|---|
| 権限ビューア | HtmlPermissionsViewer、General.json の PermissionsViewer | ライセンスの Plan が 2 以上、または PermissionsViewer オプション(トライアルに含む)。パラメータは既定で true |
| API キーの IP 制限 | Users.ApiAllowIpAddressRange 列、ApiKeyIpRestrictions | 不要。未設定なら制限なし |
| キューイングの拡張 | BulkDeleteJobHandler、BackgroundJobs.json の BulkQueueThreshold / DisabledJobTypes | 必要(Queue)。しきい値の既定は 0、無効化の既定は null |
| MoveSite API | POST /api/items/{id}/MoveSite | API の利用条件と同じ |
| 週の開始曜日 | Tenants.FirstDayOfWeek 列、サイト設定の FirstDayOfWeek、FirstDayOfWeeks | 不要。General.json の既定は 1(月曜) |
| バックグラウンドジョブの予約表示 | HtmlBackgroundJobNotices、ReservedJobTypeLabels | キューイングが有効なとき |
| 変更差分タブ | HistoryDiffUtilities、HtmlHistoryDiff、historydiff.ts | 不要 |
| フォームの月間受付上限 | Form.json の LimitPerMonth、Tenants.FormCount / FormCountDate 列 | 既定は 0(無制限) |
DB には Tenants.FirstDayOfWeek(int、既定 -2)、Tenants.FormCount(int、既定 0)、Tenants.FormCountDate(datetime)、Users.ApiAllowIpAddressRange(nvarchar(max))の 4 列が加わります。CodeDefiner の実行が必要です。
権限ビューア
ユーザ・組織・グループの編集画面に「権限ビューア」タブが加わり、そのユーザ・組織・グループに効いているサイトの権限を、サイトを横断して一覧できます。一覧は CSV に出力できます。
表示できる条件は 2 段階です。
| 条件 | 内容 |
|---|---|
| タブを出す | ユーザの画面は常に出ます。組織はテナント管理者(または EnableManageTenant が有効なユーザ)、グループはグループの編集権限があるユーザだけです(HtmlPermissionsViewer.cs#L85-L97) |
| 中身を出す | General.json の PermissionsViewer が true で、かつライセンスが許可しているとき。許可がなければ案内文を表示します(HtmlPermissionsViewer.cs#L99-L103) |
ライセンスの判定は Parameters.AllowPermissionsViewer() です。トライアルライセンスがあればそれを、なければ商用ライセンスを検証したうえで、Plan が 2 以上か PermissionsViewer オプション(1 << 7)があれば許可します。トライアル用のオプションの組み合わせ(LicenseOptions.Trial)にも PermissionsViewer が加わっています(Parameters.cs#L112-L115、Parameters.cs#L248-L252、LicenseOptions.cs#L16-L24)。
一覧の列は、サイト ID・サイト・継承元・対象(展開表示のときだけ)・権限 9 種類(参照・作成・更新・削除・メール送信・エクスポート・インポート・サイト管理・権限管理)・設定日時です(HtmlPermissionsViewer.cs#L702-L743)。
- 「対象の展開」がオフ(既定)のときは、対象ごとの権限を合算した行が出ます。オンにすると、権限を与えているユーザ・組織・グループごとに行が分かれます(HtmlPermissionsViewer.cs#L967-L975)。
- ユーザの場合は、ユーザ本人・所属する組織・所属するグループ(組織経由のグループ参加を含む)に付いた権限が対象です。組織は、組織自身と組織が参加するグループ、グループは親・子のグループを含みます(HtmlPermissionsViewer.cs#L1371-L1427)。
- 特権ユーザの画面には、「特権ユーザのため、下表の設定に関わらず、すべてのサイトの全権限を持ちます。」という注意が出ます。
- 絞り込みと並べ替えは列ごとのメニューで行い、CSV の文字コードは Shift-JIS(既定)か UTF-8 です。CSV は画面の絞り込み・並べ替えを反映し、全件が対象です(HtmlPermissionsViewer.cs#L217-L265)。
API キーの IP アドレス制限
ユーザの API 設定画面(API キーを作成する画面)に「APIを許可するIPアドレス範囲」のテキストボックスと「更新」ボタンが加わりました。1 行に 1 つ、192.168.0.0/24 のような CIDR か、192.168.0.10 のような単独の IPv4 アドレスを書きます(UserUtilities.cs#L5157-L5180)。
192.168.0.0/24
203.0.113.10- 書式の検査は
UpdateApiAllowIpAddressRangeが行います。/が 2 つ以上、マスクが 1〜32 の整数でない、ドット区切りが 4 つでない、各数値が 0〜255 でない場合は「IPアドレス範囲の書式が正しくありません。(…)」で保存されません。IPv6 の書式は通りません(ApiKeyIpRestrictions.cs#L36-L57、UserUtilities.cs#L5247-L5281)。 - 判定は
ApiKeyIpRestrictions.Allowedです。リクエストに API キーがなければ(ログイン済みセッションからの呼び出しなど)制限しません。API キーがあるときは、そのキーのユーザに設定された範囲に、接続元の IP アドレスが入っているかを調べます。範囲が空なら制限なしです(ApiKeyIpRestrictions.cs#L26-L34、IpAddresses.cs#L12-L21)。 - 範囲外からの呼び出しは HTTP 403 になり、
Messageに「このIPアドレスからのAPIキーの利用は許可されていません。」が返ります。通常の API はCheckApiContextAttributes、Pleasanter MCP はMcpContextMiddlewareで同じ判定をします(CheckApiContextAttributes.cs#L72-L81、McpContextMiddleware.cs#L45-L62)。 - サイトのグローバルな IP 制限(
IpAddresses.AllowedIpAddressの除外メンバー指定)は使わず、API キー単位の範囲だけを渡しています。
キューイングの拡張
キューイング機能(BackgroundJobs.json の BackgroundQueue が true で、Queue オプションのライセンスがあるとき)に、一括削除が加わりました。あわせて、ジョブ種別ごとの無効化と、一括削除をキューに載せる件数のしきい値を指定できます。
{
"BackgroundQueue": true,
"BulkQueueThreshold": 1000,
"DisabledJobTypes": ["Export"]
}| パラメータ | 型・既定値 | 意味 |
|---|---|---|
BulkQueueThreshold | 数値・0 | 一括削除をキューへ載せる対象件数のしきい値。0 なら常にキューへ載せる。1 以上なら、対象がその件数以上のときだけ載せ、未満は従来どおり即時に削除する |
DisabledJobTypes | 文字列の配列・null | キューを使わないジョブ種別。Export・Import・BulkDelete・AiConnect を指定できる |
図を読み込み中…
- 一括削除のキュー対象は、レコードを持つ
Issues(課題管理)とResults(記録テーブル)のサイトだけです。Wiki などは常にその場で削除されます(BackgroundJobQueue.cs#L701-L729)。 - キューへ載せる前に、削除権限・対象の選択・ロックされたレコードの有無を検査し、問題があればジョブを作らずエラーを返します(
ValidateBeforeEnqueueBulkDelete)。成功すると「バックグラウンドジョブ」へのリンク付きのメッセージを表示します(ItemsController.cs#L957-L989)。 - ジョブは
BulkDeleteJobHandlerが処理し、画面から実行したときと同じBulkDeleteCoreを、登録時のフォーム値・セッション値・タイムゾーン・言語を引き継いだコンテキストで実行します。完了メッセージは「一括削除が完了しました。N 件削除しました。」の形式です(BulkDeleteJobHandler.cs#L14-L51、BackgroundJobDispatcher.cs#L49-L51)。 BulkQueueThresholdは一括削除だけに使われ、エクスポートとインポートには影響しません。DisabledJobTypesの判定はShouldQueueに集約されました。エクスポート・インポート・一括削除は同じ関数を通り、AI 連携はAiConnectQueueUtilities.ShouldQueueがAiConnectを調べます。指定した種別は、キューが有効でも従来どおりその場で実行します(BackgroundJobQueue.cs#L574-L587、AiConnectQueueUtilities.cs#L14-L21)。名前は完全一致で比較されるので、大文字・小文字をそろえて書いてください。- バックグラウンドジョブの一覧の絞り込みにも「一括削除」の種別が加わりました。
予約中のジョブを知らせる表示
テーブルにまだ終わっていないジョブがあると、画面に注意が出ます。対象は、状態が Preparing・Pending・Running・RunningOverdue のジョブで、AI 連携のジョブは数えません。ジョブ種別の一覧は 1 リクエストにつき 1 回だけ DB から取得して使い回します(BackgroundJobQueue.cs#L2280-L2309)。
| 場所 | 表示 |
|---|---|
| 一覧・カレンダー・クロス集計・ガント・バーンダウン・時系列・分析・カンバン・画像ライブラリ | 「バックグラウンドジョブが予約されています:エクスポート, インポート」のようなバーを画面上部に出す(Issues と Results のサイトだけ。HtmlTemplates.cs#L505-L537) |
| エクスポート・インポート・一括更新のダイアログ | 「バックグラウンドジョブが予約されています。」 |
| 一括削除の確認 | 確認文を「バックグラウンドジョブが予約されています。本当に削除してもよろしいですか?」に差し替える(HtmlCommands.cs#L374-L383) |
サイトを移動する MoveSite API
サイトを別のサイト(フォルダ)の下へ移動する API POST /api/items/{サイトID}/MoveSite が加わりました。画面のドラッグ&ドロップによる移動と同じ処理(MoveSiteMenu)を呼びます(ItemsController.cs#L367-L386、SiteUtilities.cs#L4015-L4120)。
{
"ApiVersion": 1.1,
"ApiKey": "(APIキー)",
"ParentId": 12345
}ParentId に移動先のサイト ID を指定します。次の順に検査し、通らなければエラーを返します。
- ボディが JSON として読めない、またはコンテントタイプが不正 → 400(BadRequest)。
- 移動するサイトが存在しない。サイトに対する通常の API 検証(
OnEntry)を通らない。 ParentIdが無い → 400。- サイトごとの API 上限(
WithinApiLimits)を超えている。 - 移動先が存在しない。移動先がフォルダ(
Sites)でない → 実行不可。 - 移動先が自分自身、または自分の子孫 → 実行不可(
CircularMoveDestination。画面の移動にも同じ検査が加わりました)。 - 移動元の親・移動するサイト・移動先のサイト管理権限(
OnMoving)。ParentIdを0にするとトップへの移動で、ユーザの「トップに作成できる」設定が必要です。
成功すると、移動したサイトの ID と「移動しました」のメッセージが返ります。
対象はサイトだけです
レコードを別のテーブルへ移動する API は 1.5.9.0 にもありません。設計案はレコードの移動を API・サーバースクリプトから行うにあります。
週の開始曜日
カレンダーの曜日の並びと、日付入力のカレンダー(日付ピッカー)が使う週の開始曜日を、テナントとサイトで設定できるようになりました。
| 設定場所 | 項目 | 値 |
|---|---|---|
| テナントの管理 | 週の開始曜日(Tenants.FirstDayOfWeek) | 空欄(継承)、自動、日〜土 |
| テーブルの管理(レコードを持つテーブル) | 週の開始曜日(サイト設定の FirstDayOfWeek) | 空欄(継承)、自動、日〜土 |
値は内部で -2(継承)・-1(自動)・0〜6(日曜〜土曜)として扱います。実際の曜日は FirstDayOfWeeks.Resolve が、General.json の FirstDayOfWeek(既定 1=月曜)→ テナント → サイトの順に、継承でない値で上書きして決めます。最後まで継承か自動なら、表示言語のカルチャの週の開始曜日になります(FirstDayOfWeeks.cs#L11-L35)。
- サイト設定の
FirstDayOfWeekは、1.5.8.1 まで空のときGeneral.jsonの値で補完されていました。1.5.9.0 では補完をやめ、既定で「継承」になります。継承以外の値だけがサイト設定に保存されます(SiteSettings.cs#L869-L872)。 - 標準カレンダーは、曜日見出しと土日の CSS クラスを解決した開始曜日で出し、月表示・週表示の開始日もこの値で決めます(HtmlCalendar.cs#L476-L505、Calendars.cs)。週の先頭を求める
WeekFromは、開始曜日を引数で受け取れるようになりました(DateTimes.cs#L55-L68)。 - 日付ピッカー(flatpickr)は、1.5.8.1 まで週の開始を月曜に固定していました。1.5.9.0 では、日付項目の
data-firstdayofweek属性かページ全体の値を使います。あわせて、日本語以外の表示言語(ドイツ語・韓国語・スペイン語・中国語(簡体・繁体)・ベトナム語)の日付ピッカーにもロケールが適用されます(datefield.ts#L51-L58)。
General.json を変更して開始曜日を調整していた環境は、そのまま動きます。サイト単位・テナント単位で変えたいときだけ、画面から設定します。
変更差分タブ
レコード(課題管理・記録テーブル)と Wiki、ユーザ・組織・グループの編集画面に「変更差分」タブが加わりました。変更履歴のあるデータについて、旧バージョンと新バージョンを左右に並べて比べます。新規作成の画面と公開ページには出ません。
- 画面を開いたバージョンを基準にします。基準より古いバージョンがあれば、基準を新バージョン、その直前のバージョンを旧バージョンとして初期選択し、基準が最古なら、基準の次に新しいバージョンを新バージョン、基準を旧バージョンにします。履歴が 1 つしかなければ「比較できる前のバージョンがありません。」と出ます。旧バージョンが新バージョン以上のときは「新バージョンには旧バージョンより新しいバージョンを指定してください。」が出ます(HistoryDiffUtilities.cs#L17-L96)。
- 比べる項目は、エディタに並ぶ項目をタブ(全般タブとサイト設定のタブ)ごとにまとめたものです。権限のない項目と、バージョン・更新者・更新日時・パスワード系の項目は含みません。添付ファイルはライセンスで添付ファイルが使えるときだけ比べます(HistoryDiffUtilities.cs#L162-L206、HtmlHistoryDiff.cs#L148-L156)。
- 値は画面表示用の文字列で比べます。HTML や Markdown の項目は、レンダリング後の見た目で比べるか、書かれたソースのままで比べるかを項目ごとに切り替えられます。「差異ある項目(N 件)のみ表示」で変更のあった項目だけに絞り込め、項目ごとに「開いたままにする」のボタンもあります。
- 要求は
HistoryDiffアクション(POST /items/{id}/HistoryDiff、ユーザ・組織・グループは各コントローラー)で、タブを開いたときに取得します(ItemModel.cs#L3056-L3082)。参照権限がなければ権限エラーです。
フォームの月間受付件数の上限
公式のリリース記録にはありませんが、フォーム機能(Form.json の Enabled)に、テナントごとの月間受付件数の上限が入っています。
- 上限は
Form.jsonのLimitPerMonth(既定0=無制限)です。契約設定(ContractSettingsのFormLimitPerMonth)があればそちらが優先されます(ContractSettings.cs#L147-L152)。 - フォームの表示時と登録時に、当月の登録数が上限に達していないかを調べます。達していると「このフォームは受付件数の上限に達したため、現在受け付けていません。」を表示し、登録を受け付けません(FormsController.cs#L67-L76)。
- 登録に成功するたびに
Tenants.FormCountを 1 増やします。月が替わると(ユーザのタイムゾーンでの月初)、FormCountDateを更新して 1 から数え直します。数え直したときと、加算に 3 回失敗したときはシステムログに記録します(SiteModel.cs#L10140-L10222)。
修正の詳細
- 数値項目の桁落ち — サーバスクリプトの実行エンジン(ClearScript の
V8ScriptEngine)をDisableFloatNarrowing = trueで作るようになりました。これは ClearScript の浮動小数点の縮小変換(floatへの変換)を無効にする設定です(ScriptEngine.cs#L28-L32)。 - 「戻る」ボタン — 新規・編集画面の戻り先に、直前のページ(Referer)が今開いているページ自身と同じ場合は使わず、一覧へ戻るようにしました。再読込すると Referer が自分自身になるためです(HtmlBack.cs#L62-L70、HtmlBack.cs#L190-L203)。
- 期間フィルタの初期値 — 値を
-で分割していたため、日付自体に-を含む書式(2026-01-01 - 2026-01-31など)では初期値が崩れていました。区切りを前後に空白を含む-に変え、2 つまでに分割します(HtmlDateRange.cs#L16-L30)。 - MCP ログ — API キーで呼ばれたとき、
McpApiKeyUserResolverでキーからユーザとテナントを引いてログに書くようになりました(McpContextMiddleware.cs#L205-L220)。JSON-RPC エラーコードの選択肢に0 : No Errorが加わり、「?0」の表示と「エラーなし」での絞り込みが効きます。McpLogParamは、エラーコードが既定の列から漏れるときに補います。 - MCP の columnFilterHash —
ColumnFilterHashJsonConverterが、値が文字列 1 つのときも文字列の配列として受け取ります。数値・真偽値・null は指定できません(ツールの説明文にもそう書かれました)。Startupでツール登録時に JSON スキーマも補正します(ColumnFilterHashJsonConverter.cs)。あわせて、MCP のツール呼び出しで作るコンテキストはセッションの読み込みをしないよう(sessionStatus: false、sessionData: false)に変わり、Contextはレスポンスの送信が始まっていれば(HasStarted)セッション Cookie を書き込まないようになりました。 - ブランクを挿入しない選択肢 — 連動する選択肢の再取得(
DropDowns)で、複数選択でないときだけ空欄を挿入します。エディタでは、保存済みで値が空の項目に選択肢があるときは空欄を出し、「選択肢にブランクを挿入しない」の項目にはdata-without-blank属性を付けます(DropDowns.cs#L438)。 - サイトの移動先の権限 —
SiteValidators.OnMovingの 3 か所の管理権限の確認がsite: true付きになりました。レコードのアクセス制御ではなく、サイト自体への権限で判定します(SiteValidators.cs#L332-L342)。 - クイックアクセスパーツ — 参照先のサイトが未設定(
SiteIdが 0)でもサイト設定を引かず、ssをnullで扱います(DashboardPart.cs#L89-L93)。 - パスワードの自動生成 — 自動生成ボタンの押下を
documentへの委譲に変え、ボタンを付けるsetGeneratePasswordButtonを画面の応答からも呼べるようにしました。ナビゲーションメニューの「パスワード変更」の応答は、この関数を呼び出します(generatepassword.js)。 - 通知の
[RelatedUsers]— 通知の宛先(Address)だけでなく、CcAddress・BccAddressに含まれる[RelatedUsers]も、関連するユーザのメールアドレスに置き換えます(Notification.cs#L417-L424)。 - 非表示項目の一括更新 — 一括更新のフィールドを組み立てるとき(
ignoreHide: bulkUpdate)、項目の「非表示」の設定を無視して描画します。あわせて、一括更新の選択肢(GetAllowBulkUpdateOptions)を、一括更新を許可された項目と、それを含む「項目のまとまり」に絞り込みます(SiteSettings.cs#L2754-L2770)。 - リンク列の bigint — 文字列の列を bigint に変換する SQL(
CreateTryCast)が、先頭の 0 を除いて 19 桁以内で、かつlong.MaxValue以下の値だけを変換し、それ以外はnullにします。PostgreSQL と MySQL の実装を直しました(PostgreSqlCommandText.cs)。 - Passkeys の再検出 — CodeDefiner が列の型を比べるとき、定義側の型(
char/varcharかnchar/nvarcharか)を見るようになり、PostgreSQL・MySQL で毎回差分と判定されなくなります。MySQL ではchar/varcharの列サイズも定義と照合するようになりました(Columns.cs)。 - キュー経由のインポートの通知 — インポートのジョブに、登録時の
AbsoluteUri・AbsolutePath・ApplicationPathを引き継ぎ、サイトの URL を作るItemIndexAbsoluteUri(通知の本文に使う関数)が、値が欠けているときは相対パスを返すようにしました(ImportJobHandler.cs#L202-L230、Locations.cs#L202-L217)。エクスポートとインポートのジョブにも、登録時のタイムゾーンを引き継ぐようになりました。
リッチテキストエディタの文字サイズ、MCP ログのフィルタ条件のセッション保存、「Headers are read-only」の細かい発生条件は、この差分から原因の処理を特定できていないため、公式のリリース記録の記述にとどめています。