feat(planner): collapse the three export buttons into one dialog

PDF, ICS and GPX each had their own button in the day-plan toolbar, and two of
them carried a hover menu of their own. That is five controls' worth of width in
a pane the user can drag narrower, so the exports were the first thing pushed off
the edge, and a hover menu is not reachable at all once its button is gone.

One button opens a dialog instead: the day plan as a PDF, the bookings as a
calendar (a one-off .ics or a live subscription) and the map data as GPX in the
three scopes a device wants. Every row reports that it is working, which the PDF
export needed most: it fetches a 226 kB builder before it renders anything, and
until now the toolbar button simply sat there.

Two strings the old ICS menu had hardcoded in English, the download and the
subscription, come from the locale files the phone export sheet already used.

The toolbar no longer needs the icsHover flag it only held to keep its menu open,
so that comes out of the sidebar's state as well.
This commit is contained in:
Maurice
2026-08-14 09:41:13 +02:00
committed by Maurice
parent 974c240043
commit 97c725ea14
29 changed files with 684 additions and 476 deletions
+5
View File
@@ -67,6 +67,11 @@ const dayplan: TranslationStrings = {
'dayplan.pdfError': 'فشل تصدير PDF',
'dayplan.expandAll': 'Expand all days', // en-fallback
'dayplan.collapseAll': 'Collapse all days', // en-fallback
'dayplan.export': 'تصدير',
'dayplan.exportIntro': 'خذ خطتك معك: كمستند أو في تقويمك أو على جهاز GPS.',
'dayplan.exportDocument': 'مستند',
'dayplan.exportCalendar': 'التقويم',
'dayplan.exportMaps': 'الخرائط وGPS',
'dayplan.pdf': 'PDF', // en-fallback
'dayplan.mobile.addPlace': 'Add Place', // en-fallback
'dayplan.mobile.searchPlaces': 'Search places...', // en-fallback
+5
View File
@@ -49,6 +49,11 @@ const dayplan: TranslationStrings = {
'dayplan.toast.noGeoPlaces': 'Nenhum lugar com coordenadas para calcular a rota',
'dayplan.confirmed': 'Confirmada',
'dayplan.pendingRes': 'Pendente',
'dayplan.export': 'Exportar',
'dayplan.exportIntro': 'Leve seu plano com você: como documento, no calendário ou no GPS.',
'dayplan.exportDocument': 'Documento',
'dayplan.exportCalendar': 'Calendário',
'dayplan.exportMaps': 'Mapas e GPS',
'dayplan.pdf': 'PDF',
'dayplan.pdfTooltip': 'Exportar plano do dia em PDF',
'dayplan.gpxTooltip': 'Exportar como GPX para mapas offline e aparelhos de GPS',
+5
View File
@@ -49,6 +49,11 @@ const dayplan: TranslationStrings = {
'dayplan.toast.noGeoPlaces': "No s'han trobat llocs amb coordenades per calcular la ruta",
'dayplan.confirmed': 'Confirmat',
'dayplan.pendingRes': 'Pendent',
'dayplan.export': 'Exporta',
'dayplan.exportIntro': "Emporta't el pla: com a document, al calendari o al GPS.",
'dayplan.exportDocument': 'Document',
'dayplan.exportCalendar': 'Calendari',
'dayplan.exportMaps': 'Mapes i GPS',
'dayplan.pdf': 'PDF',
'dayplan.pdfTooltip': 'Exporta el pla diari com a PDF',
'dayplan.gpxTooltip': 'Exporta com a GPX per a mapes fora de línia i dispositius GPS',
+5
View File
@@ -49,6 +49,11 @@ const dayplan: TranslationStrings = {
'dayplan.toast.noGeoPlaces': 'Nebyla nalezena žádná místa se souřadnicemi pro výpočet trasy',
'dayplan.confirmed': 'Potvrzeno',
'dayplan.pendingRes': 'Čeká na potvrzení',
'dayplan.export': 'Exportovat',
'dayplan.exportIntro': 'Vezmi si plán s sebou: jako dokument, do kalendáře nebo do GPS.',
'dayplan.exportDocument': 'Dokument',
'dayplan.exportCalendar': 'Kalendář',
'dayplan.exportMaps': 'Mapy a GPS',
'dayplan.pdf': 'PDF',
'dayplan.pdfTooltip': 'Exportovat denní plán do PDF',
'dayplan.gpxTooltip': 'Exportovat jako GPX pro offline mapy a GPS zařízení',
+5
View File
@@ -60,6 +60,11 @@ const dayplan: TranslationStrings = {
'dayplan.toast.noGeoPlaces': 'Keine Orte mit Koordinaten für Routenberechnung gefunden',
'dayplan.confirmed': 'Bestätigt',
'dayplan.pendingRes': 'Ausstehend',
'dayplan.export': 'Exportieren',
'dayplan.exportIntro': 'Nimm deinen Plan mit: als Dokument, im Kalender oder auf dem GPS.',
'dayplan.exportDocument': 'Dokument',
'dayplan.exportCalendar': 'Kalender',
'dayplan.exportMaps': 'Karten & GPS',
'dayplan.pdf': 'PDF',
'dayplan.pdfTooltip': 'Tagesplan als PDF exportieren',
'dayplan.gpxTooltip': 'Als GPX für Offline-Karten und GPS-Geräte exportieren',
+5
View File
@@ -60,6 +60,11 @@ const dayplan: TranslationStrings = {
'dayplan.toast.noGeoPlaces': 'No places with coordinates found for route calculation',
'dayplan.confirmed': 'Confirmed',
'dayplan.pendingRes': 'Pending',
'dayplan.export': 'Export',
'dayplan.exportIntro': 'Take your plan with you: as a document, in your calendar or on your GPS.',
'dayplan.exportDocument': 'Document',
'dayplan.exportCalendar': 'Calendar',
'dayplan.exportMaps': 'Maps & GPS',
'dayplan.pdf': 'PDF',
'dayplan.pdfTooltip': 'Export day plan as PDF',
'dayplan.gpxTooltip': 'Export as GPX for offline maps and GPS devices',
+5
View File
@@ -49,6 +49,11 @@ const dayplan: TranslationStrings = {
'dayplan.toast.noGeoPlaces': 'No se encontraron lugares con coordenadas para calcular la ruta',
'dayplan.confirmed': 'Confirmado',
'dayplan.pendingRes': 'Pendiente',
'dayplan.export': 'Exportar',
'dayplan.exportIntro': 'Llévate tu plan: como documento, en el calendario o en el GPS.',
'dayplan.exportDocument': 'Documento',
'dayplan.exportCalendar': 'Calendario',
'dayplan.exportMaps': 'Mapas y GPS',
'dayplan.pdf': 'PDF',
'dayplan.pdfTooltip': 'Exportar plan diario como PDF',
'dayplan.gpxTooltip': 'Exportar como GPX para mapas sin conexión y dispositivos GPS',
+5
View File
@@ -49,6 +49,11 @@ const dayplan: TranslationStrings = {
'dayplan.toast.noGeoPlaces': "Aucun lieu avec des coordonnées trouvé pour le calcul d'itinéraire",
'dayplan.confirmed': 'Confirmé',
'dayplan.pendingRes': 'En attente',
'dayplan.export': 'Exporter',
'dayplan.exportIntro': 'Emportez votre plan : en document, dans votre agenda ou sur votre GPS.',
'dayplan.exportDocument': 'Document',
'dayplan.exportCalendar': 'Agenda',
'dayplan.exportMaps': 'Cartes et GPS',
'dayplan.pdf': 'PDF',
'dayplan.pdfTooltip': 'Exporter le plan du jour en PDF',
'dayplan.gpxTooltip': 'Exporter en GPX pour les cartes hors ligne et les GPS',
+5
View File
@@ -60,6 +60,11 @@ const dayplan: TranslationStrings = {
'dayplan.toast.noGeoPlaces': 'Δεν βρέθηκαν μέρη με συντεταγμένες για τον υπολογισμό διαδρομής',
'dayplan.confirmed': 'Επιβεβαιωμένο',
'dayplan.pendingRes': 'Εκκρεμές',
'dayplan.export': 'Εξαγωγή',
'dayplan.exportIntro': 'Πάρε το πλάνο σου μαζί: ως έγγραφο, στο ημερολόγιο ή στο GPS.',
'dayplan.exportDocument': 'Έγγραφο',
'dayplan.exportCalendar': 'Ημερολόγιο',
'dayplan.exportMaps': 'Χάρτες και GPS',
'dayplan.pdf': 'PDF',
'dayplan.pdfTooltip': 'Εξαγωγή ημερήσιου πλάνου ως PDF',
'dayplan.gpxTooltip': 'Εξαγωγή ως GPX για χάρτες εκτός σύνδεσης και συσκευές GPS',
+5
View File
@@ -49,6 +49,11 @@ const dayplan: TranslationStrings = {
'dayplan.toast.noGeoPlaces': 'Nem találhatók koordinátákkal rendelkező helyek az útvonalszámításhoz',
'dayplan.confirmed': 'Megerősítve',
'dayplan.pendingRes': 'Függőben',
'dayplan.export': 'Exportálás',
'dayplan.exportIntro': 'Vidd magaddal a tervet: dokumentumként, a naptáradban vagy a GPS-eden.',
'dayplan.exportDocument': 'Dokumentum',
'dayplan.exportCalendar': 'Naptár',
'dayplan.exportMaps': 'Térképek és GPS',
'dayplan.pdf': 'PDF',
'dayplan.pdfTooltip': 'Napi terv exportálása PDF-be',
'dayplan.gpxTooltip': 'Exportálás GPX-ként offline térképekhez és GPS-eszközökhöz',
+5
View File
@@ -58,6 +58,11 @@ const dayplan: TranslationStrings = {
'dayplan.toast.noGeoPlaces': 'Tidak ditemukan tempat dengan koordinat untuk kalkulasi rute',
'dayplan.confirmed': 'Dikonfirmasi',
'dayplan.pendingRes': 'Menunggu',
'dayplan.export': 'Ekspor',
'dayplan.exportIntro': 'Bawa rencanamu: sebagai dokumen, di kalender, atau di GPS.',
'dayplan.exportDocument': 'Dokumen',
'dayplan.exportCalendar': 'Kalender',
'dayplan.exportMaps': 'Peta & GPS',
'dayplan.pdf': 'PDF',
'dayplan.pdfTooltip': 'Ekspor rencana hari sebagai PDF',
'dayplan.gpxTooltip': 'Ekspor sebagai GPX untuk peta offline dan perangkat GPS',
+5
View File
@@ -49,6 +49,11 @@ const dayplan: TranslationStrings = {
'dayplan.toast.noGeoPlaces': 'Nessun luogo con coordinate trovato per il calcolo del percorso',
'dayplan.confirmed': 'Confermata',
'dayplan.pendingRes': 'In attesa',
'dayplan.export': 'Esporta',
'dayplan.exportIntro': 'Porta con te il tuo piano: come documento, nel calendario o sul GPS.',
'dayplan.exportDocument': 'Documento',
'dayplan.exportCalendar': 'Calendario',
'dayplan.exportMaps': 'Mappe e GPS',
'dayplan.pdf': 'PDF',
'dayplan.pdfTooltip': 'Esporta il programma del giorno come PDF',
'dayplan.gpxTooltip': 'Esporta in GPX per mappe offline e dispositivi GPS',
+5
View File
@@ -60,6 +60,11 @@ const dayplan: TranslationStrings = {
'dayplan.toast.noGeoPlaces': '座標付きの場所がありません',
'dayplan.confirmed': '確定',
'dayplan.pendingRes': '保留',
'dayplan.export': 'エクスポート',
'dayplan.exportIntro': '旅程を持ち歩けます。書類として、カレンダーに、GPS 機器に。',
'dayplan.exportDocument': '書類',
'dayplan.exportCalendar': 'カレンダー',
'dayplan.exportMaps': '地図と GPS',
'dayplan.pdf': 'PDF',
'dayplan.pdfTooltip': '日別計画をPDFで書き出し',
'dayplan.gpxTooltip': 'オフライン地図やGPS機器向けにGPXで書き出す',
+5
View File
@@ -60,6 +60,11 @@ const dayplan: TranslationStrings = {
'dayplan.toast.noGeoPlaces': '경로 계산을 위한 좌표가 있는 장소가 없습니다',
'dayplan.confirmed': '확정됨',
'dayplan.pendingRes': '대기 중',
'dayplan.export': '내보내기',
'dayplan.exportIntro': '일정을 가지고 다니세요. 문서로, 캘린더에, GPS 기기에.',
'dayplan.exportDocument': '문서',
'dayplan.exportCalendar': '캘린더',
'dayplan.exportMaps': '지도 및 GPS',
'dayplan.pdf': 'PDF',
'dayplan.pdfTooltip': '일별 계획을 PDF로 내보내기',
'dayplan.gpxTooltip': '오프라인 지도와 GPS 기기용 GPX로 내보내기',
+5
View File
@@ -49,6 +49,11 @@ const dayplan: TranslationStrings = {
'dayplan.toast.noGeoPlaces': 'Geen plaatsen met coördinaten gevonden voor routeberekening',
'dayplan.confirmed': 'Bevestigd',
'dayplan.pendingRes': 'In behandeling',
'dayplan.export': 'Exporteren',
'dayplan.exportIntro': 'Neem je plan mee: als document, in je agenda of op je gps.',
'dayplan.exportDocument': 'Document',
'dayplan.exportCalendar': 'Agenda',
'dayplan.exportMaps': 'Kaarten en gps',
'dayplan.pdf': 'PDF',
'dayplan.pdfTooltip': 'Dagplan exporteren als PDF',
'dayplan.gpxTooltip': 'Exporteren als GPX voor offline kaarten en gps-apparaten',
+5
View File
@@ -59,6 +59,11 @@ const dayplan: TranslationStrings = {
'dayplan.toast.noGeoPlaces': 'Nie znaleziono miejsc ze współrzędnymi do obliczenia trasy',
'dayplan.confirmed': 'Potwierdzono',
'dayplan.pendingRes': 'Oczekujące',
'dayplan.export': 'Eksportuj',
'dayplan.exportIntro': 'Zabierz plan ze sobą: jako dokument, do kalendarza albo na GPS.',
'dayplan.exportDocument': 'Dokument',
'dayplan.exportCalendar': 'Kalendarz',
'dayplan.exportMaps': 'Mapy i GPS',
'dayplan.pdf': 'PDF',
'dayplan.pdfTooltip': 'Eksportuj plan dnia jako PDF',
'dayplan.gpxTooltip': 'Eksportuj jako GPX do map offline i urządzeń GPS',
+5
View File
@@ -49,6 +49,11 @@ const dayplan: TranslationStrings = {
'dayplan.toast.noGeoPlaces': 'Не найдено мест с координатами для расчёта маршрута',
'dayplan.confirmed': 'Подтверждено',
'dayplan.pendingRes': 'Ожидание',
'dayplan.export': 'Экспорт',
'dayplan.exportIntro': 'Возьмите план с собой: документом, в календарь или на GPS.',
'dayplan.exportDocument': 'Документ',
'dayplan.exportCalendar': 'Календарь',
'dayplan.exportMaps': 'Карты и GPS',
'dayplan.pdf': 'PDF',
'dayplan.pdfTooltip': 'Экспортировать план дня в PDF',
'dayplan.gpxTooltip': 'Экспорт в GPX для офлайн-карт и GPS-устройств',
+5
View File
@@ -61,6 +61,11 @@ const dayplan: TranslationStrings = {
'dayplan.toast.noGeoPlaces': 'Inga platser med koordinater hittades för ruttberäkningen',
'dayplan.confirmed': 'Bekräftat',
'dayplan.pendingRes': 'Pendlande',
'dayplan.export': 'Exportera',
'dayplan.exportIntro': 'Ta med dig planen: som dokument, i kalendern eller på GPS:en.',
'dayplan.exportDocument': 'Dokument',
'dayplan.exportCalendar': 'Kalender',
'dayplan.exportMaps': 'Kartor och GPS',
'dayplan.pdf': 'PDF',
'dayplan.pdfTooltip': 'Exportera dagsplanen som PDF',
'dayplan.gpxTooltip': 'Exportera som GPX för offlinekartor och GPS-enheter',
+5
View File
@@ -60,6 +60,11 @@ const dayplan: TranslationStrings = {
'dayplan.toast.noGeoPlaces': 'Rota için koordinatlı yer bulunamadı',
'dayplan.confirmed': 'Onaylandı',
'dayplan.pendingRes': 'Beklemede',
'dayplan.export': 'Dışa aktar',
'dayplan.exportIntro': 'Planını yanında taşı: belge olarak, takviminde ya da GPS cihazında.',
'dayplan.exportDocument': 'Belge',
'dayplan.exportCalendar': 'Takvim',
'dayplan.exportMaps': 'Haritalar ve GPS',
'dayplan.pdf': "PDF'ler",
'dayplan.pdfTooltip': 'Gün planını PDF olarak dışa aktar',
'dayplan.gpxTooltip': 'Çevrimdışı haritalar ve GPS cihazları için GPX olarak dışa aktar',
+5
View File
@@ -51,6 +51,11 @@ const dayplan: TranslationStrings = {
'dayplan.toast.noGeoPlaces': 'Не знайдено місць з координатами для розрахунку маршруту',
'dayplan.confirmed': 'Подтверждено',
'dayplan.pendingRes': 'Ожидание',
'dayplan.export': 'Експорт',
'dayplan.exportIntro': 'Візьміть план із собою: документом, у календар або на GPS.',
'dayplan.exportDocument': 'Документ',
'dayplan.exportCalendar': 'Календар',
'dayplan.exportMaps': 'Карти та GPS',
'dayplan.pdf': 'PDF',
'dayplan.pdfTooltip': 'Експортувати план дня в PDF',
'dayplan.gpxTooltip': 'Експорт у GPX для офлайн-карт і GPS-пристроїв',
+5
View File
@@ -60,6 +60,11 @@ const dayplan: TranslationStrings = {
'dayplan.toast.noGeoPlaces': 'Không tìm thấy địa điểm nào có tọa độ để tính toán tuyến đường',
'dayplan.confirmed': 'Đã xác nhận',
'dayplan.pendingRes': 'Chưa giải quyết',
'dayplan.export': 'Xuất',
'dayplan.exportIntro': 'Mang kế hoạch theo bên mình: dưới dạng tài liệu, trong lịch hoặc trên GPS.',
'dayplan.exportDocument': 'Tài liệu',
'dayplan.exportCalendar': 'Lịch',
'dayplan.exportMaps': 'Bản đồ và GPS',
'dayplan.pdf': 'PDF',
'dayplan.pdfTooltip': 'Kế hoạch ngày xuất dưới dạng PDF',
'dayplan.gpxTooltip': 'Xuất ra GPX cho bản đồ ngoại tuyến và thiết bị GPS',
+5
View File
@@ -49,6 +49,11 @@ const dayplan: TranslationStrings = {
'dayplan.toast.noGeoPlaces': '未找到有座標的地點用於路線計算',
'dayplan.confirmed': '已確認',
'dayplan.pendingRes': '待確認',
'dayplan.export': '匯出',
'dayplan.exportIntro': '把行程帶在身邊:作為文件、放進行事曆,或存到 GPS 裝置。',
'dayplan.exportDocument': '文件',
'dayplan.exportCalendar': '行事曆',
'dayplan.exportMaps': '地圖與 GPS',
'dayplan.pdf': 'PDF',
'dayplan.pdfTooltip': '匯出當天計劃為 PDF',
'dayplan.gpxTooltip': '匯出為 GPX,用於離線地圖和 GPS 裝置',
+5
View File
@@ -49,6 +49,11 @@ const dayplan: TranslationStrings = {
'dayplan.toast.noGeoPlaces': '未找到有坐标的地点用于路线计算',
'dayplan.confirmed': '已确认',
'dayplan.pendingRes': '待确认',
'dayplan.export': '导出',
'dayplan.exportIntro': '把行程带在身边:作为文档、放进日历,或存到 GPS 设备。',
'dayplan.exportDocument': '文档',
'dayplan.exportCalendar': '日历',
'dayplan.exportMaps': '地图与 GPS',
'dayplan.pdf': 'PDF',
'dayplan.pdfTooltip': '导出当天计划为 PDF',
'dayplan.gpxTooltip': '导出为 GPX,用于离线地图和 GPS 设备',