InputManJSのドロップダウンプラグインを使用して、FlexGridコントロールをドロップダウン表示させる方法について解説します。
ドロップダウンオブジェクトの追加
ドロップダウンプラグインを使用する場合、まずcreateDropDownメソッドを使用して、ドロップダウンオブジェクトをInputManJSのコントロールに追加する必要があります。
テキストコントロールにドロップダウンオブジェクトを追加する場合、以下のようなコードになります。
なお、createDropDownメソッドでは、ドロップダウンボタンを配置する位置をパラメータとして、指定することが可能です。設定可能な値(DropDownButtonAlignment列挙体)は、以下の通りです。
値
説明
LeftSide
ドロップダウンボタンをコントロールの左側に配置します。
RightSide
ドロップダウンボタンをコントロールの右側に配置します。(既定値)
FlexGridの表示
FlexGridをドロップダウン表示したい場合、FlexGridをドロップダウンオブジェクトの子ノードとして追加します。なお、FlexGridをドロップダウンに表示する場合には、onOpenメソッドを使用して、ドロップダウンが開いた時にFlexGridを再描画する必要があります。
たとえば、以下のようなコードになります。
選択時の処理
選択時の処理は、FlexGrid側のイベントを使用して行うことになります。具体的には、行が選択されたことを検知(selectionChangedイベント)し、テキストコントロールに選択された値を表示した上でcloseメソッドでドロップダウンを閉じるような処理を実装する必要があります。
たとえば、上記サンプルの場合、以下のコードがFlexGrid側で行が選択された時の処理になります。
import '@mescius/inputman/CSS/gc.inputman-js.css';
import '@mescius/wijmo.styles/wijmo.css';
import './styles.css';
import { InputMan } from '@mescius/inputman';
import { FlexGrid, SelectionMode, HeadersVisibility } from '@mescius/wijmo.grid';
import employees from './data';
InputMan.appearanceStyle = InputMan.AppearanceStyle.Modern;
// テキストコントロール
const gcTextBox = new InputMan.GcTextBox(document.getElementById('gcTextBox'));
let tbxSelectedIndex = -1;
// ドロップダウンプラグイン
const gcDropDown1 = gcTextBox.createDropDown();
// ドロップダウンを開いたときに再描画します
gcDropDown1.onOpen(() => {
if (!gcDropDown1.flexGrid) {
// Wijmo FlexGridコントロール
gcDropDown1.flexGrid = new FlexGrid(gcDropDown1.getElement().appendChild(document.createElement('div')), {
itemsSource: employees,
columns: [
{ binding: 'id', header: '社員ID', width: 70 },
{ binding: 'department', header: '部署', width: 80 },
{ binding: 'name', header: '名前', width: 100 },
{ binding: 'tel', header: '電話番号', width: 120 },
],
selectionMode: SelectionMode.Row,
headersVisibility: HeadersVisibility.Column,
selectionChanged: (sender, args) => {
if (gcDropDown1.isClosed()) {
return;
}
if (args.row === tbxSelectedIndex) {
return;
}
tbxSelectedIndex = args.row;
gcTextBox.setText(employees[args.row].name);
gcDropDown1.close();
}
});
gcDropDown1.flexGrid.hostElement.style.height = '140px';
}
gcDropDown1.flexGrid.select(tbxSelectedIndex, 0);
});
// マスクコントロール
const gcMask = new InputMan.GcMask(document.getElementById('gcMask'));
let maskSelectedIndex = -1;
gcMask.setFormatPattern('\\D{3}-\\D{4}-\\D{4}');
// ドロップダウンプラグイン
const gcDropDown2 = gcMask.createDropDown();
// ドロップダウンを開いたときに再描画します
gcDropDown2.onOpen(() => {
if (!gcDropDown2.flexGrid) {
// Wijmo FlexGridコントロール
gcDropDown2.flexGrid = new FlexGrid(gcDropDown2.getElement().appendChild(document.createElement('div')), {
itemsSource: employees,
columns: [
{ binding: 'id', header: '社員ID', width: 70 },
{ binding: 'department', header: '部署', width: 80 },
{ binding: 'name', header: '名前', width: 100 },
{ binding: 'tel', header: '電話番号', width: 120 },
],
selectionMode: SelectionMode.Row,
headersVisibility: HeadersVisibility.Column,
selectionChanged: (sender, args) => {
if (gcDropDown2.isClosed()) {
return;
}
if (args.row === maskSelectedIndex) {
return;
}
maskSelectedIndex = args.row;
gcMask.setValue(employees[args.row].tel);
gcDropDown2.close();
}
});
gcDropDown2.flexGrid.hostElement.style.height = '140px';
}
gcDropDown2.flexGrid.select(maskSelectedIndex, 0);
});
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>ドロップダウンプラグイン - Wijmo FlexGridの表示</title>
<!-- SystemJS -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/systemjs/0.21.5/system.src.js" integrity="sha512-skZbMyvYdNoZfLmiGn5ii6KmklM82rYX2uWctBhzaXPxJgiv4XBwJnFGr5k8s+6tE1pcR1nuTKghozJHyzMcoA==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<script src="systemjs.config.js"></script>
<script>
if (!window.GCIM) {
window.GCIM = {};
}
window.GCIM.LicenseKey = "GrapeCity-Internal-Use-Only,935368846199268#B1135ayQUW44kQXhnViFHV7YmNX3iQjdnMk9EOIlnb0xWbxoVO6hlTxNzLQRTemZHWldEd8YFe59kVItCchlDaPVXc7YVUw2SV9Z6M0NTN03kaww4LVFWeTpndGZlaNh4TqpXQt94L6dURzxkNmNWQvITQrgjZwE6K9UzaWVlcRJEV7FUQEdzTPB5aChzZ5F7MxEWRrEVWwMlbTp6RQlmNaNEZIlVe8AnV9pHcIx6TmJkMjdkMGtkRFR5cuFEZotibRplMtJVbCB7VKp5QGJmNS56Mwd4LUNDSvRUNuJzbxcmI0IyUiwiIFFkR4UjM7UjI0ICSiwCO4kTOzATNxQTM0IicfJye#4Xfd5nIGh5SEJiOiMkIsISNWByUKBibh5Ed5BnbJJiOi8kI1tlOiQmcQJCLiUjM8IzNwACOwQDM5IDMyIiOiQncDJCLiAnauMXdpN6cl5mLqIiOiMXbEJCLiMbul1qukDClSiOt6muI0ISYONkIsICO6ITO9EjN4gDO6MTNzkjI0ICZJJye0ICRiwiI34zZ9FVRvhmM7Zka9IFUnZWMOJkSIV4S9UlYrlWezZXcrc4cLpWc9h6M5V6csFlVrp7dBRDZ9tGV79ET4FWeYRFTuFFeXd7KwkES9pldM3yLNhHT5RzUqNVTxQWWrUWQYNESLpUSwkFR5VFcrAlVKVkQqJFZMtkc";
</script>
<script>
window.onload = function() {
System.import('./src/app');
}
</script>
</head>
<body>
<body>
<div class="flexbox">
<div>
名前<br>
<input id="gcTextBox">
</div>
<div>
電話番号<br>
<input id="gcMask">
</div>
</div>
</body>
</html>
const items = [
{ id: 105, department: '第一営業', name: '森上 偉久馬', tel: '09011111111' },
{ id: 107, department: '第二営業', name: '葛城 孝史', tel: '09022222222' },
{ id: 110, department: '第一営業', name: '加藤 泰江', tel: '09033333333' },
{ id: 204, department: '営業開発', name: '川村 匡', tel: '09044444444' },
{ id: 207, department: '営業開発', name: '松沢 誠一', tel: '09055555555' },
{ id: 210, department: '営業一', name: '成宮 真紀', tel: '09066666666' },
];
export default items;
body {
padding-bottom: 12rem;
}
System.config({
transpiler: 'plugin-babel',
babelOptions: {
es2015: true
},
meta: {
'*.css': { loader: 'css' }
},
paths: {
// paths serve as alias
'npm:': 'node_modules/'
},
// map tells the System loader where to look for things
map: {
'@mescius/inputman': 'npm:@mescius/inputman/index.js',
'@mescius/inputman/CSS': 'npm:@mescius/inputman/CSS',
'@mescius/inputman.richtexteditor': 'npm:@mescius/inputman.richtexteditor/index.js',
"@mescius/inputman.richtexteditor/CSS": "npm:@mescius/inputman.richtexteditor/CSS",
'@mescius/inputman.richtexteditor/JS/plugins/advlist': 'npm:@mescius/inputman.richtexteditor/JS/plugins/advlist/plugin.js',
'@mescius/inputman.richtexteditor/JS/plugins/all': 'npm:@mescius/inputman.richtexteditor/JS/plugins/all/plugin.js',
'@mescius/inputman.richtexteditor/JS/plugins/autosave': 'npm:@mescius/inputman.richtexteditor/JS/plugins/autosave/plugin.js',
'@mescius/inputman.richtexteditor/JS/plugins/charmap': 'npm:@mescius/inputman.richtexteditor/JS/plugins/charmap/plugin.js',
'@mescius/inputman.richtexteditor/JS/plugins/directionality': 'npm:@mescius/inputman.richtexteditor/JS/plugins/directionality/plugin.js',
'@mescius/inputman.richtexteditor/JS/plugins/emoticons': 'npm:@mescius/inputman.richtexteditor/JS/plugins/emoticons/plugin.js',
'@mescius/inputman.richtexteditor/JS/plugins/fullscreen': 'npm:@mescius/inputman.richtexteditor/JS/plugins/fullscreen/plugin.js',
'@mescius/inputman.richtexteditor/JS/plugins/htmlcode': 'npm:@mescius/inputman.richtexteditor/JS/plugins/htmlcode/plugin.js',
'@mescius/inputman.richtexteditor/JS/plugins/image': 'npm:@mescius/inputman.richtexteditor/JS/plugins/image/plugin.js',
'@mescius/inputman.richtexteditor/JS/plugins/link': 'npm:@mescius/inputman.richtexteditor/JS/plugins/link/plugin.js',
'@mescius/inputman.richtexteditor/JS/plugins/lists': 'npm:@mescius/inputman.richtexteditor/JS/plugins/lists/plugin.js',
'@mescius/inputman.richtexteditor/JS/plugins/media': 'npm:@mescius/inputman.richtexteditor/JS/plugins/media/plugin.js',
'@mescius/inputman.richtexteditor/JS/plugins/pagebreak': 'npm:@mescius/inputman.richtexteditor/JS/plugins/pagebreak/plugin.js',
'@mescius/inputman.richtexteditor/JS/plugins/preview': 'npm:@mescius/inputman.richtexteditor/JS/plugins/preview/plugin.js',
'@mescius/inputman.richtexteditor/JS/plugins/save': 'npm:@mescius/inputman.richtexteditor/JS/plugins/save/plugin.js',
'@mescius/inputman.richtexteditor/JS/plugins/searchreplace': 'npm:@mescius/inputman.richtexteditor/JS/plugins/searchreplace/plugin.js',
'@mescius/inputman.richtexteditor/JS/plugins/table': 'npm:@mescius/inputman.richtexteditor/JS/plugins/table/plugin.js',
'@mescius/inputman.richtexteditor/JS/plugins/template': 'npm:@mescius/inputman.richtexteditor/JS/plugins/template/plugin.js',
'@mescius/inputman.richtexteditor/JS/plugins/wordcount': 'npm:@mescius/inputman.richtexteditor/JS/plugins/wordcount/plugin.js',
'@mescius/inputman.comment': 'npm:@mescius/inputman.comment/index.js',
'@mescius/inputman.comment/CSS': 'npm:@mescius/inputman.comment/CSS',
'@mescius/wijmo': 'npm:@mescius/wijmo/index.js',
'@mescius/wijmo.styles': 'npm:@mescius/wijmo.styles',
'@mescius/wijmo.cultures': 'npm:@mescius/wijmo.cultures',
'@mescius/wijmo.input': 'npm:@mescius/wijmo.input/index.js',
'@mescius/wijmo.grid': 'npm:@mescius/wijmo.grid/index.js',
'@mescius/wijmo.nav': 'npm:@mescius/wijmo.nav/index.js',
'css': 'npm:systemjs-plugin-css/css.js',
'plugin-babel': 'npm:systemjs-plugin-babel/plugin-babel.js',
'systemjs-babel-build': 'npm:systemjs-plugin-babel/systemjs-babel-browser.js'
},
// packages tells the System loader how to load when no filename and/or no extension
packages: {
src: {
defaultExtension: 'js'
},
"node_modules": {
defaultExtension: 'js'
},
}
});