diff --git a/package-lock.json b/package-lock.json index e0a76b7..2ecf8d0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@api-components/api-resource-example-document", - "version": "4.3.4", + "version": "4.3.5", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index b8668bd..f75e34f 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@api-components/api-resource-example-document", "description": "A viewer for examples in a resource based on AMF model", - "version": "4.3.4", + "version": "4.3.5", "license": "Apache-2.0", "main": "index.js", "module": "index.js", diff --git a/src/ApiExampleRender.js b/src/ApiExampleRender.js index 3a49c56..906cf64 100644 --- a/src/ApiExampleRender.js +++ b/src/ApiExampleRender.js @@ -410,15 +410,17 @@ export class ApiExampleRender extends LitElement { const isJson = this._computeIsJson(this.isJson, example.value); return html`
- Copy - ${isJson ? html` + +
+ Copy + ${isJson ? html` Table view` : ''} - ${hasRaw ? html` - Source view` : ''} + ${hasRaw ? html` + Source view` : ''} +
`; } diff --git a/src/ApiResourceExampleDocument.d.ts b/src/ApiResourceExampleDocument.d.ts index 260dcee..7dcae0b 100644 --- a/src/ApiResourceExampleDocument.d.ts +++ b/src/ApiResourceExampleDocument.d.ts @@ -216,4 +216,6 @@ export class ApiResourceExampleDocument extends AmfHelperMixin(LitElement) { _computeExampleDescription(example: Example): string; _exampleTitleIsMediaType(example: Example): boolean; + + _handleCollapsePanel(): void; } diff --git a/src/ApiResourceExampleDocument.js b/src/ApiResourceExampleDocument.js index 8fed051..a885a2a 100644 --- a/src/ApiResourceExampleDocument.js +++ b/src/ApiResourceExampleDocument.js @@ -117,6 +117,10 @@ export class ApiResourceExampleDocument extends AmfHelperMixin(LitElement) { * read-only properties to the example */ renderReadOnly: { type: Boolean }, + /** + * If enabled, the example panel would be closed + */ + _collapseExamplePanel: { type: Boolean, reflect: true }, }; } @@ -313,6 +317,19 @@ export class ApiResourceExampleDocument extends AmfHelperMixin(LitElement) { })); } + get _collapseExamplePanel() { + return this.__collapseExamplePanel + } + + set _collapseExamplePanel(value) { + const old = this.__collapseExamplePanel; + if (old === value) { + return; + } + this.__collapseExamplePanel = value; + this.requestUpdate('_collapseExamplePanel', old); + } + constructor() { super(); this._onStorageChanged = this._onStorageChanged.bind(this); @@ -324,6 +341,7 @@ export class ApiResourceExampleDocument extends AmfHelperMixin(LitElement) { this.hasExamples = false; this.compatibility = false; this.renderReadOnly = false; + this._collapseExamplePanel = false; this._ensureJsonTable(); } @@ -549,16 +567,44 @@ export class ApiResourceExampleDocument extends AmfHelperMixin(LitElement) { this.table = e.detail.value; } + /** + * Collapse the current example panel + */ + _handleCollapsePanel() { + const examplePanel = this.shadowRoot.querySelector('.renderer') + const icon = this.shadowRoot.querySelector('.expand-icon') + icon.classList.toggle('expand-icon-collapse') + examplePanel.classList.toggle('collapse') + + this._collapseExamplePanel = !this._collapseExamplePanel + } + /** * @param {Example} example * @returns {TemplateResult|string} */ _titleTemplate(example) { + const { compatibility } = this; + if (example.isScalar) { return ''; } const label = this._computeExampleTitle(example); - return html`
${label}
`; + return html`
+ ${label} + + + +
`; } /** @@ -622,7 +668,6 @@ export class ApiResourceExampleDocument extends AmfHelperMixin(LitElement) { ${this._titleTemplate(item)} ${this._descriptionTemplate(item)}
- { assert.equal(titles[2].innerText.trim(), 'User 3'); assert.equal(titles[3].innerText.trim(), 'User 4'); }); + + it('should expand example panel when _handleCollapsePanel is called', async () => { + const payloads = getPayload(element, amf, '/IncludedInline', 'post'); + element.examples = payloads; + await aTimeout(100); + + const examplePanelNoCollapsed = /** @type HTMLElement */ (element.shadowRoot.querySelector('.collapse')); + assert.isNull(examplePanelNoCollapsed); + const expandIconNoCollapsed = /** @type HTMLElement */ (element.shadowRoot.querySelector('.expand-icon-collapse')); + assert.isNull(expandIconNoCollapsed); + + setTimeout(() => element._handleCollapsePanel()); + + const examplePanelCollapsed = /** @type HTMLElement */ (element.shadowRoot.querySelector('.collapse')); + assert.isDefined(examplePanelCollapsed); + const expandIconCollapsed = /** @type HTMLElement */ (element.shadowRoot.querySelector('.expand-icon-collapse')); + assert.isDefined(expandIconCollapsed); + }); + + it('should expand example panel on click ', async () => { + const payloads = getPayload(element, amf, '/IncludedInline', 'post'); + element.examples = payloads; + await aTimeout(100); + + const examplePanel = /** @type HTMLElement */ (element.shadowRoot.querySelector('.renderer')); + examplePanel.click() + await aTimeout(100); + + const examplePanelCollapsed = /** @type HTMLElement */ (element.shadowRoot.querySelector('.collapse')); + const expandIconCollapsed = /** @type HTMLElement */ (element.shadowRoot.querySelector('.expand-icon-collapse')); + assert.isDefined(examplePanelCollapsed); + assert.isDefined(expandIconCollapsed); + }); }); }); });