More Related Content
Similar to DeNAにおけるCorpTechエンジニアリング [DeNA TechCon 2019] (20)
DeNAにおけるCorpTechエンジニアリング [DeNA TechCon 2019]
- 21. #denatechcon
DBレコードが変更されるたびにメールを送る例
sendNotification(type) {
if (type == 'create') return;
varloginUserEmail = nlapiGetContext().getEmail();
varrecordType = nlapiGetRecordType();
varrecordId = nlapiGetRecordId();
varsubject = 'YOURCHANGEHASBEEN SUBMITTED!!';
varbody = 'Record Type: ' + recordType+ 'n’+
'ID: '+ recordId;
nlapiSendEmail(
loginUserEmail, // author
loginUserEmail, // recipient
subject,
body
);
}
- 26. #denatechcon
// lib-a.js
var doA =
function() { ... };
// lib-a.js
initB();
var doA =
function() { ... };
まさかのブラウザ方式 (よりもタチが悪い方式)
• 参照はすべてグローバルスコープ経由
• モジュールの概念がない
• 設定したライブラリファイルの読込順が謎
• どうもファイルの内部的なID順らしい
• IDは最初にアップロードしたタイミングで割り当てられる
// lib-b.js
var initB =
function() { ... };
// main.js
function main {
doA();
}
内部ID: 101 内部ID: 102// main.js
function main {
initB();
doA();
}
- 30. #denatechcon
無ければ作ればいいじゃない
• 自作モジュールバンドラー in Gruntfile.coffee
• grunt-contrib-concat (ファイル結合プラグイン) を悪用
concat:
basic:
options:
process: (src,filePath) ->
ifmatched = filePath.match(/^dist/(.+).js$/)
libName =matched[1]
"// #{libName}n_libs.#{libName} =
function(exports, require,module) {n#{src}n};"
else
''
src: ['dist/fi_lib_*.js']
dest: 'dist/fi_lib.js'
extra:
options:
banner: "var require=(function(){n var_libs={};n ...
- 43. #denatechcon
kintone JavaScriptカスタマイズの具体例
const dom=require('dom'); // DOM操作用に処理を切り出し
const isJoining =record =>/^1. /.test(record.applicationTypes.value);
const isOtherSnackSelected =record=> /^9. /.test(record.snacks.value);
// 項目の値変更時の画面制御
kintone.events.on([
'app.record.create.change.applicationTypes', 'app.record.create.change.snacks',
'app.record.edit.change.applicationTypes', 'app.record.edit.change.snacks',
],event => {
const record =event.record;
if(isJoining(record) && isOtherSnackSelected(record)) {
record.otherSnackName.disabled =false;
dom.setRequiredSymbolById('otherSnackName', true);
} else {
record.otherSnackName.value =''; // 非活性にするときは値も空にする
record.otherSnackName.disabled =true;
dom.setRequiredSymbolById('otherSnackName', false);
}
return event;
});
- 44. #denatechcon
kintone JavaScriptカスタマイズの具体例 (続き)
// 保存時の必須項目未入力エラー表示
kintone.events.on([
'app.record.create.submit',
'app.record.edit.submit',
],event => {
const record =event.record;
if(!isJoining(record) || !isOtherSnackSelected(record)) return event;
if(record.otherSnackName) return event;
event.error ='入力項目を確認してください。'; // 画面トップ
event.otherSnackName.error ='必須です。'; // 該当フィールドの真下
return event;
});