dsfr-form_builder 0.0.1

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.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/dsfr-form_builder.rb +104 -0
  3. metadata +106 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: f78a8ca84967d63fc6f95b3e23ace1f50d1b7c766b384e5581c80b582efad0ce
4
+ data.tar.gz: ed4c78246f7de17792c50af66a13251d70c888c028aa2a1f7cab74c8e6336268
5
+ SHA512:
6
+ metadata.gz: 907d5214d6ee90397b97b7be0ee73b3538fecc6043c22a3d1722b3216dc64edcd1f3c91ae6f94dbcb1cd11a8a1b9a13e1f0d56f336d61840b9f1bd4d7b99ecc7
7
+ data.tar.gz: 8512492bed98876820620cab73bf5a2ec76eb7e49e5d50945bdd7dda8d6c1430e687b2b7ca97f555a922d44a7ab5c7757fef72f5bd22ecb2d939805d74277dd6
@@ -0,0 +1,104 @@
1
+ module Dsfr
2
+ include ActiveSupport::Configurable
3
+
4
+
5
+ class FormBuilder < ActionView::Helpers::FormBuilder
6
+ include ActionView::Helpers::OutputSafetyHelper
7
+
8
+ attr_accessor :display_required_tags
9
+
10
+ def initialize(object_name, object, template, options)
11
+ super
12
+ self.display_required_tags = options.fetch(:display_required_tags, true)
13
+ end
14
+
15
+ def dsfr_text_field(attribute, opts = {})
16
+ dsfr_input_field(attribute, :text_field, opts)
17
+ end
18
+
19
+ def dsfr_email_field(attribute, opts = {})
20
+ dsfr_input_field(attribute, :email_field, opts)
21
+ end
22
+
23
+ def dsfr_url_field(attribute, opts = {})
24
+ dsfr_input_field(attribute, :url_field, opts)
25
+ end
26
+
27
+ def dsfr_phone_field(attribute, opts = {})
28
+ dsfr_input_field(attribute, :phone_field, opts)
29
+ end
30
+
31
+ def dsfr_input_group(attribute, opts, &block)
32
+ @template.content_tag(:div, class: input_group_classes(attribute, opts), data: opts[:data]) do
33
+ yield(block)
34
+ end
35
+ end
36
+
37
+ def dsfr_input_field(attribute, input_kind, opts = {})
38
+ dsfr_input_group(attribute, opts) do
39
+ @template.safe_join(
40
+ [
41
+ dsfr_label_with_hint(attribute, opts),
42
+ public_send(input_kind, attribute, class: "fr-input", **opts.except(:class)),
43
+ dsfr_error_message(attribute),
44
+ ]
45
+ )
46
+ end
47
+ end
48
+
49
+ def dsfr_label_with_hint(attribute, opts = {})
50
+ label_class = "fr-label #{opts[:class]}"
51
+ label(attribute, class: label_class) do
52
+ label_and_tags = [label_value(attribute, opts)]
53
+ label_and_tags.push(required_tag) if opts[:required] && display_required_tags
54
+ label_and_tags.push(hint_tag(opts[:hint])) if opts[:hint]
55
+
56
+ @template.safe_join(label_and_tags)
57
+ end
58
+ end
59
+
60
+ def required_tag
61
+ @template.content_tag(:span, "*", class: "fr-text-error")
62
+ end
63
+
64
+ def dsfr_error_message(attr)
65
+ return if @object.errors[attr].none?
66
+
67
+ @template.content_tag(:p, class: "fr-messages-group") do
68
+ safe_join(@object.errors.full_messages_for(attr).map do |msg|
69
+ @template.content_tag(:span, msg, class: "fr-message fr-message--error")
70
+ end)
71
+ end
72
+ end
73
+
74
+ def hint_tag(text)
75
+ return "" unless text
76
+
77
+ @template.content_tag(:span, class: "fr-hint-text") do
78
+ text
79
+ end
80
+
81
+ @template.content_tag(:span, text, class: "fr-hint-text")
82
+ end
83
+
84
+ def join_classes(arr)
85
+ arr.compact.join(" ")
86
+ end
87
+
88
+ def input_group_classes(attribute, opts)
89
+ join_classes(
90
+ [
91
+ "fr-input-group",
92
+ @object.errors[attribute].any? ? "fr-input-group--error" : nil,
93
+ opts[:class],
94
+ ]
95
+ )
96
+ end
97
+
98
+ def label_value(attribute, opts)
99
+ return opts[:label] if opts[:label]
100
+
101
+ (@object.try(:object) || @object).class.human_attribute_name(attribute)
102
+ end
103
+ end
104
+ end
metadata ADDED
@@ -0,0 +1,106 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dsfr-form_builder
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - BetaGouv developers
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2025-01-21 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: actionview
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '6.1'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '9.0'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: '6.1'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '9.0'
33
+ - !ruby/object:Gem::Dependency
34
+ name: activemodel
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '6.1'
40
+ - - "<"
41
+ - !ruby/object:Gem::Version
42
+ version: '9.0'
43
+ type: :runtime
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: '6.1'
50
+ - - "<"
51
+ - !ruby/object:Gem::Version
52
+ version: '9.0'
53
+ - !ruby/object:Gem::Dependency
54
+ name: activesupport
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: '6.1'
60
+ - - "<"
61
+ - !ruby/object:Gem::Version
62
+ version: '9.0'
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '6.1'
70
+ - - "<"
71
+ - !ruby/object:Gem::Version
72
+ version: '9.0'
73
+ description: Cette librairie de composants vise à simplifier la création de formulaire
74
+ au DSFR (Système de Design de l'État) dans les applications web utilisant Ruby On
75
+ Rails
76
+ email:
77
+ - antoine.girard@beta.gouv.fr
78
+ executables: []
79
+ extensions: []
80
+ extra_rdoc_files: []
81
+ files:
82
+ - lib/dsfr-form_builder.rb
83
+ homepage: https://github.com/betagouv/dsfr-form-builder
84
+ licenses:
85
+ - MIT
86
+ metadata: {}
87
+ post_install_message:
88
+ rdoc_options: []
89
+ require_paths:
90
+ - lib
91
+ required_ruby_version: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '3.2'
96
+ required_rubygems_version: !ruby/object:Gem::Requirement
97
+ requirements:
98
+ - - ">="
99
+ - !ruby/object:Gem::Version
100
+ version: '0'
101
+ requirements: []
102
+ rubygems_version: 3.5.13
103
+ signing_key:
104
+ specification_version: 4
105
+ summary: Ruby on Rails form builder pour le Système de Design de l'État (DSFR)
106
+ test_files: []