Skip to content

Commit 04a86e5

Browse files
authored
Merge pull request #17 from advanced-rest-client/fix/example-description-missing
Fix/example description missing
2 parents b8ce7ad + 127b76a commit 04a86e5

File tree

9 files changed

+129
-21
lines changed

9 files changed

+129
-21
lines changed

demo/APIC-332/APIC-332.raml

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
#%RAML 1.0
2+
title: API with Examples
3+
4+
types:
5+
Org:
6+
type: object
7+
description: This description for the type is shown
8+
properties:
9+
name: string
10+
address?: string
11+
value?: string
12+
13+
/organization:
14+
post:
15+
body:
16+
application/json:
17+
type: Org
18+
example:
19+
value:
20+
name: Fake SA
21+
value: Something
22+
description: This description for the example is never shown

demo/apis.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
"demo-api/demo-api.raml": "RAML 1.0",
33
"raml-types/raml-types.raml": "RAML 1.0",
44
"google-drive-api/google-drive-api.raml": "RAML 1.0",
5+
"APIC-332/APIC-332.raml": "RAML 1.0",
56
"oas-3-api/oas-3-api.yaml": { "type": "OAS 3.0", "mime": "application/yaml" },
67
"steveTest-1/stevetest.json": { "type": "OAS 2.0", "mime": "application/json" }
78
}

demo/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ class ApiDemo extends ApiDemoPage {
110110
['demo-api', 'Demo API'],
111111
['google-drive-api', 'Google Drive'],
112112
['raml-types', 'RAML types with raml examples'],
113+
['APIC-332', 'APIC-332'],
113114
].forEach(([file, label]) => {
114115
result[result.length] = html`
115116
<anypoint-item data-src="${file}-compact.json">${label} - compact model</anypoint-item>

package-lock.json

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "@api-components/api-resource-example-document",
33
"description": "A viewer for examples in a resource based on AMF model",
4-
"version": "4.3.2",
4+
"version": "4.3.3",
55
"license": "Apache-2.0",
66
"main": "index.js",
77
"module": "index.js",
@@ -35,7 +35,7 @@
3535
"@advanced-rest-client/prism-highlight": "^4.0.4",
3636
"@anypoint-web-components/anypoint-button": "^1.2.0",
3737
"@api-components/amf-helper-mixin": "^4.3.6",
38-
"@api-components/api-example-generator": "^4.4.8",
38+
"@api-components/api-example-generator": "^4.4.13",
3939
"lit-element": "^2.4.0"
4040
},
4141
"devDependencies": {

src/ApiResourceExampleDocument.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,5 +213,7 @@ export class ApiResourceExampleDocument extends AmfHelperMixin(LitElement) {
213213

214214
_computeExampleTitle(example: Example): string;
215215

216+
_computeExampleDescription(example: Example): string;
217+
216218
_exampleTitleIsMediaType(example: Example): boolean;
217219
}

src/ApiResourceExampleDocument.js

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -561,6 +561,30 @@ export class ApiResourceExampleDocument extends AmfHelperMixin(LitElement) {
561561
return html`<div class="example-title">${label}</div>`;
562562
}
563563

564+
/**
565+
* @param {Example} example
566+
* @returns {string}
567+
*/
568+
_computeExampleDescription(example) {
569+
const { description } = example
570+
return !description ? '' : description;
571+
}
572+
573+
/**
574+
* @param {Example} example
575+
* @returns {TemplateResult|string}
576+
*/
577+
_descriptionTemplate(example) {
578+
if (example.isScalar) {
579+
return '';
580+
}
581+
const description = this._computeExampleDescription(example)
582+
if (!description) {
583+
return '';
584+
}
585+
return html`<div class="example-description">${description}</div>`;
586+
}
587+
564588
/**
565589
* Returns title to render for example
566590
* @param {Example} example
@@ -596,6 +620,7 @@ export class ApiResourceExampleDocument extends AmfHelperMixin(LitElement) {
596620
return examples.map((item) => html`
597621
<div class="item-container">
598622
${this._titleTemplate(item)}
623+
${this._descriptionTemplate(item)}
599624
<div class="renderer">
600625
<arc-icon class="info-icon" icon="code"></arc-icon>
601626
<api-example-render

src/styles/Document.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,4 +46,8 @@ api-example-render {
4646
overflow: auto;
4747
max-width: 100%;
4848
}
49+
50+
.example-description {
51+
padding: 10px 12px;
52+
}
4953
`;

test/api-resource-example-document.test.js

Lines changed: 68 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ describe('ApiResourceExampleDocument', () => {
3232
return localStorage.jsonTableEnabled;
3333
}
3434

35-
3635
describe('_tableChanged()', () => {
3736
let element = /** @type ApiResourceExampleDocument */ (null);
3837
beforeEach(async () => {
@@ -312,6 +311,23 @@ describe('ApiResourceExampleDocument', () => {
312311
return element._ensureArray(schema[key]);
313312
}
314313

314+
async function resolveWhenReady(elm, model, path, method, payloadIndex) {
315+
return new Promise((resolve) => {
316+
let payload = getPayload(elm, model, path, method);
317+
if (payloadIndex !== undefined) {
318+
payload = payload[payloadIndex]
319+
}
320+
elm.examples = payload;
321+
elm.addEventListener('has-examples-changed', function f(e) {
322+
if (!e.detail.value) {
323+
return;
324+
}
325+
elm.removeEventListener('has-examples-changed', f);
326+
setTimeout(() => resolve());
327+
});
328+
});
329+
}
330+
315331
describe('__computeExamples()', () => {
316332
[
317333
['Regular model', false],
@@ -529,6 +545,34 @@ describe('ApiResourceExampleDocument', () => {
529545
});
530546
});
531547

548+
describe('APIC-332', () => {
549+
[
550+
['Regular model', false],
551+
['Compact model', true]
552+
].forEach((item) => {
553+
describe(String(item[0]), () => {
554+
let amf;
555+
before(async () => {
556+
amf = await AmfLoader.load(item[1], 'APIC-332');
557+
});
558+
559+
let element = /** @type ApiResourceExampleDocument */ (null);
560+
beforeEach(async () => {
561+
element = await basicFixture();
562+
element.amf = amf;
563+
await nextFrame();
564+
});
565+
566+
it('renders description for an example', async () => {
567+
element.mediaType = 'application/json';
568+
await resolveWhenReady(element, amf, '/organization', 'post', 0);
569+
const description = /** @type HTMLElement */ (element.shadowRoot.querySelector('.example-description'));
570+
assert.equal(description.innerText, 'This description for the example is never shown');
571+
});
572+
});
573+
});
574+
});
575+
532576
describe('_computeExampleTitle()', () => {
533577
let element = /** @type ApiResourceExampleDocument */ (null);
534578

@@ -562,6 +606,29 @@ describe('ApiResourceExampleDocument', () => {
562606
});
563607
});
564608

609+
describe('_computeExampleDescription()', () => {
610+
let element = /** @type ApiResourceExampleDocument */ (null);
611+
612+
beforeEach(async () => {
613+
element = await basicFixture();
614+
await nextFrame();
615+
});
616+
617+
it('returns empty if no description is present', () => {
618+
const example = {};
619+
const description = element._computeExampleDescription(example);
620+
assert.equal(description, '');
621+
});
622+
623+
it('returns description if present', () => {
624+
const example = {
625+
description: "example description",
626+
};
627+
const title = element._computeExampleDescription(example);
628+
assert.equal(title, example.description);
629+
});
630+
});
631+
565632
describe('a11y', () => {
566633
let element = /** @type ApiResourceExampleDocument */ (null);
567634
let amf;
@@ -574,20 +641,6 @@ describe('ApiResourceExampleDocument', () => {
574641
element.amf = amf;
575642
});
576643

577-
async function resolveWhenReady(elm, model, path, method) {
578-
return new Promise((resolve) => {
579-
const payloads = getPayload(elm, model, path, method);
580-
elm.examples = payloads;
581-
elm.addEventListener('has-examples-changed', function f(e) {
582-
if (!e.detail.value) {
583-
return;
584-
}
585-
elm.removeEventListener('has-examples-changed', f);
586-
setTimeout(() => resolve());
587-
});
588-
});
589-
}
590-
591644
it('passes accessibility test', async () => {
592645
await resolveWhenReady(element, amf, '/IncludedInType', 'post');
593646
await assert.isAccessible(element, {

0 commit comments

Comments
 (0)