diff --git a/src/components/Course/store.js b/src/components/Course/store.js index abfd63dc..68f47e28 100644 --- a/src/components/Course/store.js +++ b/src/components/Course/store.js @@ -57,9 +57,9 @@ export async function setCourseData(data, setLesson = true) { } if (setLesson) { - const orderedLessons = (data.lessons || []).sort( - (a, b) => new Date(a.created_at) - new Date(b.created_at) - ); + const orderedLessons = (data.lessons || []) + .sort((a, b) => new Date(a.created_at) - new Date(b.created_at)) + .sort((a, b) => a.order - b.order); // .map((lesson) => ({ // ...lesson, // profile: lesson.profile && tutorsById[lesson.profile.id], diff --git a/src/components/PageBody/index.svelte b/src/components/PageBody/index.svelte index 2ef3a792..5b05e511 100644 --- a/src/components/PageBody/index.svelte +++ b/src/components/PageBody/index.svelte @@ -2,10 +2,11 @@ // import // border border-gray-300 rounded-md p-3 bg-blue-200 bg-opacity-25 export let width = 'max-w-3xl w-11/12'; + export let padding = 'pb-5 px-4'; export let className = ''; -
+
{#if $$slots.header}
import { onMount } from 'svelte'; import { stores } from '@sapper/app'; + import { dndzone } from 'svelte-dnd-action'; import Time24 from 'carbon-icons-svelte/lib/Time24'; import Edit24 from 'carbon-icons-svelte/lib/Edit24'; import Save24 from 'carbon-icons-svelte/lib/Save24'; @@ -21,7 +22,10 @@ import TextField from '../../../../components/Form/TextField.svelte'; import IconButton from '../../../../components/IconButton/index.svelte'; import Select from '../../../../components/Form/Select.svelte'; - import { fetchCourse } from '../../../../utils/services/courses'; + import { + fetchCourse, + updateLesson, + } from '../../../../utils/services/courses'; import CourseContainer from '../../../../components/CourseContainer/index.svelte'; import { profile } from '../../../../utils/store/user'; import { @@ -43,6 +47,7 @@ let isStudent = true; const { page } = stores(); + const flipDurationMs = 300; function formatDate(date) { const d = new Date(date); @@ -69,6 +74,36 @@ }, 100); } + function handleDndConsider(e) { + $lessons = e.detail.items; + } + + function handleDndFinalize(e) { + const prevLessonsByOrder = $lessons.reduce( + (acc, l) => ({ ...acc, [l.id]: l.order }), + {} + ); + $lessons = e.detail.items; + + // Only update the lesson order that changed + e.detail.items.forEach((item, index) => { + const order = index + 1; + + if (order !== prevLessonsByOrder[item.id]) { + $lessons[index].order = order; + updateLesson({ order }, item.id).then((update) => + console.log(`updated lesson order`, update) + ); + } + }); + } + + function getLessonOrder(id) { + const index = $lessons.findIndex((lesson) => lesson.id === id); + + return index + 1; + } + onMount(async () => { if ($course.id) return; const { data } = await fetchCourse(courseId); @@ -88,23 +123,35 @@ - -
+
+ -
- + +
- -
- {#each $lessons as lesson, index} + +
+ {#each $lessons as lesson (lesson.id)}
@@ -132,7 +179,7 @@
- {#if lessonEditing === index} + {#if lessonEditing === lesson.id} { lessonEditing = null; @@ -142,7 +189,7 @@ {:else} - (lessonEditing = index)}> + (lessonEditing = lesson.id)}> {/if} @@ -150,10 +197,12 @@
-

{index + 1}.

+

+ {getLessonOrder(lesson.id)}. +

- {#if lessonEditing === index} + {#if lessonEditing === lesson.id} {:else}

@@ -177,7 +226,7 @@

-->
- {#if lessonEditing === index} + {#if lessonEditing === lesson.id}
- {#if lessonEditing === index} + {#if lessonEditing === lesson.id} {/each} -
+