madmin 1.2.5 → 1.2.7

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ea857d0e707bca79172d1bcbecb72cfb939724279ab3f2c08546ff279fd38d03
4
- data.tar.gz: c886c8ad0c5d0a11c81f1aecf45463e29205e9bf29dfe00fae4fc94466988ee0
3
+ metadata.gz: 8cd4e0b3d14780dd13db0a21a57a63e750a750298ea78cc93ec5eb327b1714e7
4
+ data.tar.gz: 92f273ea140b603a887660b36802de9e6c0021a56cbeeb49cef5318696ae7bf6
5
5
  SHA512:
6
- metadata.gz: 65e7522be423638030455299a70bfdd21cc706e75a5b6624f7a41f869250517474b00dd514551914e86bb3b7e7dac31aa812826461a634649caba8456b73f5c8
7
- data.tar.gz: faea74829b0c7e307960dcbe006986f51c064e147c00b17f1234bfc6b72246511c1d206d4891fd773f3f97ea05b96a87dbcdd3e9b709aac1141407a580529b26
6
+ metadata.gz: 677c4da0f37a96e2515584a02e6d0c941d59fae91b43a15e19386a723d1bdeb6a4e47db8bdc987c59e59c1b75ae2f507d055603a8a996dc5c45b3731d95aac13
7
+ data.tar.gz: b06f7fa04b747a761f956fccaa81e9f4535757db2276427e0cbda7a63d901295c9e275faf22a9753459290d530808f6b118806813e7858aeada501b3cb220cbf
data/README.md CHANGED
@@ -73,6 +73,23 @@ rails g madmin:views:index
73
73
  # -> app/views/madmin/application/index.html.erb
74
74
  ```
75
75
 
76
+ You might want to make some of your model's attributes visible in some views but invisible in others.
77
+ The `attribute` method in model_resource.rb gives you that flexibility.
78
+
79
+ ```bash
80
+ # -> app/madmin/resources/book_resource.rb
81
+ ```
82
+ ```ruby
83
+ class UserResource < Madmin::Resource
84
+ attribute :id, form: false
85
+ attribute :tile
86
+ attribute :subtitle, index: false
87
+ attribute :author
88
+ attribute :genre
89
+ attribute :pages, show: false
90
+ end
91
+ ```
92
+
76
93
  You can also scope the copied view(s) to a specific Resource/Model:
77
94
  ```bash
78
95
  rails generate madmin:views:index Book
@@ -1,5 +1,5 @@
1
1
  module Madmin
2
- class DashboardController < ApplicationController
2
+ class DashboardController < Madmin::ApplicationController
3
3
  def show
4
4
  end
5
5
  end
@@ -15,7 +15,7 @@ module Madmin
15
15
  end
16
16
 
17
17
  def clear_search_params
18
- params.except(:q, :_page).permit(:page, :sort, :direction)
18
+ resource.index_path(params.permit(:sort, :direction))
19
19
  end
20
20
  end
21
21
  end
@@ -4,7 +4,7 @@ module Madmin
4
4
  matching_column = (column.to_s == sort_column)
5
5
  direction = sort_direction == "asc" ? "desc" : "asc"
6
6
 
7
- link_to request.params.merge(sort: column, direction: direction), options do
7
+ link_to resource.index_path(sort: column, direction: direction), options do
8
8
  concat title
9
9
  if matching_column
10
10
  concat " "
@@ -7,9 +7,7 @@
7
7
  <title>
8
8
  Madmin: <%= Rails.application.class %>
9
9
  </title>
10
- <link href="https://unpkg.com/@tailwindcss/forms/dist/forms.min.css" rel="stylesheet" />
11
- <link href="https://unpkg.com/tailwindcss@^2.0/dist/tailwind.min.css" rel="stylesheet" />
12
- <link href="https://unpkg.com/@tailwindcss/typography/dist/typography.min.css" rel="stylesheet" />
10
+
13
11
  <%= csrf_meta_tags %>
14
12
 
15
13
  <%= render "javascript" %>
@@ -1,28 +1,44 @@
1
+ <script src="https://cdn.tailwindcss.com?plugins=forms,typography,aspect-ratio,line-clamp"></script>
1
2
  <%= stylesheet_link_tag "https://unpkg.com/flatpickr/dist/flatpickr.min.css", "data-turbo-track": "reload" %>
2
3
  <%= stylesheet_link_tag "https://unpkg.com/trix/dist/trix.css", "data-turbo-track": "reload" %>
3
4
  <%= stylesheet_link_tag "https://unpkg.com/tom-select/dist/css/tom-select.min.css", "data-turbo-track": "reload" %>
4
5
 
5
- <script type="module">
6
- import { Application, Controller } from 'https://cdn.skypack.dev/@hotwired/stimulus'
7
- const application = Application.start()
6
+ <script type="importmap" data-turbo-track="reload">
7
+ {
8
+ "imports": {
9
+ "@hotwired/stimulus": "https://unpkg.com/@hotwired/stimulus/dist/stimulus.js",
10
+ "@hotwired/turbo": "https://unpkg.com/@hotwired/turbo",
11
+ "@hotwired/turbo-rails": "https://unpkg.com/@hotwired/turbo-rails",
12
+ "@rails/actiontext": "https://unpkg.com/@rails/actiontext@<%= npm_rails_version %>/app/assets/javascripts/actiontext.js",
13
+ "@rails/activestorage": "https://unpkg.com/@rails/activestorage@<%= npm_rails_version %>/app/assets/javascripts/activestorage.esm.js",
14
+ "flatpickr": "https://unpkg.com/flatpickr/dist/esm/index.js",
15
+ "stimulus-flatpickr": "https://unpkg.com/stimulus-flatpickr@3.0.0-0/dist/index.m.js",
16
+ "tailwindcss-stimulus-components": "https://unpkg.com/tailwindcss-stimulus-components/dist/tailwindcss-stimulus-components.modern.js",
17
+ "tom-select": "https://unpkg.com/tom-select/dist/esm/tom-select.complete.js",
18
+ "trix": "https://unpkg.com/trix"
19
+ }
20
+ }
21
+ </script>
22
+ <script async src="https://unpkg.com/es-module-shims/dist/es-module-shims.js"></script>
8
23
 
9
- import { Dropdown } from "https://cdn.skypack.dev/tailwindcss-stimulus-components"
10
- application.register("dropdown", Dropdown)
24
+ <script type="module">
25
+ import * as Turbo from "@hotwired/turbo-rails"
11
26
 
12
- import stimulusFlatpickr from 'https://cdn.skypack.dev/stimulus-flatpickr'
13
- application.register("flatpickr", stimulusFlatpickr)
27
+ import * as ActiveStorage from "@rails/activestorage"
28
+ ActiveStorage.start()
29
+ import "trix"
30
+ import "@rails/actiontext"
14
31
 
15
- import TomSelect from 'https://cdn.skypack.dev/tom-select'
32
+ import { Application, Controller } from '@hotwired/stimulus'
33
+ const application = Application.start()
16
34
 
17
- import Rails from 'https://cdn.skypack.dev/@rails/ujs@<%= npm_rails_version %>'
18
- import * as ActiveStorage from 'https://cdn.skypack.dev/@rails/activestorage@<%= npm_rails_version %>'
19
- import 'https://cdn.skypack.dev/trix'
20
- import 'https://cdn.skypack.dev/@rails/actiontext@<%= npm_rails_version %>'
35
+ import { Dropdown } from "tailwindcss-stimulus-components"
36
+ application.register("dropdown", Dropdown)
21
37
 
22
- if (!window._rails_loaded) { Rails.start() }
23
- ActiveStorage.start()
38
+ import StimulusFlatpickr from "stimulus-flatpickr"
39
+ application.register("flatpickr", StimulusFlatpickr)
24
40
 
25
- import * as Turbo from "https://cdn.skypack.dev/@hotwired/turbo"
41
+ import TomSelect from "tom-select"
26
42
 
27
43
  (() => {
28
44
  application.register('select', class extends Controller {
@@ -38,7 +54,8 @@
38
54
  labelField: 'name',
39
55
  searchField: 'name',
40
56
  load: (search, callback) => {
41
- fetch(this.urlValue)
57
+ let url = search ? `${this.urlValue}?q=${search}` : this.urlValue;
58
+ fetch(url)
42
59
  .then(response => response.json())
43
60
  .then(json => {
44
61
  callback(json);
@@ -59,4 +59,4 @@
59
59
  </tbody>
60
60
  </table>
61
61
  </div>
62
- <%== pagy_nav(@pagy) if @pagy.pages > 1 %>
62
+ <%== render(partial: 'madmin/pagy/nav', locals: { pagy: @pagy }) if @pagy.pages > 1 %>
@@ -9,7 +9,7 @@
9
9
  <div class="mr-2">
10
10
  <%= link_to "Edit", resource.edit_path(@record), class: "block bg-white hover:bg-gray-100 text-gray-800 font-semibold py-2 px-4 border border-gray-400 rounded shadow" %>
11
11
  </div>
12
- <%= button_to "Delete", resource.show_path(@record), method: :delete, data: { confirm: "Are you sure?" }, class: "bg-white hover:bg-gray-100 text-red-500 font-semibold py-2 px-4 border border-red-500 rounded shadow pointer-cursor" %>
12
+ <%= button_to "Delete", resource.show_path(@record), method: :delete, data: { turbo_confirm: "Are you sure?" }, class: "bg-white hover:bg-gray-100 text-red-500 font-semibold py-2 px-4 border border-red-500 rounded shadow pointer-cursor" %>
13
13
  </div>
14
14
  </div>
15
15
 
@@ -1,3 +1,3 @@
1
1
  <% if (attachment = field.value(record)) && attachment.attached? %>
2
- <%= link_to attachment.filename, attachment, target: :_blank %>
2
+ <%= link_to attachment.filename, main_app.url_for(attachment), target: :_blank %>
3
3
  <% end %>
@@ -1,9 +1,9 @@
1
1
  <% if (attachment = field.value(record)) && attachment.attached? %>
2
2
  <% if attachment.variable? %>
3
- <%= link_to attachment, target: :_blank do %>
4
- <%= image_tag attachment, class: "max-h-32" %>
3
+ <%= link_to main_app.url_for(attachment), target: :_blank do %>
4
+ <%= image_tag main_app.url_for(attachment), class: "max-h-32" %>
5
5
  <% end %>
6
6
  <% else %>
7
- <%= link_to attachment.filename, attachment, target: :_blank, class: "text-indigo-500 underline" %>
7
+ <%= link_to attachment.filename, main_app.url_for(attachment), target: :_blank, class: "text-indigo-500 underline" %>
8
8
  <% end %>
9
- <% end %>
9
+ <% end %>
@@ -1,11 +1,11 @@
1
1
  <% if (attachments = field.value(record)) && attachments.attached? %>
2
2
  <% attachments.each do |attachment| %>
3
3
  <% if attachment.variable? %>
4
- <%= link_to attachment, target: :_blank do %>
5
- <%= image_tag attachment, class: "max-h-32" %>
4
+ <%= link_to main_app.url_for(attachment), target: :_blank do %>
5
+ <%= image_tag main_app.url_for(attachment), class: "max-h-32" %>
6
6
  <% end %>
7
7
  <% else %>
8
- <%= link_to attachment.filename, attachment, target: :_blank, class: "text-indigo-500 underline" %>
8
+ <%= link_to attachment.filename, main_app.url_for(attachment), target: :_blank, class: "text-indigo-500 underline" %>
9
9
  <% end %>
10
10
  <% end %>
11
11
  <% end %>
@@ -1 +1 @@
1
- <%= truncate field.value(record) %>
1
+ <%= truncate field.value(record).to_s %>
@@ -0,0 +1,20 @@
1
+ <%#
2
+ This template is i18n-ready: if you don't use i18n, then you can replace the pagy_t
3
+ calls with the actual strings ("&lsaquo; Prev", "Next &rsaquo;", "&hellip;").
4
+ The link variable is set to a proc that returns the link tag.
5
+ Usage: link.call( page_number [, text [, extra_attributes_string ]])
6
+ -%>
7
+ <% link = pagy_link_proc(pagy) -%>
8
+ <%# -%><nav aria-label="pager" class="space-x-1 px-2 py-1" role="navigation">
9
+ <% if pagy.prev -%> <span><%== link.call(pagy.prev, pagy_t('pagy.nav.prev'), 'aria-label="previous" class="text-white bg-indigo-500 rounded-2xl px-3 py-1.5"') %></span>
10
+ <% else -%> <span class="text-gray-400 bg-gray-100 rounded-2xl px-3 py-1.5 cursor-not-allowed"><%== pagy_t('pagy.nav.prev') %></span>
11
+ <% end -%>
12
+ <% pagy.series.each do |item| # series example: [1, :gap, 7, 8, "9", 10, 11, :gap, 36] -%>
13
+ <% if item.is_a?(Integer) -%> <span><%== link.call(item, item, 'class="text-gray-400 rounded-full px-2.5 py-1.5 hover:bg-indigo-200 hover:text-indigo-500"') %></span>
14
+ <% elsif item.is_a?(String) -%> <span class="text-indigo-500 font-semibold px-2.5 py-1.5"><%= item %></span>
15
+ <% elsif item == :gap -%> <span class="text-gray-400 text-xl px-1.5 py-1.5"><%== pagy_t('pagy.nav.gap') %></span>
16
+ <% end -%>
17
+ <% end -%>
18
+ <% if pagy.next -%> <span><%== link.call(pagy.next, pagy_t('pagy.nav.next'), 'aria-label="next" class="text-white bg-indigo-500 rounded-2xl px-3 py-1.5"') %></span>
19
+ <% else -%> <span class="text-gray-400 bg-gray-100 rounded-2xl px-3 py-1.5 cursor-not-allowed"><%== pagy_t('pagy.nav.next') %></span>
20
+ <% end -%>
@@ -1,2 +1,4 @@
1
- <%= form.label field.attribute_name, class: "inline-block w-32 flex-shrink-0" %>
1
+ <div class="block md:inline-block md:w-32 flex-shrink-0 text-gray-700">
2
+ <%= render "madmin/shared/label", form: form, field: field %>
3
+ </div>
2
4
  <%= form.text_field field.attribute_name, class: "form-input" %>
data/lib/madmin/engine.rb CHANGED
@@ -1,8 +1,10 @@
1
1
  module Madmin
2
2
  class Engine < ::Rails::Engine
3
+ isolate_namespace Madmin
4
+
3
5
  config.before_configuration do |app|
4
- app.config.autoload_paths << File.expand_path("app/madmin/resources", Rails.root)
5
- app.config.autoload_paths << File.expand_path("app/madmin/fields", Rails.root)
6
+ app.config.eager_load_paths << File.expand_path("app/madmin/resources", Rails.root)
7
+ app.config.eager_load_paths << File.expand_path("app/madmin/fields", Rails.root)
6
8
  end
7
9
 
8
10
  config.to_prepare do
@@ -3,7 +3,7 @@ module Madmin
3
3
  class NestedHasMany < Field
4
4
  DEFAULT_ATTRIBUTES = %w[_destroy id].freeze
5
5
  def nested_attributes
6
- resource.attributes.reject { |name, attribute| skipped_fields.include?(name) }
6
+ resource.attributes.except(*skipped_fields)
7
7
  end
8
8
 
9
9
  def resource
@@ -55,7 +55,7 @@ module Madmin
55
55
  end
56
56
 
57
57
  def friendly_name
58
- model_name.gsub("::", " / ")
58
+ model_name.gsub("::", " / ").split(/(?=[A-Z])/).join(" ")
59
59
  end
60
60
 
61
61
  # Support for isolated namespaces
@@ -89,7 +89,7 @@ module Madmin
89
89
  end
90
90
 
91
91
  def permitted_params
92
- attributes.values.filter_map { |a| a.field.to_param if a.field.visible?(:form) }
92
+ attributes.values.filter { |a| a.field.visible?(:form) }.map { |a| a.field.to_param }
93
93
  end
94
94
 
95
95
  def display_name(record)
@@ -129,6 +129,7 @@ module Madmin
129
129
  text: Fields::Text,
130
130
  time: Fields::Time,
131
131
  timestamp: Fields::Time,
132
+ timestamptz: Fields::Time,
132
133
  password: Fields::Password,
133
134
  file: Fields::File,
134
135
 
@@ -1,3 +1,3 @@
1
1
  module Madmin
2
- VERSION = "1.2.5"
2
+ VERSION = "1.2.7"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: madmin
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.5
4
+ version: 1.2.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Oliver
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2021-09-25 00:00:00.000000000 Z
12
+ date: 2022-09-30 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
@@ -34,7 +34,7 @@ dependencies:
34
34
  version: '3.5'
35
35
  - - "<"
36
36
  - !ruby/object:Gem::Version
37
- version: '5.0'
37
+ version: '6.0'
38
38
  type: :runtime
39
39
  prerelease: false
40
40
  version_requirements: !ruby/object:Gem::Requirement
@@ -44,7 +44,7 @@ dependencies:
44
44
  version: '3.5'
45
45
  - - "<"
46
46
  - !ruby/object:Gem::Version
47
- version: '5.0'
47
+ version: '6.0'
48
48
  description: It's an admin, obviously.
49
49
  email:
50
50
  - excid3@gmail.com
@@ -139,6 +139,7 @@ files:
139
139
  - app/views/madmin/fields/time/_form.html.erb
140
140
  - app/views/madmin/fields/time/_index.html.erb
141
141
  - app/views/madmin/fields/time/_show.html.erb
142
+ - app/views/madmin/pagy/_nav.html.erb
142
143
  - app/views/madmin/shared/_label.html.erb
143
144
  - lib/generators/madmin/field/field_generator.rb
144
145
  - lib/generators/madmin/field/templates/_form.html.erb
@@ -211,7 +212,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
211
212
  - !ruby/object:Gem::Version
212
213
  version: '0'
213
214
  requirements: []
214
- rubygems_version: 3.2.22
215
+ rubygems_version: 3.3.7
215
216
  signing_key:
216
217
  specification_version: 4
217
218
  summary: A modern admin for Ruby on Rails apps