express_templates 0.3.2 → 0.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 833fc8181d87deb3b99763fb91dfdad3b48c6c9e
4
- data.tar.gz: cb4037d2a9bcd7c2e3084ea9ec2026693f71da5e
3
+ metadata.gz: e5d21da31290cc55f88dced62806bcda510084f7
4
+ data.tar.gz: 9dd96eb7a6c1cf233d0bf11c65511f1515c7fb30
5
5
  SHA512:
6
- metadata.gz: e2040b7bf2a3fb485bd6d454532c41b3467700efaac36f50333fcd9d8c16d0055f77bd3888640f11f9dc972540504697cf9e92818aaab8ba19c24ecbcc9cd71b
7
- data.tar.gz: 79e23baf7ea8315fbd06f85b6433b658c233847973de3ddc07d20ddc7cb086c183aee8858bc856e1d24a7c3dd9e2ad234a6151715c096245b8223217f76994aa
6
+ metadata.gz: b091217942e9c4ccc1e92e250f7dab0623e23bd204e3c965301eee2da6b0ff6aff9457362c087f661d2f66bbf9abd25603df29dc6d2c8f67ea6896b765fd3d50
7
+ data.tar.gz: 97561ff9e8624760dc595d96a873ef56d0893669460cc16f2a59517ac9672934f4bb1e89f6a056fc4331da95eb8426bdc9632746081e55e16d43d3508b27836d
@@ -5,7 +5,7 @@ module ExpressTemplates
5
5
  #
6
6
  # Example:
7
7
  #
8
- # ````ruby
8
+ # ````
9
9
  # form_for(:people) do |f|
10
10
  # f.text_field :name
11
11
  # f.email_field :email
@@ -53,7 +53,7 @@ module ExpressTemplates
53
53
  #
54
54
  # Example:
55
55
  #
56
- # ````ruby
56
+ # ````
57
57
  # form_for(:posts) do
58
58
  # f.text_field :title, wrapped_class: 'string optional'
59
59
  # end
@@ -71,7 +71,7 @@ module ExpressTemplates
71
71
  #
72
72
  # In addition to this, label text can also be customized using the `label` option:
73
73
  #
74
- # ````ruby
74
+ # ````
75
75
  # f.email_field :email_address, label: 'Your Email'
76
76
  # ````
77
77
  #
@@ -86,7 +86,10 @@ module ExpressTemplates
86
86
 
87
87
  def initialize(*args)
88
88
  # TODO: need a better way to select the form options
89
- @form_options = args.select { |x| x.is_a?(Hash) }
89
+ if @form_options = args.find { |x| x.is_a?(Hash) }
90
+ @_method = @form_options.delete :method
91
+ end
92
+
90
93
  super(*args)
91
94
  _process_args!(args) # from Configurable
92
95
  yield(self) if block_given?
@@ -98,7 +101,7 @@ module ExpressTemplates
98
101
  #
99
102
  # Example:
100
103
  #
101
- # ````ruby
104
+ # ````
102
105
  # form_for(:people) do |f|
103
106
  # f.phone_field :phone
104
107
  # end
@@ -106,17 +109,27 @@ module ExpressTemplates
106
109
  #
107
110
  # This will precompile as
108
111
  #
109
- # ````ruby
112
+ # ````
110
113
  # ...
111
114
  # phone_field_tag :phone, @people.phone, {}
112
115
  # ...
113
116
  # ````
114
117
  #
118
+ # You can also add html options to the form (add classes, id, etc)
119
+ #
120
+ # ````
121
+ # form_for(:people, html_options: {class: 'edit_form', id: 'people_form'}) do |f|
122
+ # f.phone_field :phone
123
+ # end
124
+ # ````
125
+ #
126
+ # # <form action='/people' method='post' id='people_form' class='edit_form'>
127
+ #
115
128
  # Fields can also have custom classes via the `class` option:
116
129
  #
117
130
  # Example:
118
131
  #
119
- # ````ruby
132
+ # ````
120
133
  # f.url_field :website_url, class: 'url-string'
121
134
  # ````
122
135
  #
@@ -134,7 +147,7 @@ module ExpressTemplates
134
147
  #
135
148
  #
136
149
  # = Fields
137
- # ````ruby
150
+ # ````
138
151
  # f.text_field :name
139
152
  # # <div>
140
153
  # # <label for="person_name">Name</label>
@@ -257,26 +270,19 @@ module ExpressTemplates
257
270
  @fields << Field.new(name, options, :submit)
258
271
  end
259
272
 
260
- emits -> {
261
- resource_name = my[:id].to_s
262
- form_options = @form_options.first
263
- form_method = form_options.delete :method if form_options
264
-
265
- form_method = if form_method == :put
266
- :patch
267
- else
268
- form_options.present? ? form_options[:method] : :post
269
- end
270
-
271
- form_action = if form_method == :patch
272
- %Q(/#{resource_name.pluralize}/{{@#{resource_name}.id}})
273
- else
274
- %Q(/#{resource_name.pluralize})
275
- end
276
-
277
- form_args = {action: form_action, method: :post}
278
- form_args.merge!(form_options) unless form_options.nil?
273
+ # You can add extra actions to a form instead of just submit
274
+ # ==== Examples
275
+ # f.actions({submit: ['Save', {class: 'submit primary'}], cancel: ['Cancel it', class: 'cancel secondary']})
276
+ # # <div>
277
+ # # <input type="submit" name="submit primary" value: "Save" />
278
+ # # <a href="#" onclick="return false;" class="cancel secondary">Cancel it</a>
279
+ # # </div>
280
+ def actions(extra_actions)
281
+ @fields ||= []
282
+ @fields << Actions.new(extra_actions)
283
+ end
279
284
 
285
+ emits -> {
280
286
  form(form_args) {
281
287
  form_rails_support form_method
282
288
  fields.each do |field|
@@ -284,7 +290,7 @@ module ExpressTemplates
284
290
  field_type = field.type.to_s
285
291
  resource_field_name = "#{resource_name.singularize}[#{field_name}]"
286
292
  label_name = "#{resource_name.singularize}_#{field_name}"
287
- field_label = field.label || field_name.to_s.capitalize
293
+ field_label = field.label || field_name.to_s.titleize
288
294
 
289
295
  div(class: field.wrapper_class) {
290
296
  if field_type == 'select'
@@ -302,6 +308,18 @@ module ExpressTemplates
302
308
  end
303
309
  elsif field_type == 'submit'
304
310
  submit_tag(field_name, field.options)
311
+ elsif field_type == 'actions'
312
+ field.extra_actions.each do |action|
313
+ action_type = action.first
314
+ action_options = action.last
315
+
316
+ if action_type == :submit
317
+ submit_tag(action_options.first, action_options.last)
318
+ elsif action_type == :cancel
319
+ default_opts = {href: '#', onclick: 'return false;'}.merge!(action_options.last)
320
+ a(default_opts) { action_options.first }
321
+ end
322
+ end
305
323
  else
306
324
  label_tag(label_name, field_label) unless field_type == 'hidden'
307
325
  args = [resource_field_name, "{{@#{resource_name.singularize}.#{field_name}}}", field.options]
@@ -326,6 +344,42 @@ module ExpressTemplates
326
344
  wrap_for_stack_trace(lookup(:markup))
327
345
  end
328
346
 
347
+ private
348
+
349
+ def form_method
350
+ if @_method == :put
351
+ :patch
352
+ else
353
+ @form_options.present? ? @form_options[:method] : :post
354
+ end
355
+ end
356
+
357
+ def _action(resource_name)
358
+ base_url = %Q(/#{resource_name.pluralize})
359
+ if form_method == :patch
360
+ %Q(#{base_url}/{{@#{resource_name}.id}})
361
+ else
362
+ base_url
363
+ end
364
+ end
365
+
366
+ def form_args
367
+ default_args = {action: _action(resource_name), method: :post}
368
+
369
+ if @form_options.nil?
370
+ default_args
371
+ else
372
+ if html_options = @form_options.delete(:html_options)
373
+ @form_options.merge!(html_options)
374
+ end
375
+ default_args.merge!(@form_options)
376
+ end
377
+ end
378
+
379
+ def resource_name
380
+ my[:id].to_s
381
+ end
382
+
329
383
  class Field
330
384
  attr :name, :options, :label, :type, :wrapper_class
331
385
  def initialize(name, options = {}, type=:text)
@@ -381,6 +435,17 @@ module ExpressTemplates
381
435
  end
382
436
  end
383
437
  end
438
+
439
+ # need to fix this some day (actions doesn't need to inherit from field)
440
+ class Actions < Field
441
+ attr :extra_actions
442
+ def initialize(extra_actions)
443
+ @type = :actions
444
+ @name = ''
445
+ @label = ''
446
+ @extra_actions = extra_actions
447
+ end
448
+ end
384
449
  end
385
450
  end
386
451
  end
@@ -1,3 +1,3 @@
1
1
  module ExpressTemplates
2
- VERSION = "0.3.2"
2
+ VERSION = "0.3.4"
3
3
  end
@@ -25,33 +25,33 @@ class FormForTest < ActiveSupport::TestCase
25
25
  def setup
26
26
  @example_compiled = -> {
27
27
  ExpressTemplates::Components::FormFor.render_in(self) {
28
- "<form action=\"/resources\" method=\"put\" url=\"/yolo\">
28
+ "<form action=\"/resources/#{@resource.id}\" method=\"post\" url=\"/posts\" id=\"post_form\">
29
29
  <div style=\"display:none\">
30
- "+%Q(#{utf8_enforcer_tag})+%Q(#{method_tag(:post)})+%Q(#{token_tag})+"
30
+ "+%Q(#{utf8_enforcer_tag})+%Q(#{method_tag(:patch)})+%Q(#{token_tag})+"
31
31
  </div>
32
32
 
33
33
  <div class=\"\">
34
- "+%Q(#{label_tag(:name, "post title")})+%Q(#{text_field_tag(:name, @resource.name, label: "post title")})+"
34
+ "+%Q(#{label_tag("resource_name", "post title")})+%Q(#{text_field_tag("resource[name]", @resource.name, label: "post title")})+"
35
35
  </div>
36
36
 
37
37
  <div class=\"\">
38
- "+%Q(#{label_tag(:body, nil)})+%Q(#{text_field_tag(:body, @resource.body, class: "string")})+"
38
+ "+%Q(#{label_tag("resource_body", "Body")})+%Q(#{text_field_tag("resource[body]", @resource.body, class: "string")})+"
39
39
  </div>
40
40
 
41
41
  <div class=\"field input\">
42
- "+%Q(#{label_tag(:email, nil)})+%Q(#{email_field_tag(:email, @resource.email, wrapper_class: "field input")})+"
42
+ "+%Q(#{label_tag("resource_email", "Email")})+%Q(#{email_field_tag("resource[email]", @resource.email, {})})+"
43
43
  </div>
44
44
 
45
45
  <div class=\"\">
46
- "+%Q(#{label_tag(:phone, nil)})+%Q(#{phone_field_tag(:phone, @resource.phone, {})})+"
46
+ "+%Q(#{label_tag("resource_mobile_phone", "Mobile Phone")})+%Q(#{phone_field_tag("resource[mobile_phone]", @resource.mobile_phone, {})})+"
47
47
  </div>
48
48
 
49
49
  <div class=\"\">
50
- "+%Q(#{label_tag(:url, nil)})+%Q(#{url_field_tag(:url, @resource.url, {})})+"
50
+ "+%Q(#{label_tag("resource_url", "Url")})+%Q(#{url_field_tag("resource[url]", @resource.url, {})})+"
51
51
  </div>
52
52
 
53
53
  <div class=\"\">
54
- "+%Q(#{label_tag(:number, nil)})+%Q(#{number_field_tag(:number, @resource.number, {})})+"
54
+ "+%Q(#{label_tag("resource_number", "Number")})+%Q(#{number_field_tag("resource[number]", @resource.number, {})})+"
55
55
  </div>
56
56
 
57
57
  <div class=\"\">"+%Q(#{submit_tag("Save it!", {})})+"</div>
@@ -70,11 +70,11 @@ class FormForTest < ActiveSupport::TestCase
70
70
  def simple_form(resource)
71
71
  ctx = Context.new(resource)
72
72
  fragment = -> {
73
- form_for(:resource, method: :put, url: '/yolo') do |f|
73
+ form_for(:resource, method: :put, url: '/posts', html_options: {id: 'post_form'}) do |f|
74
74
  f.text_field :name, label: 'post title'
75
75
  f.text_field :body, class: 'string'
76
76
  f.email_field :email, wrapper_class: 'field input'
77
- f.phone_field :phone
77
+ f.phone_field :mobile_phone
78
78
  f.url_field :url
79
79
  f.number_field :number
80
80
  f.submit 'Save it!'
@@ -114,10 +114,52 @@ class FormForTest < ActiveSupport::TestCase
114
114
  return ctx, fragment
115
115
  end
116
116
 
117
+ def advanced_form(resource)
118
+ ctx = Context.new(resource)
119
+ fragment = -> {
120
+ form_for(:resource, method: :put, url: '/posts') do |f|
121
+ f.text_field :name, label: 'post title'
122
+ f.text_field :body, class: 'string'
123
+ f.actions({submit: ['Save', {class: 'submit primary'}], cancel: ['Cancel it', class: 'cancel secondary']})
124
+ end
125
+ }
126
+ return ctx, fragment
127
+ end
128
+
117
129
  test "fields compiled source is legible and transparent" do
118
130
  ExpressTemplates::Markup::Tag.formatted do
119
- # ctx, fragment = simple_form(resource)
120
- # assert_equal example_compiled_src, ExpressTemplates.compile(&fragment)
131
+ ctx, fragment = simple_form(resource)
132
+ assert_equal example_compiled_src, ExpressTemplates.compile(&fragment)
133
+ end
134
+ end
135
+
136
+ test 'advanced form can have additional actions' do
137
+ @example_compiled = -> {
138
+ ExpressTemplates::Components::FormFor.render_in(self) {
139
+ "<form action=\"/resources/#{@resource.id}\" method=\"post\" url=\"/posts\">
140
+ <div style=\"display:none\">
141
+ "+%Q(#{utf8_enforcer_tag})+%Q(#{method_tag(:patch)})+%Q(#{token_tag})+"
142
+ </div>
143
+
144
+ <div class=\"\">
145
+ "+%Q(#{label_tag("resource_name", "post title")})+%Q(#{text_field_tag("resource[name]", @resource.name, label: "post title")})+"
146
+ </div>
147
+
148
+ <div class=\"\">
149
+ "+%Q(#{label_tag("resource_body", "Body")})+%Q(#{text_field_tag("resource[body]", @resource.body, class: "string")})+"
150
+ </div>
151
+
152
+ <div class=\"\">
153
+ "+%Q(#{submit_tag("Save", class: "submit primary")})+"
154
+ <a href=\"#\" onclick=\"return false;\" class=\"cancel secondary\">Cancel it</a>
155
+ </div>
156
+ </form>
157
+ "
158
+ }
159
+ }
160
+ ExpressTemplates::Markup::Tag.formatted do
161
+ ctx, fragment = advanced_form(resource)
162
+ assert_equal example_compiled_src, ExpressTemplates.compile(&fragment)
121
163
  end
122
164
  end
123
165
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: express_templates
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.2
4
+ version: 0.3.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Steven Talcott Smith
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-02-23 00:00:00.000000000 Z
12
+ date: 2015-03-17 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -286,7 +286,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
286
286
  version: '0'
287
287
  requirements: []
288
288
  rubyforge_project:
289
- rubygems_version: 2.4.5
289
+ rubygems_version: 2.4.6
290
290
  signing_key:
291
291
  specification_version: 4
292
292
  summary: Write HTML templates in declarative Ruby. Create reusable view components.