Requires

Provides

Fieldset.js

Wrapper around set of form fields

License:
Public domain (http://unlicense.org).
  1. 20
  2. 21
  3. 22
  4. 23
  5. 24
  6. 25
  7. 26
  8. 27
  9. 28
  10. 29
  11. 30
  12. 31
  13. 32
  14. 33
  15. 34
  16. 35
LSD.Trait.Fieldset = new Class({ options: { events :{ request: { request: 'validateFields', badRequest: 'addFieldErrors' }, _fieldset: { layoutTransform: function(query) { var element = query.element, name = element.name, id = element.id, transformation; var widget = Element.retrieve(element, 'widget'); if (!widget) return; if (name && this.names[name]) { var bumped = LSD.Trait.Fieldset.bumpName(name); if (bumped) (transformation || (transformation = {attributes: {}})).attributes.name = bumped; }

bump id index

  1. 37
  2. 38
  3. 39
  4. 40
if (id) { bumped = LSD.Trait.Fieldset.bumpId(id); if (bumped != id) (transformation || (transformation = {attributes: {}})).attributes.id = bumped; }

bump name index

  1. 42
  2. 43
  3. 44
  4. 45
  5. 46
  6. 47
  7. 48
  8. 49
  9. 50
  10. 51
  11. 52
  12. 53
  13. 54
  14. 55
  15. 56
  16. 57
  17. 58
  18. 59
  19. 60
  20. 61
  21. 62
  22. 63
  23. 64
  24. 65
  25. 66
  26. 67
  27. 68
  28. 69
  29. 70
  30. 71
  31. 72
  32. 73
  33. 74
  34. 75
  35. 76
  36. 77
  37. 78
  38. 79
  39. 80
  40. 81
  41. 82
  42. 83
  43. 84
  44. 85
  45. 86
  46. 87
  47. 88
  48. 89
  49. 90
  50. 91
  51. 92
  52. 93
  53. 94
  54. 95
  55. 96
  56. 97
  57. 98
  58. 99
  59. 100
  60. 101
  61. 102
  62. 103
  63. 104
  64. 105
  65. 106
  66. 107
  67. 108
  68. 109
  69. 110
  70. 111
  71. 112
  72. 113
  73. 114
  74. 115
  75. 116
  76. 117
if (LSD.toLowerCase(element.tagName) == 'label') { var four = element.htmlFor if (four) { bumped = LSD.Trait.Fieldset.bumpId(four); if (bumped != four) (transformation || (transformation = {attributes: {}})).attributes['for'] = bumped; } } if (query.transformation) Object.append(query.transformation, transformation); else query.transformation = transformation; } } }, has: { many: { elements: { selector: ':read-write', callbacks: { 'add': 'addField', 'remove': 'removeField' } } } } }, initialize: function() { this.names = {}; this.params = {}; this.parent.apply(this, arguments) }, checkValidity: function() { var valid = true; for (var i = 0, element; element = this.elements[i++];) if (!element.checkValidity()) valid = false; return valid; }, getData: function() { var data = {} for (var name in this.names) data[name] = this.names[name].getValue(); return data; }, getRequestData: function() { return this.element; }, reset: function() { }, addFieldErrors: function(response) { var regex = LSD.Trait.Fieldset.rPrefixAppender; for (var model in response) { var value = response[model], errors = value.errors; if (!errors) continue; if (errors.each) { errors.each(function(error) { var name = model + error[0].replace(regex, function(match) {return '[' + match + ']'}); var field = this.names[name]; if (field) { field.invalidate(error[1]); this.invalid = true; } }, this) } } }, addField: function(widget, object) { var name = widget.attributes.name; if (!name) return; if (typeof object != 'object') { this.names[name] = widget; object = this.params; }

for (var regex = LSD.Trait.Fieldset.rNameParser, match, bit;;) { match = regex.exec(name) if (bit != null) {

if (!match) {
        if (object[bit] && object[bit].push) object[bit].push(widget);
        else object[bit] = widget;
      } else object = object[bit] || (object[bit] = (bit ? {} : []));
      

} if (!match) break; else bit = match[1] ||match[2]; } return object

  1. 130
  2. 131
  3. 132
  4. 133
  5. 134
  6. 135
  7. 136
  8. 137
  9. 138
  10. 139
  11. 140
  12. 141
  13. 142
  14. 143
  15. 144
  16. 145
  17. 146
  18. 147
  19. 148
  20. 149
  21. 150
  22. 151
  23. 152
  24. 153
  25. 154
  26. 155
  27. 156
  28. 157
  29. 158
  30. 159
  31. 160
  32. 161
  33. 162
  34. 163
  35. 164
  36. 165
  37. 166
  38. 167
  39. 168
  40. 169
  41. 170
  42. 171
  43. 172
}, removeField: function(widget, object) { }, invalidateFields: function(errors) { this.getFields(errors, function(field, error) { field.invalidate(error); }); }, getFieldsByName: function(fields, callback, root) { if (fields.call && (callback = fields)) fields = null; if (!fields) fields = this.elements; if (!callback && fields.indexOf) return root[fields] if (fields.map && fields.each && (!callback || !root)) return fields.map(function(field) { return this.getFieldsByName(field, callback, root) }.bind(this)); }, validateFields: function(fields) { if (!this.invalid) return; this.getElements(':read-write:invalid').each(function(field) { field.validate(true); }) } }); Object.append(LSD.Trait.Fieldset, { rNameIndexBumper: /(\[)(\d+?)(\])/, rIdIndexBumper: /(_)(\d+?)(_|$)/, rNameParser: /(^[^\[]+)|\[([^\]]*)\]/ig, rPrefixAppender: /^[^\[]+/i, bumpName: function(string) { return string.replace(LSD.Trait.Fieldset.rNameIndexBumper, function(m, a, index, b) { return a + (parseInt(index) + 1) + b; }) }, bumpId: function(string) { return string.replace(LSD.Trait.Fieldset.rIdIndexBumper, function(m, a, index, b) { return a + (parseInt(index) + 1) + b; }) } });