SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

JavaScriptライブラリ「Wijmo」のさまざまな部品を徹底活用(AD)

JavaScriptライブラリ「Wijmo」のさまざまな部品を徹底活用!~階層構造のデータを表示するTreeViewコントロール~

JavaScriptライブラリ「Wijmo」のさまざまな部品を徹底活用 第4回

  • X ポスト
  • このエントリーをはてなブックマークに追加

都道府県をツリーに表示するようにする

 図3の実装をもとに今回の実装作業を行うと、図2の全機能を実装した、図4のWebページが完成します。画面左側のツリーでは、第1階層に東日本と西日本、第2階層に地方(東北、関東、関西など)、第3階層に都道府県がそれぞれ表示されます。

図4 今回実装するWebページ(p001-wijmo)
図4 今回実装するWebページ(p001-wijmo)

 マウスクリックやキーボードの操作により、ツリーを展開したり折り畳んだりできます。また、ツリーで都道府県を選択すると、その都道府県のデータが画面に表示されると同時に、前回追加したドロップダウンリストでもその都道府県が選択されます。

図5 ツリーで都道府県を選択する様子(p001-wijmo)

図5 ツリーで都道府県を選択する様子(p001-wijmo)

 逆に、ドロップダウンリストで都道府県を選択すると、その都道府県がツリーでも表示されます。

図6 ドロップダウンリストで都道府県を選択する様子(p001-wijmo)

図6 ドロップダウンリストで都道府県を選択する様子(p001-wijmo)

 このツリーを実現するのは、WijmoのTreeViewコントロールです。TreeViewコントロールを利用した実装方法を、以下で説明していきます。

TreeViewコントロールを表示するHTML/CSSファイルの記述

 まず、HTML/CSSファイルから修正していきます。TreeViewコントロールは、タブパネルと同じwijmo.navモジュールに含まれるため、WijmoのJavaScriptを参照する記述を前回から変更する必要はありません(リスト1)。

[リスト1]index.htmlで参照するWijmoのJavaScript(p001-wijmo/index.html)
<script src="wijmo/controls/wijmo.min.js"></script>
<script src="wijmo/controls/cultures/wijmo.culture.ja.min.js"></script>
<script src="wijmo/controls/wijmo.chart.min.js"></script>
<script src="wijmo/controls/wijmo.grid.min.js"></script>
<script src="wijmo/controls/wijmo.nav.min.js"></script> <!-- TreeViewを含む -->
<script src="wijmo/controls/wijmo.input.min.js"></script>

 なお、リスト1で参照しているWijmoのJavaScriptファイルは表1の通りです。

表1 index.htmlから参照するWijmoのJavaScriptファイル(p001-wijmo/index.html)
No. ファイル名 役割
1 wijmo/controls/wijmo.min.js Wijmo本体
2 wijmo/controls/cultures/wijmo.culture.ja.min.js カルチャ(日本語)ファイル
3 wijmo/controls/wijmo.chart.min.js チャート(FlexChart)のファイル
4 wijmo/controls/wijmo.grid.min.js グリッド(FlexGrid)のファイル
5 wijmo/controls/wijmo.nav.min.js タブパネル、TreeViewなどナビゲーション部品のファイル
6 wijmo/controls/wijmo.input.min.js AutoCompleteなど入力部品のファイル

 index.htmlの<body>配下は、これまで記述してきたコンテンツの左側にツリー表示を行うため、タグの階層を1階層増やして、リスト2の構造とします。

[リスト2]index.htmlの構造(p001-wijmo/index.html)
<body>
    <div id="meta-container"><!-- 子要素を横に並べる ...(1)-->
        <div id="tree-view-container"><!-- TreeViewを含む要素 ...(2)-->
            <h3>TreeView</h3>
            <div id="treeViewPref"></div><!-- 都道府県ツリー ...(3)-->
        </div>
        <div id="vertical-container"><!-- TreeView以外を含む要素 ...(4)-->
            <!-- TreeView以外の記述 -->
        </div>
    </div>
(略)
</body>

 子要素を横に並べる(1)の<div>要素の配下に、画面左側のTreeViewを含む要素(2)と、画面右側のTreeView以外を含む要素(4)を配置します。実際にTreeViewが表示されるのは、(3)の<div>要素です。

 リスト2のHTMLに対応して、CSS(index.css)にはリスト3の記述を追加します。(1)はリスト2(1)の<div>要素で子要素を横に並べる指定、(2)がリスト2(2)の<div>要素に指定する横幅と余白です。リスト2(2)の要素の幅を180pxにしたので、それ以外の領域に対応するリスト2(4)の<div>要素は、(3)の通りcssのcalc関数を使用して、横幅を「100% - 180px」と指定します。

[リスト3]リスト2に対応するCSSの記述(p001-wijmo/index.css)
#meta-container { /*(1)*/
    display: flex;
    flex-direction: row;
}

#tree-view-container { /*(2)*/
    width: 180px;
    padding: 10px;
}

#vertical-container {
    display: flex;
    flex-direction: column;
    width: calc(100% - 180px); /*(3)*/
}

TreeViewコントロールを表示するJavaScriptの記述

 次にJavaScriptファイル(index.js)で、TreeViewコントロールの表示と挙動を実装していきます(リスト4)。

[リスト4]TreeViewコントロールを表示するJavaScriptの実装(p001-wijmo/index.js)
const treeViewPref = new wijmo.nav.TreeView('#treeViewPref', {
  itemsSource: getTreeViewPrefData(),
  displayMemberPath: 'name',
  childItemsPath: 'items',
  selectedItemChanged: (treeView, eventArgs) => {
    const item = treeView.selectedItem;
    // idが含まれる場合、そのidでAutoCompleteを選択する ...(1)
    // データ取得処理はAutoComplete選択時の処理内で呼び出される
    if (item.id != null) {
      autoCompletePref.selectedValue = item.id;
    }
  }
});

 リスト2(3)の要素を選択するCSSセレクター「#treeViewPref」を第1引数に指定してwijmo.nav.TreeViewクラスのコンストラクターを実行します。コンストラクターの第2引数はオプション指定で、指定内容は表2の通りです。

表2 TreeViewコントロールに指定するオプション(p001-wijmo/index.js)
No. ファイル名 役割

設定値

1 itemsSource ツリーに表示するデータ 都道府県の階層データ(後述)
2 displayMemberPath ツリーに表示するデータ属性 name
3 childItemsPath ツリーの子要素を指定するデータ属性 items
4 selectedItemChanged ツリー選択が変更されたときの処理 (ドロップダウンリストで都道府県を選択)

 表2、No.4のselectedItemChangedはツリー選択が変更された時の処理で、リスト4(1)により、idがnullでない場合(つまり、ツリーで都道府県が選択された場合)に、その都道府県のidをドロップダウンリスト(AutoCompleteコントロール)のselectedValueプロパティに指定して、都道府県を選択します。この指定により、TreeViewで都道府県を選択すると、対応する都道府県がAutoCompleteで選択されます。この時同時に、AutoCompleteの選択が変更されたときの処理(後述のリスト7)により、選択された都道府県のデータが画面に表示されます。

TreeViewコントロールに表示する階層データ

 表2、No.1のitemsSource属性には、都道府県の階層データを指定します。階層データの元となる都道府県データは、前回記事でリスト5の通り実装しました。

[リスト5]都道府県の一覧データ(p001-wijmo/index.js)
const prefData = [
  { id: 1, region: '北海道', name: '北海道', kana: 'ほっかいどう', alpha: 'Hokkaido' },
  { id: 2, region: '東北', name: '青森県', kana: 'あおもりけん', alpha: 'Aomori' },
(中略)
  { id: 47, region: '沖縄', name: '沖縄県', kana: 'おきなわけん', alpha: 'Okinawa' }
];

 リスト5のprefData配列各要素には、表3の属性が含まれます。

表3 都道府県の一覧データに含まれる属性(p001-wijmo/index.js)
No. 項目名 内容
1 id 都道府県の番号
2 region 都道府県が含まれる地方
3 name 都道府県名(漢字)
4 kana 都道府県名(かな)
5 alpha 都道府県名(アルファベット)

 リスト5の都道府県データをもとに、リスト6の処理で、TreeViewに表示する階層データを作成します。

[リスト6]TreeViewに表示する階層データを作成する処理(p001-wijmo/index.js)
function getTreeViewPrefData() {
  return [
    {
      name: '東日本', // ...(1)
      items: [ // ...(2)
(略:北海道)
        {
          name: '東北', // ...(3)
          items: prefData.filter(a => a.region == '東北') // ...(4)
        },
(略:関東)
      ]
    },
(略:西日本)
  ];
}

 (1)で第1階層の名前(name)、(2)で第2階層のデータ(items)を実装します。表2、No.2の指定によりname属性が画面に表示され、No.3の指定によりitems属性(配列)がツリーの子要素として解釈されるようになります。

 同様に、(3)が第2階層の名前(name)、(4)が第3階層のデータ(items)です。ここで(4)は、リスト5のprefData配列から、地方(region)が「東北」であるデータをフィルターして設定します。この処理により、ツリーの「東北」配下には、東北地方の県のみが表示されるようになります。他の地方・都道府県も同様に指定します。

ドロップダウンリスト(AutoComplete)選択時の処理

 TreeViewで都道府県が選択されると、リスト4(1)の処理によりドロップダウンリスト(AutoComplete)の選択値が変更されます。このときの処理内容はAutoCompleteの実装でリスト7の通り指定します。

[リスト7]AutoCompleteの選択が変更されたときの処理(p001-wijmo/index.js)
const autoCompletePref = new wijmo.input.AutoComplete('#autoCompletePref', {
(略)
  // AutoComplete変更時の処理 ...(1)
  selectedIndexChanged: (comboBox, eventArgs) => {
    // AutoCompleteの選択値に対応したTreeViewのノードを取得 ...(2)
    const node = treeViewPref.getNode(comboBox.selectedItem);
    // そのノードを選択 ...(3)
    node.select();
    // データを再検索してグリッドとチャートに反映 ...(4)
    fetchAndApply(comboBox.selectedValue);
  }
});

 (1)のselectedIndexChangedがAutoComplete変更時の処理です。このとき、(2)でAutoCompleteの選択値に対応したTreeViewのノードを、TreeViewのgetNodeメソッドで取得し、(3)でselectメソッドを実行してノードを選択します。この処理により、AutoCompleteで都道府県を選択すると、対応する都道府県がTreeViewに表示されるようになります。同時に(4)の処理により、選択された都道府県のデータが再検索され、画面に表示されます。

最後に

 本連載では、全4回にわたり、Wijmoが提供するUI部品を複数組み合わせて本格的なWebページを作成してきました。最終回となる今回は、TreeViewコントロールを利用してツリーを表示し、そこから都道府県を選択できるようにしました。また、前回追加したAutoCompleteコントロールと連動して、一方で選択した都道府県が他方に反映され、対応するデータが表やグリッドに表示されるようにしました。

 本連載ではWijmoのさまざまなコントロールを連携して活用する例を紹介してきました。Wijmoのコントロールは単独で利用しても効果を発揮しますが、複数組み合わせることにより、それぞれが連携してより豊かな機能を提供できます。プログラマーの工夫次第で可能性が広がるWijmoのUI部品、日々の開発の中で活用を検討してみてはいかがでしょうか。

 なお、Wijmoの公式ページでは、本連載よりさらに複雑にWijmoの機能を組み合わせた「在庫管理ダッシュボード」と「Webサイトセッションダッシュボード」のデモを公開しているので参考にしてください。

図7 「在庫管理ダッシュボード(https://demo.grapecity.com/wijmo/demos/reference-samples/ProductStockDashboard/angular/dist/dashboard)」のデモ
図7 「在庫管理ダッシュボード」のデモ

参考資料

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
JavaScriptライブラリ「Wijmo」のさまざまな部品を徹底活用連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト  吉川 英一(ヨシカワ エイイチ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

【AD】本記事の内容は記事掲載開始時点のものです 企画・制作 株式会社翔泳社

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/17449 2023/03/13 12:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング