Refactors app.js, adds stub for hiding the calendar left pane

This commit is contained in:
Andrew Gioia 2026-02-05 09:35:04 -05:00
parent 50b9cfe17d
commit 7a2b0e44ad
Signed by: andrew
GPG Key ID: FC09694A000800C8
5 changed files with 68 additions and 24 deletions

View File

@ -47,6 +47,7 @@ return [
'title' => 'Calendar settings',
],
'timezone_help' => 'You can override your default time zone here.',
'toggle_sidebar' => 'Toggle calendar sidebar',
'event' => [
'when' => 'When',
'all_day' => 'All day',

View File

@ -47,6 +47,7 @@ return [
'title' => 'Impostazioni calendario',
],
'timezone_help' => 'Puoi sovrascrivere il tuo fuso orario predefinito qui.',
'toggle_sidebar' => 'Mostra o nascondi la barra laterale del calendario',
'event' => [
'when' => 'Quando',
'all_day' => 'Tutto il giorno',

View File

@ -245,7 +245,18 @@ main {
/* section specific */
&#calendar {
/* */
header {
h2 {
.calendar-expand-toggle {
@apply ml-1 opacity-0 pointer-events-none transition-opacity duration-150;
}
&:hover .calendar-expand-toggle,
&:focus-within .calendar-expand-toggle {
@apply opacity-100 pointer-events-auto;
}
}
}
}
&#settings {
/* */

View File

@ -1,6 +1,16 @@
import './bootstrap';
import htmx from 'htmx.org';
const SELECTORS = {
calendarToggle: '.calendar-toggle',
calendarViewForm: '#calendar-view',
calendarExpandToggle: '[data-calendar-expand]',
colorPicker: '[data-colorpicker]',
colorPickerColor: '[data-colorpicker-color]',
colorPickerHex: '[data-colorpicker-hex]',
colorPickerRandom: '[data-colorpicker-random]',
};
/**
* htmx/global
*/
@ -19,34 +29,43 @@ document.addEventListener('htmx:configRequest', (evt) => {
})
/**
* calendar toggle
* calendar ui
* progressive enhancement on html form with no js
*/
document.addEventListener('change', event => {
const checkbox = event.target;
document.addEventListener('change', (event) => {
const target = event.target;
// ignore anything that isnt one of our checkboxes
if (!checkbox.matches('.calendar-toggle')) return;
if (target?.matches(SELECTORS.calendarToggle)) {
const slug = target.value;
const show = target.checked;
const slug = checkbox.value;
const show = checkbox.checked;
document
.querySelectorAll(`[data-calendar="${slug}"]`)
.forEach(el => el.classList.toggle('hidden', !show));
return;
}
// toggle .hidden on every matching event element
document
.querySelectorAll(`[data-calendar="${slug}"]`)
.forEach(el => el.classList.toggle('hidden', !show));
const form = target?.form;
if (!form || form.id !== 'calendar-view') return;
if (target.name !== 'view') return;
form.requestSubmit();
});
/**
* calendar view picker
* progressive enhancement on html form with no js
* calendar sidebar expand toggle
*/
document.addEventListener('change', (e) => {
const form = e.target?.form;
if (!form || form.id !== 'calendar-view') return;
if (e.target.name !== 'view') return;
document.addEventListener('click', (event) => {
const toggle = event.target.closest(SELECTORS.calendarExpandToggle);
if (!toggle) return;
form.requestSubmit();
event.preventDefault();
const main = toggle.closest('main');
if (!main) return;
const isExpanded = main.classList.toggle('expanded');
toggle.setAttribute('aria-pressed', isExpanded ? 'true' : 'false');
});
/**
@ -71,9 +90,9 @@ function initColorPickers(root = document) {
if (el.__colorpickerWired) return;
el.__colorpickerWired = true;
const color = el.querySelector('[data-colorpicker-color]');
const hex = el.querySelector('[data-colorpicker-hex]');
const btn = el.querySelector('[data-colorpicker-random]');
const color = el.querySelector(SELECTORS.colorPickerColor);
const hex = el.querySelector(SELECTORS.colorPickerHex);
const btn = el.querySelector(SELECTORS.colorPickerRandom);
if (!color || !hex) return;
@ -137,11 +156,15 @@ function initColorPickers(root = document) {
}
};
root.querySelectorAll('[data-colorpicker]').forEach(wire);
root.querySelectorAll(SELECTORS.colorPicker).forEach(wire);
}
function initUI() {
initColorPickers();
}
// initial bind
document.addEventListener('DOMContentLoaded', () => initColorPickers());
document.addEventListener('DOMContentLoaded', initUI);
// rebind in htmx for swapped content
document.addEventListener('htmx:afterSwap', (e) => {

View File

@ -85,6 +85,14 @@
@if(!empty($header['span']))
<span>{{ $header['span'] }}</span>
@endif
<button
type="button"
class="button button--icon button--sm calendar-expand-toggle"
data-calendar-expand
aria-label="{{ __('calendar.toggle_sidebar') }}"
>
<x-icon-chevron-left />
</button>
</h2>
<menu>
<li>