Skip to content

Commit 6436b0d

Browse files
committed
Queue Item Order Update - WIP
1 parent b975051 commit 6436b0d

6 files changed

Lines changed: 99 additions & 5 deletions

File tree

app.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,14 @@ def get_queue_paginated():
262262

263263
except Exception as e:
264264
return jsonify({'error': str(e)}), 500
265-
265+
266+
@app.route("/queue_item/<int:queue_id>/order", methods=['PUT'])
267+
@jwt_required()
268+
def update_item_order(queue_id):
269+
data = request.get_json()
270+
new_order = data.get('new_order')
271+
handler = QueueItem(email=get_jwt_identity())
272+
return handler.update_item_order(queue_id=queue_id, new_order=new_order)
266273

267274
@app.route("/queue_item", methods=['GET', 'POST'])
268275
def handleQueueItem():

controller/queue_item.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,21 @@ def updateQueueItemById(self, queue_id, data):
7474
result = self.make_json_one(queue_item)
7575
return result
7676

77+
def update_item_order(self, queue_id, new_order):
78+
79+
if queue_id is None:
80+
return jsonify(error="No id provided."), 400
81+
82+
if self.user.is_admin():
83+
queue_dao = QueueItemDAO()
84+
response = queue_dao.update_item_order(queue_id, new_order)
85+
if response == 0:
86+
return jsonify("Approval updated"), 200
87+
else:
88+
return jsonify(error="Couldn't update approval"), 500
89+
else:
90+
return jsonify(error="Unauthorized."), 403
91+
7792
def deleteQueueItemById(self, queue_id):
7893
dao = QueueItemDAO()
7994
queue_item = dao.deleteQueueItemById(queue_id)

model/queue_item.py

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,29 @@ def updateQueueItemById(self, queue_id, data):
7979
cursor.execute(query, (queue_id,))
8080
result = cursor.fetchone()
8181
cursor.close()
82-
return result
82+
return
83+
84+
def update_item_order(self, queue_id: int, new_order: int):
85+
status = 1
86+
query = None
87+
cursor = self.conn.cursor()
88+
old_order = self.getQueueItemById(queue_id)["display_order"]
89+
if new_order < old_order:
90+
query = "UPDATE queue_item SET display_order = display_order + 1 WHERE display_order >= ? AND display_order < ?"
91+
elif new_order > old_order:
92+
query = "UPDATE queue_item SET display_order = display_order - 1 WHERE display_order <= ? AND display_order > ?"
93+
try:
94+
if query:
95+
cursor.execute(query, (new_order, old_order))
96+
shift = "UPDATE queue_item SET display_order = ? WHERE queue_id = ?"
97+
cursor.execute(shift,(new_order, queue_id))
98+
self.conn.commit()
99+
status = 0
100+
except sqlite3.Error:
101+
status = 1
102+
finally:
103+
cursor.close()
104+
return status
83105

84106
def deleteQueueItemById(self, queue_id):
85107

@@ -96,6 +118,16 @@ def deleteQueueItemById(self, queue_id):
96118
status = 0
97119
try:
98120
cursor.execute(query, (queue_id,))
121+
122+
query = "SELECT queue_id FROM queue_item ORDER BY display_order ASC"
123+
124+
cursor.execute(query)
125+
items = cursor.fetchall()
126+
127+
for index, item in enumerate(items):
128+
query = "UPDATE queue_item SET display_order = ? WHERE queue_id = ?"
129+
cursor.execute(query, (index + 1, item[0]))
130+
99131
self.conn.commit()
100132
except sqlite3.Error:
101133
status = 1

utilities/create.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import sqlite3
22

3-
con = sqlite3.connect('data.db')
3+
con = sqlite3.connect('../data.db')
44
cur = con.cursor()
55

66
cur.execute("""

view/src/auth/AuthProvider.jsx

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,19 @@ export const AuthProvider = ({ children }) => {
202202
};
203203
}
204204
};
205+
// Update order of queue item
206+
const updateorder = async (queueId, newOrder) => {
207+
try {
208+
await axios.put(`/queue_item/${queueId}/order`, { new_order: newOrder });
209+
return { success: true };
210+
} catch (error) {
211+
console.error('Order update error:', error);
212+
return {
213+
success: false,
214+
error: error.response?.data?.error || 'Failed to update admin status'
215+
};
216+
}
217+
};
205218

206219
const deletequeueitem = async (queueId) => {
207220
try {
@@ -236,6 +249,7 @@ export const AuthProvider = ({ children }) => {
236249
toggleadmin,
237250
getpageimages,
238251
toggleapproval,
252+
updateorder,
239253
deletequeueitem,
240254
logout,
241255
hasRole,

view/src/pages/QueueAdminPage.jsx

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ function QueueAdminPage() {
1212
const [items, setItems] = useState([]);
1313
const [page, setPage] = useState(1);
1414
const [pages, setPages] = useState(1);
15-
const { getpageimages, deletequeueitem, toggleapproval } = useAuth();
15+
const [total, setTotal] = useState(0);
16+
const { getpageimages, deletequeueitem, toggleapproval, updateorder } = useAuth();
1617

1718
const [modalState, setModalState] = useState({
1819
isOpen: false,
@@ -54,6 +55,7 @@ function QueueAdminPage() {
5455
setItems(transformed);
5556
setPage(data.page);
5657
setPages(data.pages);
58+
setTotal(data.total)
5759
} catch (err) {
5860
console.error("Failed to load queue images:", err);
5961
}
@@ -72,6 +74,15 @@ function QueueAdminPage() {
7274
}
7375
};
7476

77+
const handleOrderUpdate = async (queueId, newOrder) => {
78+
try {
79+
await updateorder(queueId, newOrder);
80+
fetchImages(page);
81+
} catch (err) {
82+
console.error("Order update failed:", err);
83+
}
84+
};
85+
7586
const handleToggleApproval = async (designId, isApproved) => {
7687
try {
7788
await toggleapproval(designId, !isApproved);
@@ -122,7 +133,22 @@ function QueueAdminPage() {
122133
<strong>Scheduled at:</strong> { formatDateTime(item?.start_time) || 'Unscheduled'}
123134
</div>
124135
<div className="text-base">
125-
<strong>Order:</strong> {item.display_order}
136+
<strong>Order:</strong> {" "}
137+
<select
138+
value={item.display_order}
139+
onChange={(e) =>
140+
showConfirm(
141+
`Move item to position ${e.target.value}?`,
142+
() => handleOrderUpdate(item.queue_id, Number(e.target.value))
143+
)
144+
}
145+
>
146+
{Array.from({ length: total }).map((_, idx) => (
147+
<option key={idx + 1} value={idx + 1}>
148+
{idx + 1}
149+
</option>
150+
))}
151+
</select>
126152
</div>
127153
</div>
128154
<div className="user-buttons">

0 commit comments

Comments
 (0)