active_admin_prism 0.1.0 → 0.1.2
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 +44 -1
- data/INTEGRATION.md +202 -1
- data/README.md +60 -1
- data/app/assets/javascripts/active_admin_prism/prism.js +3 -1
- data/app/assets/stylesheets/active_admin_prism/prism.css +1 -1
- data/js-src/prism.js +125 -0
- data/lib/active_admin/views/flash_messages.rb +5 -3
- data/lib/active_admin/views/prism_sidebar.rb +26 -0
- data/lib/active_admin_prism/configuration.rb +27 -0
- data/lib/active_admin_prism/version.rb +1 -1
- data/scss-src/_forms.scss +20 -4
- data/scss-src/_panels.scss +11 -0
- data/scss-src/_select2.scss +264 -0
- data/scss-src/_select2_vendor.scss +695 -0
- data/scss-src/_sidebar.scss +96 -2
- data/scss-src/prism.scss +2 -0
- data/vendor/select2/LICENSE.md +21 -0
- data/vendor/select2/select2.full.min.js +2 -0
- metadata +6 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 34c64b9f9a4624ab0c6b5bcebd46bd4c65b220e86fa6b8095d26ee35acdb4af2
|
|
4
|
+
data.tar.gz: 72e3885c4e3f91874b6e6f99b629c3480eb4b1098de4044f12e3c6d50b95bf66
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 230e4441cbc71b105e1abe0b0e592fa7451c070ab4be8b2d32c5acdce55f9014b3f6c2918915bff637fe568e4299243dd9362c6a303725d977d3010ddf409e59
|
|
7
|
+
data.tar.gz: 052d8bfe74e598622c5922e0e1201ccfcf574d35937c1a6af17b71c9da06c8dbcf8311ab6df7edcd97cab957f0c70a9bf7205fdbfcf61ef63b576b230ab3a16c
|
data/CHANGELOG.md
CHANGED
|
@@ -1,7 +1,50 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
##
|
|
3
|
+
## 0.1.2
|
|
4
4
|
|
|
5
|
+
- Adds [Select2](https://select2.org) support (`config.select2`, default
|
|
6
|
+
`false` — the only opt-in-by-default flag in this gem) — reskinned to
|
|
7
|
+
match the theme, and now vendored inside the gem's own assets (no
|
|
8
|
+
separate gem/npm dependency, no JS of your own required). Turn it on to
|
|
9
|
+
auto-enhance *every* plain `<select>` (filters, form inputs, association
|
|
10
|
+
pickers) into a searchable widget with zero per-field setup; or leave it
|
|
11
|
+
off and opt individual fields in yourself the same way you would in any
|
|
12
|
+
other Rails app (`input_html: { class: "..." }` + your own `.select2()`
|
|
13
|
+
call) — both approaches coexist without double-initializing the same
|
|
14
|
+
element. Covers single-select, multi-select ("tags"/pill chips), and the
|
|
15
|
+
open dropdown/search box/results list — see
|
|
16
|
+
[Select2](INTEGRATION.md#select2) in INTEGRATION.md. Without the CSS
|
|
17
|
+
half of this, a Select2-enhanced select rendered at its tiny unstyled
|
|
18
|
+
default size, and its open dropdown could clash with the theme entirely.
|
|
19
|
+
- Fixed: the collapsible Filters sidebar panel kept `overflow: hidden`
|
|
20
|
+
even while expanded, clipping/garbling any dropdown (Select2 or AA's own
|
|
21
|
+
"select + search" filter widget) that needed to render outside its own
|
|
22
|
+
input's bounds. `&.open`/the `collapsible_filters: false` backstop now
|
|
23
|
+
reset `overflow` back to `visible`.
|
|
24
|
+
- Fixed: the Cancel button (and any other `fieldset.actions`/
|
|
25
|
+
`fieldset.buttons` link styled via `prism-button-secondary`) rendered
|
|
26
|
+
with ActiveAdmin's own pill-shaped `border-radius: 200px` instead of
|
|
27
|
+
Prism's — a more specific AA selector was winning on that one property
|
|
28
|
+
even though Prism's color/background already won via `!important`. Both
|
|
29
|
+
button mixins now mark `border-radius` `!important` too.
|
|
30
|
+
- Fixed: form action buttons (Create/Update + Cancel) could stack
|
|
31
|
+
vertically instead of sitting side by side. ActiveAdmin lays them out
|
|
32
|
+
via `float: left` on each `<li>`, which is fragile (a longer button
|
|
33
|
+
label, or a host's own CSS, can lose the float); the actions `<ol>` is
|
|
34
|
+
now a flex row instead, which floats have no effect on regardless of
|
|
35
|
+
specificity or content width.
|
|
36
|
+
|
|
37
|
+
## 0.1.1
|
|
38
|
+
|
|
39
|
+
- A search box renders at the top of the sidebar's "Pages" nav
|
|
40
|
+
(`config.menu_search`, default `true`), filtering menu items as you
|
|
41
|
+
type without a server round trip. Matching works at any nesting depth:
|
|
42
|
+
a submenu item that matches keeps its parent group visible and expanded
|
|
43
|
+
even though the parent's own label doesn't match; a parent whose own
|
|
44
|
+
label matches instead reveals its entire submenu, expanded, so you
|
|
45
|
+
never have to manually open a group to find something buried in a long
|
|
46
|
+
menu. Clearing the box (or the "x" button, or Escape) resets everything
|
|
47
|
+
back to its normal expand/collapse state.
|
|
5
48
|
- **The shipped `prism.css`/`prism.js` are now minified.** `bin/build-css`
|
|
6
49
|
compiles with `style: :compressed` instead of `:expanded`, and a new
|
|
7
50
|
`bin/build-js` (backed by the `terser` dev dependency) minifies the real
|
data/INTEGRATION.md
CHANGED
|
@@ -5,6 +5,11 @@ to — switching off `active_admin_prism` in a Rails app. For a quick
|
|
|
5
5
|
start, see [README.md](README.md); this document goes deeper on every
|
|
6
6
|
option and the reasoning behind it.
|
|
7
7
|
|
|
8
|
+
**Live demo:** [prism-demo.onrender.com/admin](https://prism-demo.onrender.com/admin) —
|
|
9
|
+
`admin@example.com` / `password`. Hosted on Render's free tier, so the
|
|
10
|
+
first request after a period of inactivity can take up to a minute to
|
|
11
|
+
spin up.
|
|
12
|
+
|
|
8
13
|
## Contents
|
|
9
14
|
|
|
10
15
|
- [Requirements](#requirements)
|
|
@@ -126,6 +131,8 @@ ActiveAdminPrism.configure do |config|
|
|
|
126
131
|
{ label: "Español", locale: :es },
|
|
127
132
|
{ label: "Français", locale: :fr }
|
|
128
133
|
]
|
|
134
|
+
config.menu_search = true # default: true
|
|
135
|
+
config.select2 = false # default: false (opt-in — see below)
|
|
129
136
|
end
|
|
130
137
|
|
|
131
138
|
ActiveAdminPrism.enable!
|
|
@@ -148,6 +155,8 @@ ActiveAdminPrism.enable!
|
|
|
148
155
|
| `login_tagline` | `"Sign in to your admin dashboard"` | `nil` renders no tagline at all. |
|
|
149
156
|
| `language_switcher` | `true` | No "Languages" dropdown renders in the sidebar at all — see [Language switcher](#language-switcher). |
|
|
150
157
|
| `languages` | 3 entries (English/Español/Français) | The list the dropdown renders; an empty array (`[]`) has the same effect as `language_switcher = false`. |
|
|
158
|
+
| `menu_search` | `true` | No search box renders above the sidebar's "Pages" nav — see [Menu search](#menu-search). |
|
|
159
|
+
| `select2` | `false` | **Opposite polarity from every other flag above — opt-in, not opt-out.** `false` (the default) leaves every `<select>` exactly as ActiveAdmin renders it. `true` auto-enhances *every* plain `<select>` (filters, form inputs, association pickers — no per-field setup) into a searchable Select2 widget — see [Select2](#select2). |
|
|
151
160
|
|
|
152
161
|
**How this crosses the server/client boundary.** `sidebar`,
|
|
153
162
|
`colorize_action_icons`, and the `login_*` flags are pure server-side
|
|
@@ -416,6 +425,40 @@ ActiveAdmin's own `Menu`/`MenuItem`/`build_menu` machinery — see
|
|
|
416
425
|
[Language switcher markup](#language-switcher-markup) for why, and for the
|
|
417
426
|
full class/id reference.
|
|
418
427
|
|
|
428
|
+
### Menu search
|
|
429
|
+
|
|
430
|
+
A search box renders at the top of the sidebar, between the language
|
|
431
|
+
switcher (if any) and the "Pages" nav — no setup required beyond the
|
|
432
|
+
default `config.menu_search = true`. It filters your existing `menu do |m|
|
|
433
|
+
... end` items by label as you type; there's no server round trip and no
|
|
434
|
+
change to how those blocks are authored in `app/admin/*.rb` — see
|
|
435
|
+
`lib/active_admin/views/prism_sidebar.rb#render_search_box` for the markup
|
|
436
|
+
and `js-src/prism.js` for the filtering logic itself.
|
|
437
|
+
|
|
438
|
+
Matching is case-insensitive and works at any nesting depth, since the
|
|
439
|
+
whole menu tree is already rendered up front and the filtering happens
|
|
440
|
+
purely client-side over the existing DOM:
|
|
441
|
+
|
|
442
|
+
- A submenu item that matches keeps its parent group visible **and
|
|
443
|
+
expanded**, even though the parent's own label doesn't match — so a
|
|
444
|
+
match buried a couple of levels deep is never hidden behind a collapsed
|
|
445
|
+
group.
|
|
446
|
+
- A parent whose own label matches reveals its **entire** submenu,
|
|
447
|
+
expanded, regardless of whether any individual child also matches.
|
|
448
|
+
- Items that don't match (and have no matching descendant) get
|
|
449
|
+
`.prism-nav-hidden`; if nothing in the whole nav matches, a
|
|
450
|
+
`.prism-nav-empty` "No matching menu items" message takes their place.
|
|
451
|
+
|
|
452
|
+
Clearing the input — via the "x" button (`data-prism-nav-search-clear`,
|
|
453
|
+
only shown while there's a query) or pressing <kbd>Escape</kbd> while the
|
|
454
|
+
input has focus and a value — resets the nav back to its normal
|
|
455
|
+
expand/collapse state (whatever `.open`/`.active` state it already had
|
|
456
|
+
from user-toggling or the current page, unrelated to search).
|
|
457
|
+
|
|
458
|
+
Turn it off with `config.menu_search = false` — no search box renders at
|
|
459
|
+
all, and the "Pages" nav starts directly below the brand/language
|
|
460
|
+
switcher, matching this gem's behavior before the feature existed.
|
|
461
|
+
|
|
419
462
|
### Icon helper
|
|
420
463
|
|
|
421
464
|
Available anywhere in your admin views (not just the sidebar):
|
|
@@ -456,6 +499,92 @@ end
|
|
|
456
499
|
Explicit opt-in per column/row — ActiveAdmin's default `status_tag`
|
|
457
500
|
"Yes"/"No" pill is untouched everywhere you don't call it.
|
|
458
501
|
|
|
502
|
+
### Select2
|
|
503
|
+
|
|
504
|
+
Prism reskins [Select2](https://select2.org) — the jQuery widget that makes
|
|
505
|
+
a `<select>` searchable — and ships it vendored inside its own assets
|
|
506
|
+
(`vendor/select2`, MIT licensed), so there's no separate gem/npm dependency
|
|
507
|
+
or JS of your own to add either way. Two ways to use it:
|
|
508
|
+
|
|
509
|
+
**1. Every select, automatically — `config.select2 = true`.** Opt-in
|
|
510
|
+
(default `false`, the only flag in this gem with that polarity — see
|
|
511
|
+
[Configuration reference](#configuration-reference)):
|
|
512
|
+
|
|
513
|
+
```ruby
|
|
514
|
+
ActiveAdminPrism.configure do |config|
|
|
515
|
+
config.select2 = true
|
|
516
|
+
end
|
|
517
|
+
```
|
|
518
|
+
|
|
519
|
+
With this on, *every* plain `<select>` ActiveAdmin renders — filters, form
|
|
520
|
+
inputs, association pickers, ransack predicate dropdowns, date-part
|
|
521
|
+
selects, all of it, no per-field setup — becomes a searchable Select2
|
|
522
|
+
widget. There's no way to exclude individual selects from this today; if
|
|
523
|
+
you only want it on specific fields, use the next approach instead.
|
|
524
|
+
|
|
525
|
+
**2. Specific fields only — bring your own `.select2()` call.** Leave
|
|
526
|
+
`config.select2` at its default `false` and initialize Select2 yourself,
|
|
527
|
+
the same way you would in any other Rails app (this still works whether or
|
|
528
|
+
not you also load your own separate copy of Select2 — Prism's vendored
|
|
529
|
+
copy and a host's own don't conflict, they just both define
|
|
530
|
+
`jQuery.fn.select2` and the last one loaded wins, harmlessly):
|
|
531
|
+
|
|
532
|
+
```ruby
|
|
533
|
+
# app/admin/teachers.rb
|
|
534
|
+
filter :subject, input_html: { class: "your-select2-class" }
|
|
535
|
+
|
|
536
|
+
form do |f|
|
|
537
|
+
f.input :subject, input_html: { class: "your-select2-class" }
|
|
538
|
+
end
|
|
539
|
+
```
|
|
540
|
+
|
|
541
|
+
```js
|
|
542
|
+
$(".your-select2-class").select2({ width: "100%" })
|
|
543
|
+
```
|
|
544
|
+
|
|
545
|
+
Either way, any element Select2 replaces picks up Prism's border/radius/
|
|
546
|
+
focus-ring styling automatically, matching every other input in the
|
|
547
|
+
theme; its open dropdown (search box, results list) is styled to match
|
|
548
|
+
Prism's popover look — see [Select2 markup](#select2-markup) for the
|
|
549
|
+
class reference. The auto-init (approach 1) skips any `<select>` a host
|
|
550
|
+
already initialized manually (approach 2) — see `js-src/prism.js` — so
|
|
551
|
+
the two can coexist: turn `config.select2` on globally and still hand-roll
|
|
552
|
+
one particular field's Select2 options (`tags: true`, a custom
|
|
553
|
+
`ajax:`, etc.) yourself, since your own `.select2()` call runs first and
|
|
554
|
+
the auto-init recognizes it's already initialized.
|
|
555
|
+
|
|
556
|
+
**Multi-select ("tags") mode** — e.g. a `has_many`/`has_and_belongs_to_many`
|
|
557
|
+
association — is themed too, as pill-shaped chips instead of Select2's own
|
|
558
|
+
default boxed/absolute-positioned look:
|
|
559
|
+
|
|
560
|
+
```ruby
|
|
561
|
+
f.input :subjects, as: :select, multiple: true, input_html: { class: "your-select2-class" }, collection: Subject.all
|
|
562
|
+
```
|
|
563
|
+
|
|
564
|
+
Everything above (width handling, dropdown styling) applies the same way
|
|
565
|
+
regardless of single/multiple mode, and regardless of which of the two
|
|
566
|
+
approaches initialized it.
|
|
567
|
+
|
|
568
|
+
**Why width behaves differently in the sidebar Filters panel vs. a form.**
|
|
569
|
+
The Filters panel and standalone filter forms stack each field's label
|
|
570
|
+
above it (no float), so Select2 renders at a flat `width: 100%` there,
|
|
571
|
+
matching `.sidebar_section select`'s own width rule. A `fieldset.inputs`
|
|
572
|
+
form (the main new/edit form) instead floats the label to the *left* and
|
|
573
|
+
gives text inputs an explicit `calc(80% - padding)` width so they sit
|
|
574
|
+
beside it — a padding value this gem has no access to at compile time
|
|
575
|
+
(its CSS is compiled standalone from `scss-src/*.scss`, without
|
|
576
|
+
ActiveAdmin's own Sass variables in its load path; see
|
|
577
|
+
[Customizing colors](#customizing-colors)). Rather than hardcode an
|
|
578
|
+
equivalent, Prism gives the field its own block formatting context
|
|
579
|
+
(`overflow: hidden`, no explicit width) there instead — the CSS spec
|
|
580
|
+
requires a box like that not to overlap a preceding float's box, so the
|
|
581
|
+
browser sizes it to exactly the remaining space automatically, no magic
|
|
582
|
+
number needed. If you render a Select2 field somewhere using neither of
|
|
583
|
+
these two layout conventions, you may need your own `width`/`overflow`
|
|
584
|
+
override alongside it — without one, a full-width Select2 box will render
|
|
585
|
+
*underneath* a floated label rather than beside it, visually hiding the
|
|
586
|
+
label.
|
|
587
|
+
|
|
459
588
|
### Row-level action icons
|
|
460
589
|
|
|
461
590
|
View/Edit/Delete on index pages render as color-coded icon buttons (blue
|
|
@@ -638,13 +767,20 @@ Ruby view files under `lib/active_admin/views/`.
|
|
|
638
767
|
div.prism-sidebar-brand
|
|
639
768
|
#site_title <- AA's own site_title verb, unchanged
|
|
640
769
|
div.prism-sidebar-lang <- only if config.language_switcher and #languages is non-empty
|
|
770
|
+
div.prism-sidebar-search <- only if config.menu_search
|
|
771
|
+
svg.prism-nav-icon.prism-search-icon
|
|
772
|
+
input.prism-nav-search-input[type=search][data-prism-nav-search]
|
|
773
|
+
span.prism-nav-search-clear[data-prism-nav-search-clear]
|
|
774
|
+
svg.prism-nav-icon <- the :x icon
|
|
641
775
|
div.prism-sidebar-scroll
|
|
642
776
|
div.prism-nav-section-label <- "PAGES"
|
|
643
777
|
ul.prism-nav
|
|
644
778
|
li.prism-nav-item[#prism_nav_<id>]
|
|
645
779
|
[.has-children] <- item.items.any?
|
|
646
780
|
[.active] <- item.current?(current_tab)
|
|
647
|
-
[.open] <- has-children && active, or user-toggled
|
|
781
|
+
[.open] <- has-children && active, or user-toggled, or search match (see below)
|
|
782
|
+
[.prism-nav-hidden] <- filtered out by menu search, toggled client-side
|
|
783
|
+
[.prism-search-open] <- this item or a descendant matches the current search query
|
|
648
784
|
span.prism-nav-group-toggle <- only when .has-children
|
|
649
785
|
svg.prism-nav-icon
|
|
650
786
|
span.prism-nav-label
|
|
@@ -653,6 +789,7 @@ Ruby view files under `lib/active_admin/views/`.
|
|
|
653
789
|
svg.prism-nav-icon
|
|
654
790
|
span.prism-nav-label
|
|
655
791
|
ul.prism-nav-submenu <- only when .has-children, nested li.prism-nav-item...
|
|
792
|
+
div.prism-nav-empty[.prism-nav-empty-visible] <- "No matching menu items", shown when search yields zero results
|
|
656
793
|
div.prism-sidebar-utility <- only if the utility menu has items
|
|
657
794
|
ul.prism-nav.prism-nav-utility
|
|
658
795
|
li#prism_nav_current_user
|
|
@@ -703,6 +840,37 @@ than being fixed at boot the way the sidebar's own header-swap
|
|
|
703
840
|
registration is (see [Sign-in page](#sign-in-page) for the other example
|
|
704
841
|
of that "built once at boot vs. re-read every request" distinction).
|
|
705
842
|
|
|
843
|
+
### Menu search markup
|
|
844
|
+
|
|
845
|
+
```
|
|
846
|
+
div.prism-sidebar-search
|
|
847
|
+
svg.prism-nav-icon.prism-search-icon
|
|
848
|
+
input.prism-nav-search-input[type=search][data-prism-nav-search][placeholder="Search menu"]
|
|
849
|
+
span.prism-nav-search-clear[data-prism-nav-search-clear][.prism-nav-search-clear-visible]
|
|
850
|
+
svg.prism-nav-icon <- the :x icon
|
|
851
|
+
```
|
|
852
|
+
|
|
853
|
+
All filtering state lives on the existing `li.prism-nav-item` tree
|
|
854
|
+
rendered by [Sidebar](#sidebar-activeadminviewsprismsidebar) — `prism.js`
|
|
855
|
+
reads `[data-prism-nav-search]`'s value on every `input` event and, per
|
|
856
|
+
item, toggles:
|
|
857
|
+
|
|
858
|
+
- `.prism-nav-hidden` — item (and every descendant) doesn't match and has
|
|
859
|
+
no matching descendant; hidden via CSS.
|
|
860
|
+
- `.prism-search-open` — item itself matches, or has a matching
|
|
861
|
+
descendant; combined with `.has-children`, this is what keeps a group
|
|
862
|
+
expanded during a search independently of its own user-toggled `.open`
|
|
863
|
+
state.
|
|
864
|
+
- `.prism-nav-search-clear-visible` on the clear button, and
|
|
865
|
+
`.prism-nav-empty-visible` on `div.prism-nav-empty`, both mirroring
|
|
866
|
+
whether the query is non-empty / yields zero matches.
|
|
867
|
+
|
|
868
|
+
<kbd>Escape</kbd> while the input is focused and non-empty, or a click on
|
|
869
|
+
`[data-prism-nav-search-clear]`, clears the value and re-triggers the same
|
|
870
|
+
filtering pass (an empty query matches everything, restoring the nav's
|
|
871
|
+
prior expand/collapse state). None of this touches the server — the menu
|
|
872
|
+
tree itself is rendered once, same as without `config.menu_search`.
|
|
873
|
+
|
|
706
874
|
### Panels & cards
|
|
707
875
|
|
|
708
876
|
Pure CSS reskin of AA's existing `Panel`/`Component` markup — no new
|
|
@@ -769,6 +937,39 @@ read-only tag — same pill/thumb CSS, driven by a sibling `:checked`
|
|
|
769
937
|
selector in the form case and by the `.on`/`.off` class in the read-only
|
|
770
938
|
case (there's no real `<input>` on an index/show page).
|
|
771
939
|
|
|
940
|
+
### Select2 markup
|
|
941
|
+
|
|
942
|
+
Only rendered if your app's own JS actually calls `.select2()` on an
|
|
943
|
+
element — see [Select2](#select2). This is
|
|
944
|
+
Select2's own markup, reskinned by targeting its own class names, not
|
|
945
|
+
anything Prism itself renders:
|
|
946
|
+
|
|
947
|
+
```
|
|
948
|
+
.select2-container <- replaces the original (now hidden) <select>
|
|
949
|
+
.select2-selection--single <- single-select: the visible closed-state box
|
|
950
|
+
.select2-selection__rendered <- selected option's text
|
|
951
|
+
.select2-selection__placeholder
|
|
952
|
+
.select2-selection__arrow
|
|
953
|
+
.select2-selection__clear <- the "x" clear button (allowClear: true)
|
|
954
|
+
.select2-selection--multiple <- multiple: true instead — a row of pill "chips"
|
|
955
|
+
.select2-selection__rendered
|
|
956
|
+
li.select2-selection__choice <- one per selected option
|
|
957
|
+
.select2-selection__choice__display <- its label text
|
|
958
|
+
.select2-selection__choice__remove <- its own "x" remove button
|
|
959
|
+
.select2-search--inline
|
|
960
|
+
input.select2-search__field <- the free-typing search box inline with the chips
|
|
961
|
+
[.select2-container--open] <- while its dropdown is open
|
|
962
|
+
[.select2-container--focus] <- multiple mode: while focused (not necessarily open)
|
|
963
|
+
[.select2-container--disabled]
|
|
964
|
+
|
|
965
|
+
.select2-dropdown <- the open dropdown, appended to <body> (or `dropdownParent`)
|
|
966
|
+
.select2-search--dropdown
|
|
967
|
+
input.select2-search__field <- the built-in search box
|
|
968
|
+
ul.select2-results
|
|
969
|
+
li.select2-results__option[.select2-results__option--highlighted][aria-selected="true"]
|
|
970
|
+
li.select2-results__message <- "No results found" etc.
|
|
971
|
+
```
|
|
972
|
+
|
|
772
973
|
### Filters sidebar panel (`#filters_sidebar_section`)
|
|
773
974
|
|
|
774
975
|
Only this specific `SidebarSection` (AA's built-in id for the Filters
|
data/README.md
CHANGED
|
@@ -9,6 +9,19 @@ no manual asset manifest edits.
|
|
|
9
9
|
(configuration reference, feature-by-feature usage, switching/disabling the
|
|
10
10
|
theme, troubleshooting). This README is a quick start.
|
|
11
11
|
|
|
12
|
+
## Live demo
|
|
13
|
+
|
|
14
|
+
A live demo dashboard is running at
|
|
15
|
+
**[prism-demo.onrender.com/admin](https://prism-demo.onrender.com/admin)**:
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
Username: admin@example.com
|
|
19
|
+
Password: password
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
The demo is hosted on Render's free tier, so the first request after a
|
|
23
|
+
period of inactivity can take up to a minute while the instance spins up.
|
|
24
|
+
|
|
12
25
|
## Requirements
|
|
13
26
|
|
|
14
27
|
- ActiveAdmin `>= 3.0, < 4`
|
|
@@ -16,7 +29,6 @@ theme, troubleshooting). This README is a quick start.
|
|
|
16
29
|
- Ruby `>= 3.1`
|
|
17
30
|
|
|
18
31
|
## Install
|
|
19
|
-
|
|
20
32
|
Add to your Gemfile:
|
|
21
33
|
|
|
22
34
|
```ruby
|
|
@@ -104,6 +116,8 @@ ActiveAdminPrism.configure do |config|
|
|
|
104
116
|
{ label: "Español", locale: :es },
|
|
105
117
|
{ label: "Français", locale: :fr }
|
|
106
118
|
]
|
|
119
|
+
config.menu_search = true # search box that filters the sidebar's Pages nav
|
|
120
|
+
config.select2 = false # default: false — auto-enhance every <select> into Select2
|
|
107
121
|
end
|
|
108
122
|
|
|
109
123
|
ActiveAdminPrism.enable!
|
|
@@ -166,6 +180,22 @@ endpoint that sets the locale server-side:
|
|
|
166
180
|
|
|
167
181
|
Turn the whole thing off with `config.language_switcher = false`.
|
|
168
182
|
|
|
183
|
+
## Menu search
|
|
184
|
+
|
|
185
|
+
A search box renders at the top of the sidebar's "Pages" nav, filtering
|
|
186
|
+
menu items by label as you type — pure client-side DOM filtering, no
|
|
187
|
+
server round trip, no change to how you write `menu do |m| ... end` in
|
|
188
|
+
`app/admin/*.rb`.
|
|
189
|
+
|
|
190
|
+
Matching works at any nesting depth: a submenu item that matches keeps its
|
|
191
|
+
parent group visible and expanded even though the parent's own label
|
|
192
|
+
doesn't match, and a parent whose own label matches reveals its entire
|
|
193
|
+
submenu, expanded. Clearing the box (the "x" button, or <kbd>Escape</kbd>)
|
|
194
|
+
resets everything back to its normal expand/collapse state. No matches
|
|
195
|
+
shows a "No matching menu items" message in place of the nav.
|
|
196
|
+
|
|
197
|
+
Turn it off with `config.menu_search = false`.
|
|
198
|
+
|
|
169
199
|
## Toggle switches
|
|
170
200
|
|
|
171
201
|
Boolean fields render as regular (reskinned) checkboxes by default. Opt in
|
|
@@ -204,6 +234,35 @@ It's an explicit opt-in per column/row (like everything else in Prism) —
|
|
|
204
234
|
ActiveAdmin's default boolean rendering is untouched everywhere you don't
|
|
205
235
|
call it.
|
|
206
236
|
|
|
237
|
+
## Select2
|
|
238
|
+
|
|
239
|
+
Prism reskins [Select2](https://select2.org) — the jQuery widget that makes
|
|
240
|
+
a `<select>` searchable — and ships it vendored inside its own assets, so
|
|
241
|
+
there's no separate gem/npm dependency to add. Turn it on for every select,
|
|
242
|
+
no per-field setup:
|
|
243
|
+
|
|
244
|
+
```ruby
|
|
245
|
+
ActiveAdminPrism.configure do |config|
|
|
246
|
+
config.select2 = true # default: false — opt-in, unlike every other flag
|
|
247
|
+
end
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
...or leave that off and opt individual fields in yourself instead, same as
|
|
251
|
+
you would in any other Rails app:
|
|
252
|
+
|
|
253
|
+
```ruby
|
|
254
|
+
filter :subject, input_html: { class: "your-select2-class" }
|
|
255
|
+
# or: f.input :subject, input_html: { class: "your-select2-class" }
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
```js
|
|
259
|
+
$(".your-select2-class").select2({ width: "100%" })
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
See [INTEGRATION.md](INTEGRATION.md#select2) for how the two approaches
|
|
263
|
+
coexist, and why the sidebar Filters panel and a main form need different
|
|
264
|
+
`width` handling under the hood.
|
|
265
|
+
|
|
207
266
|
## Sign-in page
|
|
208
267
|
|
|
209
268
|
Every Devise auth page (sign in, sign up, forgot/reset password, resend
|