feat: use updated and dynamic error codes for support pages

This commit is contained in:
Jonathan Barrow 2024-05-01 17:20:35 -04:00
parent 7e1c746bd6
commit 5bd21a3d3e
No known key found for this signature in database
GPG Key ID: E86E9FE9049C741F
6 changed files with 92 additions and 27 deletions

View File

@ -0,0 +1,22 @@
# Error Code: {module}-{code}
**Applies to:** {system}
---
## Message
> {message}
## Cause
{description}
### Solution
{solution}
---
If you have not yet connected to Pretendo, please follow the instructions [here](/docs/install) to get started.
If you are still unable to connect, please request to speak to a moderator in the [Discord server](https://invite.gg/pretendo).

11
package-lock.json generated
View File

@ -11,6 +11,7 @@
"dependencies": {
"@aws-sdk/client-ses": "^3.515.0",
"@discordjs/rest": "^0.5.0",
"@pretendonetwork/error-codes": "^1.0.1",
"browserify": "^17.0.0",
"colors": "^1.4.0",
"cookie-parser": "^1.4.5",
@ -1418,6 +1419,11 @@
"sparse-bitfield": "^3.0.3"
}
},
"node_modules/@pretendonetwork/error-codes": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@pretendonetwork/error-codes/-/error-codes-1.0.1.tgz",
"integrity": "sha512-Hops4bCHUW9KFjkw9xP7S7kB/NAsvv2OhVQCLbC3toyJA3KhZ08GJKQJfVB5bDQ2txiA3lvKxw9et/2bNTZcng=="
},
"node_modules/@sapphire/async-queue": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.3.1.tgz",
@ -7512,6 +7518,11 @@
"sparse-bitfield": "^3.0.3"
}
},
"@pretendonetwork/error-codes": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@pretendonetwork/error-codes/-/error-codes-1.0.1.tgz",
"integrity": "sha512-Hops4bCHUW9KFjkw9xP7S7kB/NAsvv2OhVQCLbC3toyJA3KhZ08GJKQJfVB5bDQ2txiA3lvKxw9et/2bNTZcng=="
},
"@sapphire/async-queue": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.3.1.tgz",

View File

@ -24,6 +24,7 @@
"dependencies": {
"@aws-sdk/client-ses": "^3.515.0",
"@discordjs/rest": "^0.5.0",
"@pretendonetwork/error-codes": "^1.0.1",
"browserify": "^17.0.0",
"colors": "^1.4.0",
"cookie-parser": "^1.4.5",

View File

@ -1,8 +1,11 @@
const path = require('node:path');
const fs = require('node:fs');
const { Router } = require('express');
const router = new Router();
const errors = require('@pretendonetwork/error-codes');
const util = require('../util');
const errorList = require('../../docs/common/errorList.json');
const errorList = errors.getAllErrors();
const router = new Router();
router.get('/', async (request, response) => {
response.redirect('/docs/welcome');
@ -24,14 +27,22 @@ router.get('/install', async (request, response) => {
response.render('docs/install', renderData);
});
router.get('/search', async (request, response) => {
router.get([
'/search', // TODO - Deprecate search page
'/errors',
], async (_request, response) => {
const renderData = {
errorList: JSON.stringify(errorList),
currentPage: 'search',
};
response.render('docs/search', renderData);
});
router.get('/error', async (_request, response) => {
response.redirect(301, '/docs/errors');
});
router.get('/:page', async (request, response, next) => {
const renderData = {};
@ -50,6 +61,43 @@ router.get('/:page', async (request, response, next) => {
response.render('docs/docs', renderData);
});
router.get([
'/errors/:errorCode', // TODO - Deprecate search errors route
'/error/:errorCode',
], async (request, response, next) => {
const locale = response.locals.localeString;
const error = request.params.errorCode;
const [ sysmodule, errorCode ] = error.split('-');
if (!errorCode) {
return next();
}
let template = fs.readFileSync(path.join(__dirname, '../../docs/common/error-page-template.md'), {
encoding: 'utf8'
});
const errorInfo = errors.getErrorInfo(sysmodule, errorCode, locale);
if (!errorInfo) {
return next();
}
template = template.replace('{module}', sysmodule);
template = template.replace('{code}', errorCode);
template = template.replace('{system}', errorInfo.module.system);
template = template.replace('{message}', errorInfo.message.replace(/\s\s+/g, ' '));
template = template.replace('{description}', errorInfo.long_description);
template = template.replace('{solution}', errorInfo.long_solution);
const renderData = {
content: util.parseDocs(template)
};
response.render('docs/docs', renderData);
});
router.get('/:subpath/:page', async (request, response, next) => {
const locale = response.locals.localeString;
const pageName = request.params.page;

View File

@ -45,12 +45,11 @@
<p>{{ locale.docs.search.caption }}</p>
<label for="errorCode">{{ locale.docs.search.label }}</label>
<div class="input-wrapper">
<input id="errorCode" placeholder="ABC-012-3456" required />
<input id="errorCode" placeholder="012-3456" required />
<div class="matches">
</div>
</div>
</div>
</div>
</div>
</div>
@ -58,30 +57,14 @@
{{#section 'foot'}}
<script src="/assets/js/docssidebarhandler.js"></script>
<script id="errorList" type="application/json">
{{{errorList}}}
</script>
<script src="https://cdn.jsdelivr.net/npm/fuse.js@6.6.2/dist/fuse.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/cleave.js@1.6.0/dist/cleave.min.js"></script>
<script>
// Get the error list from the script tag
let rawErrorList = JSON.parse(document.getElementById('errorList').innerHTML);
// Convert the error list to a single flat array
rawErrorList = Object.values(rawErrorList).flat();
// We remove the unknown characters (e.g. the X in JXT-598-2XXX), so fuse.js will be able to match the error codes
const errorList = rawErrorList.map(error => {
return error.replace(/X*$/g, '');
});
const fuse = new Fuse(errorList, {includeMatches: true, threshold: 0.4});
const fuse = new Fuse({{{errorList}}}, {includeMatches: true, threshold: 0.4});
const cleave = new Cleave('input#errorCode', {
delimiter: '-',
blocks: [3, 3, 4],
uppercase: true
blocks: [3, 4]
});
const matchesContainer = document.querySelector('.matches');
@ -102,10 +85,10 @@
if (matches.length > 0) {
matches.forEach(match => {
const errorCode = match.item.padEnd(12, 'X');
const errorCode = match.item;
const matchLink = document.createElement('a');
matchLink.innerText = errorCode;
matchLink.href = `/docs/errors/${errorCode}`;
matchLink.href = `/docs/error/${errorCode}`;
matchesContainer.appendChild(matchLink);
});
} else {

View File

@ -112,7 +112,7 @@
<p class="caption">{{ locale.docs.quickLinks.links.[0].caption }}</p>
</div>
</a>
<a href="/docs/search">
<a href="/docs/errors">
<div class="icon">
<svg width="32" height="32" viewBox="0 0 256 256"><path fill="currentColor" d="M236.7 188L148.8 36a24 24 0 0 0-41.6 0L19.3 188A23.9 23.9 0 0 0 40 224h176a23.9 23.9 0 0 0 20.7-36ZM120 104a8 8 0 0 1 16 0v40a8 8 0 0 1-16 0Zm8 88a12 12 0 1 1 12-12a12 12 0 0 1-12 12Z"/></svg> </div>
<div>
@ -179,7 +179,7 @@
<p class="caption">{{ locale.docs.quickLinks.links.[0].caption }}</p>
</div>
</a>
<a href="/docs/search">
<a href="/docs/errors">
<div class="icon">
<svg width="32" height="32" viewBox="0 0 256 256"><path fill="currentColor" d="M236.7 188L148.8 36a24 24 0 0 0-41.6 0L19.3 188A23.9 23.9 0 0 0 40 224h176a23.9 23.9 0 0 0 20.7-36ZM120 104a8 8 0 0 1 16 0v40a8 8 0 0 1-16 0Zm8 88a12 12 0 1 1 12-12a12 12 0 0 1-12 12Z"/></svg> </div>
<div>