$p.send
概要¶
指定したIDのHTMLタグの入力内容をサーバにAjax通信で送信し、取得したレスポンスを元に該当IDの画面項目を再描画します。
構文¶
JavaScript¶
各パラメータの説明¶
| パラメータ名 | 説明 |
|---|---|
| 対象HTMLタグのID | HTMLタグのid名を指定します |
使用例¶
下記スクリプトを画面の初期表示時に読み込むと、一覧画面が2秒毎に再描画されるようになります。
JavaScript¶
サンプルコード¶
1. 開いたままの一覧を一定間隔で描き直し、新着の件数を知らせる
問い合わせの受付ボードなど、開いたままにしておく一覧を、一定間隔で$p.send($('#Grid'))により描き直します。前回の表示に無かったレコードの件数を、一覧の上の表示欄と、ブラウザのタブのタイトルの先頭(「(2) 」など)で知らせます。タブが裏にあるときと、ダイアログを開いているときは描き直しません。表示欄のボタンで自動更新を止められ、その状態はブラウザに保存されます。
実務での使いどころ¶
問い合わせ・障害の受付ボードを共有のモニターや担当者の画面に開いたままにして、新しい受付に気づきたい場面に使えます。一覧の再読み込みは手動で、自動で更新する設定はありません。通知の機能でメールやチャットに知らせることはできますが、開いている画面を最新に保ち、何件増えたかをその場で見せることはできません。更新の間隔と対象のビューを変えれば、作業指示のボードや設備の予約状況にも使えます。
事前準備¶
1:「問い合わせ受付」テーブルに、「未完了」などに絞ったビューを作成してください(件数の多い一覧は対象外です)。
2:スクリプトを登録します。
2-1:「テーブルの管理 > スクリプト」タブで「新規作成」を選択する。
2-2:タイトル: 任意の名前(例:autoRefreshGrid)
2-3:スクリプト: 下記サンプルコードを貼り付け
2-4:出力先:「すべて」のチェックを外し、「一覧」にチェック
JavaScript¶
/**
* ================================================================
* サンプル 開いたままの一覧を一定間隔で描き直し、新着の件数を知らせる
* ================================================================
*
* 【概要】
* 問い合わせの受付ボードなど、開いたままにしておく一覧を、一定間隔で
* $p.send($('#Grid')) により描き直します。前回の表示に無かったレコードの件数を、
* 一覧の上の表示欄と、ブラウザのタブのタイトルの先頭(「(2) 」など)で知らせます。
* タブが裏にあるときと、ダイアログを開いているときは描き直しません。
* 表示欄のボタンで自動更新を止められ、その状態はブラウザに保存します。
*
* 【使い方】
* 出力先:一覧
* 件数の多い一覧ではなく、「未完了」などに絞ったビューで使ってください。
* ================================================================
*/
// 描き直す間隔(秒)
const REFRESH_SECONDS = 60;
// 自動更新のオン・オフを保存するキー(テーブルごと)
const STORAGE_KEY = `autoRefreshGrid_${$p.siteId()}`;
const BASE_TITLE = document.title;
let knownIds = null; // 前回表示していたレコードのID
let newCount = 0; // 表示欄をクリックしてからの新着の件数
let lastUpdated = new Date();
let timerStarted = false;
function gridIds() {
return $('#Grid tbody tr[data-id]').map(function () {
return $(this).attr('data-id');
}).get();
}
// 自動更新のオン・オフ(ブラウザに保存できないときはオンとして扱う)
function isEnabled() {
try {
return localStorage.getItem(STORAGE_KEY) !== 'off';
} catch (e) {
return true;
}
}
function setEnabled(enabled) {
try {
localStorage.setItem(STORAGE_KEY, enabled ? 'on' : 'off');
} catch (e) {
// 保存できなくても、画面の動きには関係しない
}
}
function isPaused() {
return document.hidden || $('.ui-dialog:visible').length > 0;
}
// 一覧の上の表示欄と、タブのタイトルを描き直す
function render() {
let $bar = $('#AutoRefreshBar');
if ($bar.length === 0) {
$bar = $('<div id="AutoRefreshBar" style="margin:4px 0;padding:6px 10px;border:1px solid #c8d8ee;background:#eef4fb;cursor:pointer;"></div>')
.on('click', function () {
newCount = 0;
render();
});
$('#Grid').before($bar);
}
const state = !isEnabled() ? '自動更新:オフ' : isPaused() ? '自動更新:停止中' : `自動更新:${REFRESH_SECONDS}秒ごと`;
const news = newCount > 0 ? `新着${newCount}件(クリックで消す) ` : '';
$bar.text(`${news}最終更新 ${lastUpdated.toTimeString().slice(0, 8)} ${state} `);
$('<button type="button" class="button ui-button ui-corner-all ui-widget"></button>')
.text(isEnabled() ? '止める' : '再開する')
.on('click', function (e) {
e.stopPropagation();
setEnabled(!isEnabled());
render();
})
.appendTo($bar);
document.title = newCount > 0 ? `(${newCount}) ${BASE_TITLE}` : BASE_TITLE;
}
function refresh() {
if (!isEnabled() || isPaused()) {
render();
return;
}
$p.send($('#Grid'));
}
// 一覧を初めて表示したとき($p.send で描き直したときは呼ばれない)
$p.events.on_grid_load = function () {
knownIds = gridIds();
lastUpdated = new Date();
render();
if (!timerStarted) {
timerStarted = true;
setInterval(refresh, REFRESH_SECONDS * 1000);
// タブが表に戻ったら、すぐ1回描き直す
document.addEventListener('visibilitychange', function () {
if (!document.hidden) {
refresh();
}
});
}
};
// $p.send で一覧を描き直し終えたとき
$p.events.after_set_GridRows = function () {
const ids = gridIds();
if (knownIds !== null) {
newCount += ids.filter((id) => !knownIds.includes(id)).length;
}
knownIds = ids;
lastUpdated = new Date();
render();
};
注記¶
$p.send($('#Grid'))で一覧を描き直しても、$p.events.on_grid_loadは呼ばれません。描き直し終えたことは、$p.events.after_set_GridRowsで受け取ります。- 描き直すたびに、メッセージ欄(
#Message)の表示は消えます。このサンプルでは、新着を独自の表示欄に出しています。 - 新着は、前回の表示に無かったレコードの件数です。フィルタを外して表示が増えたときも、新着として数えます。
- 描き直しても、フィルタの条件と一覧のチェックは保たれます。
- 開いたままにすると定期的に通信するため、ログインのセッションが切れにくくなります。共有のモニターで使うときは、運用に合わせて間隔(
REFRESH_SECONDS)を決めてください。
