From 206967e37498671ffad5e831ced6df937784ef2e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Victor=20L=C3=B6fgren?= <viclo211@student.liu.se>
Date: Fri, 30 Apr 2021 12:02:19 +0200
Subject: [PATCH 1/8] Fix move slides

---
 server/app/apis/slides.py               | 35 ++++++-----
 server/app/database/controller/utils.py | 81 ++++++++++++++++++++-----
 2 files changed, 86 insertions(+), 30 deletions(-)

diff --git a/server/app/apis/slides.py b/server/app/apis/slides.py
index 52ce4cce..c440d48a 100644
--- a/server/app/apis/slides.py
+++ b/server/app/apis/slides.py
@@ -2,9 +2,9 @@ import app.core.http_codes as codes
 import app.database.controller as dbc
 from app.apis import item_response, list_response, protect_route
 from app.core.dto import SlideDTO
-from flask_restx import Resource
-from flask_restx import reqparse
 from app.core.parsers import sentinel
+from app.database.models import Competition
+from flask_restx import Resource, reqparse
 
 api = SlideDTO.api
 schema = SlideDTO.schema
@@ -62,25 +62,30 @@ class SlideOrder(Resource):
     @protect_route(allowed_roles=["*"])
     def put(self, competition_id, slide_id):
         args = slide_parser_edit.parse_args(strict=True)
-        order = args.get("order")
+        new_order = args.get("order")
 
         item_slide = dbc.get.slide(competition_id, slide_id)
 
-        if order == item_slide.order:
+        if new_order == item_slide.order:
             return item_response(schema.dump(item_slide))
 
         # clamp order between 0 and max
-        order_count = dbc.get.slide_count(competition_id)
-        if order < 0:
-            order = 0
-        elif order >= order_count - 1:
-            order = order_count - 1
-
-        # get slide at the requested order
-        item_slide_id = dbc.get.slide(competition_id, order)
-
-        # switch place between them
-        item_slide = dbc.edit.switch_order(item_slide, item_slide_id)
+        # order_count = dbc.get.slide_count(competition_id)
+        # if new_order < 0:
+        #     new_order = 0
+        # elif new_order > order_count - 1:
+        #     new_order = order_count - 1
+
+        item_competition = dbc.get.one(Competition, competition_id)
+        # print("=" * 20)
+        # print("Order", item_slide.order, "to", new_order)
+        dbc.utils.move_slides(item_competition, item_slide.order, new_order)
+
+        # # get slide at the requested order
+        # item_slide_id = dbc.get.slide(competition_id, order)
+
+        # # switch place between them
+        # item_slide = dbc.edit.switch_order(item_slide, item_slide_id)
 
         return item_response(schema.dump(item_slide))
 
diff --git a/server/app/database/controller/utils.py b/server/app/database/controller/utils.py
index 14eaa48d..c9089890 100644
--- a/server/app/database/controller/utils.py
+++ b/server/app/database/controller/utils.py
@@ -9,23 +9,74 @@ from app.database.models import Code
 from flask_restx import abort
 
 
-def move_slides(item_competition, start_order, end_order):
+def move_slides(item_competition, from_order, to_order):
     slides = item_competition.slides
-    # Move up
-    if start_order < end_order:
-        for i in range(start_order + 1, end_order):
-            slides[i].order -= 1
 
-    # Move down
-    elif start_order > end_order:
-        for i in range(end_order, start_order):
-            slides[i].order += 1
-
-    # start = 5, end = 1
-    # 1->2, 2->3, 4->5
-    # 5 = 1
-
-    slides[start_order].order = end_order
+    change = 1 if to_order < from_order else -1
+    start_order = min(from_order, to_order)
+    end_order = max(from_order, to_order)
+
+    print("=" * 20)
+    print(f"Move: {from_order} -> {to_order}")
+    print(f"Change {change}")
+    print(f"Effect slides: {list(range(start_order, end_order+1))}")
+    print(f"Order before:", [item_slide.order for item_slide in slides])
+    print("=" * 20)
+
+    # Move slides between from and to order either up or done
+    for item_slide in slides:
+        if start_order <= item_slide.order <= end_order:
+            print(f"{item_slide.order} -> {-(item_slide.order + change)}")
+            item_slide.order = -(item_slide.order + change)
+
+    # Find the slide that was to be moved and change it to correct order
+    for item_slide in slides:
+        if -item_slide.order - change == from_order:
+            print(f"{item_slide.order} -> {-to_order}")
+            item_slide.order = -to_order
+            break
+    print("=" * 20)
+
+    db.session.commit()
+
+    for item_slide in slides:
+        if start_order <= -item_slide.order <= end_order:
+            print(f"{item_slide.order} -> {-(item_slide.order)}")
+            item_slide.order = -(item_slide.order)
+
+    # for i in range(start_order, end_order + 1):
+    #     print(f"{slides[i].order} -> {-(slides[i].order + change)}")
+    #     slides[i].order = -(slides[i].order + change)
+
+    # print(f"{slides[from_order].order} -> {-to_order}")
+    # slides[from_order].order = -to_order
+
+    # db.session.commit()
+
+    # print("=" * 20)
+
+    # for i in range(start_order, end_order + 1):
+    #     print(f"{slides[i].order} -> {-slides[i].order}")
+    #     slides[i].order = -(slides[i].order)
+    # print("=" * 40)
+
+    # db.session.commit()
+    # print(f"Order after:", [item_slide.order for item_slide in slides])
+
+    # # Move up
+    # if start_order < end_order:
+    #     for i in range(start_order + 1, end_order):
+    #         print(slides[i].order, "->", -(slides[i].order - 1))
+    #         slides[i].order = -(slides[i].order - 1)
+
+    # # Move down
+    # elif start_order > end_order:
+    #     for i in range(end_order, start_order):
+    #         print(slides[i].order, "->", -(slides[i].order + 1))
+    #         slides[i].order = -(slides[i].order + 1)
+
+    # print(slides[start_order].order, "->", end_order)
+    # slides[start_order].order = end_order
     return commit_and_refresh(item_competition)
 
 
-- 
GitLab


From fbba29021303a18be09a2d57e5932859c6770021 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Victor=20L=C3=B6fgren?= <viclo211@student.liu.se>
Date: Fri, 30 Apr 2021 12:22:11 +0200
Subject: [PATCH 2/8] Fix move slides

---
 server/app/apis/slides.py               | 19 ++-----
 server/app/database/controller/utils.py | 66 ++++++++-----------------
 2 files changed, 25 insertions(+), 60 deletions(-)

diff --git a/server/app/apis/slides.py b/server/app/apis/slides.py
index c440d48a..e0edcf6d 100644
--- a/server/app/apis/slides.py
+++ b/server/app/apis/slides.py
@@ -3,8 +3,10 @@ import app.database.controller as dbc
 from app.apis import item_response, list_response, protect_route
 from app.core.dto import SlideDTO
 from app.core.parsers import sentinel
+from app.database.controller.get import slide_count
 from app.database.models import Competition
 from flask_restx import Resource, reqparse
+from flask_restx.errors import abort
 
 api = SlideDTO.api
 schema = SlideDTO.schema
@@ -69,24 +71,11 @@ class SlideOrder(Resource):
         if new_order == item_slide.order:
             return item_response(schema.dump(item_slide))
 
-        # clamp order between 0 and max
-        # order_count = dbc.get.slide_count(competition_id)
-        # if new_order < 0:
-        #     new_order = 0
-        # elif new_order > order_count - 1:
-        #     new_order = order_count - 1
+        if not (0 <= new_order < dbc.get.slide_count(competition_id)):
+            abort(codes.BAD_REQUEST, f"Cant change to invalid slide order '{new_order}'")
 
         item_competition = dbc.get.one(Competition, competition_id)
-        # print("=" * 20)
-        # print("Order", item_slide.order, "to", new_order)
         dbc.utils.move_slides(item_competition, item_slide.order, new_order)
-
-        # # get slide at the requested order
-        # item_slide_id = dbc.get.slide(competition_id, order)
-
-        # # switch place between them
-        # item_slide = dbc.edit.switch_order(item_slide, item_slide_id)
-
         return item_response(schema.dump(item_slide))
 
 
diff --git a/server/app/database/controller/utils.py b/server/app/database/controller/utils.py
index c9089890..48db2c07 100644
--- a/server/app/database/controller/utils.py
+++ b/server/app/database/controller/utils.py
@@ -10,73 +10,49 @@ from flask_restx import abort
 
 
 def move_slides(item_competition, from_order, to_order):
+    """
+    Move slide from from_order to to_order in item_competition.
+    """
+
+    # TODO: Please refactor this terrible piece of code
+    # This function is
+
     slides = item_competition.slides
 
     change = 1 if to_order < from_order else -1
     start_order = min(from_order, to_order)
     end_order = max(from_order, to_order)
 
-    print("=" * 20)
-    print(f"Move: {from_order} -> {to_order}")
-    print(f"Change {change}")
-    print(f"Effect slides: {list(range(start_order, end_order+1))}")
-    print(f"Order before:", [item_slide.order for item_slide in slides])
-    print("=" * 20)
-
-    # Move slides between from and to order either up or done
+    # Move slides between from and to order either up or down, but minus in front
     for item_slide in slides:
         if start_order <= item_slide.order <= end_order:
-            print(f"{item_slide.order} -> {-(item_slide.order + change)}")
             item_slide.order = -(item_slide.order + change)
 
-    # Find the slide that was to be moved and change it to correct order
+    # Find the slide that was to be moved and change it to correct order with minus in front
     for item_slide in slides:
         if -item_slide.order - change == from_order:
-            print(f"{item_slide.order} -> {-to_order}")
             item_slide.order = -to_order
             break
-    print("=" * 20)
+
+    # -0 = 0 so have to do a special case for it
+    for item_slide in slides:
+        if item_slide.order == 0:
+            item_slide.order = -999
+            break
 
     db.session.commit()
 
+    # Negate all order so that they become correct and positive
     for item_slide in slides:
         if start_order <= -item_slide.order <= end_order:
-            print(f"{item_slide.order} -> {-(item_slide.order)}")
             item_slide.order = -(item_slide.order)
 
-    # for i in range(start_order, end_order + 1):
-    #     print(f"{slides[i].order} -> {-(slides[i].order + change)}")
-    #     slides[i].order = -(slides[i].order + change)
-
-    # print(f"{slides[from_order].order} -> {-to_order}")
-    # slides[from_order].order = -to_order
-
-    # db.session.commit()
-
-    # print("=" * 20)
-
-    # for i in range(start_order, end_order + 1):
-    #     print(f"{slides[i].order} -> {-slides[i].order}")
-    #     slides[i].order = -(slides[i].order)
-    # print("=" * 40)
-
-    # db.session.commit()
-    # print(f"Order after:", [item_slide.order for item_slide in slides])
-
-    # # Move up
-    # if start_order < end_order:
-    #     for i in range(start_order + 1, end_order):
-    #         print(slides[i].order, "->", -(slides[i].order - 1))
-    #         slides[i].order = -(slides[i].order - 1)
-
-    # # Move down
-    # elif start_order > end_order:
-    #     for i in range(end_order, start_order):
-    #         print(slides[i].order, "->", -(slides[i].order + 1))
-    #         slides[i].order = -(slides[i].order + 1)
+    # Change order back
+    for item_slide in slides:
+        if item_slide.order == -999:
+            item_slide.order = 0
+            break
 
-    # print(slides[start_order].order, "->", end_order)
-    # slides[start_order].order = end_order
     return commit_and_refresh(item_competition)
 
 
-- 
GitLab


From dfe27307ddea9d6e95ce593dba313002fbbf3359 Mon Sep 17 00:00:00 2001
From: Albin Henriksson <albhe428@student.liu.se>
Date: Fri, 30 Apr 2021 20:54:04 +0200
Subject: [PATCH 3/8] Fix move slides on front-end

---
 .../PresentationEditorPage.tsx                | 48 +++++++++++++++----
 1 file changed, 39 insertions(+), 9 deletions(-)

diff --git a/client/src/pages/presentationEditor/PresentationEditorPage.tsx b/client/src/pages/presentationEditor/PresentationEditorPage.tsx
index ddbe7468..08d2ec7e 100644
--- a/client/src/pages/presentationEditor/PresentationEditorPage.tsx
+++ b/client/src/pages/presentationEditor/PresentationEditorPage.tsx
@@ -10,6 +10,7 @@ import { getCities } from '../../actions/cities'
 import { getEditorCompetition, setEditorSlideId, setEditorViewId } from '../../actions/editor'
 import { getTypes } from '../../actions/typesAction'
 import { useAppDispatch, useAppSelector } from '../../hooks'
+import { RichSlide } from '../../interfaces/ApiRichModels'
 import { renderSlideIcon } from '../../utils/renderSlideIcon'
 import { RemoveMenuItem } from '../admin/styledComp'
 import { Content, InnerContent } from '../views/styled'
@@ -50,6 +51,7 @@ interface CompetitionParams {
 const PresentationEditorPage: React.FC = () => {
   const { competitionId }: CompetitionParams = useParams()
   const dispatch = useAppDispatch()
+  const [slides, setSlides] = useState<RichSlide[]>([])
   const activeSlideId = useAppSelector((state) => state.editor.activeSlideId)
   const activeViewTypeId = useAppSelector((state) => state.editor.activeViewTypeId)
   const competition = useAppSelector((state) => state.editor.competition)
@@ -60,6 +62,10 @@ const PresentationEditorPage: React.FC = () => {
     dispatch(getCities())
   }, [])
 
+  useEffect(() => {
+    setSlides(competition.slides)
+  }, [competition])
+
   const setActiveSlideId = (id: number) => {
     dispatch(setEditorSlideId(id))
   }
@@ -111,16 +117,38 @@ const PresentationEditorPage: React.FC = () => {
   }
 
   const onDragEnd = async (result: DropResult) => {
-    // dropped outside the list
-    if (!result.destination) {
+    // dropped outside the list or same place
+    if (!result.destination || result.destination.index === result.source.index) {
       return
     }
     const draggedIndex = result.source.index
-    const draggedSlideId = competition.slides.find((slide) => slide.order === draggedIndex)?.id
+    const draggedSlideId = slides.find((slide) => slide.order === draggedIndex)?.id
+    const slidesCopy = slides
+    const diff = result.destination.index - result.source.index
+    slides.map((slide) => {
+      if (slide.order === draggedIndex && result.destination) {
+        slide.order = result.destination.index
+      } else if (
+        result.destination &&
+        diff > 0 &&
+        slide.order > result.source.index &&
+        slide.order <= result.destination.index
+      ) {
+        slide.order = slide.order - 1
+      } else if (
+        result.destination &&
+        diff < 0 &&
+        slide.order < result.source.index &&
+        slide.order >= result.destination.index
+      ) {
+        slide.order = slide.order + 1
+      }
+    })
+    setSlides(slidesCopy)
+
     if (draggedSlideId) {
       await axios
         .put(`/api/competitions/${competitionId}/slides/${draggedSlideId}/order`, { order: result.destination.index })
-        .then(() => dispatch(getEditorCompetition(competitionId)))
         .catch(console.log)
     }
   }
@@ -161,21 +189,23 @@ const PresentationEditorPage: React.FC = () => {
             <DragDropContext onDragEnd={onDragEnd}>
               <Droppable droppableId="droppable">
                 {(provided) => (
-                  <div key={provided.innerRef.toString()} ref={provided.innerRef} {...provided.droppableProps}>
-                    {competition.slides &&
-                      competition.slides.map((slide, index) => (
-                        <Draggable key={slide.order} draggableId={slide.id.toString()} index={index}>
+                  <div ref={provided.innerRef} {...provided.droppableProps}>
+                    {slides
+                      .sort((a, b) => (a.order > b.order ? 1 : -1))
+                      .map((slide, index) => (
+                        <Draggable key={slide.id} draggableId={slide.id.toString()} index={index}>
                           {(provided, snapshot) => (
                             <div ref={provided.innerRef} {...provided.draggableProps} {...provided.dragHandleProps}>
                               <SlideListItem
                                 divider
+                                key={slide.order}
                                 button
                                 selected={slide.id === activeSlideId}
                                 onClick={() => setActiveSlideId(slide.id)}
                                 onContextMenu={(event) => handleRightClick(event, slide.id)}
                               >
                                 {renderSlideIcon(slide)}
-                                <ListItemText primary={`Sida ${slide.order + 1}`} />
+                                <ListItemText primary={`Sida ${slide.id}`} />
                               </SlideListItem>
                             </div>
                           )}
-- 
GitLab


From e4c5147ffa92d8dd912b192f75b5fe3aaa16e220 Mon Sep 17 00:00:00 2001
From: Albin Henriksson <albhe428@student.liu.se>
Date: Fri, 30 Apr 2021 21:21:27 +0200
Subject: [PATCH 4/8] Fix slide display bug

---
 client/src/pages/presentationEditor/PresentationEditorPage.tsx | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/client/src/pages/presentationEditor/PresentationEditorPage.tsx b/client/src/pages/presentationEditor/PresentationEditorPage.tsx
index 08d2ec7e..0fb7a72f 100644
--- a/client/src/pages/presentationEditor/PresentationEditorPage.tsx
+++ b/client/src/pages/presentationEditor/PresentationEditorPage.tsx
@@ -243,7 +243,7 @@ const PresentationEditorPage: React.FC = () => {
 
       <Content leftDrawerWidth={leftDrawerWidth} rightDrawerWidth={rightDrawerWidth}>
         <InnerContent>
-          {competitionLoading && <SlideDisplay variant="editor" activeViewTypeId={activeViewTypeId} />}
+          <SlideDisplay variant="editor" activeViewTypeId={activeViewTypeId} />
         </InnerContent>
       </Content>
       <Menu
-- 
GitLab


From 8b877c9acfbeef1d24aecb141fb5a03aabef6c89 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Victor=20L=C3=B6fgren?= <viclo211@student.liu.se>
Date: Fri, 30 Apr 2021 21:52:58 +0200
Subject: [PATCH 5/8] Fixed another bug with moving slides

---
 server/app/database/controller/utils.py | 35 ++++++++++++++-----------
 server/tests/test_db.py                 | 31 ++++++++++++++++++++--
 server/tests/test_helpers.py            |  8 ++++++
 3 files changed, 56 insertions(+), 18 deletions(-)

diff --git a/server/app/database/controller/utils.py b/server/app/database/controller/utils.py
index 48db2c07..2d2e5701 100644
--- a/server/app/database/controller/utils.py
+++ b/server/app/database/controller/utils.py
@@ -14,8 +14,17 @@ def move_slides(item_competition, from_order, to_order):
     Move slide from from_order to to_order in item_competition.
     """
 
-    # TODO: Please refactor this terrible piece of code
-    # This function is
+    num_slides = len(item_competition.slides)
+    assert 0 <= from_order < num_slides, "Invalid order to move from"
+    assert 0 <= to_order < num_slides, "Invalid order to move to"
+
+    # TODO: Please improve this terrible piece of code
+    # This function is sooo terrible, someone please tell me how to update
+    # multiple values in the database at the same time with unique constraints.
+    # If you update all the values at the same time none of them will collide
+    # but that database doesn't know that so you have to update them to some
+    # other value before and then change every value back to the correct one,
+    # so 2 commits.
 
     slides = item_competition.slides
 
@@ -23,35 +32,29 @@ def move_slides(item_competition, from_order, to_order):
     start_order = min(from_order, to_order)
     end_order = max(from_order, to_order)
 
+    for item_slide in slides:
+        item_slide.order += 100
+
     # Move slides between from and to order either up or down, but minus in front
     for item_slide in slides:
-        if start_order <= item_slide.order <= end_order:
+        if start_order <= item_slide.order - 100 <= end_order:
             item_slide.order = -(item_slide.order + change)
 
     # Find the slide that was to be moved and change it to correct order with minus in front
     for item_slide in slides:
-        if -item_slide.order - change == from_order:
-            item_slide.order = -to_order
-            break
-
-    # -0 = 0 so have to do a special case for it
-    for item_slide in slides:
-        if item_slide.order == 0:
-            item_slide.order = -999
+        if item_slide.order == -(from_order + change + 100):
+            item_slide.order = -(to_order + 100)
             break
 
     db.session.commit()
 
     # Negate all order so that they become correct and positive
     for item_slide in slides:
-        if start_order <= -item_slide.order <= end_order:
+        if start_order <= -(item_slide.order + 100) <= end_order:
             item_slide.order = -(item_slide.order)
 
-    # Change order back
     for item_slide in slides:
-        if item_slide.order == -999:
-            item_slide.order = 0
-            break
+        item_slide.order -= 100
 
     return commit_and_refresh(item_competition)
 
diff --git a/server/tests/test_db.py b/server/tests/test_db.py
index c504ed14..568c1c47 100644
--- a/server/tests/test_db.py
+++ b/server/tests/test_db.py
@@ -3,10 +3,10 @@ This file tests the database controller functions.
 """
 
 import app.database.controller as dbc
-from app.database.models import City, Competition, Media, MediaType, Role, User, Code
+from app.database.models import City, Code, Competition, Media, MediaType, Role, User
 
 from tests import app, client, db
-from tests.test_helpers import add_default_values, assert_exists, assert_insert_fail, delete
+from tests.test_helpers import add_default_values, assert_exists, assert_insert_fail, assert_slide_order, delete
 
 
 def test_user(client):
@@ -151,6 +151,33 @@ def check_slides_copy(item_slide_original, item_slide_copy, num_slides, order):
     assert item_slide_copy == item_slides[order]
 
 
+def test_move_slides(client):
+    add_default_values()
+
+    item_comp = dbc.get.one(Competition, 1)
+
+    for _ in range(9):
+        dbc.add.slide(item_comp.id)
+
+    # Move from beginning to end
+    item_comp = dbc.utils.move_slides(item_comp, 0, 9)
+    assert_slide_order(item_comp, [9, 0, 1, 2, 3, 4, 5, 6, 7, 8])
+
+    # Move from end to beginning
+    item_comp = dbc.utils.move_slides(item_comp, 9, 0)
+    assert_slide_order(item_comp, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
+
+    # Move some things in the middle
+    item_comp = dbc.utils.move_slides(item_comp, 3, 7)
+    assert_slide_order(item_comp, [0, 1, 2, 7, 3, 4, 5, 6, 8, 9])
+
+    item_comp = dbc.utils.move_slides(item_comp, 1, 5)
+    assert_slide_order(item_comp, [0, 5, 1, 7, 2, 3, 4, 6, 8, 9])
+
+    item_comp = dbc.utils.move_slides(item_comp, 8, 2)
+    assert_slide_order(item_comp, [0, 6, 1, 8, 3, 4, 5, 7, 2, 9])
+
+
 """
 def test_question(client):
     add_default_values()
diff --git a/server/tests/test_helpers.py b/server/tests/test_helpers.py
index f55aa682..4f46622a 100644
--- a/server/tests/test_helpers.py
+++ b/server/tests/test_helpers.py
@@ -153,3 +153,11 @@ def change_order_test(client, cid, slide_id, new_slide_id, h):
     # Changes order
     response, _ = put(client, f"/api/competitions/{cid}/slides/{slide_id}/order", {"order": new_order}, headers=h)
     assert response.status_code == codes.OK
+
+
+def assert_slide_order(item_comp, correct_order):
+    """
+    Assert that the slides in the given competition are in the correct order
+    """
+    for slide, order in zip(item_comp.slides, correct_order):
+        assert slide.order == order
-- 
GitLab


From 34d8fd8323e59a4cd92f1ab8c7daccc9da79acea Mon Sep 17 00:00:00 2001
From: Albin Henriksson <albhe428@student.liu.se>
Date: Sun, 2 May 2021 08:52:34 +0200
Subject: [PATCH 6/8] Remake front-end code for moving slides

---
 .../PresentationEditorPage.tsx                | 73 +++++++------------
 1 file changed, 26 insertions(+), 47 deletions(-)

diff --git a/client/src/pages/presentationEditor/PresentationEditorPage.tsx b/client/src/pages/presentationEditor/PresentationEditorPage.tsx
index 0fb7a72f..caaaba46 100644
--- a/client/src/pages/presentationEditor/PresentationEditorPage.tsx
+++ b/client/src/pages/presentationEditor/PresentationEditorPage.tsx
@@ -51,7 +51,7 @@ interface CompetitionParams {
 const PresentationEditorPage: React.FC = () => {
   const { competitionId }: CompetitionParams = useParams()
   const dispatch = useAppDispatch()
-  const [slides, setSlides] = useState<RichSlide[]>([])
+  const [sortedSlides, setSortedSlides] = useState<RichSlide[]>([])
   const activeSlideId = useAppSelector((state) => state.editor.activeSlideId)
   const activeViewTypeId = useAppSelector((state) => state.editor.activeViewTypeId)
   const competition = useAppSelector((state) => state.editor.competition)
@@ -63,7 +63,7 @@ const PresentationEditorPage: React.FC = () => {
   }, [])
 
   useEffect(() => {
-    setSlides(competition.slides)
+    setSortedSlides(competition.slides.sort((a, b) => (a.order > b.order ? 1 : -1)))
   }, [competition])
 
   const setActiveSlideId = (id: number) => {
@@ -122,30 +122,11 @@ const PresentationEditorPage: React.FC = () => {
       return
     }
     const draggedIndex = result.source.index
-    const draggedSlideId = slides.find((slide) => slide.order === draggedIndex)?.id
-    const slidesCopy = slides
-    const diff = result.destination.index - result.source.index
-    slides.map((slide) => {
-      if (slide.order === draggedIndex && result.destination) {
-        slide.order = result.destination.index
-      } else if (
-        result.destination &&
-        diff > 0 &&
-        slide.order > result.source.index &&
-        slide.order <= result.destination.index
-      ) {
-        slide.order = slide.order - 1
-      } else if (
-        result.destination &&
-        diff < 0 &&
-        slide.order < result.source.index &&
-        slide.order >= result.destination.index
-      ) {
-        slide.order = slide.order + 1
-      }
-    })
-    setSlides(slidesCopy)
-
+    const draggedSlideId = sortedSlides.find((slide) => slide.order === draggedIndex)?.id
+    const slidesCopy = [...sortedSlides]
+    const [removed] = slidesCopy.splice(draggedIndex, 1)
+    slidesCopy.splice(result.destination.index, 0, removed)
+    setSortedSlides(slidesCopy)
     if (draggedSlideId) {
       await axios
         .put(`/api/competitions/${competitionId}/slides/${draggedSlideId}/order`, { order: result.destination.index })
@@ -190,27 +171,25 @@ const PresentationEditorPage: React.FC = () => {
               <Droppable droppableId="droppable">
                 {(provided) => (
                   <div ref={provided.innerRef} {...provided.droppableProps}>
-                    {slides
-                      .sort((a, b) => (a.order > b.order ? 1 : -1))
-                      .map((slide, index) => (
-                        <Draggable key={slide.id} draggableId={slide.id.toString()} index={index}>
-                          {(provided, snapshot) => (
-                            <div ref={provided.innerRef} {...provided.draggableProps} {...provided.dragHandleProps}>
-                              <SlideListItem
-                                divider
-                                key={slide.order}
-                                button
-                                selected={slide.id === activeSlideId}
-                                onClick={() => setActiveSlideId(slide.id)}
-                                onContextMenu={(event) => handleRightClick(event, slide.id)}
-                              >
-                                {renderSlideIcon(slide)}
-                                <ListItemText primary={`Sida ${slide.id}`} />
-                              </SlideListItem>
-                            </div>
-                          )}
-                        </Draggable>
-                      ))}
+                    {sortedSlides.map((slide, index) => (
+                      <Draggable key={slide.id} draggableId={slide.id.toString()} index={index}>
+                        {(provided, snapshot) => (
+                          <div ref={provided.innerRef} {...provided.draggableProps} {...provided.dragHandleProps}>
+                            <SlideListItem
+                              divider
+                              key={slide.order}
+                              button
+                              selected={slide.id === activeSlideId}
+                              onClick={() => setActiveSlideId(slide.id)}
+                              onContextMenu={(event) => handleRightClick(event, slide.id)}
+                            >
+                              {renderSlideIcon(slide)}
+                              <ListItemText primary={`Sida ${slide.id}`} />
+                            </SlideListItem>
+                          </div>
+                        )}
+                      </Draggable>
+                    ))}
                     {provided.placeholder}
                   </div>
                 )}
-- 
GitLab


From a3cefaa03aa65a3a9eb27c796dc253bd404a03c0 Mon Sep 17 00:00:00 2001
From: Albin Henriksson <albhe428@student.liu.se>
Date: Sun, 2 May 2021 09:13:43 +0200
Subject: [PATCH 7/8] Fix bug introduced in last commit

---
 client/src/pages/presentationEditor/PresentationEditorPage.tsx | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/client/src/pages/presentationEditor/PresentationEditorPage.tsx b/client/src/pages/presentationEditor/PresentationEditorPage.tsx
index caaaba46..d84944b4 100644
--- a/client/src/pages/presentationEditor/PresentationEditorPage.tsx
+++ b/client/src/pages/presentationEditor/PresentationEditorPage.tsx
@@ -122,7 +122,7 @@ const PresentationEditorPage: React.FC = () => {
       return
     }
     const draggedIndex = result.source.index
-    const draggedSlideId = sortedSlides.find((slide) => slide.order === draggedIndex)?.id
+    const draggedSlideId = sortedSlides[draggedIndex].id
     const slidesCopy = [...sortedSlides]
     const [removed] = slidesCopy.splice(draggedIndex, 1)
     slidesCopy.splice(result.destination.index, 0, removed)
-- 
GitLab


From e19cee096417015bdf5dd84b33591e1e8ef855ae Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Victor=20L=C3=B6fgren?= <viclo211@student.liu.se>
Date: Fri, 7 May 2021 18:33:56 +0200
Subject: [PATCH 8/8] Add some more comments to move_slides()

---
 server/app/database/controller/utils.py | 21 +++++++++++++++++++--
 1 file changed, 19 insertions(+), 2 deletions(-)

diff --git a/server/app/database/controller/utils.py b/server/app/database/controller/utils.py
index 70127a73..9662b08e 100644
--- a/server/app/database/controller/utils.py
+++ b/server/app/database/controller/utils.py
@@ -18,7 +18,6 @@ def move_slides(item_competition, from_order, to_order):
     assert 0 <= from_order < num_slides, "Invalid order to move from"
     assert 0 <= to_order < num_slides, "Invalid order to move to"
 
-    # TODO: Please improve this terrible piece of code
     # This function is sooo terrible, someone please tell me how to update
     # multiple values in the database at the same time with unique constraints.
     # If you update all the values at the same time none of them will collide
@@ -26,36 +25,54 @@ def move_slides(item_competition, from_order, to_order):
     # other value before and then change every value back to the correct one,
     # so 2 commits.
 
+    # An example will follow the entire code to make it clear what it does
+    # Lets say we have 5 slides, and we want to move the slide at index 1
+    # to index 4.
+    # We begin with a list of slides with orders [0, 1, 2, 3, 4]
+
     slides = item_competition.slides
 
     change = 1 if to_order < from_order else -1
     start_order = min(from_order, to_order)
     end_order = max(from_order, to_order)
 
+    # Move slides up 100
     for item_slide in slides:
         item_slide.order += 100
 
+    # Our slide orders now look like [100, 101, 102, 103, 104]
+
     # Move slides between from and to order either up or down, but minus in front
     for item_slide in slides:
         if start_order <= item_slide.order - 100 <= end_order:
             item_slide.order = -(item_slide.order + change)
 
+    # Our slide orders now look like [100, -100, -101, -102, -103]
+
     # Find the slide that was to be moved and change it to correct order with minus in front
     for item_slide in slides:
         if item_slide.order == -(from_order + change + 100):
             item_slide.order = -(to_order + 100)
             break
 
+    # Our slide orders now look like [100, -104, -101, -102, -103]
+
     db.session.commit()
 
-    # Negate all order so that they become correct and positive
+    # Negate all order so that they become positive
     for item_slide in slides:
         if start_order <= -(item_slide.order + 100) <= end_order:
             item_slide.order = -(item_slide.order)
 
+    # Our slide orders now look like [100, 104, 101, 102, 103]
+
     for item_slide in slides:
         item_slide.order -= 100
 
+    # Our slide orders now look like [0, 4, 1, 2, 3]
+
+    # We have now successfully moved slide 1 to 4
+
     return commit_and_refresh(item_competition)
 
 
-- 
GitLab