ruby_cms 0.2.1.0 → 1.0.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +31 -72
- data/README.md +308 -153
- data/Rakefile +0 -18
- data/SYNC_RULES.md +84 -0
- data/exe/ruby_cms +13 -18
- data/lib/generators/ruby_cms/admin_page_generator.rb +116 -60
- data/lib/generators/ruby_cms/templates/admin.html.erb +35 -17
- data/lib/generators/ruby_cms/templates/admin_page/_admin_table_content.html.erb.tt +25 -0
- data/lib/generators/ruby_cms/templates/admin_page/_form.html.erb.tt +36 -0
- data/lib/generators/ruby_cms/templates/admin_page/_row.html.erb.tt +20 -0
- data/lib/generators/ruby_cms/templates/admin_page/controller.rb.tt +74 -2
- data/lib/generators/ruby_cms/templates/admin_page/edit.html.erb.tt +14 -0
- data/lib/generators/ruby_cms/templates/admin_page/index.html.erb.tt +21 -10
- data/lib/generators/ruby_cms/templates/admin_page/new.html.erb.tt +14 -0
- data/lib/generators/ruby_cms/templates/assets/tailwind/application.css +225 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/accordion/accordion.rb +17 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/accordion/accordion_content.rb +21 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/accordion/accordion_default_content.rb +17 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/accordion/accordion_default_trigger.rb +19 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/accordion/accordion_icon.rb +38 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/accordion/accordion_item.rb +28 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/accordion/accordion_trigger.rb +17 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/admin_page/admin_page.rb +31 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/admin_page/admin_page_header.rb +65 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/admin_page/admin_resource_card.rb +28 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/admin_page/admin_table_content.rb +20 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/alert/alert.rb +36 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/alert/alert_description.rb +17 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/alert/alert_title.rb +17 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/aspect_ratio/aspect_ratio.rb +33 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/avatar/avatar.rb +31 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/avatar/avatar_fallback.rb +17 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/avatar/avatar_image.rb +26 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/badge/badge.rb +60 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/base.rb +29 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/box/box.rb +15 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/breadcrumb/breadcrumb.rb +17 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/breadcrumb/breadcrumb_ellipsis.rb +39 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/breadcrumb/breadcrumb_item.rb +17 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/breadcrumb/breadcrumb_link.rb +22 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/breadcrumb/breadcrumb_list.rb +17 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/breadcrumb/breadcrumb_page.rb +19 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/breadcrumb/breadcrumb_separator.rb +38 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/bulk_action_table/bulk_action_button.rb +82 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/bulk_action_table/bulk_action_table.rb +133 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/bulk_action_table/bulk_action_table_actions.rb +104 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/bulk_action_table/bulk_action_table_body.rb +17 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/bulk_action_table/bulk_action_table_checkbox_cell.rb +40 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/bulk_action_table/bulk_action_table_checkbox_head.rb +34 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/bulk_action_table/bulk_action_table_delete_modal.rb +43 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/bulk_action_table/bulk_action_table_header.rb +42 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/bulk_action_table/bulk_action_table_pagination.rb +115 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/bulk_action_table/bulk_action_table_row.rb +77 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/bulk_action_table/bulk_actions.rb +86 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/button/button.rb +113 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/calendar/calendar.rb +39 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/calendar/calendar_body.rb +19 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/calendar/calendar_days.rb +104 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/calendar/calendar_header.rb +17 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/calendar/calendar_next.rb +43 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/calendar/calendar_prev.rb +43 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/calendar/calendar_title.rb +27 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/calendar/calendar_weekdays.rb +33 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/card/card.rb +17 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/card/card_content.rb +17 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/card/card_description.rb +17 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/card/card_footer.rb +17 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/card/card_header.rb +17 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/card/card_title.rb +17 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/carousel/carousel.rb +44 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/carousel/carousel_content.rb +23 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/carousel/carousel_item.rb +23 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/carousel/carousel_next.rb +48 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/carousel/carousel_previous.rb +49 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/checkbox/checkbox.rb +29 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/checkbox/checkbox_group.rb +20 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/clipboard/clipboard.rb +42 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/clipboard/clipboard_popover.rb +40 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/clipboard/clipboard_source.rb +19 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/clipboard/clipboard_trigger.rb +20 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/codeblock/codeblock.rb +102 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/collapsible/collapsible.rb +25 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/collapsible/collapsible_content.rb +18 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/collapsible/collapsible_trigger.rb +19 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/combobox/combobox.rb +26 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/combobox/combobox_checkbox.rb +25 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/combobox/combobox_empty_state.rb +21 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/combobox/combobox_item.rb +25 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/combobox/combobox_list.rb +18 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/combobox/combobox_list_group.rb +20 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/combobox/combobox_popover.rb +30 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/combobox/combobox_radio.rb +26 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/combobox/combobox_search_input.rb +53 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/combobox/combobox_toggle_all_checkbox.rb +25 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/combobox/combobox_trigger.rb +57 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/command/command.rb +9 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/command/command_dialog.rb +17 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/command/command_dialog_content.rb +48 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/command/command_dialog_trigger.rb +29 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/command/command_empty.rb +19 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/command/command_group.rb +40 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/command/command_input.rb +56 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/command/command_item.rb +32 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/command/command_list.rb +17 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/container/container.rb +33 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/container/container_section.rb +31 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/context_menu/context_menu.rb +26 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/context_menu/context_menu_content.rb +25 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/context_menu/context_menu_item.rb +66 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/context_menu/context_menu_label.rb +24 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/context_menu/context_menu_separator.rb +19 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/context_menu/context_menu_trigger.rb +20 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/data_table/data_table.rb +29 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/data_table/data_table_bulk_actions.rb +18 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/data_table/data_table_column_toggle.rb +62 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/data_table/data_table_expand_toggle.rb +53 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/data_table/data_table_form.rb +39 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/data_table/data_table_kaminari_adapter.rb +17 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/data_table/data_table_manual_adapter.rb +17 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/data_table/data_table_pagination.rb +100 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/data_table/data_table_pagination_bar.rb +15 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/data_table/data_table_pagy_adapter.rb +17 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/data_table/data_table_per_page_select.rb +35 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/data_table/data_table_row_checkbox.rb +30 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/data_table/data_table_search.rb +57 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/data_table/data_table_select_all_checkbox.rb +21 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/data_table/data_table_selection_summary.rb +25 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/data_table/data_table_sort_head.rb +112 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/data_table/data_table_toolbar.rb +15 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/dialog/dialog.rb +25 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/dialog/dialog_content.rb +78 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/dialog/dialog_description.rb +17 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/dialog/dialog_footer.rb +17 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/dialog/dialog_header.rb +17 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/dialog/dialog_middle.rb +17 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/dialog/dialog_title.rb +17 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/dialog/dialog_trigger.rb +20 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/dropdown_menu/dropdown_menu.rb +35 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/dropdown_menu/dropdown_menu_content.rb +44 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/dropdown_menu/dropdown_menu_item.rb +28 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/dropdown_menu/dropdown_menu_label.rb +17 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/dropdown_menu/dropdown_menu_separator.rb +19 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/dropdown_menu/dropdown_menu_trigger.rb +18 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/empty_state/empty_state.rb +190 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/form/form.rb +15 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/form/form_field.rb +20 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/form/form_field_error.rb +20 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/form/form_field_hint.rb +15 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/form/form_field_label.rb +15 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/hover_card/hover_card.rb +27 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/hover_card/hover_card_content.rb +22 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/hover_card/hover_card_trigger.rb +20 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/input/input.rb +34 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/link/link.rb +106 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/masked_input/masked_input.rb +15 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/modal/modal.rb +26 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/modal/modal_action.rb +17 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/modal/modal_cancel.rb +20 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/modal/modal_content.rb +68 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/modal/modal_description.rb +17 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/modal/modal_footer.rb +17 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/modal/modal_header.rb +17 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/modal/modal_title.rb +17 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/native_select/native_select.rb +39 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/native_select/native_select_group.rb +15 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/native_select/native_select_icon.rb +39 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/native_select/native_select_option.rb +15 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/pagination/pagination.rb +19 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/pagination/pagination_content.rb +17 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/pagination/pagination_ellipsis.rb +42 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/pagination/pagination_item.rb +28 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/popover/popover.rb +26 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/popover/popover_content.rb +27 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/popover/popover_trigger.rb +20 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/progress/progress.rb +37 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/radio_button/radio_button.rb +25 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/select/select.rb +23 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/select/select_content.rb +32 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/select/select_group.rb +15 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/select/select_input.rb +22 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/select/select_item.rb +52 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/select/select_label.rb +17 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/select/select_trigger.rb +54 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/select/select_value.rb +27 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/separator/separator.rb +38 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/sheet/sheet.rb +17 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/sheet/sheet_content.rb +77 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/sheet/sheet_description.rb +17 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/sheet/sheet_footer.rb +17 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/sheet/sheet_header.rb +17 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/sheet/sheet_middle.rb +17 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/sheet/sheet_title.rb +17 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/sheet/sheet_trigger.rb +17 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/shortcut_key/shortcut_key.rb +17 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/skeleton/skeleton.rb +17 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/switch/switch.rb +24 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/table/table.rb +19 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/table/table_body.rb +17 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/table/table_caption.rb +17 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/table/table_cell.rb +17 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/table/table_footer.rb +17 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/table/table_head.rb +17 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/table/table_header.rb +17 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/table/table_row.rb +17 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/tabs/tabs.rb +25 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/tabs/tabs_content.rb +26 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/tabs/tabs_list.rb +17 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/tabs/tabs_trigger.rb +28 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/textarea/textarea.rb +26 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/theme_toggle/set_dark_mode.rb +16 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/theme_toggle/set_light_mode.rb +16 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/theme_toggle/theme_toggle.rb +9 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/tooltip/tooltip.rb +26 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/tooltip/tooltip_content.rb +26 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/tooltip/tooltip_trigger.rb +19 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/typography/heading.rb +60 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/typography/inline_code.rb +17 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/typography/inline_link.rb +22 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/typography/text.rb +53 -0
- data/lib/generators/ruby_cms/templates/components/ruby_ui/typography/typography_blockquote.rb +17 -0
- data/lib/generators/ruby_cms/templates/{ruby_cms.rb → config/initializers/admin.rb} +15 -9
- data/lib/generators/ruby_cms/templates/config/initializers/admin_dashboard.rb +43 -0
- data/lib/generators/ruby_cms/templates/config/initializers/pagy.rb +7 -0
- data/lib/generators/ruby_cms/templates/config/initializers/ruby_cms_core.rb +25 -0
- data/lib/generators/ruby_cms/templates/config/initializers/ruby_cms_custom_settings.rb +35 -0
- data/lib/generators/ruby_cms/templates/config/initializers/webauthn.rb +28 -0
- data/lib/generators/ruby_cms/templates/config/locales/en.yml +277 -0
- data/lib/generators/ruby_cms/templates/config/locales/nl.yml +329 -0
- data/lib/generators/ruby_cms/templates/controllers/admin/analytics_controller.rb +211 -0
- data/lib/generators/ruby_cms/templates/controllers/admin/application_controller.rb +186 -0
- data/lib/generators/ruby_cms/templates/controllers/admin/audit_log_entries_controller.rb +69 -0
- data/lib/generators/ruby_cms/templates/controllers/admin/commands_controller.rb +146 -0
- data/lib/generators/ruby_cms/templates/controllers/admin/content_block_versions_controller.rb +96 -0
- data/lib/generators/ruby_cms/templates/controllers/admin/content_blocks_controller.rb +405 -0
- data/lib/generators/ruby_cms/templates/controllers/admin/dashboard_controller.rb +114 -0
- data/lib/generators/ruby_cms/templates/controllers/admin/invitations_controller.rb +64 -0
- data/lib/generators/ruby_cms/templates/controllers/admin/locale_controller.rb +19 -0
- data/lib/generators/ruby_cms/templates/controllers/admin/media_assets_controller.rb +186 -0
- data/lib/generators/ruby_cms/templates/controllers/admin/notifications_controller.rb +37 -0
- data/lib/generators/ruby_cms/templates/controllers/admin/passkey_credentials_controller.rb +17 -0
- data/lib/generators/ruby_cms/templates/controllers/admin/passkey_registrations_controller.rb +50 -0
- data/lib/generators/ruby_cms/templates/controllers/admin/permissions_controller.rb +132 -0
- data/lib/generators/ruby_cms/templates/controllers/admin/redirects_controller.rb +175 -0
- data/lib/generators/ruby_cms/templates/controllers/admin/security_controller.rb +146 -0
- data/lib/generators/ruby_cms/templates/controllers/admin/settings_controller.rb +298 -0
- data/lib/generators/ruby_cms/templates/controllers/admin/system_health_controller.rb +11 -0
- data/lib/generators/ruby_cms/templates/controllers/admin/trash_controller.rb +61 -0
- data/lib/generators/ruby_cms/templates/controllers/admin/user_permissions_controller.rb +91 -0
- data/lib/generators/ruby_cms/templates/controllers/admin/users_controller.rb +220 -0
- data/lib/generators/ruby_cms/templates/controllers/admin/visitor_errors_controller.rb +114 -0
- data/lib/generators/ruby_cms/templates/controllers/admin/visual_editor_controller.rb +384 -0
- data/lib/generators/ruby_cms/templates/controllers/concerns/.keep +0 -0
- data/lib/generators/ruby_cms/templates/controllers/concerns/admin_bulk_actions.rb +59 -0
- data/lib/generators/ruby_cms/templates/controllers/concerns/admin_pagination.rb +106 -0
- data/lib/generators/ruby_cms/templates/controllers/concerns/admin_turbo_table.rb +46 -0
- data/lib/generators/ruby_cms/templates/controllers/concerns/audit_loggable.rb +28 -0
- data/lib/generators/ruby_cms/templates/controllers/concerns/authentication.rb +63 -0
- data/lib/generators/ruby_cms/templates/controllers/concerns/page_tracking.rb +45 -0
- data/lib/generators/ruby_cms/templates/controllers/concerns/security_monitoring.rb +102 -0
- data/lib/generators/ruby_cms/templates/controllers/concerns/sudo_mode.rb +29 -0
- data/lib/generators/ruby_cms/templates/controllers/concerns/visitor_error_capture.rb +35 -0
- data/lib/generators/ruby_cms/templates/controllers/errors_controller.rb +36 -0
- data/lib/generators/ruby_cms/templates/controllers/passkey_sessions_controller.rb +69 -0
- data/lib/generators/ruby_cms/templates/db/migrate/20251121085414_create_email_blocklists.rb +12 -0
- data/lib/generators/ruby_cms/templates/db/migrate/20251121161828_create_ip_blocklists.rb +12 -0
- data/lib/generators/ruby_cms/templates/db/migrate/20251205120000_add_analytics_indices.rb +48 -0
- data/lib/generators/ruby_cms/templates/db/migrate/20251216064753_backfill_security_fields_in_ahoy_events.rb +49 -0
- data/{db → lib/generators/ruby_cms/templates/db}/migrate/20260125000001_create_ruby_cms_permissions.rb +2 -2
- data/{db → lib/generators/ruby_cms/templates/db}/migrate/20260125000002_create_ruby_cms_user_permissions.rb +2 -2
- data/{db → lib/generators/ruby_cms/templates/db}/migrate/20260125000003_create_ruby_cms_content_blocks.rb +3 -3
- data/{db → lib/generators/ruby_cms/templates/db}/migrate/20260125000010_add_indexes_to_ruby_cms_tables.rb +1 -1
- data/{db → lib/generators/ruby_cms/templates/db}/migrate/20260127000001_add_locale_to_ruby_cms_content_blocks.rb +8 -6
- data/{db → lib/generators/ruby_cms/templates/db}/migrate/20260129000001_create_ruby_cms_visitor_errors.rb +4 -4
- data/lib/generators/ruby_cms/templates/db/migrate/20260130000001_add_referer_and_query_to_ruby_cms_visitor_errors.rb +10 -0
- data/{db → lib/generators/ruby_cms/templates/db}/migrate/20260130000002_create_ruby_cms_preferences.rb +2 -2
- data/lib/generators/ruby_cms/templates/db/migrate/20260130000003_add_category_to_ruby_cms_preferences.rb +10 -0
- data/{db → lib/generators/ruby_cms/templates/db}/migrate/20260328000001_create_content_block_versions.rb +2 -2
- data/lib/generators/ruby_cms/templates/db/migrate/20260525120000_create_audit_log_entries.rb +24 -0
- data/lib/generators/ruby_cms/templates/db/migrate/20260525130000_create_redirects.rb +28 -0
- data/lib/generators/ruby_cms/templates/db/migrate/20260525140000_create_media_assets.rb +25 -0
- data/lib/generators/ruby_cms/templates/db/migrate/20260525150000_create_invitations.rb +22 -0
- data/lib/generators/ruby_cms/templates/db/migrate/20260525160000_create_command_runs.rb +22 -0
- data/lib/generators/ruby_cms/templates/db/migrate/20260525190000_add_state_to_visitor_errors.rb +20 -0
- data/lib/generators/ruby_cms/templates/db/migrate/20260527165017_add_discarded_at_to_visitor_errors.rb +10 -0
- data/lib/generators/ruby_cms/templates/db/migrate/20260527165728_add_discarded_at_to_cms_tables.rb +12 -0
- data/lib/generators/ruby_cms/templates/db/migrate/20260605151935_create_passkey_credentials.rb +15 -0
- data/lib/generators/ruby_cms/templates/db/migrate/20260605151936_add_webauthn_id_to_users.rb +22 -0
- data/lib/generators/ruby_cms/templates/db/migrate/20260606000001_add_authenticated_at_to_sessions.rb +14 -0
- data/lib/generators/ruby_cms/templates/helpers/admin/admin_page_helper.rb +9 -0
- data/lib/generators/ruby_cms/templates/helpers/admin/dashboard_helper.rb +16 -0
- data/lib/generators/ruby_cms/templates/helpers/admin/media_assets_helper.rb +38 -0
- data/lib/generators/ruby_cms/templates/helpers/admin/relative_time_helper.rb +37 -0
- data/lib/generators/ruby_cms/templates/helpers/admin/ui_helper.rb +48 -0
- data/lib/generators/ruby_cms/templates/helpers/cms_application_helpers.rb +70 -0
- data/lib/generators/ruby_cms/templates/helpers/content_blocks_helper.rb +382 -0
- data/lib/generators/ruby_cms/templates/helpers/settings_helper.rb +192 -0
- data/lib/generators/ruby_cms/templates/javascript/admin.js +6 -0
- data/{app/javascript/controllers/ruby_cms → lib/generators/ruby_cms/templates/javascript/controllers/admin}/admin_commands_controller.js +2 -2
- data/lib/generators/ruby_cms/templates/javascript/controllers/admin/autosearch_controller.js +18 -0
- data/{app/javascript/controllers/ruby_cms → lib/generators/ruby_cms/templates/javascript/controllers/admin}/clickable_row_controller.js +11 -0
- data/lib/generators/ruby_cms/templates/javascript/controllers/admin/clipboard_controller.js +34 -0
- data/lib/generators/ruby_cms/templates/javascript/controllers/admin/command_palette_controller.js +189 -0
- data/lib/generators/ruby_cms/templates/javascript/controllers/admin/commands_controller.js +300 -0
- data/lib/generators/ruby_cms/templates/javascript/controllers/admin/content_block_history_controller.js +167 -0
- data/{app/javascript/controllers/ruby_cms → lib/generators/ruby_cms/templates/javascript/controllers/admin}/flash_messages_controller.js +1 -1
- data/lib/generators/ruby_cms/templates/javascript/controllers/admin/inline_rich_editor_controller.js +157 -0
- data/lib/generators/ruby_cms/templates/javascript/controllers/admin/media_selection_controller.js +76 -0
- data/lib/generators/ruby_cms/templates/javascript/controllers/admin/media_uploader_controller.js +23 -0
- data/lib/generators/ruby_cms/templates/javascript/controllers/admin/mobile_menu_controller.js +125 -0
- data/lib/generators/ruby_cms/templates/javascript/controllers/admin/nav_order_sortable_controller.js +296 -0
- data/lib/generators/ruby_cms/templates/javascript/controllers/admin/nav_shortcuts_controller.js +47 -0
- data/{app/javascript/controllers/ruby_cms → lib/generators/ruby_cms/templates/javascript/controllers/admin}/page_preview_controller.js +64 -3
- data/lib/generators/ruby_cms/templates/javascript/controllers/admin/permission_matrix_controller.js +49 -0
- data/lib/generators/ruby_cms/templates/javascript/controllers/admin/search_shortcut_controller.js +24 -0
- data/lib/generators/ruby_cms/templates/javascript/controllers/admin/settings_rail_search_controller.js +17 -0
- data/lib/generators/ruby_cms/templates/javascript/controllers/admin/shortcuts_overlay_controller.js +39 -0
- data/lib/generators/ruby_cms/templates/javascript/controllers/admin/sidebar_collapse_controller.js +135 -0
- data/lib/generators/ruby_cms/templates/javascript/controllers/admin/sidebar_nav_persist_controller.js +48 -0
- data/lib/generators/ruby_cms/templates/javascript/controllers/admin/sidebar_toggle_trigger_controller.js +10 -0
- data/lib/generators/ruby_cms/templates/javascript/controllers/admin/topbar_controller.js +88 -0
- data/lib/generators/ruby_cms/templates/javascript/controllers/admin/visual_editor_controller.js +721 -0
- data/lib/generators/ruby_cms/templates/javascript/controllers/admin/visual_editor_page_select_controller.js +174 -0
- data/lib/generators/ruby_cms/templates/javascript/controllers/application.js +10 -0
- data/lib/generators/ruby_cms/templates/javascript/controllers/index.js +2 -0
- data/lib/generators/ruby_cms/templates/javascript/controllers/ruby_ui/accordion_controller.js +97 -0
- data/{app/javascript/controllers/ruby_cms → lib/generators/ruby_cms/templates/javascript/controllers/ruby_ui}/bulk_action_table_controller.js +86 -233
- data/lib/generators/ruby_cms/templates/javascript/controllers/ruby_ui/calendar_controller.js +249 -0
- data/lib/generators/ruby_cms/templates/javascript/controllers/ruby_ui/calendar_input_controller.js +8 -0
- data/lib/generators/ruby_cms/templates/javascript/controllers/ruby_ui/carousel_controller.js +60 -0
- data/lib/generators/ruby_cms/templates/javascript/controllers/ruby_ui/checkbox_group_controller.js +21 -0
- data/lib/generators/ruby_cms/templates/javascript/controllers/ruby_ui/clipboard_controller.js +54 -0
- data/lib/generators/ruby_cms/templates/javascript/controllers/ruby_ui/collapsible_controller.js +47 -0
- data/lib/generators/ruby_cms/templates/javascript/controllers/ruby_ui/combobox_controller.js +190 -0
- data/lib/generators/ruby_cms/templates/javascript/controllers/ruby_ui/command_controller.js +138 -0
- data/lib/generators/ruby_cms/templates/javascript/controllers/ruby_ui/context_menu_controller.js +144 -0
- data/lib/generators/ruby_cms/templates/javascript/controllers/ruby_ui/data_table_column_visibility_controller.js +14 -0
- data/lib/generators/ruby_cms/templates/javascript/controllers/ruby_ui/data_table_controller.js +109 -0
- data/lib/generators/ruby_cms/templates/javascript/controllers/ruby_ui/data_table_search_controller.js +62 -0
- data/lib/generators/ruby_cms/templates/javascript/controllers/ruby_ui/dialog_controller.js +32 -0
- data/lib/generators/ruby_cms/templates/javascript/controllers/ruby_ui/dropdown_menu_controller.js +149 -0
- data/lib/generators/ruby_cms/templates/javascript/controllers/ruby_ui/form_field_controller.js +61 -0
- data/lib/generators/ruby_cms/templates/javascript/controllers/ruby_ui/hover_card_controller.js +153 -0
- data/lib/generators/ruby_cms/templates/javascript/controllers/ruby_ui/masked_input_controller.js +9 -0
- data/lib/generators/ruby_cms/templates/javascript/controllers/ruby_ui/modal_controller.js +45 -0
- data/lib/generators/ruby_cms/templates/javascript/controllers/ruby_ui/popover_controller.js +107 -0
- data/lib/generators/ruby_cms/templates/javascript/controllers/ruby_ui/select_controller.js +192 -0
- data/lib/generators/ruby_cms/templates/javascript/controllers/ruby_ui/select_item_controller.js +11 -0
- data/lib/generators/ruby_cms/templates/javascript/controllers/ruby_ui/sheet_content_controller.js +7 -0
- data/lib/generators/ruby_cms/templates/javascript/controllers/ruby_ui/sheet_controller.js +9 -0
- data/lib/generators/ruby_cms/templates/javascript/controllers/ruby_ui/tabs_controller.js +67 -0
- data/lib/generators/ruby_cms/templates/javascript/controllers/ruby_ui/theme_toggle_controller.js +30 -0
- data/lib/generators/ruby_cms/templates/javascript/controllers/ruby_ui/tooltip_controller.js +38 -0
- data/lib/generators/ruby_cms/templates/javascript/controllers/webauthn_controller.js +153 -0
- data/lib/generators/ruby_cms/templates/lib/ruby_cms/cli.rb +170 -0
- data/lib/generators/ruby_cms/templates/lib/ruby_cms/commands_registry.rb +76 -0
- data/lib/{ruby_cms → generators/ruby_cms/templates/lib/ruby_cms}/content_blocks_grouping.rb +2 -6
- data/lib/{ruby_cms → generators/ruby_cms/templates/lib/ruby_cms}/content_blocks_sync.rb +6 -8
- data/lib/{ruby_cms → generators/ruby_cms/templates/lib/ruby_cms}/dashboard_blocks.rb +5 -5
- data/lib/{ruby_cms → generators/ruby_cms/templates/lib/ruby_cms}/icons.rb +41 -10
- data/lib/{ruby_cms → generators/ruby_cms/templates/lib/ruby_cms}/settings.rb +60 -10
- data/lib/{ruby_cms → generators/ruby_cms/templates/lib/ruby_cms}/settings_registry.rb +79 -3
- data/lib/generators/ruby_cms/templates/lib/ruby_cms.rb +342 -0
- data/lib/{tasks → generators/ruby_cms/templates/lib/tasks}/admin.rake +16 -16
- data/lib/generators/ruby_cms/templates/lib/tasks/ruby_cms.rake +158 -0
- data/lib/generators/ruby_cms/templates/models/audit_log_entry.rb +56 -0
- data/lib/generators/ruby_cms/templates/models/command_run.rb +29 -0
- data/lib/generators/ruby_cms/templates/models/concerns/content_block/searchable.rb +18 -0
- data/{app → lib/generators/ruby_cms/templates}/models/concerns/content_block/versionable.rb +1 -1
- data/lib/generators/ruby_cms/templates/models/concerns/ransackable.rb +32 -0
- data/{app → lib/generators/ruby_cms/templates}/models/content_block.rb +13 -5
- data/lib/generators/ruby_cms/templates/models/email_blocklist.rb +21 -0
- data/lib/generators/ruby_cms/templates/models/invitation.rb +86 -0
- data/lib/generators/ruby_cms/templates/models/ip_blocklist.rb +34 -0
- data/lib/generators/ruby_cms/templates/models/media_asset.rb +90 -0
- data/lib/generators/ruby_cms/templates/models/passkey_credential.rb +6 -0
- data/lib/generators/ruby_cms/templates/models/permission.rb +71 -0
- data/lib/generators/ruby_cms/templates/models/permittable.rb +69 -0
- data/lib/generators/ruby_cms/templates/models/preference.rb +109 -0
- data/lib/generators/ruby_cms/templates/models/redirect.rb +100 -0
- data/lib/generators/ruby_cms/templates/models/user_permission.rb +25 -0
- data/lib/generators/ruby_cms/templates/models/visitor_error.rb +157 -0
- data/lib/generators/ruby_cms/templates/nav/analytics.rb +3 -0
- data/lib/generators/ruby_cms/templates/nav/audit_log.rb +3 -0
- data/lib/generators/ruby_cms/templates/nav/commands.rb +3 -0
- data/lib/generators/ruby_cms/templates/nav/content_blocks.rb +3 -0
- data/lib/generators/ruby_cms/templates/nav/core.rb +13 -0
- data/lib/generators/ruby_cms/templates/nav/media.rb +3 -0
- data/lib/generators/ruby_cms/templates/nav/permissions.rb +3 -0
- data/lib/generators/ruby_cms/templates/nav/redirects.rb +3 -0
- data/lib/generators/ruby_cms/templates/nav/security.rb +4 -0
- data/lib/generators/ruby_cms/templates/nav/system_health.rb +3 -0
- data/lib/generators/ruby_cms/templates/nav/trash.rb +3 -0
- data/lib/generators/ruby_cms/templates/nav/users.rb +3 -0
- data/lib/generators/ruby_cms/templates/nav/visual_editor.rb +3 -0
- data/lib/generators/ruby_cms/templates/routes/analytics.rb +5 -0
- data/lib/generators/ruby_cms/templates/routes/audit_log.rb +3 -0
- data/lib/generators/ruby_cms/templates/routes/auth.public.rb +4 -0
- data/lib/generators/ruby_cms/templates/routes/auth.rb +6 -0
- data/lib/generators/ruby_cms/templates/routes/commands.rb +4 -0
- data/lib/generators/ruby_cms/templates/routes/content_blocks.rb +12 -0
- data/lib/generators/ruby_cms/templates/routes/core.public.rb +5 -0
- data/lib/generators/ruby_cms/templates/routes/core.rb +16 -0
- data/lib/generators/ruby_cms/templates/routes/media.rb +9 -0
- data/lib/generators/ruby_cms/templates/routes/passkeys.public.rb +4 -0
- data/lib/generators/ruby_cms/templates/routes/passkeys.rb +5 -0
- data/lib/generators/ruby_cms/templates/routes/permissions.rb +5 -0
- data/lib/generators/ruby_cms/templates/routes/redirects.rb +10 -0
- data/lib/generators/ruby_cms/templates/routes/security.rb +20 -0
- data/lib/generators/ruby_cms/templates/routes/system_health.rb +3 -0
- data/lib/generators/ruby_cms/templates/routes/trash.rb +5 -0
- data/lib/generators/ruby_cms/templates/routes/users.rb +10 -0
- data/lib/generators/ruby_cms/templates/routes/visual_editor.rb +5 -0
- data/lib/generators/ruby_cms/templates/services/admin/health_check.rb +362 -0
- data/lib/generators/ruby_cms/templates/services/analytics/report.rb +503 -0
- data/lib/generators/ruby_cms/templates/services/analytics_service.rb +305 -0
- data/lib/generators/ruby_cms/templates/services/audit_log.rb +60 -0
- data/lib/generators/ruby_cms/templates/services/command_runner.rb +79 -0
- data/lib/generators/ruby_cms/templates/services/security_service.rb +203 -0
- data/lib/generators/ruby_cms/templates/services/security_tracker.rb +90 -0
- data/{app/views/ruby_cms → lib/generators/ruby_cms/templates/views}/admin/analytics/index.html.erb +61 -50
- data/{app/views/ruby_cms → lib/generators/ruby_cms/templates/views}/admin/analytics/page_details.html.erb +15 -10
- data/{app/views/ruby_cms → lib/generators/ruby_cms/templates/views}/admin/analytics/partials/_browser_device.html.erb +2 -2
- data/{app/views/ruby_cms → lib/generators/ruby_cms/templates/views}/admin/analytics/partials/_conversions.html.erb +3 -3
- data/{app/views/ruby_cms → lib/generators/ruby_cms/templates/views}/admin/analytics/partials/_daily_activity_chart.html.erb +18 -17
- data/{app/views/ruby_cms → lib/generators/ruby_cms/templates/views}/admin/analytics/partials/_exit_pages.html.erb +4 -4
- data/{app/views/ruby_cms → lib/generators/ruby_cms/templates/views}/admin/analytics/partials/_hourly_activity_chart.html.erb +18 -17
- data/{app/views/ruby_cms → lib/generators/ruby_cms/templates/views}/admin/analytics/partials/_landing_pages.html.erb +3 -3
- data/{app/views/ruby_cms → lib/generators/ruby_cms/templates/views}/admin/analytics/partials/_os_stats.html.erb +2 -2
- data/{app/views/ruby_cms → lib/generators/ruby_cms/templates/views}/admin/analytics/partials/_popular_pages.html.erb +4 -4
- data/{app/views/ruby_cms → lib/generators/ruby_cms/templates/views}/admin/analytics/partials/_recent_activity.html.erb +4 -4
- data/{app/views/ruby_cms → lib/generators/ruby_cms/templates/views}/admin/analytics/partials/_top_referrers.html.erb +3 -3
- data/{app/views/ruby_cms → lib/generators/ruby_cms/templates/views}/admin/analytics/partials/_top_visitors.html.erb +4 -4
- data/{app/views/ruby_cms → lib/generators/ruby_cms/templates/views}/admin/analytics/partials/_utm_sources.html.erb +2 -2
- data/{app/views/ruby_cms → lib/generators/ruby_cms/templates/views}/admin/analytics/visitor_details.html.erb +15 -10
- data/lib/generators/ruby_cms/templates/views/admin/audit_log_entries/_admin_table_content.html.erb +55 -0
- data/lib/generators/ruby_cms/templates/views/admin/audit_log_entries/_row.html.erb +84 -0
- data/lib/generators/ruby_cms/templates/views/admin/audit_log_entries/index.html.erb +33 -0
- data/lib/generators/ruby_cms/templates/views/admin/audit_log_entries/show.html.erb +89 -0
- data/lib/generators/ruby_cms/templates/views/admin/commands/index.html.erb +393 -0
- data/lib/generators/ruby_cms/templates/views/admin/content_block_versions/index.html.erb +63 -0
- data/{app/views/ruby_cms → lib/generators/ruby_cms/templates/views}/admin/content_block_versions/show.html.erb +2 -2
- data/lib/generators/ruby_cms/templates/views/admin/content_blocks/_audits.html.erb +49 -0
- data/lib/generators/ruby_cms/templates/views/admin/content_blocks/_form.html.erb +79 -0
- data/lib/generators/ruby_cms/templates/views/admin/content_blocks/_rich_field.html.erb +44 -0
- data/lib/generators/ruby_cms/templates/views/admin/content_blocks/_row.html.erb +60 -0
- data/lib/generators/ruby_cms/templates/views/admin/content_blocks/index.html.erb +84 -0
- data/lib/generators/ruby_cms/templates/views/admin/content_blocks/new.html.erb +18 -0
- data/{app/views/ruby_cms → lib/generators/ruby_cms/templates/views}/admin/content_blocks/show.html.erb +67 -61
- data/lib/generators/ruby_cms/templates/views/admin/dashboard/_gmail_token_status.html.erb +69 -0
- data/{app/views/ruby_cms → lib/generators/ruby_cms/templates/views}/admin/dashboard/blocks/_analytics_overview.html.erb +11 -11
- data/{app/views/ruby_cms → lib/generators/ruby_cms/templates/views}/admin/dashboard/blocks/_content_blocks_stats.html.erb +3 -3
- data/lib/generators/ruby_cms/templates/views/admin/dashboard/blocks/_notifications.html.erb +50 -0
- data/{app/views/ruby_cms → lib/generators/ruby_cms/templates/views}/admin/dashboard/blocks/_permissions_stats.html.erb +3 -3
- data/{app/views/ruby_cms → lib/generators/ruby_cms/templates/views}/admin/dashboard/blocks/_quick_actions.html.erb +15 -15
- data/{app/views/ruby_cms → lib/generators/ruby_cms/templates/views}/admin/dashboard/blocks/_recent_errors.html.erb +8 -8
- data/{app/views/ruby_cms → lib/generators/ruby_cms/templates/views}/admin/dashboard/blocks/_users_stats.html.erb +3 -3
- data/{app/views/ruby_cms → lib/generators/ruby_cms/templates/views}/admin/dashboard/blocks/_visitor_errors_stats.html.erb +3 -3
- data/lib/generators/ruby_cms/templates/views/admin/dashboard/index.html.erb +34 -0
- data/lib/generators/ruby_cms/templates/views/admin/media_assets/_admin_table_content.html.erb +107 -0
- data/lib/generators/ruby_cms/templates/views/admin/media_assets/_form.html.erb +33 -0
- data/lib/generators/ruby_cms/templates/views/admin/media_assets/_grid.html.erb +58 -0
- data/lib/generators/ruby_cms/templates/views/admin/media_assets/_list.html.erb +43 -0
- data/lib/generators/ruby_cms/templates/views/admin/media_assets/edit.html.erb +13 -0
- data/lib/generators/ruby_cms/templates/views/admin/media_assets/index.html.erb +36 -0
- data/lib/generators/ruby_cms/templates/views/admin/media_assets/show.html.erb +97 -0
- data/lib/generators/ruby_cms/templates/views/admin/passkey_credentials/index.html.erb +30 -0
- data/lib/generators/ruby_cms/templates/views/admin/passkey_registrations/new.html.erb +23 -0
- data/lib/generators/ruby_cms/templates/views/admin/permissions/_admin_table_content.html.erb +45 -0
- data/lib/generators/ruby_cms/templates/views/admin/permissions/_matrix.html.erb +75 -0
- data/lib/generators/ruby_cms/templates/views/admin/permissions/_row.html.erb +62 -0
- data/lib/generators/ruby_cms/templates/views/admin/permissions/index.html.erb +65 -0
- data/lib/generators/ruby_cms/templates/views/admin/redirects/_admin_table_content.html.erb +77 -0
- data/lib/generators/ruby_cms/templates/views/admin/redirects/_form.html.erb +97 -0
- data/lib/generators/ruby_cms/templates/views/admin/redirects/_row.html.erb +82 -0
- data/lib/generators/ruby_cms/templates/views/admin/redirects/edit.html.erb +21 -0
- data/lib/generators/ruby_cms/templates/views/admin/redirects/index.html.erb +40 -0
- data/lib/generators/ruby_cms/templates/views/admin/redirects/new.html.erb +12 -0
- data/lib/generators/ruby_cms/templates/views/admin/security/index.html.erb +88 -0
- data/lib/generators/ruby_cms/templates/views/admin/security/ip_blocklist_content.html.erb +3 -0
- data/lib/generators/ruby_cms/templates/views/admin/security/partials/_events_by_type.html.erb +24 -0
- data/lib/generators/ruby_cms/templates/views/admin/security/partials/_ip_blocklist.html.erb +37 -0
- data/lib/generators/ruby_cms/templates/views/admin/security/partials/_ip_blocklist_content.html.erb +41 -0
- data/lib/generators/ruby_cms/templates/views/admin/security/partials/_ip_management.html.erb +11 -0
- data/lib/generators/ruby_cms/templates/views/admin/security/partials/_recent_events.html.erb +59 -0
- data/lib/generators/ruby_cms/templates/views/admin/security/partials/_top_threat_ips.html.erb +21 -0
- data/lib/generators/ruby_cms/templates/views/admin/settings/index.html.erb +509 -0
- data/lib/generators/ruby_cms/templates/views/admin/shared/_add_button.html.erb +15 -0
- data/lib/generators/ruby_cms/templates/views/admin/shared/_data_table.html.erb +255 -0
- data/lib/generators/ruby_cms/templates/views/admin/shared/_turbo_pagination.html.erb +53 -0
- data/lib/generators/ruby_cms/templates/views/admin/system_health/index.html.erb +248 -0
- data/lib/generators/ruby_cms/templates/views/admin/trash/index.html.erb +58 -0
- data/lib/generators/ruby_cms/templates/views/admin/user_permissions/_row.html.erb +29 -0
- data/lib/generators/ruby_cms/templates/views/admin/user_permissions/index.html.erb +78 -0
- data/lib/generators/ruby_cms/templates/views/admin/users/_admin_table_content.html.erb +50 -0
- data/lib/generators/ruby_cms/templates/views/admin/users/_invite_form.html.erb +43 -0
- data/lib/generators/ruby_cms/templates/views/admin/users/_invites_panel.html.erb +91 -0
- data/lib/generators/ruby_cms/templates/views/admin/users/_row.html.erb +109 -0
- data/lib/generators/ruby_cms/templates/views/admin/users/index.html.erb +43 -0
- data/lib/generators/ruby_cms/templates/views/admin/users/show.html.erb +343 -0
- data/lib/generators/ruby_cms/templates/views/admin/visitor_errors/_admin_table_content.html.erb +61 -0
- data/lib/generators/ruby_cms/templates/views/admin/visitor_errors/_row.html.erb +90 -0
- data/lib/generators/ruby_cms/templates/views/admin/visitor_errors/index.html.erb +18 -0
- data/{app/views/ruby_cms → lib/generators/ruby_cms/templates/views}/admin/visitor_errors/show.html.erb +4 -4
- data/lib/generators/ruby_cms/templates/views/admin/visual_editor/index.html.erb +383 -0
- data/{app/views/layouts/ruby_cms → lib/generators/ruby_cms/templates/views/layouts/admin}/_admin_flash_messages.html.erb +3 -3
- data/lib/generators/ruby_cms/templates/views/layouts/admin/_admin_sidebar.html.erb +239 -0
- data/lib/generators/ruby_cms/templates/views/layouts/admin/_command_palette.html.erb +65 -0
- data/lib/generators/ruby_cms/templates/views/layouts/admin/_shortcuts_overlay.html.erb +81 -0
- data/lib/generators/ruby_cms/templates/views/layouts/admin/_topbar_widgets.html.erb +9 -0
- data/lib/generators/ruby_cms/templates/views/layouts/admin/minimal.html.erb +71 -0
- data/lib/generators/ruby_cms/templates/views/layouts/admin/topbar/_bell.html.erb +81 -0
- data/lib/generators/ruby_cms/templates/views/layouts/admin/topbar/_profile_menu.html.erb +86 -0
- data/lib/generators/ruby_cms/templates/views/layouts/admin/topbar/_search_trigger.html.erb +9 -0
- data/lib/generators/ruby_cms/templates/views/layouts/admin/topbar/_shortcuts_button.html.erb +8 -0
- data/lib/generators/ruby_cms/templates/views/shared/_maintenance_banner.html.erb +10 -0
- data/lib/ruby_cms/app_wiring.rb +56 -0
- data/lib/ruby_cms/auth_wiring.rb +64 -0
- data/lib/ruby_cms/cli.rb +181 -121
- data/lib/ruby_cms/excludes.rb +41 -0
- data/lib/ruby_cms/file_installer.rb +41 -0
- data/lib/ruby_cms/gem_setup.rb +84 -0
- data/lib/ruby_cms/helper_wiring.rb +32 -0
- data/lib/ruby_cms/importmap_wiring.rb +41 -0
- data/lib/ruby_cms/installer.rb +128 -0
- data/lib/ruby_cms/lockfile.rb +49 -0
- data/lib/ruby_cms/manifest.rb +88 -0
- data/lib/ruby_cms/manifest_data.rb +233 -0
- data/lib/ruby_cms/migration_installer.rb +64 -0
- data/lib/ruby_cms/nav_assembler.rb +43 -0
- data/lib/ruby_cms/passkey_wiring.rb +42 -0
- data/lib/ruby_cms/path_map.rb +26 -0
- data/lib/ruby_cms/routes_assembler.rb +103 -0
- data/lib/ruby_cms/syncer.rb +81 -0
- data/lib/ruby_cms/updater.rb +76 -0
- data/lib/ruby_cms/version.rb +1 -1
- data/lib/ruby_cms.rb +4 -245
- metadata +606 -169
- data/.cursor/dhh.mdc +0 -698
- data/app/components/ruby_cms/admin/admin_page/admin_table_content.rb +0 -32
- data/app/components/ruby_cms/admin/admin_page.rb +0 -345
- data/app/components/ruby_cms/admin/admin_page_header.rb +0 -79
- data/app/components/ruby_cms/admin/admin_resource_card.rb +0 -55
- data/app/components/ruby_cms/admin/base_component.rb +0 -78
- data/app/components/ruby_cms/admin/bulk_action_table/bulk_action_table.rb +0 -157
- data/app/components/ruby_cms/admin/bulk_action_table/bulk_action_table_actions.rb +0 -127
- data/app/components/ruby_cms/admin/bulk_action_table/bulk_action_table_body.rb +0 -15
- data/app/components/ruby_cms/admin/bulk_action_table/bulk_action_table_checkbox_cell.rb +0 -43
- data/app/components/ruby_cms/admin/bulk_action_table/bulk_action_table_checkbox_head.rb +0 -35
- data/app/components/ruby_cms/admin/bulk_action_table/bulk_action_table_delete_modal.rb +0 -174
- data/app/components/ruby_cms/admin/bulk_action_table/bulk_action_table_header.rb +0 -59
- data/app/components/ruby_cms/admin/bulk_action_table/bulk_action_table_header_bar.rb +0 -169
- data/app/components/ruby_cms/admin/bulk_action_table/bulk_action_table_pagination.rb +0 -192
- data/app/components/ruby_cms/admin/bulk_action_table/bulk_action_table_row.rb +0 -96
- data/app/components/ruby_cms/admin/bulk_action_table/bulk_actions.rb +0 -196
- data/app/controllers/concerns/ruby_cms/admin_pagination.rb +0 -120
- data/app/controllers/concerns/ruby_cms/admin_turbo_table.rb +0 -68
- data/app/controllers/concerns/ruby_cms/page_tracking.rb +0 -67
- data/app/controllers/concerns/ruby_cms/visitor_error_capture.rb +0 -39
- data/app/controllers/ruby_cms/admin/analytics_controller.rb +0 -213
- data/app/controllers/ruby_cms/admin/base_controller.rb +0 -132
- data/app/controllers/ruby_cms/admin/commands_controller.rb +0 -122
- data/app/controllers/ruby_cms/admin/content_block_versions_controller.rb +0 -62
- data/app/controllers/ruby_cms/admin/content_blocks_controller.rb +0 -391
- data/app/controllers/ruby_cms/admin/dashboard_controller.rb +0 -89
- data/app/controllers/ruby_cms/admin/locale_controller.rb +0 -21
- data/app/controllers/ruby_cms/admin/permissions_controller.rb +0 -66
- data/app/controllers/ruby_cms/admin/settings_controller.rb +0 -223
- data/app/controllers/ruby_cms/admin/user_permissions_controller.rb +0 -77
- data/app/controllers/ruby_cms/admin/users_controller.rb +0 -107
- data/app/controllers/ruby_cms/admin/visitor_errors_controller.rb +0 -89
- data/app/controllers/ruby_cms/admin/visual_editor_controller.rb +0 -345
- data/app/controllers/ruby_cms/errors_controller.rb +0 -35
- data/app/helpers/ruby_cms/admin/admin_page_helper.rb +0 -21
- data/app/helpers/ruby_cms/admin/bulk_action_table_helper.rb +0 -159
- data/app/helpers/ruby_cms/admin/dashboard_helper.rb +0 -20
- data/app/helpers/ruby_cms/application_helper.rb +0 -41
- data/app/helpers/ruby_cms/bulk_action_table_helper.rb +0 -151
- data/app/helpers/ruby_cms/content_blocks_helper.rb +0 -399
- data/app/helpers/ruby_cms/settings_helper.rb +0 -172
- data/app/javascript/controllers/ruby_cms/content_block_history_controller.js +0 -91
- data/app/javascript/controllers/ruby_cms/index.js +0 -117
- data/app/javascript/controllers/ruby_cms/mobile_menu_controller.js +0 -55
- data/app/javascript/controllers/ruby_cms/nav_order_sortable_controller.js +0 -192
- data/app/javascript/controllers/ruby_cms/visual_editor_controller.js +0 -325
- data/app/models/concerns/content_block/searchable.rb +0 -22
- data/app/models/ruby_cms/content_block.rb +0 -8
- data/app/models/ruby_cms/permission.rb +0 -57
- data/app/models/ruby_cms/permittable.rb +0 -37
- data/app/models/ruby_cms/preference.rb +0 -111
- data/app/models/ruby_cms/user_permission.rb +0 -12
- data/app/models/ruby_cms/visitor_error.rb +0 -109
- data/app/services/ruby_cms/analytics/report.rb +0 -512
- data/app/services/ruby_cms/command_runner.rb +0 -42
- data/app/services/ruby_cms/security_tracker.rb +0 -92
- data/app/views/admin/content_block_versions/index.html.erb +0 -52
- data/app/views/admin/content_block_versions/show.html.erb +0 -37
- data/app/views/layouts/ruby_cms/_admin_sidebar.html.erb +0 -122
- data/app/views/layouts/ruby_cms/admin.html.erb +0 -77
- data/app/views/layouts/ruby_cms/minimal.html.erb +0 -181
- data/app/views/ruby_cms/admin/commands/index.html.erb +0 -104
- data/app/views/ruby_cms/admin/content_block_versions/index.html.erb +0 -52
- data/app/views/ruby_cms/admin/content_blocks/_form.html.erb +0 -92
- data/app/views/ruby_cms/admin/content_blocks/_row.html.erb +0 -25
- data/app/views/ruby_cms/admin/content_blocks/index.html.erb +0 -62
- data/app/views/ruby_cms/admin/content_blocks/new.html.erb +0 -10
- data/app/views/ruby_cms/admin/dashboard/index.html.erb +0 -31
- data/app/views/ruby_cms/admin/permissions/_row.html.erb +0 -11
- data/app/views/ruby_cms/admin/permissions/index.html.erb +0 -62
- data/app/views/ruby_cms/admin/settings/index.html.erb +0 -268
- data/app/views/ruby_cms/admin/shared/_bulk_action_table_index.html.erb +0 -56
- data/app/views/ruby_cms/admin/user_permissions/index.html.erb +0 -85
- data/app/views/ruby_cms/admin/users/_row.html.erb +0 -17
- data/app/views/ruby_cms/admin/users/index.html.erb +0 -70
- data/app/views/ruby_cms/admin/visitor_errors/_row.html.erb +0 -35
- data/app/views/ruby_cms/admin/visitor_errors/index.html.erb +0 -57
- data/app/views/ruby_cms/admin/visual_editor/index.html.erb +0 -157
- data/app/views/ruby_cms/errors/not_found.html.erb +0 -92
- data/config/database.yml +0 -6
- data/config/importmap.rb +0 -40
- data/config/locales/en.yml +0 -198
- data/config/locales/nl.yml +0 -156
- data/config/routes.rb +0 -76
- data/db/migrate/20260130000001_add_referer_and_query_to_ruby_cms_visitor_errors.rb +0 -8
- data/db/migrate/20260130000003_add_category_to_ruby_cms_preferences.rb +0 -8
- data/docs/assets/ruby_cms_logo.png +0 -0
- data/lib/generators/ruby_cms/install_generator.rb +0 -1080
- data/lib/ruby_cms/app_integration.rb +0 -82
- data/lib/ruby_cms/commands_registry.rb +0 -40
- data/lib/ruby_cms/css_compiler.rb +0 -35
- data/lib/ruby_cms/engine/admin_permissions.rb +0 -69
- data/lib/ruby_cms/engine/content_blocks_tasks.rb +0 -66
- data/lib/ruby_cms/engine/css.rb +0 -14
- data/lib/ruby_cms/engine/dashboard_registration.rb +0 -66
- data/lib/ruby_cms/engine/navigation_registration.rb +0 -89
- data/lib/ruby_cms/engine.rb +0 -273
- /data/{app → lib/generators/ruby_cms/templates}/assets/images/ruby_cms/logo.png +0 -0
- /data/{db → lib/generators/ruby_cms/templates/db}/migrate/20260211000001_add_ruby_cms_analytics_fields_to_ahoy_events.rb +0 -0
- /data/{db → lib/generators/ruby_cms/templates/db}/migrate/20260212000001_use_unprefixed_cms_tables.rb +0 -0
- /data/{db → lib/generators/ruby_cms/templates/db}/migrate/20260409000001_add_analytics_performance_indexes.rb +0 -0
- /data/{app/javascript/controllers/ruby_cms → lib/generators/ruby_cms/templates/javascript/controllers/admin}/auto_save_preference_controller.js +0 -0
- /data/{app/javascript/controllers/ruby_cms → lib/generators/ruby_cms/templates/javascript/controllers/admin}/locale_tabs_controller.js +0 -0
- /data/{app/javascript/controllers/ruby_cms → lib/generators/ruby_cms/templates/javascript/controllers/admin}/toggle_controller.js +0 -0
- /data/{app → lib/generators/ruby_cms/templates}/models/concerns/content_block/publishable.rb +0 -0
- /data/{app → lib/generators/ruby_cms/templates}/models/content_block_version.rb +0 -0
- /data/{app/views/ruby_cms → lib/generators/ruby_cms/templates/views}/admin/analytics/partials/_back_button.html.erb +0 -0
- /data/{app/views/ruby_cms → lib/generators/ruby_cms/templates/views}/admin/analytics/partials/_security_alert.html.erb +0 -0
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
<% gmail_token = @current_user_cms&.google_oauth_token %>
|
|
2
|
+
<% gmail_connected = @current_user_cms&.gmail_connected? %>
|
|
3
|
+
<div class="flex h-full flex-col rounded-lg border border-gray-200/80 bg-white shadow-sm">
|
|
4
|
+
<div class="flex items-center justify-between gap-3 border-b border-gray-100 px-5 py-3">
|
|
5
|
+
<div>
|
|
6
|
+
<p class="text-sm font-semibold text-gray-900">Gmail</p>
|
|
7
|
+
<p class="text-xs text-gray-500">OAuth-token voor mail verzenden.</p>
|
|
8
|
+
</div>
|
|
9
|
+
<%= link_to "View all", admin_gmail_index_path, class: "text-sm font-medium text-gray-600 hover:text-gray-900 transition-colors" %>
|
|
10
|
+
</div>
|
|
11
|
+
|
|
12
|
+
<div class="flex-1 divide-y divide-gray-100">
|
|
13
|
+
<% if gmail_connected && gmail_token.present? %>
|
|
14
|
+
<div class="flex items-start gap-3 px-5 py-3">
|
|
15
|
+
<div class="mt-0.5 inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-lg bg-emerald-50 text-emerald-700 ring-1 ring-inset ring-emerald-100">
|
|
16
|
+
<svg class="h-3.5 w-3.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z" /></svg>
|
|
17
|
+
</div>
|
|
18
|
+
<div class="min-w-0 flex-1">
|
|
19
|
+
<div class="flex flex-wrap items-center gap-2">
|
|
20
|
+
<span class="inline-flex items-center rounded-md px-2 py-0.5 text-xs font-medium ring-1 ring-inset bg-emerald-50 text-emerald-700 ring-emerald-200">Verbonden</span>
|
|
21
|
+
</div>
|
|
22
|
+
<p class="mt-2 text-sm font-medium text-gray-900 truncate"><%= gmail_token.email %></p>
|
|
23
|
+
<p class="mt-1 text-sm text-gray-500">
|
|
24
|
+
Token verloopt
|
|
25
|
+
<% if gmail_token.expired? %>
|
|
26
|
+
<span class="font-medium text-rose-600"> — verlopen</span>
|
|
27
|
+
<% elsif gmail_token.expires_soon? %>
|
|
28
|
+
<span class="font-medium text-amber-600"> — <%= l gmail_token.expires_at, format: :short %> (binnenkort)</span>
|
|
29
|
+
<% else %>
|
|
30
|
+
<span class="text-gray-700"> — <%= l gmail_token.expires_at, format: :short %></span>
|
|
31
|
+
<% end %>
|
|
32
|
+
</p>
|
|
33
|
+
<% if gmail_token.refresh_failed? %>
|
|
34
|
+
<p class="mt-2 text-xs text-rose-600">
|
|
35
|
+
Laatste refresh mislukt
|
|
36
|
+
<% if gmail_token.respond_to?(:last_refresh_error) && gmail_token.last_refresh_error.present? %>
|
|
37
|
+
<span class="text-rose-700/90"> — <%= truncate(gmail_token.last_refresh_error, length: 120) %></span>
|
|
38
|
+
<% end %>
|
|
39
|
+
</p>
|
|
40
|
+
<% end %>
|
|
41
|
+
</div>
|
|
42
|
+
</div>
|
|
43
|
+
<% elsif gmail_token.present? %>
|
|
44
|
+
<div class="flex items-start gap-3 px-5 py-3">
|
|
45
|
+
<div class="mt-0.5 inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-lg bg-amber-50 text-amber-700 ring-1 ring-inset ring-amber-100">
|
|
46
|
+
<svg class="h-3.5 w-3.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 9v2m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" /></svg>
|
|
47
|
+
</div>
|
|
48
|
+
<div class="min-w-0 flex-1">
|
|
49
|
+
<span class="inline-flex items-center rounded-md px-2 py-0.5 text-xs font-medium ring-1 ring-inset bg-amber-50 text-amber-800 ring-amber-200">Actie nodig</span>
|
|
50
|
+
<p class="mt-2 text-sm text-gray-700">Token is ongeldig of verlopen. Vernieuw de koppeling onder Gmail.</p>
|
|
51
|
+
<% if gmail_token.email.present? %>
|
|
52
|
+
<p class="mt-1 text-xs text-gray-500">Laatst gekoppeld: <%= gmail_token.email %></p>
|
|
53
|
+
<% end %>
|
|
54
|
+
</div>
|
|
55
|
+
</div>
|
|
56
|
+
<% else %>
|
|
57
|
+
<div class="px-5 py-10 text-center">
|
|
58
|
+
<div class="mx-auto mb-2 inline-flex h-10 w-10 items-center justify-center rounded-lg bg-gray-100 text-gray-600 ring-1 ring-inset ring-gray-200">
|
|
59
|
+
<svg class="h-5 w-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 8l7.89 4.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z" /></svg>
|
|
60
|
+
</div>
|
|
61
|
+
<p class="text-sm font-medium text-gray-900">Geen Gmail gekoppeld</p>
|
|
62
|
+
<p class="mt-1 text-xs text-gray-500">Koppel je account om mail te verzenden.</p>
|
|
63
|
+
<%= link_to admin_gmail_index_path, class: "mt-4 inline-flex items-center gap-1 text-sm font-medium text-gray-600 hover:text-gray-900 transition-colors" do %>
|
|
64
|
+
Gmail koppelen <svg class="h-3 w-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2.5" d="M9 5l7 7-7 7" /></svg>
|
|
65
|
+
<% end %>
|
|
66
|
+
</div>
|
|
67
|
+
<% end %>
|
|
68
|
+
</div>
|
|
69
|
+
</div>
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
<%# Analytics — same outer shell as sibling cards; softer interior (no box-in-box borders) %>
|
|
2
2
|
<div class="flex h-full min-w-0 flex-col overflow-hidden rounded-lg border border-gray-200/80 bg-white shadow-sm">
|
|
3
3
|
<%# Header — aligned with Quick actions / Recent errors %>
|
|
4
|
-
<div class="flex items-center justify-between gap-2 border-b border-gray-100 px-
|
|
4
|
+
<div class="flex flex-wrap items-center justify-between gap-2 border-b border-gray-100 px-4 py-3 sm:px-5">
|
|
5
5
|
<div class="flex min-w-0 items-center gap-3">
|
|
6
6
|
<div class="flex h-8 w-8 shrink-0 items-center justify-center rounded-lg bg-sky-50 text-sky-600">
|
|
7
7
|
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true">
|
|
8
|
-
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 12l3-3 3 3 4-4M8 21l4-4 4 4M3 4h18M4 4h16v12a1 1 0 01-1 1H5a1 1 0 01-1-1V4z"/>
|
|
8
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 12l3-3 3 3 4-4M8 21l4-4 4 4M3 4h18M4 4h16v12a1 1 0 01-1 1H5a1 1 0 01-1-1V4z" />
|
|
9
9
|
</svg>
|
|
10
10
|
</div>
|
|
11
11
|
<div class="min-w-0">
|
|
@@ -14,13 +14,13 @@
|
|
|
14
14
|
</div>
|
|
15
15
|
</div>
|
|
16
16
|
<%= link_to t("ruby_cms.admin.dashboard.analytics_view_all", default: "View all"),
|
|
17
|
-
|
|
17
|
+
admin_analytics_path,
|
|
18
18
|
class: "shrink-0 text-sm font-medium text-gray-600 transition-colors hover:text-gray-900" %>
|
|
19
19
|
</div>
|
|
20
20
|
|
|
21
21
|
<% if @dashboard_analytics_stats.present? %>
|
|
22
22
|
<%# KPIs — no inner ring/border (rings can render as a harsh outline); same padding rhythm as sibling cards %>
|
|
23
|
-
<div class="px-
|
|
23
|
+
<div class="px-4 py-4 sm:px-5">
|
|
24
24
|
<div class="grid grid-cols-2 gap-x-4 gap-y-5">
|
|
25
25
|
<%
|
|
26
26
|
kpi = [
|
|
@@ -35,13 +35,13 @@
|
|
|
35
35
|
<div class="flex items-center gap-2 text-gray-500">
|
|
36
36
|
<% case item[:icon]
|
|
37
37
|
when "eye" %>
|
|
38
|
-
<svg class="h-4 w-4 shrink-0 <%= item[:cls] %>" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"/><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z"/></svg>
|
|
38
|
+
<svg class="h-4 w-4 shrink-0 <%= item[:cls] %>" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z" /><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z" /></svg>
|
|
39
39
|
<% when "users" %>
|
|
40
|
-
<svg class="h-4 w-4 shrink-0 <%= item[:cls] %>" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0z"/></svg>
|
|
40
|
+
<svg class="h-4 w-4 shrink-0 <%= item[:cls] %>" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0z" /></svg>
|
|
41
41
|
<% when "sessions" %>
|
|
42
|
-
<svg class="h-4 w-4 shrink-0 <%= item[:cls] %>" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z"/></svg>
|
|
42
|
+
<svg class="h-4 w-4 shrink-0 <%= item[:cls] %>" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z" /></svg>
|
|
43
43
|
<% else %>
|
|
44
|
-
<svg class="h-4 w-4 shrink-0 <%= item[:cls] %>" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>
|
|
44
|
+
<svg class="h-4 w-4 shrink-0 <%= item[:cls] %>" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z" /></svg>
|
|
45
45
|
<% end %>
|
|
46
46
|
<span class="text-[11px] font-medium leading-tight text-gray-600"><%= item[:label] %></span>
|
|
47
47
|
</div>
|
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
|
|
54
54
|
<% top = @dashboard_analytics_stats[:popular_pages] %>
|
|
55
55
|
<% if top.present? %>
|
|
56
|
-
<div class="flex-1 border-t border-gray-100 px-
|
|
56
|
+
<div class="flex-1 border-t border-gray-100 px-4 pb-4 pt-3 sm:px-5">
|
|
57
57
|
<p class="mb-2 text-xs font-medium text-gray-500"><%= t("ruby_cms.admin.dashboard.popular_pages", default: "Popular pages") %></p>
|
|
58
58
|
<ul class="space-y-0.5">
|
|
59
59
|
<% top.to_a.first(4).each_with_index do |(page_name, count), i| %>
|
|
@@ -69,9 +69,9 @@
|
|
|
69
69
|
</div>
|
|
70
70
|
<% end %>
|
|
71
71
|
<% else %>
|
|
72
|
-
<div class="flex flex-1 flex-col items-center justify-center px-
|
|
72
|
+
<div class="flex flex-1 flex-col items-center justify-center px-4 py-10 text-center sm:px-5">
|
|
73
73
|
<div class="mb-2 inline-flex h-10 w-10 items-center justify-center rounded-lg bg-gray-100 text-gray-500">
|
|
74
|
-
<svg class="h-5 w-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z"/></svg>
|
|
74
|
+
<svg class="h-5 w-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z" /></svg>
|
|
75
75
|
</div>
|
|
76
76
|
<p class="text-sm font-medium text-gray-900"><%= t("ruby_cms.admin.dashboard.analytics_unavailable", default: "Analytics unavailable") %></p>
|
|
77
77
|
<p class="mt-1 text-xs text-gray-500"><%= t("ruby_cms.admin.dashboard.analytics_unavailable_hint", default: "Could not load data.") %></p>
|
|
@@ -6,12 +6,12 @@
|
|
|
6
6
|
<p class="mt-0.5 text-xs text-gray-500"><%= @content_blocks_published_count %> published</p>
|
|
7
7
|
</div>
|
|
8
8
|
<div class="inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-lg bg-teal-50 text-teal-700 ring-1 ring-inset ring-teal-100">
|
|
9
|
-
<svg class="h-3.5 w-3.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 10h16M4 14h8"/></svg>
|
|
9
|
+
<svg class="h-3.5 w-3.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 10h16M4 14h8" /></svg>
|
|
10
10
|
</div>
|
|
11
11
|
</div>
|
|
12
12
|
<div class="mt-3 border-t border-gray-100 pt-2">
|
|
13
|
-
<%= link_to
|
|
14
|
-
Manage <svg class="h-3 w-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2.5" d="M9 5l7 7-7 7"/></svg>
|
|
13
|
+
<%= link_to admin_content_blocks_path, class: "inline-flex items-center gap-1 text-xs font-medium text-gray-600 hover:text-gray-900 transition-colors" do %>
|
|
14
|
+
Manage <svg class="h-3 w-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2.5" d="M9 5l7 7-7 7" /></svg>
|
|
15
15
|
<% end %>
|
|
16
16
|
</div>
|
|
17
17
|
</div>
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
<%
|
|
2
|
+
notifs ||= []
|
|
3
|
+
unread_count ||= 0
|
|
4
|
+
%>
|
|
5
|
+
<div class="flex h-full flex-col rounded-lg border border-gray-200/80 bg-white shadow-sm">
|
|
6
|
+
<div class="flex flex-wrap items-center justify-between gap-2 border-b border-gray-100 px-4 py-3 sm:gap-3 sm:px-5">
|
|
7
|
+
<div>
|
|
8
|
+
<p class="text-sm font-semibold text-gray-900">Notificaties</p>
|
|
9
|
+
<p class="text-xs text-gray-500"><%= unread_count.positive? ? "#{unread_count} ongelezen" : "Geen ongelezen" %></p>
|
|
10
|
+
</div>
|
|
11
|
+
<% if unread_count.positive? %>
|
|
12
|
+
<%= button_to mark_all_read_admin_notifications_path,
|
|
13
|
+
method: :post,
|
|
14
|
+
form: { data: { turbo_frame: "_top" } },
|
|
15
|
+
class: "text-xs font-medium text-gray-600 hover:text-gray-900 transition-colors bg-transparent border-0 p-0 cursor-pointer underline" do %>
|
|
16
|
+
Markeer alles
|
|
17
|
+
<% end %>
|
|
18
|
+
<% end %>
|
|
19
|
+
</div>
|
|
20
|
+
|
|
21
|
+
<% if notifs.any? %>
|
|
22
|
+
<div class="flex-1 divide-y divide-gray-100">
|
|
23
|
+
<% notifs.each do |n| %>
|
|
24
|
+
<%
|
|
25
|
+
title = n.respond_to?(:title) ? n.title.to_s : n.event&.params&.dig(:title).to_s
|
|
26
|
+
body = n.respond_to?(:body) ? n.body.to_s : n.event&.params&.dig(:body).to_s
|
|
27
|
+
target_url = n.respond_to?(:url) && n.url.present? ? n.url : admin_audit_log_entries_path
|
|
28
|
+
%>
|
|
29
|
+
<%= button_to mark_read_admin_notification_path(n.id, next: target_url),
|
|
30
|
+
method: :post,
|
|
31
|
+
form: { data: { turbo_frame: "_top" }, class: "block w-full" },
|
|
32
|
+
class: "block w-full text-left px-4 py-3 sm:px-5 hover:bg-gray-50 bg-transparent border-0 cursor-pointer" do %>
|
|
33
|
+
<p class="truncate text-sm font-medium text-gray-900"><%= title.presence || "Notificatie" %></p>
|
|
34
|
+
<% if body.present? %>
|
|
35
|
+
<p class="mt-0.5 truncate text-xs text-gray-500"><%= body %></p>
|
|
36
|
+
<% end %>
|
|
37
|
+
<p class="mt-1 text-xs text-gray-400"><%= time_ago_in_words(n.created_at) %> geleden</p>
|
|
38
|
+
<% end %>
|
|
39
|
+
<% end %>
|
|
40
|
+
</div>
|
|
41
|
+
<% else %>
|
|
42
|
+
<div class="flex flex-1 flex-col items-center justify-center px-4 py-8 text-center sm:px-5">
|
|
43
|
+
<div class="mb-2 inline-flex h-10 w-10 items-center justify-center rounded-lg bg-emerald-50 ring-1 ring-inset ring-emerald-100">
|
|
44
|
+
<svg class="h-5 w-5 text-emerald-600" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z" /></svg>
|
|
45
|
+
</div>
|
|
46
|
+
<p class="text-sm font-medium text-gray-900">Je bent helemaal bij</p>
|
|
47
|
+
<p class="mt-1 text-xs text-gray-500">Geen ongelezen notificaties.</p>
|
|
48
|
+
</div>
|
|
49
|
+
<% end %>
|
|
50
|
+
</div>
|
|
@@ -6,12 +6,12 @@
|
|
|
6
6
|
<p class="mt-0.5 text-xs text-gray-500"><%= @user_permissions_count %> grants</p>
|
|
7
7
|
</div>
|
|
8
8
|
<div class="inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-lg bg-violet-50 text-violet-700 ring-1 ring-inset ring-violet-100">
|
|
9
|
-
<svg class="h-3.5 w-3.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z"/></svg>
|
|
9
|
+
<svg class="h-3.5 w-3.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z" /></svg>
|
|
10
10
|
</div>
|
|
11
11
|
</div>
|
|
12
12
|
<div class="mt-3 border-t border-gray-100 pt-2">
|
|
13
|
-
<%= link_to
|
|
14
|
-
Manage <svg class="h-3 w-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2.5" d="M9 5l7 7-7 7"/></svg>
|
|
13
|
+
<%= link_to admin_permissions_path, class: "inline-flex items-center gap-1 text-xs font-medium text-gray-600 hover:text-gray-900 transition-colors" do %>
|
|
14
|
+
Manage <svg class="h-3 w-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2.5" d="M9 5l7 7-7 7" /></svg>
|
|
15
15
|
<% end %>
|
|
16
16
|
</div>
|
|
17
17
|
</div>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<div class="flex h-full flex-col rounded-lg border border-gray-200/80 bg-white shadow-sm">
|
|
2
|
-
<div class="flex items-center justify-between gap-3 border-b border-gray-100 px-
|
|
2
|
+
<div class="flex items-center justify-between gap-3 border-b border-gray-100 px-4 py-3 sm:px-5">
|
|
3
3
|
<div>
|
|
4
4
|
<p class="text-sm font-semibold text-gray-900">Quick actions</p>
|
|
5
5
|
<p class="text-xs text-gray-500">Jump to common admin tasks.</p>
|
|
@@ -7,56 +7,56 @@
|
|
|
7
7
|
</div>
|
|
8
8
|
|
|
9
9
|
<div class="flex flex-col divide-y divide-gray-100">
|
|
10
|
-
<%= link_to
|
|
10
|
+
<%= link_to new_admin_content_block_path, class: "group flex items-center justify-between gap-2 px-4 py-3 transition-colors hover:bg-gray-50 sm:px-5" do %>
|
|
11
11
|
<div class="flex min-w-0 items-center gap-2.5">
|
|
12
|
-
<div class="inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-lg bg-teal-
|
|
13
|
-
<svg class="h-3.5 w-3.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 4v16m8-8H4"/></svg>
|
|
12
|
+
<div class="mr-2 inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-lg bg-teal-100 text-teal-800">
|
|
13
|
+
<svg class="h-3.5 w-3.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 4v16m8-8H4" /></svg>
|
|
14
14
|
</div>
|
|
15
15
|
<div class="min-w-0">
|
|
16
16
|
<p class="text-sm font-medium text-gray-900">New content block</p>
|
|
17
17
|
<p class="text-xs text-gray-500">Create a new block</p>
|
|
18
18
|
</div>
|
|
19
19
|
</div>
|
|
20
|
-
<svg class="h-4 w-4 shrink-0 text-gray-300 transition-colors group-hover:text-gray-500" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7"/></svg>
|
|
20
|
+
<svg class="h-4 w-4 shrink-0 text-gray-300 transition-colors group-hover:text-gray-500" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7" /></svg>
|
|
21
21
|
<% end %>
|
|
22
22
|
|
|
23
|
-
<%= link_to
|
|
23
|
+
<%= link_to admin_visual_editor_path, class: "group flex items-center justify-between gap-2 px-4 py-3 transition-colors hover:bg-gray-50 sm:px-5" do %>
|
|
24
24
|
<div class="flex min-w-0 items-center gap-2.5">
|
|
25
25
|
<div class="inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-lg bg-indigo-50 text-indigo-700 ring-1 ring-inset ring-indigo-100 mr-2">
|
|
26
|
-
<svg class="h-3.5 w-3.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15.232 5.232l3.536 3.536M9 11l6 6M3 21h18"/></svg>
|
|
26
|
+
<svg class="h-3.5 w-3.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15.232 5.232l3.536 3.536M9 11l6 6M3 21h18" /></svg>
|
|
27
27
|
</div>
|
|
28
28
|
<div class="min-w-0">
|
|
29
29
|
<p class="text-sm font-medium text-gray-900">Visual editor</p>
|
|
30
30
|
<p class="text-xs text-gray-500">Edit content visually</p>
|
|
31
31
|
</div>
|
|
32
32
|
</div>
|
|
33
|
-
<svg class="h-4 w-4 shrink-0 text-gray-300 transition-colors group-hover:text-gray-500" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7"/></svg>
|
|
33
|
+
<svg class="h-4 w-4 shrink-0 text-gray-300 transition-colors group-hover:text-gray-500" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7" /></svg>
|
|
34
34
|
<% end %>
|
|
35
35
|
|
|
36
|
-
<%= link_to
|
|
36
|
+
<%= link_to admin_visitor_errors_path, class: "group flex items-center justify-between gap-2 px-4 py-3 transition-colors hover:bg-gray-50 sm:px-5" do %>
|
|
37
37
|
<div class="flex min-w-0 items-center gap-2.5">
|
|
38
|
-
<div class="inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-lg bg-rose-
|
|
39
|
-
<svg class="h-3.5 w-3.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg>
|
|
38
|
+
<div class="mr-2 inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-lg bg-rose-100 text-rose-800">
|
|
39
|
+
<svg class="h-3.5 w-3.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" /></svg>
|
|
40
40
|
</div>
|
|
41
41
|
<div class="min-w-0">
|
|
42
42
|
<p class="text-sm font-medium text-gray-900">Visitor errors</p>
|
|
43
43
|
<p class="text-xs text-gray-500">Review recent issues</p>
|
|
44
44
|
</div>
|
|
45
45
|
</div>
|
|
46
|
-
<svg class="h-4 w-4 shrink-0 text-gray-300 transition-colors group-hover:text-gray-500" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7"/></svg>
|
|
46
|
+
<svg class="h-4 w-4 shrink-0 text-gray-300 transition-colors group-hover:text-gray-500" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7" /></svg>
|
|
47
47
|
<% end %>
|
|
48
48
|
|
|
49
|
-
<%= link_to
|
|
49
|
+
<%= link_to admin_settings_path, class: "group flex items-center justify-between gap-2 px-4 py-3 transition-colors hover:bg-gray-50 sm:px-5" do %>
|
|
50
50
|
<div class="flex min-w-0 items-center gap-2.5">
|
|
51
51
|
<div class="inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-lg bg-gray-100 text-gray-700 ring-1 ring-inset ring-gray-200 mr-2">
|
|
52
|
-
<svg class="h-3.5 w-3.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z"/><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"/></svg>
|
|
52
|
+
<svg class="h-3.5 w-3.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z" /><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z" /></svg>
|
|
53
53
|
</div>
|
|
54
54
|
<div class="min-w-0">
|
|
55
55
|
<p class="text-sm font-medium text-gray-900">Settings</p>
|
|
56
56
|
<p class="text-xs text-gray-500">Configure RubyCMS</p>
|
|
57
57
|
</div>
|
|
58
58
|
</div>
|
|
59
|
-
<svg class="h-4 w-4 shrink-0 text-gray-300 transition-colors group-hover:text-gray-500" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7"/></svg>
|
|
59
|
+
<svg class="h-4 w-4 shrink-0 text-gray-300 transition-colors group-hover:text-gray-500" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7" /></svg>
|
|
60
60
|
<% end %>
|
|
61
61
|
</div>
|
|
62
62
|
</div>
|
|
@@ -1,36 +1,36 @@
|
|
|
1
1
|
<div class="flex h-full flex-col rounded-lg border border-gray-200/80 bg-white shadow-sm">
|
|
2
|
-
<div class="flex items-center justify-between gap-
|
|
2
|
+
<div class="flex flex-wrap items-center justify-between gap-2 border-b border-gray-100 px-4 py-3 sm:gap-3 sm:px-5">
|
|
3
3
|
<div>
|
|
4
4
|
<p class="text-sm font-semibold text-gray-900">Recent errors</p>
|
|
5
5
|
<p class="text-xs text-gray-500">Latest visitor errors.</p>
|
|
6
6
|
</div>
|
|
7
|
-
<%= link_to "View all",
|
|
7
|
+
<%= link_to "View all", admin_visitor_errors_path, class: "text-sm font-medium text-gray-600 hover:text-gray-900 transition-colors" %>
|
|
8
8
|
</div>
|
|
9
9
|
|
|
10
10
|
<% if @recent_errors.any? %>
|
|
11
11
|
<div class="flex-1 divide-y divide-gray-100">
|
|
12
12
|
<% @recent_errors.first(4).each do |error| %>
|
|
13
|
-
<div class="px-
|
|
13
|
+
<div class="px-4 py-3 sm:px-5">
|
|
14
14
|
<p class="truncate text-sm font-medium text-gray-900">
|
|
15
15
|
<span class="font-normal text-gray-500"><%= error.error_class %>:</span>
|
|
16
16
|
<%= error.error_message.truncate(56) %>
|
|
17
17
|
</p>
|
|
18
18
|
<div class="mt-1.5 flex items-center justify-between gap-2">
|
|
19
19
|
<div class="flex min-w-0 flex-wrap items-center gap-2">
|
|
20
|
-
<span class="inline-flex items-center rounded-md px-2 py-0.5 text-xs font-medium ring-1 ring-inset <%= error.resolved? ?
|
|
21
|
-
<%= error.resolved? ?
|
|
20
|
+
<span class="inline-flex items-center rounded-md px-2 py-0.5 text-xs font-medium ring-1 ring-inset <%= error.resolved? ? "bg-emerald-50 text-emerald-700 ring-emerald-200" : "bg-rose-50 text-rose-700 ring-rose-200" %>">
|
|
21
|
+
<%= error.resolved? ? "Resolved" : "Unresolved" %>
|
|
22
22
|
</span>
|
|
23
23
|
<span class="text-xs text-gray-500"><%= time_ago_in_words(error.created_at) %> ago</span>
|
|
24
24
|
</div>
|
|
25
|
-
<%= link_to "Open",
|
|
25
|
+
<%= link_to "Open", admin_visitor_error_path(error), class: "shrink-0 text-xs font-medium text-gray-600 hover:text-gray-900 transition-colors" %>
|
|
26
26
|
</div>
|
|
27
27
|
</div>
|
|
28
28
|
<% end %>
|
|
29
29
|
</div>
|
|
30
30
|
<% else %>
|
|
31
|
-
<div class="flex flex-1 flex-col items-center justify-center px-
|
|
31
|
+
<div class="flex flex-1 flex-col items-center justify-center px-4 py-8 text-center sm:px-5">
|
|
32
32
|
<div class="mb-2 inline-flex h-10 w-10 items-center justify-center rounded-lg bg-emerald-50 ring-1 ring-inset ring-emerald-100">
|
|
33
|
-
<svg class="h-5 w-5 text-emerald-600" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"/></svg>
|
|
33
|
+
<svg class="h-5 w-5 text-emerald-600" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z" /></svg>
|
|
34
34
|
</div>
|
|
35
35
|
<p class="text-sm font-medium text-gray-900">No errors recorded</p>
|
|
36
36
|
<p class="mt-1 text-xs text-gray-500">Everything is running smoothly.</p>
|
|
@@ -6,12 +6,12 @@
|
|
|
6
6
|
<p class="mt-0.5 text-xs text-gray-500">registered</p>
|
|
7
7
|
</div>
|
|
8
8
|
<div class="inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-lg bg-blue-50 text-blue-700 ring-1 ring-inset ring-blue-100">
|
|
9
|
-
<svg class="h-3.5 w-3.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 20h5v-2a4 4 0 00-4-4h-1M9 20H4v-2a4 4 0 014-4h1m4-4a4 4 0 110-8 4 4 0 010 8z"/></svg>
|
|
9
|
+
<svg class="h-3.5 w-3.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 20h5v-2a4 4 0 00-4-4h-1M9 20H4v-2a4 4 0 014-4h1m4-4a4 4 0 110-8 4 4 0 010 8z" /></svg>
|
|
10
10
|
</div>
|
|
11
11
|
</div>
|
|
12
12
|
<div class="mt-3 border-t border-gray-100 pt-2">
|
|
13
|
-
<%= link_to
|
|
14
|
-
Manage <svg class="h-3 w-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2.5" d="M9 5l7 7-7 7"/></svg>
|
|
13
|
+
<%= link_to admin_users_path, class: "inline-flex items-center gap-1 text-xs font-medium text-gray-600 hover:text-gray-900 transition-colors" do %>
|
|
14
|
+
Manage <svg class="h-3 w-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2.5" d="M9 5l7 7-7 7" /></svg>
|
|
15
15
|
<% end %>
|
|
16
16
|
</div>
|
|
17
17
|
</div>
|
|
@@ -13,12 +13,12 @@
|
|
|
13
13
|
</div>
|
|
14
14
|
<% icon_bg = @unresolved_errors_count.to_i > 0 ? "bg-rose-50 text-rose-700 ring-rose-100" : "bg-emerald-50 text-emerald-700 ring-emerald-100" %>
|
|
15
15
|
<div class="inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-lg ring-1 ring-inset <%= icon_bg %>">
|
|
16
|
-
<svg class="h-3.5 w-3.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 9v2m0 4h.01M10.29 3.86L1.82 18a2 2 0 001.71 3h16.94a2 2 0 001.71-3L13.71 3.86a2 2 0 00-3.42 0z"/></svg>
|
|
16
|
+
<svg class="h-3.5 w-3.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 9v2m0 4h.01M10.29 3.86L1.82 18a2 2 0 001.71 3h16.94a2 2 0 001.71-3L13.71 3.86a2 2 0 00-3.42 0z" /></svg>
|
|
17
17
|
</div>
|
|
18
18
|
</div>
|
|
19
19
|
<div class="mt-3 border-t border-gray-100 pt-2">
|
|
20
|
-
<%= link_to
|
|
21
|
-
View all <svg class="h-3 w-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2.5" d="M9 5l7 7-7 7"/></svg>
|
|
20
|
+
<%= link_to admin_visitor_errors_path, class: "inline-flex items-center gap-1 text-xs font-medium text-gray-600 hover:text-gray-900 transition-colors" do %>
|
|
21
|
+
View all <svg class="h-3 w-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2.5" d="M9 5l7 7-7 7" /></svg>
|
|
22
22
|
<% end %>
|
|
23
23
|
</div>
|
|
24
24
|
</div>
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
<%= AdminPageHeader(
|
|
2
|
+
title: "Dashboard",
|
|
3
|
+
subtitle: "Welcome back! Here's an overview of your CMS.",
|
|
4
|
+
breadcrumbs: [
|
|
5
|
+
{ label: "Admin", url: admin_root_path },
|
|
6
|
+
{ label: "Dashboard" }
|
|
7
|
+
]
|
|
8
|
+
) %>
|
|
9
|
+
|
|
10
|
+
<div class="space-y-6">
|
|
11
|
+
|
|
12
|
+
<%# Main row: three equal columns — quick actions | recent errors | analytics %>
|
|
13
|
+
<% if @primary_main_blocks.any? %>
|
|
14
|
+
<div class="grid grid-cols-1 items-stretch gap-4 lg:grid-cols-3">
|
|
15
|
+
<% @primary_main_blocks.each do |block| %>
|
|
16
|
+
<div class="flex min-w-0 flex-col">
|
|
17
|
+
<%= render_dashboard_block(block) %>
|
|
18
|
+
</div>
|
|
19
|
+
<% end %>
|
|
20
|
+
</div>
|
|
21
|
+
<% end %>
|
|
22
|
+
|
|
23
|
+
<%# Host / custom dashboard blocks %>
|
|
24
|
+
<% if @extra_main_blocks.any? %>
|
|
25
|
+
<div class="grid grid-cols-1 items-stretch gap-4 lg:grid-cols-3">
|
|
26
|
+
<% @extra_main_blocks.each do |block| %>
|
|
27
|
+
<div class="flex min-w-0 flex-col <%= block[:span] == :double ? "lg:col-span-2" : "" %>">
|
|
28
|
+
<%= render_dashboard_block(block) %>
|
|
29
|
+
</div>
|
|
30
|
+
<% end %>
|
|
31
|
+
</div>
|
|
32
|
+
<% end %>
|
|
33
|
+
|
|
34
|
+
</div>
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
<%
|
|
2
|
+
total_mb = (@total_size_kb.to_f / 1024).round(1)
|
|
3
|
+
storage_pct = [ (total_mb / 100.0 * 100), 100 ].min
|
|
4
|
+
%>
|
|
5
|
+
<%= turbo_frame_tag "admin_table_content", class: "flex-1 flex flex-col min-h-0", data: { turbo_action: "advance" } do %>
|
|
6
|
+
<div class="flex flex-1 min-h-0 border border-[#e5e7eb] rounded-[12px] overflow-hidden bg-white"
|
|
7
|
+
data-controller="admin--media-selection"
|
|
8
|
+
data-admin--media-selection-bulk-delete-url-value="<%= bulk_delete_admin_media_assets_path %>">
|
|
9
|
+
|
|
10
|
+
<%# ───────────── Left rail ───────────── %>
|
|
11
|
+
<aside class="w-[220px] shrink-0 bg-[#f9fafb] border-r border-[#e5e7eb] px-2 py-[14px] flex flex-col gap-px overflow-y-auto">
|
|
12
|
+
<div class="text-[10.5px] font-semibold uppercase tracking-[0.08em] text-[#94a3b8] px-[10px] pb-2 pt-[6px]">Folders</div>
|
|
13
|
+
<% [ [ "all", "Alle bestanden" ] ].each do |id, label| %>
|
|
14
|
+
<%= link_to admin_media_assets_path(folder: id, view: @view, sort: @sort),
|
|
15
|
+
class: "flex items-center gap-[10px] px-[10px] py-[7px] rounded-[7px] text-[13px] text-[#475569] no-underline cursor-pointer hover:bg-white hover:text-[#0f172a] data-[active=true]:bg-white data-[active=true]:text-[#0f172a] data-[active=true]:shadow-[0_0_0_1px_#e5e7eb] data-[active=true]:font-medium",
|
|
16
|
+
data: { active: @folder == id, turbo_frame: "admin_table_content" } do %>
|
|
17
|
+
<span class="text-[#94a3b8] inline-flex data-[active=true]:text-[#2563eb] [&_svg]:w-[14px] [&_svg]:h-[14px]"><%= media_chip_icon("layers") %></span>
|
|
18
|
+
<span style="flex: 1"><%= label %></span>
|
|
19
|
+
<span class="font-medium text-[11px] font-mono text-[#94a3b8]"><%= @folder_counts["all"] || 0 %></span>
|
|
20
|
+
<% end %>
|
|
21
|
+
<% end %>
|
|
22
|
+
<% @folders.each do |id| %>
|
|
23
|
+
<%= link_to admin_media_assets_path(folder: id, view: @view, sort: @sort),
|
|
24
|
+
class: "flex items-center gap-[10px] px-[10px] py-[7px] rounded-[7px] text-[13px] text-[#475569] no-underline cursor-pointer hover:bg-white hover:text-[#0f172a] data-[active=true]:bg-white data-[active=true]:text-[#0f172a] data-[active=true]:shadow-[0_0_0_1px_#e5e7eb] data-[active=true]:font-medium",
|
|
25
|
+
data: { active: @folder == id, turbo_frame: "admin_table_content" } do %>
|
|
26
|
+
<span class="text-[#94a3b8] inline-flex [&_svg]:w-[14px] [&_svg]:h-[14px]"><%= media_chip_icon("folder") %></span>
|
|
27
|
+
<span style="flex: 1"><%= id.humanize %></span>
|
|
28
|
+
<span class="font-medium text-[11px] font-mono text-[#94a3b8]"><%= @folder_counts[id] || 0 %></span>
|
|
29
|
+
<% end %>
|
|
30
|
+
<% end %>
|
|
31
|
+
|
|
32
|
+
<div class="text-[10.5px] font-semibold uppercase tracking-[0.08em] text-[#94a3b8] px-[10px] pb-2 pt-[6px] mt-[18px]">Storage</div>
|
|
33
|
+
<div class="px-[10px] py-1">
|
|
34
|
+
<div class="text-[12px] text-[#64748b] mb-[6px] flex justify-between">
|
|
35
|
+
<span>S3 · svgoor-prod</span>
|
|
36
|
+
<span class="tabular-nums"><%= total_mb %> / 100 MB</span>
|
|
37
|
+
</div>
|
|
38
|
+
<div class="h-[6px] bg-[#f1f5f9] rounded-[3px] overflow-hidden">
|
|
39
|
+
<div class="h-full bg-[#3b82f6] rounded-[3px]" style="width: <%= storage_pct %>%"></div>
|
|
40
|
+
</div>
|
|
41
|
+
</div>
|
|
42
|
+
</aside>
|
|
43
|
+
|
|
44
|
+
<%# ───────────── Right main ───────────── %>
|
|
45
|
+
<section class="flex-1 min-w-0 flex flex-col overflow-hidden bg-white">
|
|
46
|
+
<%# Toolbar %>
|
|
47
|
+
<div class="flex items-center gap-[10px] px-[22px] py-[12px] border-b border-[#e5e7eb] flex-wrap">
|
|
48
|
+
<%= form_with url: admin_media_assets_path, method: :get, local: true,
|
|
49
|
+
html: { class: "admin-search-field", data: { turbo_frame: "admin_table_content" } } do |f| %>
|
|
50
|
+
<%= media_chip_icon("search") %>
|
|
51
|
+
<%= f.hidden_field :folder, value: @folder %>
|
|
52
|
+
<%= f.hidden_field :view, value: @view %>
|
|
53
|
+
<%= f.hidden_field :sort, value: @sort %>
|
|
54
|
+
<%= f.search_field :search, value: @search, placeholder: "Zoek op naam of tag…" %>
|
|
55
|
+
<% end %>
|
|
56
|
+
|
|
57
|
+
<div class="inline-flex border border-[#e5e7eb] rounded-[8px] overflow-hidden bg-[#f8fafc] ml-auto">
|
|
58
|
+
<% [ [ "recent", "Recent" ], [ "name", "Naam" ], [ "size", "Grootte" ], [ "used", "Meest gebruikt" ] ].each do |val, label| %>
|
|
59
|
+
<%= link_to label,
|
|
60
|
+
admin_media_assets_path(folder: @folder, view: @view, sort: val, search: @search),
|
|
61
|
+
class: "bg-transparent border-0 px-[12px] py-[6px] text-[12.5px] text-[#475569] cursor-pointer inline-flex items-center gap-[6px] border-l border-[#e5e7eb] first:border-l-0 data-[active=true]:bg-white data-[active=true]:text-[#0f172a] data-[active=true]:font-semibold no-underline",
|
|
62
|
+
data: { active: @sort == val, turbo_frame: "admin_table_content" } %>
|
|
63
|
+
<% end %>
|
|
64
|
+
</div>
|
|
65
|
+
|
|
66
|
+
<div class="inline-flex border border-[#e5e7eb] rounded-[8px] overflow-hidden bg-[#f8fafc]">
|
|
67
|
+
<% [ [ "grid", "Grid" ], [ "list", "Lijst" ] ].each do |val, label| %>
|
|
68
|
+
<%= link_to label,
|
|
69
|
+
admin_media_assets_path(folder: @folder, view: val, sort: @sort, search: @search),
|
|
70
|
+
class: "bg-transparent border-0 px-[12px] py-[6px] text-[12.5px] text-[#475569] cursor-pointer inline-flex items-center gap-[6px] border-l border-[#e5e7eb] first:border-l-0 data-[active=true]:bg-white data-[active=true]:text-[#0f172a] data-[active=true]:font-semibold no-underline",
|
|
71
|
+
data: { active: @view == val, turbo_frame: "admin_table_content" } %>
|
|
72
|
+
<% end %>
|
|
73
|
+
</div>
|
|
74
|
+
</div>
|
|
75
|
+
|
|
76
|
+
<%# Bulk action bar (hidden until something is selected) %>
|
|
77
|
+
<div class="flex items-center gap-[12px] px-[22px] py-[10px] bg-[#eff6ff] border-b border-[#dbeafe] text-[13px] text-[#1e40af] font-medium hidden"
|
|
78
|
+
data-admin--media-selection-target="bar"
|
|
79
|
+
hidden>
|
|
80
|
+
<span class="font-semibold text-[12.5px] font-mono" data-admin--media-selection-target="count">0</span>
|
|
81
|
+
<span>geselecteerd</span>
|
|
82
|
+
<div class="ml-auto flex gap-[6px]">
|
|
83
|
+
<button type="button" class="inline-flex items-center gap-1 px-2 py-1 text-xs bg-white border border-blue-100 rounded hover:bg-blue-50">Download</button>
|
|
84
|
+
<button type="button" class="inline-flex items-center gap-1 px-2 py-1 text-xs bg-white border border-blue-100 rounded hover:bg-blue-50">Verplaats</button>
|
|
85
|
+
<button type="button"
|
|
86
|
+
data-action="click->admin--media-selection#destroy"
|
|
87
|
+
class="inline-flex items-center gap-1 px-2 py-1 text-xs text-red-700 bg-white border border-red-100 rounded hover:bg-red-50">Verwijderen</button>
|
|
88
|
+
</div>
|
|
89
|
+
</div>
|
|
90
|
+
|
|
91
|
+
<% if @media_assets.any? %>
|
|
92
|
+
<% if @view == "grid" %>
|
|
93
|
+
<%= render "grid", media_assets: @media_assets %>
|
|
94
|
+
<% else %>
|
|
95
|
+
<%= render "list", media_assets: @media_assets %>
|
|
96
|
+
<% end %>
|
|
97
|
+
<% else %>
|
|
98
|
+
<div class="flex-1 flex items-center justify-center p-12 text-center text-gray-500">
|
|
99
|
+
<div>
|
|
100
|
+
<p class="font-medium text-gray-700 mb-1">Nog geen bestanden</p>
|
|
101
|
+
<p class="text-sm">Upload je eerste bestand met de knop rechtsboven.</p>
|
|
102
|
+
</div>
|
|
103
|
+
</div>
|
|
104
|
+
<% end %>
|
|
105
|
+
</section>
|
|
106
|
+
</div>
|
|
107
|
+
<% end %>
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
<%= form_with model: [ :admin, @media_asset ], local: true, class: "space-y-4" do |form| %>
|
|
2
|
+
<% if @media_asset.errors.any? %>
|
|
3
|
+
<div class="bg-red-50 border border-red-200 rounded p-3 text-sm text-red-800">
|
|
4
|
+
<ul class="list-disc pl-5">
|
|
5
|
+
<% @media_asset.errors.full_messages.each do |m| %>
|
|
6
|
+
<li><%= m %></li>
|
|
7
|
+
<% end %>
|
|
8
|
+
</ul>
|
|
9
|
+
</div>
|
|
10
|
+
<% end %>
|
|
11
|
+
|
|
12
|
+
<div>
|
|
13
|
+
<%= form.label :name, "Naam", class: "block text-sm font-medium text-gray-700 mb-1" %>
|
|
14
|
+
<%= form.text_field :name, class: "block w-full border-gray-300 rounded-md shadow-sm focus:ring-indigo-500 focus:border-indigo-500" %>
|
|
15
|
+
</div>
|
|
16
|
+
|
|
17
|
+
<div>
|
|
18
|
+
<%= form.label :folder, "Folder", class: "block text-sm font-medium text-gray-700 mb-1" %>
|
|
19
|
+
<%= form.select :folder,
|
|
20
|
+
(Admin::MediaAssetsController::DEFAULT_FOLDERS + (MediaAsset.distinct.pluck(:folder).compact)).uniq.map { |f| [ f.humanize, f ] },
|
|
21
|
+
{}, class: "block w-full border-gray-300 rounded-md shadow-sm focus:ring-indigo-500 focus:border-indigo-500" %>
|
|
22
|
+
</div>
|
|
23
|
+
|
|
24
|
+
<div>
|
|
25
|
+
<%= form.label :tags, "Tags (komma-gescheiden)", class: "block text-sm font-medium text-gray-700 mb-1" %>
|
|
26
|
+
<%= form.text_field :tags, value: Array(@media_asset.tags).join(", "), class: "block w-full border-gray-300 rounded-md shadow-sm focus:ring-indigo-500 focus:border-indigo-500", placeholder: "logo, hero, banner" %>
|
|
27
|
+
</div>
|
|
28
|
+
|
|
29
|
+
<div class="flex items-center justify-end gap-2 pt-4 border-t border-gray-200">
|
|
30
|
+
<%= link_to "Annuleren", admin_media_asset_path(@media_asset), class: "inline-flex items-center px-4 py-2 border border-gray-300 rounded-md shadow-sm text-sm font-medium text-gray-700 bg-white hover:bg-gray-50" %>
|
|
31
|
+
<%= form.submit "Opslaan", class: "inline-flex items-center px-4 py-2 border border-transparent rounded-md shadow-sm text-sm font-medium text-white bg-indigo-600 hover:bg-indigo-700" %>
|
|
32
|
+
</div>
|
|
33
|
+
<% end %>
|