ModelTableGeneratorTools.java

package eu.javaexperience.webgsdb.frontend;

import java.util.Date;
import java.util.List;

import org.teavm.jso.JSObject;
import org.teavm.jso.dom.html.HTMLElement;
import org.teavm.jso.json.JSON;

import eu.javaexperience.classes.ClassDescriptor;
import eu.javaexperience.classes.ClassFieldDescriptor;
import eu.javaexperience.datareprez.DataCommon;
import eu.javaexperience.datareprez.convertFrom.ObjectLike;
import eu.javaexperience.gsdbrpc.WebDbModel;
import eu.javaexperience.gsdbrpc.WebGsdbTools;
import eu.javaexperience.interfaces.simple.getBy.GetBy1;
import eu.javaexperience.interfaces.simple.getBy.GetBy3;
import eu.javaexperience.interfaces.simple.publish.SimplePublish1;
import eu.javaexperience.teasite.frontend.table.GeneratedResultTable;
import eu.javaexperience.teasite.frontend.table.ResultTableGenerator;
import eu.javaexperience.teasite.frontend.table.ResultTableGenerator.TableField;
import eu.javaexperience.text.Format;
import eu.javaexperience.webgsdb.commons.FieldExtraAttributes;
import eu.javaexperience.webgsdb.commons.FrontendFieldManager;
import eu.jvx.js.lib.bindings.H;
import eu.jvx.js.lib.bindings.VanillaTools;
import eu.jvx.js.lib.bindings.VanillaTools.ClassList;
import eu.jvx.js.lib.ui.component.table.SimpleTableStructureManager;
import eu.jvx.js.lib.ui.component.table.TableRow;

public class ModelTableGeneratorTools
{
	public static String getFieldLabelName(ClassFieldDescriptor fd)
	{
		FieldExtraAttributes extra = FieldExtraAttributes.parse(fd);
		if(null != extra)
		{
			if(null != extra.transaltionLabel)
			{
				return extra.transaltionLabel;
			}
		}
		
		return fd.getName();
	}
	
	public static <S> ResultTableGenerator<S> createFromDescriptor(ClassDescriptor cls, GetBy3<HTMLElement, TableField<S>, TableRow, S> fieldRender)
	{
		ResultTableGenerator<S> ret = new ResultTableGenerator<>();
		final List<? extends ClassFieldDescriptor> fds = cls.getAllField();
		ret.getFields = new SimplePublish1<List<TableField<S>>>()
		{
			@Override
			public void publish(List<TableField<S>> a)
			{
				for(ClassFieldDescriptor fd:fds)
				{
					if(!fd.isUserAccessible())
					{
						continue;
					}
					
					FieldExtraAttributes mfd = FieldExtraAttributes.parse(fd);
					if(null == mfd || mfd.userMaySee)
					{
						TableField<S> tf = new TableField<>();
						tf.getExtraDataMap().put("fd", fd);
						tf.fieldName = fd.getName();
						tf.renderLabel = new GetBy1<HTMLElement, ResultTableGenerator.TableField<S>>()
						{
							@Override
							public HTMLElement getBy(TableField<S> a)
							{
								return new H("span").attrs("#text", ModelTableGeneratorTools.getFieldLabelName(fd)).getHtml();
							}
						};
						
						tf.renderField = fieldRender;
						
						a.add(tf);
					}
				}
			}
		};
		
		return ret;
	}
	
	public static <S, D extends WebDbModel> GeneratedResultTable<S> generateResultTable
	(
		ClassDescriptor cls,
		final GetBy3<HTMLElement, ResultTableGenerator.TableField<S>, TableRow, S> fieldRender,
		Iterable<S> arr,
		GetBy1<ResultTableGenerator<S>, ResultTableGenerator<S>> generatorModifier
	)
		throws Throwable
	{
		ResultTableGenerator<S> gen = createFromDescriptor(cls, fieldRender);
		
		if(null != generatorModifier)
		{
			gen = generatorModifier.getBy(gen);
		}
		
		GeneratedResultTable<S> ret = gen.generate(SimpleTableStructureManager.INSTANCE, arr);
		ClassList cl = VanillaTools.getClassList(ret.html);
		cl.add("table");
		cl.add("table-hover");
		cl.add("table-striped");
		cl.add("table-responsive");
		return ret;
	}
	
	public static <S extends ObjectLike, D extends WebDbModel> GeneratedResultTable<S> generateResultTable
	(
		ClassDescriptor cls,
		Iterable<S> arr,
		GetBy1<ResultTableGenerator<S>, ResultTableGenerator<S>> generatorModifier
	)
		throws Throwable
	{
		return generateResultTable
		(
			cls,
			(GetBy3)DEFAULT_MODEL_FIELD_RENDERER,
			(Iterable<S>)(Iterable)arr,
			generatorModifier
		);
	}
	
	public static GetBy3<HTMLElement, TableField<ObjectLike>, TableRow, ObjectLike> DEFAULT_MODEL_FIELD_RENDERER = new GetBy3<HTMLElement, TableField<ObjectLike>, TableRow, ObjectLike>()
	{
		@Override
		public HTMLElement getBy(TableField<ObjectLike> a, TableRow b, ObjectLike c)
		{
			ClassFieldDescriptor fd = (ClassFieldDescriptor) a.getExtraDataMap().get("fd");
			String val = "";
			FieldExtraAttributes fmd = FieldExtraAttributes.parse(fd);
			FrontendFieldManager ffm = WebGsdbTools.getFrontendFieldManager((WebDbModel) c, fd, fmd);
			val = ffm.toString((WebDbModel) c, fd.getName());
			return new H("span").attrs("#text", val, "data-name", fd.getName(), "data-value", attrToString(c.get(fd.getName()))).getHtml();
		}
	};
	
	protected static String attrToString(Object o)
	{
		if(o instanceof DataCommon)
		{
			return JSON.stringify((JSObject) ((DataCommon)o).getImpl());
		}
		
		if(o instanceof Date)
		{
			return Format.UTC_SQL_TIMESTAMP_MS.format((Date) o);
		}
		
		return String.valueOf(o);
	}
}