v1.1.8
- 提供日: 2026-08-17
- 前回の提供版: v1.0.29
前回の提供版 v1.0.29 からの更新です。
書き換えが必要になるのは次の3件です。
| 変更 | 影響を受けるコード | 対応 |
|---|---|---|
| 利用者選択・組織選択の値形式 | .value[0].id / .value[0].view_label などを参照している | 取得は code / name、設定は code だけへ書き換え |
| イベントからのフィールド定義の提供終了 | event.fields / event.changes.field を参照している | フィールド情報取得 API へ置き換え |
イベントハンドラー内の record.set() の禁止 | ハンドラーの中で app.record.set() を呼んでいる | event.record を書き換えて return |
このほか、change イベントの発火対象が広がったため、対象を絞っていないハンドラーは実行回数が増えます。動作をご確認ください。
ハイライト
- 明細(SubTable)を JavaScript から読み書き — 行の追加・削除・並び替えに対応
- 連携フィールド(RelationSelect)の取得・更新 — キーや表示名を設定するだけで連携先を解決
- 利用者選択・組織選択を管理コードだけで設定可能に(⚠️ 破壊的変更)
- フィールド情報取得 API を新設 — フォームのフィールド定義を取得
- フィールドスタイル API を新設 — 値を変えずに見た目だけを変更
record.set()がPromiseを返すように — 名前解決の完了を待てます- イベントハンドラー内の
record.set()を禁止(⚠️ 破壊的変更) - イベントからのフィールド定義の提供終了(⚠️ 破壊的変更)
追加
明細(SubTable)の取得・更新
明細を JavaScript から読み書きできるようになりました。値は 明細フィールド → 行 → 列 の3階層です。
atPocket.events.on('app.record.edit.show', (event) => {
const subtable = event.record['field-6'];
subtable.value[0].value['field-6_1'].value = '商品A(改)'; // 列の更新
subtable.value.push({ value: { 'field-6_1': { value: '商品C' } } }); // 行の追加
return event;
});
- 行の追加・コピー・削除・並び替えに対応します。並び替えは取得した行オブジェクトをそのまま入れ替えてください
- セルの編集が
changeイベントで通知されます。changes.nameに列のUID、changes.rowに対象行が入ります - 行操作も
changeで通知されます。行操作かどうかはchanges.mutationの有無で判別します - セル1つ、または列の全行を対象に、編集可否と表示/非表示を切り替えられます(
setFieldDisabled/setFieldShown) - セルにスタイルを適用できます(
setFieldStyle)
set()は行の全体置換です。指定しなかった既存行は削除されるため、残したい行はすべて配列に含めてください- 行操作を行うと、編集可否・表示切替・スタイルは解除されます。行操作の
changeで再適用してください
連携フィールド(RelationSelect)の取得・更新
連携フィールドを公開型 RelationSelect として取得・更新できるようになりました。通常配置と明細の列の両方に対応します。
atPocket.events.on('app.record.edit.show', (event) => {
event.record['field-3'].labelValue = 'ABC株式会社'; // 表示名で解決
// event.record['field-3'].value.value = '2'; // キーで解決(確実)
return event;
});
- キー(
value.value)または表示名(labelValue)を設定するだけで連携先が解決され、コピー先まで反映されます。解決を指示する専用のフラグは不要です - 参照後に自由入力できる非同期タイプにも対応しました。入力値は
value.viewTextで読み書きします。連携先のキーと表示テキストを1回のset()で同時に指定できます - 明細の連携列も表示名だけで新規行を追加でき、複数行をまとめても連携列ごとに1リクエストで解決します
- 選択の解除は
value.value = ''またはlookup = 'CLEAR'です lookupに'SEARCH'/'NONE'を指定すると、labelValueによる連携先の検索を明示的に指示できます
レコード詳細画面では連携先の解決を行いません。labelValue は表示テキストの上書きとして扱われます。
参照データ取得失敗イベント(app.record.lookup.error)
連携先の解決に失敗すると発火します。発火はフィールド1つにつき1回で、明細は何行失敗しても1回にまとまり、行×列の失敗が errors に入ります。
atPocket.events.on('app.record.lookup.error', (event) => {
const lines = event.errors.map((e) =>
e.row ? `${e.row.index + 1}行目: ${e.message}` : e.message);
alert(lines.join('\n'));
return false; // 既定のインラインエラー表示を抑止する
});
該当なし(NOT_FOUND)・同名複数一致(AMBIGUOUS)では連携値をクリアし、通信失敗(API_FAILED)では入力値を維持します。
フィールド情報取得 API
フォームのフィールド定義を、フィールドUIDをキーにしたマップで取得できるようになりました。
const def = atPocket.app.fields.get('field-2'); // 同期・レコード画面
const map = await atPocket.app.getFormFields(appId); // 非同期・一覧やポータルでも利用可
app.fields.get() には明細の列UIDも指定できるため、change イベントの changes.name から列の定義を直接引けます。
→ フィールド定義を取得(同期) / フィールド定義を取得(非同期)
フィールドスタイル API
値を書き換えずに背景色・文字色などの見た目だけを変更できる setFieldStyle / getFieldStyle を新設しました。明細のセルにも適用できます。
await atPocket.app.record.setFieldStyle('field-2', {
content: { backgroundColor: '#fff3cd', fontWeight: 'bold' },
});
await atPocket.app.record.setFieldStyle('field-2', 'DEFAULT'); // 解除
record.set() による change イベントの発火
set() の第2引数に { fireChange: true } を指定すると、値の反映後に change イベントが発火します(既定では発火しません)。change イベントの changes.origin で、発火元が利用者の操作('user')か set()('set')かを判別できます。
その他の追加
.showイベントのevent.triggerで、初期表示('init')と再読込('reload')を判別できます- 参照レコード(RelationRecords)を編集不可にできるようになりました
- レコード一覧のソート・ページ遷移・フィルタ変更時に発火する
app.record.index.leaveを利用できます
改善
- 同じイベントに複数のハンドラーを登録でき、登録順にすべて実行されます。複数のカスタマイズ JS / プラグインが共存できます
off()にハンドラー関数を渡して個別に解除できます。1つのハンドラーでエラーが発生しても、他のハンドラーと保存処理は継続します(保存を中止する場合はfalseを返してください)- イベントハンドラーが配信ファイル単位で分離され、画面を離れると自動で解放されます。
events.off()の対象も自身の登録分だけです - HTTP 通信に既定のタイムアウト(30秒)を設定しました
変更
利用者選択・組織選択の値形式 ⚠️
値の形式を [{ code, name }](code は管理コード、name は表示名)に統一しました。単一選択の場合も配列です。
// get: [{ code: 'user01', name: '山田 太郎' }]
const record = atPocket.app.record.get();
record['field-4'].value = [{ code: 'user01' }, { code: 'user02' }]; // 管理コードだけで設定
// record['field-4'].value = []; // クリア
await atPocket.app.record.set(record);
- 設定は
codeだけで行えます。nameは設定時に無視され、解決結果の名称が使われます - 選択が変わっていない場合、解決のための通信は発生しません
- 管理コードを解決できない場合、元の選択を維持します(複数選択では成功した要素だけが選択されます)。解決の失敗を検知する手段はありませんので、設定する管理コードは事前にご確認ください
レコード画面の app.record.get() が返す値が変わりました。旧形式の id / view_label などを参照しているコードは code / name へ書き換えてください。一覧の編集ビューで取得した値はこの形式になりません。
イベントハンドラー内での record.set() の禁止 ⚠️
ハンドラーの中から app.record.set() を呼び出すと例外を送出します。値を変更するには event.record を書き換えて return してください。
// ✗ ハンドラー内では実行できません
atPocket.events.on('app.record.edit.change', async (event) => {
await atPocket.app.record.set({ 'field-3': { value: '計算結果' } });
});
// ○ イベントオブジェクトを書き換えて return する
atPocket.events.on('app.record.edit.change', (event) => {
event.record['field-3'].value = '計算結果';
return event;
});
ボタンの onclick など、ハンドラーの外から呼ぶ set() は従来どおり利用できます。
record.set() の反映タイミング
app.record.set() が Promise を返すようになりました。代入は同期で、名前解決を伴うときだけ非同期です。
| 同期(即時反映) | 非同期(解決まで旧値) |
|---|---|
| 通常フィールドの値、明細の行構造 | 連携フィールドのキー変更・表示名検索 |
| 利用者選択・組織選択のクリア | 利用者選択・組織選択の管理コード指定 |
覚えるルールは「名前解決をさせたなら await」の1つです。解決結果を参照しない既存のコードは、await を付けていなくてもそのまま動作します。
カスタマイズ JS / プラグインの実行プラン
カスタマイズ JS / プラグインの実行はプロフェッショナルプラン限定になりました。他のプランでは読み込まれません。
修正
- 単一選択・ラジオボタン・チェックボックスの値を数値で指定しても保存できるようになりました(
app.record.get()が返す値は従来どおり文字列です) - これまで
changeイベントが発火しなかったフィールドでも発火するようになりました。通常配置の利用者選択・組織選択(モバイル画面を含む)、モバイル画面の日付期間・日時期間・時刻期間、および明細の各列が対象です - イベントハンドラーで変更した値が、画面や保存内容へ正しく反映されないことがある問題を修正しました
- 連携フィールド、利用者選択・組織選択、明細を続けて変更した場合に、後から指定した内容が正しく反映されないことがある問題を修正しました
- レコード詳細画面でもスタイルの適用と明細セル要素の取得ができるようになり、連携列の操作でエラーにならなくなりました
atPocket.api()の呼び出しにログイン利用者の情報が送られない問題を修正しました
廃止
イベントからのフィールド定義 ⚠️
レコード画面の .show / delete.submit の event.fields と、change の event.changes.field は削除しました。フィールド情報取得 API をご利用ください。
// ✗ 提供終了
atPocket.events.on('app.record.edit.change', (event) => {
console.log(event.changes.field.label);
return event;
});
// ○ 変更されたフィールドのUIDから定義を引く
atPocket.events.on('app.record.edit.change', (event) => {
console.log(atPocket.app.fields.get(event.changes.name).label);
return event;
});
一覧画面の app.record.index.show の fields(一覧ビューの列定義)は対象外で、従来どおり渡されます。
既知の制約
- 同じ明細への連続した
set()(awaitなし)は、後のset()が先行の解決を打ち切ります。キーの代入は失われませんが、表示名・コピー先の反映は破棄され、再解決されません Promise.all([set(a), set(b)])のような並行呼び出しでは、一部のchangeが発火しないことがあります。同じフォームへのset()はawaitで1つずつ呼び出してください- 明細には既定のインラインエラー表示が無いため、参照データ取得失敗イベントで
falseを返しても何も起きません。明細セルの解決に失敗しても登録はブロックされません - 利用者選択・組織選択の管理コードの解決に失敗しても、それを検知する手段はありません
- 一覧の編集ビューで取得した利用者選択・組織選択の値は
[{ code, name }]形式になりません - 配信されるビルドでは
console出力が除去されます。失敗の検知は例外の捕捉やイベントで行ってください