kintoneは業務用途でよく利用されているWebデータベースサービスになります。
タスク管理や日報管理など、様々なアプリケーションがあらかじめ用意されています。
kintoneではAPIを提供しており、Monacaアプリと連携が可能です。
今回はまずkintoneアプリをMonacaから操作する方法について解説します。
※ 本記事の中では、Monaca有料プランでのみ利用できる機能を利用しています。
今回作成するプロジェクト
記事で紹介するプロジェクトは、下のプロジェクトインポートリンクから
ご利用のMonacaアカウントへインポートできます。
※ 本記事の中では、Monaca有料プランでのみ利用できる機能を利用しています。
作成するアプリについて
今回のアプリでは、次の3画面を作成していきます。
- ログイン
- 日報一覧(日報データの読み込み)
- 日報登録・編集 フォーム(日報データの作成や編集)
ルーティング
画面ごとのパスは次のとおりです。
一番最後の画面は、どのパスにも該当しないパスが指定された場合に表示する404画面です。
// www/js/routes.js
const routes = [
// ログイン
{
path: '/',
componentUrl: './pages/login.html',
},
// 日報一覧
{
path: '/daily',
name: 'Daily',
componentUrl: './pages/daily.html'
},
// 日報登録、編集
{
path: '/form',
name: 'Form',
componentUrl: './pages/form.html'
},
// Default route (404 page). MUST BE THE LAST
{
path: '(.*)',
url: './pages/404.html',
},
];
ログイン画面
ログインについては前回の記事を踏襲しています。前回の記事は、こちらを参照してください。https://press.monaca.io/atsushi/9045
ログイン後、日報一覧画面に遷移します。
// www/pages/login.html
// ログインボタンを押した時の処理
const login = async () => {
// ボタン上にローディングを表示
load()
// 入力値を受け取る
const username = $f7.$el.find('#username').val();
const password = $f7.$el.find('#password').val();
// APIリクエスト用のヘッダー文字列作成
window.AUTH = ${username}:${password}
;
try {
// APIリクエスト
const res = await getApp({ id: KINTONE_APP_ID });
// レスポンスで認証情報の正しさを判定
const text = res.data.appId === KINTONE_APP_ID ? 'ログインしました' : res.message;
// ボタン上に表示されるローディングを非表示
unload()
// 日報一覧画面へ遷移する
$f7router.navigate({name: 'Daily'});
} catch (e) {
console.log(e.message);
}
};
日報一覧画面
日報一覧画面では、kintone上の日報アプリからレコードを取得し、一覧形式で表示させます。
「日報データを読み込む」ボタンを押したタイミングで、kintoneへ問合せてデータを読み込む形にしています。
<a href="#" @click=${load} class="item-link list-button">日報データを読み込む</a>
kintoneレコードの一括取得
日報一覧画面では、日報レコードを複数行表示するため、次のレコードの一括取得APIを呼出します。
(APIの詳細はこちら)
URI | HTTPメソッド |
---|---|
https://(サブドメイン名).cybozu.com/k/v1/records.json | GET |
APIを呼び出す際に利用できるパラメータは次のとおりです。
どのアプリかを指定する「app」のみが、必須のパラメータです。
パラメータ名 | 指定する値 | 必須 | 説明 |
---|---|---|---|
app | 数値 or 文字列 | ○ | アプリのID |
fields | 文字列の配列 | x | レスポンスに含めるフィールドコードを指定します。 省略時は、閲覧権限を持つすべてのフィールドの値が返されます。 |
query | 文字列 | x | レスポンスに含めるレコードの条件を指定するクエリ文字列です。 クエリ文字列内では、演算子とオプションが使用できます。 省略時は、閲覧権限を持つすべてのレコードが返されます。 |
totalCount | 真偽値 or 文字列 | x | 「query」パラメータで指定した条件にあてはまるレコードの件数を取得する場合、「true」を指定します。 省略時は、レスポンスにはtotalCountの値としてnullが返されます。 |
フィールドコードについて
フィールドコードは、プログラムから各種項目を特定するためのIDです。
このコードは、kintone上で編集ができます。
日報アプリの初期の状態では、次のようなフィールド名とフィールドコードになっています。
フィールド名 | フィールドコード |
---|---|
日付 | 日付 |
業務内容 | 文字列__複数行_ |
所感、学び | 文字列__複数行__0 |
初期状態では、フィールドコートの意味が分かりにくいため、次のように更新すると良いでしょう。
今回はフィールドコードは日本語にしていますが、英語で記述することで、よりプログラムに自然な形になります。
フィールド名 | フィールドコード |
---|---|
日付 | 日付 |
業務内容 | 業務内容 |
所感、学び | 所感 |
日報の読込み
load
関数では、日報の取得と画面へのHTML描画、イベントの設定を行っています。
const load = async () => {
try {
const records = await getDailyReport({ app: KINTONE_APP_ID });
showDailyReport(records.data.records);
bindDailyReport(records.data.records);
} catch (e) {
console.log(JSON.stringify(e));
}
};
まずは、データの取得です。
const getDailyReport = (params) => {
const options = {
method: 'get',
params: params,
};
return sendRequest('/records.json', options);
}
次に、取得したデータの描画は、ul内側に描画していきます。
// 日報データをHTMLタグで表示させる
const showDailyReport = (records) => {
$f7.$el.find('.media-list ul').html(records.map(r => `
<li data-id=${r.$id.value}>
<a href="#" class="item-link item-content">
<div class="item-inner">
<div class="item-title-row">
<div class="item-title">${r.日付.value}</div>
</div>
<div class="item-subtitle">${r.業務内容.value}</div>
<div class="item-text">${r.所感.value}</div>
</div>
</a>
</li>
`).join(''));
};
イベントの設定は、一覧の行データをタップした際にフォーム画面へ移動するものです。
タップしたデータ(record)を props を利用して、日報編集 フォームへ送っています。
// 表示された日報の行データをタップした際に、フォーム画面へ遷移するようイベントを登録
const bindDailyReport = (records) => {
$f7.$el.find('.list li').on('click', e => {
const id = $(e.target).parents('li').data('id');
const record = records.find(r => r.$id.value === id);
$f7router.navigate({
name: 'Form'
}, {
props: {
record
},
});
});
}
また、日報登録フォームへ移動するリンク(新規作成用)もあります。こちらはpropsがありません。
<a href="/form" class="link">
<i class="f7-icons">plus</i>
</a>
フォーム画面
日報フォーム画面では、次の情報を入力できます。
- 日付
- 業務内容
- 所感、学び
フォーム画面では、まず最初にpropsからデータを取得します。
一覧画面から既に存在しているデータを更新する場合は、propsにデータが入ってきます。
一覧画面にて、新規作成のボタンをクリックした場合は、propsにデータがないため、空のオブジェクトを作ります。
export default (props, { $f7, $f7router }) => {
const record = props.record || {};
// 省略
}
保存処理
フォーム画面にて、ユーザーのデータ入力後、保存ボタンを押すと、save関数を実行します。
<a href="#" @click=${save} class="item-link list-button">保存する</a>
save関数では、まず入力値を集めます。
const save = async () => {
const date = $f7.$el.find('#date').val();
const content = $f7.$el.find('#content').val();
const note = $f7.$el.find('#note').val();
// 後述
}
それらをkintoneのフォーマットに合うようにまとめます。
const params = {
'日付': {
value: date,
},
'業務内容': {
value: content,
},
'所感': {
value: note,
},
};
新規登録と更新の区別
後は、kintoneのレコードにおけるユニークキーである $id の有無によって更新と新規作成を分けます。
$idが存在している場合は、既にレコードがkintone上にあるため、更新の処理を行います。
$idが存在しない場合は、まだkintone上にレコードが無いため、新規作成となります。
if (record.$id) {
// 更新
res = await updateRecord({
app: KINTONE_APP_ID,
id: record.$id.value,
record: params,
});
} else {
// 新規作成
res = await addRecord({
app: KINTONE_APP_ID,
record: params,
});
}
その結果によって、メッセージを変えて表示します。
const text = res.data.revision ? '保存しました' : res.message;
$f7.toast.create({
text,
position: 'top',
closeTimeout: 2000,
}).open();
これでデータの作成と更新が完了します。