admin_suite 0.1.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.
Files changed (128) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +10 -0
  3. data/Gemfile +13 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +7 -0
  6. data/Rakefile +11 -0
  7. data/app/assets/admin_suite.css +444 -0
  8. data/app/assets/admin_suite_tailwind.css +8 -0
  9. data/app/assets/builds/admin_suite_tailwind.css +8 -0
  10. data/app/assets/rouge.css +218 -0
  11. data/app/assets/tailwind/admin_suite.css +22 -0
  12. data/app/controllers/admin_suite/application_controller.rb +118 -0
  13. data/app/controllers/admin_suite/dashboard_controller.rb +258 -0
  14. data/app/controllers/admin_suite/docs_controller.rb +155 -0
  15. data/app/controllers/admin_suite/portals_controller.rb +22 -0
  16. data/app/controllers/admin_suite/resources_controller.rb +238 -0
  17. data/app/helpers/admin_suite/base_helper.rb +1199 -0
  18. data/app/helpers/admin_suite/icon_helper.rb +61 -0
  19. data/app/helpers/admin_suite/panels_helper.rb +52 -0
  20. data/app/helpers/admin_suite/resources_helper.rb +15 -0
  21. data/app/helpers/admin_suite/theme_helper.rb +99 -0
  22. data/app/javascript/controllers/admin_suite/click_actions_controller.js +73 -0
  23. data/app/javascript/controllers/admin_suite/clipboard_controller.js +57 -0
  24. data/app/javascript/controllers/admin_suite/code_editor_controller.js +45 -0
  25. data/app/javascript/controllers/admin_suite/file_upload_controller.js +238 -0
  26. data/app/javascript/controllers/admin_suite/json_editor_controller.js +62 -0
  27. data/app/javascript/controllers/admin_suite/live_filter_controller.js +71 -0
  28. data/app/javascript/controllers/admin_suite/markdown_editor_controller.js +67 -0
  29. data/app/javascript/controllers/admin_suite/searchable_select_controller.js +171 -0
  30. data/app/javascript/controllers/admin_suite/sidebar_controller.js +33 -0
  31. data/app/javascript/controllers/admin_suite/tag_select_controller.js +193 -0
  32. data/app/javascript/controllers/admin_suite/toggle_switch_controller.js +66 -0
  33. data/app/views/admin_suite/dashboard/index.html.erb +21 -0
  34. data/app/views/admin_suite/docs/index.html.erb +86 -0
  35. data/app/views/admin_suite/panels/_cards.html.erb +107 -0
  36. data/app/views/admin_suite/panels/_chart.html.erb +47 -0
  37. data/app/views/admin_suite/panels/_health.html.erb +44 -0
  38. data/app/views/admin_suite/panels/_recent.html.erb +56 -0
  39. data/app/views/admin_suite/panels/_stat.html.erb +64 -0
  40. data/app/views/admin_suite/panels/_table.html.erb +36 -0
  41. data/app/views/admin_suite/portals/show.html.erb +75 -0
  42. data/app/views/admin_suite/resources/_form.html.erb +32 -0
  43. data/app/views/admin_suite/resources/edit.html.erb +24 -0
  44. data/app/views/admin_suite/resources/index.html.erb +315 -0
  45. data/app/views/admin_suite/resources/new.html.erb +22 -0
  46. data/app/views/admin_suite/resources/show.html.erb +184 -0
  47. data/app/views/admin_suite/shared/_flash.html.erb +30 -0
  48. data/app/views/admin_suite/shared/_form.html.erb +60 -0
  49. data/app/views/admin_suite/shared/_json_editor_field.html.erb +52 -0
  50. data/app/views/admin_suite/shared/_sidebar.html.erb +94 -0
  51. data/app/views/admin_suite/shared/_toggle_cell.html.erb +34 -0
  52. data/app/views/admin_suite/shared/_topbar.html.erb +47 -0
  53. data/app/views/layouts/admin_suite/application.html.erb +79 -0
  54. data/lib/admin/base/action_executor.rb +155 -0
  55. data/lib/admin/base/action_handler.rb +31 -0
  56. data/lib/admin/base/filter_builder.rb +121 -0
  57. data/lib/admin/base/resource.rb +541 -0
  58. data/lib/admin_suite/configuration.rb +42 -0
  59. data/lib/admin_suite/engine.rb +101 -0
  60. data/lib/admin_suite/markdown_renderer.rb +115 -0
  61. data/lib/admin_suite/portal_definition.rb +64 -0
  62. data/lib/admin_suite/portal_registry.rb +32 -0
  63. data/lib/admin_suite/theme_palette.rb +36 -0
  64. data/lib/admin_suite/ui/dashboard_definition.rb +69 -0
  65. data/lib/admin_suite/ui/field_renderer_registry.rb +119 -0
  66. data/lib/admin_suite/ui/form_field_renderer.rb +48 -0
  67. data/lib/admin_suite/ui/show_formatter_registry.rb +120 -0
  68. data/lib/admin_suite/ui/show_value_formatter.rb +70 -0
  69. data/lib/admin_suite/version.rb +10 -0
  70. data/lib/admin_suite.rb +54 -0
  71. data/lib/generators/admin_suite/install/install_generator.rb +23 -0
  72. data/lib/generators/admin_suite/install/templates/admin_suite.rb +60 -0
  73. data/lib/generators/admin_suite/resource/resource_generator.rb +83 -0
  74. data/lib/generators/admin_suite/resource/templates/resource.rb.tt +47 -0
  75. data/lib/generators/admin_suite/scaffold/scaffold_generator.rb +28 -0
  76. data/lib/tasks/admin_suite_tailwind.rake +28 -0
  77. data/lib/tasks/admin_suite_test.rake +11 -0
  78. data/test/dummy/Gemfile +21 -0
  79. data/test/dummy/README.md +24 -0
  80. data/test/dummy/Rakefile +6 -0
  81. data/test/dummy/app/assets/stylesheets/application.css +10 -0
  82. data/test/dummy/app/controllers/application_controller.rb +4 -0
  83. data/test/dummy/app/helpers/application_helper.rb +2 -0
  84. data/test/dummy/app/models/application_record.rb +2 -0
  85. data/test/dummy/app/views/layouts/application.html.erb +28 -0
  86. data/test/dummy/app/views/pwa/manifest.json.erb +22 -0
  87. data/test/dummy/app/views/pwa/service-worker.js +26 -0
  88. data/test/dummy/bin/ci +6 -0
  89. data/test/dummy/bin/dev +2 -0
  90. data/test/dummy/bin/rails +4 -0
  91. data/test/dummy/bin/rake +4 -0
  92. data/test/dummy/bin/setup +35 -0
  93. data/test/dummy/config/application.rb +43 -0
  94. data/test/dummy/config/boot.rb +3 -0
  95. data/test/dummy/config/ci.rb +19 -0
  96. data/test/dummy/config/database.yml +31 -0
  97. data/test/dummy/config/environment.rb +5 -0
  98. data/test/dummy/config/environments/development.rb +57 -0
  99. data/test/dummy/config/environments/production.rb +67 -0
  100. data/test/dummy/config/environments/test.rb +42 -0
  101. data/test/dummy/config/initializers/assets.rb +7 -0
  102. data/test/dummy/config/initializers/content_security_policy.rb +29 -0
  103. data/test/dummy/config/initializers/filter_parameter_logging.rb +8 -0
  104. data/test/dummy/config/initializers/inflections.rb +16 -0
  105. data/test/dummy/config/locales/en.yml +31 -0
  106. data/test/dummy/config/puma.rb +39 -0
  107. data/test/dummy/config/routes.rb +16 -0
  108. data/test/dummy/config.ru +6 -0
  109. data/test/dummy/db/seeds.rb +9 -0
  110. data/test/dummy/log/test.log +441 -0
  111. data/test/dummy/public/400.html +135 -0
  112. data/test/dummy/public/404.html +135 -0
  113. data/test/dummy/public/406-unsupported-browser.html +135 -0
  114. data/test/dummy/public/422.html +135 -0
  115. data/test/dummy/public/500.html +135 -0
  116. data/test/dummy/public/icon.png +0 -0
  117. data/test/dummy/public/icon.svg +3 -0
  118. data/test/dummy/public/robots.txt +1 -0
  119. data/test/dummy/test/test_helper.rb +15 -0
  120. data/test/dummy/tmp/local_secret.txt +1 -0
  121. data/test/fixtures/docs/progress/PROGRESS_REPORT.md +6 -0
  122. data/test/integration/dashboard_test.rb +13 -0
  123. data/test/integration/docs_test.rb +46 -0
  124. data/test/integration/theme_test.rb +27 -0
  125. data/test/lib/markdown_renderer_test.rb +20 -0
  126. data/test/lib/theme_palette_test.rb +24 -0
  127. data/test/test_helper.rb +11 -0
  128. metadata +264 -0
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
4
+
5
+ module AdminSuite
6
+ class ThemeTest < ActionDispatch::IntegrationTest
7
+ test "layout includes scoped theme variables" do
8
+ old = AdminSuite.config.theme
9
+ AdminSuite.config.theme = { primary: :indigo, secondary: :purple }
10
+
11
+ get "/internal/admin_suite"
12
+ assert_response :success
13
+
14
+ # Theme variables are injected by `admin_suite_theme_style_tag`.
15
+ assert_includes response.body, "--admin-suite-primary:"
16
+ assert_includes response.body, "--admin-suite-sidebar-from:"
17
+ ensure
18
+ AdminSuite.config.theme = old
19
+ end
20
+
21
+ test "body is scoped with admin-suite class" do
22
+ get "/internal/admin_suite"
23
+ assert_response :success
24
+ assert_match(/<body[^>]*class=\"[^\"]*admin-suite[^\"]*\"/i, response.body)
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
4
+
5
+ module AdminSuite
6
+ class MarkdownRendererTest < ActiveSupport::TestCase
7
+ test "renders html and extracts toc from headings" do
8
+ md = <<~MD
9
+ ## Section
10
+
11
+ Hello world
12
+ MD
13
+
14
+ result = AdminSuite::MarkdownRenderer.new(md).render
15
+ assert_includes result[:html].to_s, "<h2"
16
+ assert_equal 1, result[:reading_time_minutes]
17
+ assert_equal [ { level: 2, id: "section", text: "Section" } ], result[:toc]
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
4
+
5
+ module AdminSuite
6
+ class ThemePaletteTest < ActiveSupport::TestCase
7
+ test "resolve returns hex for known palette entries" do
8
+ assert_equal "#4f46e5", AdminSuite::ThemePalette.resolve("indigo", 600)
9
+ assert_equal "#581c87", AdminSuite::ThemePalette.resolve("purple", 900)
10
+ end
11
+
12
+ test "resolve returns fallback for unknown color/shade" do
13
+ assert_equal "#000000", AdminSuite::ThemePalette.resolve("unknown", 600, fallback: "#000000")
14
+ assert_nil AdminSuite::ThemePalette.resolve("unknown", 600)
15
+ end
16
+
17
+ test "hex? validates hex colors" do
18
+ assert AdminSuite::ThemePalette.hex?("#fff")
19
+ assert AdminSuite::ThemePalette.hex?("#a1b2c3")
20
+ refute AdminSuite::ThemePalette.hex?("indigo")
21
+ refute AdminSuite::ThemePalette.hex?(nil)
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ ENV["RAILS_ENV"] ||= "test"
4
+
5
+ require_relative "dummy/config/environment"
6
+ require "minitest/autorun"
7
+ require "active_support/test_case"
8
+ require "action_dispatch/testing/integration"
9
+
10
+ # Ensure the engine is loaded (and its initializers run).
11
+ require "admin_suite"
metadata ADDED
@@ -0,0 +1,264 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: admin_suite
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - TechWright Labs
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: rails
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '8.0'
19
+ - - "<"
20
+ - !ruby/object:Gem::Version
21
+ version: '9.0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ version: '8.0'
29
+ - - "<"
30
+ - !ruby/object:Gem::Version
31
+ version: '9.0'
32
+ - !ruby/object:Gem::Dependency
33
+ name: pagy
34
+ requirement: !ruby/object:Gem::Requirement
35
+ requirements:
36
+ - - ">="
37
+ - !ruby/object:Gem::Version
38
+ version: '6.0'
39
+ - - "<"
40
+ - !ruby/object:Gem::Version
41
+ version: '11.0'
42
+ type: :runtime
43
+ prerelease: false
44
+ version_requirements: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '6.0'
49
+ - - "<"
50
+ - !ruby/object:Gem::Version
51
+ version: '11.0'
52
+ - !ruby/object:Gem::Dependency
53
+ name: lucide-rails
54
+ requirement: !ruby/object:Gem::Requirement
55
+ requirements:
56
+ - - "~>"
57
+ - !ruby/object:Gem::Version
58
+ version: '0.7'
59
+ type: :runtime
60
+ prerelease: false
61
+ version_requirements: !ruby/object:Gem::Requirement
62
+ requirements:
63
+ - - "~>"
64
+ - !ruby/object:Gem::Version
65
+ version: '0.7'
66
+ - !ruby/object:Gem::Dependency
67
+ name: redcarpet
68
+ requirement: !ruby/object:Gem::Requirement
69
+ requirements:
70
+ - - "~>"
71
+ - !ruby/object:Gem::Version
72
+ version: '3.6'
73
+ type: :runtime
74
+ prerelease: false
75
+ version_requirements: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - "~>"
78
+ - !ruby/object:Gem::Version
79
+ version: '3.6'
80
+ - !ruby/object:Gem::Dependency
81
+ name: rouge
82
+ requirement: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - "~>"
85
+ - !ruby/object:Gem::Version
86
+ version: '4.7'
87
+ type: :runtime
88
+ prerelease: false
89
+ version_requirements: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - "~>"
92
+ - !ruby/object:Gem::Version
93
+ version: '4.7'
94
+ - !ruby/object:Gem::Dependency
95
+ name: tailwindcss-ruby
96
+ requirement: !ruby/object:Gem::Requirement
97
+ requirements:
98
+ - - "~>"
99
+ - !ruby/object:Gem::Version
100
+ version: '4.1'
101
+ type: :runtime
102
+ prerelease: false
103
+ version_requirements: !ruby/object:Gem::Requirement
104
+ requirements:
105
+ - - "~>"
106
+ - !ruby/object:Gem::Version
107
+ version: '4.1'
108
+ description: A Rails engine providing a declarative resource DSL and a Hotwire/Tailwind
109
+ admin UI.
110
+ email:
111
+ - engineering@techwright.io
112
+ executables: []
113
+ extensions: []
114
+ extra_rdoc_files: []
115
+ files:
116
+ - ".gitignore"
117
+ - Gemfile
118
+ - LICENSE.txt
119
+ - README.md
120
+ - Rakefile
121
+ - app/assets/admin_suite.css
122
+ - app/assets/admin_suite_tailwind.css
123
+ - app/assets/builds/admin_suite_tailwind.css
124
+ - app/assets/rouge.css
125
+ - app/assets/tailwind/admin_suite.css
126
+ - app/controllers/admin_suite/application_controller.rb
127
+ - app/controllers/admin_suite/dashboard_controller.rb
128
+ - app/controllers/admin_suite/docs_controller.rb
129
+ - app/controllers/admin_suite/portals_controller.rb
130
+ - app/controllers/admin_suite/resources_controller.rb
131
+ - app/helpers/admin_suite/base_helper.rb
132
+ - app/helpers/admin_suite/icon_helper.rb
133
+ - app/helpers/admin_suite/panels_helper.rb
134
+ - app/helpers/admin_suite/resources_helper.rb
135
+ - app/helpers/admin_suite/theme_helper.rb
136
+ - app/javascript/controllers/admin_suite/click_actions_controller.js
137
+ - app/javascript/controllers/admin_suite/clipboard_controller.js
138
+ - app/javascript/controllers/admin_suite/code_editor_controller.js
139
+ - app/javascript/controllers/admin_suite/file_upload_controller.js
140
+ - app/javascript/controllers/admin_suite/json_editor_controller.js
141
+ - app/javascript/controllers/admin_suite/live_filter_controller.js
142
+ - app/javascript/controllers/admin_suite/markdown_editor_controller.js
143
+ - app/javascript/controllers/admin_suite/searchable_select_controller.js
144
+ - app/javascript/controllers/admin_suite/sidebar_controller.js
145
+ - app/javascript/controllers/admin_suite/tag_select_controller.js
146
+ - app/javascript/controllers/admin_suite/toggle_switch_controller.js
147
+ - app/views/admin_suite/dashboard/index.html.erb
148
+ - app/views/admin_suite/docs/index.html.erb
149
+ - app/views/admin_suite/panels/_cards.html.erb
150
+ - app/views/admin_suite/panels/_chart.html.erb
151
+ - app/views/admin_suite/panels/_health.html.erb
152
+ - app/views/admin_suite/panels/_recent.html.erb
153
+ - app/views/admin_suite/panels/_stat.html.erb
154
+ - app/views/admin_suite/panels/_table.html.erb
155
+ - app/views/admin_suite/portals/show.html.erb
156
+ - app/views/admin_suite/resources/_form.html.erb
157
+ - app/views/admin_suite/resources/edit.html.erb
158
+ - app/views/admin_suite/resources/index.html.erb
159
+ - app/views/admin_suite/resources/new.html.erb
160
+ - app/views/admin_suite/resources/show.html.erb
161
+ - app/views/admin_suite/shared/_flash.html.erb
162
+ - app/views/admin_suite/shared/_form.html.erb
163
+ - app/views/admin_suite/shared/_json_editor_field.html.erb
164
+ - app/views/admin_suite/shared/_sidebar.html.erb
165
+ - app/views/admin_suite/shared/_toggle_cell.html.erb
166
+ - app/views/admin_suite/shared/_topbar.html.erb
167
+ - app/views/layouts/admin_suite/application.html.erb
168
+ - lib/admin/base/action_executor.rb
169
+ - lib/admin/base/action_handler.rb
170
+ - lib/admin/base/filter_builder.rb
171
+ - lib/admin/base/resource.rb
172
+ - lib/admin_suite.rb
173
+ - lib/admin_suite/configuration.rb
174
+ - lib/admin_suite/engine.rb
175
+ - lib/admin_suite/markdown_renderer.rb
176
+ - lib/admin_suite/portal_definition.rb
177
+ - lib/admin_suite/portal_registry.rb
178
+ - lib/admin_suite/theme_palette.rb
179
+ - lib/admin_suite/ui/dashboard_definition.rb
180
+ - lib/admin_suite/ui/field_renderer_registry.rb
181
+ - lib/admin_suite/ui/form_field_renderer.rb
182
+ - lib/admin_suite/ui/show_formatter_registry.rb
183
+ - lib/admin_suite/ui/show_value_formatter.rb
184
+ - lib/admin_suite/version.rb
185
+ - lib/generators/admin_suite/install/install_generator.rb
186
+ - lib/generators/admin_suite/install/templates/admin_suite.rb
187
+ - lib/generators/admin_suite/resource/resource_generator.rb
188
+ - lib/generators/admin_suite/resource/templates/resource.rb.tt
189
+ - lib/generators/admin_suite/scaffold/scaffold_generator.rb
190
+ - lib/tasks/admin_suite_tailwind.rake
191
+ - lib/tasks/admin_suite_test.rake
192
+ - test/dummy/Gemfile
193
+ - test/dummy/README.md
194
+ - test/dummy/Rakefile
195
+ - test/dummy/app/assets/stylesheets/application.css
196
+ - test/dummy/app/controllers/application_controller.rb
197
+ - test/dummy/app/helpers/application_helper.rb
198
+ - test/dummy/app/models/application_record.rb
199
+ - test/dummy/app/views/layouts/application.html.erb
200
+ - test/dummy/app/views/pwa/manifest.json.erb
201
+ - test/dummy/app/views/pwa/service-worker.js
202
+ - test/dummy/bin/ci
203
+ - test/dummy/bin/dev
204
+ - test/dummy/bin/rails
205
+ - test/dummy/bin/rake
206
+ - test/dummy/bin/setup
207
+ - test/dummy/config.ru
208
+ - test/dummy/config/application.rb
209
+ - test/dummy/config/boot.rb
210
+ - test/dummy/config/ci.rb
211
+ - test/dummy/config/database.yml
212
+ - test/dummy/config/environment.rb
213
+ - test/dummy/config/environments/development.rb
214
+ - test/dummy/config/environments/production.rb
215
+ - test/dummy/config/environments/test.rb
216
+ - test/dummy/config/initializers/assets.rb
217
+ - test/dummy/config/initializers/content_security_policy.rb
218
+ - test/dummy/config/initializers/filter_parameter_logging.rb
219
+ - test/dummy/config/initializers/inflections.rb
220
+ - test/dummy/config/locales/en.yml
221
+ - test/dummy/config/puma.rb
222
+ - test/dummy/config/routes.rb
223
+ - test/dummy/db/seeds.rb
224
+ - test/dummy/log/test.log
225
+ - test/dummy/public/400.html
226
+ - test/dummy/public/404.html
227
+ - test/dummy/public/406-unsupported-browser.html
228
+ - test/dummy/public/422.html
229
+ - test/dummy/public/500.html
230
+ - test/dummy/public/icon.png
231
+ - test/dummy/public/icon.svg
232
+ - test/dummy/public/robots.txt
233
+ - test/dummy/test/test_helper.rb
234
+ - test/dummy/tmp/local_secret.txt
235
+ - test/fixtures/docs/progress/PROGRESS_REPORT.md
236
+ - test/integration/dashboard_test.rb
237
+ - test/integration/docs_test.rb
238
+ - test/integration/theme_test.rb
239
+ - test/lib/markdown_renderer_test.rb
240
+ - test/lib/theme_palette_test.rb
241
+ - test/test_helper.rb
242
+ homepage: https://example.com
243
+ licenses:
244
+ - MIT
245
+ metadata:
246
+ rubygems_mfa_required: 'true'
247
+ rdoc_options: []
248
+ require_paths:
249
+ - lib
250
+ required_ruby_version: !ruby/object:Gem::Requirement
251
+ requirements:
252
+ - - ">="
253
+ - !ruby/object:Gem::Version
254
+ version: '3.2'
255
+ required_rubygems_version: !ruby/object:Gem::Requirement
256
+ requirements:
257
+ - - ">="
258
+ - !ruby/object:Gem::Version
259
+ version: '0'
260
+ requirements: []
261
+ rubygems_version: 3.6.9
262
+ specification_version: 4
263
+ summary: Reusable admin suite engine for Gleania products.
264
+ test_files: []