Skip to content

Commit ba557fc

Browse files
committed
task-list-sorting
1 parent b4bdbe4 commit ba557fc

6 files changed

Lines changed: 93 additions & 21 deletions

File tree

static/js/task.js

Lines changed: 45 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -564,6 +564,17 @@ function getCompletedItemIds(elementTarget) {
564564
.filter((value) => !Number.isNaN(value));
565565
}
566566

567+
function getSelectedItemIds(elementTarget) {
568+
const hiddenInput = elementTarget.querySelector('.selected-item-ids');
569+
if (!hiddenInput || !hiddenInput.value) {
570+
return [];
571+
}
572+
return hiddenInput.value
573+
.split(',')
574+
.map((value) => parseInt(value.trim(), 10))
575+
.filter((value) => !Number.isNaN(value));
576+
}
577+
567578
function getTaskMetaValue(elementTarget, selector) {
568579
const node = elementTarget.querySelector(selector);
569580
return node ? node.value : '';
@@ -574,17 +585,26 @@ function getRelatedCompletedItemIds(elementTarget, taskName) {
574585
return [];
575586
}
576587

577-
const allCompletedTaskNodes = document.querySelectorAll('.content-container.revertButton');
578-
const aggregatedIds = new Set();
588+
const currentTaskRecordedIds = new Set(getSelectedItemIds(elementTarget));
589+
const allTaskNodes = document.querySelectorAll('.content-container');
590+
const aggregatedIds = new Set(getCompletedItemIds(elementTarget));
591+
592+
allTaskNodes.forEach((taskNode) => {
593+
if (taskNode === elementTarget) {
594+
return;
595+
}
579596

580-
allCompletedTaskNodes.forEach((taskNode) => {
581597
const taskNameNode = taskNode.querySelector('.task-name');
582598
if (!taskNameNode || taskNameNode.value !== taskName) {
583599
return;
584600
}
585601

586602
const itemIds = getCompletedItemIds(taskNode);
587-
itemIds.forEach((itemId) => aggregatedIds.add(itemId));
603+
itemIds.forEach((itemId) => {
604+
if (!currentTaskRecordedIds.has(itemId)) {
605+
aggregatedIds.add(itemId);
606+
}
607+
});
588608
});
589609

590610
return Array.from(aggregatedIds);
@@ -820,9 +840,10 @@ function openTaskActionModal(options) {
820840
normalizedItemIds.forEach((itemId) => {
821841
const isRecorded = selectedItemIds.has(itemId);
822842
const isRelatedRecorded = relatedCompletedIds.has(itemId);
823-
const isObtained = isRecorded || isRelatedRecorded;
843+
const isRelatedOnly = !isRecorded && isRelatedRecorded;
844+
const isObtained = isRecorded || isRelatedOnly;
824845
const image = document.createElement('img');
825-
image.className = `task-action-item ${isObtained ? 'task-action-item-active' : 'task-action-item-muted'} ${isRecorded ? 'task-action-item-selected' : ''}`;
846+
image.className = `task-action-item ${isObtained ? '' : 'task-action-item-muted'} ${isRelatedOnly ? 'task-action-item-active' : ''} ${isRecorded ? 'task-action-item-selected' : ''}`;
826847
attachFallbackImage(image, '/static/clog.png');
827848
image.src = `https://static.runelite.net/cache/item/icon/${itemId}.png`;
828849
image.alt = `Item ${itemId}`;
@@ -902,7 +923,7 @@ $(document).ready(function(){
902923
var elementTarget = this;
903924
var parent = elementTarget.parentElement;
904925
const verificationItemIds = getVerificationItemIds(elementTarget);
905-
const completedItemIds = getCompletedItemIds(elementTarget);
926+
const completedItemIds = getSelectedItemIds(elementTarget);
906927
const taskName = getTaskMetaValue(elementTarget, '.task-name');
907928
const relatedCompletedItemIds = getRelatedCompletedItemIds(elementTarget, taskName);
908929
const taskTip = getTaskMetaValue(elementTarget, '.task-tip');
@@ -943,10 +964,17 @@ $(document).ready(function(){
943964
taskTextNodes[1].textContent = formatUserDateTime(data.completedAtISO);
944965
taskTextNodes[1].setAttribute('data-completed-at', data.completedAtISO || '');
945966
}
946-
const completedIdsNode = elementTarget.querySelector('.completed-item-ids');
947-
if (completedIdsNode) {
967+
const selectedIdsNode = elementTarget.querySelector('.selected-item-ids');
968+
if (selectedIdsNode) {
969+
const returnedIds = Array.isArray(data.completedItemIds) ? data.completedItemIds : [];
970+
selectedIdsNode.value = returnedIds.join(',');
971+
}
972+
const relatedIdsNode = elementTarget.querySelector('.completed-item-ids');
973+
if (relatedIdsNode) {
974+
const existingRelatedIds = getCompletedItemIds(elementTarget);
948975
const returnedIds = Array.isArray(data.completedItemIds) ? data.completedItemIds : [];
949-
completedIdsNode.value = returnedIds.join(',');
976+
const mergedIds = Array.from(new Set(existingRelatedIds.concat(returnedIds))).sort((a, b) => a - b);
977+
relatedIdsNode.value = mergedIds.join(',');
950978
}
951979
if (tier === 'bossPets' || tier === 'skillPets' || tier === 'otherPets'){
952980
updatePercent.innerHTML = data["allPets"] + '%';
@@ -986,7 +1014,7 @@ $(document).ready(function(){
9861014
var elementTarget = this;
9871015
var parent = elementTarget.parentElement;
9881016
const verificationItemIds = getVerificationItemIds(elementTarget);
989-
const completedItemIds = getCompletedItemIds(elementTarget);
1017+
const completedItemIds = getSelectedItemIds(elementTarget);
9901018
const taskName = getTaskMetaValue(elementTarget, '.task-name');
9911019
const relatedCompletedItemIds = getRelatedCompletedItemIds(elementTarget, taskName);
9921020
const taskTip = getTaskMetaValue(elementTarget, '.task-tip');
@@ -1028,10 +1056,10 @@ $(document).ready(function(){
10281056
taskTextNodes[1].textContent = formatUserDateTime(data.completedAtISO);
10291057
taskTextNodes[1].setAttribute('data-completed-at', data.completedAtISO || '');
10301058
}
1031-
const completedIdsNode = elementTarget.querySelector('.completed-item-ids');
1032-
if (completedIdsNode) {
1059+
const selectedIdsNode = elementTarget.querySelector('.selected-item-ids');
1060+
if (selectedIdsNode) {
10331061
const returnedIds = Array.isArray(data.completedItemIds) ? data.completedItemIds : [];
1034-
completedIdsNode.value = returnedIds.join(',');
1062+
selectedIdsNode.value = returnedIds.join(',');
10351063
}
10361064
if (tier === 'bossPets' || tier === 'skillPets' || tier === 'otherPets'){
10371065
updatePercent.innerHTML = data["allPets"] + '%';
@@ -1073,9 +1101,9 @@ $(document).ready(function(){
10731101
taskTextNodes[1].textContent = '--/--/---- --:--';
10741102
taskTextNodes[1].setAttribute('data-completed-at', '');
10751103
}
1076-
const completedIdsNode = elementTarget.querySelector('.completed-item-ids');
1077-
if (completedIdsNode) {
1078-
completedIdsNode.value = '';
1104+
const selectedIdsNode = elementTarget.querySelector('.selected-item-ids');
1105+
if (selectedIdsNode) {
1106+
selectedIdsNode.value = '';
10791107
}
10801108
if (tier === 'bossPets' || tier === 'skillPets' || tier === 'otherPets'){
10811109
updatePercent.innerHTML = data["allPets"] + '%';

static/styles.css

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -674,6 +674,11 @@ hr {
674674
border-color: var(--complete-color);
675675
}
676676

677+
.task-action-item-selected {
678+
border-color: var(--current-task-color);
679+
box-shadow: inset 0 0 0 1px var(--current-task-color);
680+
}
681+
677682
.task-action-item-muted {
678683
filter: grayscale(1);
679684
opacity: 0.45;

task_database.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -796,6 +796,10 @@ def existing_completed_date_map(completed_tasks):
796796
if task_id in tier_date_map:
797797
imported_task['completedDate'] = tier_date_map[task_id]
798798

799+
for tier_tasks in all_tasks:
800+
for imported_task in tier_tasks:
801+
imported_task['completedItemIds'] = []
802+
799803
imported_recorded_easy = sanitize_recorded_map(recorded_item_ids_by_tier.get('easy', {}))
800804
imported_recorded_medium = sanitize_recorded_map(recorded_item_ids_by_tier.get('medium', {}))
801805
imported_recorded_hard = sanitize_recorded_map(recorded_item_ids_by_tier.get('hard', {}))

task_types.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ def __init__(self, is_completed: bool, is_current: bool, task_data: TaskData,
5656
completed_date = None, completed_date_iso: str = None,
5757
verification_item_ids: list[int] = None,
5858
verification_required_count: int = None,
59+
related_item_ids: list[int] = None,
5960
completed_item_ids: list[int] = None):
6061
self.name = task_data.name
6162
self.is_completed = is_completed
@@ -68,6 +69,7 @@ def __init__(self, is_completed: bool, is_current: bool, task_data: TaskData,
6869
self.completed_date_iso = completed_date_iso
6970
self.verification_item_ids = verification_item_ids or []
7071
self.verification_required_count = verification_required_count
72+
self.related_item_ids = related_item_ids or []
7173
self.completed_item_ids = completed_item_ids or []
7274

7375
@dataclass

templates/task-list.html

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,8 @@ <h1>{{task_type|capitalize}} Task List</h1>
4747
{% if task.verification_item_ids %}
4848
<input type="hidden" class="verification-item-ids" value="{{task.verification_item_ids|join(',')}}">
4949
{% endif %}
50-
<input type="hidden" class="completed-item-ids" value="{{task.completed_item_ids|join(',')}}">
50+
<input type="hidden" class="completed-item-ids" value="{{task.related_item_ids|join(',')}}">
51+
<input type="hidden" class="selected-item-ids" value="{{task.completed_item_ids|join(',')}}">
5152
<input type="hidden" class="task-tip" value="{{task.tip or ''}}">
5253
<input type="hidden" class="task-name" value="{{task.name}}">
5354
<input type="hidden" class="task-wiki-link" value="{{task.wiki_link}}">
@@ -110,7 +111,8 @@ <h1>{{task_type|capitalize}} Task List</h1>
110111
{% if task.verification_item_ids %}
111112
<input type="hidden" class="verification-item-ids" value="{{task.verification_item_ids|join(',')}}">
112113
{% endif %}
113-
<input type="hidden" class="completed-item-ids" value="{{task.completed_item_ids|join(',')}}">
114+
<input type="hidden" class="completed-item-ids" value="{{task.related_item_ids|join(',')}}">
115+
<input type="hidden" class="selected-item-ids" value="{{task.completed_item_ids|join(',')}}">
114116
<input type="hidden" class="task-tip" value="{{task.tip or ''}}">
115117
<input type="hidden" class="task-name" value="{{task.name}}">
116118
<input type="hidden" class="task-wiki-link" value="{{task.wiki_link}}">

user_dao.py

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,8 @@ def completed_date_to_iso(value) -> str | None:
138138
def page_task(task: TaskData):
139139
completed_task = completed_task_lookup.get(task.id)
140140
completed_date = completed_task.completed_date if completed_task is not None else None
141-
completed_item_ids = recorded_item_ids_by_task.get(task.id, [])
141+
related_item_ids = recorded_item_ids_by_task.get(task.id, [])
142+
completed_item_ids = []
142143
if completed_task is not None and completed_task.completed_item_ids:
143144
completed_item_ids = completed_task.completed_item_ids
144145
verification_item_ids = []
@@ -153,9 +154,39 @@ def page_task(task: TaskData):
153154
completed_date_iso=completed_date_to_iso(completed_date),
154155
verification_item_ids=verification_item_ids,
155156
verification_required_count=verification_required_count,
157+
related_item_ids=related_item_ids,
156158
completed_item_ids=completed_item_ids)
157159

158-
return list(map(page_task, tasklists.list_for_tier(tier, self.lms_enabled)))
160+
tier_tasks = list(map(page_task, tasklists.list_for_tier(tier, self.lms_enabled)))
161+
162+
tasks_by_name: dict[str, list[PageTask]] = {}
163+
ordered_names: list[str] = []
164+
for task in tier_tasks:
165+
if task.name not in tasks_by_name:
166+
tasks_by_name[task.name] = []
167+
ordered_names.append(task.name)
168+
tasks_by_name[task.name].append(task)
169+
170+
def status_sort_key(task: PageTask, has_current_for_name: bool) -> int:
171+
if has_current_for_name:
172+
if task.is_current:
173+
return 0
174+
if task.is_completed:
175+
return 1
176+
return 2
177+
178+
if task.is_completed:
179+
return 0
180+
return 1
181+
182+
ordered_tasks: list[PageTask] = []
183+
for task_name in ordered_names:
184+
grouped_tasks = tasks_by_name[task_name]
185+
has_current_for_name = any(task.is_current for task in grouped_tasks)
186+
grouped_tasks = sorted(grouped_tasks, key=lambda task: status_sort_key(task, has_current_for_name))
187+
ordered_tasks.extend(grouped_tasks)
188+
189+
return ordered_tasks
159190

160191

161192
def task_info_for_id(task_list: list[TaskData], task_id: str) -> tasklists.TaskData:

0 commit comments

Comments
 (0)