3
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

kintoneの詳細画面にkintoneライクなUIを使った印刷ボタンを置いてみた

Last updated at Posted at 2018-10-05

まだまだ「最後は紙に印刷(あるいはPDFに)したい」という要望を無視できないので、標準のkintoneの詳細画面から何故か隠されている印刷メニューを、kintoneライクなUIを使える「kintone UI Component」を使って主役に抜擢してみるサンプルです。

画面イメージ

スクリーンショット 2018-10-06 4.52.59.png

サンプルコード


(function() {
    'use strict';
    kintone.events.on('app.record.detail.show', function(event) {
        new kintone.Promise(function(resolve, reject) {
            let button = new kintoneUIComponent.Button({text: '印刷'});
            let elPrintButton = kintone.app.record.getSpaceElement('printButton');
            elPrintButton.appendChild(button.render());
            resolve(button);
            return;
        })
        .then(function (UiButton) {
            let url = kintone.api.url('/k/v1/records', true);
            let reg = /http(s)?:\/\/([\w-]+\.)+([\w-]+)+\/([\w-]+)\/([\w-]+)\/([\d]+)/;
            console.log(url.match(reg));
            if (url.search('guest') !== -1) {
                console.log(url.match(reg));
            } else {
                reg = /http(s)?:\/\/([\w-]+\.)+([\w-]+)+\/([\w-]+)/;
                console.log(url.match(reg));
            }
            let appId = kintone.app.getId();
            console.log(appId);
            let body = {'id': appId};
            kintone.api(kintone.api.url('/k/v1/app', true), 'GET', body, function(resp) {
                // success
                console.log(resp);
                let printURL = url.match(reg)[0] + '/' + resp.appId + '/print?record=' + event.recordId;
                console.log(printURL);
                UiButton.on('click', function(event) {
                    window.open(printURL, null);
                });
            });
        });
    });
})();

#サンプルアプリの準備

お気に入りのアプリをアプリストアからインストールします。今回は交通費申請アプリを使っています。(アイコンが可愛いので結構お気に入り♪)

###フォームにスペースを追加
どこでも良いのですが、スペースを追加します。
サンプルコードの通りに使う場合は、フィールドコードを printButton とします。
スクリーンショット 2018-10-06 5.14.07.png

###JavaScriptファイルとCSSファイルをアップロード
スクリーンショット 2018-10-06 5.17.39.png
サンプルコードと「kintone UI Component」をアップロードして保存します。

#サンプルコードの説明
処理の流れは次の通り

1.印刷ボタンを設置
2.印刷ページのURLを生成

###何やってるか?
let button = new kintoneUIComponent.Button({text: '印刷'});
「kintone UI Component」でボタンを生成

elPrintButton.appendChild(button.render());
JavaScript(以下JS)でボタンの要素をスペースフィールドに追加

resolve(button);
成功時のPromiseコールバック変数にボタンオブジェクトをセットして、印刷用のURL生成コードに渡します。

let url = kintone.api.url('/k/v1/records', true);
kintone JavaScript API(以下KJS)でURLを取得します

let reg = /http(s)?:\/\/([\w-]+\.)+([\w-]+)+\/([\w-]+)/
JSでURLを切り出す為に正規表現を設定します。URLがおかしい場合はこちらのコードを修正してみてください。正規表現のデバックにはRubularが便利です。


UiButton.on('click', function(event) {
    window.open(printURL, null);
});

ボタンオブジェクトのclickイベントのコールバック関数に生成した印刷画面遷移用のURLを仕込んでおきます。コールバックに仕込んでおくことで、印刷ボタンが押された時のclickイベントで処理が発火します。

※サンプルコードには動作確認の為、デバッグコードを残してあります。

#注意点

  • 「kintone UI Component」を利用する前提なので、GitHubからJSとCSSをダウンロードして、そのファイルをアップロードしてください。
  • kintoneのJavaScriptイベントapp.record.detail.showではeventをreturnしないでください。理由はこちらをご覧ください。

#必要スキル

ヘッダーメニューにボタンを置く場合

下記のコードに差し替えてください。

        new kintone.Promise(function(resolve, reject) {
            let button = new kintoneUIComponent.Button({text: '印刷'});
            kintone.app.record.getHeaderMenuSpaceElement().appendChild(button.render());
            resolve(button);
            return;
        })
3
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?