package hide.comp.cdb;
import cdb.Data;
class ModalColumnForm extends Modal {
var contentModal : Element;
var form : Element;
var editor : Editor;
var sheet : cdb.Sheet;
public function new( editor : Editor, sheet : cdb.Sheet, column : cdb.Data.Column, ?parent,?el) {
super(parent,el);
var editForm = (column != null);
var base = editor.base;
this.editor = editor;
this.sheet = sheet;
contentModal = new Element("
").addClass("content-modal").appendTo(content);
if (editForm)
new Element("
Edit column ").appendTo(contentModal);
else
new Element("
Create column ").appendTo(contentModal);
new Element("
").appendTo(contentModal);
form = new Element('
').appendTo(contentModal);
var parent = sheet.getParent();
if( parent == null )
form.find(".scope").remove();
else {
var scope = 1;
var scopes = form.find("[name=scope]");
var p = parent;
while( p != null ) {
if( p.s.idCol != null )
new Element("
").attr("value",""+scope).text(p.s.name).appendTo(scopes);
p = p.s.getParent();
scope++;
}
}
var sheets = form.find("[name=sheet]");
sheets.empty();
for( i in 0...base.sheets.length ) {
var s = base.sheets[i];
if( s.idCol == null ) continue;
if( s.idCol.scope != null && !StringTools.startsWith(sheet.name,s.name.split("@").slice(0,-s.idCol.scope).join("@")) ) continue;
new Element(" ").attr("value", "" + i).text(s.name).appendTo(sheets);
}
var types = form.find("[name=type]");
function changeFieldType() {
form.find("table").attr("class","").toggleClass("t_"+types.val());
}
types.change(function(_) changeFieldType());
changeFieldType();
var ctypes = form.find("[name=ctype]");
new Element(" ").attr("value", "").text("--- Select ---").appendTo(ctypes);
for( t in base.getCustomTypes() )
new Element(" ").attr("value", "" + t.name).text(t.name).appendTo(ctypes);
var cforms = form.find("[name=formula]");
for( f in editor.formulas.getList(sheet) )
new Element(" ").attr("value", f.name).text(f.name).appendTo(cforms);
function toggleHide() {
form.find(".can-hide").toggleClass("hide");
}
form.find(".hide").addClass("can-hide");
form.find(".doctog").click(function(_) toggleHide());
if (editForm) {
form.addClass("edit");
form.find("[name=name]").val(column.name);
form.find("[name=type]").val(column.type.getName().substr(1).toLowerCase()).change();
form.find("[name=req]").prop("checked", !column.opt);
form.find("[name=display]").val(column.display == null ? "0" : Std.string(column.display));
form.find("[name=kind]").val(column.kind == null ? "" : ""+column.kind);
form.find("[name=scope]").val(column.scope == null ? "" : ""+column.scope);
form.find("[name=hidden]").prop("checked", column.kind == Hidden);
if( column.documentation != null ) {
form.find("[name=doc]").val(column.documentation);
form.find(".doc").removeClass("hide");
}
switch( column.type ) {
case TEnum(values), TFlags(values):
form.find("[name=values]").val(values.join(","));
case TRef(sname), TLayer(sname):
var index = base.sheets.indexOf(base.getSheet(sname));
form.find("[name=sheet]").val( "" + index);
case TCustom(name):
form.find("[name=ctype]").val(name);
case TInt, TFloat:
var p = editor.getColumnProps(column);
form.find("[name=formula]").val( p.formula == null ? "" : p.formula );
form.find("[name=export]").prop( "checked", !p.ignoreExport );
default:
}
} else {
form.addClass("create");
form.find("input").not("[type=submit]").val("");
var isProp = sheet.parent != null && sheet.parent.sheet.columns[sheet.parent.column].type == TProperties;
form.find("[name=req]").prop("checked", !isProp);
form.find("[name=kind]").val("");
}
form.find("[name=name]").focus();
contentModal.keydown(function(e) { if( e.keyCode == 27 ) closeModal(); e.stopPropagation(); });
contentModal.keypress(function(e) e.stopPropagation());
contentModal.click( function(e) e.stopPropagation());
form.find("#cancelBtn").click(function(e) closeModal());
if( column != null && editor.getColumnProps(column).formula != null )
toggleHide();
}
public function setCallback(callback : (Void -> Void)) {
form.find("#createBtn").click(function(e) callback());
form.find("#editBtn").click(function(e) callback());
}
public function closeModal() {
content.empty();
close();
}
public function getColumn( refColumn : cdb.Data.Column) : Column{
var base = editor.base;
var v : Dynamic = { };
var cols = form.find("input, select, textarea").not("[type=submit]");
for( i in cols.elements() )
Reflect.setField(v, i.attr("name"), i.attr("type") == "checkbox" ? (i.is(":checked")?"on":null) : i.val());
var t : ColumnType = switch( v.type ) {
case "id": TId;
case "int": TInt;
case "float": TFloat;
case "string": TString;
case "bool": TBool;
case "enum":
var vals = StringTools.trim(v.values).split(",");
if( vals.length == 0 ) {
error("Missing value list");
return null;
}
TEnum([for( f in vals ) StringTools.trim(f)]);
case "flags":
var vals = StringTools.trim(v.values).split(",");
if( vals.length == 0 ) {
error("Missing value list");
return null;
}
TFlags([for( f in vals ) StringTools.trim(f)]);
case "ref":
var s = base.sheets[Std.parseInt(v.sheet)];
if( s == null ) {
error("Sheet not found");
return null;
}
TRef(s.name);
case "image":
TImage;
case "list":
TList;
case "custom":
var t = base.getCustomType(v.ctype);
if( t == null ) {
error("Type not found");
return null;
}
TCustom(t.name);
case "color":
TColor;
case "layer":
var s = base.sheets[Std.parseInt(v.sheet)];
if( s == null ) {
error("Sheet not found");
return null;
}
TLayer(s.name);
case "file":
TFile;
case "tilepos":
TTilePos;
case "tilelayer":
TTileLayer;
case "dynamic":
TDynamic;
case "properties":
TProperties;
default:
return null;
}
var c : Column = {
type : t,
typeStr : null,
name : v.name,
};
if( v.req != "on" ) c.opt = true;
if( v.display != "0" ) c.display = cast Std.parseInt(v.display);
c.kind = null;
switch( v.kind ) {
case "localizable": c.kind = Localizable;
case "script": c.kind = Script;
}
if( form.find("[name=hidden]").is(":checked") ) c.kind = Hidden;
var props = editor.getColumnProps(c);
switch( t ) {
case TFloat, TInt:
props.formula = form.find("[name=formula]").val();
if( props.formula == "" ) props.formula = null;
props.ignoreExport = props.formula != null && !form.find("[name=export]").is(":checked") ? true : null;
default:
}
if( t == TId && v.scope != "" ) c.scope = Std.parseInt(v.scope);
if( v.doc != "" ) c.documentation = v.doc;
var hasProp = false;
for( f in Reflect.fields(props) )
if( Reflect.field(props,f) == null )
Reflect.deleteField(props, f);
else
hasProp = true;
c.editor = hasProp ? props : js.Lib.undefined;
return c;
}
public function error(str : String) {
contentModal.find("#errorModal").html(str);
}
}