rails_admin_next 1.0.0
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/Gemfile +46 -0
- data/LICENSE.md +21 -0
- data/README.md +317 -0
- data/Rakefile +25 -0
- data/app/assets/javascripts/rails_admin/custom/ui.js +1 -0
- data/app/assets/stylesheets/rails_admin/framework.css +2375 -0
- data/app/assets/stylesheets/rails_admin/skin.css +472 -0
- data/app/assets/stylesheets/rails_admin/tokens.css +281 -0
- data/app/assets/stylesheets/rails_admin.css +47 -0
- data/app/controllers/rails_admin_next/application_controller.rb +98 -0
- data/app/controllers/rails_admin_next/main_controller.rb +185 -0
- data/app/helpers/rails_admin_next/application_helper.rb +254 -0
- data/app/helpers/rails_admin_next/form_builder.rb +173 -0
- data/app/helpers/rails_admin_next/main_helper.rb +63 -0
- data/app/views/layouts/rails_admin_next/_head.html.erb +29 -0
- data/app/views/layouts/rails_admin_next/_navigation.html.erb +18 -0
- data/app/views/layouts/rails_admin_next/_secondary_navigation.html.erb +27 -0
- data/app/views/layouts/rails_admin_next/_sidebar_navigation.html.erb +6 -0
- data/app/views/layouts/rails_admin_next/application.html.erb +42 -0
- data/app/views/layouts/rails_admin_next/content.html.erb +22 -0
- data/app/views/layouts/rails_admin_next/modal.js.erb +7 -0
- data/app/views/rails_admin_next/main/_dashboard_history.html.erb +46 -0
- data/app/views/rails_admin_next/main/_delete_notice.html.erb +36 -0
- data/app/views/rails_admin_next/main/_form_action_text.html.erb +2 -0
- data/app/views/rails_admin_next/main/_form_boolean.html.erb +15 -0
- data/app/views/rails_admin_next/main/_form_colorpicker.html.erb +6 -0
- data/app/views/rails_admin_next/main/_form_datetime.html.erb +14 -0
- data/app/views/rails_admin_next/main/_form_enumeration.html.erb +26 -0
- data/app/views/rails_admin_next/main/_form_field.html.erb +2 -0
- data/app/views/rails_admin_next/main/_form_file_upload.html.erb +18 -0
- data/app/views/rails_admin_next/main/_form_filtering_multiselect.html.erb +20 -0
- data/app/views/rails_admin_next/main/_form_filtering_select.html.erb +22 -0
- data/app/views/rails_admin_next/main/_form_multiple_file_upload.html.erb +21 -0
- data/app/views/rails_admin_next/main/_form_nested_many.html.erb +20 -0
- data/app/views/rails_admin_next/main/_form_nested_one.html.erb +19 -0
- data/app/views/rails_admin_next/main/_form_polymorphic_association.html.erb +24 -0
- data/app/views/rails_admin_next/main/_form_text.html.erb +2 -0
- data/app/views/rails_admin_next/main/_pagination.html.erb +54 -0
- data/app/views/rails_admin_next/main/_submit_buttons.html.erb +26 -0
- data/app/views/rails_admin_next/main/bulk_delete.html.erb +19 -0
- data/app/views/rails_admin_next/main/dashboard.html.erb +64 -0
- data/app/views/rails_admin_next/main/delete.html.erb +21 -0
- data/app/views/rails_admin_next/main/edit.html.erb +3 -0
- data/app/views/rails_admin_next/main/export.html.erb +149 -0
- data/app/views/rails_admin_next/main/history.html.erb +80 -0
- data/app/views/rails_admin_next/main/index.html.erb +186 -0
- data/app/views/rails_admin_next/main/new.html.erb +3 -0
- data/app/views/rails_admin_next/main/show.html.erb +30 -0
- data/config/brakeman.ignore +145 -0
- data/config/importmap.rails_admin.rb +29 -0
- data/config/initializers/active_record_extensions.rb +21 -0
- data/config/locales/rails_admin_next.en.yml +158 -0
- data/config/routes.rb +14 -0
- data/lib/generators/rails_admin_next/install_generator.rb +39 -0
- data/lib/generators/rails_admin_next/templates/initializer.erb +40 -0
- data/lib/generators/rails_admin_next/utils.rb +21 -0
- data/lib/rails_admin_next/abstract_model.rb +266 -0
- data/lib/rails_admin_next/adapters/active_record/association.rb +130 -0
- data/lib/rails_admin_next/adapters/active_record/object_extension.rb +13 -0
- data/lib/rails_admin_next/adapters/active_record/property.rb +58 -0
- data/lib/rails_admin_next/adapters/active_record.rb +371 -0
- data/lib/rails_admin_next/config/actions/base.rb +160 -0
- data/lib/rails_admin_next/config/actions/bulk_delete.rb +67 -0
- data/lib/rails_admin_next/config/actions/dashboard.rb +62 -0
- data/lib/rails_admin_next/config/actions/delete.rb +58 -0
- data/lib/rails_admin_next/config/actions/edit.rb +56 -0
- data/lib/rails_admin_next/config/actions/export.rb +47 -0
- data/lib/rails_admin_next/config/actions/history_index.rb +40 -0
- data/lib/rails_admin_next/config/actions/history_show.rb +40 -0
- data/lib/rails_admin_next/config/actions/index.rb +108 -0
- data/lib/rails_admin_next/config/actions/new.rb +69 -0
- data/lib/rails_admin_next/config/actions/show.rb +36 -0
- data/lib/rails_admin_next/config/actions/show_in_app.rb +37 -0
- data/lib/rails_admin_next/config/actions.rb +122 -0
- data/lib/rails_admin_next/config/configurable.rb +107 -0
- data/lib/rails_admin_next/config/const_load_suppressor.rb +78 -0
- data/lib/rails_admin_next/config/fields/association.rb +169 -0
- data/lib/rails_admin_next/config/fields/base.rb +391 -0
- data/lib/rails_admin_next/config/fields/collection_association.rb +90 -0
- data/lib/rails_admin_next/config/fields/factories/action_text.rb +14 -0
- data/lib/rails_admin_next/config/fields/factories/active_storage.rb +34 -0
- data/lib/rails_admin_next/config/fields/factories/association.rb +32 -0
- data/lib/rails_admin_next/config/fields/factories/encrypted_password.rb +28 -0
- data/lib/rails_admin_next/config/fields/factories/enum.rb +23 -0
- data/lib/rails_admin_next/config/fields/factories/password.rb +19 -0
- data/lib/rails_admin_next/config/fields/group.rb +77 -0
- data/lib/rails_admin_next/config/fields/singular_association.rb +62 -0
- data/lib/rails_admin_next/config/fields/types/action_text.rb +20 -0
- data/lib/rails_admin_next/config/fields/types/active_record_enum.rb +62 -0
- data/lib/rails_admin_next/config/fields/types/active_storage.rb +70 -0
- data/lib/rails_admin_next/config/fields/types/all.rb +32 -0
- data/lib/rails_admin_next/config/fields/types/belongs_to_association.rb +48 -0
- data/lib/rails_admin_next/config/fields/types/boolean.rb +70 -0
- data/lib/rails_admin_next/config/fields/types/citext.rb +15 -0
- data/lib/rails_admin_next/config/fields/types/color.rb +43 -0
- data/lib/rails_admin_next/config/fields/types/date.rb +38 -0
- data/lib/rails_admin_next/config/fields/types/datetime.rb +79 -0
- data/lib/rails_admin_next/config/fields/types/decimal.rb +23 -0
- data/lib/rails_admin_next/config/fields/types/enum.rb +52 -0
- data/lib/rails_admin_next/config/fields/types/file_upload.rb +87 -0
- data/lib/rails_admin_next/config/fields/types/float.rb +23 -0
- data/lib/rails_admin_next/config/fields/types/has_and_belongs_to_many_association.rb +16 -0
- data/lib/rails_admin_next/config/fields/types/has_many_association.rb +16 -0
- data/lib/rails_admin_next/config/fields/types/has_one_association.rb +35 -0
- data/lib/rails_admin_next/config/fields/types/hidden.rb +31 -0
- data/lib/rails_admin_next/config/fields/types/inet.rb +15 -0
- data/lib/rails_admin_next/config/fields/types/integer.rb +20 -0
- data/lib/rails_admin_next/config/fields/types/json.rb +37 -0
- data/lib/rails_admin_next/config/fields/types/multiple_active_storage.rb +82 -0
- data/lib/rails_admin_next/config/fields/types/multiple_file_upload.rb +134 -0
- data/lib/rails_admin_next/config/fields/types/numeric.rb +24 -0
- data/lib/rails_admin_next/config/fields/types/password.rb +45 -0
- data/lib/rails_admin_next/config/fields/types/polymorphic_association.rb +118 -0
- data/lib/rails_admin_next/config/fields/types/serialized.rb +28 -0
- data/lib/rails_admin_next/config/fields/types/string.rb +50 -0
- data/lib/rails_admin_next/config/fields/types/string_like.rb +25 -0
- data/lib/rails_admin_next/config/fields/types/text.rb +28 -0
- data/lib/rails_admin_next/config/fields/types/time.rb +39 -0
- data/lib/rails_admin_next/config/fields/types/timestamp.rb +16 -0
- data/lib/rails_admin_next/config/fields/types/uuid.rb +15 -0
- data/lib/rails_admin_next/config/fields/types.rb +29 -0
- data/lib/rails_admin_next/config/fields.rb +88 -0
- data/lib/rails_admin_next/config/groupable.rb +20 -0
- data/lib/rails_admin_next/config/has_description.rb +14 -0
- data/lib/rails_admin_next/config/has_fields.rb +144 -0
- data/lib/rails_admin_next/config/has_groups.rb +27 -0
- data/lib/rails_admin_next/config/hideable.rb +30 -0
- data/lib/rails_admin_next/config/inspectable.rb +39 -0
- data/lib/rails_admin_next/config/lazy_model.rb +74 -0
- data/lib/rails_admin_next/config/model.rb +126 -0
- data/lib/rails_admin_next/config/proxyable/proxy.rb +42 -0
- data/lib/rails_admin_next/config/proxyable.rb +26 -0
- data/lib/rails_admin_next/config/sections/base.rb +36 -0
- data/lib/rails_admin_next/config/sections/create.rb +13 -0
- data/lib/rails_admin_next/config/sections/edit.rb +13 -0
- data/lib/rails_admin_next/config/sections/export.rb +13 -0
- data/lib/rails_admin_next/config/sections/list.rb +63 -0
- data/lib/rails_admin_next/config/sections/modal.rb +12 -0
- data/lib/rails_admin_next/config/sections/nested.rb +12 -0
- data/lib/rails_admin_next/config/sections/show.rb +12 -0
- data/lib/rails_admin_next/config/sections/update.rb +12 -0
- data/lib/rails_admin_next/config/sections.rb +39 -0
- data/lib/rails_admin_next/config.rb +436 -0
- data/lib/rails_admin_next/engine.rb +91 -0
- data/lib/rails_admin_next/extension.rb +35 -0
- data/lib/rails_admin_next/extensions/cancancan/authorization_adapter.rb +90 -0
- data/lib/rails_admin_next/extensions/cancancan.rb +5 -0
- data/lib/rails_admin_next/extensions/controller_extension.rb +8 -0
- data/lib/rails_admin_next/extensions/paper_trail/auditing_adapter.rb +192 -0
- data/lib/rails_admin_next/extensions/paper_trail.rb +5 -0
- data/lib/rails_admin_next/extensions/pundit/authorization_adapter.rb +72 -0
- data/lib/rails_admin_next/extensions/pundit.rb +5 -0
- data/lib/rails_admin_next/extensions/url_for_extension.rb +15 -0
- data/lib/rails_admin_next/icons.rb +143 -0
- data/lib/rails_admin_next/support/composite_keys_serializer.rb +15 -0
- data/lib/rails_admin_next/support/csv_converter.rb +100 -0
- data/lib/rails_admin_next/support/hash_helper.rb +31 -0
- data/lib/rails_admin_next/support/paginated_collection.rb +79 -0
- data/lib/rails_admin_next/version.rb +17 -0
- data/lib/rails_admin_next.rb +72 -0
- data/lib/tasks/rails_admin.rake +40 -0
- data/src/rails_admin/application.js +15 -0
- data/src/rails_admin/base.js +12 -0
- data/src/rails_admin/controllers/alert_controller.js +28 -0
- data/src/rails_admin/controllers/collapse_controller.js +16 -0
- data/src/rails_admin/controllers/dropdown_controller.js +110 -0
- data/src/rails_admin/controllers/feedback_controller.js +73 -0
- data/src/rails_admin/controllers/filter_box_controller.js +346 -0
- data/src/rails_admin/controllers/filtering_multiselect_controller.js +386 -0
- data/src/rails_admin/controllers/filtering_select_controller.js +509 -0
- data/src/rails_admin/controllers/index.js +31 -0
- data/src/rails_admin/controllers/modal_controller.js +142 -0
- data/src/rails_admin/controllers/nested_form_controller.js +117 -0
- data/src/rails_admin/controllers/polymorphic_controller.js +26 -0
- data/src/rails_admin/controllers/remote_form_controller.js +173 -0
- data/src/rails_admin/controllers/sidescroll_controller.js +23 -0
- data/src/rails_admin/dom-ready.js +20 -0
- data/src/rails_admin/dom.js +19 -0
- data/src/rails_admin/i18n.js +20 -0
- data/src/rails_admin/icons.js +64 -0
- data/src/rails_admin/interactions.js +221 -0
- data/src/rails_admin/select_query.js +65 -0
- metadata +346 -0
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
<%# locals: () -%>
|
|
2
|
+
<table class="table table-condensed table-striped table-hover">
|
|
3
|
+
<thead>
|
|
4
|
+
<tr>
|
|
5
|
+
<th class="shrink user">
|
|
6
|
+
<%= t("admin.table_headers.username") %>
|
|
7
|
+
</th>
|
|
8
|
+
<th class="shrink items">
|
|
9
|
+
<%= t("admin.table_headers.item") %>
|
|
10
|
+
</th>
|
|
11
|
+
<th class="changes">
|
|
12
|
+
<%= t("admin.table_headers.changes") %>
|
|
13
|
+
</th>
|
|
14
|
+
</tr>
|
|
15
|
+
</thead>
|
|
16
|
+
<tbody class="table-group-divider">
|
|
17
|
+
<% @history.each do |t| %>
|
|
18
|
+
<% abstract_model = RailsAdminNext.config(t.table).abstract_model %>
|
|
19
|
+
<tr>
|
|
20
|
+
<td>
|
|
21
|
+
<%= t.try :username %>
|
|
22
|
+
</td>
|
|
23
|
+
<% if o = abstract_model.try(:get, t.item) %>
|
|
24
|
+
<% label = o.send(abstract_model.config.object_label_method) %>
|
|
25
|
+
<% if show_action = action(:show, abstract_model, o) %>
|
|
26
|
+
<td>
|
|
27
|
+
<%= link_to(label, url_for(action: show_action.action_name, model_name: abstract_model.to_param, id: o.id)) %>
|
|
28
|
+
</td>
|
|
29
|
+
<% else %>
|
|
30
|
+
<td>
|
|
31
|
+
<%= label %>
|
|
32
|
+
</td>
|
|
33
|
+
<% end %>
|
|
34
|
+
<% else %>
|
|
35
|
+
<% label = Object.const_defined?(t.table) ? t.table.constantize.model_name.human : t.table %>
|
|
36
|
+
<td>
|
|
37
|
+
<%= "#{label} ##{t.item}" %>
|
|
38
|
+
</td>
|
|
39
|
+
<% end %>
|
|
40
|
+
<td>
|
|
41
|
+
<%= t.message %>
|
|
42
|
+
</td>
|
|
43
|
+
</tr>
|
|
44
|
+
<% end %>
|
|
45
|
+
</tbody>
|
|
46
|
+
</table>
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
<%# locals: (delete_notice:) -%>
|
|
2
|
+
<% object = delete_notice %>
|
|
3
|
+
<li style="display:block; margin-top:10px">
|
|
4
|
+
<span class="badge bg-secondary">
|
|
5
|
+
<%= @abstract_model.pretty_name %>
|
|
6
|
+
</span>
|
|
7
|
+
<% wording = object.send(@model_config.object_label_method) %>
|
|
8
|
+
<% if show_action = action(:show, @abstract_model, object) %>
|
|
9
|
+
<%= link_to(wording, url_for(action: show_action.action_name, model_name: @abstract_model.to_param, id: object.id)) %>
|
|
10
|
+
<% else %>
|
|
11
|
+
<%= wording %>
|
|
12
|
+
<% end %>
|
|
13
|
+
<ul>
|
|
14
|
+
<% @abstract_model.each_associated_children(object) do |association, children| %>
|
|
15
|
+
<% humanized_association = @abstract_model.model.human_attribute_name association.name %>
|
|
16
|
+
<% limit = children.count > 12 ? 10 : children.count %>
|
|
17
|
+
<% children.first(limit).each do |child| %>
|
|
18
|
+
<%= content_tag :li, class: dom_class(child) do %>
|
|
19
|
+
<% child_config = RailsAdminNext.config(child) %>
|
|
20
|
+
<%= humanized_association.singularize %>
|
|
21
|
+
<% wording = child.send(child_config.object_label_method) %>
|
|
22
|
+
<% if child.id && (show_action = action(:show, child_config.abstract_model, child)) %>
|
|
23
|
+
<%= link_to(wording, url_for(action: show_action.action_name, model_name: child_config.abstract_model.to_param, id: child.id)) %>
|
|
24
|
+
<% else %>
|
|
25
|
+
<%= wording %>
|
|
26
|
+
<% end %>
|
|
27
|
+
<% end %>
|
|
28
|
+
<% end %>
|
|
29
|
+
<% if children.count > limit %>
|
|
30
|
+
<li>
|
|
31
|
+
<%= t('admin.misc.more', count: children.count - limit, models_name: humanized_association) %>
|
|
32
|
+
</li>
|
|
33
|
+
<% end %>
|
|
34
|
+
<% end %>
|
|
35
|
+
</ul>
|
|
36
|
+
</li>
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
<%# locals: (field:, form:) -%>
|
|
2
|
+
<% if field.nullable? %>
|
|
3
|
+
<div class="btn-group" role="group">
|
|
4
|
+
<% {'1': [true, 'btn-outline-success'], '0': [false, 'btn-outline-danger'], '': [nil, 'btn-outline-secondary']}.each do |text, (value, btn_class)| %>
|
|
5
|
+
<%= form.radio_button field.method_name, text, field.html_attributes.reverse_merge({ checked: field.form_value == value, required: field.required, class: 'btn-check' }) %>
|
|
6
|
+
<%= form.label "#{field.method_name}_#{text}", class: "#{field.css_classes[value]} btn #{btn_class}" do %>
|
|
7
|
+
<%= field.labels[value].html_safe %>
|
|
8
|
+
<% end %>
|
|
9
|
+
<% end %>
|
|
10
|
+
</div>
|
|
11
|
+
<% else %>
|
|
12
|
+
<div class="col-form-label">
|
|
13
|
+
<%= form.send field.view_helper, field.method_name, field.html_attributes.reverse_merge({ value: field.form_value, checked: field.form_value.in?([true, '1']), required: field.required, class: 'form-check-input' }) %>
|
|
14
|
+
</div>
|
|
15
|
+
<% end %>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<%# locals: (field:, form:) -%>
|
|
2
|
+
<%
|
|
3
|
+
helper =
|
|
4
|
+
case field.type
|
|
5
|
+
when :date then :date_field
|
|
6
|
+
when :time then :time_field
|
|
7
|
+
else :datetime_field
|
|
8
|
+
end
|
|
9
|
+
-%>
|
|
10
|
+
<div class="row">
|
|
11
|
+
<div class="col-sm-4">
|
|
12
|
+
<%= form.public_send(helper, field.method_name, field.html_attributes.reverse_merge(autocomplete: 'off', class: 'form-control', value: field.form_value)) %>
|
|
13
|
+
</div>
|
|
14
|
+
</div>
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
<%# locals: (field:, form:) -%>
|
|
2
|
+
<% unless field.multiple? %>
|
|
3
|
+
<div class="row">
|
|
4
|
+
<div class="col-sm-4">
|
|
5
|
+
<%= form.select field.method_name, field.enum, { include_blank: true }.reverse_merge({ selected: field.form_value }), field.html_attributes.reverse_merge({ data: { controller: 'filtering-select' }, placeholder: t('admin.misc.search') }) %>
|
|
6
|
+
</div>
|
|
7
|
+
</div>
|
|
8
|
+
<% else %>
|
|
9
|
+
<%
|
|
10
|
+
js_data = {
|
|
11
|
+
xhr: false,
|
|
12
|
+
sortable: false,
|
|
13
|
+
cacheAll: true,
|
|
14
|
+
regional: {
|
|
15
|
+
add: t("admin.misc.add_new"),
|
|
16
|
+
chooseAll: t("admin.misc.chose_all"),
|
|
17
|
+
clearAll: t("admin.misc.clear_all"),
|
|
18
|
+
down: t("admin.misc.down"),
|
|
19
|
+
remove: t("admin.misc.remove"),
|
|
20
|
+
search: t("admin.misc.search"),
|
|
21
|
+
up: t("admin.misc.up")
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
%>
|
|
25
|
+
<%= form.select field.method_name, field.enum, { selected: field.form_value, object: form.object }, field.html_attributes.reverse_merge({data: { controller: 'filtering-multiselect', 'filtering-multiselect-options-value': js_data.to_json }, multiple: true}) %>
|
|
26
|
+
<% end %>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
<%# locals: (field:, form:) -%>
|
|
2
|
+
<% file = field.value %>
|
|
3
|
+
<% if field.cache_method %>
|
|
4
|
+
<%= form.hidden_field(field.cache_method, value: field.cache_value) %>
|
|
5
|
+
<% end %>
|
|
6
|
+
<div class="toggle mb-2" style="<%= ('display:none;' if file && field.delete_method && form.object.send(field.delete_method) == '1') %>">
|
|
7
|
+
<% if value = field.pretty_value %>
|
|
8
|
+
<%= value %>
|
|
9
|
+
<% end %>
|
|
10
|
+
<%= form.file_field(field.name, {data: {fileupload: true}}.deep_merge(field.html_attributes)) %>
|
|
11
|
+
</div>
|
|
12
|
+
<% if field.optional? && field.errors.blank? && file && field.delete_method %>
|
|
13
|
+
<a class="btn btn-info btn-remove-image" data-toggle="button" href="#" role="button">
|
|
14
|
+
<%= rails_admin_icon(:trash) %>
|
|
15
|
+
<%= I18n.t('admin.actions.delete.link', object_label: field.label) %>
|
|
16
|
+
</a>
|
|
17
|
+
<%= form.check_box(field.delete_method, style: 'display:none;') %>
|
|
18
|
+
<% end %>
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
<%# locals: (field:, form:) -%>
|
|
2
|
+
<%
|
|
3
|
+
config = field.associated_model_config
|
|
4
|
+
%>
|
|
5
|
+
|
|
6
|
+
<div class="row" data-controller="remote-form" data-remote-form-modal-outlet="#modal">
|
|
7
|
+
<div class="col-auto">
|
|
8
|
+
<input name="<%= form.dom_name(field) %>" type="hidden" />
|
|
9
|
+
<%=
|
|
10
|
+
form.select field.method_name, field.collection, { selected: field.form_value, object: form.object },
|
|
11
|
+
field.html_attributes.reverse_merge({data: { controller: 'filtering-multiselect', 'filtering-multiselect-options-value': field.widget_options.to_json, filteringmultiselect: true, options: field.widget_options.to_json }, multiple: true})
|
|
12
|
+
%>
|
|
13
|
+
</div>
|
|
14
|
+
<% if authorized?(:new, config.abstract_model) && field.inline_add %>
|
|
15
|
+
<div class="col-sm-4 modal-actions">
|
|
16
|
+
<% path_hash = { model_name: config.abstract_model.to_param, modal: true }.merge!(field.associated_prepopulate_params) %>
|
|
17
|
+
<%= link_to rails_admin_icon(:new) + " " + wording_for(:link, :new, config.abstract_model), '#', data: { link: new_path(path_hash) }, class: "create btn btn-info", style: 'margin-left:10px' %>
|
|
18
|
+
</div>
|
|
19
|
+
<% end %>
|
|
20
|
+
</div>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
<%# locals: (field:, form:) -%>
|
|
2
|
+
<%
|
|
3
|
+
config = field.associated_model_config
|
|
4
|
+
%>
|
|
5
|
+
|
|
6
|
+
<div class="row" data-controller="remote-form" data-remote-form-modal-outlet="#modal">
|
|
7
|
+
<div class="col-sm-4">
|
|
8
|
+
<%=
|
|
9
|
+
form.select field.method_name, field.collection, { selected: field.form_value, include_blank: true },
|
|
10
|
+
field.html_attributes.reverse_merge({ data: { controller: 'filtering-select', 'filtering-select-options-value': field.widget_options.to_json, filteringselect: true }, placeholder: t('admin.misc.search') })
|
|
11
|
+
%>
|
|
12
|
+
</div>
|
|
13
|
+
<div class="col-sm-8 mt-2 mt-md-0 modal-actions">
|
|
14
|
+
<% if authorized?(:new, config.abstract_model) && field.inline_add %>
|
|
15
|
+
<% path_hash = { model_name: config.abstract_model.to_param, modal: true }.merge!(field.associated_prepopulate_params) %>
|
|
16
|
+
<%= link_to rails_admin_icon(:new) + " " + wording_for(:link, :new, config.abstract_model), '#', data: { link: new_path(path_hash) }, class: "btn btn-info create" %>
|
|
17
|
+
<% end %>
|
|
18
|
+
<% if authorized?(:edit, config.abstract_model) && field.inline_edit %>
|
|
19
|
+
<%= link_to rails_admin_icon(:edit) + " " + wording_for(:link, :edit, config.abstract_model), '#', data: { link: edit_path(model_name: config.abstract_model.to_param, modal: true, id: '__ID__') }, class: "btn btn-info update ms-2#{' disabled' if field.value.nil?}" %>
|
|
20
|
+
<% end %>
|
|
21
|
+
</div>
|
|
22
|
+
</div>
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
<%# locals: (field:, form:) -%>
|
|
2
|
+
<% field.attachments.each_with_index do |attachment, i| %>
|
|
3
|
+
<div class="<%= field.reorderable? ? 'sortables' : '' %> toggle mb-2">
|
|
4
|
+
<%= attachment.pretty_value %>
|
|
5
|
+
<% if field.delete_method || field.keep_method %>
|
|
6
|
+
<a class="btn btn-info btn-remove-image" data-toggle="button" href="#" role="button">
|
|
7
|
+
<%= rails_admin_icon(:trash) %>
|
|
8
|
+
<%= I18n.t('admin.form.delete_file', field_label: field.label, number: i + 1) %>
|
|
9
|
+
</a>
|
|
10
|
+
<% if field.keep_method %>
|
|
11
|
+
<%= form.check_box(field.keep_method, {multiple:true, checked: true, style: 'display:none;'}, attachment.keep_value, nil) %>
|
|
12
|
+
<% elsif field.delete_method %>
|
|
13
|
+
<%= form.check_box(field.delete_method, {multiple:true, style: 'display:none;'}, attachment.delete_value, nil) %>
|
|
14
|
+
<% end %>
|
|
15
|
+
<% end %>
|
|
16
|
+
</div>
|
|
17
|
+
<% end %>
|
|
18
|
+
<%= form.file_field(field.name, { data: { :"multiple-fileupload" => true }, multiple: true }.deep_merge(field.html_attributes)) %>
|
|
19
|
+
<% if field.cache_method %>
|
|
20
|
+
<%= form.hidden_field(field.cache_method) %>
|
|
21
|
+
<% end %>
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
<%# locals: (field:, form:) -%>
|
|
2
|
+
<%
|
|
3
|
+
associated_model = field.associated_model_config.abstract_model
|
|
4
|
+
add_label = rails_admin_icon(:new) + " " + wording_for(:link, :new, associated_model)
|
|
5
|
+
allow_destroy = field.nested_form && field.nested_form[:allow_destroy]
|
|
6
|
+
placeholder = "new_#{field.name}"
|
|
7
|
+
-%>
|
|
8
|
+
<div class="controls col-sm-10" data-controller="nested-form" data-nested-form-placeholder-value="<%= placeholder %>">
|
|
9
|
+
<div class="tab-content" data-nested-form-target="container">
|
|
10
|
+
<%= form.fields_for field.name, nil, include_id: false do |nested_form| %>
|
|
11
|
+
<%= form.nested_field_set nested_form, field, allow_destroy: allow_destroy %>
|
|
12
|
+
<% end %>
|
|
13
|
+
</div>
|
|
14
|
+
<% if field.inline_add %>
|
|
15
|
+
<button type="button" class="btn btn-info add_nested_fields" data-action="nested-form#add"><%= add_label %></button>
|
|
16
|
+
<% end %>
|
|
17
|
+
<%= form.errors_for(field) %>
|
|
18
|
+
<%= form.help_for(field) %>
|
|
19
|
+
<template data-nested-form-target="template"><%= form.fields_for field.name, associated_model.model.new, child_index: placeholder, include_id: false do |nested_form| %><%= form.nested_field_set nested_form, field, allow_destroy: true %><% end %></template>
|
|
20
|
+
</div>
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
<%# locals: (field:, form:) -%>
|
|
2
|
+
<%
|
|
3
|
+
associated_model = field.associated_model_config.abstract_model
|
|
4
|
+
add_label = rails_admin_icon(:new) + " " + wording_for(:link, :new, associated_model)
|
|
5
|
+
allow_destroy = field.nested_form && field.nested_form[:allow_destroy]
|
|
6
|
+
-%>
|
|
7
|
+
<div class="controls col-sm-10" data-controller="nested-form" data-nested-form-singular-value="true">
|
|
8
|
+
<div class="tab-content" data-nested-form-target="container">
|
|
9
|
+
<%= form.fields_for field.name, nil, include_id: false do |nested_form| %>
|
|
10
|
+
<%= form.nested_field_set nested_form, field, allow_destroy: allow_destroy %>
|
|
11
|
+
<% end %>
|
|
12
|
+
</div>
|
|
13
|
+
<% if field.inline_add %>
|
|
14
|
+
<button type="button" class="btn btn-info add_nested_fields" data-action="nested-form#add"><%= add_label %></button>
|
|
15
|
+
<% end %>
|
|
16
|
+
<%= form.errors_for(field) %>
|
|
17
|
+
<%= form.help_for(field) %>
|
|
18
|
+
<template data-nested-form-target="template"><%= form.fields_for field.name, associated_model.model.new, include_id: false do |nested_form| %><%= form.nested_field_set nested_form, field, allow_destroy: true %><% end %></template>
|
|
19
|
+
</div>
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
<%# locals: (field:, form:) -%>
|
|
2
|
+
<%
|
|
3
|
+
column_type_dom_id = form.dom_id(field).sub(field.method_name.to_s, field.type_column)
|
|
4
|
+
%>
|
|
5
|
+
|
|
6
|
+
<div class="row">
|
|
7
|
+
<div class="col-sm-3">
|
|
8
|
+
<% field.widget_options_for_types.each do |model, value| %>
|
|
9
|
+
<div data-options="<%= value.to_json %>" id="<%= model %>-js-options"></div>
|
|
10
|
+
<% end %>
|
|
11
|
+
<%=
|
|
12
|
+
form.select field.type_column, field.type_collection, {include_blank: true, selected: field.selected_type},
|
|
13
|
+
class: "form-select", id: column_type_dom_id, data: { controller: 'polymorphic', action: 'change->polymorphic#change', urls: field.type_urls.to_json },
|
|
14
|
+
style: "float: left; margin-right: 10px;"
|
|
15
|
+
%>
|
|
16
|
+
</div>
|
|
17
|
+
<div class="col-sm-4">
|
|
18
|
+
<%=
|
|
19
|
+
form.select field.method_name, field.collection, {include_blank: true, selected: field.selected_id},
|
|
20
|
+
class: "form-control", data: { controller: 'filtering-select', 'filtering-select-options-value': field.widget_options, filteringselect: true },
|
|
21
|
+
placeholder: 'Search'
|
|
22
|
+
%>
|
|
23
|
+
</div>
|
|
24
|
+
</div>
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
<%# locals: (collection:, url_proc:, mode: :numbered) -%>
|
|
2
|
+
<nav aria-label="Page navigation">
|
|
3
|
+
<ul class="pagination">
|
|
4
|
+
<% if mode == :limited %>
|
|
5
|
+
<%# Count-free pager: prev when not on the first page, next while the page is full. %>
|
|
6
|
+
<% unless collection.first_page? %>
|
|
7
|
+
<li class="page-item prev">
|
|
8
|
+
<%= link_to raw(t('admin.pagination.previous')), url_proc.call(collection.current_page - 1), class: 'page-link' %>
|
|
9
|
+
</li>
|
|
10
|
+
<% end %>
|
|
11
|
+
<% if collection.full_page? %>
|
|
12
|
+
<li class="page-item next">
|
|
13
|
+
<%= link_to raw(t('admin.pagination.next')), url_proc.call(collection.current_page + 1), class: 'page-link' %>
|
|
14
|
+
</li>
|
|
15
|
+
<% else %>
|
|
16
|
+
<li class="page-item next disabled">
|
|
17
|
+
<%= link_to raw(t('admin.pagination.next')), '#', class: 'page-link' %>
|
|
18
|
+
</li>
|
|
19
|
+
<% end %>
|
|
20
|
+
<% else %>
|
|
21
|
+
<% current = collection.current_page %>
|
|
22
|
+
<% total = collection.total_pages %>
|
|
23
|
+
<% if collection.first_page? %>
|
|
24
|
+
<li class="page-item prev disabled">
|
|
25
|
+
<%= link_to raw(t('admin.pagination.previous')), '#', class: 'page-link' %>
|
|
26
|
+
</li>
|
|
27
|
+
<% else %>
|
|
28
|
+
<li class="page-item prev">
|
|
29
|
+
<%= link_to raw(t('admin.pagination.previous')), url_proc.call(current - 1), class: 'page-link' %>
|
|
30
|
+
</li>
|
|
31
|
+
<% end %>
|
|
32
|
+
<% (1..total).each do |number| %>
|
|
33
|
+
<% if (current - number).abs <= 4 %>
|
|
34
|
+
<li class="<%= number == current ? 'page-item active' : 'page-item' %>">
|
|
35
|
+
<%= link_to number, url_proc.call(number), class: 'page-link' %>
|
|
36
|
+
</li>
|
|
37
|
+
<% elsif number == 1 || (current - (number - 1)).abs <= 4 %>
|
|
38
|
+
<li class="page-item disabled">
|
|
39
|
+
<a href="#" class="page-link"><%= raw(t('admin.pagination.truncate')) %></a>
|
|
40
|
+
</li>
|
|
41
|
+
<% end %>
|
|
42
|
+
<% end %>
|
|
43
|
+
<% if collection.last_page? %>
|
|
44
|
+
<li class="page-item next disabled">
|
|
45
|
+
<%= link_to raw(t('admin.pagination.next')), '#', class: 'page-link' %>
|
|
46
|
+
</li>
|
|
47
|
+
<% else %>
|
|
48
|
+
<li class="page-item next">
|
|
49
|
+
<%= link_to raw(t('admin.pagination.next')), url_proc.call(current + 1), class: 'page-link' %>
|
|
50
|
+
</li>
|
|
51
|
+
<% end %>
|
|
52
|
+
<% end %>
|
|
53
|
+
</ul>
|
|
54
|
+
</nav>
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
<%# locals: () -%>
|
|
2
|
+
<div class="form-actions row justify-content-end my-3">
|
|
3
|
+
<div class="col-sm-10">
|
|
4
|
+
<input name="return_to" type="<%= :hidden %>" value="<%= (params[:return_to].presence || request.referer) %>" />
|
|
5
|
+
<button class="btn btn-primary" data-disable-with="<%= t("admin.form.save") %>" name="_save" type="submit"<%= ' disabled' unless @action.enabled? %>>
|
|
6
|
+
<%= rails_admin_icon(:check) %>
|
|
7
|
+
<%= t("admin.form.save") %>
|
|
8
|
+
</button>
|
|
9
|
+
<span class="extra_buttons">
|
|
10
|
+
<% if @action.enabled? && authorized?(:new, @abstract_model) %>
|
|
11
|
+
<button class="btn btn-info" data-disable-with="<%= t("admin.form.save_and_add_another") %>" name="_add_another" type="submit">
|
|
12
|
+
<%= t("admin.form.save_and_add_another") %>
|
|
13
|
+
</button>
|
|
14
|
+
<% end %>
|
|
15
|
+
<% if @action.enabled? && authorized?(:edit, @abstract_model) %>
|
|
16
|
+
<button class="btn btn-info" data-disable-with="<%= t("admin.form.save_and_edit") %>" name="_add_edit" type="submit"<%= ' disabled' unless @action.enabled? %>>
|
|
17
|
+
<%= t("admin.form.save_and_edit") %>
|
|
18
|
+
</button>
|
|
19
|
+
<% end %>
|
|
20
|
+
<button class="btn btn-light" data-disable-with="<%= t("admin.form.cancel") %>" formnovalidate="<%= true %>" name="_continue" type="submit">
|
|
21
|
+
<%= rails_admin_icon(:cancel) %>
|
|
22
|
+
<%= t("admin.form.cancel") %>
|
|
23
|
+
</button>
|
|
24
|
+
</span>
|
|
25
|
+
</div>
|
|
26
|
+
</div>
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
<h4>
|
|
2
|
+
<%= I18n.t('admin.form.bulk_delete') %>
|
|
3
|
+
</h4>
|
|
4
|
+
<ul>
|
|
5
|
+
<%= render partial: "delete_notice", collection: @objects %>
|
|
6
|
+
</ul>
|
|
7
|
+
<%= form_tag bulk_delete_path(model_name: @abstract_model.to_param, bulk_ids: @objects.map(&:id)), method: :delete do %>
|
|
8
|
+
<div class="form-actions">
|
|
9
|
+
<input name="return_to" type="<%= :hidden %>" value="<%= (params[:return_to].presence || request.referer) %>" />
|
|
10
|
+
<button class="btn btn-danger" data-disable-with="<%= t("admin.form.confirmation") %>" data-turbo-confirm="<%= t("admin.form.bulk_delete") %>" type="submit">
|
|
11
|
+
<%= rails_admin_icon(:check) %>
|
|
12
|
+
<%= t("admin.form.confirmation") %>
|
|
13
|
+
</button>
|
|
14
|
+
<button class="btn" data-disable-with="<%= t("admin.form.cancel") %>" name="_continue" type="submit">
|
|
15
|
+
<%= rails_admin_icon(:cancel) %>
|
|
16
|
+
<%= t("admin.form.cancel") %>
|
|
17
|
+
</button>
|
|
18
|
+
</div>
|
|
19
|
+
<% end %>
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
<% if @abstract_models %>
|
|
2
|
+
<table class="table table-condensed table-striped table-hover">
|
|
3
|
+
<thead>
|
|
4
|
+
<tr>
|
|
5
|
+
<th class="shrink model-name">
|
|
6
|
+
<%= t "admin.table_headers.model_name" %>
|
|
7
|
+
</th>
|
|
8
|
+
<th class="shrink last-created">
|
|
9
|
+
<%= t "admin.table_headers.last_created" %>
|
|
10
|
+
</th>
|
|
11
|
+
<th class="records">
|
|
12
|
+
<%= t "admin.table_headers.records" %>
|
|
13
|
+
</th>
|
|
14
|
+
<th class="shrink controls"></th>
|
|
15
|
+
</tr>
|
|
16
|
+
</thead>
|
|
17
|
+
<tbody class="table-group-divider">
|
|
18
|
+
<% @abstract_models.each do |abstract_model| %>
|
|
19
|
+
<% if authorized? :index, abstract_model %>
|
|
20
|
+
<% index_path = index_path(model_name: abstract_model.to_param) %>
|
|
21
|
+
<% row_class = "#{cycle("odd", "even")}#{" link" if index_path} #{abstract_model.param_key}_links" %>
|
|
22
|
+
<tr class="<%= row_class %>" data-link="<%= index_path %>">
|
|
23
|
+
<% last_created = @most_recent_created[abstract_model.model.name] %>
|
|
24
|
+
<% active = last_created.try(:today?) %>
|
|
25
|
+
<td>
|
|
26
|
+
<span class="show">
|
|
27
|
+
<%= link_to abstract_model.config.label_plural, index_path %>
|
|
28
|
+
</span>
|
|
29
|
+
</td>
|
|
30
|
+
<td>
|
|
31
|
+
<% if last_created %>
|
|
32
|
+
<%= t "admin.misc.time_ago", time: time_ago_in_words(last_created), default: "#{time_ago_in_words(last_created)} #{t("admin.misc.ago")}" %>
|
|
33
|
+
<% end %>
|
|
34
|
+
</td>
|
|
35
|
+
<td>
|
|
36
|
+
<% count = @count[abstract_model.model.name] %>
|
|
37
|
+
<% percent = count > 0 ? (@max <= 1 ? count : ((Math.log(count+1) * 100.0) / Math.log(@max+1)).to_i) : -1 %>
|
|
38
|
+
<div class="progress" style="margin-bottom:0px">
|
|
39
|
+
<div class="bg-<%= get_indicator(percent) %> progress-bar<%= ' progress-bar-striped progress-bar-animated' if active %>" style="width:<%= [2.0, percent].max.to_i %>%">
|
|
40
|
+
<%= @count[abstract_model.model.name] %>
|
|
41
|
+
</div>
|
|
42
|
+
</div>
|
|
43
|
+
</td>
|
|
44
|
+
<td class="links">
|
|
45
|
+
<ul class="nav d-inline list-inline">
|
|
46
|
+
<%= menu_for :collection, abstract_model, nil, true %>
|
|
47
|
+
</ul>
|
|
48
|
+
</td>
|
|
49
|
+
</tr>
|
|
50
|
+
<% end %>
|
|
51
|
+
<% end %>
|
|
52
|
+
</tbody>
|
|
53
|
+
</table>
|
|
54
|
+
<% end %>
|
|
55
|
+
<% if @history && authorized?(:history_index) %>
|
|
56
|
+
<div class="block" id="block-tables">
|
|
57
|
+
<div class="content">
|
|
58
|
+
<h2>
|
|
59
|
+
<%= t("admin.actions.history_index.menu") %>
|
|
60
|
+
</h2>
|
|
61
|
+
<%= render partial: 'rails_admin_next/main/dashboard_history' %>
|
|
62
|
+
</div>
|
|
63
|
+
</div>
|
|
64
|
+
<% end %>
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
<h4>
|
|
2
|
+
<%= t("admin.form.are_you_sure_you_want_to_delete_the_object", model_name: @abstract_model.pretty_name.downcase) %>
|
|
3
|
+
<q><strong><%= @model_config.with(object: @object).object_label %></strong></q>
|
|
4
|
+
<%= t("admin.form.all_of_the_following_related_items_will_be_deleted") %>
|
|
5
|
+
</h4>
|
|
6
|
+
<ul>
|
|
7
|
+
<%= render partial: "delete_notice", object: @object %>
|
|
8
|
+
</ul>
|
|
9
|
+
<%= form_for(@object, url: delete_path(model_name: @abstract_model.to_param, id: @object.id), html: {method: "delete"}) do %>
|
|
10
|
+
<input name="return_to" type="<%= :hidden %>" value="<%= (params[:return_to].presence || request.referer) %>" />
|
|
11
|
+
<div class="form-actions">
|
|
12
|
+
<button class="btn btn-danger" data-disable-with="<%= t("admin.form.confirmation") %>" data-turbo-confirm="<%= t("admin.form.are_you_sure_you_want_to_delete_the_object", model_name: @abstract_model.pretty_name.downcase) %>" type="submit">
|
|
13
|
+
<%= rails_admin_icon(:check) %>
|
|
14
|
+
<%= t("admin.form.confirmation") %>
|
|
15
|
+
</button>
|
|
16
|
+
<button class="btn" data-disable-with="<%= t("admin.form.cancel") %>" name="_continue" type="submit">
|
|
17
|
+
<%= rails_admin_icon(:cancel) %>
|
|
18
|
+
<%= t("admin.form.cancel") %>
|
|
19
|
+
</button>
|
|
20
|
+
</div>
|
|
21
|
+
<% end %>
|