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