fix: Add task numbers to mobile task index
- Extract task number from title (#XX pattern) or Task ID field - Display task number in gold before title - Clean up redundant 'Task #XX:' from displayed title - Sort by priority, then task number, then title Chronicler #69
This commit is contained in:
@@ -91,11 +91,27 @@ module.exports = async function() {
|
|||||||
|
|
||||||
// Extract title from first H1
|
// Extract title from first H1
|
||||||
const titleMatch = content.match(/^#\s+(.+)$/m);
|
const titleMatch = content.match(/^#\s+(.+)$/m);
|
||||||
const title = titleMatch ? titleMatch[1] : dir.name;
|
let title = titleMatch ? titleMatch[1] : dir.name;
|
||||||
|
|
||||||
|
// Extract task number from title (e.g., "Task #87:" or "# Task #87")
|
||||||
|
let taskNumber = null;
|
||||||
|
const taskNumMatch = title.match(/#(\d+)/);
|
||||||
|
if (taskNumMatch) {
|
||||||
|
taskNumber = taskNumMatch[1];
|
||||||
|
} else {
|
||||||
|
// Try to find task number in content
|
||||||
|
const contentNumMatch = content.match(/\*\*Task ID:\*\*\s*#?(\d+)/i) ||
|
||||||
|
content.match(/Task #(\d+)/i) ||
|
||||||
|
content.match(/\*\*Task ID:\*\*\s*FFG-TASK-(\d+)/i);
|
||||||
|
if (contentNumMatch) {
|
||||||
|
taskNumber = contentNumMatch[1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
tasks.push({
|
tasks.push({
|
||||||
slug: dir.name,
|
slug: dir.name,
|
||||||
title: title,
|
title: title,
|
||||||
|
taskNumber: taskNumber,
|
||||||
status: frontmatter.status || 'open',
|
status: frontmatter.status || 'open',
|
||||||
priority: frontmatter.priority || 'P3',
|
priority: frontmatter.priority || 'P3',
|
||||||
owner: frontmatter.owner || 'Michael',
|
owner: frontmatter.owner || 'Michael',
|
||||||
@@ -109,11 +125,18 @@ module.exports = async function() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sort by priority (P1 first) then by title
|
// Sort by priority (P1 first) then by task number (if available) then by title
|
||||||
tasks.sort((a, b) => {
|
tasks.sort((a, b) => {
|
||||||
if (a.priority !== b.priority) {
|
if (a.priority !== b.priority) {
|
||||||
return a.priority.localeCompare(b.priority);
|
return a.priority.localeCompare(b.priority);
|
||||||
}
|
}
|
||||||
|
// Sort by task number if both have one
|
||||||
|
if (a.taskNumber && b.taskNumber) {
|
||||||
|
return parseInt(a.taskNumber) - parseInt(b.taskNumber);
|
||||||
|
}
|
||||||
|
// Tasks with numbers come before those without
|
||||||
|
if (a.taskNumber && !b.taskNumber) return -1;
|
||||||
|
if (!a.taskNumber && b.taskNumber) return 1;
|
||||||
return a.title.localeCompare(b.title);
|
return a.title.localeCompare(b.title);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -122,7 +145,6 @@ module.exports = async function() {
|
|||||||
|
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error('[11ty] Error fetching tasks:', err.message);
|
console.error('[11ty] Error fetching tasks:', err.message);
|
||||||
// Return empty array - page will still build, just with no tasks
|
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
42
node_modules/.package-lock.json
generated
vendored
42
node_modules/.package-lock.json
generated
vendored
@@ -1195,6 +1195,26 @@
|
|||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
|
"node_modules/node-fetch": {
|
||||||
|
"version": "2.7.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
|
||||||
|
"integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"whatwg-url": "^5.0.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": "4.x || >=6.0.0"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"encoding": "^0.1.0"
|
||||||
|
},
|
||||||
|
"peerDependenciesMeta": {
|
||||||
|
"encoding": {
|
||||||
|
"optional": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/node-retrieve-globals": {
|
"node_modules/node-retrieve-globals": {
|
||||||
"version": "6.0.1",
|
"version": "6.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/node-retrieve-globals/-/node-retrieve-globals-6.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/node-retrieve-globals/-/node-retrieve-globals-6.0.1.tgz",
|
||||||
@@ -1580,6 +1600,12 @@
|
|||||||
"node": ">=0.6"
|
"node": ">=0.6"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/tr46": {
|
||||||
|
"version": "0.0.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
|
||||||
|
"integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
"node_modules/uc.micro": {
|
"node_modules/uc.micro": {
|
||||||
"version": "2.1.0",
|
"version": "2.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz",
|
||||||
@@ -1604,6 +1630,22 @@
|
|||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
|
"node_modules/webidl-conversions": {
|
||||||
|
"version": "3.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
|
||||||
|
"integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
|
||||||
|
"license": "BSD-2-Clause"
|
||||||
|
},
|
||||||
|
"node_modules/whatwg-url": {
|
||||||
|
"version": "5.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
|
||||||
|
"integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"tr46": "~0.0.3",
|
||||||
|
"webidl-conversions": "^3.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/ws": {
|
"node_modules/ws": {
|
||||||
"version": "8.20.0",
|
"version": "8.20.0",
|
||||||
"resolved": "https://registry.npmjs.org/ws/-/ws-8.20.0.tgz",
|
"resolved": "https://registry.npmjs.org/ws/-/ws-8.20.0.tgz",
|
||||||
|
|||||||
@@ -136,11 +136,18 @@ permalink: /tasks-index.html
|
|||||||
text-decoration: underline;
|
text-decoration: underline;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.task-number {
|
||||||
|
color: var(--gold);
|
||||||
|
font-weight: 700;
|
||||||
|
margin-right: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
.priority-badge {
|
.priority-badge {
|
||||||
font-size: 0.75rem;
|
font-size: 0.75rem;
|
||||||
padding: 2px 8px;
|
padding: 2px 8px;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
|
white-space: nowrap;
|
||||||
}
|
}
|
||||||
|
|
||||||
.priority-badge.P1 { background: var(--fire); }
|
.priority-badge.P1 { background: var(--fire); }
|
||||||
@@ -208,7 +215,7 @@ permalink: /tasks-index.html
|
|||||||
<div class="task-header">
|
<div class="task-header">
|
||||||
<div class="task-title">
|
<div class="task-title">
|
||||||
<a href="{{ task.giteaUrl }}" target="_blank" rel="noopener">
|
<a href="{{ task.giteaUrl }}" target="_blank" rel="noopener">
|
||||||
{{ task.title }}
|
{% if task.taskNumber %}<span class="task-number">#{{ task.taskNumber }}</span>{% endif %}{{ task.title | replace("Task #" + task.taskNumber + ":", "") | replace("Task #" + task.taskNumber, "") | replace("Task:", "") | trim }}
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
<span class="priority-badge {{ task.priority }}">{{ task.priority }}</span>
|
<span class="priority-badge {{ task.priority }}">{{ task.priority }}</span>
|
||||||
|
|||||||
Reference in New Issue
Block a user