MultiDatabaseModelEditorPage.java

package eu.javaexperience.webgsdb.activity;

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

import eu.javaexperience.datareprez.DataArray;
import eu.javaexperience.interfaces.simple.SimpleCall;
import eu.javaexperience.webgsdb.frontend.MultiGenericModelManagementApi;
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.style.StyleTools.StyleAlaCarte;
import eu.jvx.js.lib.ui.FrontendTools;
import eu.jvx.js.lib.ui.form.FormBuilder;
import eu.jvx.js.tbs.ui.TbsTools;
import eu.teasite.frontend.api.ApiClient;

public class MultiDatabaseModelEditorPage
{
	protected final ApiClient api;
	
	protected MultiGenericModelManagementApi databaseApis;
	
	protected String namespace;
	
	protected H targetContainer;
	public MultiDatabaseModelEditorPage(H targetContainer, ApiClient client, String modelNamespace)
	{
		api = client;
		
		databaseApis = client.getApiClass(MultiGenericModelManagementApi.class, modelNamespace);
		namespace = modelNamespace;
		this.targetContainer = targetContainer;
	}

	public void showDatabases()
	{
		FrontendTools.runOnThread(new SimpleCall()
		{
			@Override
			public void call()
			{
				DataArray dbs = databaseApis.listDatabases();
				
				setHeader(new H("div").attrs("#text", "Select a database").style(StyleAlaCarte.TEXT_CENTER).getHtml());

				H add = new H("div");
				for(int i=0;i<dbs.size();++i)
				{
					String db = dbs.getString(i);
					add.addChilds(new H("div").addChilds(createDatabaseSelectButton(db)));
				}
				
				setBody(add.getHtml());
			}
		});
	}
	
	protected void selectDatabase(String db)
	{
		try
		{
			databaseApis.selectDatabase(db);
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
		
		//todo select database, place title, show permissions and operations
		setHeader
		(
			new H("div").style(TbsStyle.ALERT_INFO).addChilds
			(
				new H("div").addChilds
				(
					new H("div").attrs("#text", "Back").style(StyleAlaCarte.DISPLAY_INLINE_BLOCK, TbsStyle.BTN_SUCCESS).onClick((e)->showDatabases()),		
					generatePermissionLabels()
				),
				new H("div").attrs("#text", db, "id", "current_database_name").style(TbsStyle.ALERT_WARNING, StyleAlaCarte.TEXT_CENTER).getHtml()
			).getHtml()
		);
		
		ModelEditPage editor = createModelEditor(db);
		
		editor.initAfterInsert();
	}
	
	protected ModelEditPage createModelEditor(String db)
	{
		return new ModelEditPage(targetContainer, api, namespace);
	}
	
	public HTMLElement createDatabaseSelectButton(final String db)
	{
		H ret = new H("div");
		ret.attrs("#text", db, "class", WebGsdbFrontendTestTools.CSS_BTN_SELECT_DATABASE);
		ret.style(TbsStyle.BTN_SUCCESS);
		ret.onClick(new EventListener<MouseEvent>()
		{
			@Override
			public void handleEvent(MouseEvent arg0)
			{
				selectDatabase(db);
			}
		});
		return ret.getHtml();
	}
	
	protected HTMLElement generatePermissionLabels()
	{
		H ret = new H("div").style(StyleAlaCarte.DISPLAY_INLINE_BLOCK, StyleAlaCarte.FLOAT_RIGHT);
		
		DataArray arr = databaseApis.getPermissions();
		for(int i=0;i<arr.size();++i)
		{
			String s = arr.getString(i);
			
			H elem = null;
			
			if(s.equals("fork"))
			{
				elem = generateForkButton();
			}
			else
			{
				elem = new H("span").style(TbsStyle.LABEL_INFO).attrs("#text", s);
			}
			
			ret.addChilds
			(
				elem,
				new H("span").attrs("#text", " ").getHtml()
			);
		}
		
		return ret.getHtml();
	}
	
	protected H generateForkButton()
	{
		return new H("span").style(TbsStyle.LABEL_SUCCESS).attrs("#text", "fork").onClick(new EventListener<MouseEvent>()
		{
			@Override
			public void handleEvent(MouseEvent arg0)
			{
				//BODY:
				TbsTools.modal
				(
					new H("span").attrs("#text", "Fork database: "+VanillaTools.getDom().querySelector("#current_database_name").getInnerHTML()).getHtml(), 
					new FormBuilder().addSm(4, 6, "New Database name:", new H("input").attrs("id", "database_fork_name").getHtml()).nerf().getHtml(),
					new H("div").addChilds
					(
						new H("div").attrs("#text", "fork").style(TbsStyle.BTN_SUCCESS).onClick(new EventListener<MouseEvent>()
						{
							@Override
							public void handleEvent(MouseEvent arg0)
							{
								String val = ((HTMLInputElement)VanillaTools.getDom().querySelector("#database_fork_name")).getValue();
								
								try
								{
									databaseApis.fork(val);
									TbsTools.closeModal(arg0.getTarget().cast());
								}
								catch(Exception e)
								{
									e.printStackTrace();
								}
							}
						}),
						TbsTools.createModalCloseButton("Cancel")
					).getHtml()
				);
			}
		});
	}
	
	protected void setBody(HTMLElement html)
	{
		HTMLElement el = VanillaTools.getDom().getElementById("model_editor_target");
		VanillaTools.removeAllChild(el);
		if(null != html)
		{
			el.appendChild(html);
		}
	}
	
	protected void setHeader(HTMLElement html)
	{
		HTMLElement el = VanillaTools.getDom().getElementById("model_editor_header");
		VanillaTools.removeAllChild(el);
		if(null != html)
		{
			el.appendChild(html);
		}
	}
	
	protected HTMLElement createRootElement()
	{
		return new H("div").attrs("id", "multi_model_editor_target").addChilds
		(
			new H("div").attrs("id", "model_editor_header"),
			new H("div").attrs("id", "model_editor_target")
		).getHtml();
	}
}