Bootstrap 5でDatetimePickerを使いたい

# はじめに
2020年6月16日にBootstrap 5のalpha版がついにリリースされました。alpha版なので本リリースは年内くらいですかね。
Bootstrap 5はjQueryへの依存がなくなり、Internet Explorerのサポートも終了しました。

この記事の前身である「[Bootstrap 4でDatetimePickerを使いたい](https://qiita.com/yaju/items/2cbe5e5914c5be08820a)」は、自分の記事のアクセス解析をするといつも上位にきています。需要がありそうなので、Bootstrap 5でDatetimePickerは使えるのかを記事にしていきます。

【2021/05/12追記】
2021年5月6日にBootstrap 5が正式にリリースされましたので、alpha版から正式版に切り替えました。他のライブラリーの一部も現時点の最新版にしました。
Bootstrap 5が正式版で修正したところは、ラベル(日付:など)とテキストボックスの余白が詰まるようになってしまいました。そのため、ラベルの半角コロン(:)を全角コロン(：)にして余白を作りました。

2021年1月のIE11のシェアは世界では2%ほどですが、日本でまだ8%ほどあるそうでしぶといですね。

https://news.mynavi.jp/article/20210202-1685760/

【2023/09/26追記】
DatetimePicker(tempusdominus)の後継バージョン v6が出ており、Bootstrap、momentjs、jQuery の依存関係が不要になっています。
https://github.com/Eonasdan/tempus-dominus

https://getdatepicker.com/

【2024/05/03追記】
GWの休みを使ってようやく対応しました。

https://qiita.com/yaju/items/247813a10546353bd7c8

# Bootstrap 4 DatetimePicker(tempusdominus)
https://tempusdominus.github.io/bootstrap-4/
https://github.com/tempusdominus/bootstrap-4
作者のブログ、DatetimePickerの状態と今後について書かれています。
https://eonasdan.com/posts/state-of-my-picker.html

Bootstrap 4 から Bootstrap ５ に切り替えても使用できるのか？
結論から先に言えば使用出来ます。ただし、jQueryは必須となります。

```html:Boostrap4のまま
<div class="container">
  <div class="col-md-3 py-4">
    <form class="card p-4">
      <div class="input-group date mb-3" id="datetimepicker1" data-target-input="nearest">
        <label for="datetimepicker1" class="pt-2 pr-2">日付1:</label>
        <input type="text" class="form-control datetimepicker-input" data-target="#datetimepicker1"/>
        <div class="input-group-append" data-target="#datetimepicker1" data-toggle="datetimepicker">
          <div class="input-group-text">
            <i class="far fa-calendar-alt"></i>
          </div>
        </div>
      </div>
    </form>
  </div>
</div>
```
 
<img width="302" alt="Boostrap4_DateTimePicker.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/1b532abb-01e0-c0cf-00bf-10cb5d80beed.png">

上図のように Bootstrap 4のままの記述するとアイコンのボタンの高さが、少し小さくなってしまいます。これは Bootstrap 5では input-group-append が削除されたためです。
[How to Convert Bootstrap 4 Website to Boostrap 5 – Migration Guide](https://web3canvas.com/convert-bootstrap-4-to-5-migration-guide/)

```html:Boostrap5に変更
<div class="container">
  <div class="col-md-3 py-4">
    <form class="card p-4">
      <div class="input-group date mb-3" id="datetimepicker1" data-target-input="nearest">
        <label for="datetimepicker1" class="pt-2 pr-2">日付1：</label>
        <input type="text" class="form-control datetimepicker-input" data-target="#datetimepicker1"/>
        <div class="input-group-text" data-target="#datetimepicker1" data-toggle="datetimepicker">
          <i class="far fa-calendar-alt"></i>
        </div>
      </div>
    </form>
  </div>
</div>
```

input-group-append の属性を input-group-text に移動させて、input-group-append を削除しました。
<img width="302" alt="Boostrap5_DateTimePicker.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/655ce972-2eac-9301-8cbb-aa49531a70c0.png">

## 環境
|ライブラリー|バージョン|
|:--|:--|
|bootstrap 5|5.0.0|
|font awesome|5.15.3|
|jquery|3.6.0|
|popper.js|2.9.2|
|moment.js|2.29.1|
|tempusdominus-bootstrap-4|5.39.0|

## CodePen
QiitaではCodePenが埋め込み可能なので貼っておきます。
[jsdo.it の移行先として CodePen を使ってみる](https://qiita.com/yaju/items/e2220f9e46b02fcd28d2)

<p class="codepen" data-height="640" data-theme-id="light" data-default-tab="js,result" data-user="yaju-the-encoder" data-slug-hash="jOqWmKo" style="height: 640px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Bootsrap5 DateTimePicker(tempusdominus)">
  <span>See the Pen <a href="https://codepen.io/yaju-the-encoder/pen/jOqWmKo">
  Bootsrap5 DateTimePicker(tempusdominus)</a> by やじゅ (<a href="https://codepen.io/yaju-the-encoder">@yaju-the-encoder</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script> 

# flatpickr
Bootstrap 5は、jQueryへの依存をやめたのに、Bootstrap 4 DatetimePicker(tempusdominus)ではjQueryが必須になってしまいます。
そこでバニラJavaScriptで作成しているDatetimePickerを探していたところ、「[flatpickr](https://flatpickr.js.org/)」を見つけました。
ちなみにバニラJavaScriptは、純粋なJavascriptのみで作成されたものです。[バニラ(ソフトウェア)](https://ja.wikipedia.org/wiki/%E3%83%90%E3%83%8B%E3%83%A9_(%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2))の語源は、アイスクリームの標準的な風味であるバニラ味からきている。

基本的な使い方は、下記が参考になります。
[flatpickrドキュメント翻訳](https://tr.you84815.space/flatpickr/index.html)

## 日本語化
月や曜日は日本語に変更したり、土日の色を変更するのは下記サイトが参考になります。
[【flatpickr】日本語化の設定](https://cheat.co.jp/blog/archives/1912)

標準だと日本語化してもカレンダーのヘッダー部の年・月の順序が月・年のままとなっています。
<img width="310" alt="flatpickr_monthYear.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/aea18974-d3c9-fba7-770c-a375adcd91b7.png">
[オプション一覧](https://tr.you84815.space/flatpickr/configOptions.html) を見ても他ライブラリーにある年・月の順序を指定する showMonthAfterYear オプションのようなものは見当たりません。ネットで調べると下記サイトにCSSでカレンダーの年月の表示順序を変える方法が記載されていました。CSSで順序を入れ替えることができるなんて考えもしなかった。
[Flatpickrメモ](https://38elements.github.io/2016/11/05/flatpickr.html)

しかし、このCSSを記述しても年月の表示順序が変わりませんでした。デベロッパー・ツールで要素を参照しても cur-month が見当たらないのです。記事が2016年と古いから変更されたのか cur-month の代わりに flatpickr-monthDropdown-months に変更したら年・月の順序は入れ替わったのですが、”年”が追記されないことと月のドロップダウンが出来なくなりました。
オプションを見直すとカレンダーの月セレクタの表示方法の指定「monthSelectorType」オプションを見つけ、monthSelectorType：’static’ にすることで cur-month クラスに変更されたのです。

```css
.flatpickr-current-month {
  display: flex;
  justify-content: center;
}

.cur-year {
  order : 1;
}

.cur-month:before  {
   content: '年　';
}

.cur-month {
  order: 2;
}

.flatpickr-current-month span.cur-month {
  font-weight : 300;
  padding-top : 4px;
}
```
”年”の後は全角スペースにして表示バランスを取っています。"2020"と"年"の間に余白があるのは年選択のアップダウンボタンがあるからです。
<img width="309" alt="flatpickr_monthYear2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/8fdad763-f5fd-d000-9faf-025ca9548432.png">

## 環境
|ライブラリー|バージョン|
|:--|:--|
|bootstrap 5|5.0.0|
|font awesome|5.15.3|
|popper.js|2.9.2|
|flatpickr|v4|

## CodePen
<p class="codepen" data-height="640" data-theme-id="light" data-default-tab="html,result" data-user="yaju-the-encoder" data-slug-hash="NWNGQqj" style="height: 640px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Bootsrap5 DateTimePicker(flatpickr )">
  <span>See the Pen <a href="https://codepen.io/yaju-the-encoder/pen/NWNGQqj">
  Bootsrap5 DateTimePicker(flatpickr )</a> by やじゅ (<a href="https://codepen.io/yaju-the-encoder">@yaju-the-encoder</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

# 最後に
Bootstrap 5のDatetimePickerってことで、flatpickr を知れたことは良かったです。ドキュメントも整備されていて、これは使えます。
Web系開発はあまりしていないので、CSSで結構すごいことができることを今回分かった。
土日の色指定で 7n-1 とかで繰り返しができる上に notで前月や次月の日の除外もできたし、年月の表示順序を入れ替えて"年"を追記することもできた。Bootstrap 5ってことでIEサポートを考えなくてもいいからね。

tempusdominus-bootstrap-4 と flatpickr のCodePenで今回サンプルを作りました。出来るだけ似せた感じで作成したので比較しやすいと思います。

脱jQueryはどうなんでしょう。重いと言われていますがエンジニアの重視する速度とユーザーの体感速度で考えて、誤差の範囲なら気にしなくてもいいですよね。また、開発メンバーの習熟度でjQueryの方が工数がかからないjQueryを素直に導入したほうがいいけど、そうするといつまでも依存することになってしまう・・・