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.plugin.column; 017 018import org.opengion.hayabusa.common.HybsSystem; // 8.0.2.0 (2021/11/30) Add 019import org.opengion.hayabusa.db.AbstractEditor; 020import org.opengion.hayabusa.db.CellEditor; 021import org.opengion.hayabusa.db.DBColumn; 022import org.opengion.fukurou.util.TagBuffer; // 8.0.2.0 (2021/11/30) Add 023import org.opengion.fukurou.util.StringUtil; // 8.0.2.0 (2021/11/30) Add 024import org.opengion.fukurou.util.XHTMLTag; 025 026// import static org.opengion.fukurou.util.StringUtil.isNull; // 8.5.4.2 (2024/01/12) import static … を個別に記述 027 028/** 029 * YMD エディターは、カラムのデータを日付(年/月/日)編集する場合に使用するクラスです。 030 * 031 * カラムの表示に必要な属性は、DBColumn オブジェクト より取り出します。 032 * このクラスは、DBColumn オブジェクト毎に1つ作成されます。 033 * 034 * 8.0.2.0 (2021/11/30) 035 * カラムのパラメータの情報より、日付送り戻しの機能が使えます。 036 * 例:D-1,D0,D+1 or D-1,D0,D+1,true 037 * 038 * 第一引数は、日付戻しを指定します。 039 * 第二引数は、初期化します。 040 * 第三引数は、日付送りを指定します。 041 * 第四引数は、検索ボタンを押すか押さないか[true/false]を指定します。 (初期値:false) 042 * 043 * 日付についての加減算処理を行うためのコマンドを指定します。 044 * ・SYXX :年の最初の日付を指定の分だけ進めます。(SY-1なら先年の1月1日、SY1なら翌年の1月1日) 045 * ・SDXX :月の最初の日付を指定の分だけ進めます。(SD-1なら先月の1日、SD1なら翌月の1日) 046 * ・SWXX :週初め(月曜日)を指定の分だけ進めます。(SW-1なら先週の月曜日、SW1なら翌週の月曜日) 047 * ・EYXX :年の最後の日付を指定の分だけ進めます。(EY-1なら先年の年末、EY1なら翌年の年末) 048 * ・EDXX :月の最後の日付を指定の分だけ進めます。(ED-1なら先月の月末、ED1なら翌月の月末) 049 * ・EWXX :週末(日曜日)を指定の分だけ進めます。(EW-1なら先週の日曜日、EW1なら翌週の日曜日) 050 * ・YXX :年を指定の分だけ進めます。(Y-1なら1年前、Y1なら1年後) 051 * ・MXX :月を指定の分だけ進めます。(M-1なら1月前、M1なら1月後) 052 * ・DXX :日を指定の分だけ進めます。(D-1なら1日前、D1なら1日後) 053 * ※ 数字がゼロのコマンドは初期化します。 054 * ※ 数字がないコマンドはサーバー上のシステム日付をセットします。 055 * 056 * @og.rev 8.0.2.0 (2021/11/30) 日付送り戻し対応 057 * @og.rev 8.1.2.3 (2022/05/20) 日付送り戻し不具合対応(useDateFeed 属性追加) 058 * @og.rev 8.5.6.1 (2024/03/29) 継承で使えるように、一部修正します。 059 * 060 * @og.group データ編集 061 * 062 * @version 4.0 063 * @author Kazuhiko Hasegawa 064 * @since JDK5.0, 065 */ 066public class Editor_YMD extends AbstractEditor { 067 /** このプログラムのVERSION文字列を設定します。 {@value} */ 068 private static final String VERSION = "8.5.6.1 (2024/03/29)" ; 069 070 // 8.0.2.0 (2021/11/30) 日付送り戻し対応 071 /** パラメータの個数だが、第四引数が特殊なので、その判定にも使用 */ 072 private static final int CNT_ARY = 3; 073 private static final String JSP_ICON = HybsSystem.sys( "JSP_ICON" ) ; 074 private static final String FR_STR = "<a href=\"#\" onclick=\"dateFeedRtn('%1$s','%2$s','%3$s','%4$s','%5$s');\" style=\"margin:0 5px 0 3px\" >"; 075 private static final String FR_END = "<img src=\"" + JSP_ICON + "/%6$s\" alt=\"%4$s\" title=\"%4$s\" /></a>"; 076 private static final String[] FR_IMG = { "FR_PREV.png", "FR_CIRCLE.png", "FR_NEXT.png" }; 077 078 // 8.5.4.2 (2024/01/12) PMD 7.0.0 LinguisticNaming 079// private String isSubm = "false"; // 検索ボタンを押すか押さないか 080 private String onSubm = "false"; // 検索ボタンを押すか押さないか 081 private String errMsg; // エラーメッセージ 082 private String[] prmAry; // 編集パラメータ 083 084 // 8.5.6.1 (2024/03/29) private final → protected に変更 085// private final boolean hidden; // 非表示 086// private final boolean useDateFeed; // 日付送り戻し機能の有効/無効 8.1.2.3 (2022/05/20) 087 /** 非表示 */ 088 protected boolean hidden; // 非表示 089 /** 日付送り戻し機能の有効/無効 */ 090 protected boolean useDateFeed; // 日付送り戻し機能の有効/無効 8.1.2.3 (2022/05/20) 091 092 /** 自身のクラスのキーワード(例えば、YMD) */ 093 protected String clsKey ; // 8.5.6.1 (2024/03/29) 共通で使用する自身のクラスのキーワード(例えば、YMD) 094 095 /** 096 * デフォルトコンストラクター。 097 * このコンストラクターで、基本オブジェクトを作成します。 098 * 099 * @og.rev 3.1.1.1 (2003/04/03) 各オブジェクトから自分のインスタンスを返すファクトリメソッドを追加。 100 * @og.rev 8.0.2.0 (2021/11/30) 日付送り戻し対応 101 * @og.rev 8.1.2.3 (2022/05/20) 日付送り戻し不具合対応(useDateFeed 属性追加) 102 * 103 */ 104// public Editor_YMD() { super(); } // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。 105 // 8.0.2.0 (2021/11/30) Modify 106 public Editor_YMD() { 107 super(); 108// isSubm = "false"; 109 onSubm = "false"; // 8.5.4.2 (2024/01/12) PMD 7.0.0 LinguisticNaming 110 errMsg = null; 111 prmAry = null; 112 hidden = true; 113 useDateFeed = true; // 8.1.2.3 (2022/05/20) 114 clsKey = "YMD"; // 8.5.6.1 (2024/03/29) 115 } 116 117 /** 118 * DBColumnオブジェクトを指定したprivateコンストラクター。 119 * 120 * @og.rev 3.1.1.1 (2003/04/03) 各オブジェクトから自分のインスタンスを返すファクトリメソッドを追加。 121 * @og.rev 3.5.6.0 (2004/06/18) XHTMLTag の 内部配列 INPUT_KEY を隠蔽します。 122 * @og.rev 8.0.2.0 (2021/11/30) 日付送り戻し対応 123 * @og.rev 8.1.2.3 (2022/05/20) 日付送り戻し不具合対応(useDateFeed 属性追加) 124 * @og.rev 8.5.6.1 (2024/03/29) 継承で使えるように、一部修正します。 125 * 126 * @param clm DBColumnオブジェクト 127 */ 128// private Editor_YMD( final DBColumn clm ) { 129 protected Editor_YMD( final DBColumn clm ) { 130 super( clm ); 131 clsKey = "YMD"; // 8.5.6.1 (2024/03/29) 132 133 tagBuffer.add( XHTMLTag.inputAttri( attributes ) ); 134 135 final boolean disabled = "disabled".equalsIgnoreCase( attributes.get( "disabled" ) ); 136 final boolean readonly = "readonly".equalsIgnoreCase( attributes.get( "readonly" ) ); // 8.0.2.0 (2021/11/30) 137 useDateFeed = clm.isDateFeed(); // 8.1.2.3 (2022/05/20) 138 139 // 8.0.2.0 (2021/11/30) Add 日付送り戻し対応 140 hidden = disabled || readonly; 141// if( !hidden ) { // 8.1.2.3 (2022/05/20) Modify 142 if( !hidden && useDateFeed ) { 143 // 例:D-1,D0,D+1 or D-1,D0,D+1,true 144 final String prmStr = clm.getEditorParam(); 145 if( prmStr != null ) { 146 prmAry = StringUtil.csv2Array( prmStr ); 147 // パラメータの第四引数がある場合 148 if( prmAry.length > CNT_ARY ) { 149// isSubm = prmAry[CNT_ARY]; 150 onSubm = prmAry[CNT_ARY]; // 8.5.4.2 (2024/01/12) PMD 7.0.0 LinguisticNaming 151 } else if( prmAry.length < CNT_ARY ) { 152 errMsg = "editorParam の設定が不足です。" 153 + " name=" + name 154 + " label=" + clm.getLabel() 155 + " editorParam=" + clm.getEditorParam(); 156 System.out.println( errMsg ); 157 } 158 } 159 } 160 } 161 162 /** 163 * 各オブジェクトから自分のインスタンスを返します。 164 * 自分自身をキャッシュするのか、新たに作成するのかは、各サブクラスの実装にまかされます。 165 * 166 * @og.rev 3.1.1.1 (2003/04/03) 各オブジェクトから自分のインスタンスを返すファクトリメソッドを追加。 167 * @og.rev 3.1.2.1 (2003/04/10) synchronized を、削除します。 168 * 169 * @param clm DBColumnオブジェクト 170 * 171 * @return CellEditorオブジェクト 172 * @og.rtnNotNull 173 */ 174 public CellEditor newInstance( final DBColumn clm ) { 175 return new Editor_YMD( clm ); 176 } 177 178 /** 179 * データの編集用文字列を返します。 180 * 181 * @og.rev 8.0.2.0 (2021/11/30) 日付送り戻し対応 182 * @og.rev 8.0.3.0 (2021/12/17) イメージにname属性を付けるため、spanタグで囲います。 183 * @og.rev 8.1.2.3 (2022/05/20) 日付送り戻し不具合対応(useDateFeed 属性追加) 184 * @og.rev 8.5.4.1 (2023/12/22) HTML5廃止対応(8.0.3.0 (2021/12/17)の対応が無くても正常に動作するので削除) 185 * @og.rev 8.5.6.1 (2024/03/29) 継承で使えるように、一部修正します。 186 * 187 * @param value 入力値 188 * 189 * @return データの編集用文字列 190 * @og.rtnNotNull 191 */ 192 @Override 193 public String getValue( final String value ) { 194 if( prmAry != null && prmAry.length < CNT_ARY ) { 195 return "<span class=\"error\">" + errMsg + "</span>"; 196 } 197 198 final String tag = new TagBuffer( "input" ) 199 .add( "name" , name ) 200 // 8.5.4.2 (2024/01/12) import static … を個別に記述 201 .add( "id" , name , StringUtil.isNull( attributes.get( "id" ) ) ) 202 .add( "value" , value ) 203 .add( "size" , size1 ) 204 .add( tagBuffer.makeTag() ) 205 .makeTag(); 206 207 if( hidden ) { 208 return tag; 209 } else { 210 final StringBuilder buf = new StringBuilder(BUFFER_MIDDLE) 211 .append( tag ) 212 .append( getPopupButton( name ) ); // 8.5.6.1 (2024/03/29) 213 214 // 日付送り戻し対応 215// if( prmAry != null && prmAry.length > 0 ) { // 8.1.2.3 (2022/05/20) Modify 216 if( useDateFeed && prmAry != null && prmAry.length > 0 ) { 217// buf.append( "<span name=\"img" ).append( name ).append( "\">" ); // 8.0.3.0 (2021/12/17) 8.5.4.1 (2023/12/22) Delete 218 // 8.5.4.2 (2024/01/12) import static … を個別に記述 219 final String nmid = StringUtil.isNull( attributes.get( "id" ) ) ? name : attributes.get( "id" ); 220 // 第一回目の処理は、日付戻しを指定します。 221 // 第二回目の処理は、初期化します。 222 // 第三回目の処理は、日付送りを指定します。 223 for( int i=0; i<CNT_ARY; i++ ) { 224 // 8.5.4.2 (2024/01/12) PMD 7.0.0 LinguisticNaming 225// buf.append( String.format( FR_STR + FR_END, "YMD", nmid, value, prmAry[i], isSubm, FR_IMG[i] ) ); 226// buf.append( String.format( FR_STR + FR_END, "YMD", nmid, value, prmAry[i], onSubm, FR_IMG[i] ) ); 227 buf.append( String.format( FR_STR + FR_END, clsKey, nmid, value, prmAry[i], onSubm, FR_IMG[i] ) ); // 8.5.6.1 (2024/03/29) clsKey 使用 228 } 229// buf.append( "</span>" ); // 8.0.3.0 (2021/12/17) 8.5.4.1 (2023/12/22) Delete 230 } 231 return buf.toString(); 232 } 233 } 234 235 /** 236 * name属性を変えた、データ表示/編集用のHTML文字列を作成します。 237 * テーブル上の name に 行番号を付加して、名前_行番号 で登録するキーを作成し、 238 * リクエスト情報を1つ毎のフィールドで処理できます。 239 * 240 * @og.rev 8.0.2.0 (2021/11/30) 日付送り戻し対応 241 * @og.rev 8.0.3.0 (2021/12/17) イメージにname属性を付けるため、spanタグで囲います。 242 * @og.rev 8.1.2.3 (2022/05/20) 日付送り戻し不具合対応(useDateFeed 属性追加) 243 * @og.rev 8.5.4.1 (2023/12/22) HTML5廃止対応(8.0.3.0 (2021/12/17)の対応が無くても正常に動作するので削除) 244 * @og.rev 8.5.6.1 (2024/03/29) 継承で使えるように、一部修正します。 245 * 246 * @param row 行番号 247 * @param value 入力値 248 * 249 * @return データ表示/編集用の文字列 250 * @og.rtnNotNull 251 */ 252 @Override 253 public String getValue( final int row,final String value ) { 254 if( prmAry != null && prmAry.length < CNT_ARY ) { 255 return "<span class=\"error\">" + errMsg + " row=" + row + "</span>"; 256 } 257 258 final String name2 = name + HybsSystem.JOINT_STRING + row; 259 260 final String tag = new TagBuffer( "input" ) 261 .add( "name" , name2 ) 262 // 8.5.4.2 (2024/01/12) import static … を個別に記述 263 .add( "id" , name2 , StringUtil.isNull( attributes.get( "id" ) ) ) 264 .add( "value" , value ) 265 .add( "size" , size2 ) 266 .add( tagBuffer.makeTag() ) 267 .makeTag( row,value ); 268 269 if( hidden ) { 270 return tag; 271 } else { 272 final StringBuilder buf = new StringBuilder(BUFFER_MIDDLE) 273 .append( tag ) 274 .append( getPopupButton( name2 ) ); // 8.5.6.1 (2024/03/29) 275 276 // 日付送り戻し対応 277// if( prmAry != null && prmAry.length > 0 ) { // 8.1.2.3 (2022/05/20) Modify 278 if( useDateFeed && prmAry != null && prmAry.length > 0 ) { 279 // 8.5.4.2 (2024/01/12) import static … を個別に記述 280 final String nmid = StringUtil.isNull( attributes.get( "id" ) ) ? name2 : attributes.get( "id" ); 281 // 第一回目の処理は、日付戻しを指定します。 282 // 第二回目の処理は、初期化します。 283 // 第三回目の処理は、日付送りを指定します。 284// buf.append( "<span name=\"img" ).append( name2 ).append( "\">" ); // 8.0.3.0 (2021/12/17) 8.5.4.1 (2023/12/22) Delete 285 for( int i=0; i<CNT_ARY; i++ ) { 286 // 8.5.4.2 (2024/01/12) PMD 7.0.0 LinguisticNaming 287// buf.append( String.format( FR_STR + FR_END, "YMD", nmid, value, prmAry[i], isSubm, FR_IMG[i] ) ); 288// buf.append( String.format( FR_STR + FR_END, "YMD", nmid, value, prmAry[i], onSubm, FR_IMG[i] ) ); 289 buf.append( String.format( FR_STR + FR_END, clsKey, nmid, value, prmAry[i], onSubm, FR_IMG[i] ) ); // 8.5.6.1 (2024/03/29) clsKey 使用 290 } 291// buf.append( "</span>" ); // 8.0.3.0 (2021/12/17) 8.5.4.1 (2023/12/22) Delete 292 } 293 return buf.toString(); 294 } 295 } 296 297 /** 298 * name属性を指定してポップアップ用のボタンタグを生成します。 299 * これは、継承元(Editor_YMD)では、空文字列を返し、継承先で使用します。 300 * 301 * @og.rev 8.5.6.1 (2024/03/29) 継承で使えるように、一部修正します。 302 * 303 * @param name 名前 304 * 305 * @return Popup用のボタンのタグ 306 * @og.rtnNotNull 307 */ 308 protected String getPopupButton( final String name ) { 309 return ""; 310 } 311}