<feed xmlns='http://www.w3.org/2005/Atom'>
<title>cccms/public/javascripts, branch erdgeist-modernize-auth</title>
<subtitle>[no description]</subtitle>
<id>https://erdgeist.org/gitweb/cccms/atom?h=erdgeist-modernize-auth</id>
<link rel='self' href='https://erdgeist.org/gitweb/cccms/atom?h=erdgeist-modernize-auth'/>
<link rel='alternate' type='text/html' href='https://erdgeist.org/gitweb/cccms/'/>
<updated>2026-07-16T15:15:54Z</updated>
<entry>
<title>Construct DOM elements using escaping helpers to prevent XSS</title>
<updated>2026-07-16T15:15:54Z</updated>
<author>
<name>erdgeist</name>
<email>erdgeist@erdgeist.org</email>
</author>
<published>2026-07-16T15:15:54Z</published>
<link rel='alternate' type='text/html' href='https://erdgeist.org/gitweb/cccms/commit/?id=454ad6b5726d425737864c3885e9daf161525dfd'/>
<id>urn:sha1:454ad6b5726d425737864c3885e9daf161525dfd</id>
<content type='text'>
</content>
</entry>
<entry>
<title>managed RRULE constructs now include week selection</title>
<updated>2026-07-16T14:43:11Z</updated>
<author>
<name>erdgeist</name>
<email>erdgeist@erdgeist.org</email>
</author>
<published>2026-07-16T14:43:11Z</published>
<link rel='alternate' type='text/html' href='https://erdgeist.org/gitweb/cccms/commit/?id=35dc05de97677d57123617a7c4e78aad1611b28d'/>
<id>urn:sha1:35dc05de97677d57123617a7c4e78aad1611b28d</id>
<content type='text'>
Improve the humanizer to also understand weekly patters that
an editor can manually select, on top of the single week
rules.

Extend template and javascript controller to reflect these
changes.
</content>
</entry>
<entry>
<title>Remove some remnants of legacy admin wizard interface</title>
<updated>2026-07-15T23:37:12Z</updated>
<author>
<name>erdgeist</name>
<email>erdgeist@erdgeist.org</email>
</author>
<published>2026-07-15T23:37:12Z</published>
<link rel='alternate' type='text/html' href='https://erdgeist.org/gitweb/cccms/commit/?id=467ec340be673fbc7c3140b86d8aa7e43307ad1d'/>
<id>urn:sha1:467ec340be673fbc7c3140b86d8aa7e43307ad1d</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Add inline image insertion for page bodies, plus a headline-conflict badge</title>
<updated>2026-07-14T16:30:40Z</updated>
<author>
<name>erdgeist</name>
<email>erdgeist@erdgeist.org</email>
</author>
<published>2026-07-14T15:06:59Z</published>
<link rel='alternate' type='text/html' href='https://erdgeist.org/gitweb/cccms/commit/?id=8847db139bef9dd8f9465c31438f16af13593267'/>
<id>urn:sha1:8847db139bef9dd8f9465c31438f16af13593267</id>
<content type='text'>
Custom TinyMCE toolbar button opens a picker scoped to a page's own
attached images. Selecting one and a placement (full width, left,
right) inserts &lt;a class="glightbox" data-gallery="page-N"&gt;
wrapping an &lt;img&gt;, sharing the existing headline-image lightbox
gallery. No native TinyMCE image dialog or resize handles --
placement is fixed to the three options via CSS classes only.

extended_valid_elements defines a and img explicitly and
symmetrically; valid_classes allows the placement classes and
glightbox specifically. content_style renders placement inside the
editing iframe, since ccc.css doesn't load there.

A pre-save pass removes any a.glightbox left without an img,
covering in-editor deletion regardless of how it happened.

Alt text comes from the asset's name, escaped.

A badge marks whichever attached image sits at position 0, since
_headline_image.html.erb always renders that position as the
page's automatic headline. Shown in the sidebar Images list and in
the picker grid.
</content>
</entry>
<entry>
<title>Add a toggleable live preview panel to both editors</title>
<updated>2026-07-14T02:10:01Z</updated>
<author>
<name>erdgeist</name>
<email>erdgeist@erdgeist.org</email>
</author>
<published>2026-07-14T02:10:01Z</published>
<link rel='alternate' type='text/html' href='https://erdgeist.org/gitweb/cccms/commit/?id=e0f2394fd0816ef03bf4b928ab9fa5a18c32ffda'/>
<id>urn:sha1:e0f2394fd0816ef03bf4b928ab9fa5a18c32ffda</id>
<content type='text'>
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.
</content>
</entry>
<entry>
<title>Fix autosave bug: sync tinymce's state back to textarea before serializing</title>
<updated>2026-07-13T16:56:13Z</updated>
<author>
<name>erdgeist</name>
<email>erdgeist@erdgeist.org</email>
</author>
<published>2026-07-13T16:56:13Z</published>
<link rel='alternate' type='text/html' href='https://erdgeist.org/gitweb/cccms/commit/?id=1234371b084356c7542e53d20c9b816332a945d3'/>
<id>urn:sha1:1234371b084356c7542e53d20c9b816332a945d3</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Asset picker: attach/detach/reorder UI, read-only view, autosave fix</title>
<updated>2026-07-13T02:54:33Z</updated>
<author>
<name>erdgeist</name>
<email>erdgeist@erdgeist.org</email>
</author>
<published>2026-07-13T02:54:33Z</published>
<link rel='alternate' type='text/html' href='https://erdgeist.org/gitweb/cccms/commit/?id=8baac265059b70da0148487458ee4077b15f155e'/>
<id>urn:sha1:8baac265059b70da0148487458ee4077b15f155e</id>
<content type='text'>
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
&lt;template&gt; -- 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.
</content>
</entry>
<entry>
<title>Add loadOnFocus to initSearchPicker; asset search shows recent by default</title>
<updated>2026-07-13T01:48:28Z</updated>
<author>
<name>erdgeist</name>
<email>erdgeist@erdgeist.org</email>
</author>
<published>2026-07-13T01:48:28Z</published>
<link rel='alternate' type='text/html' href='https://erdgeist.org/gitweb/cccms/commit/?id=5f56fa867f073d8d1aecbfbba4a340ea414cfb0d'/>
<id>urn:sha1:5f56fa867f073d8d1aecbfbba4a340ea414cfb0d</id>
<content type='text'>
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.
</content>
</entry>
<entry>
<title>Wavy-underline: allowlist to default; destroy-button and search polish</title>
<updated>2026-07-12T23:57:43Z</updated>
<author>
<name>erdgeist</name>
<email>erdgeist@erdgeist.org</email>
</author>
<published>2026-07-12T23:57:43Z</published>
<link rel='alternate' type='text/html' href='https://erdgeist.org/gitweb/cccms/commit/?id=65c7c40f74c315c1a39fb15da8ce341fb8b9b05e'/>
<id>urn:sha1:65c7c40f74c315c1a39fb15da8ce341fb8b9b05e</id>
<content type='text'>
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 &lt;button&gt; 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.
</content>
</entry>
<entry>
<title>Add a grouped tag+node search endpoint for the upcoming dashboard</title>
<updated>2026-07-12T14:33:12Z</updated>
<author>
<name>erdgeist</name>
<email>erdgeist@erdgeist.org</email>
</author>
<published>2026-07-12T14:33:12Z</published>
<link rel='alternate' type='text/html' href='https://erdgeist.org/gitweb/cccms/commit/?id=4ec70e5ecf792a56e868538738d6c7f63bb6cf24'/>
<id>urn:sha1:4ec70e5ecf792a56e868538738d6c7f63bb6cf24</id>
<content type='text'>
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.
</content>
</entry>
</feed>
