active_fields 1.1.0 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +5 -4
- data/CHANGELOG.md +27 -2
- data/README.md +411 -38
- data/app/models/active_fields/field/boolean.rb +3 -0
- data/app/models/active_fields/field/date.rb +3 -0
- data/app/models/active_fields/field/date_array.rb +3 -0
- data/app/models/active_fields/field/date_time.rb +4 -1
- data/app/models/active_fields/field/date_time_array.rb +4 -1
- data/app/models/active_fields/field/decimal.rb +6 -1
- data/app/models/active_fields/field/decimal_array.rb +6 -1
- data/app/models/active_fields/field/enum.rb +3 -0
- data/app/models/active_fields/field/enum_array.rb +3 -0
- data/app/models/active_fields/field/integer.rb +3 -0
- data/app/models/active_fields/field/integer_array.rb +3 -0
- data/app/models/active_fields/field/text.rb +3 -0
- data/app/models/active_fields/field/text_array.rb +3 -0
- data/app/models/active_fields/field.rb +5 -0
- data/app/models/concerns/active_fields/customizable_concern.rb +89 -3
- data/app/models/concerns/active_fields/field_concern.rb +26 -3
- data/db/migrate/20240229230000_create_active_fields_tables.rb +1 -1
- data/lib/active_fields/casters/date_time_caster.rb +1 -3
- data/lib/active_fields/casters/decimal_caster.rb +2 -5
- data/lib/active_fields/constants.rb +55 -0
- data/lib/active_fields/engine.rb +2 -1
- data/lib/active_fields/finders/array_finder.rb +112 -0
- data/lib/active_fields/finders/base_finder.rb +73 -0
- data/lib/active_fields/finders/boolean_finder.rb +20 -0
- data/lib/active_fields/finders/date_array_finder.rb +65 -0
- data/lib/active_fields/finders/date_finder.rb +32 -0
- data/lib/active_fields/finders/date_time_array_finder.rb +65 -0
- data/lib/active_fields/finders/date_time_finder.rb +32 -0
- data/lib/active_fields/finders/decimal_array_finder.rb +65 -0
- data/lib/active_fields/finders/decimal_finder.rb +32 -0
- data/lib/active_fields/finders/enum_array_finder.rb +41 -0
- data/lib/active_fields/finders/enum_finder.rb +20 -0
- data/lib/active_fields/finders/integer_array_finder.rb +65 -0
- data/lib/active_fields/finders/integer_finder.rb +32 -0
- data/lib/active_fields/finders/singular_finder.rb +66 -0
- data/lib/active_fields/finders/text_array_finder.rb +47 -0
- data/lib/active_fields/finders/text_finder.rb +81 -0
- data/lib/active_fields/has_active_fields.rb +3 -4
- data/lib/active_fields/registry.rb +38 -0
- data/lib/active_fields/version.rb +1 -1
- data/lib/active_fields.rb +29 -1
- data/lib/generators/active_fields/scaffold/scaffold_generator.rb +9 -0
- data/lib/generators/active_fields/scaffold/templates/controllers/active_fields_controller.rb +0 -10
- data/lib/generators/active_fields/scaffold/templates/controllers/concerns/active_fields_controller_concern.rb +33 -0
- data/lib/generators/active_fields/scaffold/templates/helpers/active_fields_helper.rb +67 -0
- data/lib/generators/active_fields/scaffold/templates/javascript/controllers/active_fields_finders_form_controller.js +59 -0
- data/lib/generators/active_fields/scaffold/templates/views/active_fields/finders/_form.html.erb +42 -0
- data/lib/generators/active_fields/scaffold/templates/views/active_fields/finders/inputs/_array_size.html.erb +16 -0
- data/lib/generators/active_fields/scaffold/templates/views/active_fields/finders/inputs/_boolean.html.erb +21 -0
- data/lib/generators/active_fields/scaffold/templates/views/active_fields/finders/inputs/_date.html.erb +16 -0
- data/lib/generators/active_fields/scaffold/templates/views/active_fields/finders/inputs/_date_array.html.erb +16 -0
- data/lib/generators/active_fields/scaffold/templates/views/active_fields/finders/inputs/_datetime.html.erb +16 -0
- data/lib/generators/active_fields/scaffold/templates/views/active_fields/finders/inputs/_datetime_array.html.erb +16 -0
- data/lib/generators/active_fields/scaffold/templates/views/active_fields/finders/inputs/_decimal.html.erb +16 -0
- data/lib/generators/active_fields/scaffold/templates/views/active_fields/finders/inputs/_decimal_array.html.erb +16 -0
- data/lib/generators/active_fields/scaffold/templates/views/active_fields/finders/inputs/_enum.html.erb +16 -0
- data/lib/generators/active_fields/scaffold/templates/views/active_fields/finders/inputs/_enum_array.html.erb +16 -0
- data/lib/generators/active_fields/scaffold/templates/views/active_fields/finders/inputs/_integer.html.erb +16 -0
- data/lib/generators/active_fields/scaffold/templates/views/active_fields/finders/inputs/_integer_array.html.erb +16 -0
- data/lib/generators/active_fields/scaffold/templates/views/active_fields/finders/inputs/_text.html.erb +16 -0
- data/lib/generators/active_fields/scaffold/templates/views/active_fields/finders/inputs/_text_array.html.erb +16 -0
- data/lib/generators/active_fields/scaffold/templates/views/active_fields/forms/_boolean.html.erb +1 -1
- data/lib/generators/active_fields/scaffold/templates/views/active_fields/forms/_date.html.erb +1 -1
- data/lib/generators/active_fields/scaffold/templates/views/active_fields/forms/_date_array.html.erb +1 -1
- data/lib/generators/active_fields/scaffold/templates/views/active_fields/forms/_datetime.html.erb +2 -2
- data/lib/generators/active_fields/scaffold/templates/views/active_fields/forms/_datetime_array.html.erb +2 -2
- data/lib/generators/active_fields/scaffold/templates/views/active_fields/forms/_decimal.html.erb +2 -2
- data/lib/generators/active_fields/scaffold/templates/views/active_fields/forms/_decimal_array.html.erb +2 -2
- data/lib/generators/active_fields/scaffold/templates/views/active_fields/forms/_enum.html.erb +1 -1
- data/lib/generators/active_fields/scaffold/templates/views/active_fields/forms/_enum_array.html.erb +1 -1
- data/lib/generators/active_fields/scaffold/templates/views/active_fields/forms/_integer.html.erb +1 -1
- data/lib/generators/active_fields/scaffold/templates/views/active_fields/forms/_integer_array.html.erb +1 -1
- data/lib/generators/active_fields/scaffold/templates/views/active_fields/forms/_text.html.erb +1 -1
- data/lib/generators/active_fields/scaffold/templates/views/active_fields/forms/_text_array.html.erb +1 -1
- data/lib/generators/active_fields/scaffold/templates/views/shared/_array_field.html.erb +1 -1
- metadata +42 -10
- data/lib/active_fields/customizable_config.rb +0 -24
@@ -0,0 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ActiveFields
|
4
|
+
# Storage for configured relations between active fields and customizable models
|
5
|
+
class Registry
|
6
|
+
include Singleton
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
@customizables = {}
|
10
|
+
@fields = {}
|
11
|
+
end
|
12
|
+
|
13
|
+
# Add relation between active field type and customizable type
|
14
|
+
def add(field_type_name, customizable_type)
|
15
|
+
if ActiveFields.config.type_names.exclude?(field_type_name)
|
16
|
+
raise ArgumentError, "undefined ActiveFields type provided for #{customizable_type}: #{field_type_name}"
|
17
|
+
end
|
18
|
+
|
19
|
+
@customizables[field_type_name] ||= Set.new
|
20
|
+
@customizables[field_type_name] << customizable_type
|
21
|
+
|
22
|
+
@fields[customizable_type] ||= Set.new
|
23
|
+
@fields[customizable_type] << field_type_name
|
24
|
+
|
25
|
+
nil
|
26
|
+
end
|
27
|
+
|
28
|
+
# Returns customizable types that allow provided active field type name
|
29
|
+
def customizable_types_for(field_type_name)
|
30
|
+
@customizables[field_type_name]
|
31
|
+
end
|
32
|
+
|
33
|
+
# Returns active field type names, allowed for given customizable type
|
34
|
+
def field_type_names_for(customizable_type)
|
35
|
+
@fields[customizable_type]
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
data/lib/active_fields.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require_relative "active_fields/version"
|
4
|
+
require_relative "active_fields/constants"
|
4
5
|
require_relative "active_fields/engine"
|
5
6
|
|
6
7
|
module ActiveFields
|
@@ -11,12 +12,13 @@ module ActiveFields
|
|
11
12
|
super
|
12
13
|
Casters.eager_load!
|
13
14
|
Validators.eager_load!
|
15
|
+
Finders.eager_load!
|
14
16
|
end
|
15
17
|
end
|
16
18
|
|
17
19
|
eager_autoload do
|
18
20
|
autoload :Config
|
19
|
-
autoload :
|
21
|
+
autoload :Registry
|
20
22
|
autoload :HasActiveFields
|
21
23
|
end
|
22
24
|
|
@@ -62,6 +64,30 @@ module ActiveFields
|
|
62
64
|
end
|
63
65
|
end
|
64
66
|
|
67
|
+
module Finders
|
68
|
+
extend ActiveSupport::Autoload
|
69
|
+
|
70
|
+
eager_autoload do
|
71
|
+
autoload :BaseFinder
|
72
|
+
autoload :SingularFinder
|
73
|
+
autoload :ArrayFinder
|
74
|
+
|
75
|
+
autoload :BooleanFinder
|
76
|
+
autoload :DateFinder
|
77
|
+
autoload :DateArrayFinder
|
78
|
+
autoload :DateTimeFinder
|
79
|
+
autoload :DateTimeArrayFinder
|
80
|
+
autoload :DecimalFinder
|
81
|
+
autoload :DecimalArrayFinder
|
82
|
+
autoload :EnumFinder
|
83
|
+
autoload :EnumArrayFinder
|
84
|
+
autoload :IntegerFinder
|
85
|
+
autoload :IntegerArrayFinder
|
86
|
+
autoload :TextFinder
|
87
|
+
autoload :TextArrayFinder
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
65
91
|
class << self
|
66
92
|
def config
|
67
93
|
yield Config.instance if block_given?
|
@@ -69,5 +95,7 @@ module ActiveFields
|
|
69
95
|
end
|
70
96
|
|
71
97
|
alias_method :configure, :config
|
98
|
+
|
99
|
+
def registry = Registry.instance
|
72
100
|
end
|
73
101
|
end
|
@@ -17,6 +17,15 @@ module ActiveFields
|
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
20
|
+
def insert_into_application_controller
|
21
|
+
inject_into_class "app/controllers/application_controller.rb", "ApplicationController" do
|
22
|
+
optimize_indentation(<<~CODE, 2)
|
23
|
+
include ActiveFieldsControllerConcern
|
24
|
+
helper ActiveFieldsHelper
|
25
|
+
CODE
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
20
29
|
def add_routes
|
21
30
|
route "resources :active_fields"
|
22
31
|
end
|
data/lib/generators/active_fields/scaffold/templates/controllers/active_fields_controller.rb
CHANGED
@@ -1,8 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
class ActiveFieldsController < ApplicationController
|
4
|
-
helper ActiveFieldsHelper
|
5
|
-
|
6
4
|
before_action :set_active_field, only: %i[show edit update destroy]
|
7
5
|
|
8
6
|
def index
|
@@ -59,14 +57,6 @@ class ActiveFieldsController < ApplicationController
|
|
59
57
|
end
|
60
58
|
end
|
61
59
|
|
62
|
-
def compact_array_param(value)
|
63
|
-
if value.first == ""
|
64
|
-
value[1..-1]
|
65
|
-
else
|
66
|
-
value
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
60
|
# It is strongly recommended to move it to, for example, policies.
|
71
61
|
def permitted_attributes_for_create(model_class)
|
72
62
|
if model_class == ActiveFields::Field::Boolean
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ActiveFieldsControllerConcern
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
included do
|
7
|
+
helper_method :active_fields_finders_params
|
8
|
+
end
|
9
|
+
|
10
|
+
def active_fields_finders_params
|
11
|
+
@active_fields_finders_params ||=
|
12
|
+
params.permit(
|
13
|
+
f: [
|
14
|
+
:n,
|
15
|
+
:name,
|
16
|
+
:op,
|
17
|
+
:operator,
|
18
|
+
:v,
|
19
|
+
:value,
|
20
|
+
v: [],
|
21
|
+
value: [],
|
22
|
+
],
|
23
|
+
)[:f] || {}
|
24
|
+
end
|
25
|
+
|
26
|
+
def compact_array_param(value)
|
27
|
+
if value.first == ""
|
28
|
+
value[1..-1]
|
29
|
+
else
|
30
|
+
value
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -1,6 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module ActiveFieldsHelper
|
4
|
+
ARRAY_SIZE_OPERATIONS = %i[size_eq size_not_eq size_gt size_gteq size_lt size_lteq].freeze
|
5
|
+
private_constant :ARRAY_SIZE_OPERATIONS
|
6
|
+
|
4
7
|
def render_array_field(form:, name:, value:, field_method:, field_opts: {})
|
5
8
|
render partial: "shared/array_field", locals: {
|
6
9
|
form: form,
|
@@ -23,6 +26,70 @@ module ActiveFieldsHelper
|
|
23
26
|
render partial: partial, locals: { form: form, active_value: active_value, active_field: active_value.active_field }
|
24
27
|
end
|
25
28
|
|
29
|
+
def render_active_fields_finders_form(active_fields:, url:)
|
30
|
+
render partial: "active_fields/finders/form", locals: { active_fields: active_fields, url: url }
|
31
|
+
end
|
32
|
+
|
33
|
+
def active_field_finder_input_types(active_field:)
|
34
|
+
return [] if active_field.value_finder_class.nil?
|
35
|
+
|
36
|
+
types = [active_field.type_name]
|
37
|
+
types += [:array_size] if active_field.value_finder_class.operations.intersect?(ARRAY_SIZE_OPERATIONS)
|
38
|
+
|
39
|
+
types
|
40
|
+
end
|
41
|
+
|
42
|
+
def render_active_field_finder_input(form:, type:, active_field:, template: false, selected: {})
|
43
|
+
if type == :array_size
|
44
|
+
operations = active_field.value_finder_class.operations & ARRAY_SIZE_OPERATIONS
|
45
|
+
partial = "active_fields/finders/inputs/array_size"
|
46
|
+
else
|
47
|
+
operations = active_field.value_finder_class.operations - ARRAY_SIZE_OPERATIONS
|
48
|
+
partial = "active_fields/finders/inputs/#{type}"
|
49
|
+
end
|
50
|
+
|
51
|
+
render partial: partial, locals: {
|
52
|
+
form: form,
|
53
|
+
active_field: active_field,
|
54
|
+
operations: operations,
|
55
|
+
template: template,
|
56
|
+
selected: selected,
|
57
|
+
}
|
58
|
+
end
|
59
|
+
|
60
|
+
def render_selected_active_field_finder_input(form:, active_fields:, finder_params:)
|
61
|
+
active_field_name = finder_params[:n] || finder_params[:name]
|
62
|
+
active_field = active_fields.find { |active_field| active_field.name == active_field_name }
|
63
|
+
return if active_field&.value_finder_class.nil?
|
64
|
+
|
65
|
+
op = (finder_params[:op] || finder_params[:operator])&.to_sym
|
66
|
+
if active_field.value_finder_class.operations.include?(op)
|
67
|
+
operation = op
|
68
|
+
operator = active_field.value_finder_class.operator_for(op)
|
69
|
+
else
|
70
|
+
operation = active_field.value_finder_class.operation_for(op)
|
71
|
+
operator = op
|
72
|
+
end
|
73
|
+
return if operation.nil? || operator.nil?
|
74
|
+
|
75
|
+
value = finder_params[:v] || finder_params[:value]
|
76
|
+
|
77
|
+
type =
|
78
|
+
if ARRAY_SIZE_OPERATIONS.include?(operation)
|
79
|
+
:array_size
|
80
|
+
else
|
81
|
+
active_field.type_name
|
82
|
+
end
|
83
|
+
|
84
|
+
render_active_field_finder_input(
|
85
|
+
form: form,
|
86
|
+
type: type,
|
87
|
+
active_field: active_field,
|
88
|
+
template: false,
|
89
|
+
selected: { operation: operation, operator: operator, value: value },
|
90
|
+
)
|
91
|
+
end
|
92
|
+
|
26
93
|
def active_field_form(active_field)
|
27
94
|
"active_fields/forms/#{active_field.type_name}"
|
28
95
|
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
import { Controller } from "@hotwired/stimulus"
|
2
|
+
|
3
|
+
export default class extends Controller {
|
4
|
+
static targets = [
|
5
|
+
"inputTemplatesContainer",
|
6
|
+
"inputTemplate",
|
7
|
+
"inputsContainer",
|
8
|
+
"input",
|
9
|
+
]
|
10
|
+
|
11
|
+
connect() {
|
12
|
+
this.inputTemplatesContainerTarget.style.display = "none"
|
13
|
+
}
|
14
|
+
|
15
|
+
addInput(e) {
|
16
|
+
e.preventDefault()
|
17
|
+
|
18
|
+
const selectedOption = e.target.options[e.target.selectedIndex]
|
19
|
+
const selectedName = selectedOption.dataset.activeFieldName
|
20
|
+
const selectedType = selectedOption.value
|
21
|
+
|
22
|
+
if (!selectedName || !selectedType) { return }
|
23
|
+
|
24
|
+
const templateInput = this.inputTemplateTargets.find((templateInput) => {
|
25
|
+
return templateInput.dataset.activeFieldName === selectedName && templateInput.dataset.type === selectedType
|
26
|
+
})
|
27
|
+
|
28
|
+
let newInput = templateInput.cloneNode(true)
|
29
|
+
newInput.dataset.activeFieldsFindersFormTarget = "input"
|
30
|
+
this.#setInputIndex(newInput)
|
31
|
+
|
32
|
+
this.inputsContainerTarget.append(newInput)
|
33
|
+
|
34
|
+
e.target.value = ""
|
35
|
+
}
|
36
|
+
|
37
|
+
removeInput(e) {
|
38
|
+
e.preventDefault()
|
39
|
+
|
40
|
+
e.target.parentElement.remove()
|
41
|
+
}
|
42
|
+
|
43
|
+
#getLastIndex() {
|
44
|
+
if (this.inputTargets.length === 0) { return -1 }
|
45
|
+
|
46
|
+
return Math.max(...this.inputTargets.map((input) => +input.dataset.index))
|
47
|
+
}
|
48
|
+
|
49
|
+
#setInputIndex(input) {
|
50
|
+
const newIndex = this.#getLastIndex() + 1
|
51
|
+
|
52
|
+
input.dataset.index = newIndex.toString()
|
53
|
+
Array.from(input.children).forEach((element) => {
|
54
|
+
if (element.hasAttribute("name") && element.name.includes("[0]")) {
|
55
|
+
element.name = element.name.replace("[0]", `[${newIndex}]`)
|
56
|
+
}
|
57
|
+
})
|
58
|
+
}
|
59
|
+
}
|
data/lib/generators/active_fields/scaffold/templates/views/active_fields/finders/_form.html.erb
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
<div data-controller="active-fields-finders-form">
|
2
|
+
<% selector_options = [["-", [["< Add filter >", ""]]]] + active_fields.map do |active_field|
|
3
|
+
[
|
4
|
+
active_field.name,
|
5
|
+
active_field_finder_input_types(active_field: active_field).map do |type|
|
6
|
+
[
|
7
|
+
"#{active_field.name} [#{type}]",
|
8
|
+
type,
|
9
|
+
{ data: { "active-field-name": active_field.name } },
|
10
|
+
]
|
11
|
+
end
|
12
|
+
]
|
13
|
+
end
|
14
|
+
%>
|
15
|
+
<%= select_tag :selector,
|
16
|
+
grouped_options_for_select(selector_options),
|
17
|
+
data: { "active-fields-finders-form-target": "selector", action: "change->active-fields-finders-form#addInput" }
|
18
|
+
%>
|
19
|
+
|
20
|
+
<div data-active-fields-finders-form-target="inputTemplatesContainer" style="display: none;">
|
21
|
+
<% active_fields.each do |active_field| %>
|
22
|
+
<%= fields_for :f, nil, index: 0 do |ff| %>
|
23
|
+
<% active_field_finder_input_types(active_field: active_field).each do |type| %>
|
24
|
+
<%= render_active_field_finder_input(form: ff, type: type, active_field: active_field, template: true) %>
|
25
|
+
<% end %>
|
26
|
+
<% end %>
|
27
|
+
<% end %>
|
28
|
+
</div>
|
29
|
+
|
30
|
+
<%= form_with(url: url, method: :get) do |f| %>
|
31
|
+
<div data-active-fields-finders-form-target="inputsContainer">
|
32
|
+
<% active_fields_finders_params.each do |index, finder_params| %>
|
33
|
+
<%= fields_for :f, nil, index: index do |ff| %>
|
34
|
+
<%= render_selected_active_field_finder_input(form: ff, active_fields: active_fields, finder_params: finder_params) %>
|
35
|
+
<% end %>
|
36
|
+
<% end %>
|
37
|
+
</div>
|
38
|
+
|
39
|
+
<%= f.submit "Filter" %>
|
40
|
+
<%= link_to "Reset", url %>
|
41
|
+
<% end %>
|
42
|
+
</div>
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<div
|
2
|
+
data-active-fields-finders-form-target="<%= template ? "inputTemplate" : "input" %>"
|
3
|
+
data-type="array_size"
|
4
|
+
data-active-field-name="<%= active_field.name %>"
|
5
|
+
data-index="<%= form.index %>"
|
6
|
+
>
|
7
|
+
<%= form.label :n, active_field.name, for: nil %>
|
8
|
+
<%= form.hidden_field :n, value: active_field.name, id: nil %>
|
9
|
+
<%= form.select :op,
|
10
|
+
operations.map { |operation_name| [operation_name, active_field.value_finder_class.operator_for(operation_name)] },
|
11
|
+
{ selected: selected[:operator] },
|
12
|
+
{ id: nil }
|
13
|
+
%>
|
14
|
+
<%= form.number_field :v, { value: selected[:value], min: 0, max: active_field.max_size, id: nil } %>
|
15
|
+
<%= button_tag "Remove", type: "button", data: { action: "click->active-fields-finders-form#removeInput" } %>
|
16
|
+
</div>
|
@@ -0,0 +1,21 @@
|
|
1
|
+
<div
|
2
|
+
data-active-fields-finders-form-target="<%= template ? "inputTemplate" : "input" %>"
|
3
|
+
data-type="<%= active_field.type_name %>"
|
4
|
+
data-active-field-name="<%= active_field.name %>"
|
5
|
+
data-index="<%= form.index %>"
|
6
|
+
>
|
7
|
+
<%= form.label :n, active_field.name, for: nil %>
|
8
|
+
<%= form.hidden_field :n, value: active_field.name, id: nil %>
|
9
|
+
<%= form.select :op,
|
10
|
+
operations.map { |operation_name| [operation_name, active_field.value_finder_class.operator_for(operation_name)] },
|
11
|
+
{ selected: selected[:operator] },
|
12
|
+
{ id: nil }
|
13
|
+
%>
|
14
|
+
<% if active_field.nullable? %>
|
15
|
+
<% values = { "True" => "true", "False" => "false", "Null" => "" } %>
|
16
|
+
<% else %>
|
17
|
+
<% values = { "True" => "true", "False" => "false" } %>
|
18
|
+
<% end %>
|
19
|
+
<%= form.select :v, values, { selected: selected[:value] }, { id: nil } %>
|
20
|
+
<%= button_tag "Remove", type: "button", data: { action: "click->active-fields-finders-form#removeInput" } %>
|
21
|
+
</div>
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<div
|
2
|
+
data-active-fields-finders-form-target="<%= template ? "inputTemplate" : "input" %>"
|
3
|
+
data-type="<%= active_field.type_name %>"
|
4
|
+
data-active-field-name="<%= active_field.name %>"
|
5
|
+
data-index="<%= form.index %>"
|
6
|
+
>
|
7
|
+
<%= form.label :n, active_field.name, for: nil %>
|
8
|
+
<%= form.hidden_field :n, value: active_field.name, id: nil %>
|
9
|
+
<%= form.select :op,
|
10
|
+
operations.map { |operation_name| [operation_name, active_field.value_finder_class.operator_for(operation_name)] },
|
11
|
+
{ selected: selected[:operator] },
|
12
|
+
{ id: nil }
|
13
|
+
%>
|
14
|
+
<%= form.date_field :v, { value: selected[:value], min: active_field.min, max: active_field.max, id: nil } %>
|
15
|
+
<%= button_tag "Remove", type: "button", data: { action: "click->active-fields-finders-form#removeInput" } %>
|
16
|
+
</div>
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<div
|
2
|
+
data-active-fields-finders-form-target="<%= template ? "inputTemplate" : "input" %>"
|
3
|
+
data-type="<%= active_field.type_name %>"
|
4
|
+
data-active-field-name="<%= active_field.name %>"
|
5
|
+
data-index="<%= form.index %>"
|
6
|
+
>
|
7
|
+
<%= form.label :n, active_field.name, for: nil %>
|
8
|
+
<%= form.hidden_field :n, value: active_field.name, id: nil %>
|
9
|
+
<%= form.select :op,
|
10
|
+
operations.map { |operation_name| [operation_name, active_field.value_finder_class.operator_for(operation_name)] },
|
11
|
+
{ selected: selected[:operator] },
|
12
|
+
{ id: nil }
|
13
|
+
%>
|
14
|
+
<%= form.date_field :v, { value: selected[:value], min: active_field.min, max: active_field.max, id: nil } %>
|
15
|
+
<%= button_tag "Remove", type: "button", data: { action: "click->active-fields-finders-form#removeInput" } %>
|
16
|
+
</div>
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<div
|
2
|
+
data-active-fields-finders-form-target="<%= template ? "inputTemplate" : "input" %>"
|
3
|
+
data-type="<%= active_field.type_name %>"
|
4
|
+
data-active-field-name="<%= active_field.name %>"
|
5
|
+
data-index="<%= form.index %>"
|
6
|
+
>
|
7
|
+
<%= form.label :n, active_field.name, for: nil %>
|
8
|
+
<%= form.hidden_field :n, value: active_field.name, id: nil %>
|
9
|
+
<%= form.select :op,
|
10
|
+
operations.map { |operation_name| [operation_name, active_field.value_finder_class.operator_for(operation_name)] },
|
11
|
+
{ selected: selected[:operator] },
|
12
|
+
{ id: nil }
|
13
|
+
%>
|
14
|
+
<%= form.datetime_field :v, { value: selected[:value], min: active_field.min, max: active_field.max, id: nil } %>
|
15
|
+
<%= button_tag "Remove", type: "button", data: { action: "click->active-fields-finders-form#removeInput" } %>
|
16
|
+
</div>
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<div
|
2
|
+
data-active-fields-finders-form-target="<%= template ? "inputTemplate" : "input" %>"
|
3
|
+
data-type="<%= active_field.type_name %>"
|
4
|
+
data-active-field-name="<%= active_field.name %>"
|
5
|
+
data-index="<%= form.index %>"
|
6
|
+
>
|
7
|
+
<%= form.label :n, active_field.name, for: nil %>
|
8
|
+
<%= form.hidden_field :n, value: active_field.name, id: nil %>
|
9
|
+
<%= form.select :op,
|
10
|
+
operations.map { |operation_name| [operation_name, active_field.value_finder_class.operator_for(operation_name)] },
|
11
|
+
{ selected: selected[:operator] },
|
12
|
+
{ id: nil }
|
13
|
+
%>
|
14
|
+
<%= form.datetime_field :v, { value: selected[:value], min: active_field.min, max: active_field.max, id: nil } %>
|
15
|
+
<%= button_tag "Remove", type: "button", data: { action: "click->active-fields-finders-form#removeInput" } %>
|
16
|
+
</div>
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<div
|
2
|
+
data-active-fields-finders-form-target="<%= template ? "inputTemplate" : "input" %>"
|
3
|
+
data-type="<%= active_field.type_name %>"
|
4
|
+
data-active-field-name="<%= active_field.name %>"
|
5
|
+
data-index="<%= form.index %>"
|
6
|
+
>
|
7
|
+
<%= form.label :n, active_field.name, for: nil %>
|
8
|
+
<%= form.hidden_field :n, value: active_field.name, id: nil %>
|
9
|
+
<%= form.select :op,
|
10
|
+
operations.map { |operation_name| [operation_name, active_field.value_finder_class.operator_for(operation_name)] },
|
11
|
+
{ selected: selected[:operator] },
|
12
|
+
{ id: nil }
|
13
|
+
%>
|
14
|
+
<%= form.number_field :v, { value: selected[:value], min: active_field.min, max: active_field.max, step: "any", id: nil } %>
|
15
|
+
<%= button_tag "Remove", type: "button", data: { action: "click->active-fields-finders-form#removeInput" } %>
|
16
|
+
</div>
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<div
|
2
|
+
data-active-fields-finders-form-target="<%= template ? "inputTemplate" : "input" %>"
|
3
|
+
data-type="<%= active_field.type_name %>"
|
4
|
+
data-active-field-name="<%= active_field.name %>"
|
5
|
+
data-index="<%= form.index %>"
|
6
|
+
>
|
7
|
+
<%= form.label :n, active_field.name, for: nil %>
|
8
|
+
<%= form.hidden_field :n, value: active_field.name, id: nil %>
|
9
|
+
<%= form.select :op,
|
10
|
+
operations.map { |operation_name| [operation_name, active_field.value_finder_class.operator_for(operation_name)] },
|
11
|
+
{ selected: selected[:operator] },
|
12
|
+
{ id: nil }
|
13
|
+
%>
|
14
|
+
<%= form.number_field :v, { value: selected[:value], min: active_field.min, max: active_field.max, step: "any", id: nil } %>
|
15
|
+
<%= button_tag "Remove", type: "button", data: { action: "click->active-fields-finders-form#removeInput" } %>
|
16
|
+
</div>
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<div
|
2
|
+
data-active-fields-finders-form-target="<%= template ? "inputTemplate" : "input" %>"
|
3
|
+
data-type="<%= active_field.type_name %>"
|
4
|
+
data-active-field-name="<%= active_field.name %>"
|
5
|
+
data-index="<%= form.index %>"
|
6
|
+
>
|
7
|
+
<%= form.label :n, active_field.name, for: nil %>
|
8
|
+
<%= form.hidden_field :n, value: active_field.name, id: nil %>
|
9
|
+
<%= form.select :op,
|
10
|
+
operations.map { |operation_name| [operation_name, active_field.value_finder_class.operator_for(operation_name)] },
|
11
|
+
{ selected: selected[:operator] },
|
12
|
+
{ id: nil }
|
13
|
+
%>
|
14
|
+
<%= form.select :v, active_field.allowed_values, { selected: selected[:value], include_blank: true }, { id: nil } %>
|
15
|
+
<%= button_tag "Remove", type: "button", data: { action: "click->active-fields-finders-form#removeInput" } %>
|
16
|
+
</div>
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<div
|
2
|
+
data-active-fields-finders-form-target="<%= template ? "inputTemplate" : "input" %>"
|
3
|
+
data-type="<%= active_field.type_name %>"
|
4
|
+
data-active-field-name="<%= active_field.name %>"
|
5
|
+
data-index="<%= form.index %>"
|
6
|
+
>
|
7
|
+
<%= form.label :n, active_field.name, for: nil %>
|
8
|
+
<%= form.hidden_field :n, value: active_field.name, id: nil %>
|
9
|
+
<%= form.select :op,
|
10
|
+
operations.map { |operation_name| [operation_name, active_field.value_finder_class.operator_for(operation_name)] },
|
11
|
+
{ selected: selected[:operator] },
|
12
|
+
{ id: nil }
|
13
|
+
%>
|
14
|
+
<%= form.select :v, active_field.allowed_values, { selected: selected[:value], include_blank: true }, { id: nil } %>
|
15
|
+
<%= button_tag "Remove", type: "button", data: { action: "click->active-fields-finders-form#removeInput" } %>
|
16
|
+
</div>
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<div
|
2
|
+
data-active-fields-finders-form-target="<%= template ? "inputTemplate" : "input" %>"
|
3
|
+
data-type="<%= active_field.type_name %>"
|
4
|
+
data-active-field-name="<%= active_field.name %>"
|
5
|
+
data-index="<%= form.index %>"
|
6
|
+
>
|
7
|
+
<%= form.label :n, active_field.name, for: nil %>
|
8
|
+
<%= form.hidden_field :n, value: active_field.name, id: nil %>
|
9
|
+
<%= form.select :op,
|
10
|
+
operations.map { |operation_name| [operation_name, active_field.value_finder_class.operator_for(operation_name)] },
|
11
|
+
{ selected: selected[:operator] },
|
12
|
+
{ id: nil }
|
13
|
+
%>
|
14
|
+
<%= form.number_field :v, { value: selected[:value], min: active_field.min, max: active_field.max, id: nil } %>
|
15
|
+
<%= button_tag "Remove", type: "button", data: { action: "click->active-fields-finders-form#removeInput" } %>
|
16
|
+
</div>
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<div
|
2
|
+
data-active-fields-finders-form-target="<%= template ? "inputTemplate" : "input" %>"
|
3
|
+
data-type="<%= active_field.type_name %>"
|
4
|
+
data-active-field-name="<%= active_field.name %>"
|
5
|
+
data-index="<%= form.index %>"
|
6
|
+
>
|
7
|
+
<%= form.label :n, active_field.name, for: nil %>
|
8
|
+
<%= form.hidden_field :n, value: active_field.name, id: nil %>
|
9
|
+
<%= form.select :op,
|
10
|
+
operations.map { |operation_name| [operation_name, active_field.value_finder_class.operator_for(operation_name)] },
|
11
|
+
{ selected: selected[:operator] },
|
12
|
+
{ id: nil }
|
13
|
+
%>
|
14
|
+
<%= form.number_field :v, { value: selected[:value], min: active_field.min, max: active_field.max, id: nil } %>
|
15
|
+
<%= button_tag "Remove", type: "button", data: { action: "click->active-fields-finders-form#removeInput" } %>
|
16
|
+
</div>
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<div
|
2
|
+
data-active-fields-finders-form-target="<%= template ? "inputTemplate" : "input" %>"
|
3
|
+
data-type="<%= active_field.type_name %>"
|
4
|
+
data-active-field-name="<%= active_field.name %>"
|
5
|
+
data-index="<%= form.index %>"
|
6
|
+
>
|
7
|
+
<%= form.label :n, active_field.name, for: nil %>
|
8
|
+
<%= form.hidden_field :n, value: active_field.name, id: nil %>
|
9
|
+
<%= form.select :op,
|
10
|
+
operations.map { |operation_name| [operation_name, active_field.value_finder_class.operator_for(operation_name)] },
|
11
|
+
{ selected: selected[:operator] },
|
12
|
+
{ id: nil }
|
13
|
+
%>
|
14
|
+
<%= form.text_field :v, { value: selected[:value], maxlength: active_field.max_length, id: nil } %>
|
15
|
+
<%= button_tag "Remove", type: "button", data: { action: "click->active-fields-finders-form#removeInput" } %>
|
16
|
+
</div>
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<div
|
2
|
+
data-active-fields-finders-form-target="<%= template ? "inputTemplate" : "input" %>"
|
3
|
+
data-type="<%= active_field.type_name %>"
|
4
|
+
data-active-field-name="<%= active_field.name %>"
|
5
|
+
data-index="<%= form.index %>"
|
6
|
+
>
|
7
|
+
<%= form.label :n, active_field.name, for: nil %>
|
8
|
+
<%= form.hidden_field :n, value: active_field.name, id: nil %>
|
9
|
+
<%= form.select :op,
|
10
|
+
operations.map { |operation_name| [operation_name, active_field.value_finder_class.operator_for(operation_name)] },
|
11
|
+
{ selected: selected[:operator] },
|
12
|
+
{ id: nil }
|
13
|
+
%>
|
14
|
+
<%= form.text_field :v, { value: selected[:value], maxlength: active_field.max_length, id: nil } %>
|
15
|
+
<%= button_tag "Remove", type: "button", data: { action: "click->active-fields-finders-form#removeInput" } %>
|
16
|
+
</div>
|
data/lib/generators/active_fields/scaffold/templates/views/active_fields/forms/_boolean.html.erb
CHANGED
@@ -24,7 +24,7 @@
|
|
24
24
|
|
25
25
|
<div>
|
26
26
|
<%= f.label :customizable_type %>
|
27
|
-
<%= f.select :customizable_type,
|
27
|
+
<%= f.select :customizable_type, active_field.available_customizable_types, {}, { disabled: active_field.persisted? } %>
|
28
28
|
</div>
|
29
29
|
|
30
30
|
<div>
|
data/lib/generators/active_fields/scaffold/templates/views/active_fields/forms/_date.html.erb
CHANGED
@@ -24,7 +24,7 @@
|
|
24
24
|
|
25
25
|
<div>
|
26
26
|
<%= f.label :customizable_type %>
|
27
|
-
<%= f.select :customizable_type,
|
27
|
+
<%= f.select :customizable_type, active_field.available_customizable_types, {}, { disabled: active_field.persisted? } %>
|
28
28
|
</div>
|
29
29
|
|
30
30
|
<div>
|
data/lib/generators/active_fields/scaffold/templates/views/active_fields/forms/_date_array.html.erb
CHANGED
@@ -24,7 +24,7 @@
|
|
24
24
|
|
25
25
|
<div>
|
26
26
|
<%= f.label :customizable_type %>
|
27
|
-
<%= f.select :customizable_type,
|
27
|
+
<%= f.select :customizable_type, active_field.available_customizable_types, {}, { disabled: active_field.persisted? } %>
|
28
28
|
</div>
|
29
29
|
|
30
30
|
<div>
|