diff --git a/public/src/admin/extend/rewards.js b/public/src/admin/extend/rewards.js index 109c84695aa2..805b217193c2 100644 --- a/public/src/admin/extend/rewards.js +++ b/public/src/admin/extend/rewards.js @@ -1,10 +1,12 @@ 'use strict'; -define('admin/extend/rewards', ['alerts'], function (alerts) { +define('admin/extend/rewards', [ + 'alerts', + 'jquery-ui/widgets/sortable', +], function (alerts) { const rewards = {}; - let available; let active; let conditions; @@ -45,6 +47,11 @@ define('admin/extend/rewards', ['alerts'], function (alerts) { btn.addClass('hidden'); // send disable api call return false; + }) + .sortable({ + handle: '[component="sort/handle"]', + axis: 'y', + zIndex: 9999, }); $('#new').on('click', newReward); diff --git a/src/rewards/admin.js b/src/rewards/admin.js index cddbec401b57..1379c89e66b4 100644 --- a/src/rewards/admin.js +++ b/src/rewards/admin.js @@ -7,7 +7,7 @@ const utils = require('../utils'); const rewards = module.exports; rewards.save = async function (data) { - async function save(data) { + await Promise.all(data.map(async (data, index) => { if (!Object.keys(data.rewards).length) { return; } @@ -17,19 +17,17 @@ rewards.save = async function (data) { data.id = await db.incrObjectField('global', 'rewards:id'); } await rewards.delete(data); - await db.setAdd('rewards:list', data.id); + await db.sortedSetAdd('rewards:list', index, data.id); await db.setObject(`rewards:id:${data.id}`, data); await db.setObject(`rewards:id:${data.id}:rewards`, rewardsData); - } - - await Promise.all(data.map(data => save(data))); + })); await saveConditions(data); return data; }; rewards.delete = async function (data) { await Promise.all([ - db.setRemove('rewards:list', data.id), + db.sortedSetRemove('rewards:list', data.id), db.delete(`rewards:id:${data.id}`), db.delete(`rewards:id:${data.id}:rewards`), ]); @@ -61,7 +59,8 @@ async function saveConditions(data) { } async function getActiveRewards() { - async function load(id) { + const rewardsList = await db.getSortedSetRange('rewards:list', 0, -1); + const rewardData = await Promise.all(rewardsList.map(async (id) => { const [main, rewards] = await Promise.all([ db.getObject(`rewards:id:${id}`), db.getObject(`rewards:id:${id}:rewards`), @@ -71,11 +70,7 @@ async function getActiveRewards() { main.rewards = rewards; } return main; - } - - const rewardsList = await db.getSetMembers('rewards:list'); - rewardsList.sort((a, b) => a - b); - const rewardData = await Promise.all(rewardsList.map(id => load(id))); + })); return rewardData.filter(Boolean); } diff --git a/src/upgrades/3.6.0/rewards_zsets.js b/src/upgrades/3.6.0/rewards_zsets.js new file mode 100644 index 000000000000..026d5ec7fc4c --- /dev/null +++ b/src/upgrades/3.6.0/rewards_zsets.js @@ -0,0 +1,22 @@ +/* eslint-disable no-await-in-loop */ + +'use strict'; + +const db = require('../../database'); + +module.exports = { + name: 'Convert rewards:list to a sorted set', + timestamp: Date.UTC(2023, 10, 10), + method: async function () { + const rewards = await db.getSetMembers('rewards:list'); + if (rewards.length) { + rewards.sort((a, b) => a - b); + await db.delete('rewards:list'); + await db.sortedSetAdd( + 'rewards:list', + rewards.map((id, index) => index), + rewards.map(id => id) + ); + } + }, +}; diff --git a/src/views/admin/extend/rewards.tpl b/src/views/admin/extend/rewards.tpl index 1477430decbb..fb5673191279 100644 --- a/src/views/admin/extend/rewards.tpl +++ b/src/views/admin/extend/rewards.tpl @@ -16,59 +16,64 @@