TypeScript自習 3日目「タスクの列挙」
リファクタリングの前にコードが何をやっているかをタスクとして列挙する。また、コードにコメントを追加して分かりやすくする。
参考図書
処理概要
kintoneのレコード詳細画面を開いたときに、印刷ボタンを表示する。印刷ボタンを押すと印刷画面が別ウィンドウで表示される。
タスクを列挙する
リーダブルコードの11章を参考に、タスクに分解する。
・kintoneのレコード詳細に印刷ボタンを表示する
・印刷画面に遷移するURLを生成する
・印刷ボタンを押した時に印刷画面を別ウィンドウで表示する
コメントを追加する
import {Button} from '@kintone/kintone-ui-component/esm/js'; // モジュール読み込み
(() => {
kintone.events.on('app.record.detail.show', function(event) {
new kintone.Promise(function(resolve, reject) {
// 印刷ボタンを表示する
let button = new Button({text: '印刷'});
let elPrintButton = kintone.app.record.getSpaceElement('printButton');
elPrintButton.appendChild(button.render());
resolve(button);
return;
})
.then(function (UiButton) {
console.log(UiButton);
// URL取得
let url = kintone.api.url('/k/v1/records', true);
console.log(url);
// 正規表現のマッチパターンを変数にセット
let reg = /http(s)?:\/\/([\w-]+\.)+([\w-]+)+\/([\w-]+)/;
console.log(url.match(reg));
// kintoneアプリIDの取得
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) {
console.log(resp);
// 印刷画面用のURL生成
let printURL = url.match(reg)[0] + '/' + resp.appId + '/print?record=' + event.recordId;
console.log(printURL);
// 印刷ボタンクリックのイベントハンドラ設定
UiButton.on('click', function(event) {
console.log('on click');
console.log(printURL);
window.open(printURL, null);
});
});
});
});
})();
関数に分ける
タスクごとに関数に切り出す。
import {Button} from '@kintone/kintone-ui-component/esm/js';
(() => {
kintone.events.on('app.record.detail.show', function(event) {
new kintone.Promise(function(resolve, reject) {
//// let button = new kintoneUIComponent.Button({text: '印刷'});
// let button = new Button({text: '印刷'});
// let elPrintButton = kintone.app.record.getSpaceElement('printButton');
// elPrintButton.appendChild(button.render());
// resolve(button);
// return;
const render = uiButtonRender('印刷', 'printButton');
resolve(render);
})
.then(function (UiButton) {
console.log(UiButton);
let url = kintone.api.url('/k/v1/records', true);
console.log(url);
// let reg = /http(s)?:\/\/([\w-]+\.)+([\w-]+)+\/([\w-]+)/;
// console.log(url.match(reg));
const parsed: string[] = parseUrlToArray(url);
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;
const printURL: string = getPrintUrl(
`${parsed[1]}://${parsed[2]}.${parsed[3]}.${parsed[4]}`,
appId,
event.recordId
)
console.log(printURL);
UiButton.on('click', function(event) {
console.log('on click');
console.log(printURL);
window.open(printURL, null);
});
});
});
});
})();
function uiButtonRender(buttonText: string, fieldId: string) {
const button = new Button({text: buttonText});
const elButton = kintone.app.record.getSpaceElement(fieldId);
elButton.appendChild(button.render());
return button;
}
function getPrintUrl(host: string, appId: number, recordId: number) {
const result = host + '/k/' + appId + '/print?record=' + recordId;
return result;
}
function parseUrlToArray(url: string) {
const reg = /(https?):\/\/([\w-]+).([\w-]+).([\w-]+)\/([\w-]+)\/([\w-]+)\/([\w-]+\..*)/;
return url.match(reg);
}
次は切り出した関数にテストを追加する。
この記事が気に入ったらサポートをしてみませんか?