001/* 002 * Copyright (c) 2009 The openGion Project. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 013 * either express or implied. See the License for the specific language 014 * governing permissions and limitations under the License. 015 */ 016package org.opengion.hayabusa.taglib; 017 018import java.util.ArrayList; 019import java.util.List; 020import java.util.Set; // 6.4.3.4 (2016/03/11) 021import java.util.Iterator; // 6.7.7.0 (2017/03/31) 022import java.util.function.IntFunction; // 7.0.1.3 (2018/11/12) 023 024// import org.opengion.fukurou.system.BuildNumber; // 7.0.1.2 (2018/11/04) 025import org.opengion.hayabusa.common.HybsSystem; 026import org.opengion.hayabusa.common.HybsSystemException; 027import org.opengion.hayabusa.db.DBTableModelSorter; 028import org.opengion.hayabusa.db.DBTableModel; 029import org.opengion.hayabusa.db.DBColumn; // 6.8.3.1 (2017/12/01) 030import org.opengion.hayabusa.io.JsChartDataV3; // 7.0.1.1 (2018/10/22) 031 032import org.opengion.fukurou.util.ArraySet; // 6.4.3.4 (2016/03/11) 033import org.opengion.fukurou.util.ToString; 034import org.opengion.fukurou.util.StringUtil; // 6.8.3.1 (2017/12/01) 035import org.opengion.fukurou.util.ColorMap; // 7.0.1.3 (2018/11/12) 036import static org.opengion.fukurou.util.StringUtil.nval; 037 038/** 039 * JsChartV3 は、JavascriptのjsChart用のスクリプトを出力するクラスです。 040 * 複数の JsChartDataV3 オブジェクトを合成することも、ここで行っています。 041 * ChartJSのVer3を利用しているため、標準属性以外の項目をセットする場合はoptionAttributesで行ってください。 042 * 043 * 出力されるスクリプトでは、idを指定しない場合はhybscanvas[tableId]が利用されます。 044 * 複数のグラフを同一画面で出力する場合はidかtableIdを変えてください。 045 * チャートオブジェクトはchart_[id]という名前で作成されるため、ajax等でコントロールが必要な場合は利用してください。 046 * 047 * <a href="https://www.tohoho-web.com/ex/chartjs-params.html">とほほのChart.js入門</a> 048 * 049 * ChartのGlobal Configurationとして、Chart.defaults.**** が指定できる。これは本タグでは 050 * 用意していないが、グローバルなので、タグの前に個別に記述しておくことで適用される。 051 * 052 * <a href="https://www.chartjs.org/docs/latest/configuration/">Configuration</a> 053 * 054 * @og.formSample 055 * ●形式:<og:jsChartV3 chartType="…" ... /> 056 * ●body:あり(EVAL_BODY_BUFFERED:BODYを評価し、{$#064;XXXX} を解析します) 057 * 058 * ●Tag定義: 059 * <og:jsChartV3 060 * chartType ○【TAG】チャートの種類(type属性)を指定します[line/bar/radar/polarArea/pie/doughnut/bubble/scatter](必須) 061 * horizontalBar 廃止 → indexAxis="y" 指定verticalLine 相当の表示も indexAxis="y" 指定 062 * labelColumn ○【TAG】ラベルのカラム名(data:labels属性)を指定します(表示名称) (必須) 063 * id 【TAG】canvasタグのidを指定します (初期値:hybscanvas) 064 * height 【TAG】チャート(canvasタグ)の高さを指定します (初期値:400px) 065 * width 【TAG】チャート(canvasタグ)の幅を指定します (初期値:400px) 066 * minLabelWidth 【TAG】ラベルのカラム(データの枠)の最小幅を指定します 8.3.1.0 (2022/10/14) 067 * plugins 【TAG】プラグイン定義された関数を指定します(plugins) 6.9.9.2 (2018/09/18) 068 * =================== options: 以下の属性 069 * (V3) indexAxis 【TAG】"y" を指定することで、horizontalBar や verticalLine を実現する(options:indexAxis) 8.0.0.0 (2021/08/31) 新規追加 070 * barWidthPer 【TAG】棒線の横幅を指定します (初期値:0.8, typeがbar の場合に有効)(option:categoryPercentage) 071 * animation 【TAG】簡易的にアニメーションのON/OFFを設定(true/false)します (初期値:null=true)(options:animation) 072 * onClick 【TAG】チャートクリック時のイベントを指定します(options:onClick) 073 * optOptions 【TAG】optionsの要素に、その他オプションを追加します 074 * =================== options:scales:x: 以下の属性 075 * xscaleType 【TAG】x軸のスケールタイプ[category/linear/time/realtime]を指定します(type[初期値:category]) 076 * xposition 【TAG】x軸の表示位置[top/right/bottom/left]を指定します (初期値:bottom)(position) 077 * xmax 【TAG】x軸の最大値を指定します(xscaleTypeがlinearの場合に有効)(max) 078 * xmin 【TAG】x軸の最小値を指定します(xscaleTypeがlinearの場合に有効)(min) 079 * xlabel 【TAG】x軸のラベルを指定します(title:text) 080 * xscaleCallback 【TAG】x軸コールバックを指定します(ticks:callback) 081 * xbeginAtZero 【TAG】x軸を0から書き始まるかどうか(xscaleTypeがlinearの場合に有効) (beginAtZero[初期値:null(=false)]) 082 * xstepSize 【TAG】x軸のメモリ幅を指定します(xscaleTypeがlinearの場合に有効)(ticks:stepSize) 083 * optAxis 【TAG】その他options:scales:x のオプションを追加します 084 * optTicks 【TAG】その他options:scales:x:ticksのオプションを追加します 085 * (V3) optTitle 【TAG】その他options:scales:x:titleのオプションを追加します 8.0.0.0 (2021/08/31) 新規追加 086 * (V3) optGrid 【TAG】その他options:scales:x:gridのオプションを追加します 8.0.0.0 (2021/08/31) 新規追加 087 * =================== options:scales:x:time: 以下の属性(xscaleTypeがtimeの場合に有効) 088 * timeUnit 【TAG】x軸のタイムの単位[year/quarter/month/week/day/hour/minute/second/millisecond]を指定(unit)します(指定しない場合は自動) 089 * timeUnitStepSize 【TAG】x軸のタイムの単位幅を指定します(stepSize) 090 * (V3) timeParser 【TAG】x軸の設定するタイム(入力データ)のフォーマットを指定します ・・・ 廃止 → time.parser になったが使い方不明 8.0.0.0 (2021/08/31) 新規追加 091 * timeLblFormat 【TAG】x軸の表示するタイムのフォーマットを指定します(time:displayFormats:year~secondまで同じ値を設定) → displayFormats 092 * tooltipFormat 【TAG】時間のツールチップに使用するフォーマット(tooltipFormat) 093 * =================== options:plugins: 以下の属性 094 * title 【TAG】タイトル、またはタイトル要素を指定します(title:text) 095 * titlePosition 【TAG】タイトルの表示位置[top/right/bottom/left]を指定します(title:position:初期値 top) 096 * legendDisplay 【TAG】凡例を表示するか[true/false]を指定します(legend:display) 097 * legendPosition 【TAG】凡例の表示位置[top/right/bottom/left]を指定します(legend:position) 098 * usePointStyle 【TAG】凡例のスタイル属性を使用するかどうか[true/false]を指定します(legend:labels:usePointStyle) 099 * (V3) optPlugins 【TAG】options:pluginsの要素に、その他オプションを追加します 100 * (V3) optTooltip 【TAG】options:plugins:tooltip の要素に、その他オプションを追加します 101 * (V3) optLegend 【TAG】options:plugins:legend の要素に、その他オプションを追加します 102 * =================== options:plugins:annotation:annotations:(CSVで指定した分のline0): 以下の属性 103 * markValues 【TAG】y軸に横マーカーラインの設定値をCSV形式で複数指定します(yMin:値,yMax:値) 104 * markColors 【TAG】y軸に横マーカーラインの色をCSV形式で複数指定します(borderColor) 105 * markLbls 【TAG】y軸に横マーカーラインのラベルをCSV形式で複数指定します(未指定時はラベルを表示しません)(label:content) 106 * markAdjust 【TAG】y軸に横マーカーラインのラベル表示位置の上(-)下(+)方向を調整します(yAdjust:初期値 -6) 107 * xmarkLbls 【TAG】x軸に横マーカーラインのラベルをCSV形式で複数指定します(未指定時はラベルを表示しません)(label:content) 108 * xmarkValues 【TAG】x軸に縦マーカーラインの設定値をCSV形式で複数指定します(xMin:値,xMax:値) 109 * xmarkColors 【TAG】x軸に縦マーカーラインの色をCSV形式で複数指定します 7.0.1.1 (2018/10/22) 110 * markWidth 【TAG】x軸,y軸全マーカーライン共通のラインの幅を指定します(borderWidth:初期値 2) 7.0.1.1 (2018/10/22) 111 * markDash 【TAG】x軸,y軸全マーカーライン共通のラインに点線を指定([5,2]など)します:(borderDash:初期値 null) 7.0.1.1 (2018/10/22) 112 * markFontSize 【TAG】x軸,y軸全マーカーライン共通のラベルのフォントサイズを指定します:(label:font:size:初期値 10) 113 * =================== options:plugins:zoom: 以下の属性 114 * useZoom 【TAG】WheelZoom処理を使用するかどうか[true/false]を指定します(options:plugins:zoom:zoom:) 115 * useDragZoom 【TAG】DragZoom処理を使用するかどうか[true/false]を指定します(options:plugins:zoom:zoom:) 116 * =================== 117 * useZeroDataOmit 【TAG】データが0の場合、使用しない(除外する)かどうかを指定します[true:0データを除外する] (初期値:false) 118 * useRenderer 【TAG】データ出力でレンデラを利用するかどうか[true/false]を指定します (初期値:false) 119 * sortColumn 【TAG】検索結果をこのカラムでソートしなおします (初期値:null) 120 * valueQuot 【TAG】値の前後にクオートをはさむかどうか[true/false]指定します 121 * varColumns 【TAG】TableModelの指定のカラムをconstの配列変数として出力します 7.0.1.2 (2018/11/04) 122 * =================== 123 * optChart 【廃止】chartの属性に、TLDで未定義の属性を追加します 8.0.0.0 (2021/08/31) 廃止(代替えはありません) 124 * optScaleLabel 【廃止】optTitle を使用してください(旧 scaleLabel) 8.0.0.0 (2021/08/31) 廃止 125 * optGridLines 【廃止】optGrid を使用してください(旧 gridLines) 8.0.0.0 (2021/08/31) 廃止 126 * timeMax 【廃止】廃止 → xmaxを使用してください 8.0.0.0 (2021/08/31) 廃止 127 * timeMin 【廃止】廃止 → xminを使用してください 8.0.0.0 (2021/08/31) 廃止 128 * timeSetFormat 【廃止】廃止 → timeParserを使用してください 8.0.0.0 (2021/08/31) 廃止 129 * =================== 130 * tableId 【TAG】(通常は使いません)sessionから所得する DBTableModelオブジェクトの ID 131 * scope 【TAG】キャッシュする場合のスコープ[request/page/session/application]を指定します (初期値:session) 132 * caseKey 【TAG】このタグ自体を利用するかどうかの条件キーを指定します (初期値:null) 133 * caseVal 【TAG】このタグ自体を利用するかどうかの条件値を指定します (初期値:null) 134 * caseNN 【TAG】指定の値が、null/ゼロ文字列 でない場合(Not Null=NN)は、このタグは使用されます (初期値:判定しない) 135 * caseNull 【TAG】指定の値が、null/ゼロ文字列 の場合は、このタグは使用されます (初期値:判定しない) 136 * caseIf 【TAG】指定の値が、true/TRUE文字列の場合は、このタグは使用されます (初期値:判定しない) 137 * debug 【TAG】デバッグ情報を出力するかどうか[true/false]を指定します (初期値:false) 138 * > ... Body ... 139 * </og:jsChartV3> 140 * 141 * ●使用例 142 * <og:jsChartV3 143 * chartType = "[line/bar/radar/polarArea/pie/doughnut/bubble/scatter]" 144 * labelColumn = "LDATA" 145 * id = "hybscanvas" 146 * height = "400px" 147 * width = "400px" 148 * title = "タイトル" または "{display:true,text:'タイトル',color:'blue',font:{size:15},}" 形式 149 * titlePosition = "top" [top/right/bottom/left] 150 * xlabel = "名称" 151 * legendPosition = "right" [top/right/bottom/left] 152 * legendDisplay = "true" [true/false] 153 * xsclaeCallback = "function(value){return value + ' 様';}" 154 * xscaleType = "linear" 155 * xmax = "1000000" 156 * xmin = "100000" 157 * xstepSize = "10000" 158 * barWidthPer = "0.4" 159 * > 160 * <og:jsChartDataV3 ... /> 161 * </og:jsChartV3> 162 * 163 * @og.rev 8.0.0.0 (2021/08/31) Ver3対応 大幅見直し 164 * @og.group 画面表示 165 * 166 * @version 8.0 167 * @author Kazuhiko Hasegawa 168 * @since JDK11.0 169 */ 170public class JsChartV3Tag extends CommonTagSupport { 171 /** このプログラムのVERSION文字列を設定します。{@value} */ 172 private static final String VERSION = "8.3.1.0 (2022/10/14)" ; 173 private static final long serialVersionUID = 831020221014L ; 174 175 private static final String IE_CHECK 176 = "<script>{" 177 + "let userAgent = window.navigator.userAgent.toLowerCase();" + CR 178 + "if(userAgent.indexOf('msie') != -1 ||" + CR 179 + " userAgent.indexOf('trident') != -1 ) {" + CR 180 + " document.write('Internet Explorer では表示できません<br />');" + CR 181 + "}}</script>" + CR ; 182 183 /** chartType 引数に渡す事の出来る タイプ 折れ線 {@value} */ 184 public static final String CTYPE_LINE = "line"; 185 /** chartType 引数に渡す事の出来る タイプ 棒線 {@value} */ 186 public static final String CTYPE_BAR = "bar"; 187// /** chartType 引数に渡す事の出来る タイプ 横棒線 {@value} */ 188// public static final String CTYPE_HBAR = "horizontalBar"; 189 /** chartType 引数に渡す事の出来る タイプ レイダー {@value} */ 190 public static final String CTYPE_RADAR = "radar"; 191 /** chartType 引数に渡す事の出来る タイプ ポーラエリア {@value} */ 192 public static final String CTYPE_POLAR = "polarArea"; 193 /** chartType 引数に渡す事の出来る タイプ 円 {@value} */ 194 public static final String CTYPE_PIE = "pie"; 195 /** chartType 引数に渡す事の出来る タイプ ドーナツ {@value} */ 196 public static final String CTYPE_DOUGHNUT = "doughnut"; 197 /** chartType 引数に渡す事の出来る タイプ バブル {@value} 8.0.0.0 (2021/08/20) 追加 */ 198 public static final String CTYPE_BUBBLE = "bubble"; 199 /** chartType 引数に渡す事の出来る タイプ 散乱図 {@value} 8.0.0.0 (2021/08/20) 追加 */ 200 public static final String CTYPE_SCATTER = "scatter"; 201 202 /** chartType 引数に渡す事の出来る タイプ リスト {@value} */ 203 private static final Set<String> CTYPE_SET 204 = new ArraySet<>( CTYPE_LINE,CTYPE_BAR,CTYPE_RADAR,CTYPE_POLAR, 205 CTYPE_PIE,CTYPE_DOUGHNUT,CTYPE_BUBBLE,CTYPE_SCATTER ); 206 207 // 6.9.9.4 (2018/10/01) String配列から、Set に変更 208 /** chartType が円形のリスト */ 209 private static final Set<String> SET_CI_TYPE = new ArraySet<>( CTYPE_RADAR, CTYPE_POLAR, CTYPE_PIE, CTYPE_DOUGHNUT ); 210 211 private static final String TYPE_CATEGORY = "category"; 212 private static final String TYPE_LINEAR = "linear"; 213 private static final String TYPE_TIME = "time"; 214 private static final String TYPE_REALTIME = "realtime"; // 7.0.1.2 (2018/11/04) 215 216 private static final Set<String> SET_POSITION = new ArraySet<>("top","right","bottom","left"); 217 private static final Set<String> SET_TIMEUNIT = new ArraySet<>("year","quarter","month","week","day","hour","minute","second","millisecond"); // 8.0.0.0 (2021/08/31) 218 private static final Set<String> SET_XSCALE = new ArraySet<>( TYPE_CATEGORY, TYPE_TIME, TYPE_LINEAR, TYPE_REALTIME ); 219 private static final Set<String> SET_BOOLEAN = new ArraySet<>( "true", "false" ); 220 221 private static final String CANVAS_NAME = "hybscanvas"; 222 223 private static final String MARK_DEF_ADJUST = "-6"; // 6.8.5.0 (2018/01/09) y軸に横マーカーラインの位置調整の初期値 224 225 // 7.0.1.3 (2018/11/12) バッファキー検索処理追加 226 // 8.0.0.0 (2021/08/31) Moment.js の依存関係が切れ、openGionV8では、date-fns を使用します。 227 private static final String TIME_FORMAT_JA = "{year:'yyyy年',quarter:'yyyy年M月',month:'yyyy年M月',week:'M月d日',day:'M月d日',hour:'d日 h時',minute:'h時m分',second:'m分s秒'}" ; 228 private static final String TIME_FORMAT = "{year:'yyyy',quarter:'yyyy/M',month:'yyyy/M',week:'M/d',day:'M/d',hour:'d HH',minute:'HH:mm',second:'HH:mm:ss'}" ; 229 230 // 7.0.1.3 (2018/11/12) true/false なので、記号化します。 231 private static final boolean USE_QUOTE = false; 232 private static final boolean NO_QUOTE = true; // IS_NUMBER か、!USE_QUOTE か、 233 234 // JSON形式をそれなりに成形するためのタブと改行 235 private static final String[] CR_TAB = new String[10] ; 236 static { 237 final StringBuilder tabs = new StringBuilder().append( CR ); 238 for( int i=0; i<CR_TAB.length; i++ ) { 239 CR_TAB[i] = tabs.toString(); 240 tabs.append( '\t' ); 241 } 242 } 243 244 private static final String WHEEL_ZOOM = "zoom:{zoom:{mode:'xy',wheel:{enabled:true,},pinch:{enabled:true,},},pan:{mode:'xy',enabled:true,},}," ; 245 private static final String DRAG_ZOOM = "zoom:{zoom:{drag:{enabled:true,borderColor:'rgb(54,162,235)',borderWidth:1,backgroundColor:'rgba(54,162,235,0.3)',},},pan:{mode:'xy',enabled:true,modifierKey:'ctrl',},},"; 246 247 // 変数宣言 248 // 6.9.8.0 (2018/05/28) FindBugs:直列化可能クラスの非 transient で非直列化可能なインスタンスフィールド 249 private final transient List<JsChartDataV3> jsChartData = new ArrayList<JsChartDataV3>() ; // 6.7.5.0 (2017/03/10) jsChartDataのリスト 250 251 private transient JsChartDataV3 jsXAxis = new JsChartDataV3(); // xAxes の設定用(datasetは使いません) 252 253 private String chartBody ; // チャートタグのBODY部分に書かれた文字列 254 255 private String chartType ; // チャートタイプ(必須) 256 private String labelColumn ; // ラベルカラム(必須) 257 private String indexAxis ; // horizontalBarや、verticalLine を実現 8.0.0.0 (2021/08/31) 258 private String id ; // canvasタグのid 259 private String height = "400px"; // canvasタグのheight 260 private String width = "400px"; // canvasタグのwidth 261 private String minLabelWidth ; // 8.3.1.0 (2022/10/14) ラベルのカラムの最小幅 262 private String title ; // タイトル 263 private String titlePosition = "top"; // タイトル位置 264 private String legendPosition ; // 凡例位置 265 private String legendDisplay ; // 凡例表示フラグ 266 private boolean usePointStyle ; // 6.8.5.0 (2018/01/09) 点のスタイル属性を使用するかどうか (初期値:false) 267 private boolean useLegend ; // Legend関連属性(legendPosition,legendDisplay,usePointStyle) のどれかがセットされれば、true 268 private String barWidthPer = "0.8"; // 棒線の横幅(パーセント) 269 private String animation ; // 簡易的なアニメーションのON/OFF 270 private String onClick ; // クリックイベント 271 private String plugins ; // 6.9.9.2 (2018/09/18) プラグイン定義された関数を指定します 272 private String xscaleType = TYPE_CATEGORY; // x軸のスケールタイプ 273 private String xposition ; // x軸の表示位置[top/right/bottom/left] // 7.0.1.2 (2018/11/04) 274 private boolean valueQuot ; // 値の前後にクオートをはさむかどうか[true/false]指定します 275 private String tableId = HybsSystem.TBL_MDL_KEY; // テーブルid 276 private String markValues ; // 6.8.5.0 (2018/01/09) y軸に横マーカーラインの設定値をCSV形式で複数指定します 277 private String markColors ; // 6.8.5.0 (2018/01/09) y軸に横マーカーラインの色をCSV形式で複数指定します 278 private String markLbls ; // 6.8.5.0 (2018/01/09) y軸に横マーカーラインのラベルをCSV形式で複数指定します(未指定時はラベルを表示しません) 279 private String markAdjust ; // 6.8.5.0 (2018/01/09) y軸に横マーカーラインのラベル表示位置の上下方向を調整します (初期値:-6) 280 private String xmarkLbls ; // 8.0.0.0 (2021/09/30) x軸に横マーカーラインのラベルをCSV形式で複数指定 281 private String xmarkValues ; // 7.0.1.1 (2018/10/22) x軸に縦マーカーラインの設定値をCSV形式で複数指定します 282 private String xmarkColors ; // 7.0.1.1 (2018/10/22) x軸に縦マーカーラインの色をCSV形式で複数指定します 283 private String markWidth = "2"; // 7.0.1.1 (2018/10/22) マーカーライン共通のラインの幅を指定します:borderWidth(初期値:2) 284 private String markDash ; // 7.0.1.1 (2018/10/22) マーカーライン共通のラインに点線を指定([5,2]など)します:borderDash(初期値:null) 285 private String markFontSize = "10"; // 7.0.1.1 (2018/10/22) マーカーライン共通のラベルのフォントサイズを指定します:fontSize(初期値:10) 286 private boolean useZoom ; // 6.8.5.0 (2018/01/09) ズーム処理を使用するかどうか (初期値:false) 287 private boolean useDragZoom ; // 6.8.5.0 (2018/01/09) ズーム処理を使用するかどうか (初期値:false) 288 private String varColumns ; // 7.0.1.2 (2018/11/04) TableModelの指定のカラムをconstの配列変数として出力します 289// / * useVarCheck 【TAG】const定義するJavaScript変数に使用できるかどうか[true/false]指定します 290// private boolean useVarCheck ; // 8.0.0.0 (2021/09/30) JavaScript変数に使用できるかどうか[true/false]指定します 291 private boolean useZeroDataOmit ; // 6.7.7.0 (2017/03/31) データが0の場合、使用しない(除外する)かどうか 292 private boolean useRenderer ; // 6.7.9.0 (2017/04/28) useRenderer 追加 293 private String sortColumn ; // 6.8.0.0 (2017/06/02) 検索結果をこのカラムでソートしなおします (初期値:null) 294// private String optChart ; // 7.0.1.2 (2018/11/04) chartの属性に、TLDで未定義の属性を追加指定します 295 private String optOptions ; // 7.0.1.2 (2018/11/04) optionsの属性に、その他オプションを追加指定します 296 private String optPlugins ; // 8.0.0.0 (2021/09/30) options:pluginsの属性に、その他オプションを追加します 297 private String optTooltip ; // 8.0.0.0 (2021/09/30) options:plugins:tooltip の属性に、その他オプションを追加します 298 private String optLegend ; // 8.0.0.0 (2021/09/30) options:plugins:legend の属性に、その他オプションを追加します 299 300// private List<String> options = new ArrayList<>() ; // 8.0.0.0 (2021/08/31) optionsの属性に、オプションを追加設定します 301 302 /** 303 * デフォルトコンストラクター 304 * 305 * @og.rev 6.9.7.0 (2018/05/14) PMD Each class should declare at least one constructor 306 */ 307 public JsChartV3Tag() { super(); } // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。 308 309 /** 310 * タグリブオブジェクトをリリースします。 311 * キャッシュされて再利用されるので、フィールドの初期設定を行います。 312 * 313 * @og.rev 6.7.5.0 (2017/03/10) jsChartData属性の初期化もれ 314 * @og.rev 5.9.19.0 (2017/04/07) T.OTA 61200-170316-02 チャートサイズ・max・minの動的変更対応 315 * @og.rev 6.7.7.0 (2017/03/31) useZeroDataOmit属性の追加 316 * @og.rev 6.7.9.0 (2017/04/28) useRenderer 追加 317 * @og.rev 6.8.0.0 (2017/06/02) sortColumn 追加 318 * @og.rev 6.8.3.0 (2017/11/27) useEqValOmit属性の追加 319 * @og.rev 6.8.5.0 (2018/01/09) xbeginAtZero,ybeginAtZero,markValues,markColors,markLbls,markAdjust,rangeMin,rangeMax,usePointStyle属性の追加 320 * @og.rev 6.9.9.2 (2018/09/18) plugins,chartAttributes属性の追加 321 * @og.rev 6.9.9.3 (2018/09/25) xscaleType の time 属性廃止 322 * @og.rev 6.9.9.4 (2018/10/01) リニア対応,time 属性復活 323 * @og.rev 6.9.9.4 (2018/10/01) 7.0.1.0 (2018/10/15) time 属性修正、tooltipFormat属性の追加 324 * @og.rev 7.0.1.1 (2018/10/22) xmarkValues,xmarkColors属性の追加 325 * @og.rev 7.0.1.1 (2018/10/22) ylabelColor,y2label,y2labelColor属性の追加 326 * @og.rev 7.0.1.2 (2018/11/04) ylabelColor,y2label,y2labelColor属性の追加 327 * @og.rev 8.0.0.0 (2021/08/31) horizontalBar 廃止 → indexAxis="y" 指定 328 * @og.rev 8.3.1.0 (2022/10/14) ラベルのカラムの最小幅対応(minLabelWidth 属性追加)(問合・トラブル 0200009388) 329 */ 330 @Override 331 protected void release2() { 332 super.release2(); 333 jsChartData.clear(); // 6.7.5.0 (2017/03/10) 334 jsXAxis = new JsChartDataV3(); // xAxes の設定用(datasetは使いません) 335 336 chartBody = null; // 7.0.1.1 (2018/10/22) チャートタグのBODY部分に書かれた文字列 337 chartType = null; 338 id = null; 339 height = "400px"; 340 width = "400px"; 341 minLabelWidth = null; // 8.3.1.0 (2022/10/14) ラベルのカラムの最小幅 342 labelColumn = null; 343 indexAxis = null; // 8.0.0.0 (2021/08/31) 344 title = null; 345 titlePosition = "top"; 346 legendPosition = null; 347 legendDisplay = null; 348 usePointStyle = false; // 6.8.5.0 (2018/01/09) 点のスタイル属性を使用するかどうか 349 useLegend = false; // 7.0.1.1 (2018/10/22) Legend関連属性(legendPosition,legendDisplay,usePointStyle) のどれかがセットされれば、true 350 barWidthPer = "0.8"; 351 animation = null; // 8.0.0.0 (2021/08/31) 簡易的なアニメーションのON/OFF 352 onClick = null; 353 plugins = null; // 6.9.9.2 (2018/09/18) プラグイン定義された関数を指定します 354 xscaleType = TYPE_CATEGORY; 355 xposition = null; // 7.0.1.2 (2018/11/04) x軸の表示位置[top/right/bottom/left] 356 valueQuot = false; // 7.0.1.1 (2018/10/22) 値の前後にクオートをはさむかどうか[true/false]指定します 357 tableId = HybsSystem.TBL_MDL_KEY; 358 markValues = null; // 6.8.5.0 (2018/01/09) y軸に横マーカーラインの設定値をCSV形式で複数指定します 359 markColors = null; // 6.8.5.0 (2018/01/09) y軸に横マーカーラインの色をCSV形式で複数指定します 360 markLbls = null; // 6.8.5.0 (2018/01/09) y軸に横マーカーラインのラベルをCSV形式で複数指定します(未指定時はラベルを表示しません) 361 markAdjust = null; // 6.8.5.0 (2018/01/09) y軸に横マーカーラインのラベル表示位置の上下方向を調整します (初期値:-6) 362 xmarkLbls = null; // 8.0.0.0 (2021/09/30) x軸に横マーカーラインのラベルをCSV形式で複数指定 363 xmarkValues = null; // 7.0.1.1 (2018/10/22) x軸に縦マーカーラインの設定値をCSV形式で複数指定します 364 xmarkColors = null; // 7.0.1.1 (2018/10/22) x軸に縦マーカーラインの色をCSV形式で複数指定します 365 markWidth = "2"; // 7.0.1.1 (2018/10/22) マーカーライン共通のラインの幅を指定します:borderWidth(初期値:2) 366 markDash = null; // 7.0.1.1 (2018/10/22) マーカーライン共通のラインに点線を指定([5,2]など)します:borderDash(初期値:null) 367 markFontSize = "10"; // 7.0.1.1 (2018/10/22) マーカーライン共通のラベルのフォントサイズを指定します:fontSize(初期値:10) 368 useZoom = false; // 6.8.5.0 (2018/01/09) ズーム処理を使用するかどうか (初期値:false) 369 useDragZoom = false; // 6.8.5.0 (2018/01/09) ズーム処理を使用するかどうか (初期値:false) 370 varColumns = null; // 7.0.1.2 (2018/11/04) TableModelの指定のカラムをconstの配列変数として出力します 371// useVarCheck = false; // 8.0.0.0 (2021/09/30) JavaScript変数に使用できるかどうか[true/false]指定します 372 useZeroDataOmit = false; // 6.7.7.0 (2017/03/31) データが0の場合、使用しない(除外する)かどうか 373 useRenderer = false; // 6.7.9.0 (2017/04/28) useRenderer 追加 374 sortColumn = null; // 6.8.0.0 (2017/06/02) 検索結果をこのカラムでソートしなおします (初期値:null) 375// optChart = null; // 7.0.1.2 (2018/11/04) chartの属性に、TLDで未定義の属性を追加指定します 376 optOptions = null; // 7.0.1.2 (2018/11/04) optionsの属性に、その他オプションを追加指定します 377 optPlugins = null; // 8.0.0.0 (2021/09/30) options:pluginsの属性に、その他オプションを追加します 378 optTooltip = null; // 8.0.0.0 (2021/09/30) options:plugins:tooltip の属性に、その他オプションを追加します 379 optLegend = null; // 8.0.0.0 (2021/09/30) options:plugins:legend の属性に、その他オプションを追加します 380 } 381 382 /** 383 * Taglibの開始タグが見つかった時に処理する doStartTag() を オーバーライドします。 384 * 385 * @og.rev 6.7.5.0 (2017/03/10) タグの使用を決める共通属性の追加 386 * 387 * @return 後続処理の指示 388 */ 389 @Override 390 public int doStartTag() { 391 if( !useTag() ) { return SKIP_BODY ; } // 6.7.5.0 (2017/03/10) 392 393 return EVAL_BODY_BUFFERED; // Bodyを評価する 394 } 395 396 /** 397 * Taglibのタグ本体を処理する doAfterBody() を オーバーライドします。 398 * 399 * @og.rev 7.0.1.1 (2018/10/22) このスクリプトの中に入れたい文字があれば、登録できるようにします。 400 * 401 * @return 後続処理の指示(SKIP_BODY) 402 */ 403 @Override 404 public int doAfterBody() { 405 chartBody = getBodyString(); 406 407 if( chartBody != null ) { 408 chartBody = chartBody.trim(); 409 } 410 411 return SKIP_BODY ; 412 } 413 414 /** 415 * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。 416 * 417 * @og.rev 6.7.5.0 (2017/03/10) タグの使用を決める共通属性の追加 418 * @og.rev 6.9.9.4 (2018/10/01) idの振り方、データの持ち方変更 419 * @og.rev 8.0.0.0 (2021/08/31) エラーメッセージを画面に返します。 420 * 421 * @return 後続処理の指示 422 */ 423 @Override 424 public int doEndTag() { 425 debugPrint(); 426 if( !useTag() ) { return EVAL_PAGE ; } // 6.7.5.0 (2017/03/10) 427 428 id = (id==null ? tableId : id ); // 6.9.9.4 (2018/10/01) id指定なしの場合はtableId 429 430 // jsChart出力 431 jspPrint( jsChartOutput() ); 432 433 // 8.0.0.0 (2021/08/31) エラーメッセージを画面に表示する。 434 final StringBuilder errBuf = new StringBuilder( BUFFER_MIDDLE ); 435 final String axisErr = jsXAxis.getErrorMessage(); 436 if( !axisErr.isEmpty() ) { 437 errBuf.append( "X軸の設定でエラーがあります" ).append( CR ) 438 .append( axisErr ).append( CR ); 439 } 440 441 // jsChartDataタグの変数宣言 442 for( int i=0; i<jsChartData.size(); i++ ) { 443 final String dataErr = jsChartData.get(i).getErrorMessage(); 444 if( !dataErr.isEmpty() ) { 445 errBuf.append( "Y軸[" ).append( i ) .append( "]の設定でエラーがあります" ).append( CR ) 446 .append( dataErr ).append( CR ); 447 } 448 } 449 450 if( errBuf.length() > 0 ) { // 一応、設定されているかどうか確認する。 451 errBuf.insert( 0,"<pre>" ).append( "</pre>" ); 452 jspPrint( errBuf.toString() ); 453 } 454 455 return EVAL_PAGE; 456 } 457 458 /** 459 * jsChart出力用 460 * jsChartTag と jsChartData を使用して、jsChart情報を出力します。 461 * 462 * @og.rev 5.9.19.0 (2017/04/07) T.OTA 61200-170316-02 チャートサイズ・max・minの動的変更対応 463 * @og.rev 6.7.7.0 (2017/03/31) チャートデータで、ゼロ、null カラムを非表示にします。 464 * @og.rev 6.7.9.0 (2017/04/28) useRenderer 追加 465 * @og.rev 6.8.0.0 (2017/06/02) sortColumn 追加 466 * @og.rev 6.8.3.0 (2017/11/27) useZeroDataOmit属性で、nullOmit属性もセットします。 467 * @og.rev 6.8.3.0 (2017/11/27) useEqValOmit属性の追加 468 * @og.rev 6.8.3.1 (2017/12/01) 不要なデータを出力しないようにします。 469 * @og.rev 5.9.27.0 2017/12/01 T.OTA 61200-170831-04 max,minの小数点対応 470 * @og.rev 6.8.5.0 (2018/01/09) xbeginAtZero,ybeginAtZero,markValues,markColors,markLbls,markAdjust,rangeMin,rangeMax,usePointStyle属性の追加 471 * @og.rev 6.9.9.2 (2018/09/18) chart.jsが2.4.0から2.7.2にバージョンアップにより、廃止された属性対応 472 * @og.rev 6.9.9.2 (2018/09/18) plugins,chartAttributes属性の追加 473 * @og.rev 6.9.9.3 (2018/09/25) xscaleType の time 属性廃止。 474 * @og.rev 6.9.9.4 (2018/10/01) リニア対応,time 属性復活 475 * @og.rev 6.9.9.4 (2018/10/01) idの振り方、データの持ち方変更 476 * @og.rev 7.0.1.1 (2018/10/22) xmarkValues,xmarkColors属性の追加 477 * @og.rev 7.0.1.3 (2018/11/12) バッファキー検索処理追加、markColors,xmarkColors属性に、VIVID,PASTELカラー指定に対応します。 478 * @og.rev 8.0.0.0 (2021/08/31) BUBBLEとSCATTERの追加 479 * @og.rev 8.0.0.0 (2021/08/31) horizontalBar 廃止 → indexAxis="y" 指定 480 * @og.rev 8.3.1.0 (2022/10/14) ラベルのカラムの最小幅対応(minLabelWidth 属性追加)(問合・トラブル 0200009388) 481 * 482 * @return jsChert用文字列 483 */ 484 private String jsChartOutput() { 485// // 各JavaScriptの変数名 486// final String cd = "cd_" + id; //chartData 487// final String myChart = "chart_"+id; 488 489 // JSON形式でテーブル情報を取得 490 // テーブル情報の取得 491 // 6.8.0.0 (2017/06/02) sortColumn 追加 492 DBTableModel table = (DBTableModel)getObject( tableId ) ; 493 if( StringUtil.isNotNull( sortColumn ) ) { // 6.8.5.0 (2018/01/09) 494 final int clmNo = table.getColumnNo( sortColumn ); // エラーを出す 495 496 final DBTableModelSorter temp = new DBTableModelSorter(); 497 temp.setModel( (DBTableModel)getObject( tableId ) ); 498 temp.sortByColumn( clmNo,true ); // 順方向のソート 499 table = temp; 500 } 501 502 final int rowCount = table.getRowCount(); // 6.9.2.0 (2018/03/05) 503 504 // 7.0.1.3 (2018/11/12) DBTableModelに存在しないカラムのChartDataは無視します。 505 // これは、動的にグラフを生成する場合に、カラムの増減に合わせて、JsChartDataV3Tagを生成しなおすのが手間だからです。 506 final Iterator<JsChartDataV3> itr = jsChartData.iterator(); // 個々のグラフ 507 while( itr.hasNext() ) { 508 final JsChartDataV3 jcData = itr.next(); 509 final String chtClm = jcData.getChartColumn(); 510 final int clmNo = table.getColumnNo( chtClm ); // エラーを出す 511 512 if( clmNo < 0 ) { 513 itr.remove(); // 7.0.1.3 (2018/11/12) カラムがDBTableModelに存在しない。 514 } 515 // ゼロデータを使用しない設定 516 else if( useZeroDataOmit ) { 517 // 6.8.3.1 (2017/12/01) ループ処理の判定は、ChartColumn のみでよい。 518 boolean isRemove = true; 519 for( int row=0; row<rowCount; row++ ) { 520 final String val = table.getValue( row,clmNo ); 521 if( StringUtil.isNotNull( val ) && !"0".equals( val ) && !"0.0".equals( val ) && !"0.00".equals( val ) ) { // 6.8.5.0 (2018/01/09) 522 isRemove = false; 523 break; // 判定処理打ち切り 524 } 525 } 526 527 if( isRemove ) { 528 itr.remove(); // 全てがゼロ、null カラムを削除します。 529 } 530 } 531 } 532 533 // 8.3.1.0 (2022/10/14) チャートの全体幅を自動設定 534 if( minLabelWidth != null ) { 535 // 全体幅(数字のみ抽出) 536 final int tWid = Integer.parseInt(width.replaceAll("\\D+","")); 537 // 最小幅(数字のみ抽出) × データ行数 538 final int mWid = Integer.parseInt(minLabelWidth.replaceAll("\\D+","")) * rowCount; 539 540 // 全体幅 ≧ 最小幅 × データ行数 ⇒ 全体幅 に設定 541 // 全体幅 < 最小幅 × データ行数 ⇒ 最小幅 × データ行数 が全体幅として設定 542 width = ( tWid >= mWid ? tWid : mWid ) + "px"; 543 } 544 545 // 6.8.3.1 (2017/12/01) 不要なデータを出力しないようにします。 546 final int clmSize = jsChartData.size(); // JsChartV3Tag の 値部分のみの配列 547 548 final String[] clmNms = new String[clmSize]; // 6.9.9.4 (2018/10/01) カラム名の配列 549 final int[] clmNos = new int[clmSize]; 550 final int lblNos = table.getColumnNo( labelColumn ); // エラーを出す 551 final DBColumn dbClm = table.getDBColumn( lblNos ); // 6.9.2.0 (2018/03/05) 552 553 // jsChartDataタグの変数宣言 554 for( int j=0; j<clmSize; j++ ) { 555 final String chtClm = jsChartData.get(j).getChartColumn(); 556// clmNms[j] = chtClm; // 6.9.9.4 (2018/10/01) カラム名の配列 8.0.0.0 (2021/09/30) Delete 557 clmNos[j] = table.getColumnNo( chtClm ); // エラーを出す 558 559 final String clmRnm = "CLM" + j; // 8.0.0.0 (2021/09/30) JavaScript変数名対応 560 jsChartData.get(j).setChartColumn(clmRnm); 561 clmNms[j] = clmRnm; 562 } 563 564 // 8.0.0.0 (2021/08/31) chartJs V3 以降は、timeもrealtimeも表示するようになった…らしい 565 final StringBuilder rtn = new StringBuilder( BUFFER_MIDDLE ) 566 .append( IE_CHECK ) // IE 警告 567 .append( "<canvas class=\"" ).append( CANVAS_NAME ) // canvasタグの設定 568 .append( "\" id=\"" ).append( id ) 569 .append( "\" width=\"" ).append( width ) 570 .append( "\" height=\"" ).append( height ) 571 .append( "\"><!-- --></canvas>" ).append( CR ) 572 .append( "<script>{" ).append( CR ) // 8.0.0.0 (2021/08/31) スコープ限定の '{' を追加 573 .append( chartBody ); // 7.0.1.1 (2018/10/22) BODY部分の文字列の組み込み 574 575 final boolean isXcateType = TYPE_CATEGORY.equals( xscaleType ); // 6.9.9.4 (2018/10/01) 576 final boolean isXlinerType = TYPE_LINEAR.equals( xscaleType ); // 6.8.5.0 (2018/01/09) xscaleType が linear かどうか 577 final boolean isXtimeType = TYPE_TIME.equals( xscaleType ); // 6.8.5.0 (2018/01/09) xscaleType が time かどうか 578 579 // 7.0.1.3 (2018/11/12) const 変数に設定する配列情報を、bufに追加します。 580 final DBTableModel fcTable = table; // ラムダ式で使えるのは、final宣言された変数のみ。根本は、Sorterを組み込んでfinalすべき。 581 final IntFunction<String> lcFunc = (row) -> { 582 final String lval = fcTable.getValue( row,lblNos ); 583 return useRenderer && !isXlinerType 584 ? StringUtil.jsonFilter( dbClm.getRendererValue(row,lval) ) : lval ; 585 }; 586 setVarArray( rtn,labelColumn,rowCount,isXcateType || isXtimeType || useRenderer,lcFunc ); 587 588 // 6.9.9.4 (2018/10/01) データ部の出力 589 for( int j=0; j<clmSize; j++ ) { 590 final int clmNo = clmNos[j]; // finalしか参照できないため 591 setVarArray( rtn,clmNms[j],rowCount,valueQuot,(row) -> fcTable.getValue( row,clmNo ) ); 592 } 593 594 // x軸がlinearスケールの場合 595 // [{x:値1,y:値2},{x:値1,y:値2},・・・] 形式のデータが必要 596 if( isXlinerType ) { 597 for( int j=0; j<clmSize; j++ ) { 598 final String chtClm = clmNms[j]; 599 rtn.append( "const LI_" ).append( chtClm ).append( "=[];" ).append( CR ); 600 601 // 6.9.9.4 (2018/10/01) x軸がlinearスケールの場合、カラム名が、変わるので、再設定している。(超特殊処理) 602 jsChartData.get(j).setChartColumn( "LI_" + chtClm ); 603 } 604 605 rtn.append( "for(var i=0; i<").append( labelColumn ).append( ".length; i++){" ); 606 for( int j=0; j<clmSize; j++ ) { 607 final String chtClm = clmNms[j]; 608 // {x:ラベル, y:値}の形式で値を設定 609 rtn.append( "LI_" ).append( chtClm ).append( "[i]={x:" ).append( labelColumn ) 610 .append( "[i],y:" ).append( chtClm ).append( "[i]};" ); 611 } 612 rtn.append( "};" ).append( CR ); 613 } 614 615 // 7.0.1.2 (2018/11/04) varColumns 追加 616 final String[] varClms = StringUtil.csv2Array( varColumns ); // 独自に出力しておきたいカラム列の値 617 for( int j=0; j<varClms.length; j++ ) { 618 final int varNos = table.getColumnNo( varClms[j] ); // エラーを出す 619 final boolean isNumType = table.getDBColumn( varNos ).isNumberType(); // 6.4.6.0 (2016/05/27) 620 621 setVarArray( rtn,varClms[j],rowCount,!isNumType,(row) -> fcTable.getValue( row,varNos ) ); 622 } 623 624 // 8.0.0.0 (2021/08/31) BUBBLEとSCATTERの追加 625 // chartType が BUBBLE の場合、chtClmが x:、varColumns の最初が、y: 次が r: になる 626 // SCATTERの場合は、r: がないだけ 627 if( CTYPE_BUBBLE.equals( chartType ) || CTYPE_SCATTER.equals( chartType ) ) { 628 if( CTYPE_BUBBLE.equals( chartType ) && varClms.length < 2 || 629 CTYPE_SCATTER.equals( chartType ) && varClms.length < 1 ) { 630 final StringBuilder errMsg = new StringBuilder( BUFFER_MIDDLE ) 631 .append( "chartTypeが、" ).append( chartType ) 632 .append( "の場合は、varColumns で、y: データ、r:データを指定してください。" ); 633 throw new HybsSystemException( errMsg.toString() ); 634 } 635 636 final String chtClm = clmNms[0]; // chartDataの1個目決め打ち 637 rtn.append( "const LI_" ).append( chtClm ).append( "=[];" ).append( CR ); 638 639 // x軸が[{x: , y: , r: }…} のカラム名が変わるので、再設定している。(超特殊処理) 640 jsChartData.get(0).setChartColumn( "LI_" + chtClm ); 641 642 rtn.append( "for(var i=0; i<").append( chtClm ).append( ".length; i++){" ) 643 .append( "LI_" ).append( chtClm ).append( "[i]={x:" ).append( chtClm ) 644 .append( "[i],y:" ).append( varClms[0] ); 645 646 // 切れ切れで分かりにくいかもしれないが、BUBBLEのみ、r: を出す 647 if( CTYPE_BUBBLE.equals( chartType ) ) { 648 rtn.append( "[i],r:" ).append( varClms[1] ); 649 } 650 651 rtn.append( "[i]};}" ).append( CR ); 652 } 653 654 // ================================================================================== 655 // 7.0.1.1 (2018/10/22) jsChartData(X軸)の設定 656 if( !SET_CI_TYPE.contains( chartType ) ) { 657 jsXAxis.setId( "x0" ); // X軸のid 658 jsXAxis.setUseTime( isXtimeType ); // x軸の時間表示を使用するかどうか 659 660 // 7.0.1.3 (2018/11/12) バッファキー検索処理追加 661 if( isXtimeType && !jsXAxis.contains( JsChartDataV3.TIME , "displayFormats" ) ) { // キーワードが無ければ追加 662 // ほんとはリソースに入れるべきでしょう 663 if( "ja".equalsIgnoreCase( getLanguage() ) ) { // 'ja' なら日本 664 jsXAxis.addTime( "displayFormats" , TIME_FORMAT_JA , NO_QUOTE ); // 標準タイムフォーマット適用。オブジェクトなので、クオートなし 665 } 666 else { 667 jsXAxis.addTime( "displayFormats" , TIME_FORMAT , NO_QUOTE ); // 標準タイムフォーマット適用。オブジェクトなので、クオートなし 668 } 669 } 670 671 // x軸にリニアスケールを設定した場合(これは残す) 672 final String xpos = xposition != null ? xposition 673 : isXlinerType ? "bottom" 674 : null ; // horizontalBar 廃止 675 jsXAxis.addAxis( "position" , xpos , USE_QUOTE ); // 文字 676 677 rtn.append( jsXAxis.getAxis() ).append( CR ); 678 } 679 680 // ================================================================================== 681 // jsChartData(Y軸)の設定 682 683 // 各JavaScriptの変数名 684 final String cd = "cd_" + id; //chartData 685 final String myChart = "chart_"+id; 686 687 // 7.0.1.1 (2018/10/22) data:dataset と、options:scales:yAxes: を変数化して出力します。 688 for( final JsChartDataV3 chData : jsChartData ) { 689 rtn.append( chData.getDataset( 'y' ) ).append( CR ) // 横棒線の場合は、'x'が、それ以外は、'y' 690 .append( chData.getAxis() ).append( CR ); 691 } 692 693 rtn.append( "const ").append( cd ).append( "={labels:" ).append( labelColumn ).append( ",datasets:[" ); 694 for( final JsChartDataV3 chData : jsChartData ) { 695 rtn.append( chData.getDatasetKey() ).append( ',' ); 696 } 697 rtn.append( "]};" ).append( CR ) 698 // jsChartの生成(グローバル変数定義の var) 699 .append( "var " ).append( myChart ).append( "=new Chart(" ).append( id ) 700 .append( ",{" ) 701 .append( CR_TAB[1] ).append( "type:'" ).append( chartType ).append( "'," ) 702 .append( CR_TAB[1] ).append( "data:" ).append( cd ).append( ',' ); 703 704 // 6.9.9.2 (2018/09/18) plugins,chartAttributes属性の追加 705 setProp( rtn, CR_TAB[1],"plugins:[" , plugins , "]," ); 706 707 rtn.append( CR_TAB[1] ).append( "options:{responsive:false," ); // レスポンシブ OFF 708 709 // 8.0.0.0 (2021/08/31) 710 setProp( rtn, CR_TAB[2],"indexAxis:'" , indexAxis , "'," ); // "y" を指定することで、horizontalBar や verticalLine を実現 711 setProp( rtn, CR_TAB[2],"categoryPercentage:" , barWidthPer , "," ); // 棒線の横幅 712 setProp( rtn, CR_TAB[2],"animation:" , animation , "," ); // 簡易的なアニメーションのON/OFFを設定 713 714 // クリックイベントの設定 715 // clickLink 変数を使用する場合、内部でマスタデータを使用します。キーとして、渡しておく必要があります。 716 setProp( rtn, CR_TAB[2],"onClick:function(event,obj){",CR_TAB[3], onClick,CR_TAB[2],"}," ); 717 718 // 8.0.0.0 (2021/08/31) options:plugins: 719 rtn.append( CR_TAB[2] ).append( "plugins:{" ); 720 721 setProp( rtn, CR_TAB[3], optPlugins , "," ); // 8.0.0.0 (2021/09/30) 属性はマージされる 722 setProp( rtn, CR_TAB[3],"tooltip:{" , optTooltip , "}," ); // 8.0.0.0 (2021/09/30) 723 724 // タイトル属性の設定(タイトル要素も処理できるように変更)) 725 if( title != null && title.length() > 0 ) { 726 if( title.charAt(0) == '{' ) { 727 rtn.append( CR_TAB[3] ).append( "title:" ).append( title ).append( ',' ); 728 } 729 else if( title.charAt(0) == '[' ) { 730 // タイトルに配列を渡すと、改行表示する。 731 setProp( rtn, CR_TAB[3],"title:{display:true,text:",title,",position:'", titlePosition, "',}," ); 732 } 733 else { 734 // タイトルを文字列として処理する。 735 setProp( rtn, CR_TAB[3],"title:{display:true,text:'",title,"',position:'", titlePosition, "',}," ); 736 } 737 } 738 739 // 凡例属性の設定( 740 if( useLegend ) { // 7.0.1.1 (2018/10/22) 741 rtn.append( CR_TAB[3] ).append( "legend:{" ); 742 setProp( rtn, optLegend , "," ); // 8.0.0.0 (2021/09/30) 属性はマージされる 743 setProp( rtn, "display:" , legendDisplay , "," ); 744 setProp( rtn, "position:'" , legendPosition , "'," ); 745 746 // 凡例のスタイルを、pointStyle にあわせるかどうか 747 if( usePointStyle ) { // 7.0.1.1 (2018/10/22) 748 rtn.append( "labels:{usePointStyle:true}," ); 749 } 750 rtn.append( "}," ); 751 } 752 753 // 8.0.0.0 (2021/08/31) zoom は、文法も変わり、options:plugins: 以下の属性になった。 754 // 6.8.5.0 (2018/01/09) ズーム処理を使用するかどうか 755 if( useZoom ) { // useZoom を優先する。 756 rtn.append( CR_TAB[3] ).append( WHEEL_ZOOM ); 757 } 758 else if( useDragZoom ) { 759 rtn.append( CR_TAB[3] ).append( DRAG_ZOOM ); 760 } 761 762 // 8.0.0.0 (2021/08/31) annotation は、options:plugins: 以下の属性になった。 763 final String[] mkVals = StringUtil.csv2Array( markValues ); // y軸の値で、横のマーカー 764 final String[] xmkVals = StringUtil.csv2Array( xmarkValues ); // x軸の値で、縦のマーカー 765 final int vCnt = mkVals.length; 766 final int xCnt = xmkVals.length; 767 if( vCnt > 0 || xCnt > 0 ) { 768 rtn.append( CR_TAB[3] ).append( "annotation:{annotations:{" ); // 8.0.0.0 (2021/08/31) 配列からオブジェクトへ 769 770 // 従来の markValues,markColors,markLbls,markAdjust 属性対応 771 if( vCnt > 0 ) { 772 final String[] mkLbls = StringUtil.csv2Array( markLbls , ',' , vCnt ); 773 final String[] mkAjst = StringUtil.csv2Array( markAdjust , ',' , vCnt , MARK_DEF_ADJUST ); 774 final String[] mkCols = colorCsv( markColors , vCnt ); // 7.0.1.3 (2018/11/12) 775 776 // 7.0.1.1 (2018/10/22) 'y-axis-0' → 'y0Ax' これは、JsChartDataV3#getAxisKey() で取得できる値だが、決め打ち 777 for( int i=0; i<vCnt; i++ ) { 778 rtn.append( CR_TAB[4] ).append( "yline" ).append(i).append( ":{" ) // V3で、名前付きになった。 779 .append( CR_TAB[5] ).append( "type:'line'," ); 780 setProp( rtn, "borderWidth:" , markWidth , "," ); 781 setProp( rtn, "borderDash:" , markDash , "," ); 782 setProp( rtn, "borderColor:'" , mkCols[i] , "'," ); 783 setProp( rtn, CR_TAB[5],"yMin:" , mkVals[i] , "," ); // V3 → V2 で、valueから、yMin,yMax に変更 784 setProp( rtn, "yMax:" , mkVals[i] , "," ); 785 if( !mkLbls[i].isEmpty() ) { 786 rtn.append( CR_TAB[5] ).append( "label:{" ) 787 .append( CR_TAB[6] ) 788 .append( "enabled:'true',position:'start',backgroundColor:'rgba(0,0,0,0)'," ) // position:left → start に変更 789 .append( CR_TAB[6] ); 790 setProp( rtn, "content:'" , mkLbls[i] , "'," ); 791 setProp( rtn, "color:'" , mkCols[i] , "'," ); 792 setProp( rtn, "yAdjust:" , mkAjst[i] , "," ); 793 setProp( rtn, CR_TAB[6],"font:{size:" , markFontSize , "}," ); // fontSize:XX → font:{size:XX} に変更 794 rtn.append( CR_TAB[5] ).append( "}," ); // label:{ 795 } 796 rtn.append( CR_TAB[4] ).append( "}," ); // type: 797 } 798 } 799 800 // 7.0.1.1 (2018/10/22) xmarkValues,markLbls,xmarkColors属性対応 801 if( xCnt > 0 ) { 802 final String[] xmkLbls = StringUtil.csv2Array( xmarkLbls , ',' , xCnt ); // 8.0.0.0 (2021/09/30) 803 final String[] xmkCols = colorCsv( xmarkColors , xCnt ); // 7.0.1.3 (2018/11/12) 804 805 // 7.0.1.1 (2018/10/22) 'x-axis-0' → 'x0Ax' これは、JsChartDataV3#getAxisKey() で取得できる値だが、決め打ち 806 for( int i=0; i<xCnt; i++ ) { 807 rtn.append( CR_TAB[4] ).append( "xline" ).append(i).append( ":{" ) 808 .append( CR_TAB[5] ).append( "type:'line'," ); // V3で、名前付きになった。 809 setProp( rtn, "borderWidth:" , markWidth , "," ); 810 setProp( rtn, "borderDash:" , markDash , "," ); 811 setProp( rtn, "borderColor:'" , xmkCols[i] , "'," ); 812 setProp( rtn, CR_TAB[5],"xMin:'" , xmkVals[i] , "'," ); // V3 → V2 で、valueから、xMin,xMax に変更 813 setProp( rtn, "xMax:'" , xmkVals[i] , "'," ); // カテゴリで文字列のケース有り 814 if( !xmkLbls[i].isEmpty() ) { // 8.0.0.0 (2021/09/30) 815 rtn.append( CR_TAB[5] ).append( "label:{" ) 816 .append( CR_TAB[6] ) 817 .append( "enabled:'true',position:'end',backgroundColor:'white'," ) // position:left → start に変更 818 .append( CR_TAB[6] ); 819 setProp( rtn, "content:'" , xmkLbls[i] , "'," ); 820 setProp( rtn, "color:'" , xmkCols[i] , "'," ); 821 setProp( rtn, CR_TAB[6],"font:{size:" , markFontSize , "}," ); // fontSize:XX → font:{size:XX} に変更 822 rtn.append( CR_TAB[5] ).append( "}," ); // label:{ 823 } 824 rtn.append( CR_TAB[4] ).append( "}," ); // type: 825 } 826 } 827 rtn.append( CR_TAB[3] ).append( "}}," ); // annotation:{annotations:{ 828 } 829 rtn.append( CR_TAB[2] ).append( "}," ); // plugins:{ 830 831 // 6.9.9.2 (2018/09/18) chart.jsが2.4.0から2.7.2にバージョンアップにより、廃止された属性対応 832 if( !SET_CI_TYPE.contains( chartType ) ) { 833 // 円形以外の場合はscales属性に設定 834 rtn.append( CR_TAB[2] ).append( "scales:{x:" ) 835 .append( jsXAxis.getAxisKey() ).append( ',' ); 836 837 // 7.0.1.1 (2018/10/22) options:scales:yAxes: を変数化して出力しているので、その設定のみでよい。 838 // 最初の一つだけ、"y:" を付ける(何か方法があるはず)。 839 boolean isFirst = true; 840 for( final JsChartDataV3 chData : jsChartData ) { 841 if( chData.isUseAxis() ) { 842 if( isFirst ) { rtn.append( "y:" ); isFirst=false; } 843 rtn.append( chData.getAxisKey() ).append( ',' ); 844 } 845 } 846 847 rtn.append( "}," ); // 7.0.1.1 (2018/10/22) 848 } 849 850 setProp( rtn, CR_TAB[2] , optOptions , "," ); // 7.0.1.2 (2018/11/04) 851 rtn.append( CR_TAB[1] ).append( "}," ) 852 .append( CR_TAB[0] ).append( "});" ).append( CR ); 853 854 // 8.0.0.0 (2021/08/31) zoom を使った場合は、ダブルクリックで元に戻す処理を入れておく 855 if( useZoom || useDragZoom ) { 856 rtn.append( "const cv_" ).append( id ).append( "=document.getElementById('" ) 857 .append( id ).append( "');" ).append( CR ) 858 .append( "cv_" ).append( id ).append( ".addEventListener( 'dblclick',function(){" ) 859 .append( myChart ) // Chart オブジェクト 860 .append( ".resetZoom();});" ).append( CR ); 861 } 862 863 rtn.append( "}</script>" ); // 8.0.0.0 (2021/08/31) スコープ限定の '}' を追加 864 865 return rtn.toString(); 866 } 867 868 /** 869 * 引数のすべての文字列が null か、長さゼロ文字列でない場合は、連結した結果を返します。 870 * 871 * @param buf ベースとなるStringBuilder 872 * @param str 連結対象の文字列群(可変長引数) 873 */ 874 private void setProp( final StringBuilder buf, final String... strs ) { 875 if( !StringUtil.isEmpty( strs ) ) { // null か、長さゼロ文字列が、一つもない場合 876 for( final String str : strs ) { 877 buf.append( str ); 878 } 879 } 880 } 881 882 /** 883 * const 変数に設定する配列情報を、bufに追加します。 884 * 885 * const 変数名が key で、cnt分の繰返しで、IntFunction を呼びます。 886 * isQuote=trueの場合は、前後にクォーテーションをつけます。 887 * 888 * @og.rev 7.0.1.3 (2018/11/12) const 変数に設定する配列情報を、bufに追加します。 889 * @og.rev 8.0.2.1 (2021/12/10) 空文字列の場合は、クォーテーションを付けない。 890 * 891 * @param buf ベースとなるStringBuilder 892 * @param key キー 893 * @param cnt ループする個数(通常は行数:rowCount) 894 * @param isQuote クォーテーションで括るかどうか [true:括る/false:括らない] 895 * @param func 数値を引数に取る関数型インタフェース 896 */ 897 private void setVarArray( final StringBuilder buf, final String key, final int cnt, 898 final boolean isQuote, final IntFunction<String> func ) { 899 buf.append( "const " ).append( key ).append( "=[" ); 900 for( int row=0; row<cnt; row++ ) { 901 final String val = nval( func.apply( row ),"" ); // null 文字列が append されるのを避ける 902 903 if( val.isEmpty() ) { // 8.0.2.1 (2021/12/10) 904 buf.append( ',' ); 905 } 906 else if( isQuote ) { 907 buf.append( '"' ).append( val ).append( "\"," ); 908 } 909 else { 910 buf.append( val ).append( ',' ); 911 } 912 } 913 buf.append( "];" ).append( CR ); 914 } 915 916 /** 917 * パラメータチェック用メソッド。 918 * 919 * @param trg ターゲット 920 * @param set 使用可能なキーワードのSet 921 * @param trgStr ターゲットの名称 922 */ 923 private void checkPara( final String trg, final Set<String> set, final String trgStr ) { 924 if( StringUtil.isNotNull( trg ) && !check( trg, set ) ) { // 6.8.5.0 (2018/01/09) 925 final StringBuilder errMsg = new StringBuilder( BUFFER_MIDDLE ) 926 .append( "指定の" ).append( trgStr ).append( "は指定できません。" ).append( CR ) 927 .append( trgStr ).append( "=[" ).append( trg ).append( ']' ).append( CR ) 928 .append( set ); // org.opengion.fukurou.util.ArraySet の toStringメソッド 929 throw new HybsSystemException( errMsg.toString() ); 930 } 931 } 932 933// /** 934// * JavaScript変数チェック用メソッド。 935// * 936// * 1文字目は数字と、特殊記号(アンダーバー(_)、ドル記号($)を除く)、をチェックします。 937// * 厳密には、予約文字が使えなかったりするが、簡易チェックとする。 938// * 前後の空白文字は除外、それ以外の特殊記号は、アンダーバー(_)に変換します。 939// * 940// * @og.rev 8.0.0.0 (2021/09/30) JavaScriptの変数名チェックと置換 941// * 942// * @param key チェックする変数 943// * @param trgStr 変数置換後の変数 944// */ 945// private String checkPara( final String key ) { 946// if( !useVarCheck ) { return key; } // useVarCheck が false の場合は、何もしない。 947// 948// if( key == null || key.isEmpty() ) { return "_"; } 949// 950// final StringBuilder buf = new StringBuilder(key.trim()); 951// for( int i=0; i<buf.length(); i++ ) { 952// final char ch = buf.charAt(i); 953// if( i==0 && '0'<=ch && ch<='9' || 954// ' '<=ch && ch<='/' && '$'!=ch || 955// ':'<=ch && ch<='@' || 956// '['<=ch && ch<='`' && '_'!=ch || 957// '{'<=ch && ch<='~' ) { buf.setCharAt( i,'_' ); } 958// } 959// 960// return buf.toString(); 961// } 962 963 /** 964 * 色コードの配列を返すメソッドです。 965 * 966 * これは、普通のCSV形式のデータなら、そのまま分割します。 967 * 配列は、lenの数だけ作成します。 968 * nullやゼロ文字列の場合は、ColorMapのOLOR_KEYすべてを対象にします。 969 * 1色の場合も、すべて同じ色をlen の数だけセットします。 970 * 971 * VIVIDとPASTEL はキーワードで、org.opengion.fukurou.util.ColorMap のビビッドカラーと 972 * パステルカラーの配列を指定したことと同じになります。 973 * また、色番号として、ビビッドを、(V0~V11) , パステルを、(P0~P11) 974 * に割当てていますので、配列に分解後一旦すべてのキーワードを色番号検索に使用します。 975 * 976 * @og.rev 7.0.1.3 (2018/11/12) 色コードの配列を返すメソッド追加 977 * 978 * @param colCsv 色コードのCSV形式文字列 979 * @param len 作成する配列の個数 980 * @return 色コードに変換後の配列 981 */ 982 private String[] colorCsv( final String colCsv, final int len ) { 983 // 色の数を、len にあわせる必要があります。 984 final String[] mkCols = new String[len]; 985 986 // cols を元に、ColorMap から色配列を取得します。 987 final String[] cols = ColorMap.getColorKeys( colCsv ); 988 989 // 色配列に順番に割り当てますが、色が足りない場合は、初期値の色をセットします。 990 final int min = Math.min( mkCols.length , cols.length ); 991 for( int i=0; i<min; i++ ) { 992 mkCols[i] = cols[i]; 993 } 994 for( int i=min; i<mkCols.length; i++ ) { 995 mkCols[i] = cols[0]; // 色コードの最初の色 996 } 997 998 return mkCols ; 999 } 1000 1001 /** 1002 * jsChartData情報をリストに追加します。 1003 * 1004 * @og.rev 6.7.5.0 (2017/03/10) リストの初期化方法を変更します。 1005 * 1006 * @param jsData jsChartData情報 1007 */ 1008 protected void addJsChartData( final JsChartDataV3 jsData ) { 1009 jsChartData.add( jsData ); 1010 } 1011 1012 /** 1013 * 登録済みのjsChartData情報の個数を返します。 1014 * 1015 * @og.rev 6.7.7.0 (2017/03/31) 新規登録 1016 * 1017 * @return 登録済みのjsChartData情報の個数 1018 */ 1019 protected int getJsChartDataSize() { 1020 return jsChartData.size(); 1021 } 1022 1023 /** 1024 * borderColorとbackgroundColorに色を1色しか使用できないかどうかを返します。 1025 * 1026 * chartType に応じて、色配列が使用できないタイプがあります。 1027 * line/radar が true (1色しか使用できない) 1028 * それ以外(bar/horizontalBar/polarArea/pie/doughnut)が false (色配列が使用できる) 1029 * 1030 * @og.rev 7.0.1.1 (2018/10/22) 新規登録 1031 * 1032 * @return 登録済みのjsChartData情報の個数 1033 */ 1034 protected boolean isOneColor() { 1035 // line/radar が true (1色しか使用できない) 1036 return CTYPE_LINE.equalsIgnoreCase( chartType ) || CTYPE_RADAR.equalsIgnoreCase( chartType ); 1037 } 1038 1039 // ================================================================================= 1040 1041 /** 1042 * 【TAG】チャートの種類を指定します[line/bar/radar/polarArea/pie/doughnut/bubble/scatter](必須)。 1043 * 1044 * @og.tag 1045 * コンフィグ属性の type 定義です。 1046 * なお、複合グラフ時には、この値を、"bar" にしておかないと、きちんと表示しないようです。 1047 * 1048 * 8.0.0.0 (2021/08/31) 1049 * chartTypeが、bubbleとscatterの場合は、y:データ、r:データを varColumns で 1050 * 指定します。詳細は、varColumns の説明をご確認ください。 1051 * 1052 * horizontalBar 廃止 → indexAxis="y" 指定 (当面は互換性の関係で残しますが、廃止予定です) 1053 * verticalLine 相当の表示も indexAxis="y" 指定 1054 * 1055 * @og.rev 8.0.0.0 (2021/08/31) BUBBLEとSCATTERの追加 1056 * 1057 * @param cType チャートタイプ [line/bar/radar/polarArea/pie/doughnut/bubble/scatter] 1058 */ 1059 public void setChartType( final String cType ) { 1060 chartType = nval( getRequestParameter( cType ) , null ); 1061 1062 // 8.0.0.0 (2021/08/31) 互換性の関係で、少し残す。 1063 if( "horizontalBar".equalsIgnoreCase( chartType ) ) { 1064 indexAxis = "y"; 1065 chartType = CTYPE_BAR ; 1066 // いちいち表示がうるさいので、メッセージを出すのを当面やめておきます。 1067 // final String errMsg = "chartTypeのhorizontalBarは廃止されました。代わりに、indexAxis='y'を指定してください。" ; 1068 // System.err.println( errMsg ); 1069 return ; 1070 } 1071 1072 if( !check( chartType, CTYPE_SET ) ) { 1073 final StringBuilder errMsg = new StringBuilder( BUFFER_MIDDLE ) 1074 .append( "指定のチャートタイプは実行できません。" ).append( CR ) 1075 .append( "chartType=[" ).append( chartType ).append( ']' ).append( CR ) 1076 .append( CTYPE_SET ); // org.opengion.fukurou.util.ArraySet の toStringメソッド 1077 throw new HybsSystemException( errMsg.toString() ); 1078 } 1079 } 1080 1081 /** 1082 * 【TAG】ラベルのカラム名を指定します(表示名称) (必須)。 1083 * 1084 * @og.tag 1085 * 表示名称に使用するデータベースの検索時のカラムを指定します。 1086 * 1087 * @param lblclm ラベルカラム 1088 */ 1089 public void setLabelColumn( final String lblclm ) { 1090 labelColumn = nval( getRequestParameter( lblclm ),labelColumn ); 1091 } 1092 1093 /** 1094 * 【TAG】canvasタグのidを指定します(初期値:hybscanvas)。 1095 * 1096 * @og.tag 1097 * canvasタグのidに設定します。 1098 * 1099 * @param id canvasタグのid 1100 */ 1101 @Override 1102 public void setId( final String id ) { 1103 this.id = nval( getRequestParameter( id ),this.id ); 1104 } 1105 1106 /** 1107 * 【TAG】チャートの高さを指定します(初期値:400px)。 1108 * 1109 * @og.tag 1110 * canvasタグの高さに設定します。 1111 * 1112 * @param hei 設定する高さ 1113 */ 1114 public void setHeight( final String hei ) { 1115 height = nval( getRequestParameter( hei ),height ); 1116 } 1117 1118 /** 1119 * 【TAG】チャートの幅を指定します(初期値:400px)。 1120 * 1121 * @og.tag 1122 * canvasタグの横幅を設定します。 1123 * 1124 * @param wid 設定する横幅 1125 */ 1126 public void setWidth( final String wid ) { 1127 width = nval( getRequestParameter( wid ),width ); 1128 } 1129 1130 /** 1131 * 【TAG】ラベルのカラム(データの枠)の最小幅を指定します。 1132 * 1133 * @og.tag 1134 * 標準のチャートは指定の全体幅に合わせてチャートのラベルのカラムの幅が自動調整されます。 1135 * ラベルが全て表示されない場合もあります。 1136 * 1137 * minLabelWidth を指定することで、ラベルのカラムの幅の最小値指定できます。 1138 * この指定により、チャートの全体幅が自動設定されます。 1139 * 1140 * ①全体幅(width)が 最小幅(minLabelWidth)×データ数 より大きい場合は 1141 * 全体幅 がそのまま設定されます。 1142 * ②全体幅(width)が 最小幅(minLabelWidth)×データ数 より小さい場合は 1143 * 最小幅×データ数 の計算値が全体幅となります。 1144 * ③全体幅を固定にしたい場合は、minLabelWidth を指定しません。 1145 * 1146 * @og.rev 8.3.1.0 (2022/10/14) ラベルのカラムの最小幅対応(minLabelWidth 属性追加)(問合・トラブル 0200009388) 1147 * 1148 * @param wid ラベルのカラムの最小幅 1149 */ 1150 public void setMinLabelWidth( final String wid ) { 1151 minLabelWidth = nval( getRequestParameter( wid ),minLabelWidth ); 1152 } 1153 1154 /** 1155 * 【TAG】プラグイン定義された関数を指定します。 1156 * 1157 * @og.tag 1158 * コンフィグ属性の type 定義です。 1159 * 1160 * プラグインは、plugins: [pinFunc], 形式で追加されます。 1161 * この属性での指定時は、[]は、不要で、CSV形式の関数名を並べます。 1162 * 外部に、const pinFunc = { afterDatasetsDraw: function(chart, options) { ・・・ } }; 1163 * 形式のプラグインを指定することで、個別に読ませることが可能です。 1164 * なお、すべてのチャートに、同一のプラグインを指定する場合は、この属性ではなく、 1165 * Chart.plugins.register({ afterDatasetsDraw: function(chart, options) { ・・・ } }); 1166 * 形式で、プラグイン登録 1167 * 1168 * ※ options:plugins: 属性とは異なります。 1169 * 1170 * @og.rev 6.9.9.2 (2018/09/18) プラグイン定義された関数を指定します。 1171 * 1172 * @param attri 追加属性の値 1173 */ 1174 public void setPlugins( final String attri ) { 1175 plugins = nval( getRequestParameter( attri ),plugins ); 1176 } 1177 1178 // ================================================================================= 1179 1180 /** 1181 * 【TAG】"y" を指定することで、horizontalBar や verticalLine を実現する。 1182 * 1183 * @og.tag 1184 * options: 以下の属性 1185 * horizontalBar が廃止され、同様の機能は、indexAxis="y" 指定で実現できます。 1186 * verticalLine 相当の表示も indexAxis="y" 指定で実現します。 1187 * 1188 * @og.rev 8.0.0.0 (2021/08/31) horizontalBar 廃止 → indexAxis="y" 指定 1189 * 1190 * @param indx 軸の方向('x','y') 1191 */ 1192 public void setIndexAxis( final String indx ) { 1193 indexAxis = nval( getRequestParameter( indx ),null ); 1194 } 1195 1196 /** 1197 * 【TAG】棒線の横幅を指定します(初期値:0.8, typeがbarの場合に有効)。 1198 * 1199 * @og.tag 1200 * options: 以下の属性 1201 * options:xAxes:categoryPercentage → option:categoryPercentage の 要素の属性です。 1202 * 1203 * ※ 階層変更による対応のため、chartType による属性の出力制御は廃止しました。 1204 * 1205 * @og.rev 6.9.9.3 (2018/09/25) nvalを入れて、初期値を設定します。 1206 * 1207 * @param widthPer 棒線の横幅 1208 */ 1209 public void setBarWidthPer( final String widthPer ) { 1210 barWidthPer = nval( getRequestParameter( widthPer ),barWidthPer ); 1211 } 1212 1213 /** 1214 * 【TAG】簡易的にアニメーションのON/OFFを設定(true/false)します(初期値::null=true)(options:animation)。 1215 * 1216 * @og.tag 1217 * options: 以下の属性 1218 * options:animation の 要素の属性です。 1219 * 1220 * ※ 簡易的に、false を指定すると、アニメーションが OFF になります。 1221 * 各種属性が登録できるように、文字列を自由に登録できます。 1222 * 1223 * @og.rev 8.0.0.0 (2021/08/31) optionAttributesで設定していた項目を属性追加 1224 * 1225 * @param flag アニメーションのON/OFFを設定(true/false) 1226 */ 1227 public void setAnimation( final String flag ) { 1228 animation = nval( getRequestParameter( flag ), animation ); 1229 } 1230 1231 /** 1232 * 【TAG】チャートクリック時のイベントを指定します。 1233 * 1234 * @og.tag 1235 * options: 以下の属性 1236 * 下記の値が引数として渡されます。 1237 * " onClick:function(event,obj){" + onClick + '}' 1238 * に変換されてセットされます。 1239 * event:イベント情報 1240 * obj:クリックされたオブジェクトの情報 1241 * 1242 * 例) 1243 * onClick="clickLink( event,obj,'result_sample2.jsp?command=RENEW&CLM={CLM}&VAL={VAL}&IDX={IDX}' );" 1244 * onClick="updatechart(obj,'SubChart');" 1245 * onClick="clickLink( event, obj,'index.jsp?chartTitle={LBL}&markValues={CLM}' , parent );" 1246 * 1247 * 基本的には、外部関数を呼び出す設定を行い、実際の動作は外部関数側で行います。 1248 * 1249 * @param click チャートクリック時のイベントを指定 1250 */ 1251 public void setOnClick( final String click ) { 1252 onClick = nval( getRequestParameter( click ),null ); 1253 } 1254 1255 // ================================================================================= 1256 1257 /** 1258 * 【TAG】タイトル、またはタイトル要素を指定します。 1259 * 1260 * @og.tag 1261 * options:title:text → options:plugins:title:text の 要素の属性です。 1262 * "タイトル" または "{display:true,text:'タイトル',color:'blue',font:{size:15},}" 形式で指定します。 1263 * options:plugins:titleの属性に、その他オプションを追加するのと同じ動きになります。 1264 * 判定方法は、先頭に 『{』が存在するかどうかです。 1265 * タイトルに配列を渡すと、改行表示します。 1266 * ['タイトル','改行','するのか?'] の形式なので、先頭に 『[』が存在するか判定します。 1267 * 1268 * <pre> 1269 * display:true/false, 初期値:false 1270 * text :チャートタイトル(string |,string[]) 1271 * color :タイトルの色 1272 * font :{ family:フォント,size:サイズ,style:スタイル,weight:太さ,lineHeight:1行の高さ } 1273 * padding:パディング 1274 * align :表示位置。'start'(開始側), 'center'(中央), 'end'(終了側)のいずれか。デフォルトは 'center' 1275 * position:表示位置。'top'(上部), 'left'(左側), 'bottom'(下部), 'right'(右側)のいずれか。デフォルトは 'top' 1276 * fullSize:フルサイズで表示するか否か。デフォルトは true 1277 * 1278 * </pre> 1279 * 1280 * @og.rev 6.9.9.3 (2018/09/25) nvalを入れて、初期値を設定します。 1281 * @og.rev 8.0.0.0 (2021/09/30) タイトル要素も指定できるように変更 1282 * 1283 * @param title タイトル 1284 */ 1285 public void setTitle( final String title ) { 1286 this.title = nval( getRequestParameter( title ),this.title ); 1287 } 1288 1289 /** 1290 * 【TAG】タイトルの表示位置[top/right/bottom/left]を指定します(初期値:top)。 1291 * 1292 * @og.tag 1293 * options:title:position → options:plugins:title:position の 要素の属性です。 1294 * title 属性に、タイトル要素({…}書式)を設定した場合は、positionは無効です。 1295 * 1296 * <a href="https://www.tohoho-web.com/ex/chartjs-params.html#title">とほほ → チャートタイトル </a> 1297 * 1298 * @og.rev 6.9.9.3 (2018/09/25) nvalを入れて、初期値を設定します。 1299 * 1300 * @param position タイトルの表示位置 [top/right/bottom/left] 1301 */ 1302 public void setTitlePosition( final String position ) { 1303 titlePosition = nval( getRequestParameter( position ),titlePosition ); 1304 1305 checkPara( titlePosition, SET_POSITION, "titlePosition" ); 1306 } 1307 1308 /** 1309 * 【TAG】凡例を表示するか[true/false]を指定します。 1310 * 1311 * @og.tag 1312 * options:legend:display → options:plugins:legend:display の 要素の属性です。 1313 * 1314 * @og.rev 6.9.9.3 (2018/09/25) nvalを入れて、初期値を設定します。 1315 * 1316 * @param display 凡例を表示するか [true/false] 1317 */ 1318 public void setLegendDisplay( final String display ) { 1319 legendDisplay = nval( getRequestParameter( display ),legendDisplay ); 1320 1321 if( legendDisplay != null ) { 1322 checkPara( legendDisplay, SET_BOOLEAN, "legendDisplay" ); 1323 useLegend = true; 1324 } 1325 } 1326 1327 /** 1328 * 【TAG】凡例の表示位置[top/right/bottom/left]を指定します(初期値:top)。 1329 * 1330 * @og.tag 1331 * options:legend:position → options:plugins:legend:position の 要素の属性です。 1332 * 1333 * @og.rev 6.9.9.3 (2018/09/25) nvalを入れて、初期値を設定します。 1334 * 1335 * @param position 凡例の表示位置 [top/right/bottom/left] 1336 */ 1337 public void setLegendPosition( final String position ) { 1338 legendPosition = nval( getRequestParameter( position ),legendPosition ); 1339 1340 if( legendPosition != null ) { 1341 checkPara( legendPosition, SET_POSITION, "legendPosition" ); 1342 useLegend = true; 1343 } 1344 } 1345 1346 /** 1347 * 【TAG】凡例のスタイル属性を使用するかどうか[true/false]を指定します(初期値:false)。 1348 * 1349 * @og.tag 1350 * 凡例のスタイルを、jsChartDataタグのpointStyle属性で指定した形状に変更します。 1351 * 複数データの場合、片方だけ指定したい場合は、usePointStyle="true" にしておき、 1352 * 指定したいほうだけ、jsChartDataタグ側で、pointStyle属性を設定してください。 1353 * <del>options:legend:labels属性のusePointStyle です。</del> 1354 * options:legend:labels:usePointStyle → options:plugins:legend:labels:usePointStyle の 要素の属性です。 1355 * 1356 * @og.rev 6.8.5.0 (2018/01/09) 新規登録 1357 * 1358 * @param usePstyle 凡例のスタイル属性を使用するかどうか [true:使用する/false:使用しない] 1359 */ 1360 public void setUsePointStyle( final String usePstyle ) { 1361 final String useStyle = nval( getRequestParameter( usePstyle ),null ); 1362 1363 if( useStyle != null ) { 1364 usePointStyle = Boolean.parseBoolean( useStyle ); 1365 useLegend = true; // パラメータの設定が行われた場合のみ、設定します。 1366 } 1367 } 1368 1369 //======================================================================================== 1370 1371 /** 1372 * 【TAG】x軸のスケールタイプ[category/linear/time]を指定します(初期値:category)。 1373 * 1374 * @og.tag 1375 * 8.0.0.0 (2021/08/31) 1376 * chartTypeが、bubbleとscatterの場合は、xscaleType は、初期値:category に 1377 * しておいてください。内部で、x: y: r: 等のデータの割り当てを行います。 1378 * options:scales:xAxes:type → options:scales:x:type の 要素の属性です。 1379 * 1380 * @og.rev 6.9.9.3 (2018/09/25) nvalを入れて、初期値を設定します。 1381 * @og.rev 7.0.1.1 (2018/10/22) JsChartDataV3オブジェクトを使用。 1382 * 1383 * @param xscaleType x軸のスケールタイプ [category/linear/time] 1384 */ 1385 public void setXscaleType( final String xscaleType ) { 1386 this.xscaleType = nval( getRequestParameter( xscaleType ) , this.xscaleType ); 1387 1388 // プラグインなどで独自の type を指定することがあるため、警告だけにします。 1389 try { 1390 checkPara( this.xscaleType, SET_XSCALE, "xscaleType" ); 1391 } 1392 catch( final HybsSystemException ex ) { 1393 System.err.println( ex.getMessage() ); 1394 } 1395 1396 jsXAxis.addAxis( "type" , this.xscaleType , USE_QUOTE ); // 文字 1397 } 1398 1399 /** 1400 * 【TAG】x軸の表示位置[top/right/bottom/left]を指定します(初期値:bottom)。 1401 * 1402 * @og.tag 1403 * <del>horizontalBar を指定した場合は、left になります。</del> 1404 * 8.0.0.0 (2021/08/31) horizontalBar は廃止 1405 * 初期値(null)は、下(bottom)に表示されます。 1406 * <del>options:scales:xAxes の 要素の属性です。</del> 1407 * options:scales:xAxes:position → options:scales:x:position の 要素の属性です。 1408 * 1409 * @og.rev 7.0.1.2 (2018/11/04) 新規登録 1410 * 1411 * @param pos x軸の表示位置 [top/right/bottom/left] 1412 */ 1413 public void setXposition( final String pos ) { 1414 xposition = nval( getRequestParameter( pos ),null ); 1415 1416 checkPara( xposition, SET_POSITION, "position" ); 1417 } 1418 1419 /** 1420 * 【TAG】x軸の最大値を指定します(xscaleTypeがlinearの場合に有効)。 1421 * 1422 * @og.tag 1423 * options:scales:xAxes:ticks:max → options:scales:x:max の 要素の属性です。 1424 * 1425 * @og.rev 6.9.9.3 (2018/09/25) nvalを入れて、初期値を設定します。 1426 * @og.rev 7.0.1.1 (2018/10/22) JsChartDataV3オブジェクトを使用。 1427 * 1428 * @param xmax x軸の最大値 1429 */ 1430 public void setXmax( final String xmax ) { 1431 jsXAxis.addAxis( "max" , nval( getRequestParameter( xmax ),null ) , NO_QUOTE ); // 数値 1432 } 1433 1434 /** 1435 * 【TAG】x軸の最小値を指定します(xscaleTypeがlinearの場合に有効)。 1436 * 1437 * @og.tag 1438 * options:scales:xAxes:ticks:min → options:scales:x:min の 要素の属性です。 1439 * 1440 * @og.rev 6.9.9.3 (2018/09/25) nvalを入れて、初期値を設定します。 1441 * @og.rev 7.0.1.1 (2018/10/22) JsChartDataV3オブジェクトを使用。 1442 * 1443 * @param xmin x軸の最小値 1444 */ 1445 public void setXmin( final String xmin ) { 1446 jsXAxis.addAxis( "min" , nval( getRequestParameter( xmin ),null ) , NO_QUOTE ); // 数値 1447 } 1448 1449 /** 1450 * 【TAG】x軸のラベルを指定します。 1451 * 1452 * @og.tag 1453 * options:scales:xAxes:scaleLabel:labelString → options:scales:x:title:text の 要素の属性です。 1454 * 1455 * @og.rev 6.9.9.3 (2018/09/25) nvalを入れて、初期値を設定します。 1456 * @og.rev 7.0.1.1 (2018/10/22) JsChartDataV3オブジェクトを使用。 1457 * 1458 * @param xlabel x軸のラベル 1459 */ 1460 public void setXlabel( final String xlabel ) { 1461 final String lbl = nval( getRequestParameter( xlabel ),null ); 1462 if( lbl != null ) { 1463 final String scLbl = "display:true,text:'" + lbl + "'" ; // ラストの ',' は、addAxis 側で付ける。 1464 jsXAxis.addAxis( JsChartDataV3.TITLE , scLbl ); 1465 } 1466 } 1467 1468 /** 1469 * 【TAG】x軸コールバックを指定します。 1470 * 1471 * @og.tag 1472 * x軸のメモリ編集用スケールバックを設定します。 1473 * options:scales:xAxes:ticks:callback → options:scales:x:ticks:callback の 要素の属性です。 1474 * callback:function(value,index,[tick objects]) { 1475 * return '$' + value; 1476 * } 1477 * 1478 * @og.rev 6.9.9.3 (2018/09/25) nvalを入れて、初期値を設定します。 1479 * @og.rev 7.0.1.1 (2018/10/22) JsChartDataV3オブジェクトを使用。 1480 * 1481 * @param callback x軸コールバック 1482 */ 1483 public void setXscaleCallback( final String callback ) { 1484 jsXAxis.addTicks( "callback" , nval( getRequestParameter( callback ),null ) , NO_QUOTE ); // ファンクションは、クオートしない 1485 } 1486 1487 /** 1488 * 【TAG】x軸を0から書き始まるかどうか(xscaleTypeがlinearの場合に有効)(初期値:null)。 1489 * 1490 * @og.tag 1491 * options:scales:xAxes:ticks:beginAtZero → options:scales:x:beginAtZero の 要素の属性です。 1492 * 1493 * @og.rev 6.8.5.0 (2018/01/09) 新規登録 1494 * @og.rev 7.0.1.1 (2018/10/22) JsChartDataV3オブジェクトを使用。 1495 * 1496 * @param xZero x軸のゼロ開始 1497 */ 1498 public void setXbeginAtZero( final String xZero ) { 1499 final String beginAtZero = nval( getRequestParameter( xZero ),null ); 1500 checkPara( beginAtZero, SET_BOOLEAN, "xbeginAtZero" ); 1501 jsXAxis.addAxis( "beginAtZero" , beginAtZero , NO_QUOTE ); // 数値(boolean) 1502 } 1503 1504 /** 1505 * 【TAG】x軸のメモリ幅を指定します(xscaleTypeがlinearの場合に有効)。 1506 * 1507 * @og.tag 1508 * options:scales:xAxes:ticks:stepSize → options:scales:x:ticks:stepSize の 要素の属性です。 1509 * 1510 * @og.rev 6.9.9.3 (2018/09/25) nvalを入れて、初期値を設定します。 1511 * @og.rev 7.0.1.1 (2018/10/22) JsChartDataV3オブジェクトを使用。 1512 * 1513 * @param xstepSize x軸のメモリ幅 1514 */ 1515 public void setXstepSize( final String xstepSize ) { 1516 jsXAxis.addTicks( "stepSize" , nval( getRequestParameter( xstepSize ),null ) , NO_QUOTE ); // 数値 1517 } 1518 1519 /** 1520 * 【TAG】optionsの属性に、その他オプションを追加します。 1521 * 1522 * @og.tag 1523 * optionsの属性に、その他オプションを追加します。 1524 * 指定する際の、前後の『{}』は、不要です。 1525 * 1526 * <a href="https://www.tohoho-web.com/ex/chartjs-params.html#options">とほほ → オプション </a> 1527 * 1528 * @og.rev 7.0.1.2 (2018/11/04) 属性名変更 1529 * 1530 * @param attri オプションの値 1531 */ 1532 public void setOptOptions( final String attri ) { 1533 optOptions = nval( getRequestParameter( attri ),null ); 1534 } 1535 1536 /** 1537 * 【TAG】options:pluginsの要素に、その他オプションを追加します。 1538 * 1539 * @og.tag 1540 * options:pluginsの要素に、その他オプションを追加します 1541 * 指定する際の、前後の『{}』は、不要です。 1542 * plugins には、legend(凡例),title(タイトル),tooltip(ツールチップ),decimation(間引き),filler(塗りつぶし) 1543 * の属性を指定できるが、元々のこれらを単独で設定できる属性も持っており、 1544 * データ的にはマージされますが、同じキーを指定した場合にどのような動きになるかは保証できません。 1545 * 1546 * <a href="https://www.tohoho-web.com/ex/chartjs-params.html#plugins">とほほ → プラグイン </a> 1547 * 1548 * @og.rev 8.0.0.0 (2021/09/30) 新規追加 1549 * 1550 * @param attri plugins要素 1551 */ 1552 public void setOptPlugins( final String attri ) { 1553 optPlugins = nval( getRequestParameter( attri ),null ); 1554 } 1555 1556 /** 1557 * 【TAG】options:plugins:tooltipの要素に、その他オプションを追加します。 1558 * 1559 * @og.tag 1560 * options:plugins:tooltipの属性に、その他オプションを追加します 1561 * 指定する際の、前後の『{}』は、不要です。 1562 * tooltip には、多数の要素が設定可能なので、外部で定義したオブジェクトを 1563 * 指定するのが良いと思います。 1564 * 1565 * <a href="https://www.tohoho-web.com/ex/chartjs-params.html#tooltip">とほほ → ツールチップ </a> 1566 * 1567 * @og.rev 8.0.0.0 (2021/09/30) 新規追加 1568 * 1569 * @param attri tooltip要素 1570 */ 1571 public void setOptTooltip( final String attri ) { 1572 optTooltip = nval( getRequestParameter( attri ),null ); 1573 } 1574 1575 /** 1576 * 【TAG】options:plugins:legendの要素に、その他オプションを追加します。 1577 * 1578 * @og.tag 1579 * options:plugins:legendの属性に、その他オプションを追加します 1580 * 指定する際の、前後の『{}』は、不要です。 1581 * legend には、多数の要素が設定可能なので、外部で定義したオブジェクトを 1582 * 指定するのが良いと思います。 1583 * 1584 * legend 関係の属性として、legendDisplay、legendPosition、usePointStyle を定義しています。 1585 * optLegend属性を設定した場合、これらの属性とマージされるため、同じキーワードが存在した場合の 1586 * 動作は、不明です。 1587 * 1588 * <a href="https://www.tohoho-web.com/ex/chartjs-params.html#legend">とほほ → 凡例(レジェンド) </a> 1589 * 1590 * @og.rev 8.0.0.0 (2021/09/30) 新規追加 1591 * 1592 * @param attri legend要素 1593 */ 1594 public void setOptLegend( final String attri ) { 1595 optLegend = nval( getRequestParameter( attri ),null ); 1596 if( optLegend != null ) { 1597 useLegend = true; 1598 } 1599 } 1600 1601 /** 1602 * 【TAG】その他options:scales:xのオプションを追加します。 1603 * 1604 * @og.tag 1605 * <del>options:scales:xAxes の 要素の属性です。</del> 1606 * options:scales:xAxes → options:scales:x の 要素の属性です。 1607 * ※ chartJS上は、Axes(axisの複数形)と、Axis を使い分けていますが、属性は、axis で統一します。 1608 * 1609 * @og.rev 7.0.1.2 (2018/11/04) 属性の追加。 1610 * 1611 * @param attri その他options:scales:xAxesのオプション 1612 */ 1613 public void setOptAxis( final String attri ) { 1614 jsXAxis.addAxis( JsChartDataV3.AXIS , nval( getRequestParameter( attri ),null ) ); 1615 } 1616 1617 /** 1618 * 【TAG】その他options:scales:x:ticksのオプションを追加します。 1619 * 1620 * @og.tag 1621 * <del>options:scales:xAxes:ticks の 要素の属性です。</del> 1622 * options:scales:xAxes:ticks → options:scales:x:ticks の 要素の属性です。 1623 * 1624 * @og.rev 7.0.1.2 (2018/11/04) 属性の追加。 1625 * 1626 * @param attri その他options:scales:xAxes:ticksのオプション 1627 */ 1628 public void setOptTicks( final String attri ) { 1629 jsXAxis.addAxis( JsChartDataV3.TICKS , nval( getRequestParameter( attri ),null ) ); 1630 } 1631 1632 /** 1633 * 【TAG】その他options:scales:x:titleのオプションを追加します。 1634 * 1635 * @og.tag 1636 * <del>options:scales:xAxes:scaleLabel の 要素の属性です。</del> 1637 * options:scales:xAxes:scaleLabel → options:scales:x:title の 要素の属性です。 1638 * 1639 * @og.rev 7.0.1.2 (2018/11/04) 属性の追加。 1640 * 1641 * @param title options:scales:x:title要素 1642 */ 1643 public void setOptTitle( final String title ) { 1644 jsXAxis.addAxis( JsChartDataV3.TITLE , nval( getRequestParameter( title ),null ) ); 1645 } 1646 1647 /** 1648 * 【TAG】その他options:scales:x:gridのオプションを追加します。 1649 * 1650 * @og.tag 1651 * <del>options:scales:xAxes:gridLines の 要素の属性です。</del> 1652 * options:scales:xAxes:gridLines → options:scales:x:grid の 要素の属性です。 1653 * 1654 * @og.rev 7.0.1.2 (2018/11/04) 属性の追加。 1655 * 1656 * @param grid options:scales:x:gridの属性 1657 */ 1658 public void setOptGrid( final String grid ) { 1659 jsXAxis.addAxis( JsChartDataV3.GRID , nval( getRequestParameter( grid ),null ) ); 1660 } 1661 1662 /** 1663 * 【TAG】x軸のタイムの単位[year/quarter/month/week/day/hour/minute/second/millisecond]を指定します。 1664 * 1665 * @og.tag 1666 * (xscaleTypeがtimeの場合に有効。指定しない場合は自動) 1667 * options:scales:x:unit 1668 * 1669 * @og.rev 6.9.9.3 (2018/09/25) xscaleType の time 属性廃止。 1670 * @og.rev 6.9.9.4 (2018/10/01) nvalを入れて、属性復活。 1671 * @og.rev 7.0.1.1 (2018/10/22) JsChartDataV3オブジェクトを使用。 1672 * 1673 * @param tunit x軸のタイムの単位 [year/quarter/month/week/day/hour/minute/second/millisecond] 1674 */ 1675 public void setTimeUnit( final String tunit ) { 1676 final String timeUnit = nval( getRequestParameter( tunit ),null ); 1677 1678 checkPara( timeUnit, SET_TIMEUNIT, "timeUnit" ); 1679 1680 jsXAxis.addTime( "unit" , timeUnit , USE_QUOTE ); // 文字列 1681 } 1682 1683 /** 1684 * 【TAG】x軸のタイムの単位幅を指定します(xscaleTypeがtimeの場合に有効)。 1685 * 1686 * @og.tag 1687 * options:scales:x:time:unitStepSize → options:scales:x:time:stepSize の 要素の属性です。 1688 * 1689 * @og.rev 6.9.9.3 (2018/09/25) xscaleType の time 属性廃止。 1690 * @og.rev 6.9.9.4 (2018/10/01) nvalを入れて、属性復活。 1691 * @og.rev 7.0.1.1 (2018/10/22) JsChartDataV3オブジェクトを使用。 1692 * 1693 * @param tunitStepSize x軸のタイムの単位幅 1694 */ 1695 public void setTimeUnitStepSize( final String tunitStepSize ) { 1696 jsXAxis.addTime( "stepSize" , nval( getRequestParameter( tunitStepSize ),null ) , NO_QUOTE ); // 数値 1697 } 1698 1699 /** 1700 * 【TAG】x軸の設定するタイム(入力データ)のフォーマットを指定します(xscaleTypeがtimeの場合に有効)。 1701 * 1702 * @og.tag 1703 * フォーマットは、chartjs-adapter-date-fns.bundle.min.js の定義を使用します。 1704 * <a href="https://github.com/chartjs/chartjs-adapter-date-fns">chartjs-adapter-date-fns</a> 1705 * <a href="https://zenn.dev/snjssk/articles/f05d1bcfeb9604#format">date-fns format</a> 1706 * 例:yyyyMMddHHmmss 1707 * 1708 * 8.0.0.0 (2021/08/31) 1709 * 代わりに、options:scales:x:time.parser で指定します。 1710 * 1711 * @og.rev 6.9.9.3 (2018/09/25) xscaleType の time 属性廃止。 1712 * @og.rev 6.9.9.4 (2018/10/01) nvalを入れて、属性復活。 1713 * @og.rev 7.0.1.1 (2018/10/22) JsChartDataV3オブジェクトを使用。 1714 * @og.rev 8.0.0.0 (2021/08/31) timeSetFormat → timeParser 変更 1715 * 1716 * @param tFormat x軸の設定するタイムのフォーマット処理 1717 */ 1718 public void setTimeParser( final String tFormat ) { 1719 jsXAxis.addTime( "parser" , nval( getRequestParameter( tFormat ),null ) , USE_QUOTE ); // 文字列 1720 } 1721 1722 /** 1723 * 【TAG】x軸の表示するタイムのフォーマットを指定します(xscaleTypeがtimeの場合に有効)。 1724 * 1725 * @og.tag 1726 * 8.0.0.0 (2021/08/31) 1727 * Moment.js の依存関係が切れ、openGionV8では、date-fns を使用します。 1728 * <a href="https://date-fns.org/v2.23.0/docs/format">date-fns format</a> 1729 * ※ yyyy が、YYYY になっているが、よく分からない。 1730 * 1731 * 基本形:yyyyMMddHHmmss 1732 * options:scales:x:time:displayFormats 1733 * 1734 * <table class="plain"> 1735 * <caption>タイムのフォーマット(抜粋)</caption> 1736 * <tr><th>Pattern </th><th>Result examples </th><th>Unit </th></tr> 1737 * <tr><td>yyyy </td><td>0044, 0001, 1900, 2017 </td><td>Calendar year </td></tr> 1738 * <tr><td>M </td><td>1, 2, ..., 12 </td><td>Month (formatting) </td></tr> 1739 * <tr><td>MM </td><td>01, 02, ..., 12 </td><td>Month (formatting) </td></tr> 1740 * <tr><td>MMM </td><td>Jan, Feb, ..., Dec </td><td>Month (formatting) </td></tr> 1741 * <tr><td>MMMM </td><td>January, February, ..., December </td><td>Month (formatting) </td></tr> 1742 * <tr><td>d </td><td>1, 2, ..., 31 </td><td>Day of month </td></tr> 1743 * <tr><td>dd </td><td>01, 02, ..., 31 </td><td>Day of month </td></tr> 1744 * <tr><td>H </td><td>0, 1, 2, ..., 23 </td><td>Hour [0-23] </td></tr> 1745 * <tr><td>HH </td><td>00, 01, 02, ..., 23 </td><td> </td></tr> 1746 * <tr><td>m </td><td>0, 1, ..., 59 </td><td>Minute </td></tr> 1747 * <tr><td>mm </td><td>00, 01, ..., 59 </td><td> </td></tr> 1748 * <tr><td>s </td><td>0, 1, ..., 59 </td><td>Second </td></tr> 1749 * <tr><td>ss </td><td>00, 01, ..., 59 </td><td> </td></tr> 1750 * <tr><td>S </td><td>0, 1, ..., 9 </td><td>Fraction of second </td></tr> 1751 * <tr><td>SS </td><td>00, 01, ..., 99 </td><td> </td></tr> 1752 * <tr><td>SSS </td><td>000, 001, ..., 999 </td><td> </td></tr> 1753 * </table> 1754 * 1755 * timeLblFormatが指定されている場合、全てのdisplayFormatsにtimeLblFormatを設定する 1756 * 1757 * @og.rev 6.9.9.3 (2018/09/25) xscaleType の time 属性廃止。 1758 * @og.rev 6.9.9.4 (2018/10/01) nvalを入れて、属性復活。 1759 * @og.rev 7.0.1.1 (2018/10/22) JsChartDataV3オブジェクトを使用。 1760 * 1761 * @param tLblFormat x軸の表示するタイムのフォーマット 1762 * @see #setTimeParser(String) 1763 */ 1764 public void setTimeLblFormat( final String tLblFormat ) { 1765 final String timeFmt = nval( getRequestParameter( tLblFormat ),null ); 1766 if( timeFmt != null ) { 1767 final StringBuilder buf = new StringBuilder( BUFFER_MIDDLE ) 1768 .append( "{year:'" ).append( timeFmt ) 1769 .append( "',quarter:'" ).append( timeFmt ) 1770 .append( "',month:'" ).append( timeFmt ) 1771 .append( "',week:'" ).append( timeFmt ) 1772 .append( "',day:'" ).append( timeFmt ) 1773 .append( "',hour:'" ).append( timeFmt ) 1774 .append( "',minute:'" ).append( timeFmt ) 1775 .append( "',second:'" ).append( timeFmt ) 1776 .append( "'}" ); 1777 1778 jsXAxis.addTime( "displayFormats" , buf.toString() , NO_QUOTE ); // オブジェクトなので、クオートなし 1779 } 1780 } 1781 1782 /** 1783 * 【TAG】x軸の時間のツールチップに使用するフォーマット(タイムスケール用)を指定します(xscaleTypeがtimeの場合に有効)。 1784 * 1785 * @og.tag 1786 * 8.0.0.0 (2021/08/31) 1787 * Moment.js の依存関係が切れ、openGionV8では、date-fns を使用します。 1788 * <a href="https://date-fns.org/v2.23.0/docs/format">date-fns format</a> 1789 * 1790 * 基本形:yyyyMMddHHmmss 1791 * options:scales:x:time:tooltipFormat 1792 * 1793 * フォーマットは、timeLblFormat (内部的には、time:displayFormats)と同じ 1794 * 1795 * @og.rev 7.0.1.0 (2018/10/15) 時間のツールチップに使用するフォーマット(タイムスケール用) 1796 * @og.rev 7.0.1.1 (2018/10/22) JsChartDataV3オブジェクトを使用。 1797 * 1798 * @param tipFormat x軸の表示するタイムのフォーマット 1799 * @see #setTimeParser(String) 1800 */ 1801 public void setTooltipFormat( final String tipFormat ) { 1802 jsXAxis.addTime( "tooltipFormat" , nval( getRequestParameter( tipFormat ),null ) , USE_QUOTE ); // 文字列 1803 } 1804 1805 //======================================================================================== 1806 1807 /** 1808 * 【TAG】y軸に横マーカーラインの設定値をCSV形式で複数指定します。 1809 * 1810 * @og.tag 1811 * X軸に平行に固定値の線を引きます。線の値を、CSV形式で指定します。 1812 * annotation:annotations オプションに名前付きで設定した中に yMin,yMax を定義します。 1813 * 以前は、value に値をセットしていましたが、,yMin:値,yMax:値 にセットします。 1814 * 1815 * 8.0.0.0 (2021/08/31) 1816 * chartjs-plugin-annotation を使用します。 1817 * 配列ではなく、名前付きの設定になります。(下記の例では、ymark0:) 1818 * options::plugins:annotation:annotations:ymark0:{ 1819 * type:'line', ← 固定です。 1820 * borderWidth:2, ← markWidthの値(ライン共通 初期値="2") 1821 * borderDash:[5,2], ← markDashの値(ライン共通 初期値=null) 1822 * yMin:値,yMax:値, ← markValuesの値 1823 * borderColor: '#FF0000', ← markColorsの値 1824 * label:{ 1825 * enabled:'true',position:'start', ← 固定です。 1826 * backgroundColor:'rgba(0,0,0,0)', ← 固定です。 1827 * font:{ size:10 }, ← markFontSizeの値(ライン共通 初期値=10) 1828 * content:'基準値', ← markLblsの値 1829 * yAdjust:-6, ← markAdjustの値 1830 * color:'#FF0000', ← markColorsの値 1831 * … , 1832 * }, 1833 * }, 1834 * 1835 * @og.rev 6.8.5.0 (2018/01/09) 新規登録 1836 * @og.rev 8.0.0.0 (2021/08/31) chartJs V3 で大きく変更されています。 1837 * 1838 * @param mkVals y軸に横マーカーラインの設定値(CSV形式) 1839 */ 1840 public void setMarkValues( final String mkVals ) { 1841 markValues = nval( getRequestParameter( mkVals ) , markValues ); 1842 } 1843 1844 /** 1845 * 【TAG】y軸に横マーカーラインの色をCSV形式で複数指定します。 1846 * 1847 * @og.tag 1848 * annotation:annotations オプションに名前付きで設定した中に borderColor を定義します。 1849 * 1850 * X軸に平行に固定値の線を引きます。線の色を、CSV形式で指定します。 1851 * markValues が指定されており、markColorsが指定されていない場合は、青色(BLUE)になります。 1852 * 色指定に、VIVID,PASTEL を使えるようにします。 1853 * 1854 * 詳細は、markValues の説明をご確認願います。 1855 * 1856 * @og.rev 6.8.5.0 (2018/01/09) 新規登録 1857 * @og.rev 7.0.1.3 (2018/11/12) 色指定に、VIVID,PASTEL を使えるようにします。 1858 * 1859 * @param mkCols y軸に横マーカーラインの色(CSV形式) 1860 * @see #setMarkValues(String) 1861 */ 1862 public void setMarkColors( final String mkCols ) { 1863 markColors = nval( getRequestParameter( mkCols ) , markColors ); 1864 } 1865 1866 /** 1867 * 【TAG】y軸に横マーカーラインのラベルをCSV形式で複数指定します。 1868 * 1869 * @og.tag 1870 * annotation:annotations オプションに名前付きで設定した中に 1871 * label:content を定義します。 1872 * 1873 * label 属性の enabled:'true',position:'start',backgroundColor:'rgba(0,0,0,0)', 1874 * font:{ size:10 } は固定で、color は、markColors 属性で指定した 1875 * y軸に横マーカーラインの色を使用します。 1876 * 色指定に、VIVID,PASTEL を使えるようにします。 1877 * 1878 * 詳細は、markValues の説明をご確認願います。 1879 * 1880 * @og.rev 6.8.5.0 (2018/01/09) 新規登録 1881 * 1882 * @param mklbls y軸に横マーカーラインのラベル(CSV形式) 1883 * @see #setMarkValues(String) 1884 */ 1885 public void setMarkLbls( final String mklbls ) { 1886 markLbls = nval( getRequestParameter( mklbls ) , markLbls ); 1887 } 1888 1889 /** 1890 * 【TAG】y軸に横マーカーラインのラベル表示位置の上下方向を調整します(初期値:-6)。 1891 * 1892 * @og.tag 1893 * annotation:annotations オプションに名前付きで設定した中に 1894 * label:yAdjust を定義します。 1895 * 1896 * これは、ラインに対するラベルの位置を表します。+で、下側、-で上側に表示します。 1897 * 初期値は、-6 で、ラインの上側に来るように調整しています。 1898 * 1899 * 詳細は、markValues の説明をご確認願います。 1900 * 1901 * @og.rev 6.8.5.0 (2018/01/09) 新規登録 1902 * 1903 * @param mkAjst y軸に横マーカーラインのラベル表示位置の上下方向調整 1904 * @see #setMarkValues(String) 1905 */ 1906 public void setMarkAdjust( final String mkAjst ) { 1907 markAdjust = nval( getRequestParameter( mkAjst ) , markAdjust ); 1908 } 1909 1910 /** 1911 * 【TAG】x軸に横マーカーラインのラベルをCSV形式で複数指定します。 1912 * 1913 * @og.tag 1914 * annotation:annotations オプションに名前付きで設定した中に 1915 * label:content を定義します。 1916 * 1917 * label 属性の enabled:'true',position:'end',backgroundColor:'white', 1918 * font:{ size:10 } は固定で、color は、markColors 属性で指定した 1919 * x軸に横マーカーラインの色を使用します。 1920 * 色指定に、VIVID,PASTEL を使えるようにします。 1921 * 1922 * 詳細は、xmarkValues の説明をご確認願います。 1923 * 1924 * @og.rev 8.0.0.0 (2021/09/30) 新規追加 1925 * 1926 * @param mklbls x軸に横マーカーラインのラベル(CSV形式) 1927 * @see #setMarkValues(String) 1928 */ 1929 public void setXmarkLbls( final String mklbls ) { 1930 xmarkLbls = nval( getRequestParameter( mklbls ) , xmarkLbls ); 1931 } 1932 1933 /** 1934 * 【TAG】x軸に縦マーカーラインの設定値をCSV形式で複数指定します。 1935 * 1936 * @og.tag 1937 * annotation:annotations オプションに名前付きで設定した中に xMin,xMax を定義します。 1938 * 1939 * Y軸に平行に固定値の縦線を引きます。線の値を、CSV形式で指定します。 1940 * 以前は、value に値をセットしていましたが、,xMin:値,xMax:値 にセットします。 1941 * 1942 * type:'line',borderWidth:2,scaleID:'x0Ax', 固定です。 1943 * chartjs-plugin-annotation を使用します。 1944 * 配列ではなく、名前付きの設定になります。(下記の例では、xmark0:) 1945 * 1946 * options:plugins:annotation:annotations:xmark0:{ 1947 * type:'line', ← 固定です。 1948 * borderWidth:2, ← markWidthの値(ライン共通 初期値="2") 1949 * borderDash:[5,2], ← markDashの値(ライン共通 初期値=null) 1950 * xMin:値,xMax:値, ← xmarkValuesの値 1951 * borderColor:'#FF0000', ← xmarkColorsの値 1952 * }, 1953 * 1954 * @og.rev 7.0.1.1 (2018/10/22) xmarkValues,xmarkColors属性の追加 1955 * 1956 * @param mkVals x軸に縦マーカーラインの設定値(CSV形式) 1957 * @see #setMarkValues(String) 1958 */ 1959 public void setXmarkValues( final String mkVals ) { 1960 xmarkValues = nval( getRequestParameter( mkVals ) , xmarkValues ); 1961 } 1962 1963 /** 1964 * 【TAG】x軸に縦マーカーラインの色をCSV形式で複数指定します。 1965 * 1966 * @og.tag 1967 * annotation:annotations オプションに名前付きで設定した中に borderColor を定義します。 1968 * 1969 * Y軸に平行に固定値の縦線を引きます。線の色を、CSV形式で指定します。 1970 * xmarkValues が指定されており、xmarkColorsが指定されていない場合は、青色(BLUE)になります。 1971 * 1972 * @og.rev 7.0.1.1 (2018/10/22) xmarkValues,xmarkColors属性の追加 1973 * @og.rev 7.0.1.3 (2018/11/12) 色指定に、VIVID,PASTEL を使えるようにします。 1974 * 1975 * @param mkCols x軸に縦マーカーラインの色(CSV形式) 1976 * @see #setXmarkValues(String) 1977 */ 1978 public void setXmarkColors( final String mkCols ) { 1979 xmarkColors = nval( getRequestParameter( mkCols ) , xmarkColors ); 1980 } 1981 1982 /** 1983 * 【TAG】x軸,y軸全マーカーライン共通のラインの幅を指定します:borderWidth(初期値:2)。 1984 * 1985 * @og.tag 1986 * annotation:annotations オプションに名前付きで設定した中に borderWidth を定義します。 1987 * 1988 * この値は、x軸,y軸関係なく、マーカーラインの順番も関係なく、共通設定になります。 1989 * 1990 * @og.rev 7.0.1.1 (2018/10/22) markWidth,markDash,markFontSize属性の追加 1991 * 1992 * @param width マーカーライン共通のラインの幅 1993 * @see #setMarkValues(String) 1994 */ 1995 public void setMarkWidth( final String width ) { 1996 markWidth = nval( getRequestParameter( width ) , markWidth ); 1997 } 1998 1999 /** 2000 * 【TAG】x軸,y軸全マーカーライン共通のラインに点線を指定([5,2]など)します:borderDash(初期値:null)。 2001 * 2002 * @og.tag 2003 * annotation:annotations オプションに名前付きで設定した中に borderDash を定義します。 2004 * 2005 * この値は、x軸,y軸関係なく、マーカーラインの順番も関係なく、共通設定になります。 2006 * markDash="[5,2]" とすれば、線の長さが5px , 線と線の間が2px になります。 2007 * 2008 * @og.rev 7.0.1.1 (2018/10/22) markWidth,markDash,markFontSize属性の追加 2009 * 2010 * @param dash マーカーライン共通のラインの点線の形状 2011 * @see #setMarkValues(String) 2012 */ 2013 public void setMarkDash( final String dash ) { 2014 markDash = nval( getRequestParameter( dash ) , markDash ); 2015 } 2016 2017 /** 2018 * 【TAG】x軸,y軸全マーカーライン共通のラベルのフォントサイズを指定します:label:font:size(初期値:10)。 2019 * 2020 * @og.tag 2021 * annotation:annotations オプションに名前付きで設定した中に 2022 * label:font:size を定義します。 2023 * 2024 * この値は、x軸,y軸関係なく、マーカーラインの順番も関係なく、共通設定になります。 2025 * 2026 * @og.rev 7.0.1.1 (2018/10/22) markWidth,markDash,markFontSize属性の追加 2027 * 2028 * @param size マーカーライン共通のフォントサイズ 2029 * @see #setMarkValues(String) 2030 */ 2031 public void setMarkFontSize( final String size ) { 2032 markFontSize = nval( getRequestParameter( size ) , markFontSize ); 2033 } 2034 2035 //======================================================================================== 2036 2037 /** 2038 * 【TAG】すべてのデータが0の場合、使用しないかどうか[true:除外する/false:除外しない]を指定します(初期値:false)。 2039 * 2040 * @og.tag 2041 * JSON データを作成して、JsChartV3に渡しますが、このフラグを true に設定すると 2042 * 0 または、null(空文字列)のデータを出力しません。 6.8.3.0 (2017/11/27) 2043 * グラフ系で、0 が、ありえない値として設定されている場合に、使用すると、 2044 * 出力するデータ量を抑えることが出来ます。 2045 * 2046 * @og.rev 6.7.7.0 (2017/03/31) useZeroDataOmit属性の追加 2047 * 2048 * @param useZeroOmit データが0の場合の使用可否 [true:除外する/false:除外しない] 2049 */ 2050 public void setUseZeroDataOmit( final String useZeroOmit ) { 2051 useZeroDataOmit = nval( getRequestParameter( useZeroOmit ) , useZeroDataOmit ); 2052 } 2053 2054 /** 2055 * 【TAG】JSON出力で、値出力にレンデラを利用するかどうか[true/false]を指定します(初期値:false)。 2056 * 2057 * @og.tag 2058 * JSONのデータのレンデラー変換を行うかどうか。 2059 * 数値部分にはレンデラー変換は行いません。ラベル文字に行います。 2060 * 指定しない場合は使用しない(false)です。 2061 * 2062 * @og.rev 6.7.9.0 (2017/04/28) useRenderer 追加 2063 * 2064 * @param usernd レンデラーを利用するかどうか [true/false] 2065 */ 2066 public void setUseRenderer( final String usernd ) { 2067 useRenderer = nval( getRequestParameter( usernd ) , useRenderer ); 2068 } 2069 2070 /** 2071 * 【TAG】検索結果をこのカラムでソートし直します(初期値:null)。 2072 * 2073 * @og.tag 2074 * query で検索した結果を、JsChartV3で利用する場合、チャート上のソート順と、 2075 * リストや、別のチャートでの表示準が異なる場合に、このカラムで、ソートしなおします。 2076 * 通常は、labelColumn と同じ値でソートすることで、X軸の順番に表示されます。 2077 * 2078 * @og.rev 6.8.0.0 (2017/06/02) sortColumn 追加 2079 * 2080 * @param sortClm このカラムでソートし直す 2081 */ 2082 public void setSortColumn( final String sortClm ) { 2083 sortColumn = nval( getRequestParameter( sortClm ) , sortColumn ); 2084 } 2085 2086 /** 2087 * 【TAG】値の前後にクオートをはさむかどうか[true/false]指定します(初期値:false)。 2088 * 2089 * @og.tag 2090 * 以前は、yscaleType="category" のときに、値が、文字列のため、クオートで囲う判断をしていました。 2091 * その属性は、JsChartDataV3Tag に移ったため、新たなパラメータを用意します。 2092 * 将来的に、自動判定にするか、JsChartDataV3Tag から情報を取得するかもしれません。 2093 * 2094 * @og.rev 7.0.1.1 (2018/10/22) 新規登録 2095 * 2096 * @param flag 値の前後にクオートをはさむかどうか [true/false] 2097 */ 2098 public void setValueQuot( final String flag ) { 2099 valueQuot = nval( getRequestParameter( flag ),valueQuot ); 2100 } 2101 2102 /** 2103 * 【TAG】WheelZoom処理を使用するかどうか[true/false]を指定します(初期値:false)。 2104 * 2105 * @og.tag 2106 * plugins:zoom に、zoom:{wheel,pinch} と pan を定義します。(chartJs V3 の変更点) 2107 * これは、chartjs-plugin-zoom.js を使用します。 2108 * マウスホイールで、zoom処理、右クリックで移動(pan)します。 2109 * ダブルクリックで元の状態に戻します。 2110 * useDragZoom と同時指定した場合は、useZoom が優先されます。 2111 * 2112 * 初期値は、false:使用しないです。 2113 * 2114 * <ul> 2115 * <li>zoom:{mode:'xy',wheel:{enabled:true,},pinch:{enabled:true,},},</li> 2116 * <li>pan:{mode:'xy',enabled:true,},</li> 2117 * <li>canvasをクリックでzoomリセット </li> 2118 * </ul> 2119 * 2120 * options:plugins:zoom:{ 2121 * zoom:{mode:'xy',wheel:{enabled:true,},pinch:{enabled:true,},}, 2122 * pan:{mode:'xy',enabled:true,}, 2123 * }, 2124 * 2125 * @og.rev 6.8.5.0 (2018/01/09) 新規登録 2126 * 2127 * @param flag WheelZoom処理を使用するかどうか [true:使用する/false:使用しない]。 2128 */ 2129 public void setUseZoom( final String flag ) { 2130 useZoom = nval( getRequestParameter( flag ) , useZoom ); 2131 } 2132 2133 /** 2134 * 【TAG】DragZoom処理を使用するかどうか[true/false]を指定します(初期値:false)。 2135 * 2136 * @og.tag 2137 * plugins:zoom に zoom:{drag} と pan:{modifierKey: 'ctrl',} を定義します。(chartJs V3 の変更点) 2138 * これは、chartjs-plugin-zoom.js を使用します。 2139 * 右クリックで範囲指定で、zoom処理、CTRLボタンを押しながら、右クリックで移動(pan)します。 2140 * ダブルクリックで元の状態に戻します。 2141 * useDragZoom と同時指定した場合は、useZoom が優先されます。 2142 * 2143 * 初期値は、false:使用しないです。 2144 * 2145 * <ul> 2146 * <li>zoom:{drag:{enabled:true,borderColor:'rgb(54,162,235)',borderWidth:1,backgroundColor:'rgba(54,162,235,0.3)'},},</li> 2147 * <li>pan:{mode:'xy',enabled:true,modifierKey: 'ctrl',},</li> 2148 * <li>canvasをクリックでzoomリセット </li> 2149 * </ul> 2150 * 2151 * options:plugins:zoom:{ 2152 * zoom:{drag:{enabled:true,borderColor:'rgb(54,162,235)',borderWidth:1,backgroundColor:'rgba(54,162,235,0.3)'},}, 2153 * pan:{mode:'xy',enabled:true,modifierKey: 'ctrl',}, 2154 * }, 2155 * 2156 * @og.rev 6.8.5.0 (2018/01/09) 新規登録 2157 * 2158 * @param flag DragZoom処理を使用するかどうか [true:使用する/false:使用しない]。 2159 */ 2160 public void setUseDragZoom( final String flag ) { 2161 useDragZoom = nval( getRequestParameter( flag ) , useDragZoom ); 2162 } 2163 2164 /** 2165 * 【TAG】TableModelの指定のカラム(CSV形式)をconstの配列変数として出力します。 2166 * 2167 * @og.tag 2168 * これは、指定のカラムのデータをJavaScriptのconst変数定義で配列として出力します。 2169 * labelColumn や、JsChartDataV3Tag の chartColumn と同じ方法です。 2170 * 2171 * 例えば、TableModelを、sortColumn でソートすると、JsChartDataV3Tag の pointBGColor 2172 * の配列順も変わりますので、ソートされた状態で出力したいことがあると思います。 2173 * 2174 * 8.0.0.0 (2021/08/31) 2175 * chartTypeが、bubble の場合、 2176 * x:は、jsChartData の chartColumn 2177 * y:は、varColumns で指定した1番目のカラム 2178 * r:は、varColumns で指定した2番目のカラム 2179 * scatter の場合は、y:の1番目のカラムのみ使用します。 2180 * 2181 * @og.rev 7.0.1.2 (2018/11/04) 新規登録 2182 * @og.rev 8.0.0.0 (2021/08/31) BUBBLEとSCATTERの追加 2183 * 2184 * @param clms 指定のカラム(CSV形式)をconstの配列変数として出力 2185 */ 2186 public void setVarColumns( final String clms ) { 2187 varColumns = nval( getRequestParameter( clms ) , varColumns ); 2188 } 2189 2190// /** 2191// * 【TAG】const定義するJavaScript変数に使用できるかどうか[true/false]指定します。 2192// * 2193// * @og.tag 2194// * const定義するJavaScript変数に使用できる文字は、決まっています。 2195// * 2196// * 1文字目は数字と、特殊記号(アンダーバー(_)、ドル記号($)を除く)、をチェックします。 2197// * 厳密には、予約文字が使えなかったりするが、簡易チェックとする。 2198// * 前後の空白文字は除外、それ以外の特殊記号は、アンダーバー(_)に変換します。 2199// * 初期値[false] 2200// * 2201// * @og.rev 8.0.0.0 (2021/09/30) 新規登録 2202// * 2203// * @param flag JavaScript変数に使用できるかどうか[true/false]指定 2204// */ 2205// public void setUseVarCheck( final String flag ) { 2206// useVarCheck = nval( getRequestParameter( flag ) , useVarCheck ); 2207// } 2208 2209 //======================================================================================== 2210 2211 /** 2212 * 【TAG】(通常は使いません)sessionから所得する DBTableModelオブジェクトの ID。 2213 * 2214 * @og.tag 2215 * (通常は使いません)sessionから所得する DBTableModelオブジェクトの ID。 2216 * 2217 * @og.rev 6.9.9.3 (2018/09/25) nvalを入れて、初期値を設定します。 2218 * 2219 * @param tableId テーブルID 2220 */ 2221 public void setTableId( final String tableId ) { 2222 this.tableId = nval( getRequestParameter( tableId ) , this.tableId ); 2223 } 2224 2225 /** 2226 * このオブジェクトの文字列表現を返します。 2227 * 基本的にデバッグ目的に使用します。 2228 * 2229 * @return このクラスの文字列表現 2230 */ 2231 @Override 2232 public String toString() { 2233 final StringBuilder buf = new StringBuilder( BUFFER_MIDDLE ) 2234 .append( "X_AXIS=" ).append( jsXAxis ).append( CR ); 2235 2236 jsChartData.forEach( js -> buf.append( "Y_AXIS=" ).append( jsXAxis ).append( CR ) ); 2237 2238 return ToString.title( this.getClass().getName() ) 2239 .println( "VERSION" , VERSION ) 2240 .println( "id" , id ) 2241 .println( "tableId" , tableId ) 2242 .println( "chartType" , chartType ) 2243 .println( "width" , width ) 2244 .println( "height" , height ) 2245 .println( "barWidthPer" , barWidthPer ) 2246 .println( "title" , title ) 2247 .println( "titlePosition" , titlePosition ) 2248 .println( "legendPosition" , legendPosition ) 2249 .println( "legendDisplay" , legendDisplay ) 2250 .println( "xscaleType" , xscaleType ) 2251 .println( "optOptions" , optOptions ) // 7.0.1.2 (2018/11/04) 2252// .println( "optChart" , optChart ) // 7.0.1.2 (2018/11/04) 2253 .fixForm().println() 2254 .println( buf ).toString(); 2255 } 2256}