Skip to content

Commit 1c2c180

Browse files
committed
feat: support for raw html fields
1 parent 5b5f4f2 commit 1c2c180

File tree

11 files changed

+104
-12
lines changed

11 files changed

+104
-12
lines changed

Makefile

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
specs:
22
RUBYOPT='-rbundler/setup -rrbs/test/setup' RBS_TEST_TARGET='TinyAdmin::*' bin/rspec
33

4-
console:
5-
bin/rails c
6-
74
server:
8-
bin/rails s
5+
bin/rails s -b 0.0.0.0 -p 4000
96

10-
seed:
11-
bin/rails db:migrate && bin/rails db:seed
7+
console:
8+
bin/rails c
129

1310
lint:
1411
bin/rubocop
12+
13+
seed:
14+
cd spec/dummy_rails && bin/rails db:reset

lib/tiny_admin/raw_html.rb

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# frozen_string_literal: true
2+
3+
module TinyAdmin
4+
class RawHtml
5+
attr_reader :to_s
6+
7+
def initialize(value)
8+
@to_s = value.to_s
9+
end
10+
end
11+
end

lib/tiny_admin/support.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33
module TinyAdmin
44
class Support
55
class << self
6+
def raw_html(value)
7+
TinyAdmin::RawHtml.new(value)
8+
end
9+
610
def call(value, options: [])
711
options.inject(value) { |result, message| result&.send(message) } if value && options&.any?
812
end

lib/tiny_admin/views/components/field_value.rb

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,25 @@ def view_template
1818
if field.options[:link_to]
1919
a(href: TinyAdmin.route_for(field.options[:link_to], reference: translated_value)) {
2020
span(class: value_class) {
21-
field.apply_call_option(record) || translated_value
21+
render_value(field.apply_call_option(record) || translated_value)
2222
}
2323
}
2424
else
2525
span(class: value_class) {
26-
translated_value
26+
render_value(translated_value)
2727
}
2828
end
2929
end
30+
31+
private
32+
33+
def render_value(val)
34+
if val.is_a?(TinyAdmin::RawHtml)
35+
unsafe_raw(val.to_s)
36+
else
37+
val
38+
end
39+
end
3040
end
3141
end
3242
end

spec/dummy_rails/app/models/author.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,12 @@ class Author < ApplicationRecord
3131
def to_s
3232
"#{name} (#{age})"
3333
end
34+
35+
def stats
36+
[
37+
"Posts: <b>#{posts.count}</b>",
38+
"Published: <b>#{published_posts.count}</b>",
39+
"Recent: <b>#{recent_posts.count}</b>"
40+
]
41+
end
3442
end

spec/dummy_rails/app/models/post.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ class Post < ApplicationRecord
1717
validates :title, allow_blank: false, presence: true
1818

1919
scope :published, -> { where(published: true) }
20-
scope :recents, -> { where('created_at > ?', Date.current - 8.months) }
20+
scope :recents, -> { where('created_at > ?', Time.current - 1.week) }
2121

2222
# # override a field - can be dangerous
2323
# def title
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,7 @@
11
class AdminHelper < TinyAdmin::Support
2+
class << self
3+
def multiline(array, options: [])
4+
raw_html array.join("<br/>")
5+
end
6+
end
27
end

spec/dummy_rails/config/tiny_admin.yml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,23 @@ sections:
4242
- id
4343
- name
4444
- email
45+
- field: stats
46+
header: Some stats
47+
method: multiline
48+
links:
49+
- show
50+
- sample_mem
51+
show:
52+
attributes:
53+
- id
54+
- name
55+
- email
56+
- age
57+
- field: stats
58+
header: Some stats
59+
method: multiline
60+
- created_at
61+
- updated_at
4562
links:
4663
- show
4764
- sample_mem

spec/features/plugins/authorization_spec.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,11 @@
77
let(:root_content) { "Latest authors\nLatest posts" }
88

99
around do |example|
10+
TinyAdmin.settings.load_settings
1011
prev_value = TinyAdmin.settings.authorization_class
1112
TinyAdmin.settings.authorization_class = some_class
1213
example.run
14+
ensure
1315
TinyAdmin.settings.authorization_class = prev_value
1416
end
1517

spec/lib/tiny_admin/settings_spec.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,12 @@
1010
around do |example|
1111
saved = settings.instance_variable_get(:@options)&.deep_dup
1212
saved_store = settings.instance_variable_get(:@store)
13+
saved_loaded = settings.instance_variable_get(:@loaded)
1314
example.run
1415
ensure
1516
settings.instance_variable_set(:@options, saved)
1617
settings.instance_variable_set(:@store, saved_store)
18+
settings.instance_variable_set(:@loaded, saved_loaded)
1719
end
1820

1921
describe "#reset!" do
@@ -49,7 +51,7 @@
4951
end
5052

5153
it "converts nested string class names to constants" do
52-
settings[:authentication] = { plugin: "TinyAdmin::Plugins::NoAuth" }
54+
settings[:authentication] = {plugin: "TinyAdmin::Plugins::NoAuth"}
5355
expect(settings[:authentication, :plugin]).to eq(TinyAdmin::Plugins::NoAuth)
5456
end
5557

0 commit comments

Comments
 (0)