Attachment customization
概要
今回は、Attachment コンポーネントの活用とカスタマイズの仕方を説明します。
以下のシナリオを想定します。
- ファイルオブジェクト(Blob/ArrayBuffer, シンプルなオブジェクトパターン)を作って KUC(kintone UI Component)の Attachment コンポーネントに追加する
- ユーザーが添付したファイル情報を取得する
- ファイルの type/size を検証して不正な値の場合にエラーを表示する
- KUC Attachment コンポーネントのファイルを kintone の添付ファイルフィールドにアップロードする
使用するコンポーネント
完成イメージ
以下が画面の完成イメージです。
事前準備
以下のフィールドを含むアプリを作成します。
- 添付ファイルフィールド(フィールドコード:Attachment)
- スペースフィールド(要素ID:space)
JavaScript/CSS カスタマイズ
kintone UI Component の UMD ファイルをアプリに読み込んだ上で、以下のような実装をした JavaScript ファイルをアップロードします。
ファイルのアップロード方法などは、 Quick Start をご覧ください。
カスタムの Attachment エリアの表示
KUC Attachment コンポーネントと 2つの Button コンポーネントを表示します。
- カスタムファイルを KUC Attachment に追加する
- kintone の添付ファイルフィールドにアップロードする
const KINTONE_ATTACHMENT_FIELD = 'Attachment'; // kintone attachment field ID
const SPACE_ID = 'space'; // kintone space ID
const Kuc = Kucs['1.x.x'];
kintone.events.on('app.record.detail.show', async event => {
if (event.record[`${KINTONE_ATTACHMENT_FIELD}`]) {
const attachment = new Kuc.Attachment({
files: record[`${KINTONE_ATTACHMENT_FIELD}`].value,
label: 'KUC Attachment'
});
const addCustomFilesButton = new Kuc.Button({
text: 'add custom files to KUC Attachment'
});
const uploadButton = new Kuc.Button({
text: 'upload to native kintone Attachment',
type: 'submit'
});
const spinner = new Kuc.Spinner();
const spaceElement = kintone.app.record.getSpaceElement(SPACE_ID);
const container = document.createElement('div');
container.appendChild(attachment);
container.appendChild(addCustomFilesButton);
container.appendChild(uploadButton);
spaceElement.appendChild(container);
}
return event;
});
ファイルオブジェクトの作成と KUC Attachment コンポーネントへの適用
addCustomFilesButton
に click イベントリスナー を追加します。
ボタンがクリックされた時、以下の 3つの種類のファイルオブジェクトが生成されます。
- File object に変換された Blob/ArrayBuffer ファイル
- シンプルなオブジェクト(
{name: "xx", size: "xx"}
) そして、それらを KUC Attachment コンポーネントのfiles
プロパティに追加します。
const addCustomFilesButton = new Kuc.Button({
text: 'add custom files to KUC Attachment'
});
addCustomFilesButton.addEventListener('click', () => {
attachment.files = attachment.files.concat(initCustomFiles());
});
function initCustomFiles() {
const blob = new Blob(['this type is blob'], { type: 'text' });
const buffer = new ArrayBuffer(8);
const customFiles = [
arrayBufferToFile(buffer, 'array-buffer-file.txt', 'text'),
blobToFile(blob, 'blob-file.txt'),
{ name: 'custom-file.txt', size: '150', type: 'text' }
];
return customFiles;
}
function arrayBufferToFile(buffer, filename, type) {
const blob = new Blob([buffer], { type: type });
return new File([blob], filename, { type: type });
}
function blobToFile(blob, filename) {
return new File([blob], filename, { type: blob.type });
}