dynamic-fields.ext.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. function template(html, data) {
  2. var loop = /\{@([^}]+)\}(.+?)\{\/\1\}/g
  3. , loopVariable = /\{#([^}]+)\}/g
  4. , variable = /\{([^}]+)\}/g;
  5. return html
  6. .replace(loop, function(_, key, list) {
  7. return $.map(data[key], function(item) {
  8. return list.replace(loopVariable, function(_, k) {
  9. return item[k];
  10. });
  11. }).join('');
  12. })
  13. .replace(variable, function(_, key) {
  14. return data[key] || '';
  15. });
  16. }
  17. module.exports = {
  18. name: 'dynamicFields',
  19. options: {
  20. templates: {
  21. base:'\
  22. <div class="field">\
  23. <label class="main">{label}</label>\
  24. {field}\
  25. <span class="error"></span>\
  26. </div>\
  27. ',
  28. text: '<input name="{name}" type="{subtype}" value="{value}" {attrs}>',
  29. file: '<input id="{name} "name="{name}" type="file" {attrs}>',
  30. textarea: '<textarea name="{name}" {attrs}>{text}</textarea>',
  31. group: '\
  32. <p class="group">\
  33. {@list}\
  34. <label><input name="{name}" type="{subtype}" value="{#value}" {#attrs}>{#text}</label>\
  35. {/list}\
  36. </p>\
  37. ',
  38. select: '\
  39. <select name={name}>\
  40. {@list}\
  41. <option value="{#value}">{#text}</option>\
  42. {/list}\
  43. </select>\
  44. '
  45. }
  46. },
  47. methods: {
  48. addFields: function(fields) {
  49. var self = this;
  50. $.each(fields, function(name, field) {
  51. var typeArray = field.type.split(':')
  52. , rules = {}
  53. , $last = self.$form.find(self.opts.field).last();
  54. field.name = name;
  55. field.type = typeArray[0];
  56. if (typeArray[1]) field.subtype = typeArray[1];
  57. field.html = template(self.opts.templates.base, {
  58. label: field.label,
  59. field: template(self.opts.templates[field.type], field)
  60. });
  61. self._inject('addFields:before', field);
  62. if (field.after || field.before) {
  63. self.$form.find('[name="'+ (field.after || field.before) +'"]').first().each(function() {
  64. self._getField(this)[field.after ? 'after' : 'before'](field.html);
  65. });
  66. } else {
  67. // Form has at least one field
  68. if ($last.length) $last.after(field.html);
  69. // Form has no fields
  70. else self.$form.append(field.html);
  71. }
  72. if (field.rules) {
  73. rules[name] = field.rules;
  74. self.addRules(rules);
  75. }
  76. self._inject('addFields:after', field);
  77. });
  78. },
  79. removeFields: function(names) {
  80. var self = this;
  81. $.each(names.split(' '), function(i, name) {
  82. var $field = self._getField($('[name="'+ name +'"]'));
  83. self.$fields = self.$fields.filter(function() {
  84. return ! $(this).is($field);
  85. });
  86. $field.remove();
  87. });
  88. this._inject('removeFields');
  89. },
  90. toggleFields: function(names) {
  91. var self = this;
  92. $.each(names.split(' '), function(i, name) {
  93. var $field = self._getField($('[name="'+ name +'"]'));
  94. $field.data('idealforms-valid', $field.is(':visible')).toggle();
  95. });
  96. this._inject('toggleFields');
  97. }
  98. }
  99. };