プリザンターにオンラインチュートリアルを実装する

愛用しているプリザンターを盛り上げたいと思い、Qiita初投稿です。
どうぞお付き合いください。

#はじめに
「プリザンターでシステムを作ってもなかなか使ってくれない」
「使い方がわからないと言われたが、マニュアルを作るのも手間。そもそも読んでくれる？」
「皆同じ所でつまづくので、実際の画面にチュートリアルを置きたい」
なんて思うことありますよね？

Webシステムにオンラインチュートリアルを組み込む「[intro.js](https://introjs.com/)」をプリザンターに実装してみました。
![キャプチャ1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/925662/6cc792c6-2aa8-203e-366f-a91a73792c26.png)![キャプチャ2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/925662/dda99c1f-42d5-9d17-dfc3-689aaaa90c7b.png)

###「使い方」ボタンをを設置する
* 「テーブルの管理」-「スクリプト」タブで「新規作成」ボタンをクリックします。
* 「スクリプト」欄に下記コードを入力します。

```javascript
// ボタン作成
var button= '<button id="tutorial" class="button button-icon" type="button" data-icon="ui-icon-lightbulb">使い方</button>';

// ウィンドウ下部ボタン行の左端にボタンを追加
var element = document.getElementById("MainCommands");
element.insertAdjacentHTML('afterbegin', button);
```
* 「出力先」欄は「一覧」にチェックを付けます。

![キャプチャ3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/925662/3a794b0e-6412-595c-bdc0-2d7af64e0576.png)

これで「使い方」ボタンが追加されます。

![キャプチャ4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/925662/4dfc8e8b-fcb8-1a50-b403-60d7116d2064.png)

###スクリプトでintro.jsを読み込む
スクリプトに下記コードを追加します。

```javascript
// intro.js読み込み
var introjs = document.createElement("script");
introjs.src = "https://unpkg.com/intro.js/minified/intro.min.js";
document.body.appendChild(introjs);

// css読み込み
var link = document.createElement('link');
link.href = 'https://unpkg.com/intro.js/minified/introjs.min.css';
link.rel = 'stylesheet';
link.type = 'text/css';
var h = document.getElementsByTagName('head')[0];
h.appendChild(link);
```
javascriptとCSSのURLは「[intro.js](https://introjs.com/)」に記載されています。

###チュートリアルを記述する
チュートリアルは以下の様に記述します。
elementで指定した要素から吹き出しでチュートリアルが表示されます。
elementを省略すると画面中央にチュートリアルが表示されます。

```javascript
steps: [
	{element: 要素1, intro: チュートリアル1},
	{elemtnt: 要素2, intro: チュートリアル2},
	...
]
```

「使い方」ボタンでチュートリアルが始まるようにします。

```javascript
window.onload = function(){
	var intro = introJs();
	intro.setOptions({
		// ＝＝＝＝　ここで説明を記述する　＝＝＝＝
		steps: [
			{intro: 'チュートリアルにようこそ。<br>このチュートリアルはプリザンターの「スクリプト」で作成しています。'},
			{element: '#tutorial', intro: 'このチュートリアルは初回起動時に表示されます。<br>あとで見たくなったら「使い方」をクリックします。'},
			{element: document.querySelector('li'), intro: '「新規作成」で新しいレコードを登録します。<br>登録の仕方は「新規作成」画面の「使い方」ボタンをクリックして確認してください。'},
			{element: document.querySelectorAll('tr')[1], intro: '登録したレコードです。<br>クリックすると編集画面に入り、レコードを編集することができます。<br>編集の仕方は編集画面の「使い方」ボタンをクリックして確認してください。'},
			{element: document.querySelector('thead'), intro: '各列のタイトルにマウスカーソルを合わせると並び順メニュー（昇順／降順）が表示されます。'},
			{element: '#ViewFilters', intro: '各列に条件をセットして絞り込むことができます。'},
		],
		'nextLabel': '次へ →',
		'prevLabel': '← 戻る',
		'doneLabel': '完了',
	});
	
	// ボタンクリック時の処理
	document.getElementById("tutorial").onclick = function() {
		// チュートリアル実行
		intro.start();
	}
}
```

###補足）初めて画面を開いた時に自動的にチュートリアルを開始する
「[js-cookie](https://github.com/js-cookie/js-cookie)」を使って、初めて画面を開いた時に自動的にチュートリアルを開始するようにしました。

```javascript
// ボタン作成
var button = '<button id="tutorial" class="button button-icon" type="button" data-icon="ui-icon-lightbulb">使い方</button>';

// ウィンドウ下部ボタン行の左端にボタンを追加
var element = document.getElementById("MainCommands");
element.insertAdjacentHTML('afterbegin', button);

// intro.js読み込み
var introjs = document.createElement("script");
introjs.src = "https://unpkg.com/intro.js/minified/intro.min.js";
document.body.appendChild(introjs);

// css読み込み
var link = document.createElement('link');
link.href = 'https://unpkg.com/intro.js/minified/introjs.min.css';
link.rel = 'stylesheet';
link.type = 'text/css';
var h = document.getElementsByTagName('head')[0];
h.appendChild(link);

// js-cookie読み込み
var jscookie = document.createElement("script");
jscookie.src = "https://cdn.jsdelivr.net/npm/js-cookie@rc/dist/js.cookie.min.js";
document.body.appendChild(jscookie);

window.onload = function(){
	var intro = introJs();
	var page = 'pleasanter-287135-list';
	intro.setOptions({
		// ＝＝＝＝　ここで説明を記述する　＝＝＝＝
		steps: [
			{intro: 'チュートリアルにようこそ。<br>このチュートリアルはプリザンターの「スクリプト」で作成しています。'},
			{element: '#tutorial', intro: 'このチュートリアルは初回起動時に表示されます。<br>あとで見たくなったら「使い方」をクリックします。'},
			{element: document.querySelector('li'), intro: '「新規作成」で新しいレコードを登録します。<br>登録の仕方は「新規作成」画面の「使い方」ボタンをクリックして確認してください。'},
			{element: document.querySelectorAll('tr')[1], intro: '登録したレコードです。<br>クリックすると編集画面に入り、レコードを編集することができます。<br>編集の仕方は編集画面の「使い方」ボタンをクリックして確認してください。'},
			{element: document.querySelector('thead'), intro: '各列のタイトルにマウスカーソルを合わせると並び順メニュー（昇順／降順）が表示されます。'},
			{element: '#ViewFilters', intro: '各列に条件をセットして絞り込むことができます。'},
		],
		'nextLabel': '次へ →',
		'prevLabel': '← 戻る',
		'doneLabel': '完了',
	});

	// ボタンクリック時の処理
	document.getElementById("tutorial").onclick = function() {
		// チュートリアル実行
		intro.start();
	}

	// 初回表示の場合
	if(Cookies.get(page) != 'viewed'){
		intro.start().onexit(function(){
			// 初回表示完了フラグをcookieに格納する
			Cookies.set(page, 'viewed', { expires: 365 });
		});
	}
}
```

#まとめ
オンラインチュートリアルで、ユーザにも、システム製作者にもやさしいシステムになりました。

最後に、今年も残りわずか。皆さま良いお年をお迎えください！