Skip to content

Commit 7698387

Browse files
committed
feat: show documentation URL for rules
This embeds a link to the actual documentation, if provided via `meta?.documentation?.url`. Related to bpmn-io/bpmnlint#165 Closes #92 feat: show rule name with report This simplifies things, i.e. users are able to learn about the source of rules.
1 parent 400aa58 commit 7698387

File tree

5 files changed

+47
-33
lines changed

5 files changed

+47
-33
lines changed

assets/css/bpmn-js-bpmnlint.css

+8-2
Original file line numberDiff line numberDiff line change
@@ -148,12 +148,18 @@
148148
--icon-color: var(--bjsl-color-info);
149149
}
150150

151-
.bjsl-issues a {
151+
.bjsl-issues .message {
152152
color: var(--bjsl-font-color);
153-
margin-left: 8px;
153+
margin-left: .5em;
154154
text-decoration: none;
155155
}
156156

157+
.bjsl-issues .rule {
158+
color: var(--bjsl-font-color);
159+
margin-left: .5em;
160+
font-family: monospace;
161+
}
162+
157163
.bjsl-issues .bjsl-issue-heading {
158164
margin-left: 0px;
159165
font-weight: bold;

lib/Linting.js

+13-14
Original file line numberDiff line numberDiff line change
@@ -468,25 +468,24 @@ Linting.prototype._addInfos = function($ul, infos) {
468468
Linting.prototype._addEntry = function($ul, state, entry) {
469469

470470
var rule = entry.rule,
471+
documentationUrl = entry.meta?.documentation.url,
471472
message = this._translate(entry.message),
472473
actualElementId = entry.actualElementId;
473474

474475
var icon = stateToIcon[state];
475476

476-
var $entry = domify(
477-
'<li class="' + state + '">' +
478-
'<span class="icon"> ' + icon + '</span>' +
479-
'<a title="' + escapeHTML(rule) + ': ' + escapeHTML(message) + '" ' +
480-
'data-rule="' + escapeHTML(rule) + '" ' +
481-
'data-message="' + escapeHTML(message) + '"' +
482-
'>' +
483-
escapeHTML(message) +
484-
'</a>' +
485-
(actualElementId
486-
? '<a class="bjsl-id-hint"><code>' + actualElementId + '</code></a>'
487-
: '') +
488-
'</li>'
489-
);
477+
var $entry = domify(`
478+
<li class="${ state }" data-rule="${ escapeHTML(rule) }">
479+
<span class="icon">${ icon }</span>
480+
<span class="message">${ escapeHTML(message) }</span>
481+
<span class="rule">(${ documentationUrl
482+
? `<a href="${ escapeHTML(documentationUrl) }" target="_blank">${ escapeHTML(rule) }</a>`
483+
: escapeHTML(rule) })</span>
484+
${ actualElementId
485+
? `<span class="bjsl-id-hint"><code>${ escapeHTML(actualElementId) }</code></span>`
486+
: '' }
487+
</li>
488+
`);
490489

491490
$ul.appendChild($entry);
492491
};

package-lock.json

+9-9
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
"@rollup/plugin-node-resolve": "^16.0.0",
3737
"@rollup/plugin-terser": "^0.4.4",
3838
"bpmn-js": "^18.3.0",
39-
"bpmnlint": "^11.0.0",
39+
"bpmnlint": "^11.2.0",
4040
"bpmnlint-loader": "^0.1.6",
4141
"chai": "^4.5.0",
4242
"cpx2": "^8.0.0",

test/spec/LintingSpec.js

+16-7
Original file line numberDiff line numberDiff line change
@@ -505,13 +505,22 @@ describe('linting - ui', function() {
505505

506506
// then
507507
const errorEntry = el.querySelector(
508-
'a' +
509-
'[title="label-required: Element is missing label/name"]' +
510-
'[data-rule="label-required"]' +
511-
'[data-message="Element is missing label/name"]'
508+
'[data-rule="label-required"]'
512509
);
513510
expect(errorEntry).to.exist;
514-
expect(errorEntry.innerText).to.equal('Element is missing label/name');
511+
512+
const messageEntry = errorEntry.querySelector('.message');
513+
expect(messageEntry).to.exist;
514+
expect(messageEntry.textContent).to.eql('Element is missing label/name');
515+
516+
const ruleEntry = errorEntry.querySelector('.rule');
517+
expect(ruleEntry).to.exist;
518+
expect(ruleEntry.textContent).to.eql('(label-required)');
519+
520+
const documentationLink = ruleEntry.querySelector('a');
521+
expect(documentationLink).to.exist;
522+
expect(documentationLink.href).to.eql('https://github.com/bpmn-io/bpmnlint/blob/main/docs/rules/label-required.md');
523+
expect(documentationLink.textContent).to.eql('label-required');
515524
});
516525

517526
});
@@ -728,9 +737,9 @@ describe('linting - i18n', function() {
728737
const buttonText = button.textContent;
729738
expect(buttonText.trim()).to.equal('16 помилок, 0 попередженнь');
730739

731-
const endEventRequiredMessage = el.querySelector('a[data-rule="end-event-required"]');
740+
const endEventRequiredMessage = el.querySelector('[data-rule="end-event-required"] .message');
732741
expect(endEventRequiredMessage).to.exist;
733-
expect(endEventRequiredMessage.dataset.message).to.equal('У процеса відсутня завершальна подія');
742+
expect(endEventRequiredMessage.textContent).to.equal('У процеса відсутня завершальна подія');
734743
});
735744

736745
it('should translate child issues grouping text', async function() {

0 commit comments

Comments
 (0)