binda 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +3 -3
- data/app/assets/javascripts/binda/components/{form_item_choice.js → field_setting_choices.js} +13 -12
- data/app/assets/javascripts/binda/components/form_item_repeater.js +34 -30
- data/app/assets/javascripts/binda/components/login_form.js +15 -15
- data/app/assets/javascripts/binda/components/sortable.js +22 -20
- data/app/assets/javascripts/binda/dist/binda.bundle.js +154 -140
- data/app/assets/javascripts/binda/index.js +20 -20
- data/app/assets/stylesheets/binda/components/field_setting_choices.scss +90 -0
- data/app/assets/stylesheets/binda/components/form_item.scss +0 -50
- data/app/assets/stylesheets/binda/components/{form_item_choice.scss → form_item_choices.scss} +1 -7
- data/app/assets/stylesheets/binda/components/main_sortable_table.scss +68 -0
- data/app/assets/stylesheets/binda/components/main_table.scss +2 -5
- data/app/assets/stylesheets/binda/components/sortable.scss +1 -2
- data/app/assets/stylesheets/binda/components/standard-form.scss +5 -6
- data/app/assets/stylesheets/binda/index.scss +3 -1
- data/app/controllers/binda/field_groups_controller.rb +22 -75
- data/app/controllers/binda/manage/users_controller.rb +18 -13
- data/app/controllers/binda/structures_controller.rb +12 -11
- data/app/models/binda/choice.rb +10 -5
- data/app/models/binda/field_setting.rb +16 -6
- data/app/models/concerns/binda/fieldable_associations.rb +24 -12
- data/app/views/binda/components/sort_index.html.erb +21 -25
- data/app/views/binda/field_groups/_form_body.html.erb +5 -5
- data/app/views/binda/field_groups/_form_item_choice.erb +49 -66
- data/app/views/binda/structures/_form_section.html.erb +1 -1
- data/app/views/binda/structures/index.html.erb +2 -2
- data/app/views/binda/structures/sort_index.html.erb +28 -21
- data/config/locales/en.yml +7 -5
- data/lib/binda/version.rb +1 -1
- metadata +6 -4
@@ -2,8 +2,10 @@
|
|
2
2
|
{
|
3
3
|
table
|
4
4
|
{
|
5
|
+
display: table;
|
5
6
|
width: 100%;
|
6
7
|
background-color: $color-gray-lightest;
|
8
|
+
box-sizing: border-box;
|
7
9
|
|
8
10
|
th
|
9
11
|
{
|
@@ -48,11 +50,6 @@
|
|
48
50
|
{
|
49
51
|
border-bottom: 1px solid $color-gray-darker;
|
50
52
|
}
|
51
|
-
|
52
|
-
tr.ui-sortable-handle:hover
|
53
|
-
{
|
54
|
-
border: 1px solid transparent;
|
55
|
-
}
|
56
53
|
}
|
57
54
|
|
58
55
|
.prev
|
@@ -16,6 +16,7 @@ ul#sortable
|
|
16
16
|
transition: box-shadow .3s ease, transform .3s ease;
|
17
17
|
box-shadow: 0 0 0 0 rgba(0,0,0,.25);
|
18
18
|
|
19
|
+
|
19
20
|
img
|
20
21
|
{
|
21
22
|
width: auto;
|
@@ -74,8 +75,6 @@ tbody.sortable
|
|
74
75
|
tr
|
75
76
|
{
|
76
77
|
transition: box-shadow .3s ease, transform .3s ease;
|
77
|
-
margin-bottom: 8px;
|
78
|
-
padding-bottom: 8px;
|
79
78
|
|
80
79
|
img
|
81
80
|
{
|
@@ -39,12 +39,7 @@
|
|
39
39
|
border-right: none !important;
|
40
40
|
border-left: none !important;
|
41
41
|
}
|
42
|
-
|
43
|
-
&.table-sort
|
44
|
-
{
|
45
|
-
border: none !important;
|
46
|
-
}
|
47
|
-
|
42
|
+
|
48
43
|
.control-label
|
49
44
|
{
|
50
45
|
font-weight: bold;
|
@@ -210,4 +205,8 @@
|
|
210
205
|
.standard-form--hint-on-new-record
|
211
206
|
{
|
212
207
|
padding: 12px;
|
208
|
+
}
|
209
|
+
|
210
|
+
.standard-form--choices-header {
|
211
|
+
|
213
212
|
}
|
@@ -19,7 +19,7 @@
|
|
19
19
|
@import "components/login";
|
20
20
|
@import "components/standard-form";
|
21
21
|
@import "components/form_item";
|
22
|
-
@import "components/
|
22
|
+
@import "components/form_item_choices";
|
23
23
|
@import "components/form_item_image";
|
24
24
|
@import "components/form_item_video";
|
25
25
|
@import "components/sortable";
|
@@ -28,6 +28,8 @@
|
|
28
28
|
@import "components/select2";
|
29
29
|
@import "components/texts";
|
30
30
|
@import "components/popup_warning";
|
31
|
+
@import "components/main_sortable_table";
|
32
|
+
@import "components/field_setting_choices";
|
31
33
|
|
32
34
|
// Controllers
|
33
35
|
@import "controllers/components_index";
|
@@ -35,7 +35,7 @@ module Binda
|
|
35
35
|
# Add nested classes
|
36
36
|
add_new_field_settings
|
37
37
|
add_new_choices
|
38
|
-
|
38
|
+
check_if_needs_to_update_choices
|
39
39
|
|
40
40
|
# Update the other ones
|
41
41
|
if @field_group.update(field_group_params)
|
@@ -64,63 +64,11 @@ module Binda
|
|
64
64
|
|
65
65
|
# Only allow a trusted parameter "white list" through.
|
66
66
|
def field_group_params
|
67
|
-
params.require(:field_group).permit(
|
68
|
-
:name,
|
69
|
-
:slug,
|
70
|
-
:description,
|
71
|
-
:position,
|
72
|
-
:layout,
|
73
|
-
:structure_id,
|
74
|
-
field_settings_attributes:
|
75
|
-
[ :id,
|
76
|
-
:field_group_id,
|
77
|
-
:field_setting_id,
|
78
|
-
:name,
|
79
|
-
:slug,
|
80
|
-
:description,
|
81
|
-
:field_type,
|
82
|
-
:position,
|
83
|
-
:required,
|
84
|
-
:default_text,
|
85
|
-
:ancestry,
|
86
|
-
:default_choice_id,
|
87
|
-
:allow_null,
|
88
|
-
accepted_structure_ids: [],
|
89
|
-
choices: [],
|
90
|
-
choices_attributes:
|
91
|
-
[ :id,
|
92
|
-
:field_setting_id,
|
93
|
-
:label,
|
94
|
-
:value
|
95
|
-
]
|
96
|
-
]
|
97
|
-
)
|
67
|
+
params.require(:field_group).permit(:name, :slug, :description, :position, :layout, :structure_id, field_settings_attributes: [ :id, :field_group_id, :field_setting_id, :name, :slug, :description, :field_type, :position, :required, :default_text, :ancestry, :default_choice_id, :allow_null, accepted_structure_ids: [], choices: [], choices_attributes: [ :id, :field_setting_id, :label, :value ]])
|
98
68
|
end
|
99
69
|
|
100
70
|
def new_params
|
101
|
-
params.require(:field_group).permit(
|
102
|
-
new_field_settings:
|
103
|
-
[ :id,
|
104
|
-
:field_group_id,
|
105
|
-
:field_setting_id,
|
106
|
-
:name,
|
107
|
-
:slug,
|
108
|
-
:description,
|
109
|
-
:field_type,
|
110
|
-
:position,
|
111
|
-
:required,
|
112
|
-
:ancestry,
|
113
|
-
:default_choice_id,
|
114
|
-
:allow_null,
|
115
|
-
choices: []
|
116
|
-
],
|
117
|
-
new_choices:
|
118
|
-
[ :id,
|
119
|
-
:field_setting_id,
|
120
|
-
:label,
|
121
|
-
:value
|
122
|
-
]
|
123
|
-
)
|
71
|
+
params.require(:field_group).permit( new_field_settings: [ :id, :field_group_id, :field_setting_id, :name, :slug, :description, :field_type, :position, :required, :ancestry, :default_choice_id, :allow_null, choices: [] ],new_choices: [ :id, :field_setting_id, :label, :value ])
|
124
72
|
end
|
125
73
|
|
126
74
|
def reset_field_settings_cache
|
@@ -130,24 +78,20 @@ module Binda
|
|
130
78
|
def add_new_field_settings
|
131
79
|
# Create new fields if any
|
132
80
|
new_params[:new_field_settings].each do |field_setting|
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
end
|
138
|
-
end
|
81
|
+
next if field_setting[:name].blank?
|
82
|
+
new_field_setting = @field_group.field_settings.create( field_setting )
|
83
|
+
next if new_field_setting
|
84
|
+
return redirect_to edit_structure_field_group_path( @structure.slug, @field_group.slug ), flash: { error: new_field_setting.errors }
|
139
85
|
end
|
140
86
|
end
|
141
87
|
|
142
88
|
def add_new_choices
|
143
89
|
# Create new fields if any
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
end
|
150
|
-
end
|
90
|
+
return if new_params[:new_choices].nil?
|
91
|
+
new_params[:new_choices].each do |choice|
|
92
|
+
next if choice[:label].blank? || choice[:value].blank?
|
93
|
+
create_new_choice choice
|
94
|
+
end
|
151
95
|
end
|
152
96
|
|
153
97
|
# Create new choice (depends directly from add_new_choice method)
|
@@ -158,18 +102,21 @@ module Binda
|
|
158
102
|
end
|
159
103
|
end
|
160
104
|
|
161
|
-
def
|
105
|
+
def check_if_needs_to_update_choices
|
162
106
|
return if field_group_params[:field_settings_attributes].nil?
|
163
107
|
field_group_params[:field_settings_attributes].each do |_, field_setting_params|
|
164
108
|
next if field_setting_params[:choices_attributes].nil?
|
165
|
-
field_setting_params
|
166
|
-
choice = Choice.find(choice_params[:id])
|
167
|
-
unless choice.update(choice_params)
|
168
|
-
return redirect_to edit_structure_field_group_path( @structure.slug, @field_group.slug ), flash: { error: choice.errors }
|
169
|
-
end
|
170
|
-
end
|
109
|
+
update_field_setting_choices field_setting_params
|
171
110
|
end
|
172
111
|
end
|
173
112
|
|
113
|
+
def update_field_setting_choices field_setting_params
|
114
|
+
field_setting_params[:choices_attributes].each do |_, choice_params|
|
115
|
+
choice = Choice.find(choice_params[:id])
|
116
|
+
unless choice.update(choice_params)
|
117
|
+
return redirect_to edit_structure_field_group_path( @structure.slug, @field_group.slug ), flash: { error: choice.errors }
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
174
121
|
end
|
175
122
|
end
|
@@ -36,19 +36,18 @@ module Binda
|
|
36
36
|
end
|
37
37
|
|
38
38
|
def update
|
39
|
-
if
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
end
|
39
|
+
# Check if the user to be updated is superadmin and the user which is updating is superadmin
|
40
|
+
check_if_superadmin
|
41
|
+
|
42
|
+
respond_to do |format|
|
43
|
+
if @user.update(user_params)
|
44
|
+
format.html { redirect_to manage_user_path( @user.id ), notice: 'User was successfully updated.' }
|
45
|
+
format.xml { head :ok }
|
46
|
+
format.json { render :show, status: :ok, location: @user }
|
47
|
+
else
|
48
|
+
format.html { redirect_to edit_manage_user_path( @user.id ), flash: { alert: @user.errors } }
|
49
|
+
format.xml { head :bad_request }
|
50
|
+
format.json { render json: @user.errors, status: :unprocessable_entity }
|
52
51
|
end
|
53
52
|
end
|
54
53
|
end
|
@@ -86,5 +85,11 @@ module Binda
|
|
86
85
|
params[:user].delete(:password_confirmation)
|
87
86
|
end
|
88
87
|
end
|
88
|
+
|
89
|
+
def check_if_superadmin
|
90
|
+
if @user.is_superadmin && !current_user.is_superadmin
|
91
|
+
return redirect_to manage_users_url, notice: 'Sorry, you cannot edit a super administrator.'
|
92
|
+
end
|
93
|
+
end
|
89
94
|
end
|
90
95
|
end
|
@@ -31,14 +31,7 @@ module Binda
|
|
31
31
|
|
32
32
|
def update
|
33
33
|
# Create new fields if any
|
34
|
-
|
35
|
-
unless field_group[:name].blank?
|
36
|
-
new_field_group = @structure.field_groups.create( name: field_group[:name] )
|
37
|
-
unless new_field_group
|
38
|
-
return redirect_to structure_path( @structure.slug ), flash: { error: new_field_group.errors }
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
34
|
+
add_new_field_groups
|
42
35
|
|
43
36
|
# Update the other ones
|
44
37
|
if @structure.update(structure_params)
|
@@ -61,8 +54,7 @@ module Binda
|
|
61
54
|
params[:structure].each_with_index do |id, i|
|
62
55
|
Structure.find( id ).update({ position: i + 1 })
|
63
56
|
end
|
64
|
-
render js: "$('.popup-warning').addClass('popup-warning--hidden');"
|
65
|
-
head :ok
|
57
|
+
render js: "$('##{params[:id]}').sortable('option', 'disabled', false); $('.popup-warning').addClass('popup-warning--hidden'); $('.sortable').removeClass('sortable--disabled')"
|
66
58
|
end
|
67
59
|
|
68
60
|
def sort_index
|
@@ -81,7 +73,16 @@ module Binda
|
|
81
73
|
end
|
82
74
|
|
83
75
|
def new_params
|
84
|
-
params.require(:structure).permit( new_field_groups:[ :name, :structure_id ] )
|
76
|
+
params.require(:structure).permit( new_field_groups:[ :name, :slug, :structure_id ] )
|
77
|
+
end
|
78
|
+
|
79
|
+
def add_new_field_groups
|
80
|
+
new_params[:new_field_groups].each do |field_group|
|
81
|
+
next if field_group[:name].blank?
|
82
|
+
new_field_group = @structure.field_groups.create( name: field_group[:name], slug: field_group[:slug] )
|
83
|
+
next if new_field_group
|
84
|
+
return redirect_to structure_path( @structure.slug ), flash: { error: new_field_group.errors }
|
85
|
+
end
|
85
86
|
end
|
86
87
|
end
|
87
88
|
end
|
data/app/models/binda/choice.rb
CHANGED
@@ -72,12 +72,17 @@ module Binda
|
|
72
72
|
selections = Selection.joins(:field_setting).where(binda_field_settings: {id: field_setting.id })
|
73
73
|
|
74
74
|
# Make sure none of the Binda::Selection instances (radios/checkboxes/selects) are left without a choice
|
75
|
-
selections
|
76
|
-
next if selection.choices.any?
|
77
|
-
selection.choices << Choice.find(self.field_setting.default_choice_id)
|
78
|
-
raise "It hasn't been possible to set the default choice for Binda::Selection with id=#{selection.id}" unless selection.save
|
79
|
-
end
|
75
|
+
update_selection selections
|
80
76
|
end
|
81
77
|
|
78
|
+
private
|
79
|
+
def update_selection selections
|
80
|
+
selections.each do |selection|
|
81
|
+
next if selection.choices.any?
|
82
|
+
selection.choices << Choice.find(self.field_setting.default_choice_id)
|
83
|
+
raise "It hasn't been possible to set the default choice for Binda::Selection with id=#{selection.id}" unless selection.save
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
82
87
|
end
|
83
88
|
end
|
@@ -153,19 +153,29 @@ module Binda
|
|
153
153
|
def create_field_instances
|
154
154
|
structure = self.field_group.structure
|
155
155
|
field_class = self.field_type.pluralize
|
156
|
+
field_setting_id = self.id
|
156
157
|
case
|
157
158
|
when structure.components.any?
|
158
159
|
structure.components.each do |component|
|
159
|
-
|
160
|
-
component.send(field_class).create!(field_setting_id: self.id)
|
161
|
-
end
|
160
|
+
create_field_instances_for_component( component, field_class, field_setting_id )
|
162
161
|
end
|
163
162
|
when structure.board.present?
|
164
|
-
|
165
|
-
|
166
|
-
|
163
|
+
create_field_instances_for_board( structure.board, field_class, field_setting_id )
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
# Helper for create_field_instances method
|
168
|
+
def create_field_instances_for_component( component, field_class, field_setting_id )
|
169
|
+
unless component.send(field_class).where(field_setting_id: field_setting_id).any?
|
170
|
+
component.send(field_class).create!(field_setting_id: field_setting_id)
|
167
171
|
end
|
168
172
|
end
|
169
173
|
|
174
|
+
# Helper for create_field_instances method
|
175
|
+
def create_field_instances_for_board ( board, field_class, field_setting_id )
|
176
|
+
unless board.send(field_class).where(field_setting_id: field_setting_id).any?
|
177
|
+
board.send(field_class).create!(field_setting_id: field_setting_id)
|
178
|
+
end
|
179
|
+
end
|
170
180
|
end
|
171
181
|
end
|
@@ -96,12 +96,18 @@ module Binda
|
|
96
96
|
unless obj.nil?
|
97
97
|
obj.content
|
98
98
|
else
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
99
|
+
check_text_error field_slug
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
# Check why get_text doesn't return a value
|
104
|
+
# This method isn't supposed to be used by anything other than get_text method
|
105
|
+
def check_text_error field_slug
|
106
|
+
you_mean_string = !self.strings.find{ |t| t.field_setting_id == FieldSetting.get_id( field_slug ) && t.type = 'Binda::String' }.nil?
|
107
|
+
if you_mean_string
|
108
|
+
raise ArgumentError, "This slug (#{field_slug}) is associated to a string not a text. Use get_string() instead on instance (#{self.class.name} ##{self.id}).", caller
|
109
|
+
else
|
110
|
+
raise ArgumentError, "There isn't any text associated to the current slug (#{field_slug}) on instance (#{self.class.name} ##{self.id}).", caller
|
105
111
|
end
|
106
112
|
end
|
107
113
|
|
@@ -130,12 +136,18 @@ module Binda
|
|
130
136
|
unless obj.nil?
|
131
137
|
obj.content
|
132
138
|
else
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
+
check_string_error field_slug
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
# Check why get_string doesn't return a value
|
144
|
+
# This method isn't supposed to be used by anything other than get_string method
|
145
|
+
def check_string_error field_slug
|
146
|
+
you_mean_text = !self.strings.find{ |t| t.field_setting_id == FieldSetting.get_id( field_slug ) && t.type = 'Binda::Text' }.nil?
|
147
|
+
if you_mean_text
|
148
|
+
raise ArgumentError, "This slug (#{field_slug}) is associated to a text not a string. Use get_text() instead on instance (#{self.class.name} ##{self.id}).", caller
|
149
|
+
else
|
150
|
+
raise ArgumentError, "There isn't any string associated to the current slug (#{field_slug}) on instance (#{self.class.name} ##{self.id}).", caller
|
139
151
|
end
|
140
152
|
end
|
141
153
|
|
@@ -17,30 +17,26 @@
|
|
17
17
|
</div>
|
18
18
|
<p><%= t 'binda.sort_items_loader', { arg1: t('binda.components').downcase } %></p>
|
19
19
|
</div>
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
<
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
<td></td>
|
38
|
-
</tr>
|
39
|
-
<% end %>
|
40
|
-
<tbody>
|
41
|
-
</table>
|
42
|
-
|
43
|
-
<%= link_to "<i class=\"fa fa-plus\" aria-hidden=\"true\"></i> New #{ @structure.name.humanize.split.map(&:capitalize).join(' ') }".html_safe, new_structure_component_path, class: 'main-header--link b-btn b-btn-primary', action: "new" %>
|
44
|
-
|
20
|
+
|
21
|
+
<div class="main-sortable-table">
|
22
|
+
|
23
|
+
<div class="main-sortable-table--header-row">
|
24
|
+
<div class="main-sortable-table--header-title"><p>Title</p></div>
|
25
|
+
<div class="main-sortable-table--header-title"><p>Publish State</p></div>
|
26
|
+
</div>
|
27
|
+
|
28
|
+
<div id="<%= @structure.slug %>-components--sort-index" class="sortable" data-update-url="<%= structure_components_sort_path( @structure.slug ) %>">
|
29
|
+
<% @components.order( :position, :name ).each do |component| %>
|
30
|
+
<div class="main-sortable-table--row ui-sortable-handle" id="component_<%= component.id %>">
|
31
|
+
<div class="main-sortable-table--row-cell"><%= link_to component.name, structure_component_path( @structure.slug, component ) %></div>
|
32
|
+
<div class="main-sortable-table--row-cell"><%= component.publish_state %></div>
|
33
|
+
</div>
|
34
|
+
<% end %>
|
35
|
+
</div>
|
36
|
+
|
45
37
|
</div>
|
38
|
+
|
39
|
+
<%= link_to "<i class=\"fa fa-plus\" aria-hidden=\"true\"></i> New #{ @structure.name.humanize.split.map(&:capitalize).join(' ') }".html_safe, new_structure_component_path, class: 'main-header--link b-btn b-btn-primary', action: "new" %>
|
40
|
+
|
41
|
+
|
46
42
|
<% end %>
|
@@ -43,10 +43,11 @@
|
|
43
43
|
|
44
44
|
<%= render "form_section", f: f %>
|
45
45
|
|
46
|
-
<div class="clearfix"></div>
|
47
46
|
</div>
|
47
|
+
</div>
|
48
48
|
|
49
|
-
|
49
|
+
<% @field_group.field_settings.where( field_type: 'repeater' ).order( :position, :id ).each do |repeater| %>
|
50
|
+
<div class="standard-form--container">
|
50
51
|
<div id="form-section--repeater-<%= repeater.id %>" class="form-section--wide-container">
|
51
52
|
<div class="form-section">
|
52
53
|
|
@@ -56,12 +57,11 @@
|
|
56
57
|
|
57
58
|
<%= render "form_section_repeater", f: f, repeater: repeater %>
|
58
59
|
|
59
|
-
<div class="clearfix"></div>
|
60
60
|
</div>
|
61
61
|
</div>
|
62
|
-
|
62
|
+
</div>
|
63
|
+
<% end %>
|
63
64
|
|
64
|
-
</div>
|
65
65
|
|
66
66
|
</div>
|
67
67
|
|