BaseEditorFields.java
package sk.iway.iwcm.system.datatable;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Getter;
import lombok.Setter;
import sk.iway.iwcm.Constants;
import sk.iway.iwcm.Logger;
import sk.iway.iwcm.Tools;
import sk.iway.iwcm.components.enumerations.EnumerationDataDB;
import sk.iway.iwcm.components.enumerations.model.EnumerationDataBean;
import sk.iway.iwcm.doc.DocDB;
import sk.iway.iwcm.doc.DocDetails;
import sk.iway.iwcm.doc.GroupDetails;
import sk.iway.iwcm.doc.GroupsDB;
import sk.iway.iwcm.editor.FieldType;
import sk.iway.iwcm.editor.rest.Field;
import sk.iway.iwcm.editor.rest.FieldValue;
import sk.iway.iwcm.i18n.Prop;
/**
* Zakladna trieda pre EditorFields Datatabulky, obsahuje spolocne vlastnosti, primarne nastavenie CSS riadku a ikony
*/
@Getter
@Setter
public class BaseEditorFields {
private String rowClass;
//zoznam stavovych ikon, je to jsonignore, musi sa pridat specialne v EditorFields objekte ako @DatatableColumn(...) String statusIcons;
@JsonIgnore
private List<String> statusIconsList;
//zoznam volnych poli
private List<Field> fieldsDefinition;
//properties key prefix for fields definition, needs to be set for autocomplete field
private String fieldsDefinitionKeyPrefix;
//poslanie notifikacie, je potrebne pri getOne alebo pri ulozeni
private List<NotifyBean> notify;
/**
* Prida CSS triedu k ROW tagu (implementovane v index.js v optione rowCallback: DT)
* @param addClass
*/
public void addRowClass(String addClass) {
if (Tools.isEmpty(rowClass)) rowClass = addClass;
else rowClass += " "+addClass;
}
/**
* Prida novu ikonu k textu (vytvorenu ako span element)
* @param className - ti ti-eye-off
*/
public void addStatusIcon(String className) {
if (statusIconsList == null) statusIconsList = new ArrayList<>();
statusIconsList.add(className);
}
@JsonIgnore
/**
* Vygeneruje definiciu volnych poli, presunute sem z EditorForm.getFields() pre moznost pouzitia aj v inych DT ako webpages
* @param bean - java bean, musi obsahovat metody getFieldX
* @param keyPrefix - prefix textovych klucov, napr. edior, alebo groupedit, nasledne sa hladaju kluce keyPrefix.field_X a keyPrefix.field_X.type
* @param lastAlphabet - koncove pismeno (urcuje pocet volnych poli), nap. T aleb D
* @return
*/
public List<Field> getFields(Object bean, String keyPrefix, char lastAlphabet) {
//tu musi byt getInstance aby sa prebral jazyk podla prihlaseneho usera
Prop prop = Prop.getInstance();
Prop propType = Prop.getInstance(Constants.getString("defaultLanguage"));
List<Field> fields = new ArrayList<>();
fieldsDefinitionKeyPrefix = keyPrefix;
Method method;
for (char alphabet = 'A'; alphabet <= lastAlphabet; alphabet++) {
try {
Field field = new Field();
method = bean.getClass().getMethod("getField" + alphabet);
String labelKey = keyPrefix+".field_" + Character.toLowerCase(alphabet);
String label = prop.getText(labelKey);
String typeKey = labelKey + ".type";
String type = propType.getText(typeKey);
FieldType fieldType = FieldType.asFieldType(type);
List<FieldValue> fieldValues = new ArrayList<>();
if (!type.equals(typeKey)) {
if (type.contains("|")) {
// multiple select
if(type.startsWith("multiple:")) {
type = type.replace("multiple:", "");
field.setMultiple(true);
}
String values = type.substring(type.indexOf(":") + 1);
//ak zacina na znak | chceme mat moznost prvu hodnotu mat prazdnu
if (values.startsWith("|")) fieldValues.add(new FieldValue("", ""));
for (String value : Tools.getTokens(values, "|")) {
fieldValues.add(new FieldValue(value, value));
}
}
if (type.startsWith("docsIn_")) {
//JICH - add
boolean isNull = false;
if (type.endsWith("_null")) {
isNull = true;
type = type.replace("_null", "");
}
//JICH - add end
String groupId = type.substring(type.indexOf("_") + 1);
int groupIdInt = Tools.getIntValue(groupId, 0);
if (groupIdInt > 0) {
GroupDetails group = GroupsDB.getInstance().getGroup(groupIdInt);
List<DocDetails> listOfDocs = DocDB.getInstance().getDocByGroup(groupIdInt);
if (listOfDocs != null) {
//JICH - add
if (isNull) {
fieldValues.add(new FieldValue("", ""));
}
//JICH - add end
for (DocDetails d : listOfDocs) {
if (group != null && group.getDefaultDocId() != d.getDocId()) {
fieldValues.add(new FieldValue(d.getTitle(), d.getDocId()));
}
}
}
}
}
if (type.startsWith("enumeration_")) {
boolean isNull = false;
if (type.endsWith("_null")) {
isNull = true;
type = type.replace("_null", "");
}
int enumerationId = Tools.getIntValue(type.substring(type.indexOf("_") + 1), 0);
if (enumerationId > 0) {
List<EnumerationDataBean> enumerationDataList = EnumerationDataDB.getEnumerationDataByType(enumerationId);
if (enumerationDataList != null) {
if (isNull) {
fieldValues.add(new FieldValue("", ""));
}
for (EnumerationDataBean enumData : enumerationDataList) {
fieldValues.add(new FieldValue(enumData.getString1(), enumData.getString1()));
}
}
}
}
//JICH - add
if (type.startsWith("custom-dialog")) {
//System.out.println(type);
String[] typeArray = type.split(",");
String dialogScript = "";
String displayScript = "";
if (typeArray.length > 1) dialogScript = typeArray[1];
if (typeArray.length > 2) displayScript = typeArray[2];
fieldValues.add(new FieldValue(dialogScript, displayScript));
}
//JICH - add end
}
if (fieldType == null) {
fieldType = FieldType.TEXT;
}
String value = (String) method.invoke(bean);
// TAN: textovym retazcom je mozne zadat maximalnu dlzku znakov v inpute alebo validaciu s odporucanym maximalnym poctom znakov inputu
// priklad zadania textoveho kluca: text-120, warningLength-80
int maxlength = 255;
int warninglength = 0;
try
{
if (type.startsWith("text-")) {
if (type.contains(",")) {
String[] typeArray = type.split(",");
String maxlengthstring = typeArray[0];
String warninglengthstring = typeArray[1];
maxlengthstring = maxlengthstring.substring(maxlengthstring.lastIndexOf("-") + 1);
warninglengthstring = warninglengthstring.substring(warninglengthstring.lastIndexOf("-") + 1);
maxlength = Integer.parseInt(maxlengthstring.replaceAll("[^0-9]", ""));
warninglength = Integer.parseInt(warninglengthstring.replaceAll("[^0-9]", ""));
} else {
int pomlcka = type.indexOf("-");
if (pomlcka > 0) maxlength = Tools.getIntValue(type.substring(pomlcka + 1), 255);
}
}
}
catch (Exception ex)
{
Logger.error(BaseEditorFields.class, ex);
}
field.setKey(Character.toLowerCase(alphabet) + "");
field.setLabel(label);
field.setValue(value);
if (Tools.isEmpty(field.getType())) field.setType(fieldType.name().toLowerCase());
field.setMaxlength(maxlength);
field.setWarninglength(warninglength);
if (warninglength>0) {
field.setWarningMessage( prop.getText(keyPrefix+".field_" + Character.toUpperCase(alphabet)+".warningText", String.valueOf(warninglength)));
}
if (fieldType != FieldType.TEXT) {
field.setTypeValues(fieldValues);
}
fields.add(field);
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
Logger.error(BaseEditorFields.class, e);
}
}
return fields;
}
/**
* Vrati HTML kod stavovych ikon, vo vasej triede musite implementovat minimalny kod:
* getStatusIcons() { return getStatusIconsHtml(); }
* @return
*/
@JsonIgnore
public String getStatusIconsHtml() {
StringBuilder iconsHtml = new StringBuilder();
//console.log("currentRow=", currentRow);
if (statusIconsList!=null && statusIconsList.isEmpty()==false) {
for (String icon : statusIconsList) {
iconsHtml.append("<i class=\"").append(icon).append("\"></i> ");
}
}
return iconsHtml.toString();
}
}