madmin 1.2.6 → 1.2.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +17 -0
- data/app/helpers/madmin/application_helper.rb +1 -1
- data/app/helpers/madmin/sort_helper.rb +2 -2
- data/app/views/layouts/madmin/application.html.erb +1 -3
- data/app/views/madmin/application/_javascript.html.erb +31 -15
- data/app/views/madmin/application/index.html.erb +1 -1
- data/app/views/madmin/application/show.html.erb +6 -5
- data/app/views/madmin/pagy/_nav.html.erb +20 -0
- data/lib/madmin/fields/nested_has_many.rb +1 -1
- data/lib/madmin/resource.rb +7 -0
- data/lib/madmin/version.rb +1 -1
- metadata +4 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 452ba760d0701d79257b2f0ef4282a785dd3bc3e5380802c75220a6e7e8d3113
|
4
|
+
data.tar.gz: af23fac79122683d21c97866a355b2ebb373f7353610a46e8b83f25504a7e9b2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0e37320de16647c286f7551e819f290bd040862ba0b209f8ee0a57971c76ee2988fa149a889e6bb366e5fe212eb98c93f101cb010ac65af34f64a9144ec34800
|
7
|
+
data.tar.gz: 0ff60d8bca0aeb06769542e1d550ed468cad26213ab04259335dbec5e61e03890fc253babb78ac09358c15345f6c98d7b1fc55acaf77fe2115939b93d0d7005c
|
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
|
@@ -2,13 +2,13 @@ module Madmin
|
|
2
2
|
module SortHelper
|
3
3
|
def sortable(column, title, options = {})
|
4
4
|
matching_column = (column.to_s == sort_column)
|
5
|
-
direction = sort_direction == "asc" ? "desc" : "asc"
|
5
|
+
direction = (sort_direction == "asc") ? "desc" : "asc"
|
6
6
|
|
7
7
|
link_to resource.index_path(sort: column, direction: direction), options do
|
8
8
|
concat title
|
9
9
|
if matching_column
|
10
10
|
concat " "
|
11
|
-
concat tag.i(sort_direction == "asc" ? "▲" : "▼")
|
11
|
+
concat tag.i((sort_direction == "asc") ? "▲" : "▼")
|
12
12
|
end
|
13
13
|
end
|
14
14
|
end
|
@@ -7,9 +7,7 @@
|
|
7
7
|
<title>
|
8
8
|
Madmin: <%= Rails.application.class %>
|
9
9
|
</title>
|
10
|
-
|
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="
|
6
|
-
|
7
|
-
|
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
|
-
|
10
|
-
|
24
|
+
<script type="module">
|
25
|
+
import * as Turbo from "@hotwired/turbo-rails"
|
11
26
|
|
12
|
-
import
|
13
|
-
|
27
|
+
import * as ActiveStorage from "@rails/activestorage"
|
28
|
+
ActiveStorage.start()
|
29
|
+
import "trix"
|
30
|
+
import "@rails/actiontext"
|
14
31
|
|
15
|
-
import
|
32
|
+
import { Application, Controller } from '@hotwired/stimulus'
|
33
|
+
const application = Application.start()
|
16
34
|
|
17
|
-
import
|
18
|
-
|
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
|
-
|
23
|
-
|
38
|
+
import StimulusFlatpickr from "stimulus-flatpickr"
|
39
|
+
application.register("flatpickr", StimulusFlatpickr)
|
24
40
|
|
25
|
-
import
|
41
|
+
import TomSelect from "tom-select"
|
26
42
|
|
27
43
|
(() => {
|
28
44
|
application.register('select', class extends Controller {
|
@@ -5,11 +5,12 @@
|
|
5
5
|
<%= link_to resource.display_name(@record), resource.show_path(@record), class: "text-indigo-500 font-bold" %>
|
6
6
|
</h1>
|
7
7
|
|
8
|
-
<div class="flex items-center px-4">
|
9
|
-
|
10
|
-
<%=
|
11
|
-
|
12
|
-
<%=
|
8
|
+
<div class="flex gap-2 items-center px-4">
|
9
|
+
<% resource.member_actions.each do |action| %>
|
10
|
+
<%= instance_eval &action %>
|
11
|
+
<% end %>
|
12
|
+
<%= 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" %>
|
13
|
+
<%= 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
14
|
</div>
|
14
15
|
</div>
|
15
16
|
|
@@ -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 ("‹ Prev", "Next ›", "…").
|
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 -%>
|
data/lib/madmin/resource.rb
CHANGED
@@ -1,11 +1,13 @@
|
|
1
1
|
module Madmin
|
2
2
|
class Resource
|
3
3
|
class_attribute :attributes, default: ActiveSupport::OrderedHash.new
|
4
|
+
class_attribute :member_actions, default: []
|
4
5
|
class_attribute :scopes, default: []
|
5
6
|
|
6
7
|
class << self
|
7
8
|
def inherited(base)
|
8
9
|
base.attributes = attributes.dup
|
10
|
+
base.member_actions = scopes.dup
|
9
11
|
base.scopes = scopes.dup
|
10
12
|
super
|
11
13
|
end
|
@@ -108,6 +110,10 @@ module Madmin
|
|
108
110
|
attributes.values.select { |a| a.field.searchable? }
|
109
111
|
end
|
110
112
|
|
113
|
+
def member_action(&block)
|
114
|
+
member_actions << block
|
115
|
+
end
|
116
|
+
|
111
117
|
private
|
112
118
|
|
113
119
|
def field_for_type(type)
|
@@ -129,6 +135,7 @@ module Madmin
|
|
129
135
|
text: Fields::Text,
|
130
136
|
time: Fields::Time,
|
131
137
|
timestamp: Fields::Time,
|
138
|
+
timestamptz: Fields::Time,
|
132
139
|
password: Fields::Password,
|
133
140
|
file: Fields::File,
|
134
141
|
|
data/lib/madmin/version.rb
CHANGED
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.
|
4
|
+
version: 1.2.8
|
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:
|
12
|
+
date: 2023-05-10 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
@@ -32,9 +32,6 @@ dependencies:
|
|
32
32
|
- - ">="
|
33
33
|
- !ruby/object:Gem::Version
|
34
34
|
version: '3.5'
|
35
|
-
- - "<"
|
36
|
-
- !ruby/object:Gem::Version
|
37
|
-
version: '6.0'
|
38
35
|
type: :runtime
|
39
36
|
prerelease: false
|
40
37
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -42,9 +39,6 @@ dependencies:
|
|
42
39
|
- - ">="
|
43
40
|
- !ruby/object:Gem::Version
|
44
41
|
version: '3.5'
|
45
|
-
- - "<"
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '6.0'
|
48
42
|
description: It's an admin, obviously.
|
49
43
|
email:
|
50
44
|
- excid3@gmail.com
|
@@ -139,6 +133,7 @@ files:
|
|
139
133
|
- app/views/madmin/fields/time/_form.html.erb
|
140
134
|
- app/views/madmin/fields/time/_index.html.erb
|
141
135
|
- app/views/madmin/fields/time/_show.html.erb
|
136
|
+
- app/views/madmin/pagy/_nav.html.erb
|
142
137
|
- app/views/madmin/shared/_label.html.erb
|
143
138
|
- lib/generators/madmin/field/field_generator.rb
|
144
139
|
- lib/generators/madmin/field/templates/_form.html.erb
|
@@ -211,7 +206,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
211
206
|
- !ruby/object:Gem::Version
|
212
207
|
version: '0'
|
213
208
|
requirements: []
|
214
|
-
rubygems_version: 3.
|
209
|
+
rubygems_version: 3.4.12
|
215
210
|
signing_key:
|
216
211
|
specification_version: 4
|
217
212
|
summary: A modern admin for Ruby on Rails apps
|