jq.js 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351
  1. var _textarea_class = "materialize-textarea "
  2. var _input_class = "validate "
  3. var _button_class = "input-field btn ";
  4. var _icon_class = "material-icons "
  5. var _row_class = "row "
  6. var _subcat_class = "subCat col s12 ";
  7. var _areapicker_class = "areaPicker "
  8. var _switch_class = "input-field switch "+_col_class()
  9. var _lever_class = "lever "
  10. var _file_input_class = "file-field input-field "
  11. var _file_path_wrapper_class = "file-path-wrapper "
  12. var _file_path_class = "file-path-wrapper "
  13. var _inline_fields = "input-field "+_col_class()
  14. function mergeCalss(obj={}, classes="", id=undefined)
  15. {
  16. obj.id=id;
  17. if(obj.class) obj.class+=" "+classes;
  18. else obj.class=classes;
  19. return obj;
  20. }
  21. var mc = mergeCalss;
  22. function setDef(obj, field, value)
  23. {
  24. if(obj[field]==undefined) obj[field]=value;
  25. }
  26. function _col_class(size, offset)
  27. {
  28. var out = "col "
  29. if(size && size>0)
  30. out+="s"+size+" ";
  31. if(offset && offset>0)
  32. out+="offset-s"+offset;
  33. return out;
  34. }
  35. function _intputTextDiv_class(size, offset)
  36. {
  37. return "input-field inputLine "+_col_class(size, offset);
  38. }
  39. class HTMLBuilder {
  40. contructor()
  41. {
  42. }
  43. static setAttr(o, prop)
  44. {
  45. if(prop)
  46. for (var key in prop) {
  47. if (prop.hasOwnProperty(key)) {
  48. var p = prop[key];
  49. if(p==undefined) continue;
  50. if(key=="class"){
  51. var a = o.attr(key);
  52. var pre = (a)?a:"";
  53. o.attr(key, pre+" "+p);
  54. }
  55. else o.attr(key, p);
  56. }
  57. }
  58. }
  59. static elem(elem, prop, son=undefined)
  60. {
  61. var d = $('<'+elem+'></'+elem+'>')
  62. this.setAttr(d, prop)
  63. if(son)
  64. {
  65. if(son instanceof String) d.html(son);
  66. else d.append(son);
  67. }
  68. return d;
  69. }
  70. static div(obj={}, son=undefined)
  71. {
  72. return this.elem('div', obj, son);
  73. }
  74. static span(obj={}, son=undefined)
  75. {
  76. return this.elem('span', obj, son);
  77. }
  78. static h4(text, obj={}) { var o = HTMLBuilder.elem('h4',obj); o.html(text); return o; }
  79. static h3(text, obj={}) { var o = HTMLBuilder.elem('h3',obj); o.html(text); return o; }
  80. static h2(text, obj={}) { var o = HTMLBuilder.elem('h2',obj); o.html(text); return o; }
  81. static h1(text, obj={}) { var o = HTMLBuilder.elem('h1',obj); o.html(text); return o; }
  82. static button(text, obj, onclick)
  83. {
  84. var o = this.elem('a', {class: _button_class});
  85. this.setAttr(o, obj)
  86. o.html(text);
  87. if(onclick)
  88. o.on('click', onclick);
  89. return o;
  90. }
  91. static icon(icon, prop, onclick)
  92. {
  93. var o = this.elem('i', {class: "material-icons"});
  94. this.setAttr(o, prop)
  95. o.html(icon);
  96. if(onclick)
  97. o.on('click', onclick);
  98. return o;
  99. }
  100. static iconButton(icon, obj, onclick)
  101. {
  102. var a = this.button('', obj, onclick)
  103. a.append(this.icon(icon))
  104. return a;
  105. }
  106. static _inputText(elem='input', type='text', prop)
  107. {
  108. var i = $('<'+elem+' type="'+type+'" />');
  109. this.setAttr(i, prop);
  110. return i;
  111. }
  112. static input(type, props={})
  113. {
  114. var input = $('<input type="'+type+'"/>');
  115. this.setAttr(input, props);
  116. return input;
  117. }
  118. static hr() { return HTMLBuilder.elem('hr') }
  119. static hrDiv(obj={}) { return HTMLBuilder.div(obj, this.hr()); }
  120. /*
  121. data ={
  122. size: size,
  123. offset: offset,
  124. label: lbl,
  125. id: id,
  126. type: number|text|...,
  127. }
  128. */
  129. static _text(elem='input', data={type:'text'}, prop={}, inputProp={}, labelProp={})
  130. {
  131. var x=this.div({class: _intputTextDiv_class(data.size, data.offset) });
  132. inputProp.id=data.id;
  133. labelProp.for=data.id;
  134. labelProp.id=data.id+"_lbl";
  135. x.append(this._inputText(elem, data.type, inputProp));
  136. var lbl=this.elem('label', labelProp);
  137. if(data.label) lbl.html(data.label);
  138. x.append(lbl);
  139. return x;
  140. }
  141. static textInput(data={type:'text'}, prop={}, inputProp={}, labelProp={})
  142. {
  143. inputProp.class= _input_class;
  144. return this._text('input', data, prop, inputProp, labelProp)
  145. }
  146. static textArea(data={type:'text'}, prop={}, inputProp={}, labelProp={})
  147. {
  148. inputProp.class= _textarea_class;
  149. return this._text('textarea', data, prop, inputProp, labelProp)
  150. }
  151. /*
  152. options : [{
  153. text: ,
  154. prop
  155. }]
  156. */
  157. static select(data={}, prop={}, options=[])
  158. {
  159. var x=this.div({class: _intputTextDiv_class(data.size, data.offset) });
  160. var lblProp={};
  161. lblProp.id=data.id;
  162. prop.id=data.id;
  163. var s = this.elem('select', prop)
  164. for(var i=0; i<options.length; i++)
  165. {
  166. var o = this.elem('option', options[i].prop);
  167. if(options[i].text)o.html(options[i].text);
  168. s.append(o)
  169. }
  170. var l =this.elem('label', lblProp);
  171. if(data.label)l.html(data.label)
  172. s.append(l);
  173. x.append(s);
  174. return x;
  175. }
  176. static rootElemDiv(size, prop={})
  177. {
  178. var cls = _col_class(size);
  179. if(prop.class) prop.class+=cls;
  180. else prop.class=cls;
  181. return this.div(prop);
  182. }
  183. static subUiDiv(prop)
  184. {
  185. if(prop){
  186. if(prop.class) prop.class+=_subcat_class;
  187. else prop.class=_subcat_class;
  188. }else prop={class: _subcat_class};
  189. var x = this.div(prop);
  190. return x;
  191. }
  192. static row(prop={})
  193. {
  194. if( prop.class) prop.class+=" "+_row_class;
  195. else prop.class=_row_class;
  196. return HTMLBuilder.div(prop)
  197. }
  198. static areaPicker(id, prop={})
  199. {
  200. prop.id=id+"_map";
  201. if( prop.class) prop.class+=" "+_areapicker_class;
  202. else prop.class=_areapicker_class;
  203. return HTMLBuilder.div(prop)
  204. }
  205. static br()
  206. {
  207. return $('<br>');
  208. }
  209. /*
  210. data={
  211. id: id,
  212. on: "",
  213. off: "",
  214. }
  215. */
  216. static switch(data={}, prop={}, iprop={})
  217. {
  218. var div = HTMLBuilder.div(mc(prop, _switch_class+_col_class(2)));
  219. //div.append(HTMLBuilder.br());
  220. var lbl = HTMLBuilder.elem('label');
  221. div.append(lbl);
  222. if(data.on) lbl.append(data.on);
  223. iprop.id=data.id;
  224. var input = HTMLBuilder.input('checkbox', iprop);
  225. lbl.append(input);
  226. lbl.append(HTMLBuilder.span({class: _lever_class}));
  227. if(data.off) lbl.append(data.off);
  228. return div;
  229. }
  230. static checkbox(data, prop={})
  231. {
  232. var p = HTMLBuilder.elem('p');
  233. var lbl = HTMLBuilder.elem('label');
  234. p.append(lbl);
  235. prop.id=data.id;
  236. lbl.append(HTMLBuilder.input("checkbox", prop));
  237. lbl.append(HTMLBuilder.span({}, data.label));
  238. return p;
  239. }
  240. static p(text, prop={})
  241. {
  242. return this.elem('p', prop, text);
  243. }
  244. /*
  245. * data {
  246. id,
  247. btnLabel,
  248. placeholder
  249. }
  250. props:{
  251. form:
  252. fileDiv:
  253. }
  254. *
  255. */
  256. static file(data={}, props={}, onchange=undefined)
  257. {
  258. /*<form action="#">
  259. <div class="file-field input-field">
  260. <div class="btn">
  261. <span>File</span>
  262. <input type="file">
  263. </div>
  264. <div class="file-path-wrapper">
  265. <input class="file-path validate" type="text">
  266. </div>
  267. </div>
  268. </form>*/
  269. setDef(data, "btnLabel", "Ouvrir")
  270. setDef(props, "form", {})
  271. setDef(props, "btnDiv", {})
  272. var form = HTMLBuilder.elem('form', props.form);
  273. var wrapperDiv= HTMLBuilder.div({class: _row_class+_inline_fields});
  274. if(data.placeholder)
  275. {
  276. wrapperDiv.append(HTMLBuilder.div({class:_col_class()+_inline_fields},
  277. HTMLBuilder.p(data.placeholder)));
  278. }
  279. var fileDiv = HTMLBuilder.div(mc(props.fileDiv, _file_input_class+_col_class(11)))
  280. var btnDiv= HTMLBuilder.div({class: "btn "});
  281. btnDiv.append(HTMLBuilder.span({}, data.btnLabel));
  282. btnDiv.append(HTMLBuilder.input('file', {id: data.id+"_f"}));
  283. btnDiv.find("input").on('change', function(){
  284. $('#'+data.id+"_fp").val($( this ).
  285. val().replace(/C:\\fakepath\\/i, ''))
  286. });
  287. fileDiv.append(btnDiv);
  288. var textDiv = HTMLBuilder.div({class: _file_path_wrapper_class});
  289. textDiv.append(HTMLBuilder.input('text',
  290. {id: data.id+"_fp", class: _file_path_class})
  291. );
  292. fileDiv.append(textDiv);
  293. wrapperDiv.append(fileDiv);
  294. wrapperDiv.append(HTMLBuilder.iconButton('cloud_upload',
  295. {class: _col_class(1)+_inline_fields, onclick: onclick}));
  296. form.append(wrapperDiv);
  297. return form;
  298. }
  299. }