form.js 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893
  1. // form
  2. test("form without @el", function() {
  3. var form = new App.ControllerForm()
  4. equal($(form.html()).is('div'), true)
  5. equal($(form.html()).hasClass('alert'), true)
  6. equal($(form.html()).hasClass('hide'), true)
  7. })
  8. test("form elements check", function() {
  9. // deepEqual(item, test.value, 'group set/get tests' );
  10. $('#forms').append('<hr><h1>form elements check</h1><form id="form1"></form>')
  11. var el = $('#form1')
  12. var defaults = {
  13. input2: '123abc',
  14. password2: 'pw1234<l>',
  15. textarea2: 'lalu <l> lalu',
  16. select1: false,
  17. select2: true,
  18. selectmulti1: false,
  19. selectmulti2: [ false, true ],
  20. selectmultioption1: false,
  21. selectmultioption2: [ false, true ],
  22. richtext2: 'lalu <l> lalu',
  23. datetime1: Date.parse('2015-01-11T12:40:00Z'),
  24. }
  25. new App.ControllerForm({
  26. el: el,
  27. model: {
  28. configure_attributes: [
  29. { name: 'input1', display: 'Input1', tag: 'input', type: 'text', limit: 100, null: true, default: defaults['input1'] },
  30. { name: 'input2', display: 'Input2', tag: 'input', type: 'text', limit: 100, null: false, default: defaults['input2'] },
  31. { name: 'password1', display: 'Password1', tag: 'input', type: 'password', limit: 100, null: true, default: defaults['password1'] },
  32. { name: 'password2', display: 'Password2', tag: 'input', type: 'password', limit: 100, null: false, default: defaults['password2'] },
  33. { name: 'textarea1', display: 'Textarea1', tag: 'textarea', rows: 6, limit: 100, null: true, upload: true, default: defaults['textarea1'] },
  34. { name: 'textarea2', display: 'Textarea2', tag: 'textarea', rows: 6, limit: 100, null: false, upload: true, default: defaults['textarea2'] },
  35. { name: 'select1', display: 'Select1', tag: 'select', null: true, options: { true: 'internal', false: 'public' }, default: defaults['select1'] },
  36. { name: 'select2', display: 'Select2', tag: 'select', null: false, options: { true: 'internal', false: 'public' }, default: defaults['select2'] },
  37. { name: 'selectmulti1', display: 'SelectMulti1', tag: 'select', null: true, multiple: true, options: { true: 'internal', false: 'public' }, default: defaults['selectmulti1'] },
  38. { name: 'selectmulti2', display: 'SelectMulti2', tag: 'select', null: false, multiple: true, options: { true: 'internal', false: 'public' }, default: defaults['selectmulti2'] },
  39. { name: 'selectmultioption1', display: 'SelectMultiOption1', tag: 'select', null: true, multiple: true, options: [{ value: true, name: 'internal' }, { value: false, name: 'public' }], default: defaults['selectmultioption1'] },
  40. { name: 'selectmultioption2', display: 'SelectMultiOption2', tag: 'select', null: false, multiple: true, options: [{ value: true, name: 'A' }, { value: 1, name: 'B'}, { value: false, name: 'C' }], default: defaults['selectmultioption2'] },
  41. { name: 'richtext1', display: 'Richtext1', tag: 'richtext', limit: 100, null: true, upload: true, default: defaults['richtext1'] },
  42. { name: 'richtext2', display: 'Richtext2', tag: 'richtext', limit: 100, null: true, upload: true, default: defaults['richtext2'] },
  43. { name: 'datetime1', display: 'Datetime1', tag: 'datetime', null: true, default: defaults['datetime1'] },
  44. { name: 'datetime2', display: 'Datetime2', tag: 'datetime', null: false, default: defaults['datetime2'] },
  45. ]
  46. },
  47. autofocus: true
  48. });
  49. equal(el.find('[name="input1"]').val(), '', 'check input1 value')
  50. equal(el.find('[name="input1"]').prop('required'), false, 'check input1 required')
  51. // equal(el.find('[name="input1"]').is(":focus"), true, 'check input1 focus')
  52. equal(el.find('[name="input2"]').val(), '123abc', 'check input2 value')
  53. equal(el.find('[name="input2"]').prop('required'), true, 'check input2 required')
  54. equal(el.find('[name="input2"]').is(":focus"), false, 'check input2 focus')
  55. equal(el.find('[name="password1"]').val(), '', 'check password1 value')
  56. equal(el.find('[name="password1_confirm"]').val(), '', 'check password1 value')
  57. equal(el.find('[name="password1"]').prop('required'), false, 'check password1 required')
  58. equal(el.find('[name="password1"]').is(":focus"), false, 'check password1 focus')
  59. equal(el.find('[name="password2"]').val(), 'pw1234<l>', 'check password2 value')
  60. equal(el.find('[name="password2_confirm"]').val(), 'pw1234<l>', 'check password2 value')
  61. equal(el.find('[name="password2"]').prop('required'), true, 'check password2 required')
  62. equal(el.find('[name="password2"]').is(":focus"), false, 'check password2 focus')
  63. equal(el.find('[name="textarea1"]').val(), '', 'check textarea1 value')
  64. equal(el.find('[name="textarea1"]').prop('required'), false, 'check textarea1 required')
  65. equal(el.find('[name="textarea1"]').is(":focus"), false, 'check textarea1 focus')
  66. equal(el.find('[name="textarea2"]').val(), 'lalu <l> lalu', 'check textarea2 value')
  67. equal(el.find('[name="textarea2"]').prop('required'), true, 'check textarea2 required')
  68. equal(el.find('[name="textarea2"]').is(":focus"), false, 'check textarea2 focus')
  69. equal(el.find('[name="select1"]').val(), 'false', 'check select1 value')
  70. equal(el.find('[name="select1"]').prop('required'), false, 'check select1 required')
  71. equal(el.find('[name="select1"]').is(":focus"), false, 'check select1 focus')
  72. equal(el.find('[name="select2"]').val(), 'true', 'check select2 value')
  73. equal(el.find('[name="select2"]').prop('required'), true, 'check select2 required')
  74. equal(el.find('[name="select2"]').is(":focus"), false, 'check select2 focus')
  75. equal(el.find('[name="selectmulti1"]').val(), 'false', 'check selectmulti1 value')
  76. equal(el.find('[name="selectmulti1"]').prop('required'), false, 'check selectmulti1 required')
  77. equal(el.find('[name="selectmulti1"]').is(":focus"), false, 'check selectmulti1 focus')
  78. equal(el.find('[name="selectmulti2"]').val()[0], 'true', 'check selectmulti2 value')
  79. equal(el.find('[name="selectmulti2"]').val()[1], 'false', 'check selectmulti2 value')
  80. equal(el.find('[name="selectmulti2"]').prop('required'), true, 'check selectmulti2 required')
  81. equal(el.find('[name="selectmulti2"]').is(":focus"), false, 'check selectmulti2 focus')
  82. //equal(el.find('[name="richtext1"]').val(), '', 'check textarea1 value')
  83. //equal(el.find('[name="richtext1"]').prop('required'), false, 'check textarea1 required')
  84. equal(el.find('[name="richtext1"]').is(":focus"), false, 'check textarea1 focus')
  85. //equal(el.find('[name="richtext2"]').val(), 'lalu <l> lalu', 'check textarea2 value')
  86. //equal(el.find('[name="richtext2"]').prop('required'), true, 'check textarea2 required')
  87. equal(el.find('[name="richtext2"]').is(":focus"), false, 'check textarea2 focus')
  88. });
  89. test("form params check", function() {
  90. // deepEqual(item, test.value, 'group set/get tests' );
  91. $('#forms').append('<hr><h1>form params check</h1><form id="form2"></form>')
  92. var el = $('#form2')
  93. var defaults = {
  94. input2: '123abc',
  95. password2: 'pw1234<l>',
  96. textarea2: 'lalu <l> lalu',
  97. select1: false,
  98. select2: true,
  99. selectmulti1: false,
  100. selectmulti2: [ false, true ],
  101. selectmultioption1: false,
  102. selectmultioption2: [ false, true ],
  103. autocompletion2: 'id2',
  104. autocompletion2_autocompletion_value_shown: 'value2',
  105. richtext2: '<div>lalu <b>b</b> lalu</div>',
  106. richtext3: '<div></div>',
  107. richtext4: '<div>lalu <i>b</i> lalu</div>',
  108. richtext5: '<div></div>',
  109. richtext6: '<div>lalu <b>b</b> lalu</div>',
  110. richtext7: "<div>&nbsp;<div>&nbsp;\n</div> \n</div>",
  111. richtext8: '<div>lalu <i>b</i> lalu</div>',
  112. datetime1: new Date(Date.parse('2015-01-11T12:40:00Z') ),
  113. datetime3: new Date(Date.parse('2015-01-11T12:40:00Z') ),
  114. date1: '2015-01-11',
  115. date3: '2015-01-11',
  116. active1: true,
  117. active2: false,
  118. }
  119. new App.ControllerForm({
  120. el: el,
  121. model: {
  122. configure_attributes: [
  123. { name: 'input1', display: 'Input1', tag: 'input', type: 'text', limit: 100, null: true },
  124. { name: 'input2', display: 'Input2', tag: 'input', type: 'text', limit: 100, null: false },
  125. { name: 'password1', display: 'Password1', tag: 'input', type: 'password', limit: 100, null: true },
  126. { name: 'password2', display: 'Password2', tag: 'input', type: 'password', limit: 100, null: false },
  127. { name: 'textarea1', display: 'Textarea1', tag: 'textarea', rows: 6, limit: 100, null: true, upload: true },
  128. { name: 'textarea2', display: 'Textarea2', tag: 'textarea', rows: 6, limit: 100, null: false, upload: true },
  129. { name: 'select1', display: 'Select1', tag: 'select', null: true, options: { true: 'internal', false: 'public' } },
  130. { name: 'select2', display: 'Select2', tag: 'select', null: false, options: { true: 'internal', false: 'public' } },
  131. { name: 'selectmulti1', display: 'SelectMulti1', tag: 'select', null: true, multiple: true, options: { true: 'internal', false: 'public' } },
  132. { name: 'selectmulti2', display: 'SelectMulti2', tag: 'select', null: false, multiple: true, options: { true: 'internal', false: 'public' } },
  133. { name: 'selectmultioption1', display: 'SelectMultiOption1', tag: 'select', null: true, multiple: true, options: [{ value: true, name: 'internal' }, { value: false, name: 'public' }] },
  134. { name: 'selectmultioption2', display: 'SelectMultiOption2', tag: 'select', null: false, multiple: true, options: [{ value: true, name: 'A' }, { value: 1, name: 'B'}, { value: false, name: 'C' }] },
  135. { name: 'autocompletion1', display: 'AutoCompletion1', tag: 'autocompletion', null: false, options: { true: 'internal', false: 'public' }, source: [ { label: "Choice1", value: "value1", id: "id1" }, { label: "Choice2", value: "value2", id: "id2" }, ], minLength: 1 },
  136. { name: 'autocompletion2', display: 'AutoCompletion2', tag: 'autocompletion', null: false, options: { true: 'internal', false: 'public' }, source: [ { label: "Choice1", value: "value1", id: "id1" }, { label: "Choice2", value: "value2", id: "id2" }, ], minLength: 1 },
  137. { name: 'richtext1', display: 'Richtext1', tag: 'richtext', maxlength: 100, null: true, type: 'richtext', multiline: true, upload: true, default: defaults['richtext1'] },
  138. { name: 'richtext2', display: 'Richtext2', tag: 'richtext', maxlength: 100, null: true, type: 'richtext', multiline: true, upload: true, default: defaults['richtext2'] },
  139. { name: 'richtext3', display: 'Richtext3', tag: 'richtext', maxlength: 100, null: true, type: 'richtext', multiline: false, default: defaults['richtext3'] },
  140. { name: 'richtext4', display: 'Richtext4', tag: 'richtext', maxlength: 100, null: true, type: 'richtext', multiline: false, default: defaults['richtext4'] },
  141. { name: 'richtext5', display: 'Richtext5', tag: 'richtext', maxlength: 100, null: true, type: 'textonly', multiline: true, upload: true, default: defaults['richtext5'] },
  142. { name: 'richtext6', display: 'Richtext6', tag: 'richtext', maxlength: 100, null: true, type: 'textonly', multiline: true, upload: true, default: defaults['richtext6'] },
  143. { name: 'richtext7', display: 'Richtext7', tag: 'richtext', maxlength: 100, null: true, type: 'textonly', multiline: false, default: defaults['richtext7'] },
  144. { name: 'richtext8', display: 'Richtext8', tag: 'richtext', maxlength: 100, null: true, type: 'textonly', multiline: false, default: defaults['richtext8'] },
  145. { name: 'datetime1', display: 'Datetime1', tag: 'datetime', null: true, default: defaults['datetime1'] },
  146. { name: 'datetime2', display: 'Datetime2', tag: 'datetime', null: true, default: defaults['datetime2'] },
  147. { name: 'datetime3', display: 'Datetime3', tag: 'datetime', null: false, default: defaults['datetime3'] },
  148. { name: 'datetime4', display: 'Datetime4', tag: 'datetime', null: false, default: defaults['datetime4'] },
  149. { name: 'date1', display: 'Date1', tag: 'date', null: true, default: defaults['date1'] },
  150. { name: 'date2', display: 'Date2', tag: 'date', null: true, default: defaults['date2'] },
  151. { name: 'date3', display: 'Date3', tag: 'date', null: false, default: defaults['date3'] },
  152. { name: 'date4', display: 'Date4', tag: 'date', null: false, default: defaults['date4'] },
  153. { name: 'active1', display: 'Active1', tag: 'active', default: defaults['active1'] },
  154. { name: 'active2', display: 'Active2', tag: 'active', default: defaults['active2'] },
  155. ],
  156. },
  157. params: defaults,
  158. autofocus: true
  159. });
  160. equal(el.find('[name="input1"]').val(), '', 'check input1 value')
  161. equal(el.find('[name="input1"]').prop('required'), false, 'check input1 required')
  162. // equal(el.find('[name="input1"]').is(":focus"), true, 'check input1 focus')
  163. equal(el.find('[name="input2"]').val(), '123abc', 'check input2 value')
  164. equal(el.find('[name="input2"]').prop('required'), true, 'check input2 required')
  165. equal(el.find('[name="input2"]').is(":focus"), false, 'check input2 focus')
  166. equal(el.find('[name="password1"]').val(), '', 'check password1 value')
  167. equal(el.find('[name="password1_confirm"]').val(), '', 'check password1 value')
  168. equal(el.find('[name="password1"]').prop('required'), false, 'check password1 required')
  169. equal(el.find('[name="password1"]').is(":focus"), false, 'check password1 focus')
  170. equal(el.find('[name="password2"]').val(), 'pw1234<l>', 'check password2 value')
  171. equal(el.find('[name="password2_confirm"]').val(), 'pw1234<l>', 'check password2 value')
  172. equal(el.find('[name="password2"]').prop('required'), true, 'check password2 required')
  173. equal(el.find('[name="password2"]').is(":focus"), false, 'check password2 focus')
  174. equal(el.find('[name="textarea1"]').val(), '', 'check textarea1 value')
  175. equal(el.find('[name="textarea1"]').prop('required'), false, 'check textarea1 required')
  176. equal(el.find('[name="textarea1"]').is(":focus"), false, 'check textarea1 focus')
  177. equal(el.find('[name="textarea2"]').val(), 'lalu <l> lalu', 'check textarea2 value')
  178. equal(el.find('[name="textarea2"]').prop('required'), true, 'check textarea2 required')
  179. equal(el.find('[name="textarea2"]').is(":focus"), false, 'check textarea2 focus')
  180. equal(el.find('[name="select1"]').val(), 'false', 'check select1 value')
  181. equal(el.find('[name="select1"]').prop('required'), false, 'check select1 required')
  182. equal(el.find('[name="select1"]').is(":focus"), false, 'check select1 focus')
  183. equal(el.find('[name="select2"]').val(), 'true', 'check select2 value')
  184. equal(el.find('[name="select2"]').prop('required'), true, 'check select2 required')
  185. equal(el.find('[name="select2"]').is(":focus"), false, 'check select2 focus')
  186. equal(el.find('[name="selectmulti1"]').val(), 'false', 'check selectmulti1 value')
  187. equal(el.find('[name="selectmulti1"]').prop('required'), false, 'check selectmulti1 required')
  188. equal(el.find('[name="selectmulti1"]').is(":focus"), false, 'check selectmulti1 focus')
  189. equal(el.find('[name="selectmulti2"]').val()[0], 'true', 'check selectmulti2 value')
  190. equal(el.find('[name="selectmulti2"]').val()[1], 'false', 'check selectmulti2 value')
  191. equal(el.find('[name="selectmulti2"]').prop('required'), true, 'check selectmulti2 required')
  192. equal(el.find('[name="selectmulti2"]').is(":focus"), false, 'check selectmulti2 focus')
  193. params = App.ControllerForm.params(el)
  194. test_params = {
  195. input1: '',
  196. input2: '123abc',
  197. password1: '',
  198. password1_confirm: '',
  199. password2: 'pw1234<l>',
  200. password2_confirm: 'pw1234<l>',
  201. textarea1: '',
  202. textarea2: 'lalu <l> lalu',
  203. select1: 'false',
  204. select2: 'true',
  205. selectmulti1: 'false',
  206. selectmulti2: [ 'true', 'false' ],
  207. selectmultioption1: 'false',
  208. selectmultioption2: [ 'true', 'false' ],
  209. autocompletion1: '',
  210. autocompletion1_autocompletion: '',
  211. autocompletion1_autocompletion_value_shown: '',
  212. autocompletion2: 'id2',
  213. autocompletion2_autocompletion: 'value2',
  214. autocompletion2_autocompletion_value_shown: 'value2',
  215. richtext1: '',
  216. richtext2: '<div>lalu <b>b</b> lalu</div>',
  217. richtext3: '',
  218. richtext4: '<div>lalu <i>b</i> lalu</div>',
  219. richtext5: '',
  220. richtext6: '<div>lalu <b>b</b> lalu</div>',
  221. richtext7: '',
  222. richtext8: '<div>lalu <i>b</i> lalu</div>',
  223. datetime1: '2015-01-11T12:40:00.000Z',
  224. datetime2: undefined,
  225. datetime3: '2015-01-11T12:40:00.000Z',
  226. datetime4: undefined,
  227. date1: '2015-01-11',
  228. date2: undefined,
  229. date3: '2015-01-11',
  230. date4: undefined,
  231. active1: true,
  232. active2: false,
  233. }
  234. deepEqual(params, test_params, 'form param check')
  235. });
  236. test("form defaults + params check", function() {
  237. // deepEqual(item, test.value, 'group set/get tests' );
  238. // mix default and params -> check it -> add note
  239. // test auto completion
  240. // show/hide fields base on field values -> bind changed event
  241. // form validation
  242. // form params check
  243. // add signature only if form_state is empty
  244. $('#forms').append('<hr><h1>form defaults + params check</h1><form id="form3"></form>')
  245. var el = $('#form3')
  246. var defaults = {
  247. input1: '',
  248. password2: 'pw1234<l>',
  249. textarea2: 'lalu <l> lalu',
  250. select2: false,
  251. selectmulti2: [ false, true ],
  252. selectmultioption1: false,
  253. }
  254. new App.ControllerForm({
  255. el: el,
  256. model: {
  257. configure_attributes: [
  258. { name: 'input1', display: 'Input1', tag: 'input', type: 'text', limit: 100, null: true, default: 'some not used default' },
  259. { name: 'input2', display: 'Input2', tag: 'input', type: 'text', limit: 100, null: true, default: 'some used default' },
  260. { name: 'password1', display: 'Password1', tag: 'input', type: 'password', limit: 100, null: false, default: 'some used pass' },
  261. { name: 'password2', display: 'Password2', tag: 'input', type: 'password', limit: 100, null: false, default: 'some not used pass' },
  262. { name: 'textarea1', display: 'Textarea1', tag: 'textarea', rows: 6, limit: 100, null: false, upload: true, default: 'some used text' },
  263. { name: 'textarea2', display: 'Textarea2', tag: 'textarea', rows: 6, limit: 100, null: false, upload: true, default: 'some not used text' },
  264. { name: 'select1', display: 'Select1', tag: 'select', null: true, options: { true: 'internal', false: 'public' }, default: false},
  265. { name: 'select2', display: 'Select2', tag: 'select', null: true, options: { true: 'internal', false: 'public' }, default: true },
  266. { name: 'selectmulti2', display: 'SelectMulti2', tag: 'select', null: false, multiple: true, options: { true: 'internal', false: 'public' }, default: [] },
  267. { name: 'selectmultioption1', display: 'SelectMultiOption1', tag: 'select', null: true, multiple: true, options: [{ value: true, name: 'internal' }, { value: false, name: 'public' }], default: true },
  268. ],
  269. },
  270. params: defaults,
  271. autofocus: true
  272. });
  273. equal(el.find('[name="input1"]').val(), '', 'check input1 value')
  274. equal(el.find('[name="input1"]').prop('required'), false, 'check input1 required')
  275. // equal(el.find('[name="input1"]').is(":focus"), true, 'check input1 focus')
  276. equal(el.find('[name="input2"]').val(), 'some used default', 'check input2 value')
  277. equal(el.find('[name="input2"]').prop('required'), false, 'check input2 required')
  278. equal(el.find('[name="password1"]').val(), 'some used pass', 'check password1 value')
  279. equal(el.find('[name="password1_confirm"]').val(), 'some used pass', 'check password1 value')
  280. equal(el.find('[name="password1"]').prop('required'), true, 'check password1 required')
  281. equal(el.find('[name="password1"]').is(":focus"), false, 'check password1 focus')
  282. equal(el.find('[name="password2"]').val(), 'pw1234<l>', 'check password2 value')
  283. equal(el.find('[name="password2_confirm"]').val(), 'pw1234<l>', 'check password2 value')
  284. equal(el.find('[name="password2"]').prop('required'), true, 'check password2 required')
  285. equal(el.find('[name="password2"]').is(":focus"), false, 'check password2 focus')
  286. equal(el.find('[name="textarea1"]').val(), 'some used text', 'check textarea1 value')
  287. equal(el.find('[name="textarea1"]').prop('required'), true, 'check textarea1 required')
  288. equal(el.find('[name="textarea1"]').is(":focus"), false, 'check textarea1 focus')
  289. equal(el.find('[name="textarea2"]').val(), 'lalu <l> lalu', 'check textarea2 value')
  290. equal(el.find('[name="textarea2"]').prop('required'), true, 'check textarea2 required')
  291. equal(el.find('[name="textarea2"]').is(":focus"), false, 'check textarea2 focus')
  292. equal(el.find('[name="select1"]').val(), 'false', 'check select1 value')
  293. equal(el.find('[name="select1"]').prop('required'), false, 'check select1 required')
  294. equal(el.find('[name="select1"]').is(":focus"), false, 'check select1 focus')
  295. equal(el.find('[name="select2"]').val(), 'false', 'check select2 value')
  296. equal(el.find('[name="select2"]').prop('required'), false, 'check select2 required')
  297. equal(el.find('[name="select2"]').is(":focus"), false, 'check select2 focus')
  298. equal(el.find('[name="selectmulti2"]').val()[0], 'true', 'check selectmulti2 value')
  299. equal(el.find('[name="selectmulti2"]').val()[1], 'false', 'check selectmulti2 value')
  300. equal(el.find('[name="selectmulti2"]').prop('required'), true, 'check selectmulti2 required')
  301. equal(el.find('[name="selectmulti2"]').is(":focus"), false, 'check selectmulti2 focus')
  302. });
  303. test("form dependend fields check", function() {
  304. // deepEqual(item, test.value, 'group set/get tests' );
  305. // mix default and params -> check it -> add note
  306. // test auto completion
  307. // show/hide fields base on field values -> bind changed event
  308. // form validation
  309. // form params check
  310. // add signature only if form_state is empty
  311. $('#forms').append('<hr><h1>form dependend fields check</h1><form id="form4"></form>')
  312. var el = $('#form4')
  313. var defaults = {
  314. input1: '',
  315. select2: false,
  316. selectmulti2: [ false, true ],
  317. selectmultioption1: false,
  318. datetime1: new Date(Date.parse('2015-01-11T12:40:00Z')),
  319. datetime3: new Date(Date.parse('2015-01-11T12:40:00Z')),
  320. date1: '2015-01-11',
  321. date3: '2015-01-11',
  322. }
  323. var form = new App.ControllerForm({
  324. el: el,
  325. model: {
  326. configure_attributes: [
  327. { name: 'input1', display: 'Input1', tag: 'input', type: 'text', limit: 100, null: true, default: 'some not used default' },
  328. { name: 'input2', display: 'Input2', tag: 'input', type: 'text', limit: 100, null: true, default: 'some used default' },
  329. { name: 'input3', display: 'Input3', tag: 'input', type: 'text', limit: 100, null: true, hide: true, default: 'some used default' },
  330. { name: 'select1', display: 'Select1', tag: 'select', null: true, options: { true: 'internal', false: 'public' }, default: false},
  331. { name: 'select2', display: 'Select2', tag: 'select', null: true, options: { true: 'internal', false: 'public' }, default: true },
  332. { name: 'selectmulti2', display: 'SelectMulti2', tag: 'select', null: false, multiple: true, options: { true: 'internal', false: 'public' }, default: [] },
  333. { name: 'selectmultioption1', display: 'SelectMultiOption1', tag: 'select', null: true, multiple: true, options: [{ value: true, name: 'internal' }, { value: false, name: 'public' }], default: true },
  334. { name: 'datetime1', display: 'Datetime1', tag: 'datetime', null: true, default: defaults['datetime1'] },
  335. { name: 'datetime2', display: 'Datetime2', tag: 'datetime', null: true, default: defaults['datetime2'] },
  336. { name: 'datetime3', display: 'Datetime3', tag: 'datetime', null: false, default: defaults['datetime3'] },
  337. { name: 'datetime4', display: 'Datetime4', tag: 'datetime', null: false, default: defaults['datetime4'] },
  338. { name: 'date1', display: 'Date1', tag: 'date', null: true, default: defaults['date1'] },
  339. { name: 'date2', display: 'Date2', tag: 'date', null: true, default: defaults['date2'] },
  340. { name: 'date3', display: 'Date3', tag: 'date', null: false, default: defaults['date3'] },
  341. { name: 'date4', display: 'Date4', tag: 'date', null: false, default: defaults['date4'] },
  342. ],
  343. },
  344. params: defaults,
  345. dependency: [
  346. {
  347. bind: {
  348. name: 'select1',
  349. value: ["true"]
  350. },
  351. change: {
  352. name: 'input2',
  353. action: 'hide'
  354. },
  355. },
  356. {
  357. bind: {
  358. name: 'select1',
  359. value: ["true"]
  360. },
  361. change: {
  362. name: 'datetime1',
  363. action: 'hide'
  364. },
  365. },
  366. {
  367. bind: {
  368. name: 'select1',
  369. value: ["false"]
  370. },
  371. change: {
  372. name: 'input2',
  373. action: 'show'
  374. },
  375. },
  376. {
  377. bind: {
  378. name: 'select1',
  379. value: ["false"]
  380. },
  381. change: {
  382. name: 'datetime1',
  383. action: 'show'
  384. },
  385. },
  386. {
  387. bind: {
  388. name: 'select1',
  389. value: ["true"]
  390. },
  391. change: {
  392. name: 'input3',
  393. action: 'show'
  394. },
  395. },
  396. {
  397. bind: {
  398. name: 'select1',
  399. value: ["false"]
  400. },
  401. change: {
  402. name: 'input3',
  403. action: 'hide'
  404. },
  405. }
  406. ],
  407. autofocus: true
  408. });
  409. equal(el.find('[name="input1"]').val(), '', 'check input1 value')
  410. equal(el.find('[name="input1"]').prop('required'), false, 'check input1 required')
  411. // equal(el.find('[name="input1"]').is(":focus"), true, 'check input1 focus')
  412. equal(el.find('[name="input2"]').val(), 'some used default', 'check input2 value')
  413. equal(el.find('[name="input2"]').prop('required'), false, 'check input2 required')
  414. equal(el.find('[name="input3"]').val(), 'some used default', 'check input3 value')
  415. equal(el.find('[name="input3"]').prop('required'), false, 'check input3 required')
  416. equal(el.find('[name="select1"]').val(), 'false', 'check select1 value')
  417. equal(el.find('[name="select1"]').prop('required'), false, 'check select1 required')
  418. equal(el.find('[name="select1"]').is(":focus"), false, 'check select1 focus')
  419. equal(el.find('[name="select2"]').val(), 'false', 'check select2 value')
  420. equal(el.find('[name="select2"]').prop('required'), false, 'check select2 required')
  421. equal(el.find('[name="select2"]').is(":focus"), false, 'check select2 focus')
  422. equal(el.find('[name="selectmulti2"]').val()[0], 'true', 'check selectmulti2 value')
  423. equal(el.find('[name="selectmulti2"]').val()[1], 'false', 'check selectmulti2 value')
  424. equal(el.find('[name="selectmulti2"]').prop('required'), true, 'check selectmulti2 required')
  425. equal(el.find('[name="selectmulti2"]').is(":focus"), false, 'check selectmulti2 focus')
  426. var params = App.ControllerForm.params(el)
  427. var test_params = {
  428. input1: "",
  429. input2: "some used default",
  430. select1: "false",
  431. select2: "false",
  432. selectmulti2: [ "true", "false" ],
  433. selectmultioption1: "false",
  434. datetime1: '2015-01-11T12:40:00.000Z',
  435. datetime2: undefined,
  436. datetime3: '2015-01-11T12:40:00.000Z',
  437. datetime4: undefined,
  438. date1: '2015-01-11',
  439. date2: undefined,
  440. date3: '2015-01-11',
  441. date4: undefined,
  442. }
  443. deepEqual(params, test_params, 'form param check')
  444. errors = form.validate(params)
  445. test_errors = {
  446. datetime4: "is required",
  447. date4: "is required",
  448. }
  449. deepEqual(errors, test_errors, 'validation errors check')
  450. App.ControllerForm.validate({ errors: errors, form: el })
  451. el.find('[name="select1"]').val('true')
  452. el.find('[name="select1"]').trigger('change')
  453. params = App.ControllerForm.params(el)
  454. test_params = {
  455. input1: "",
  456. input3: "some used default",
  457. select1: "true",
  458. select2: "false",
  459. selectmulti2: [ "true", "false" ],
  460. selectmultioption1: "false",
  461. datetime1: null,
  462. datetime2: undefined,
  463. datetime3: '2015-01-11T12:40:00.000Z',
  464. datetime4: undefined,
  465. date1: '2015-01-11',
  466. date2: undefined,
  467. date3: '2015-01-11',
  468. date4: undefined,
  469. }
  470. deepEqual(params, test_params, 'form param check')
  471. });
  472. test("form handler check with and without fieldset", function() {
  473. // deepEqual(item, test.value, 'group set/get tests' );
  474. // mix default and params -> check it -> add note
  475. // test auto completion
  476. // show/hide fields base on field values -> bind changed event
  477. // form validation
  478. // form params check
  479. // add signature only if form_state is empty
  480. $('#forms').append('<hr><h1>form handler check with and without fieldset</h1><form id="form5"></form>')
  481. var el = $('#form5')
  482. var defaults = {
  483. select1: 'a',
  484. select2: '',
  485. }
  486. var formChanges = function(params, attribute, attributes, classname, form, ui) {
  487. console.log('FROM', form)
  488. if (params['select1'] === 'b') {
  489. console.log('lala', params)
  490. var item = {
  491. name: 'select2',
  492. display: 'Select2',
  493. tag: 'select',
  494. null: true,
  495. options: { 1:'1', 2:'2', 3:'3' },
  496. default: 3,
  497. };
  498. var newElement = ui.formGenItem(item, classname, form)
  499. form.find('[name="select2"]').closest('.form-group').replaceWith(newElement)
  500. }
  501. if (params['select1'] === 'a') {
  502. console.log('lala', params)
  503. var item = {
  504. name: 'select2',
  505. display: 'Select2',
  506. tag: 'select',
  507. null: true,
  508. options: { 1:'1', 2:'2', 3:'3' },
  509. default: 1,
  510. };
  511. var newElement = ui.formGenItem(item, classname, form)
  512. form.find('[name="select2"]').closest('.form-group').replaceWith(newElement)
  513. }
  514. }
  515. new App.ControllerForm({
  516. el: el,
  517. model: {
  518. configure_attributes: [
  519. { name: 'select1', display: 'Select1', tag: 'select', null: true, options: { a: 'a', b: 'b' }, default: 'b'},
  520. { name: 'select2', display: 'Select2', tag: 'select', null: true, options: { 1:'1', 2:'2', 3:'3' }, default: 2 },
  521. ],
  522. },
  523. params: defaults,
  524. handlers: [
  525. formChanges,
  526. ],
  527. //noFieldset: true,
  528. });
  529. equal(el.find('[name="select1"]').val(), 'a', 'check select1 value')
  530. equal(el.find('[name="select1"]').prop('required'), false, 'check select1 required')
  531. equal(el.find('[name="select2"]').val(), '1', 'check select2 value')
  532. equal(el.find('[name="select2"]').prop('required'), false, 'check select2 required')
  533. var params = App.ControllerForm.params(el)
  534. var test_params = {
  535. select1: 'a',
  536. select2: '1',
  537. }
  538. deepEqual(params, test_params, 'form param check')
  539. el.find('[name="select1"]').val('b')
  540. el.find('[name="select1"]').trigger('change')
  541. params = App.ControllerForm.params(el)
  542. test_params = {
  543. select1: 'b',
  544. select2: '3',
  545. }
  546. deepEqual(params, test_params, 'form param check')
  547. el.find('[name="select1"]').val('a')
  548. el.find('[name="select1"]').trigger('change')
  549. params = App.ControllerForm.params(el)
  550. test_params = {
  551. select1: 'a',
  552. select2: '1',
  553. }
  554. deepEqual(params, test_params, 'form param check')
  555. // test with noFieldset
  556. el.empty()
  557. new App.ControllerForm({
  558. el: el,
  559. model: {
  560. configure_attributes: [
  561. { name: 'select1', display: 'Select1', tag: 'select', null: true, options: { a: 'a', b: 'b' }, default: 'b'},
  562. { name: 'select2', display: 'Select2', tag: 'select', null: true, options: { 1:'1', 2:'2', 3:'3' }, default: 2 },
  563. ],
  564. },
  565. params: defaults,
  566. handlers: [
  567. formChanges,
  568. ],
  569. noFieldset: true,
  570. });
  571. equal(el.find('[name="select1"]').val(), 'a', 'check select1 value')
  572. equal(el.find('[name="select1"]').prop('required'), false, 'check select1 required')
  573. equal(el.find('[name="select2"]').val(), '1', 'check select2 value')
  574. equal(el.find('[name="select2"]').prop('required'), false, 'check select2 required')
  575. var params = App.ControllerForm.params(el)
  576. var test_params = {
  577. select1: 'a',
  578. select2: '1',
  579. }
  580. deepEqual(params, test_params, 'form param check')
  581. el.find('[name="select1"]').val('b')
  582. el.find('[name="select1"]').trigger('change')
  583. params = App.ControllerForm.params(el)
  584. test_params = {
  585. select1: 'b',
  586. select2: '3',
  587. }
  588. deepEqual(params, test_params, 'form param check')
  589. el.find('[name="select1"]').val('a')
  590. el.find('[name="select1"]').trigger('change')
  591. params = App.ControllerForm.params(el)
  592. test_params = {
  593. select1: 'a',
  594. select2: '1',
  595. }
  596. deepEqual(params, test_params, 'form param check')
  597. });
  598. test("form postmaster filter", function() {
  599. // check match area
  600. // check set area
  601. // add match rule
  602. // add set rule
  603. App.TicketPriority.refresh([
  604. {
  605. id: 1,
  606. name: 'prio 1',
  607. },
  608. {
  609. id: 2,
  610. name: 'prio 2',
  611. },
  612. ] )
  613. App.Group.refresh([
  614. {
  615. id: 1,
  616. name: 'group 1',
  617. },
  618. {
  619. id: 2,
  620. name: 'group 2',
  621. },
  622. ] )
  623. $('#forms').append('<hr><h1>form postmaster filter</h1><form id="form6"></form>')
  624. var el = $('#form6')
  625. var defaults = {
  626. input2: 'some name',
  627. match: {
  628. from: {
  629. operator: 'contains',
  630. value: 'some@address',
  631. },
  632. subject: {
  633. operator: 'contains',
  634. value: 'some subject',
  635. },
  636. },
  637. set: {
  638. 'x-zammad-ticket-customer': {
  639. value: 'customer'
  640. },
  641. 'x-zammad-ticket-group_id': {
  642. value: '1'
  643. },
  644. 'x-zammad-ticket-owner': {
  645. value: 'owner',
  646. value_completion: ''
  647. },
  648. 'x-zammad-ticket-priority_id': {
  649. value: '1'
  650. }
  651. },
  652. }
  653. new App.ControllerForm({
  654. el: el,
  655. model: {
  656. configure_attributes: [
  657. { name: 'input1', display: 'Input1', tag: 'input', type: 'text', limit: 100, null: true, default: 'some not used default' },
  658. { name: 'input2', display: 'Input2', tag: 'input', type: 'text', limit: 100, null: true, default: 'some used default' },
  659. { name: 'match', display: 'Match', tag: 'postmaster_match', null: false, default: false},
  660. { name: 'set', display: 'Set', tag: 'postmaster_set', null: false, default: false},
  661. ],
  662. },
  663. params: defaults,
  664. });
  665. params = App.ControllerForm.params(el)
  666. test_params = {
  667. input1: 'some not used default',
  668. input2: 'some name',
  669. match: {
  670. from: {
  671. operator: 'contains',
  672. value: 'some@address'
  673. },
  674. subject: {
  675. operator: 'contains',
  676. value: 'some subject'
  677. }
  678. },
  679. set: {
  680. 'x-zammad-ticket-customer': {
  681. value: 'customer'
  682. },
  683. 'x-zammad-ticket-group_id': {
  684. value: '1'
  685. },
  686. 'x-zammad-ticket-owner': {
  687. value: 'owner',
  688. value_completion: ''
  689. },
  690. 'x-zammad-ticket-priority_id': {
  691. value: '1'
  692. }
  693. },
  694. };
  695. deepEqual(params, test_params, 'form param check')
  696. el.find('[name="set::x-zammad-ticket-priority_id::value"]').closest('.js-filterElement').find('.js-remove').click()
  697. el.find('[name="set::x-zammad-ticket-customer::value"]').closest('.js-filterElement').find('.js-remove').click()
  698. App.Delay.set(function() {
  699. test("form param check after remove click", function() {
  700. params = App.ControllerForm.params(el)
  701. test_params = {
  702. input1: 'some not used default',
  703. input2: 'some name',
  704. match: {
  705. from: {
  706. operator: 'contains',
  707. value: 'some@address'
  708. },
  709. subject: {
  710. operator: 'contains',
  711. value: 'some subject'
  712. }
  713. },
  714. set: {
  715. 'x-zammad-ticket-owner': {
  716. value: 'owner',
  717. value_completion: ''
  718. },
  719. 'x-zammad-ticket-group_id': {
  720. value: '1'
  721. },
  722. },
  723. };
  724. deepEqual(params, test_params, 'form param check')
  725. });
  726. },
  727. 1000
  728. );
  729. });
  730. test("form selector", function() {
  731. $('#forms').append('<hr><h1>form selector</h1><div><form id="form7"></form></div>')
  732. var el = $('#form7')
  733. var defaults = {
  734. input2: 'some name66',
  735. }
  736. new App.ControllerForm({
  737. el: el,
  738. model: {
  739. configure_attributes: [
  740. { name: 'input1', display: 'Input1', tag: 'input', type: 'text', limit: 100, null: true, default: 'some not used default33' },
  741. { name: 'input2', display: 'Input2', tag: 'input', type: 'text', limit: 100, null: true, default: 'some used default' },
  742. ],
  743. },
  744. params: defaults,
  745. });
  746. test_params = {
  747. input1: 'some not used default33',
  748. input2: 'some name66',
  749. };
  750. params = App.ControllerForm.params(el)
  751. deepEqual(params, test_params, 'form param check via $("#form")')
  752. params = App.ControllerForm.params(el.find('input'))
  753. deepEqual(params, test_params, 'form param check via $("#form").find("input")')
  754. params = App.ControllerForm.params(el.parent())
  755. deepEqual(params, test_params, 'form param check via $("#form").parent()')
  756. });
  757. test("form required_if + shown_if", function() {
  758. $('#forms').append('<hr><h1>form required_if + shown_if</h1><div><form id="form8"></form></div>')
  759. var el = $('#form8')
  760. var defaults = {
  761. input2: 'some name66',
  762. input3: 'some name77',
  763. input4: 'some name88',
  764. }
  765. new App.ControllerForm({
  766. el: el,
  767. model: {
  768. configure_attributes: [
  769. { name: 'input1', display: 'Input1', tag: 'input', type: 'text', limit: 100, null: true, default: 'some not used default33' },
  770. { name: 'input2', display: 'Input2', tag: 'input', type: 'text', limit: 100, null: true, default: 'some used default', required_if: { active: true }, shown_if: { active: true } },
  771. { name: 'input3', display: 'Input3', tag: 'input', type: 'text', limit: 100, null: true, default: 'some used default', required_if: { active: [true,false] }, shown_if: { active: [true,false] } },
  772. { name: 'input4', display: 'Input4', tag: 'input', type: 'text', limit: 100, null: true, default: 'some used default', required_if: { active: [55,66] }, shown_if: { active: [55,66] } },
  773. { name: 'active', display: 'Active', tag: 'active', 'default': true },
  774. ],
  775. },
  776. params: defaults,
  777. });
  778. test_params = {
  779. input1: "some not used default33",
  780. input2: "some name66",
  781. input3: "some name77",
  782. active: true,
  783. };
  784. params = App.ControllerForm.params(el)
  785. deepEqual(params, test_params, 'form param check via $("#form")')
  786. equal(el.find('[name="input2"]').attr('required'), 'required', 'check required attribute of input2 ')
  787. equal(el.find('[name="input2"]').is(":visible"), true, 'check visible attribute of input2 ')
  788. equal(el.find('[name="input3"]').attr('required'), 'required', 'check required attribute of input3 ')
  789. equal(el.find('[name="input3"]').is(":visible"), true, 'check visible attribute of input3 ')
  790. equal(el.find('[name="input4"]').is(":visible"), false, 'check visible attribute of input4 ')
  791. el.find('[name="{boolean}active"]').val('false').trigger('change')
  792. test_params = {
  793. input1: "some not used default33",
  794. active: false,
  795. };
  796. params = App.ControllerForm.params(el)
  797. deepEqual(params, test_params, 'form param check via $("#form")')
  798. equal(el.find('[name="input2"]').attr('required'), undefined, 'check required attribute of input2')
  799. equal(el.find('[name="input2"]').is(":visible"), false, 'check visible attribute of input2')
  800. equal(el.find('[name="input3"]').is(":visible"), false, 'check visible attribute of input3')
  801. equal(el.find('[name="input4"]').is(":visible"), false, 'check visible attribute of input4')
  802. el.find('[name="{boolean}active"]').val('true').trigger('change')
  803. test_params = {
  804. input1: "some not used default33",
  805. input2: "some name66",
  806. input3: "some name77",
  807. active: true,
  808. };
  809. params = App.ControllerForm.params(el)
  810. deepEqual(params, test_params, 'form param check via $("#form")')
  811. equal(el.find('[name="input2"]').attr('required'), 'required', 'check required attribute of input2')
  812. equal(el.find('[name="input2"]').is(":visible"), true, 'check visible attribute of input2')
  813. equal(el.find('[name="input3"]').attr('required'), 'required', 'check required attribute of input3')
  814. equal(el.find('[name="input3"]').is(":visible"), true, 'check visible attribute of input3')
  815. equal(el.find('[name="input4"]').is(":visible"), false, 'check visible attribute of input4')
  816. });