ModelEditPage.java

package eu.javaexperience.webgsdb.activity;

import java.lang.reflect.Modifier;
import java.util.Collection;
import java.util.List;

import org.teavm.jso.dom.events.EventListener;
import org.teavm.jso.dom.events.MouseEvent;
import org.teavm.jso.dom.html.HTMLElement;

import eu.javaexperience.classes.ClassDescriptor;
import eu.javaexperience.classes.dinamic.DinamicModelManager;
import eu.javaexperience.gsdbrpc.WebDbModel;
import eu.javaexperience.interfaces.simple.SimpleCall;
import eu.javaexperience.reflect.CastTo;
import eu.javaexperience.teavm.datareprez.DataObjectTeaVMImpl;
import eu.javaexperience.text.StringTools;
import eu.javaexperience.verify.TranslationFriendlyValidationEntry;
import eu.javaexperience.webgsdb.frontend.BasicModelManagerUnit;
import eu.javaexperience.webgsdb.frontend.GenericModelManagementApi;
import eu.javaexperience.webgsdb.test.WebGsdbFrontendTestTools;
import eu.jvx.js.lib.bindings.H;
import eu.jvx.js.lib.bindings.VanillaTools;
import eu.jvx.js.lib.style.TbsStyle;
import eu.jvx.js.lib.ui.FrontendTools;
import eu.teasite.frontend.api.ApiClient;
import hu.ddsi.java.database.GenericStorage;
import hu.ddsi.java.database.GenericStoreData;

public class ModelEditPage
{
	protected H targetContainer;
	protected final ApiClient api;
	protected final DinamicModelManager modelAccess;
	protected String modelNamespace;
	
	public ModelEditPage(H targetConteiner, ApiClient client, String modelNamespace)
	{
		this.targetContainer = targetConteiner;
		api = client;
		this.modelNamespace = modelNamespace;
		
		modelAccess = createModelManager(client, modelNamespace);
	}
	
	public static DinamicModelManager<WebDbModel> createModelManager(ApiClient api, String modelNamespace)
	{
		return new DinamicModelManager<WebDbModel>
		(
			api.getApiClass(GenericModelManagementApi.class, modelNamespace),
			new DataObjectTeaVMImpl(),
			null
		)
		{
			@Override
			public WebDbModel createModelInstance()
			{
				return new WebDbModel()
				{
					@Override
					public String toString()
					{
						String cls = (String) getExtraDataMap().get("class");
						if(null != cls)
						{
							StringTools.getSubstringAfterLastString(cls, ".", cls);
						}
						
						return cls+": "+get("label");
					}
					
					@Override
					public boolean set(String key, Object src)
					{
						if("do".equals(key))
						{
							GenericStoreData data = GenericStorage.getOrCreateGenericStoreData(this);
							data.setId((Long) CastTo.Long.cast(src));
						}
						return super.set(key, src);
					}

					@Override
					public Object get(String key)
					{
						if("class".equals(key))
						{
							return (String) getExtraDataMap().get("class");
						}
						return super.get(key);
					}
					
					@Override
					public boolean validate(Collection<TranslationFriendlyValidationEntry> errors_and_warnings)
					{
						return false;
					}

					@Override
					public boolean delete(Collection<TranslationFriendlyValidationEntry> validate)
					{
						return false;
					}
				};
			}
		};
	}

	public void initAfterInsert()
	{
		FrontendTools.runOnThread(new SimpleCall()
		{
			@Override
			public void call()
			{
				H add = new H("div");
				
				List<ClassDescriptor> models = modelAccess.getManagedModels();
				
				for(ClassDescriptor cd:models)
				{
					if(!Modifier.isAbstract(cd.getModifiers()))
					{
						add.addChilds
						(
							createModelEditorButton(cd),
							new H("br").getHtml()
						);
					}
				}
				
				add.addChilds(new H("div").attrs("id", "current_model_editor").getHtml());
				
				targetContainer.addChilds(add);
			}
		});
	}
	
	public HTMLElement createModelEditorButton(final ClassDescriptor cls)
	{
		H ret = new H("div");
		ret.attrs("#text", cls.getClassName(), "class", WebGsdbFrontendTestTools.CSS_BTN_SELECT_TABLE);
		ret.style(TbsStyle.BTN_SUCCESS);
		ret.onClick(new EventListener<MouseEvent>()
		{
			@Override
			public void handleEvent(MouseEvent arg0)
			{
				HTMLElement tar = VanillaTools.getDom().getElementById("current_model_editor");
				VanillaTools.removeAllChild(tar);
				
				BasicModelManagerUnit add = createModelManagerUnit(cls);
				tar.appendChild(new H("h4").attrs("#text", "Model: "+cls.getClassName()).getHtml());
				tar.appendChild(add.getHtml());
				add.refresh();
			}
		});
		return ret.getHtml();
	}
	
	protected BasicModelManagerUnit createModelManagerUnit(ClassDescriptor cls)
	{
		return new BasicModelManagerUnit(cls, modelAccess, api);
	}
}