mirror of
https://github.com/PretendoNetwork/website.git
synced 2026-03-21 17:24:28 -05:00
feat: use updated and dynamic error codes for support pages
This commit is contained in:
parent
7e1c746bd6
commit
5bd21a3d3e
22
docs/common/error-page-template.md
Normal file
22
docs/common/error-page-template.md
Normal 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
11
package-lock.json
generated
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user