コンテンツにスキップ

$p.send

概要

指定したIDのHTMLタグの入力内容をサーバにAjax通信で送信し、取得したレスポンスを元に該当IDの画面項目を再描画します。

構文

JavaScript
$p.send(<対象HTMLタグのID>)

各パラメータの説明

パラメータ名 説明
対象HTMLタグのID HTMLタグのid名を指定します

使用例

下記スクリプトを画面の初期表示時に読み込むと、一覧画面が2秒毎に再描画されるようになります。

JavaScript
setInterval(function() {
  $p.send($('#Grid'));
}, 2000);

サンプルコード

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)を決めてください。