rsb-admin 0.9.1

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 (115) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +15 -0
  3. data/README.md +83 -0
  4. data/Rakefile +25 -0
  5. data/app/assets/javascripts/rsb/admin/themes/modern.js +37 -0
  6. data/app/assets/stylesheets/rsb/admin/themes/default.css +1358 -0
  7. data/app/assets/stylesheets/rsb/admin/themes/modern.css +1370 -0
  8. data/app/controllers/concerns/rsb/admin/authorization.rb +21 -0
  9. data/app/controllers/rsb/admin/admin_controller.rb +138 -0
  10. data/app/controllers/rsb/admin/admin_users_controller.rb +110 -0
  11. data/app/controllers/rsb/admin/dashboard_controller.rb +76 -0
  12. data/app/controllers/rsb/admin/profile_controller.rb +146 -0
  13. data/app/controllers/rsb/admin/profile_sessions_controller.rb +45 -0
  14. data/app/controllers/rsb/admin/resources_controller.rb +386 -0
  15. data/app/controllers/rsb/admin/roles_controller.rb +99 -0
  16. data/app/controllers/rsb/admin/sessions_controller.rb +139 -0
  17. data/app/controllers/rsb/admin/settings_controller.rb +203 -0
  18. data/app/controllers/rsb/admin/two_factor_controller.rb +105 -0
  19. data/app/helpers/rsb/admin/authorization_helper.rb +49 -0
  20. data/app/helpers/rsb/admin/branding_helper.rb +38 -0
  21. data/app/helpers/rsb/admin/formatting_helper.rb +205 -0
  22. data/app/helpers/rsb/admin/i18n_helper.rb +148 -0
  23. data/app/helpers/rsb/admin/icons_helper.rb +55 -0
  24. data/app/helpers/rsb/admin/table_helper.rb +132 -0
  25. data/app/helpers/rsb/admin/theme_helper.rb +84 -0
  26. data/app/helpers/rsb/admin/url_helper.rb +109 -0
  27. data/app/mailers/rsb/admin/admin_mailer.rb +37 -0
  28. data/app/models/rsb/admin/admin_session.rb +109 -0
  29. data/app/models/rsb/admin/admin_user.rb +153 -0
  30. data/app/models/rsb/admin/application_record.rb +10 -0
  31. data/app/models/rsb/admin/role.rb +63 -0
  32. data/app/views/layouts/rsb/admin/application.html.erb +45 -0
  33. data/app/views/rsb/admin/admin_mailer/email_verification.html.erb +11 -0
  34. data/app/views/rsb/admin/admin_mailer/email_verification.text.erb +11 -0
  35. data/app/views/rsb/admin/admin_users/_form.html.erb +52 -0
  36. data/app/views/rsb/admin/admin_users/edit.html.erb +10 -0
  37. data/app/views/rsb/admin/admin_users/index.html.erb +77 -0
  38. data/app/views/rsb/admin/admin_users/new.html.erb +10 -0
  39. data/app/views/rsb/admin/admin_users/show.html.erb +85 -0
  40. data/app/views/rsb/admin/dashboard/index.html.erb +36 -0
  41. data/app/views/rsb/admin/profile/edit.html.erb +67 -0
  42. data/app/views/rsb/admin/profile/show.html.erb +155 -0
  43. data/app/views/rsb/admin/resources/_filters.html.erb +58 -0
  44. data/app/views/rsb/admin/resources/_form.html.erb +20 -0
  45. data/app/views/rsb/admin/resources/_pagination.html.erb +33 -0
  46. data/app/views/rsb/admin/resources/_table.html.erb +70 -0
  47. data/app/views/rsb/admin/resources/edit.html.erb +7 -0
  48. data/app/views/rsb/admin/resources/index.html.erb +49 -0
  49. data/app/views/rsb/admin/resources/new.html.erb +7 -0
  50. data/app/views/rsb/admin/resources/page.html.erb +9 -0
  51. data/app/views/rsb/admin/resources/show.html.erb +55 -0
  52. data/app/views/rsb/admin/roles/_form.html.erb +197 -0
  53. data/app/views/rsb/admin/roles/edit.html.erb +7 -0
  54. data/app/views/rsb/admin/roles/index.html.erb +71 -0
  55. data/app/views/rsb/admin/roles/new.html.erb +7 -0
  56. data/app/views/rsb/admin/roles/show.html.erb +99 -0
  57. data/app/views/rsb/admin/sessions/new.html.erb +31 -0
  58. data/app/views/rsb/admin/sessions/two_factor.html.erb +39 -0
  59. data/app/views/rsb/admin/settings/_field.html.erb +115 -0
  60. data/app/views/rsb/admin/settings/index.html.erb +61 -0
  61. data/app/views/rsb/admin/shared/_badge.html.erb +1 -0
  62. data/app/views/rsb/admin/shared/_breadcrumbs.html.erb +12 -0
  63. data/app/views/rsb/admin/shared/_empty_state.html.erb +4 -0
  64. data/app/views/rsb/admin/shared/_flash.html.erb +22 -0
  65. data/app/views/rsb/admin/shared/_header.html.erb +50 -0
  66. data/app/views/rsb/admin/shared/_page_tabs.html.erb +21 -0
  67. data/app/views/rsb/admin/shared/_sidebar.html.erb +99 -0
  68. data/app/views/rsb/admin/shared/disabled.html.erb +38 -0
  69. data/app/views/rsb/admin/shared/fields/_checkbox.html.erb +6 -0
  70. data/app/views/rsb/admin/shared/fields/_datetime.html.erb +10 -0
  71. data/app/views/rsb/admin/shared/fields/_email.html.erb +10 -0
  72. data/app/views/rsb/admin/shared/fields/_hidden.html.erb +1 -0
  73. data/app/views/rsb/admin/shared/fields/_json.html.erb +11 -0
  74. data/app/views/rsb/admin/shared/fields/_number.html.erb +10 -0
  75. data/app/views/rsb/admin/shared/fields/_password.html.erb +10 -0
  76. data/app/views/rsb/admin/shared/fields/_select.html.erb +12 -0
  77. data/app/views/rsb/admin/shared/fields/_text.html.erb +10 -0
  78. data/app/views/rsb/admin/shared/fields/_textarea.html.erb +10 -0
  79. data/app/views/rsb/admin/shared/forbidden.html.erb +22 -0
  80. data/app/views/rsb/admin/themes/modern/views/shared/_header.html.erb +77 -0
  81. data/app/views/rsb/admin/themes/modern/views/shared/_sidebar.html.erb +135 -0
  82. data/app/views/rsb/admin/two_factor/backup_codes.html.erb +48 -0
  83. data/app/views/rsb/admin/two_factor/new.html.erb +53 -0
  84. data/config/locales/en.yml +140 -0
  85. data/config/locales/seo.en.yml +21 -0
  86. data/config/routes.rb +59 -0
  87. data/db/migrate/20260208000003_create_rsb_admin_tables.rb +43 -0
  88. data/db/migrate/20260214000001_add_otp_fields_to_rsb_admin_admin_users.rb +9 -0
  89. data/lib/generators/rsb/admin/install/install_generator.rb +45 -0
  90. data/lib/generators/rsb/admin/install/templates/rsb_admin_seeds.rb +24 -0
  91. data/lib/generators/rsb/admin/theme/templates/theme.css.tt +66 -0
  92. data/lib/generators/rsb/admin/theme/theme_generator.rb +218 -0
  93. data/lib/generators/rsb/admin/views/views_generator.rb +262 -0
  94. data/lib/rsb/admin/breadcrumb_item.rb +26 -0
  95. data/lib/rsb/admin/category_registration.rb +177 -0
  96. data/lib/rsb/admin/column_definition.rb +89 -0
  97. data/lib/rsb/admin/configuration.rb +69 -0
  98. data/lib/rsb/admin/engine.rb +34 -0
  99. data/lib/rsb/admin/filter_definition.rb +129 -0
  100. data/lib/rsb/admin/form_field_definition.rb +96 -0
  101. data/lib/rsb/admin/icons.rb +95 -0
  102. data/lib/rsb/admin/page_registration.rb +140 -0
  103. data/lib/rsb/admin/registry.rb +109 -0
  104. data/lib/rsb/admin/resource_dsl_context.rb +139 -0
  105. data/lib/rsb/admin/resource_registration.rb +287 -0
  106. data/lib/rsb/admin/settings_schema.rb +60 -0
  107. data/lib/rsb/admin/test_kit/helpers.rb +316 -0
  108. data/lib/rsb/admin/test_kit/resource_test_case.rb +193 -0
  109. data/lib/rsb/admin/test_kit.rb +11 -0
  110. data/lib/rsb/admin/theme_definition.rb +46 -0
  111. data/lib/rsb/admin/themes/modern.rb +44 -0
  112. data/lib/rsb/admin/version.rb +9 -0
  113. data/lib/rsb/admin.rb +177 -0
  114. data/lib/tasks/rsb/admin_tasks.rake +23 -0
  115. metadata +227 -0
data/lib/rsb/admin.rb ADDED
@@ -0,0 +1,177 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rsb/settings'
4
+ require 'rotp'
5
+ require 'rqrcode'
6
+ require 'rsb/admin/version'
7
+ require 'rsb/admin/engine'
8
+ require 'rsb/admin/configuration'
9
+ require 'rsb/admin/registry'
10
+ require 'rsb/admin/resource_registration'
11
+ require 'rsb/admin/category_registration'
12
+ require 'rsb/admin/column_definition'
13
+ require 'rsb/admin/filter_definition'
14
+ require 'rsb/admin/form_field_definition'
15
+ require 'rsb/admin/page_registration'
16
+ require 'rsb/admin/resource_dsl_context'
17
+ require 'rsb/admin/breadcrumb_item'
18
+ require 'rsb/admin/theme_definition'
19
+ require 'rsb/admin/settings_schema'
20
+ require 'rsb/admin/icons'
21
+ require 'rsb/admin/themes/modern'
22
+
23
+ module RSB
24
+ module Admin
25
+ class << self
26
+ def registry
27
+ @registry ||= Registry.new
28
+ end
29
+
30
+ def configure
31
+ yield(configuration)
32
+ end
33
+
34
+ def configuration
35
+ @configuration ||= Configuration.new
36
+ end
37
+
38
+ def settings_schema
39
+ @settings_schema ||= SettingsSchema.build
40
+ end
41
+
42
+ # Registers a theme definition.
43
+ #
44
+ # Themes are stored in a module-level hash and can be referenced by
45
+ # their key symbol. Use this to register custom themes or override
46
+ # built-in themes.
47
+ #
48
+ # @param key [Symbol, String] the unique theme identifier
49
+ # @param label [String] the human-readable theme name
50
+ # @param css [String] the asset path for the theme's CSS file
51
+ # @param js [String, nil] optional asset path for the theme's JavaScript file
52
+ # @param views_path [String, nil] optional view override path prefix
53
+ #
54
+ # @return [RSB::Admin::ThemeDefinition] the registered theme definition
55
+ #
56
+ # @example Register a custom theme
57
+ # RSB::Admin.register_theme :corporate,
58
+ # label: "Corporate",
59
+ # css: "my_app/admin/corporate",
60
+ # js: "my_app/admin/corporate",
61
+ # views_path: "my_app/admin/corporate/views"
62
+ def register_theme(key, label:, css:, js: nil, views_path: nil)
63
+ @themes ||= {}
64
+ @themes[key.to_sym] = ThemeDefinition.new(
65
+ key: key.to_sym,
66
+ label: label,
67
+ css: css,
68
+ js: js,
69
+ views_path: views_path
70
+ )
71
+ end
72
+
73
+ # Returns all registered themes.
74
+ #
75
+ # @return [Hash{Symbol => RSB::Admin::ThemeDefinition}] a hash of theme definitions keyed by their symbol
76
+ #
77
+ # @example
78
+ # RSB::Admin.themes
79
+ # # => { default: #<data RSB::Admin::ThemeDefinition...>, modern: #<data...> }
80
+ def themes
81
+ @themes || {}
82
+ end
83
+
84
+ # Returns the ThemeDefinition for the currently configured theme.
85
+ #
86
+ # Reads from the settings DB so changes made via the admin panel
87
+ # take effect immediately without restart. Falls back to
88
+ # +configuration.theme+ (initializer value) when settings are not
89
+ # yet available, and ultimately to the +:default+ theme.
90
+ #
91
+ # @return [RSB::Admin::ThemeDefinition] the active theme definition
92
+ #
93
+ # @example
94
+ # RSB::Settings.set("admin", "theme", "modern")
95
+ # RSB::Admin.current_theme
96
+ # # => #<data RSB::Admin::ThemeDefinition key=:modern, ...>
97
+ def current_theme
98
+ theme_key = RSB::Settings.get('admin.theme').presence || configuration.theme
99
+ themes[theme_key.to_sym] || themes[:default]
100
+ end
101
+
102
+ # Checks whether the admin panel is enabled.
103
+ #
104
+ # Uses a special resolution order for safety: ENV has highest priority
105
+ # (overrides DB), so a developer can always force-enable via
106
+ # RSB_ADMIN_ENABLED=true without needing database access.
107
+ #
108
+ # Resolution: ENV['RSB_ADMIN_ENABLED'] → DB → initializer → default (true)
109
+ #
110
+ # @return [Boolean] true if the admin panel is enabled
111
+ #
112
+ # @example
113
+ # RSB::Admin.enabled? # => true (default)
114
+ #
115
+ # @example Force-enable via ENV
116
+ # ENV['RSB_ADMIN_ENABLED'] = 'true'
117
+ # RSB::Admin.enabled? # => true (even if DB says false)
118
+ def enabled?
119
+ # ENV override has highest priority (escape hatch)
120
+ return ActiveModel::Type::Boolean.new.cast(ENV['RSB_ADMIN_ENABLED']) if ENV.key?('RSB_ADMIN_ENABLED')
121
+
122
+ # Normal settings resolution: DB → initializer → default
123
+ RSB::Settings.get('admin.enabled') != false
124
+ end
125
+
126
+ def reset!
127
+ @registry = Registry.new
128
+ @configuration = Configuration.new
129
+ @settings_schema = nil
130
+ @themes = {}
131
+ register_built_in_themes
132
+ end
133
+
134
+ # Convenience method to render an icon SVG.
135
+ #
136
+ # This is a shorthand for {RSB::Admin::Icons.render}.
137
+ # Useful when you need to render icons outside of view context.
138
+ #
139
+ # @param name [String, Symbol] The icon name (e.g., "users", :home)
140
+ # @param size [Integer] The width and height of the icon in pixels
141
+ #
142
+ # @return [ActiveSupport::SafeBuffer] HTML-safe SVG string, or empty string if icon not found
143
+ #
144
+ # @example
145
+ # RSB::Admin.icon("users")
146
+ # # => '<svg xmlns="..." width="18" height="18" ...>...</svg>'
147
+ #
148
+ # @example
149
+ # RSB::Admin.icon(:home, size: 32)
150
+ # # => '<svg xmlns="..." width="32" height="32" ...>...</svg>'
151
+ #
152
+ # @see RSB::Admin::Icons.render
153
+ def icon(name, size: 18)
154
+ Icons.render(name, size: size)
155
+ end
156
+
157
+ private
158
+
159
+ # Registers the built-in themes (default and modern).
160
+ #
161
+ # This is called automatically at module load time and after {#reset!}.
162
+ #
163
+ # @api private
164
+ def register_built_in_themes
165
+ register_theme :default,
166
+ label: 'Default',
167
+ css: 'rsb/admin/themes/default',
168
+ views_path: nil
169
+
170
+ Themes::Modern.register!
171
+ end
172
+ end
173
+
174
+ # Register built-in themes at load time
175
+ register_built_in_themes
176
+ end
177
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ namespace :rsb do
4
+ desc 'Create an admin user. Usage: rsb:create_admin EMAIL=admin@example.com PASSWORD=secret'
5
+ task create_admin: :environment do
6
+ email = ENV.fetch('EMAIL') { abort 'EMAIL is required' }
7
+ password = ENV.fetch('PASSWORD') { abort 'PASSWORD is required' }
8
+
9
+ # Create superadmin role if it doesn't exist
10
+ role = RSB::Admin::Role.find_or_create_by!(name: 'Superadmin') do |r|
11
+ r.permissions = { '*' => ['*'] }
12
+ r.built_in = true
13
+ end
14
+
15
+ admin = RSB::Admin::AdminUser.create!(
16
+ email: email,
17
+ password: password,
18
+ password_confirmation: password,
19
+ role: role
20
+ )
21
+ puts "Admin user created: #{admin.email} (role: #{role.name})"
22
+ end
23
+ end
metadata ADDED
@@ -0,0 +1,227 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rsb-admin
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.9.1
5
+ platform: ruby
6
+ authors:
7
+ - Aleksandr Marchenko
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: bcrypt
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: '3.1'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - "~>"
24
+ - !ruby/object:Gem::Version
25
+ version: '3.1'
26
+ - !ruby/object:Gem::Dependency
27
+ name: rails
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '8.0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '8.0'
40
+ - !ruby/object:Gem::Dependency
41
+ name: rotp
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '6.3'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '6.3'
54
+ - !ruby/object:Gem::Dependency
55
+ name: rqrcode
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '2.2'
61
+ type: :runtime
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '2.2'
68
+ - !ruby/object:Gem::Dependency
69
+ name: rsb-settings
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - '='
73
+ - !ruby/object:Gem::Version
74
+ version: 0.9.1
75
+ type: :runtime
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - '='
80
+ - !ruby/object:Gem::Version
81
+ version: 0.9.1
82
+ description: Registrable admin panel with dynamic RBAC, settings page, and a test
83
+ kit for extension developers. Simpler than ActiveAdmin — designed for extensibility.
84
+ email:
85
+ - alex@marchenko.me
86
+ executables: []
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - LICENSE
91
+ - README.md
92
+ - Rakefile
93
+ - app/assets/javascripts/rsb/admin/themes/modern.js
94
+ - app/assets/stylesheets/rsb/admin/themes/default.css
95
+ - app/assets/stylesheets/rsb/admin/themes/modern.css
96
+ - app/controllers/concerns/rsb/admin/authorization.rb
97
+ - app/controllers/rsb/admin/admin_controller.rb
98
+ - app/controllers/rsb/admin/admin_users_controller.rb
99
+ - app/controllers/rsb/admin/dashboard_controller.rb
100
+ - app/controllers/rsb/admin/profile_controller.rb
101
+ - app/controllers/rsb/admin/profile_sessions_controller.rb
102
+ - app/controllers/rsb/admin/resources_controller.rb
103
+ - app/controllers/rsb/admin/roles_controller.rb
104
+ - app/controllers/rsb/admin/sessions_controller.rb
105
+ - app/controllers/rsb/admin/settings_controller.rb
106
+ - app/controllers/rsb/admin/two_factor_controller.rb
107
+ - app/helpers/rsb/admin/authorization_helper.rb
108
+ - app/helpers/rsb/admin/branding_helper.rb
109
+ - app/helpers/rsb/admin/formatting_helper.rb
110
+ - app/helpers/rsb/admin/i18n_helper.rb
111
+ - app/helpers/rsb/admin/icons_helper.rb
112
+ - app/helpers/rsb/admin/table_helper.rb
113
+ - app/helpers/rsb/admin/theme_helper.rb
114
+ - app/helpers/rsb/admin/url_helper.rb
115
+ - app/mailers/rsb/admin/admin_mailer.rb
116
+ - app/models/rsb/admin/admin_session.rb
117
+ - app/models/rsb/admin/admin_user.rb
118
+ - app/models/rsb/admin/application_record.rb
119
+ - app/models/rsb/admin/role.rb
120
+ - app/views/layouts/rsb/admin/application.html.erb
121
+ - app/views/rsb/admin/admin_mailer/email_verification.html.erb
122
+ - app/views/rsb/admin/admin_mailer/email_verification.text.erb
123
+ - app/views/rsb/admin/admin_users/_form.html.erb
124
+ - app/views/rsb/admin/admin_users/edit.html.erb
125
+ - app/views/rsb/admin/admin_users/index.html.erb
126
+ - app/views/rsb/admin/admin_users/new.html.erb
127
+ - app/views/rsb/admin/admin_users/show.html.erb
128
+ - app/views/rsb/admin/dashboard/index.html.erb
129
+ - app/views/rsb/admin/profile/edit.html.erb
130
+ - app/views/rsb/admin/profile/show.html.erb
131
+ - app/views/rsb/admin/resources/_filters.html.erb
132
+ - app/views/rsb/admin/resources/_form.html.erb
133
+ - app/views/rsb/admin/resources/_pagination.html.erb
134
+ - app/views/rsb/admin/resources/_table.html.erb
135
+ - app/views/rsb/admin/resources/edit.html.erb
136
+ - app/views/rsb/admin/resources/index.html.erb
137
+ - app/views/rsb/admin/resources/new.html.erb
138
+ - app/views/rsb/admin/resources/page.html.erb
139
+ - app/views/rsb/admin/resources/show.html.erb
140
+ - app/views/rsb/admin/roles/_form.html.erb
141
+ - app/views/rsb/admin/roles/edit.html.erb
142
+ - app/views/rsb/admin/roles/index.html.erb
143
+ - app/views/rsb/admin/roles/new.html.erb
144
+ - app/views/rsb/admin/roles/show.html.erb
145
+ - app/views/rsb/admin/sessions/new.html.erb
146
+ - app/views/rsb/admin/sessions/two_factor.html.erb
147
+ - app/views/rsb/admin/settings/_field.html.erb
148
+ - app/views/rsb/admin/settings/index.html.erb
149
+ - app/views/rsb/admin/shared/_badge.html.erb
150
+ - app/views/rsb/admin/shared/_breadcrumbs.html.erb
151
+ - app/views/rsb/admin/shared/_empty_state.html.erb
152
+ - app/views/rsb/admin/shared/_flash.html.erb
153
+ - app/views/rsb/admin/shared/_header.html.erb
154
+ - app/views/rsb/admin/shared/_page_tabs.html.erb
155
+ - app/views/rsb/admin/shared/_sidebar.html.erb
156
+ - app/views/rsb/admin/shared/disabled.html.erb
157
+ - app/views/rsb/admin/shared/fields/_checkbox.html.erb
158
+ - app/views/rsb/admin/shared/fields/_datetime.html.erb
159
+ - app/views/rsb/admin/shared/fields/_email.html.erb
160
+ - app/views/rsb/admin/shared/fields/_hidden.html.erb
161
+ - app/views/rsb/admin/shared/fields/_json.html.erb
162
+ - app/views/rsb/admin/shared/fields/_number.html.erb
163
+ - app/views/rsb/admin/shared/fields/_password.html.erb
164
+ - app/views/rsb/admin/shared/fields/_select.html.erb
165
+ - app/views/rsb/admin/shared/fields/_text.html.erb
166
+ - app/views/rsb/admin/shared/fields/_textarea.html.erb
167
+ - app/views/rsb/admin/shared/forbidden.html.erb
168
+ - app/views/rsb/admin/themes/modern/views/shared/_header.html.erb
169
+ - app/views/rsb/admin/themes/modern/views/shared/_sidebar.html.erb
170
+ - app/views/rsb/admin/two_factor/backup_codes.html.erb
171
+ - app/views/rsb/admin/two_factor/new.html.erb
172
+ - config/locales/en.yml
173
+ - config/locales/seo.en.yml
174
+ - config/routes.rb
175
+ - db/migrate/20260208000003_create_rsb_admin_tables.rb
176
+ - db/migrate/20260214000001_add_otp_fields_to_rsb_admin_admin_users.rb
177
+ - lib/generators/rsb/admin/install/install_generator.rb
178
+ - lib/generators/rsb/admin/install/templates/rsb_admin_seeds.rb
179
+ - lib/generators/rsb/admin/theme/templates/theme.css.tt
180
+ - lib/generators/rsb/admin/theme/theme_generator.rb
181
+ - lib/generators/rsb/admin/views/views_generator.rb
182
+ - lib/rsb/admin.rb
183
+ - lib/rsb/admin/breadcrumb_item.rb
184
+ - lib/rsb/admin/category_registration.rb
185
+ - lib/rsb/admin/column_definition.rb
186
+ - lib/rsb/admin/configuration.rb
187
+ - lib/rsb/admin/engine.rb
188
+ - lib/rsb/admin/filter_definition.rb
189
+ - lib/rsb/admin/form_field_definition.rb
190
+ - lib/rsb/admin/icons.rb
191
+ - lib/rsb/admin/page_registration.rb
192
+ - lib/rsb/admin/registry.rb
193
+ - lib/rsb/admin/resource_dsl_context.rb
194
+ - lib/rsb/admin/resource_registration.rb
195
+ - lib/rsb/admin/settings_schema.rb
196
+ - lib/rsb/admin/test_kit.rb
197
+ - lib/rsb/admin/test_kit/helpers.rb
198
+ - lib/rsb/admin/test_kit/resource_test_case.rb
199
+ - lib/rsb/admin/theme_definition.rb
200
+ - lib/rsb/admin/themes/modern.rb
201
+ - lib/rsb/admin/version.rb
202
+ - lib/tasks/rsb/admin_tasks.rake
203
+ homepage: https://github.com/Rails-SaaS-Builder/rails-saas-builder
204
+ licenses:
205
+ - LGPL-3.0
206
+ metadata:
207
+ source_code_uri: https://github.com/Rails-SaaS-Builder/rails-saas-builder
208
+ bug_tracker_uri: https://github.com/Rails-SaaS-Builder/rails-saas-builder/issues
209
+ changelog_uri: https://github.com/Rails-SaaS-Builder/rails-saas-builder/blob/master/CHANGELOG.md
210
+ rdoc_options: []
211
+ require_paths:
212
+ - lib
213
+ required_ruby_version: !ruby/object:Gem::Requirement
214
+ requirements:
215
+ - - ">="
216
+ - !ruby/object:Gem::Version
217
+ version: '3.2'
218
+ required_rubygems_version: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - ">="
221
+ - !ruby/object:Gem::Version
222
+ version: '0'
223
+ requirements: []
224
+ rubygems_version: 3.6.8
225
+ specification_version: 4
226
+ summary: Lightweight admin panel framework for Rails SaaS Builder
227
+ test_files: []