Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| f12b9b2a1a | |||
| 34914b4f19 | |||
| d9fa8c0edf | |||
| adf02acd45 | |||
| 3992db9d61 |
+66
-2
@@ -2433,6 +2433,32 @@ html.scheme-dark .themed-select-option.is-selected {
|
||||
.track-map-container {
|
||||
height: min(360px, 45svh);
|
||||
}
|
||||
|
||||
.sails-picker-pills {
|
||||
gap: 4px;
|
||||
}
|
||||
|
||||
.sails-picker-container.is-collapsible .sails-picker-toggle {
|
||||
display: inline-flex;
|
||||
}
|
||||
|
||||
.sail-pill {
|
||||
padding: 3px 8px;
|
||||
font-size: 11px;
|
||||
border-radius: 12px;
|
||||
line-height: 1.2;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 480px) {
|
||||
.sails-picker-container.is-collapsible.is-collapsed .sails-picker-pills {
|
||||
max-height: 3.25rem;
|
||||
}
|
||||
|
||||
.sail-pill {
|
||||
padding: 2px 7px;
|
||||
font-size: 10px;
|
||||
}
|
||||
}
|
||||
|
||||
/* ========================================== */
|
||||
@@ -2696,13 +2722,48 @@ html.theme-cupertino .events-scroll-container {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 8px;
|
||||
margin-top: 8px;
|
||||
grid-column: 1 / -1;
|
||||
margin-top: -4px;
|
||||
}
|
||||
|
||||
.sails-picker-pills {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 6px;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.sails-picker-container.is-collapsible.is-collapsed .sails-picker-pills {
|
||||
max-height: 3.75rem;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.sails-picker-container.is-collapsible.is-collapsed .sails-picker-pills::after {
|
||||
content: '';
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
height: 1.25rem;
|
||||
background: linear-gradient(to bottom, transparent, var(--app-surface, #0f172a));
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.sails-picker-toggle {
|
||||
display: none;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
margin: 4px auto 0;
|
||||
padding: 2px 8px;
|
||||
background: none;
|
||||
border: none;
|
||||
color: var(--app-text-muted, #94a3b8);
|
||||
font-size: 12px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.sails-picker-toggle:hover {
|
||||
color: var(--app-accent, #fbbf24);
|
||||
}
|
||||
|
||||
.sail-pill {
|
||||
@@ -2715,6 +2776,7 @@ html.theme-cupertino .events-scroll-container {
|
||||
cursor: pointer;
|
||||
user-select: none;
|
||||
transition: all 0.2s ease;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.sail-pill:hover {
|
||||
@@ -2742,7 +2804,9 @@ html.theme-cupertino .events-scroll-container {
|
||||
background: rgba(56, 189, 248, 0.15);
|
||||
border-color: #38bdf8;
|
||||
color: #38bdf8;
|
||||
}.grid-span-2 {
|
||||
}
|
||||
|
||||
.grid-span-2 {
|
||||
grid-column: span 2;
|
||||
}
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ import { getLogbookKey } from '../services/logbookKeys.js'
|
||||
import { encryptJson, decryptJson } from '../services/crypto.js'
|
||||
import { syncLogbook } from '../services/sync.js'
|
||||
import { downloadLogbookPagePdf } from '../services/pdfExport.js'
|
||||
import { FileText, Save, ChevronLeft, Check, Compass, Plus, Trash2, MapPin, CloudSun, Clock, Download, Upload, Pencil, X } from 'lucide-react'
|
||||
import { FileText, Save, ChevronLeft, Check, Compass, Plus, Trash2, MapPin, CloudSun, Clock, Download, Upload, Pencil, X, ChevronDown, ChevronUp } from 'lucide-react'
|
||||
import PhotoCapture from './PhotoCapture.tsx'
|
||||
import SignatureSection from './SignatureSection.tsx'
|
||||
import TrackMap from './TrackMap.tsx'
|
||||
@@ -176,6 +176,7 @@ export default function LogEntryEditor({
|
||||
const [evCurrent, setEvCurrent] = useState('')
|
||||
const [evHeel, setEvHeel] = useState('')
|
||||
const [evSailsOrMotor, setEvSailsOrMotor] = useState('')
|
||||
const [sailsPickerExpanded, setSailsPickerExpanded] = useState(false)
|
||||
const [evLogReading, setEvLogReading] = useState('')
|
||||
const [evDistance, setEvDistance] = useState('')
|
||||
const [evGpsLat, setEvGpsLat] = useState('')
|
||||
@@ -842,6 +843,9 @@ export default function LogEntryEditor({
|
||||
? ['Großsegel', 'Genua', 'Fock', 'Spinnaker', 'Gennaker']
|
||||
: ['Mainsail', 'Genoa', 'Jib', 'Spinnaker', 'Gennaker']
|
||||
|
||||
const eventSailOptions = yachtSails.length > 0 ? yachtSails : defaultSails
|
||||
const showSailsPickerToggle = eventSailOptions.length + 1 > 6
|
||||
|
||||
const toggleSailOrMotor = (item: string) => {
|
||||
let currentItems = evSailsOrMotor
|
||||
.split(/\s*(?:\+|\bplus\b|,)\s*/i)
|
||||
@@ -865,6 +869,15 @@ export default function LogEntryEditor({
|
||||
return currentItems.includes(item.toLowerCase())
|
||||
}
|
||||
|
||||
const motorPropulsionLabel = t('logs.motor_propulsion')
|
||||
const sortedEventSailOptions = [...eventSailOptions].sort((a, b) => {
|
||||
const aActive = isItemActive(a)
|
||||
const bActive = isItemActive(b)
|
||||
if (aActive === bActive) return 0
|
||||
return aActive ? -1 : 1
|
||||
})
|
||||
const isMotorActive = isItemActive(motorPropulsionLabel)
|
||||
|
||||
const clearEventForm = () => {
|
||||
setEvTime(currentLocalTimeHHMM())
|
||||
setEvMgk('')
|
||||
@@ -884,6 +897,7 @@ export default function LogEntryEditor({
|
||||
setEvRemarks('')
|
||||
setEvLocationName('')
|
||||
setEditingEventIndex(null)
|
||||
setSailsPickerExpanded(false)
|
||||
}
|
||||
|
||||
const fillEventForm = (ev: LogEvent) => {
|
||||
@@ -1559,25 +1573,6 @@ export default function LogEntryEditor({
|
||||
onChange={(e) => setEvSailsOrMotor(e.target.value)}
|
||||
disabled={saving}
|
||||
/>
|
||||
<div className="sails-picker-container">
|
||||
<div className="sails-picker-pills">
|
||||
{(yachtSails.length > 0 ? yachtSails : defaultSails).map((sail) => (
|
||||
<span
|
||||
key={sail}
|
||||
className={`sail-pill ${isItemActive(sail) ? 'active' : ''}`}
|
||||
onClick={() => toggleSailOrMotor(sail)}
|
||||
>
|
||||
{sail}
|
||||
</span>
|
||||
))}
|
||||
<span
|
||||
className={`sail-pill motor-pill ${isItemActive(t('logs.motor_propulsion')) ? 'active' : ''}`}
|
||||
onClick={() => toggleSailOrMotor(t('logs.motor_propulsion'))}
|
||||
>
|
||||
{t('logs.motor_propulsion')}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="input-group">
|
||||
@@ -1592,7 +1587,63 @@ export default function LogEntryEditor({
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div className="input-group" style={{ gridColumn: 'span 2' }}>
|
||||
<div
|
||||
className={[
|
||||
'sails-picker-container grid-span-2',
|
||||
showSailsPickerToggle ? 'is-collapsible' : '',
|
||||
showSailsPickerToggle && !sailsPickerExpanded ? 'is-collapsed' : '',
|
||||
].filter(Boolean).join(' ')}
|
||||
>
|
||||
<div className="sails-picker-pills">
|
||||
{isMotorActive && (
|
||||
<span
|
||||
className={`sail-pill motor-pill active`}
|
||||
onClick={() => toggleSailOrMotor(motorPropulsionLabel)}
|
||||
>
|
||||
{motorPropulsionLabel}
|
||||
</span>
|
||||
)}
|
||||
{sortedEventSailOptions.map((sail) => (
|
||||
<span
|
||||
key={sail}
|
||||
className={`sail-pill ${isItemActive(sail) ? 'active' : ''}`}
|
||||
onClick={() => toggleSailOrMotor(sail)}
|
||||
>
|
||||
{sail}
|
||||
</span>
|
||||
))}
|
||||
{!isMotorActive && (
|
||||
<span
|
||||
className="sail-pill motor-pill"
|
||||
onClick={() => toggleSailOrMotor(motorPropulsionLabel)}
|
||||
>
|
||||
{motorPropulsionLabel}
|
||||
</span>
|
||||
)}
|
||||
</div>
|
||||
{showSailsPickerToggle && (
|
||||
<button
|
||||
type="button"
|
||||
className="sails-picker-toggle"
|
||||
onClick={() => setSailsPickerExpanded((prev) => !prev)}
|
||||
aria-expanded={sailsPickerExpanded}
|
||||
>
|
||||
{sailsPickerExpanded ? (
|
||||
<>
|
||||
<ChevronUp size={14} aria-hidden="true" />
|
||||
{t('logs.sails_picker_show_less')}
|
||||
</>
|
||||
) : (
|
||||
<>
|
||||
<ChevronDown size={14} aria-hidden="true" />
|
||||
{t('logs.sails_picker_show_more')}
|
||||
</>
|
||||
)}
|
||||
</button>
|
||||
)}
|
||||
</div>
|
||||
|
||||
<div className="input-group grid-span-2">
|
||||
<label>{t('logs.event_remarks')}</label>
|
||||
<input
|
||||
type="text"
|
||||
|
||||
@@ -222,6 +222,8 @@
|
||||
"event_heel": "Krängung (°)",
|
||||
"event_sails": "Segelführung / Motor",
|
||||
"motor_propulsion": "Maschinenfahrt",
|
||||
"sails_picker_show_more": "Alle Segel anzeigen",
|
||||
"sails_picker_show_less": "Weniger anzeigen",
|
||||
"motor_hours": "Maschinenstunden (gesamt)",
|
||||
"fuel_per_motor_hour": "Verbrauch pro Maschinenstunde",
|
||||
"event_distance": "Distanz (sm)",
|
||||
|
||||
@@ -222,6 +222,8 @@
|
||||
"event_heel": "Heel Angle (°)",
|
||||
"event_sails": "Sails / Motor Status",
|
||||
"motor_propulsion": "Engine Propulsion",
|
||||
"sails_picker_show_more": "Show all sails",
|
||||
"sails_picker_show_less": "Show less",
|
||||
"motor_hours": "Engine hours (total)",
|
||||
"fuel_per_motor_hour": "Consumption per engine hour",
|
||||
"event_distance": "Distance (nm)",
|
||||
|
||||
Reference in New Issue
Block a user