Rajoute le téléchargement des calendriers #17

Merged
tomate merged 4 commits from refs/pull/17/head into master 2022-03-29 20:22:06 +02:00
3 changed files with 38 additions and 6 deletions

View file

@ -6,6 +6,8 @@
import { createTriState, createTriStates, UNCHECKED, CHECKED, WEIRD } from './stores'; import { createTriState, createTriStates, UNCHECKED, CHECKED, WEIRD } from './stores';
import { Icon } from 'sveltestrap'; import { Icon } from 'sveltestrap';
import { mkSource } from './calendar.js';
export let item = null; export let item = null;
export let level = 1; export let level = 1;
export let generalToggle = undefined; export let generalToggle = undefined;
@ -78,6 +80,11 @@
}); });
} }
const url = (() => {
const source = mkSource(item);
return source ? source.export_url : undefined;
})();
$: selected = $: selected =
$filtering === CHECKED ? [item, ...subselected.flat()] : subselected.flat(); $filtering === CHECKED ? [item, ...subselected.flat()] : subselected.flat();
$: subHidden = () => (collapsed ? 'd-none' : ''); $: subHidden = () => (collapsed ? 'd-none' : '');
@ -90,6 +97,7 @@
on:change={handleChange} on:change={handleChange}
value={item} value={item}
bind:collapsed bind:collapsed
{url}
/> />
</div> </div>

View file

@ -4,6 +4,7 @@
export let state; export let state;
export let value; export let value;
export let collapsed = undefined; export let collapsed = undefined;
export let url;
import { UNCHECKED, CHECKED, WEIRD } from './stores'; import { UNCHECKED, CHECKED, WEIRD } from './stores';
import { createEventDispatcher } from 'svelte'; import { createEventDispatcher } from 'svelte';
@ -28,14 +29,32 @@
<span class="cal w-100 d-block" on:click={handleClick}> <span class="cal w-100 d-block" on:click={handleClick}>
<Icon name={icon} class="ms-2" /> <Icon name={icon} class="ms-2" />
<span class="ms-1">{value}</span> <span class="ms-1">{value}</span>
<span class="float-end">
{#if url}
<a href={url} class="cal-link" download={value} on:click|stopPropagation>
<Icon name="cloud-download" />
</a>
{/if}
{#if collapsed !== undefined} {#if collapsed !== undefined}
<span class="float-end" on:click|stopPropagation={() => (collapsed = !collapsed)}> <span class="cal-link" on:click|stopPropagation={() => (collapsed = !collapsed)}>
<Icon name={chevron} /> <Icon name={chevron} />
</span> </span>
{/if} {/if}
</span> </span>
</span>
<style> <style>
.cal-link {
margin-right: 0.5rem;
padding: 3px;
color: inherit;
}
.cal-link:hover {
color: #aabbfe;
text-shadow: 2px 2px 3px #62a1fe;
}
.cal { .cal {
cursor: pointer; cursor: pointer;
padding: 0.2em; padding: 0.2em;

View file

@ -82,6 +82,10 @@ function mkCalendarUrl(id, { cloud }, extra = {}) {
) )
} }
function mkExportUrl(id, { cloud }) {
return `/cal/${cloud}/${id}/?export`
}
function fetchCalendar(id, cal, extra = {}) { function fetchCalendar(id, cal, extra = {}) {
return fetch(mkCalendarUrl(id, cal, extra), { credentials: 'omit' }) return fetch(mkCalendarUrl(id, cal, extra), { credentials: 'omit' })
.then(resp => resp.json()) .then(resp => resp.json())
@ -178,6 +182,7 @@ export function mkSource(name) {
start: start.valueOf() / 1000, start: start.valueOf() / 1000,
end: end.valueOf() / 1000 end: end.valueOf() / 1000
}).then(successCallback, failureCallback) }).then(successCallback, failureCallback)
} },
export_url: mkExportUrl(calendarId, calendar)
} }
} }