dynamic-fields.ext.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  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" {class}>\
  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. field.name = name;
  54. field.type = typeArray[0];
  55. if (typeArray[1]) field.subtype = typeArray[1];
  56. var html = template(self.opts.templates.base, {
  57. label: field.label,
  58. field: template(self.opts.templates[field.type], field)
  59. });
  60. if (field.after || field.before) {
  61. self.$form.find('[name='+ (field.after || field.before) +']').each(function() {
  62. self._getField(this)[field.after ? 'after' : 'before'](html);
  63. });
  64. } else {
  65. self.$form.find(self.opts.field).last().after(html);
  66. }
  67. if (field.rules) {
  68. rules[name] = field.rules;
  69. self.addRules(rules);
  70. }
  71. });
  72. this._inject('addFields');
  73. },
  74. removeFields: function(names) {
  75. var self = this;
  76. $.each(names.split(' '), function(i, name) {
  77. var $field = self._getField($('[name="'+ name +'"]'));
  78. self.$fields = self.$fields.filter(function() {
  79. return ! $(this).is($field);
  80. });
  81. $field.remove();
  82. });
  83. this._inject('removeFields');
  84. },
  85. toggleFields: function(names) {
  86. var self = this;
  87. $.each(names.split(' '), function(i, name) {
  88. var $field = self._getField($('[name="'+ name +'"]'));
  89. $field.data('idealforms-valid', $field.is(':visible')).toggle();
  90. });
  91. this._inject('toggleFields');
  92. }
  93. }
  94. };