ModalColumnForm.hx 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. package hide.comp.cdb;
  2. import cdb.Data;
  3. class ModalColumnForm extends Modal {
  4. var contentModal : Element;
  5. var form : Element;
  6. public function new(base : cdb.Database, column : cdb.Data.Column, ?parent,?el) {
  7. super(parent,el);
  8. var editForm = (column != null);
  9. contentModal = new Element("<div>").addClass("content-modal").appendTo(content);
  10. if (editForm)
  11. new Element("<h2> Edit column </h2>").appendTo(contentModal);
  12. else
  13. new Element("<h2> Create column </h2>").appendTo(contentModal);
  14. new Element("<p id='errorModal'></p>").appendTo(contentModal);
  15. form = new Element('<form id="col_form" onsubmit="return false">
  16. <div>Column name</div> <input type="text" name="name"/>
  17. <br /><br />
  18. <div>Column type</div>
  19. <select name="type" onchange="$(\'#col_options\').attr(\'class\',\'t_\'+this.value)">
  20. <option value="">---- Choose -----</option>
  21. <option value="id">Unique Identifier</option>
  22. <option value="string">Text</option>
  23. <option value="bool">Boolean</option>
  24. <option value="int">Integer</option>
  25. <option value="float">Float</option>
  26. <option value="enum">Enumeration</option>
  27. <option value="flags">Flags</option>
  28. <option value="ref">Reference</option>
  29. <option value="list">List</option>
  30. <option value="properties">Properties</option>
  31. <option value="color">Color</option>
  32. <option value="file">File</option>
  33. <option value="image">Image</option>
  34. <option value="tilepos">Tile</option>
  35. <option value="dynamic">Dynamic</option>
  36. <option value="layer">Data Layer</option>
  37. <option value="tilelayer">Tile Layer</option>
  38. <option value="custom">Custom Type</option>
  39. </select>
  40. <br /><br />
  41. <div id="col_options">
  42. <div class="values">
  43. Possible Values
  44. <br />
  45. <input type="text" name="values" name="vals"/>
  46. <br /><br />
  47. </div>
  48. <div class="sheet">
  49. Sheet
  50. <br />
  51. <select name="sheet"></select>
  52. <br /><br />
  53. </div>
  54. <div class="disp">
  55. Display
  56. <br />
  57. <select name="display">
  58. <option value="0">Default</option>
  59. <option value="1">Percentage</option>
  60. </select>
  61. <br /><br />
  62. </div>
  63. <div class="localizable"><input type="checkbox" name="localizable"/> Localizable<br /><br /></div>
  64. <div class="custom">
  65. Type
  66. <select name="ctype"></select>
  67. <br /><br />
  68. </div>
  69. <div class="opt"><input type="checkbox" name="req"/> Required</div>
  70. </div>
  71. <br /><br />
  72. <p class="buttons">
  73. <input class="edit" type="submit" value="Modify" id="editBtn" />
  74. <input class="create" type="submit" value="Create" id="createBtn" />
  75. <input type="submit" value="Cancel" id="cancelBtn" />
  76. </p>
  77. </form>').appendTo(contentModal);
  78. var sheets = form.find("[name=sheet]");
  79. sheets.empty();
  80. for( i in 0...base.sheets.length ) {
  81. var s = base.sheets[i];
  82. if( s.props.hide ) continue;
  83. new Element("<option>").attr("value", "" + i).text(s.name).appendTo(sheets);
  84. }
  85. var types = form.find("[name=ctype]");
  86. types.empty();
  87. types.off("change");
  88. types.change(function(_) {
  89. new Element("#col_options").toggleClass("t_edit",types.val() != "");
  90. });
  91. new Element("<option>").attr("value", "").text("--- Select ---").appendTo(types);
  92. for( t in base.getCustomTypes() )
  93. new Element("<option>").attr("value", "" + t.name).text(t.name).appendTo(types);
  94. if (editForm) {
  95. form.addClass("edit");
  96. form.find("[name=name]").val(column.name);
  97. form.find("[name=type]").val(column.type.getName().substr(1).toLowerCase()).change();
  98. form.find("[name=req]").prop("checked", !column.opt);
  99. form.find("[name=display]").val(column.display == null ? "0" : Std.string(column.display));
  100. form.find("[name=localizable]").prop("checked", column.kind==Localizable);
  101. switch( column.type ) {
  102. case TEnum(values), TFlags(values):
  103. form.find("[name=values]").val(values.join(","));
  104. case TRef(sname), TLayer(sname):
  105. form.find("[name=sheet]").val( "" + base.sheets.indexOf(base.getSheet(sname)));
  106. case TCustom(name):
  107. form.find("[name=ctype]").val(name);
  108. default:
  109. }
  110. } else {
  111. form.addClass("create");
  112. form.find("input").not("[type=submit]").val("");
  113. form.find("[name=req]").prop("checked", true);
  114. form.find("[name=localizable]").prop("checked", false);
  115. }
  116. contentModal.click( function(e) e.stopPropagation());
  117. element.click(function(e) {
  118. closeModal();
  119. });
  120. form.find("#cancelBtn").click(function(e) closeModal());
  121. }
  122. public function setCallback(callback : (Void -> Void)) {
  123. form.find("#createBtn").click(function(e) callback());
  124. form.find("#editBtn").click(function(e) callback());
  125. }
  126. public function closeModal() {
  127. content.empty();
  128. close();
  129. }
  130. public function getColumn(base : cdb.Database, sheet : cdb.Sheet, refColumn : cdb.Data.Column) : Column{
  131. var v : Dynamic<String> = { };
  132. var cols = form.find("input, select").not("[type=submit]");
  133. for( i in cols.elements() )
  134. Reflect.setField(v, i.attr("name"), i.attr("type") == "checkbox" ? (i.is(":checked")?"on":null) : i.val());
  135. var t : ColumnType = switch( v.type ) {
  136. case "id": TId;
  137. case "int": TInt;
  138. case "float": TFloat;
  139. case "string": TString;
  140. case "bool": TBool;
  141. case "enum":
  142. var vals = StringTools.trim(v.values).split(",");
  143. if( vals.length == 0 ) {
  144. error("Missing value list");
  145. return null;
  146. }
  147. TEnum([for( f in vals ) StringTools.trim(f)]);
  148. case "flags":
  149. var vals = StringTools.trim(v.values).split(",");
  150. if( vals.length == 0 ) {
  151. error("Missing value list");
  152. return null;
  153. }
  154. TFlags([for( f in vals ) StringTools.trim(f)]);
  155. case "ref":
  156. var s = base.sheets[Std.parseInt(v.sheet)];
  157. if( s == null ) {
  158. error("Sheet not found");
  159. return null;
  160. }
  161. TRef(s.name);
  162. case "image":
  163. TImage;
  164. case "list":
  165. TList;
  166. case "custom":
  167. var t = base.getCustomType(v.ctype);
  168. if( t == null ) {
  169. error("Type not found");
  170. return null;
  171. }
  172. TCustom(t.name);
  173. case "color":
  174. TColor;
  175. case "layer":
  176. var s = base.sheets[Std.parseInt(v.sheet)];
  177. if( s == null ) {
  178. error("Sheet not found");
  179. return null;
  180. }
  181. TLayer(s.name);
  182. case "file":
  183. TFile;
  184. case "tilepos":
  185. TTilePos;
  186. case "tilelayer":
  187. TTileLayer;
  188. case "dynamic":
  189. TDynamic;
  190. case "properties":
  191. TProperties;
  192. default:
  193. return null;
  194. }
  195. var c : Column = {
  196. type : t,
  197. typeStr : null,
  198. name : v.name,
  199. };
  200. if( v.req != "on" ) c.opt = true;
  201. if( v.display != "0" ) c.display = cast Std.parseInt(v.display);
  202. if( v.localizable == "on" ) c.kind = Localizable;
  203. return c;
  204. }
  205. public function error(str : String) {
  206. contentModal.find("#errorModal").html(str);
  207. }
  208. }