2025-05-09 10:24:29 -04:00
|
|
|
|
<script lang="ts">
|
|
|
|
|
import type { Collection } from '$lib/types';
|
|
|
|
|
import TimezoneSelector from './TimezoneSelector.svelte';
|
|
|
|
|
import { t } from 'svelte-i18n';
|
|
|
|
|
export let collection: Collection | null = null;
|
|
|
|
|
import { updateLocalDate, updateUTCDate, validateDateRange, formatUTCDate } from '$lib/dateUtils';
|
|
|
|
|
import { onMount } from 'svelte';
|
|
|
|
|
import { isAllDay } from '$lib';
|
|
|
|
|
|
|
|
|
|
export let type: 'adventure' | 'transportation' | 'lodging' = 'adventure';
|
|
|
|
|
|
|
|
|
|
// Initialize with browser's timezone
|
2025-05-10 10:47:00 -04:00
|
|
|
|
let selectedStartTimezone: string = Intl.DateTimeFormat().resolvedOptions().timeZone;
|
|
|
|
|
let selectedEndTimezone: string = Intl.DateTimeFormat().resolvedOptions().timeZone;
|
2025-05-09 10:24:29 -04:00
|
|
|
|
|
|
|
|
|
let allDay: boolean = false;
|
|
|
|
|
|
|
|
|
|
// Store the UTC dates as source of truth
|
|
|
|
|
export let utcStartDate: string | null = null;
|
|
|
|
|
export let utcEndDate: string | null = null;
|
|
|
|
|
|
|
|
|
|
export let note: string | null = null;
|
|
|
|
|
type Visit = {
|
|
|
|
|
id: string;
|
|
|
|
|
start_date: string;
|
|
|
|
|
end_date: string;
|
|
|
|
|
notes: string;
|
2025-05-10 10:47:00 -04:00
|
|
|
|
start_timezone?: string;
|
|
|
|
|
end_timezone?: string;
|
2025-05-09 10:24:29 -04:00
|
|
|
|
};
|
|
|
|
|
export let visits: Visit[] | null = null;
|
|
|
|
|
|
|
|
|
|
// Local display values
|
|
|
|
|
let localStartDate: string = '';
|
|
|
|
|
let localEndDate: string = '';
|
|
|
|
|
|
|
|
|
|
let fullStartDate: string = '';
|
|
|
|
|
let fullEndDate: string = '';
|
|
|
|
|
|
|
|
|
|
let constrainDates: boolean = false;
|
|
|
|
|
|
|
|
|
|
let isEditing = false; // Disable reactivity when editing
|
|
|
|
|
|
|
|
|
|
onMount(async () => {
|
2025-05-10 10:47:00 -04:00
|
|
|
|
// Initialize UTC dates
|
2025-05-09 10:24:29 -04:00
|
|
|
|
localStartDate = updateLocalDate({
|
|
|
|
|
utcDate: utcStartDate,
|
2025-05-10 10:47:00 -04:00
|
|
|
|
timezone: selectedStartTimezone
|
2025-05-09 10:24:29 -04:00
|
|
|
|
}).localDate;
|
2025-05-10 10:47:00 -04:00
|
|
|
|
|
2025-05-09 10:24:29 -04:00
|
|
|
|
localEndDate = updateLocalDate({
|
|
|
|
|
utcDate: utcEndDate,
|
2025-05-10 10:47:00 -04:00
|
|
|
|
timezone: type === 'transportation' ? selectedEndTimezone : selectedStartTimezone
|
2025-05-09 10:24:29 -04:00
|
|
|
|
}).localDate;
|
|
|
|
|
});
|
|
|
|
|
|
2025-05-09 15:59:48 -04:00
|
|
|
|
// Set the full date range for constraining purposes
|
|
|
|
|
$: if (collection && collection.start_date && collection.end_date) {
|
2025-05-09 10:24:29 -04:00
|
|
|
|
fullStartDate = `${collection.start_date}T00:00`;
|
|
|
|
|
fullEndDate = `${collection.end_date}T23:59`;
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-09 15:59:48 -04:00
|
|
|
|
// Get constraint dates in the right format based on allDay setting
|
|
|
|
|
$: constraintStartDate = allDay
|
2025-05-09 23:33:58 -04:00
|
|
|
|
? fullStartDate && fullStartDate.includes('T')
|
2025-05-09 15:59:48 -04:00
|
|
|
|
? fullStartDate.split('T')[0]
|
|
|
|
|
: ''
|
2025-05-09 23:33:58 -04:00
|
|
|
|
: fullStartDate || '';
|
|
|
|
|
$: constraintEndDate = allDay
|
|
|
|
|
? fullEndDate && fullEndDate.includes('T')
|
|
|
|
|
? fullEndDate.split('T')[0]
|
|
|
|
|
: ''
|
|
|
|
|
: fullEndDate || '';
|
2025-05-09 15:59:48 -04:00
|
|
|
|
|
2025-05-09 10:24:29 -04:00
|
|
|
|
// Update local display dates whenever timezone or UTC dates change
|
|
|
|
|
$: if (!isEditing) {
|
|
|
|
|
if (allDay) {
|
|
|
|
|
localStartDate = utcStartDate?.substring(0, 10) ?? '';
|
|
|
|
|
localEndDate = utcEndDate?.substring(0, 10) ?? '';
|
|
|
|
|
} else {
|
|
|
|
|
const start = updateLocalDate({
|
|
|
|
|
utcDate: utcStartDate,
|
2025-05-10 10:47:00 -04:00
|
|
|
|
timezone: selectedStartTimezone
|
2025-05-09 10:24:29 -04:00
|
|
|
|
}).localDate;
|
|
|
|
|
|
|
|
|
|
const end = updateLocalDate({
|
|
|
|
|
utcDate: utcEndDate,
|
2025-05-10 10:47:00 -04:00
|
|
|
|
timezone: type === 'transportation' ? selectedEndTimezone : selectedStartTimezone
|
2025-05-09 10:24:29 -04:00
|
|
|
|
}).localDate;
|
|
|
|
|
|
|
|
|
|
localStartDate = start;
|
|
|
|
|
localEndDate = end;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Update UTC dates when local dates change
|
|
|
|
|
function handleLocalDateChange() {
|
|
|
|
|
utcStartDate = updateUTCDate({
|
|
|
|
|
localDate: localStartDate,
|
2025-05-10 10:47:00 -04:00
|
|
|
|
timezone: selectedStartTimezone,
|
2025-05-09 10:24:29 -04:00
|
|
|
|
allDay
|
|
|
|
|
}).utcDate;
|
|
|
|
|
|
|
|
|
|
utcEndDate = updateUTCDate({
|
|
|
|
|
localDate: localEndDate,
|
2025-05-10 10:47:00 -04:00
|
|
|
|
timezone: type === 'transportation' ? selectedEndTimezone : selectedStartTimezone,
|
2025-05-09 10:24:29 -04:00
|
|
|
|
allDay
|
|
|
|
|
}).utcDate;
|
|
|
|
|
}
|
2025-05-10 10:47:00 -04:00
|
|
|
|
|
|
|
|
|
// Create a visit object with appropriate timezone information
|
|
|
|
|
function createVisitObject() {
|
|
|
|
|
const newVisit: Visit = {
|
|
|
|
|
id: crypto.randomUUID(),
|
|
|
|
|
start_date: utcStartDate ?? '',
|
|
|
|
|
end_date: utcEndDate ?? utcStartDate ?? '',
|
|
|
|
|
notes: note ?? ''
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// For transportation, add timezone information
|
|
|
|
|
if (type === 'transportation') {
|
|
|
|
|
newVisit.start_timezone = selectedStartTimezone;
|
|
|
|
|
newVisit.end_timezone = selectedEndTimezone;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return newVisit;
|
|
|
|
|
}
|
2025-05-09 10:24:29 -04:00
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
<div class="collapse collapse-plus bg-base-200 mb-4 rounded-lg">
|
|
|
|
|
<input type="checkbox" />
|
|
|
|
|
<div class="collapse-title text-xl font-semibold">
|
|
|
|
|
{$t('adventures.date_information')}
|
|
|
|
|
</div>
|
2025-05-09 23:27:53 -04:00
|
|
|
|
<div class="collapse-content">
|
2025-05-10 10:47:00 -04:00
|
|
|
|
<!-- Timezone Selector Section -->
|
2025-05-09 23:27:53 -04:00
|
|
|
|
<div class="rounded-xl border border-base-300 bg-base-100 p-4 space-y-4 shadow-sm mb-4">
|
2025-05-09 15:59:48 -04:00
|
|
|
|
<!-- Group Header -->
|
|
|
|
|
<h3 class="text-md font-semibold">{$t('navbar.settings')}</h3>
|
|
|
|
|
|
2025-05-10 10:47:00 -04:00
|
|
|
|
{#if type === 'transportation'}
|
|
|
|
|
<!-- Dual timezone selectors for transportation -->
|
|
|
|
|
<div class="space-y-4">
|
|
|
|
|
<div>
|
|
|
|
|
<label class="text-sm font-medium block mb-1">
|
|
|
|
|
{$t('adventures.departure_timezone')}
|
|
|
|
|
</label>
|
|
|
|
|
<TimezoneSelector bind:selectedTimezone={selectedStartTimezone} />
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<div>
|
|
|
|
|
<label class="text-sm font-medium block mb-1">
|
|
|
|
|
{$t('adventures.arrival_timezone')}
|
|
|
|
|
</label>
|
|
|
|
|
<TimezoneSelector bind:selectedTimezone={selectedEndTimezone} />
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
{:else}
|
|
|
|
|
<!-- Single timezone selector for other types -->
|
|
|
|
|
<TimezoneSelector bind:selectedTimezone={selectedStartTimezone} />
|
|
|
|
|
{/if}
|
2025-05-09 23:27:53 -04:00
|
|
|
|
|
2025-05-09 15:59:48 -04:00
|
|
|
|
<!-- All Day Toggle -->
|
|
|
|
|
<div class="flex justify-between items-center">
|
|
|
|
|
<span class="text-sm">{$t('adventures.all_day')}</span>
|
|
|
|
|
<input
|
|
|
|
|
type="checkbox"
|
|
|
|
|
class="toggle toggle-primary"
|
|
|
|
|
id="all_day"
|
|
|
|
|
name="all_day"
|
|
|
|
|
bind:checked={allDay}
|
|
|
|
|
on:change={() => {
|
|
|
|
|
if (allDay) {
|
|
|
|
|
localStartDate = localStartDate.split('T')[0];
|
|
|
|
|
localEndDate = localEndDate.split('T')[0];
|
|
|
|
|
} else {
|
|
|
|
|
localStartDate = localStartDate + 'T00:00';
|
|
|
|
|
localEndDate = localEndDate + 'T23:59';
|
|
|
|
|
}
|
|
|
|
|
utcStartDate = updateUTCDate({
|
|
|
|
|
localDate: localStartDate,
|
2025-05-10 10:47:00 -04:00
|
|
|
|
timezone: selectedStartTimezone,
|
2025-05-09 15:59:48 -04:00
|
|
|
|
allDay
|
|
|
|
|
}).utcDate;
|
|
|
|
|
utcEndDate = updateUTCDate({
|
|
|
|
|
localDate: localEndDate,
|
2025-05-10 10:47:00 -04:00
|
|
|
|
timezone: type === 'transportation' ? selectedEndTimezone : selectedStartTimezone,
|
2025-05-09 15:59:48 -04:00
|
|
|
|
allDay
|
|
|
|
|
}).utcDate;
|
|
|
|
|
localStartDate = updateLocalDate({
|
|
|
|
|
utcDate: utcStartDate,
|
2025-05-10 10:47:00 -04:00
|
|
|
|
timezone: selectedStartTimezone
|
2025-05-09 15:59:48 -04:00
|
|
|
|
}).localDate;
|
|
|
|
|
localEndDate = updateLocalDate({
|
|
|
|
|
utcDate: utcEndDate,
|
2025-05-10 10:47:00 -04:00
|
|
|
|
timezone: type === 'transportation' ? selectedEndTimezone : selectedStartTimezone
|
2025-05-09 15:59:48 -04:00
|
|
|
|
}).localDate;
|
|
|
|
|
}}
|
|
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<!-- Constrain Dates Toggle -->
|
|
|
|
|
{#if collection?.start_date && collection?.end_date}
|
|
|
|
|
<div class="flex justify-between items-center">
|
|
|
|
|
<span class="text-sm">{$t('adventures.date_constrain')}</span>
|
|
|
|
|
<input
|
|
|
|
|
type="checkbox"
|
|
|
|
|
id="constrain_dates"
|
|
|
|
|
name="constrain_dates"
|
|
|
|
|
class="toggle toggle-primary"
|
|
|
|
|
on:change={() => (constrainDates = !constrainDates)}
|
|
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
{/if}
|
|
|
|
|
</div>
|
2025-05-09 10:24:29 -04:00
|
|
|
|
|
|
|
|
|
<!-- Dates Input Section -->
|
|
|
|
|
<div class="grid grid-cols-1 md:grid-cols-2 gap-6">
|
|
|
|
|
<!-- Start Date -->
|
2025-05-09 15:59:48 -04:00
|
|
|
|
<div class="space-y-2">
|
|
|
|
|
<label for="date" class="text-sm font-medium">
|
2025-05-10 10:47:00 -04:00
|
|
|
|
{type === 'transportation'
|
|
|
|
|
? $t('adventures.departure_date')
|
|
|
|
|
: $t('adventures.start_date')}
|
2025-05-09 10:24:29 -04:00
|
|
|
|
</label>
|
|
|
|
|
|
|
|
|
|
{#if allDay}
|
|
|
|
|
<input
|
|
|
|
|
type="date"
|
|
|
|
|
id="date"
|
|
|
|
|
name="date"
|
|
|
|
|
bind:value={localStartDate}
|
|
|
|
|
on:change={handleLocalDateChange}
|
2025-05-09 15:59:48 -04:00
|
|
|
|
min={constrainDates ? constraintStartDate : ''}
|
|
|
|
|
max={constrainDates ? constraintEndDate : ''}
|
2025-05-09 10:24:29 -04:00
|
|
|
|
class="input input-bordered w-full"
|
|
|
|
|
/>
|
|
|
|
|
{:else}
|
|
|
|
|
<input
|
|
|
|
|
type="datetime-local"
|
|
|
|
|
id="date"
|
|
|
|
|
name="date"
|
|
|
|
|
bind:value={localStartDate}
|
|
|
|
|
on:change={handleLocalDateChange}
|
2025-05-09 15:59:48 -04:00
|
|
|
|
min={constrainDates ? constraintStartDate : ''}
|
|
|
|
|
max={constrainDates ? constraintEndDate : ''}
|
2025-05-09 10:24:29 -04:00
|
|
|
|
class="input input-bordered w-full"
|
|
|
|
|
/>
|
|
|
|
|
{/if}
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<!-- End Date -->
|
|
|
|
|
{#if localStartDate}
|
2025-05-09 15:59:48 -04:00
|
|
|
|
<div class="space-y-2">
|
|
|
|
|
<label for="end_date" class="text-sm font-medium">
|
2025-05-10 10:47:00 -04:00
|
|
|
|
{type === 'transportation' ? $t('adventures.arrival_date') : $t('adventures.end_date')}
|
2025-05-09 10:24:29 -04:00
|
|
|
|
</label>
|
|
|
|
|
|
|
|
|
|
{#if allDay}
|
|
|
|
|
<input
|
|
|
|
|
type="date"
|
|
|
|
|
id="end_date"
|
|
|
|
|
name="end_date"
|
|
|
|
|
bind:value={localEndDate}
|
|
|
|
|
on:change={handleLocalDateChange}
|
|
|
|
|
min={constrainDates ? localStartDate : ''}
|
2025-05-09 15:59:48 -04:00
|
|
|
|
max={constrainDates ? constraintEndDate : ''}
|
2025-05-09 10:24:29 -04:00
|
|
|
|
class="input input-bordered w-full"
|
|
|
|
|
/>
|
|
|
|
|
{:else}
|
|
|
|
|
<input
|
|
|
|
|
type="datetime-local"
|
|
|
|
|
id="end_date"
|
|
|
|
|
name="end_date"
|
|
|
|
|
bind:value={localEndDate}
|
|
|
|
|
on:change={handleLocalDateChange}
|
|
|
|
|
min={constrainDates ? localStartDate : ''}
|
2025-05-09 15:59:48 -04:00
|
|
|
|
max={constrainDates ? constraintEndDate : ''}
|
2025-05-09 10:24:29 -04:00
|
|
|
|
class="input input-bordered w-full"
|
|
|
|
|
/>
|
|
|
|
|
{/if}
|
|
|
|
|
</div>
|
|
|
|
|
{/if}
|
|
|
|
|
|
2025-05-09 15:59:48 -04:00
|
|
|
|
<!-- Notes (for adventures only) -->
|
2025-05-09 10:24:29 -04:00
|
|
|
|
{#if type === 'adventure'}
|
2025-05-09 15:59:48 -04:00
|
|
|
|
<div class="md:col-span-2">
|
|
|
|
|
<label for="note" class="text-sm font-medium block mb-1">
|
|
|
|
|
{$t('adventures.add_notes')}
|
|
|
|
|
</label>
|
2025-05-09 10:24:29 -04:00
|
|
|
|
<textarea
|
2025-05-09 15:59:48 -04:00
|
|
|
|
id="note"
|
|
|
|
|
name="note"
|
2025-05-09 10:24:29 -04:00
|
|
|
|
class="textarea textarea-bordered w-full"
|
|
|
|
|
placeholder={$t('adventures.add_notes')}
|
|
|
|
|
bind:value={note}
|
2025-05-09 15:59:48 -04:00
|
|
|
|
rows="4"
|
2025-05-09 10:24:29 -04:00
|
|
|
|
></textarea>
|
|
|
|
|
</div>
|
|
|
|
|
{/if}
|
|
|
|
|
{#if type === 'adventure'}
|
|
|
|
|
<button
|
2025-05-09 23:27:53 -04:00
|
|
|
|
class="btn btn-primary mb-2"
|
2025-05-09 10:24:29 -04:00
|
|
|
|
type="button"
|
|
|
|
|
on:click={() => {
|
2025-05-10 10:47:00 -04:00
|
|
|
|
const newVisit = createVisitObject();
|
2025-05-09 10:24:29 -04:00
|
|
|
|
|
|
|
|
|
// Ensure reactivity by assigning a *new* array
|
|
|
|
|
if (visits) {
|
|
|
|
|
visits = [...visits, newVisit];
|
|
|
|
|
} else {
|
|
|
|
|
visits = [newVisit];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Optionally clear the form
|
|
|
|
|
note = '';
|
|
|
|
|
localStartDate = '';
|
|
|
|
|
localEndDate = '';
|
|
|
|
|
utcStartDate = null;
|
|
|
|
|
utcEndDate = null;
|
|
|
|
|
}}
|
|
|
|
|
>
|
|
|
|
|
{$t('adventures.add')}
|
|
|
|
|
</button>
|
|
|
|
|
{/if}
|
|
|
|
|
</div>
|
2025-05-09 21:17:11 -04:00
|
|
|
|
|
|
|
|
|
<!-- Validation Message -->
|
|
|
|
|
{#if !validateDateRange(localStartDate, localEndDate).valid}
|
|
|
|
|
<div role="alert" class="alert alert-error">
|
|
|
|
|
<svg
|
|
|
|
|
xmlns="http://www.w3.org/2000/svg"
|
|
|
|
|
class="h-6 w-6 shrink-0 stroke-current"
|
|
|
|
|
fill="none"
|
|
|
|
|
viewBox="0 0 24 24"
|
|
|
|
|
>
|
|
|
|
|
<path
|
|
|
|
|
stroke-linecap="round"
|
|
|
|
|
stroke-linejoin="round"
|
|
|
|
|
stroke-width="2"
|
|
|
|
|
d="M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z"
|
|
|
|
|
/>
|
|
|
|
|
</svg>
|
|
|
|
|
<span>{$t('adventures.invalid_date_range')}</span>
|
|
|
|
|
</div>
|
|
|
|
|
{/if}
|
|
|
|
|
|
|
|
|
|
{#if type === 'adventure'}
|
2025-05-09 23:27:53 -04:00
|
|
|
|
<div class="border-t border-neutral pt-4 mb-2">
|
2025-05-09 21:17:11 -04:00
|
|
|
|
<h3 class="text-xl font-semibold">
|
|
|
|
|
{$t('adventures.visits')}
|
|
|
|
|
</h3>
|
|
|
|
|
|
|
|
|
|
<!-- Visits List -->
|
|
|
|
|
{#if visits && visits.length === 0}
|
|
|
|
|
<p class="text-sm text-base-content opacity-70">
|
|
|
|
|
{$t('adventures.no_visits')}
|
|
|
|
|
</p>
|
|
|
|
|
{/if}
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
{#if visits && visits.length > 0}
|
|
|
|
|
<div class="space-y-4">
|
|
|
|
|
{#each visits as visit}
|
|
|
|
|
<div
|
|
|
|
|
class="p-4 border border-neutral rounded-lg bg-base-100 shadow-sm flex flex-col gap-2"
|
|
|
|
|
>
|
|
|
|
|
<p class="text-sm text-base-content font-medium">
|
|
|
|
|
{#if isAllDay(visit.start_date)}
|
|
|
|
|
<span class="badge badge-outline mr-2">{$t('adventures.all_day')}</span>
|
|
|
|
|
{visit.start_date.split('T')[0]} – {visit.end_date.split('T')[0]}
|
|
|
|
|
{:else}
|
|
|
|
|
{new Date(visit.start_date).toLocaleString()} – {new Date(
|
|
|
|
|
visit.end_date
|
|
|
|
|
).toLocaleString()}
|
|
|
|
|
{/if}
|
|
|
|
|
</p>
|
|
|
|
|
|
2025-05-10 10:47:00 -04:00
|
|
|
|
<!-- Display timezone information for transportation visits -->
|
|
|
|
|
{#if visit.start_timezone && visit.end_timezone && visit.start_timezone !== visit.end_timezone}
|
|
|
|
|
<p class="text-xs text-base-content">
|
|
|
|
|
{visit.start_timezone} → {visit.end_timezone}
|
|
|
|
|
</p>
|
|
|
|
|
{/if}
|
2025-05-09 21:17:11 -04:00
|
|
|
|
|
|
|
|
|
{#if visit.notes}
|
|
|
|
|
<p class="text-sm text-base-content opacity-70 italic">
|
|
|
|
|
"{visit.notes}"
|
|
|
|
|
</p>
|
|
|
|
|
{/if}
|
|
|
|
|
|
|
|
|
|
<div class="flex gap-2 mt-2">
|
|
|
|
|
<button
|
|
|
|
|
class="btn btn-primary btn-sm"
|
|
|
|
|
type="button"
|
|
|
|
|
on:click={() => {
|
|
|
|
|
isEditing = true;
|
|
|
|
|
const isAllDayEvent = isAllDay(visit.start_date);
|
|
|
|
|
allDay = isAllDayEvent;
|
|
|
|
|
|
2025-05-10 10:47:00 -04:00
|
|
|
|
// Set timezone information if available
|
|
|
|
|
if (visit.start_timezone) selectedStartTimezone = visit.start_timezone;
|
|
|
|
|
if (visit.end_timezone) selectedEndTimezone = visit.end_timezone;
|
|
|
|
|
|
2025-05-09 21:17:11 -04:00
|
|
|
|
if (isAllDayEvent) {
|
|
|
|
|
localStartDate = visit.start_date.split('T')[0];
|
|
|
|
|
localEndDate = visit.end_date.split('T')[0];
|
|
|
|
|
} else {
|
2025-05-10 10:47:00 -04:00
|
|
|
|
// Update with timezone awareness
|
|
|
|
|
localStartDate = updateLocalDate({
|
|
|
|
|
utcDate: visit.start_date,
|
|
|
|
|
timezone: selectedStartTimezone
|
|
|
|
|
}).localDate;
|
|
|
|
|
|
|
|
|
|
localEndDate = updateLocalDate({
|
|
|
|
|
utcDate: visit.end_date,
|
|
|
|
|
timezone: visit.end_timezone || selectedStartTimezone
|
|
|
|
|
}).localDate;
|
2025-05-09 21:17:11 -04:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// remove it from visits
|
|
|
|
|
if (visits) {
|
|
|
|
|
visits = visits.filter((v) => v.id !== visit.id);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
note = visit.notes;
|
|
|
|
|
constrainDates = true;
|
|
|
|
|
utcStartDate = visit.start_date;
|
|
|
|
|
utcEndDate = visit.end_date;
|
|
|
|
|
|
|
|
|
|
setTimeout(() => {
|
|
|
|
|
isEditing = false;
|
|
|
|
|
}, 0);
|
|
|
|
|
}}
|
|
|
|
|
>
|
|
|
|
|
{$t('lodging.edit')}
|
|
|
|
|
</button>
|
|
|
|
|
<button
|
|
|
|
|
class="btn btn-error btn-sm"
|
|
|
|
|
type="button"
|
|
|
|
|
on:click={() => {
|
|
|
|
|
if (visits) {
|
|
|
|
|
visits = visits.filter((v) => v.id !== visit.id);
|
|
|
|
|
}
|
|
|
|
|
}}
|
|
|
|
|
>
|
|
|
|
|
{$t('adventures.remove')}
|
|
|
|
|
</button>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
{/each}
|
|
|
|
|
</div>
|
|
|
|
|
{/if}
|
|
|
|
|
{/if}
|
2025-05-09 10:24:29 -04:00
|
|
|
|
</div>
|
|
|
|
|
</div>
|