| Age | Commit message (Collapse) | Author |
|
_chapter.html.erb (the aggregator partial used by the erfas/
chaostreffs overview pages) never rendered an image at all --
editors attaching a hackerspace photo via the asset picker would see
zero visible effect on exactly the pages they'd check first.
chapter_detail.html.erb (the individual page template) had the same
gap. Both fixed by reusing existing infrastructure rather than
inventing anything: the overview list gets a small, aspect-preserving
:thumb image beside the heading; the detail page gets the app's
existing headline_image helper, the same one every other full-page
template already uses.
|
|
Hidden by default, shares horizontal space with the body editor once
opened rather than a separate section, and only requests the iframe's
src on first toggle -- no preview traffic at all until someone
actually wants to see it. Refreshes automatically on every successful
autosave; a separate force-render button re-attempts a save-and-
refresh cycle immediately, for when the normal 7-second cycle has
been interrupted (a lock-lost error, a transient failure) and waiting
for the next tick isn't good enough.
|
|
|
|
|
|
Replaces the old locale-switch-and-edit-the-same-screen workflow,
which conflated presentation locale with content locale and let an
editor silently drift into editing the wrong language with no
persistent signal that anything had changed. Non-default-locale
content now has its own explicit routes and screens, never sharing
a route param with the ambient chrome locale.
- PageTranslationsController: index/show/edit/update/destroy,
scoped to Page.non_default_locales; update handles first-time
creation too, so there's no separate new/create step.
- Reads go through the actual PageTranslation row
(Page#translation_summary), never through the Globalize
fallback-bearing accessor -- fallback is correct for public
rendering but wrong for editing, where a missing translation
needs to look empty, not borrowed from another locale.
- Translations ride on the page's own draft/head cycle; no
independent publish state.
- nodes#show gains a Translations section (per-locale Lock+Edit /
Create+Lock, Destroy, a link into the read-only Compare view) and
a locale indicator on its own default-locale content; nodes#edit,
nodes#update, and nodes#autosave are pinned to the default locale
via Globalize.with_locale regardless of the ambient route locale.
- nodes#show no longer double-loads the node or calls wipe_draft!
on every view (see previous commit for why that's now safe).
- .preview_link_row is renamed .aligned_action_row now that it has
a second real consumer.
|
|
Replaces nodes#edit's old Images section -- a hidden panel dumping
every image asset in the system unfiltered (#image_browser) plus a
raw drag-and-drop box (#image_box) -- with a small search-and-click
picker built on the endpoint from the last two commits. Attaching
posts immediately and appends the new thumbnail via a cloned
<template> -- icons only render correctly through the Rails helper
server-side, so the template holds real, pre-rendered markup for JS
to clone rather than duplicating raw SVG in a JS string. Reordering is
jQuery UI sortable on the small attached list only, with a dedicated
drag handle rather than the whole thumbnail.
Two bugs caught while click-testing, fixed here rather than shipped
and patched after: the search panel never closed after attaching an
image, since the success handler re-triggered focus to keep it open
for attaching several in a row -- which meant it just re-populated
itself forever instead of signaling "done." Fixed to close explicitly;
a click-outside-closes handler was added alongside it, matching the
affordance the top-bar search already has.
A real, independent, pre-existing data bug surfaced during the same
testing: Node#autosave!'s first-time-creation branch never carried
related assets forward from whatever page was previously current --
attach an image, let autosave fire once, and it silently landed on a
fresh, assetless Page row. Long-dormant, not introduced by this work,
just finally exercised by something that made it visible. Fixed inside
the `unless self.autosave` guard specifically -- running this on every
call, not just creation, would overwrite anything attached directly to
an existing autosave in between, a worse bug than the one being fixed.
nodes#show gains a read-only Images section, rendered only when a page
actually has attached images, so an attachment can be confirmed
present without entering the edit/lock cycle -- useful on its own, and
specifically useful the next time an asset bug needs investigating.
Its thumbnail CSS is shared with the edit view's picker via a class
(.thumbnail_list) rather than duplicated under a second name.
|
|
initSearchPicker's input handler has always short-circuited on an empty
term -- correct for every existing picker, none of which want results
appearing before anything's typed. The asset picker does want exactly
that (show the last few uploaded images without requiring a search
first), so this adds an opt-in loadOnFocus option instead of changing
the shared default: it fires once when the input gains focus with no
term yet, reusing the same request/render path a real search uses
rather than a separate code path. The AJAX call itself was pulled out
into a named runSearch function so both triggers could share it without
duplicating the success/render logic.
RelatedAssetsController#search now treats a blank term as "show the
most recently created, unattached images" (limit 5) rather than
returning nothing, matching the new client behavior. A real search
term still returns up to 10 name-matched results, unchanged.
|
|
Flips the plain-link underline from an opt-in list (growing every time
a new context needed it) to the default a rule, with opt-outs living
as more specific overrides where something shouldn't look like plain
content -- .action_button, the icon nav, the search dropdown's bold
results. The allowlist's own history made the case for this: three of
its entries were already hand-copied duplicates of the same five
properties, and two of those had already silently drifted.
form.button_to's icon+text buttons (Destroy, currently) get the same
inline-flex/gap treatment .action_button already had -- they were
never included in that fix, so they still baseline-aligned an SVG
against text instead of centering it, plus an explicit icon size
they'd never had either.
Dashboard search results: tags render as a wrapped row of pills
instead of one-per-line, for visual distinction from page results.
The public-preview link and its Revoke button get their own row
rather than loose inline flow, which wrapped unpredictably next to a
long token URL -- aligned by box-top rather than center or baseline,
since a <button> doesn't reliably expose a text baseline the way a
plain link does, with a small compensating offset for the button's
own internal padding.
|
|
The input's width was calc(100% - 70px), a number tuned to leave room
for a "Search: " label that no longer needs to exist -- replaced by a
placeholder instead, which also removes the fragile arithmetic
entirely rather than re-tuning it. Also picked up a proper
border-radius and padding, matching the dashboard's own search input.
The width bug's actual proximate cause was a stray #navigation div {
float: left } left over from the old text nav, interfering with the
icon nav's own flex layout. Going through that whole block with the
same scrutiny turned up four more rules worth removing, not fixing:
a:hover (identical specificity, later in the file, silently winning
the cascade since the icon nav landed), and #metadata/#overview_toggle
in the remaining selectors were dead for two different, confirmed
reasons -- #overview_toggle was the old wizard's toggle bar, gone
along with it, and #metadata here was the pre-details-view subnav
toggle, retired before this session and unrelated to the current,
still-live #metadata id on the metadata-details section in nodes#edit
(a confusing reuse that's caused real problems before).
|
|
The search overlay was positioned against the whole viewport
(left: 50%, transform: translateX(-50%)) because it sat outside
wider text nav it used to center under. Moved inside #navigation,
which already has its own positioning context, so it now anchors to
the icon nav itself instead of the page center.
admin/search_results.html.erb was a bare, unstyled <ul> concatenating
title and unique_name into one string by hand. Restyled to match the
byline convention already used everywhere else (title_for_node, a
separate link_to_path byline with the trailing arrow), and results
now link to the node's admin show page rather than straight to edit,
matching every other node list in the app instead of being the one
exception.
menu_items#new and sessions#new (the login page) were the last two
views still using the pre-node_content/node_description table-based
label/field layout -- found via a grep for the old td.description
marker, not guessed at. Converting menu_items#new surfaced a real,
separate gap: its input fields have never had a width rule, since the
existing 690px rule only applies to a few specifically-named field
IDs or anything inside #page_editor, neither of which applies here.
Same likely gap probably exists on other simple CRUD forms
(users/events/assets/occurrences/pages) -- not fixed here, flagged for
its own pass rather than guessed at blind.
nodes#new's Create button was pushed to the far right of the page by
one stray class (node_content right) no sibling create form carries --
not a family-wide inconsistency, one extra class in one file.
|
|
New rules for the icon nav, search bar, signpost/housekeeping button
rows, and the two dashboard widgets. Generalizes .action_button from
an anchor-only selector to cover any element, needed once Filter and
Search became real buttons rather than submit_tag inputs coincidentally
sharing similar values with the generic input[type=submit] fallback.
Also folds three hand-copied duplicates of the wavy-underline "plain
link" treatment (#flash a, div.pagination a, #menu_item_list td a)
into the one shared rule they were always copies of -- two of the
three had already silently drifted by missing the -webkit-prefixed
property, the actual cost of copying instead of sharing rather than a
hypothetical one.
|
|
AdminController#dashboard_search returns tags and nodes as separate,
labeled groups (via ActsAsTaggableOn::Tag.named_like and
Node.editor_search) rather than the flat per-node list every existing
picker returns. initSearchPicker gains a renderResults callback option
that, when given, replaces the default per-node rendering entirely --
lets the dashboard render its two labeled groups without a second,
parallel picker implementation.
resultsHeaderHtml (the "Press Enter to see all results" hint) is now
threaded through as a third argument to renderResults, so a picker with
custom rendering can still show it -- previously only the default
per-node branch ever did.
Tags link straight to the existing /admin/nodes/tags/:tag view rather
than becoming an in-place filter chip.
|
|
menu_items/parent_search/move_to_search/event_search each duplicated
their own debounce-free AJAX call and result rendering. Replaced with
one shared initSearchPicker, taking each picker's distinctive
behavior (parent_search's live path preview, event_search's title
hint) as a callback rather than a whole reimplementation. Adds a real
debounce with an out-of-order-response guard -- none of the four had
either before. admin_search (the Alt+F top-bar search) now shares the
same function via its own url/isActive/header options, gaining the
same guard and fixing an inconsistency of its own (it previously
always slid its panel open, even on zero results).
Each picker's results container gets its own id instead of sharing
was ever supposed to be on screen at once, an assumption with no
actual enforcement behind it. Styling moved from an id-pair
(#menu_search_results, #search_results) to a shared .search_results
class so a future picker never needs this file touched again.
menu_search and the admin top-bar search now call Node.editor_search
instead of the public, head-only Node.search -- both are admin-only,
authenticated views, and had no reason to inherit the public search's
"can't find a draft" limitation. The always-ignored :per_page => 1000
on the latter is gone too; Node.search's second argument was never
read by the method at all.
Also removed a stale #metadata a { text-transform: lowercase } rule,
found while verifying the above -- written for the pre-subnav-removal
expand-toggle, which no longer exists; it had been silently
lowercasing nodes#edit's own, unrelated #metadata div (including
move_to_search's results) by id coincidence ever since. #main_navigation
and #overview_toggle intentionally left capitalized rather than
special-cased -- both belong to the nav bar already slated to shrink
to three icons, not worth polishing on the way out.
|
|
Extracted from admin#index's inline table into NodesController#sitemap.
Nested <details>/<summary> per branch, one linear pass over the
existing flat [node, level] list (no added queries) -- each node's own
descendant count computed the same way, via a small stack rather than
re-walking the tree per node. Branches under updates/, club/erfas,
club/chaostreffs, and disclosure start collapsed by default
(CccConventions::SITEMAP_COLLAPSED_PATHS); any branch currently
collapsed, whether by that default or because someone just closed it,
is highlighted via a plain :not([open]) selector -- no state tracked
outside the DOM itself.
Dropped the update?-post exclusion this view used to rely on -- no
longer needed now that updates/ collapses instead of being filtered
out, so its real children (previously silently absent) now show up
correctly. admin#index's own, separate @sitemap query is unchanged;
that view has no collapse mechanism to compensate and wasn't part of
this.
|
|
Four NodesController actions -- drafts, recent, mine, chapters --
each building its own base scope, sharing one private method
(index_matching) for search narrowing and pagination. Wizard rewrite
to link into these instead of rendering its own tables is a separate,
later step.
Node.editor_search backs the shared "q" narrowing: an ILIKE substring
match against title/abstract on whichever of head or draft is
present, splitting the term on whitespace and requiring every word to
match somewhere independently, not as one phrase, since real words can
end up separated by markup in the underlying HTML. Deliberately
separate from Node.search, the public content search, which stays
tsvector-based and head-only.
chapters generalizes into /admin/nodes/tags/:tags for an arbitrary
tag list (OR'd, not AND'd), sharing the controller action but
rendering its own template rather than branching inside one view.
|
|
|
|
Pagination had almost no styling, and its current-page selector never
matched will_paginate's actual markup. Added chip-style page links, a
solid current-page indicator, and distinct disabled states for
Previous/Next.
Previous/Next/gap rendered as empty, unlabeled elements --
will_paginate only ships English translations and this app defaults
to German. Added previous_label/next_label/page_gap to en.yml and
de.yml.
|
|
Long RRULEs previously overflowed their column with no wrap point;
now escaped and rendered with a <wbr> after each semicolon, so a
long rule wraps at a clause boundary instead of running off the
table. Deliberately not truncated -- a cut-off RRULE's trailing
clause (BYDAY, BYMONTH, etc.) is usually the most specific part.
The url column is now a real link, truncated with an ellipsis at a
fixed width -- deliberately no tooltip, since hovering a real link
already shows the full address in the browser's own status bar.
rrule_with_break_opportunities splits on the raw string's own
semicolons before escaping each piece, not after -- escaping first
and searching the result for semicolons also matches the ones inside
</> entities, corrupting anything containing a literal < or >.
|
|
"#page_editor form input[...]" -- but form_for wraps around
inside, so the selector never matched anything. Every field without
its own dedicated per-id rule (i.e. everything outside nodes#edit)
fell through to the bare, unsized base rule instead. Fixed by
dropping the erroneous "form" and adding textarea, which the rule
never covered either even for its intended targets.
nodes#edit's own per-id rules (#page_title, #page_abstract, etc.) are
unaffected -- same specificity, later in the file, so they still win
where they already applied.
|
|
|
|
Hiding the numeric revision picker for head/draft/autosave comparisons
accidentally took the view toggle down with it -- it was nested inside
the numeric-only branch instead of being its own control. Now renders
unconditionally as plain links, with the current mode shown as
non-interactive text. Switching which revisions to compare via the
numeric form no longer silently resets the view mode back to inline.
|
|
|
|
|
|
|
|
Revisions#diff now computes an inline or side-by-side word diff
server-side (Page#diff_against, lib/html_word_diff.rb) instead of
shipping raw/escaped content to the browser for a 2008-era vendored
JS differ to mangle. View mode is picked via a `view` param, settable
either on the diff page itself or directly from the revisions#index
sticky bar next to "Diff revisions".
Also fixes a pre-existing bug in RevisionsController#diff's single-
revision branch, which set params[:start]/params[:end] instead of
params[:start_revision]/params[:end_revision].
|
|
|
|
Converts the <p>-per-field layout to node_description/node_content,
matching every other converted view. The RRULE builder's internal
markup and JS-driven show/hide are untouched -- only its containing
block moved.
Adds the same node picker and optional Title field events#new just
got, with one addition specific to edit: an already-linked event
shows its node as a plain link, with the picker itself gated behind
a <details> disclosure. Re-linking a live event to a different node
is rare and has real side effects (which page it appears under, which
tag-prefill applies), so it gets an extra click rather than sitting
as easy to trigger as the unlinked case, which stays unguarded.
Moves Destroy out of the subnav and into the page body, matching
events#show. Required extracting it (and Back) into their own block
outside form_for -- button_to generates its own nested <form>, which
the browser silently drops when nested inside another; this is the
same failure mode nodes#edit hit earlier in this branch. Reuses the
existing .node_action_bar class rather than the naked block that
would've resulted, adding a "standalone_action_bar" modifier for the
two things specific to living outside #page_editor: the -125px
margin every other line in the form gets for free, and link
underline visibility, since this is the first .node_action_bar
instance with a bare <a> rather than only buttons.
|
|
|
|
Editors' TinyMCE output can contain unclosed void elements like <br>,
which is valid HTML5 but invalid XML -- three different places assumed
the stricter rule and broke or silently misbehaved on the looser one.
The Atom feed's <content type="xhtml"> block required real, well-formed
XML structure but was handed a raw, unescaped body string; switched to
type="html" with CGI.escapeHTML, matching how title/summary already
handle the same content. rewrite_links_in_body used libxml's strict XML
parser to rewrite internal links to be locale-prefixed, which raised on
exactly this class of malformed markup -- silently, since the whole
method was wrapped in rescue; nil, meaning the link rewrite (not the
save) quietly failed with no error anywhere. Replaced with Nokogiri's
lenient HTML parser, which repairs malformed void elements rather than
rejecting them; also drops the bare rescue now that the actual failure
mode it was guarding against shouldn't occur, and fixes two adjacent
bugs found while in this method: a typo'd /sytem/uploads/ regex that
could never match, and a missing https:// exclusion alongside the
existing http:// one.
Also addresses stale flash messaging surfaced while testing the above:
update's save confirmation was being clobbered by edit's own "locked
and ready" notice on the very next request, since nothing distinguished
a fresh lock acquisition from a redirect back after saving. The save
confirmation now names the next step (publish from Status) and flags a
stale translation if one exists, using Page#outdated_translations?,
already present but previously unused by any controller.
|
|
Remove dead pages#index and occurrences resource; fix menu_items#new
menu_items#new called menu_item_params, which requires a submitted
menu_item key that can never be present on a fresh GET -- new only
ever needs a blank record to render against.
pages#index and the entire occurrences resource were unmodified Rails
scaffold generator output, unlinked from any nav and unreachable except
by direct URL. pages#index had no controller action at all (@pages was
never assigned); occurrences#index queried every row with no scoping or
pagination and its layout referenced a scaffold.css asset that no
longer exists in the pipeline. Neither is a real editorial surface --
occurrences are auto-generated from an event's RRULE and were never
meant to be browsed as a flat list. Removed rather than repaired.
pages#preview and pages#sort_images remain, now as explicit routes
rather than under a full resources :pages block.
|
|
Fix button height mismatch, extend table styling to assets/users/events
a.action_button (bordered) and the state_changing/destructive/computation
pills (borderless) rendered at different heights, since each pill variant
set its own padding at higher specificity than the shared rule meant to
equalize them. Padding and border-radius now live only in one shared
rule; also restores the #page_editor prefix on a.action_button, needed
to outrank the #page_editor a wavy-underline rule.
table.assets_table, table.user_table, and table.events_table now share
table.node_table's border-collapse/header/hover treatment. tr
min-height is dropped -- browsers don't honor height on <tr> -- in
favor of cell padding, kept at zero for node_table (spacing already
comes from its h4/p content) and set to 8px for the plain-text tables.
|
|
Adds a fourth button category, .computation -- teal, matching Preview's
existing color -- for actions that compute a view without changing state,
the first case in the app that didn't fit reversible/state-changing/
destructive. Diff revisions now starts disabled and only enables once two
distinct revisions are selected, matching the disabled-state pattern
already used for Unlock + Back.
The header row is wrapped in a real <thead> (previously flat inside the
table alongside data rows) so a sticky diff bar can sit above the fold on
long revision lists -- selecting a comparison pair no longer requires
scrolling back up to find the button, or back down to confirm what's
selected, both surfaced live via one shared JS function.
The two most recent revisions are pre-selected by default, covering the
most common comparison (current against previous) with no extra clicks.
Deliberately scoped to numbered revisions only -- comparing draft/head or
autosave/draft was raised and set aside, since neither exists as a row in
this table by design and extending the comparison to them is a separate
feature, not a default on this one.
Also drops the dead "Edit" subnav link, redundant with nodes#show's
Status section covering the same action with state-aware labeling this
static link could never have.
|
|
Retires content_for :subnavigation on nodes#show entirely -- Preview
was fully redundant with Links' own preview URLs in every state, and
Edit is now a permanent, always-rendered action inside the new Status
section rather than a link floating at the top, consistent with the
"action lives next to the info" pattern People already established
for Unlock. Status surfaces head/draft/autosave plainly and gates
Edit/Publish/Destroy/Discard on lock ownership specifically, not mere
lock presence -- @node.locked? alone would have blocked the lock
owner's own session, caught by the click-test and fixed here rather
than shipped.
nodes#edit's action bar is rebuilt to sit outside form_for (both
button_to calls render their own nested form, invalid HTML the
browser was silently stripping) with Save wired back in via
form="..." rather than needing to live inside the form tag at all.
Also brings the locked-and-ready-to-edit flash message, and the
visual polish from this session's click-test: consistent button
heights across the bordered and pill-shaped variants sharing a row,
spacing between Status's data and its actions, and error_messages
styling reusing the destructive-red vocabulary already established
elsewhere.
|
|
|
|
Previously piggybacked on the main form's action and relied on a
.js.erb response to update #flash; now posts to the dedicated
autosave route with an explicit _method=put override, and reacts to
a 423 by stopping the timer and showing a persistent banner rather
than letting the next Save discover the conflict on its own.
|
|
|
|
|
|
|
|
|
|
|
|
Sorts rules by hierarchy (base -> layout -> navigation -> buttons ->
tables -> forms -> components), consolidates three duplicated media
query breakpoints into one each, and adds section comments. Bundled
with this reorganization, since the file was rewritten wholesale:
- form.button_to.state_changing: new tinted-pill variant (blue) for
Publish/Restore/Unlock/Revoke, matching .destructive's pattern
- form.button_to.destructive: now a tinted pill at rest instead of
plain colored text, consistent padding at rest and on hover
- Scoped wavy-underline link-visibility fix for #page_editor,
table.node_table, table.assets_table, table.events_table,
table.user_table, .add_child_links, and the dashboard draft list
- #flash decoupled from the page's structural nav-to-content spacing
(.admin_content_spacer), which the flash div was silently providing
as a side effect whenever it rendered
|
|
|
|
parent_match Procs on CccConventions::NODE_KINDS, matched against
unique_path, decide which "add child" kinds show on a given node. Fixes
nodes#new not honoring a pre-selected kind (radio group and parent-field
visibility both defaulted to "generic" unconditionally).
|
|
nodes#show's flat <table> of label/value pairs grew unreadable once
Admin Preview and Public Preview were added alongside Public Link -
switched to the div.node_description/div.node_content pattern already
used by nodes#edit, grouped into People/Dates/Links/Revisions/Tags/
Events/Children sections rather than one undifferentiated list.
People/Dates/Links use a flex-based item layout, not a second <table> -
multiple independent tables sharing one outer width but different
column counts produced misaligned columns with no shared grid. Flex
items size to their own content with a shared minimum instead.
Revisions and Children are both collapsed via <details>, no JS needed -
previously nodes#show didn't list a node's children at all, blocking
the ability to find/navigate erfa and chaostreff pages without already
knowing they're now standalone nodes. Revision list items link to
node_revision_path(@node, page) - the actual per-revision diff/restore
view, not the plain index.
nodes#new converted to the same pattern for visual consistency, plus a
few things surfaced along the way: submit buttons were unstyled
site-wide (a bare input[type=submit] with no border, fill, or hover
state - Create on this exact page was easy to miss entirely), fixed
with a bordered/bold treatment reusing the existing form.button_to
visual language rather than introducing a fourth button style. Title
regained the bold weight it had before the table rewrite dropped it
silently. Tag list grouping and full link/button semantic taxonomy
(show vs edit/add vs publish/revoke vs destroy, applied consistently
across every link on the page, not just buttons) are known follow-ups,
not attempted here.
|
|
nodes#new: each kind's radio button now shows a label plus a smaller,
muted .field_hint explaining what happens automatically (parent,
tags, template) - previously a single undifferentiated string mixing
a short label with a long parenthetical, cluttering the smaller kinds
(erfa/chaostreff) worst. Title field gets the same hint treatment,
telling editors up front that the slug is auto-generated and where to
adjust it later - the previous silence here meant editors only
discovered slug generation after already committing to a title, with
no visible way to fix it.
New "Resulting path" row live-previews the full URL (origin + kind's
path prefix + a debounced call to the new parameterize_preview route,
reusing the exact same slug_for helper "create" now calls, so the
preview can never diverge from what actually gets created) as the
editor types, plus a copy-to-clipboard button. For "generic", the
prefix comes from whichever parent gets chosen via the search widget,
not the registry - parent_search.link_closure now stashes the chosen
node's unique_name as a data attribute for exactly this.
New read-only admin/conventions view dumps the NODE_KINDS registry as
a reference table for whoever's confused later about how a given kind
behaves - deliberately just renders the same label/hint text used on
nodes#new rather than re-describing parent/tags/template separately,
since decomposing the parent Proc would mean either invoking it
(Update's has a real side effect - creates the year folder) or
re-stating its logic a second time in a different shape, either of
which risks drifting from the actual behavior.
nodes#edit's Template field gets a one-line hint noting the value may
already be pre-filled based on how the node was created - the one
place the previous commit's new inheritance mechanism actually
surfaces on this view.
|
|
layouts/admin.html.erb's top-bar search results div shared id
"search_results" with nodes#new/nodes#edit's parent-search widget -
since the layout renders on every admin page, whichever widget's JS
ran last silently won the shared ID, putting top-bar results into the
parent-search box on affected pages. Renamed to "menu_search_results"
and updated admin_search.js to match.
Also modernizes admin_search.js's event bindings from keyup/keydown/
keypress/paste/cut + .attr("value") to input + .val() throughout
(menu_items, parent_search, move_to_search) - the multi-event binding
was working around old IE compatibility that .val() + "input" already
handles correctly. parent_search's result rendering now matches
menu_search's convention (real <p>/<a> markup with a .result_path
span) instead of a bare <a> in a throwaway wrapper div, so the same
CSS rule now correctly applies to both.
menu_search's JSON response gains node_path per result, matching what
admin_search's own results already provide - not yet consumed by
parent_search/move_to_search, which still render click-to-select links
rather than navigable ones (correct for their purpose - selecting a
value, not leaving the page).
Known remaining gap, not fixed here: menu_items, parent_search, and
move_to_search still all target the literal id "search_results"
between themselves. No live collision today since none of the three
currently share a page, but it's the same fragility as the bug above -
tracked alongside the existing menu_items/parent_search/move_to_search
consolidation backlog item rather than treated as resolved.
|
|
|
|
|
|
- open_erfas_today helper: samples 3 random open-day-tagged occurrences
of the current day; widget hidden entirely on days without open
chapters; heading shows current weekday
- content/_open_erfas_today partial rendered in right column above
tags and featured articles
- _chapter partial: open-day schedules (event_schedule_text) shown
inline in aggregated chapter lists with 'Offene Tage' label
- ccc.css: open_erfas_today added to existing right-column widget
selector groups (headings, lists, links)
|
|
- Extend all selectors to cover button[type="submit"] alongside
input[type="submit"] — Rails 8.1 generates <button> not <input>
- Add appearance: none / -webkit-appearance: none to kill browser
native button chrome
- Default hover now matches plain link hover (color: #ff9600)
- Add form.button_to.destructive variant: #cc0000 at rest,
white-on-red pill on hover
- Usage: form: { class: 'button_to destructive' } in button_to calls
|