pakyow-form 1.0.0.rc1
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 +7 -0
- data/CHANGELOG.md +0 -0
- data/README.md +29 -0
- data/lib/pakyow/form.rb +7 -0
- data/lib/pakyow/form/framework.rb +150 -0
- metadata +117 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 38724ce5ba048f63242d25fd9e7e0e58d08baf6e1230078067bfa243ade4aeac
|
4
|
+
data.tar.gz: 4f56809e4b503cfc879fedd67b0cb9263da7528e81dcee6f84ba142d0e24fdfb
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: da7cbb0b434e38c6402758d84e3ad4becc4caeca18488531c68edf74f7c65b47ce222d05e32067e10faaad794d9ec8d6ae617cd7e6e17e1779160923f330be4f
|
7
|
+
data.tar.gz: c1f311416157209bbaa89ed22d288ecbb6442bb25b7f2b10501004c12a5351ad9e5108014ad8f8087e833da17d36366913860c058b82059c616efc34b7666e22
|
data/CHANGELOG.md
ADDED
File without changes
|
data/README.md
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# pakyow-form
|
2
|
+
|
3
|
+
Forms for Pakyow.
|
4
|
+
|
5
|
+
# Download
|
6
|
+
|
7
|
+
The latest version of Pakyow Form can be installed with RubyGems:
|
8
|
+
|
9
|
+
```
|
10
|
+
gem install pakyow-form
|
11
|
+
```
|
12
|
+
|
13
|
+
Source code can be downloaded as part of the Pakyow project on Github:
|
14
|
+
|
15
|
+
- https://github.com/pakyow/pakyow/tree/master/pakyow-form
|
16
|
+
|
17
|
+
# License
|
18
|
+
|
19
|
+
Pakyow Form is free and open-source under the [LGPLv3 license](https://choosealicense.com/licenses/lgpl-3.0/).
|
20
|
+
|
21
|
+
# Support
|
22
|
+
|
23
|
+
Found a bug? Tell us about it here:
|
24
|
+
|
25
|
+
- https://github.com/pakyow/pakyow/issues
|
26
|
+
|
27
|
+
We'd love to have you in the community:
|
28
|
+
|
29
|
+
- http://pakyow.org/get-involved
|
data/lib/pakyow/form.rb
ADDED
@@ -0,0 +1,150 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "json"
|
4
|
+
|
5
|
+
require "pakyow/framework"
|
6
|
+
|
7
|
+
require "pakyow/support/extension"
|
8
|
+
require "pakyow/support/inflector"
|
9
|
+
|
10
|
+
module Pakyow
|
11
|
+
module Form
|
12
|
+
module ConnectionHelpers
|
13
|
+
def form
|
14
|
+
get(:__form)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
class Framework < Pakyow::Framework(:form)
|
19
|
+
def boot
|
20
|
+
object.class_eval do
|
21
|
+
isolated :Controller do
|
22
|
+
# Clear form errors after a successful submission.
|
23
|
+
#
|
24
|
+
after "dispatch" do
|
25
|
+
if connection.form && connection.status < 400
|
26
|
+
data.ephemeral(:errors, form_id: connection.form[:id]).set([])
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
isolated :Connection do
|
32
|
+
include ConnectionHelpers
|
33
|
+
end
|
34
|
+
|
35
|
+
handle InvalidData, as: :bad_request do |error|
|
36
|
+
if connection.form && connection.form.include?(:origin)
|
37
|
+
errors = error.result.messages.flat_map { |type, messages|
|
38
|
+
case messages
|
39
|
+
when Array
|
40
|
+
messages.map { |type_message|
|
41
|
+
{ field: type, message: "#{Support.inflector.humanize(type)} #{type_message}" }
|
42
|
+
}
|
43
|
+
when Hash
|
44
|
+
messages.flat_map { |field, field_messages|
|
45
|
+
field_messages.map { |field_message|
|
46
|
+
{ field: field, message: "#{Support.inflector.humanize(field)} #{field_message}" }
|
47
|
+
}
|
48
|
+
}
|
49
|
+
end
|
50
|
+
}
|
51
|
+
|
52
|
+
if app.class.includes_framework?(:ui) && ui?
|
53
|
+
data.ephemeral(:errors, form_id: connection.form[:id]).set(errors)
|
54
|
+
else
|
55
|
+
connection.set(:__form_errors, errors)
|
56
|
+
connection.set(:__form_values, params.reject { |key| key == :form })
|
57
|
+
reroute connection.form[:origin], method: :get, as: :bad_request
|
58
|
+
end
|
59
|
+
else
|
60
|
+
reject
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
component :form do
|
65
|
+
def perform
|
66
|
+
errors = if connection.values.include?(:__form_errors)
|
67
|
+
connection.get(:__form_errors)
|
68
|
+
else
|
69
|
+
[]
|
70
|
+
end
|
71
|
+
|
72
|
+
# We have to take over the management of form ids from presenter for error handling.
|
73
|
+
# If we're re-rendering a submitted form we reuse the id, otherwise create a new one.
|
74
|
+
#
|
75
|
+
form_id = if connection.form
|
76
|
+
connection.form[:id]
|
77
|
+
else
|
78
|
+
SecureRandom.hex(24)
|
79
|
+
end
|
80
|
+
|
81
|
+
expose :form_id, form_id
|
82
|
+
|
83
|
+
# Relate ephemeral errors to the form id.
|
84
|
+
#
|
85
|
+
expose :form_errors, data.ephemeral(:errors, form_id: form_id).set(errors)
|
86
|
+
|
87
|
+
# Expose submitted values to be presented in the form.
|
88
|
+
#
|
89
|
+
connection.get(:__form_values).to_h.each do |key, value|
|
90
|
+
expose connection.form[:binding], value
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
presenter do
|
95
|
+
render do
|
96
|
+
view.label(:form)[:id] = form_id
|
97
|
+
presented_form_binding = presentables.dig(:__form, :binding)
|
98
|
+
if presented_form_binding.nil? || presented_form_binding.to_sym == view.channeled_binding_name
|
99
|
+
classify_form; classify_fields
|
100
|
+
present_errors(form_errors)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
private
|
105
|
+
|
106
|
+
def classify_form
|
107
|
+
if form_errors.any?
|
108
|
+
attrs[:class] << :"ui-errored"
|
109
|
+
else
|
110
|
+
attrs[:class].delete(:"ui-errored")
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
def classify_fields
|
115
|
+
view.each_binding_prop do |node|
|
116
|
+
binding_name = node.label(:binding)
|
117
|
+
error = form_errors.find { |e| e[:field] == binding_name }
|
118
|
+
|
119
|
+
find(binding_name).with do |field|
|
120
|
+
if error.nil?
|
121
|
+
field.attrs[:class].delete(:"ui-errored")
|
122
|
+
field.attrs[:title] = ""
|
123
|
+
else
|
124
|
+
field.attrs[:class] << :"ui-errored"
|
125
|
+
field.attrs[:title] = error[:message]
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
def present_errors(errors)
|
132
|
+
if form_errors_presenter = component(:"form-errors")
|
133
|
+
if error_presenter = form_errors_presenter.find(:error)
|
134
|
+
error_presenter.present(errors)
|
135
|
+
end
|
136
|
+
|
137
|
+
if errors.empty?
|
138
|
+
form_errors_presenter.attrs[:class] << :"ui-hidden"
|
139
|
+
else
|
140
|
+
form_errors_presenter.attrs[:class].delete(:"ui-hidden")
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
metadata
ADDED
@@ -0,0 +1,117 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: pakyow-form
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0.rc1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Bryan Powell
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2019-07-03 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: pakyow-core
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 1.0.0.rc1
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 1.0.0.rc1
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: pakyow-data
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 1.0.0.rc1
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 1.0.0.rc1
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: pakyow-presenter
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 1.0.0.rc1
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 1.0.0.rc1
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: pakyow-routing
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 1.0.0.rc1
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 1.0.0.rc1
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: pakyow-support
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - '='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 1.0.0.rc1
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - '='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 1.0.0.rc1
|
83
|
+
description: Forms for Pakyow
|
84
|
+
email: bryan@metabahn.com
|
85
|
+
executables: []
|
86
|
+
extensions: []
|
87
|
+
extra_rdoc_files: []
|
88
|
+
files:
|
89
|
+
- CHANGELOG.md
|
90
|
+
- README.md
|
91
|
+
- lib/pakyow/form.rb
|
92
|
+
- lib/pakyow/form/framework.rb
|
93
|
+
homepage: https://pakyow.org
|
94
|
+
licenses:
|
95
|
+
- LGPL-3.0
|
96
|
+
metadata: {}
|
97
|
+
post_install_message:
|
98
|
+
rdoc_options: []
|
99
|
+
require_paths:
|
100
|
+
- lib
|
101
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
102
|
+
requirements:
|
103
|
+
- - ">="
|
104
|
+
- !ruby/object:Gem::Version
|
105
|
+
version: 2.5.0
|
106
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: 1.3.1
|
111
|
+
requirements: []
|
112
|
+
rubyforge_project:
|
113
|
+
rubygems_version: 2.7.6
|
114
|
+
signing_key:
|
115
|
+
specification_version: 4
|
116
|
+
summary: Pakyow Forms
|
117
|
+
test_files: []
|