From e4d1a40bb9b692faf0a34f90a3331ffe19cfe57f Mon Sep 17 00:00:00 2001 From: WhyAsh5114 Date: Thu, 23 Jan 2025 14:43:21 +0530 Subject: [PATCH] feat: added the ability to import and export exercise splits --- src/routes/exercise-splits/+page.svelte | 1 + .../[exerciseSplitId]/+page.svelte | 31 ++++++++++ .../exercise-splits/import/+page.svelte | 62 +++++++++++++++++++ .../edit-split/exercises/+page.svelte | 8 ++- 4 files changed, 99 insertions(+), 3 deletions(-) create mode 100644 src/routes/exercise-splits/import/+page.svelte diff --git a/src/routes/exercise-splits/+page.svelte b/src/routes/exercise-splits/+page.svelte index 95128f41..e27c3fef 100644 --- a/src/routes/exercise-splits/+page.svelte +++ b/src/routes/exercise-splits/+page.svelte @@ -71,6 +71,7 @@ Start from scratch Use template + Import diff --git a/src/routes/exercise-splits/[exerciseSplitId]/+page.svelte b/src/routes/exercise-splits/[exerciseSplitId]/+page.svelte index f05e149d..1f270c05 100644 --- a/src/routes/exercise-splits/[exerciseSplitId]/+page.svelte +++ b/src/routes/exercise-splits/[exerciseSplitId]/+page.svelte @@ -10,6 +10,7 @@ import DeleteIcon from 'virtual:icons/lucide/trash'; import EditIcon from 'virtual:icons/lucide/pencil'; import LoaderCircle from 'virtual:icons/lucide/loader-circle'; + import FileUpIcon from 'virtual:icons/lucide/file-up'; import { onMount } from 'svelte'; import { toast } from 'svelte-sonner'; import ExerciseSplitSkeleton from './(components)/ExerciseSplitSkeleton.svelte'; @@ -82,6 +83,33 @@ exerciseSplitRunes.loadExerciseSplit(getExerciseSplitWithoutIds(exerciseSplit), exerciseSplit.id); goto(`/exercise-splits/manage/structure`); } + + function exportSplit() { + if (exerciseSplit === 'loading') return; + + const { userId, id, ...rest } = exerciseSplit; + (rest.exerciseSplitDays as unknown) = rest.exerciseSplitDays.map((day) => { + const { id, exerciseSplitId, ...rest } = day; + (rest.exercises as unknown) = rest.exercises.map((ex) => { + const { id, exerciseSplitDayId, ...rest } = ex; + return rest; + }); + return rest; + }); + + const jsonData = JSON.stringify(rest); + const blob = new Blob([jsonData], { type: 'application/json' }); + + const url = URL.createObjectURL(blob); + const link = document.createElement('a'); + link.href = url; + link.download = `${exerciseSplit.name}.json`; + + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + URL.revokeObjectURL(url); + }

View exercise split

@@ -111,6 +139,9 @@ loadExerciseSplit('clone')}> Clone + exportSplit()}> + Export + (deleteConfirmDrawerOpen = true)}> Delete diff --git a/src/routes/exercise-splits/import/+page.svelte b/src/routes/exercise-splits/import/+page.svelte new file mode 100644 index 00000000..a8925b7c --- /dev/null +++ b/src/routes/exercise-splits/import/+page.svelte @@ -0,0 +1,62 @@ + + +

Exercise splits

+

Import

+ +
+ + { + const file = e.currentTarget.files?.item(0); + if (file) splitFile = file; + }} + /> +
+ + diff --git a/src/routes/mesocycles/[mesocycleId]/edit-split/exercises/+page.svelte b/src/routes/mesocycles/[mesocycleId]/edit-split/exercises/+page.svelte index bffff904..98ee5154 100644 --- a/src/routes/mesocycles/[mesocycleId]/edit-split/exercises/+page.svelte +++ b/src/routes/mesocycles/[mesocycleId]/edit-split/exercises/+page.svelte @@ -126,9 +126,11 @@ deleteExercise={mesocycleExerciseSplitRunes.deleteExercise} {reordering} setEditingExercise={mesocycleExerciseSplitRunes.setEditingExercise} - bind:itemList={mesocycleExerciseSplitRunes.splitExercises[ - mesocycleExerciseSplitRunes.selectedSplitDayIndex - ] as MesocycleExerciseTemplateWithoutIdsOrIndex[]} + bind:itemList={ + mesocycleExerciseSplitRunes.splitExercises[ + mesocycleExerciseSplitRunes.selectedSplitDayIndex + ] as MesocycleExerciseTemplateWithoutIdsOrIndex[] + } />