Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 8 additions & 5 deletions src/components/json-tree.js
Original file line number Diff line number Diff line change
Expand Up @@ -75,10 +75,12 @@ export default class JsonTree extends LitElement {
animation-duration: 0s !important;
}
.open-bracket:not(.collapsed) + .inside-bracket-wrapper {
visibility: visible;
animation: linear 0.2s expand-height;
}
.open-bracket.collapsed + .inside-bracket-wrapper {
animation: linear 0.2s collapse-height;
visibility: hidden;
max-height: 0;
}
.inside-bracket {
Expand Down Expand Up @@ -149,12 +151,12 @@ export default class JsonTree extends LitElement {
render() {
return html`
<div class="json-tree tree ${this.interactive ? 'interactive' : ''}">
${this.generateTree(this.data, true)}
${this.generateTree(this.data, 'root', true)}
</div>
`;
}

generateTree(data, isLast = false) {
generateTree(data, id, isLast = false) {
if (data === null) {
return html`<div class="null" style="display:inline;">null</div>`;
}
Expand All @@ -164,13 +166,13 @@ export default class JsonTree extends LitElement {
return html`${(Array.isArray(data) ? '[ ],' : '{ },')}`;
}
return html`
<div class="open-bracket ${detailType === 'array' ? 'array' : 'object'} " @click="${this.toggleExpand}" > ${detailType === 'array' ? '[' : '{'}</div>
<div class="inside-bracket-wrapper">
<div aria-label="JSON ${detailType.replace('pure_', '')}" class="open-bracket ${detailType === 'array' ? 'array' : 'object'} " @click="${this.toggleExpand}" role="button" tabindex="0" aria-expanded="true" aria-controls="${id}" @keydown="${(e) => { if (e.key === 'Enter') { e.target.click(); }}}"> ${detailType === 'array' ? '[' : '{'}</div>
<div class="inside-bracket-wrapper" id="${id}">
<div class="inside-bracket">
${Object.keys(data).map((key, i, a) => html`
<div class="item">
${detailType === 'pure_object' ? html`"${key}":` : ''}
${this.generateTree(data[key], i === (a.length - 1))}
${this.generateTree(data[key], `${id}${key}${i}`, i === (a.length - 1))}
</div>`)
}
</div>
Expand All @@ -188,6 +190,7 @@ export default class JsonTree extends LitElement {
toggleExpand(e) {
const openBracketEl = e.target;
openBracketEl.classList.toggle('collapsed');
openBracketEl.setAttribute('aria-expanded', !openBracketEl.classList.contains('collapsed'));
if (openBracketEl.classList.contains('collapsed')) {
e.target.innerHTML = e.target.classList.contains('array') ? '[...]' : '{...}';
} else {
Expand Down
26 changes: 15 additions & 11 deletions src/components/schema-tree.js
Original file line number Diff line number Diff line change
Expand Up @@ -99,10 +99,12 @@ export default class SchemaTree extends LitElement {
animation-duration: 0s !important;
}
.tr:not(.collapsed) + .inside-bracket-wrapper {
visibility: visible;
animation: linear 0.2s expand-height;
}
.tr.collapsed + .inside-bracket-wrapper {
animation: linear 0.2s collapse-height;
visibility: hidden;
max-height: 0;
}

Expand Down Expand Up @@ -147,6 +149,7 @@ export default class SchemaTree extends LitElement {
}

generateTree(data, dataType = 'object', arrayType = '', flags = {}, key = '', title = '', description = '', schemaLevel = 0, indentLevel = 0) {
const id = `row-${key}${schemaLevel}${indentLevel}`;
if (!data) {
return html`<div class="null" style="display:inline;">
<span class="key-label xxx-of-key"> ${key.replace('::OPTION~', '')}</span>
Expand Down Expand Up @@ -189,43 +192,43 @@ export default class SchemaTree extends LitElement {
if (dataType === 'array') {
const arrType = arrayType !== 'object' ? arrayType : '';
if (schemaLevel < this.schemaExpandLevel && !data['::circular']) {
return [html`<span class="open-bracket array-of-array" data-array-type="${arrType}" @click="${this.toggleObjectExpand}">[[ ${arrType} </span>`, ']]'];
return [html`<span class="open-bracket array-of-array" data-array-type="${arrType}" @click="${this.toggleObjectExpand}" role="button" tabindex="0" aria-expanded="true" aria-controls="${id}" @keydown="${(e) => { if (e.key === 'Enter') { e.target.click(); }}}">[[ ${arrType} </span>`, ']]'];
}

return [html`<span class="open-bracket array-of-array" data-array-type="${arrType}" @click="${this.toggleObjectExpand}">[[...]]</span>`];
return [html`<span class="open-bracket array-of-array" data-array-type="${arrType}" @click="${this.toggleObjectExpand}" role="button" tabindex="0" aria-expanded="true" aria-controls="${id}" @keydown="${(e) => { if (e.key === 'Enter') { e.target.click(); }}}">[[...]]</span>`];
}

if (schemaLevel < this.schemaExpandLevel && !data['::circular']) {
return [html`<span class="open-bracket array" @click="${this.toggleObjectExpand}">[</span>`, ']'];
return [html`<span class="open-bracket array" @click="${this.toggleObjectExpand}" role="button" tabindex="0" aria-expanded="true" aria-controls="${id}" @keydown="${(e) => { if (e.key === 'Enter') { e.target.click(); }}}">[</span>`, ']'];
}

return [html`<span class="open-bracket array" @click="${this.toggleObjectExpand}">[...]</span>`];
return [html`<span class="open-bracket array" @click="${this.toggleObjectExpand}" role="button" tabindex="0" aria-expanded="true" aria-controls="${id}" @keydown="${(e) => { if (e.key === 'Enter') { e.target.click(); }}}">[...]</span>`];
}

if (data['::type'] === 'xxx-of-option') {
if (dataType === 'array') {
if (schemaLevel < this.schemaExpandLevel && !data['::circular']) {
return [html`<span class="open-bracket array" @click="${this.toggleObjectExpand}">[</span>`, ']'];
return [html`<span class="open-bracket array" @click="${this.toggleObjectExpand}" role="button" tabindex="0" aria-expanded="true" aria-controls="${id}" @keydown="${(e) => { if (e.key === 'Enter') { e.target.click(); }}}">[</span>`, ']'];
}

return [html`<span class="open-bracket array" @click="${this.toggleObjectExpand}">[...]</span>`];
return [html`<span class="open-bracket array" @click="${this.toggleObjectExpand}" role="button" tabindex="0" aria-expanded="true" aria-controls="${id}" @keydown="${(e) => { if (e.key === 'Enter') { e.target.click(); }}}">[...]</span>`];
}
}

if (data['::type']) {
if (dataType === 'array') {
if (schemaLevel < this.schemaExpandLevel && !data['::circular']) {
return [html`<span class="open-bracket array-of-object" @click="${this.toggleObjectExpand}">[{</span>`, '}]'];
return [html`<span class="open-bracket array-of-object" @click="${this.toggleObjectExpand}" role="button" tabindex="0" aria-expanded="true" aria-controls="${id}" @keydown="${(e) => { if (e.key === 'Enter') { e.target.click(); }}}">[{</span>`, '}]'];
}

return [html`<span class="open-bracket array-of-object" @click="${this.toggleObjectExpand}">[{...}]</span>`];
return [html`<span class="open-bracket array-of-object" @click="${this.toggleObjectExpand}" role="button" tabindex="0" aria-expanded="true" aria-controls="${id}" @keydown="${(e) => { if (e.key === 'Enter') { e.target.click(); }}}">[{...}]</span>`];
}

if (schemaLevel < this.schemaExpandLevel && !data['::circular']) {
return [html`<span class="open-bracket object" @click="${this.toggleObjectExpand}">{</span>`, '}'];
return [html`<span class="open-bracket object" @click="${this.toggleObjectExpand}" role="button" tabindex="0" aria-expanded="true" aria-controls="${id}" @keydown="${(e) => { if (e.key === 'Enter') { e.target.click(); }}}">{</span>`, '}'];
}

return [html`<span class="open-bracket object" @click="${this.toggleObjectExpand}">{...}</span>`];
return [html`<span class="open-bracket object" @click="${this.toggleObjectExpand}" role="button" tabindex="0" aria-expanded="true" aria-controls="${id}" @keydown="${(e) => { if (e.key === 'Enter') { e.target.click(); }}}">{...}</span>`];
}

return [''];
Expand Down Expand Up @@ -263,7 +266,7 @@ export default class SchemaTree extends LitElement {
${data['::metadata']?.constraints?.length ? html`<div style='display:inline-block; line-break:anywhere; margin-right:8px'><span class='bold-text'>Constraints: </span>${data['::metadata'].constraints.join(', ')}</div><br>` : ''}` : ''}
</div>
</div>
<div class="inside-bracket-wrapper">
<div class="inside-bracket-wrapper" id="${id}">
<div class='inside-bracket ${data['::type'] || 'no-type-info'}' style='padding-left:${data['::type'] === 'xxx-of-option' ? 0 : leftPadding}px;'>
${Array.isArray(data) && data[0] ? html`${this.generateTree(data[0], 'xxx-of-option', '', data[0]['::flags'] || {}, '::ARRAY~OF', data[0]['::title'], data[0]['::description'], newSchemaLevel, newIndentLevel)}`
: html`
Expand Down Expand Up @@ -326,6 +329,7 @@ export default class SchemaTree extends LitElement {
const rowEl = e.target.closest('.tr');

rowEl.classList.toggle('collapsed');
e.target.setAttribute('aria-expanded', !rowEl.classList.contains('collapsed'));
if (rowEl.classList.contains('collapsed')) {
e.target.innerHTML = e.target.classList.contains('array-of-object')
? '[{...}]'
Expand Down
8 changes: 7 additions & 1 deletion src/openapi-explorer.js
Original file line number Diff line number Diff line change
Expand Up @@ -311,6 +311,7 @@ export default class OpenApiExplorer extends LitElement {
async onShowSearchModalClicked() {
this.showAdvancedSearchDialog = true;
// wait for the dialog to render
this.shadowRoot.getElementById('nav-advanced-search').setAttribute('aria-expanded', true);
await sleep(10);
const inputEl = this.shadowRoot.getElementById('advanced-search-dialog-input');
if (inputEl) {
Expand Down Expand Up @@ -423,6 +424,7 @@ export default class OpenApiExplorer extends LitElement {
const gotoEl = this.shadowRoot.getElementById(tmpElementId);
if (gotoEl) {
gotoEl.scrollIntoView({ behavior: 'auto', block: 'start' });
gotoEl.focus();
replaceState(tmpElementId);
}
}, isExpandingNeeded ? 150 : 0);
Expand Down Expand Up @@ -459,6 +461,7 @@ export default class OpenApiExplorer extends LitElement {
const gotoEl = this.shadowRoot.getElementById(anchor.replace('#', ''));
if (gotoEl) {
gotoEl.scrollIntoView({ behavior: 'auto', block: 'start' });
gotoEl.focus();
}
}
}
Expand Down Expand Up @@ -603,19 +606,21 @@ export default class OpenApiExplorer extends LitElement {
component.expanded = true;
}
contentEl.scrollIntoView({ behavior: 'auto', block: 'start' });
contentEl.focus();

// Update Location Hash
replaceState(elementId);
newNavEl = this.shadowRoot.getElementById(`link-${elementId}`);
} else if (elementId.match('cmp--') || elementId.match('tag--') || elementId.match('overview--') || elementId.match('auth--') || elementId.match('servers--')) {
contentEl.scrollIntoView({ behavior: 'auto', block: 'start' });
contentEl.focus();

// Update Location Hash
replaceState(elementId);
newNavEl = this.shadowRoot.getElementById(`link-${elementId}`);
} else {
this.shadowRoot.getElementById('operations-root').scrollIntoView({ behavior: 'auto', block: 'start' });

this.shadowRoot.getElementById('operations-root').focus();
// Update Location Hash
replaceState(elementId);
newNavEl = this.shadowRoot.getElementById(`link-${elementId}`);
Expand All @@ -642,6 +647,7 @@ export default class OpenApiExplorer extends LitElement {
if (waitForComponentToExpand) {
setTimeout(() => newNavEl.scrollIntoView({ behavior: 'auto', block: 'center' }), 600);
}
newNavEl.focus();
}

await sleep(0);
Expand Down
38 changes: 19 additions & 19 deletions src/styles/endpoint-styles.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ export default css`
}

.m-endpoint.expanded{margin-bottom:16px; }
.m-endpoint > .endpoint-head{
.m-endpoint .endpoint-head{
border-width:1px 1px 1px 5px;
border-style:solid;
border-color:transparent;
Expand All @@ -31,45 +31,45 @@ export default css`
align-items: center;
cursor: pointer;
}
.m-endpoint > .endpoint-head.put:hover,
.m-endpoint > .endpoint-head.put.expanded{
.m-endpoint .endpoint-head.put:hover,
.m-endpoint .endpoint-head.put.expanded{
border-color: var(--orange);
background-color: var(--light-orange);
}
.m-endpoint > .endpoint-head.post:hover,
.m-endpoint > .endpoint-head.post.expanded {
.m-endpoint .endpoint-head.post:hover,
.m-endpoint .endpoint-head.post.expanded {
border-color:var(--green);
background-color: var(--light-green);
}
.m-endpoint > .endpoint-head.get:hover,
.m-endpoint > .endpoint-head.get.expanded,
.m-endpoint > .endpoint-head.head:hover,
.m-endpoint > .endpoint-head.head.expanded {
.m-endpoint .endpoint-head.get:hover,
.m-endpoint .endpoint-head.get.expanded,
.m-endpoint .endpoint-head.head:hover,
.m-endpoint .endpoint-head.head.expanded {
border-color:var(--blue);
background-color: var(--light-blue);
}
.m-endpoint > .endpoint-head.delete:hover,
.m-endpoint > .endpoint-head.delete.expanded {
.m-endpoint .endpoint-head.delete:hover,
.m-endpoint .endpoint-head.delete.expanded {
border-color:var(--red);
background-color: var(--light-red);
}
.m-endpoint > .endpoint-head.patch:hover,
.m-endpoint > .endpoint-head.patch.expanded {
.m-endpoint .endpoint-head.patch:hover,
.m-endpoint .endpoint-head.patch.expanded {
border-color :var(--yellow);
background-color: var(--light-yellow);
}
.m-endpoint > .endpoint-head.query:hover,
.m-endpoint > .endpoint-head.query.expanded {
.m-endpoint .endpoint-head.query:hover,
.m-endpoint .endpoint-head.query.expanded {
border-color: var(--purple);
background-color: var(--light-purple);
}
.m-endpoint > .endpoint-head.trace:hover,
.m-endpoint > .endpoint-head.trace.expanded {
.m-endpoint .endpoint-head.trace:hover,
.m-endpoint .endpoint-head.trace.expanded {
border-color: var(--purple);
background-color: var(--light-purple);
}
.m-endpoint > .endpoint-head.options:hover,
.m-endpoint > .endpoint-head.options.expanded {
.m-endpoint .endpoint-head.options:hover,
.m-endpoint .endpoint-head.options.expanded {
border-color: var(--gray);
background-color: var(--light-gray);
}
Expand Down
7 changes: 4 additions & 3 deletions src/templates/advance-search-template.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ export default function searchByPropertiesModalTemplate() {
// Trigger the event to force it to be removed from the DOM
document.dispatchEvent(new CustomEvent('keydown', { detail: { code: 'Escape' } }));
document.removeEventListener('keydown', keyDownEventListenerAdvancedSearch, { once: true });
this.shadowRoot.getElementById('nav-advanced-search').setAttribute('aria-expanded', false);
};

document.addEventListener('keydown', keyDownEventListenerAdvancedSearch, { once: true });
Expand All @@ -20,10 +21,10 @@ export default function searchByPropertiesModalTemplate() {
${this.showAdvancedSearchDialog
? html`
<div class="dialog-box-overlay">
<div class="dialog-box">
<div class="dialog-box" aria-modal="true" role="dialog" aria-labelledby="dialog-title">
<header class="dialog-box-header">
<span class="dialog-box-title">Advanced Search</span>
<button class="m-btn thin-border" @click="${() => { closeAdvancedSearchDialog(); }}" part="btn btn-outline">&times;</button>
<span class="dialog-box-title" id="dialog-title">Advanced Search</span>
<button class="m-btn thin-border" @click="${() => { closeAdvancedSearchDialog(); }}" part="btn btn-outline" aria-label="Close">&times;</button>
</header>
<div id="advanced-search-modal" class="dialog-box-content">
<span class="advanced-search-options">
Expand Down
24 changes: 13 additions & 11 deletions src/templates/endpoint-template.js
Original file line number Diff line number Diff line change
Expand Up @@ -43,16 +43,18 @@ export function expandCollapseComponent(component) {
/* eslint-disable indent */
function endpointHeadTemplate(path) {
return html`
<summary @click="${(e) => { toggleExpand.call(this, path, e); }}" class='endpoint-head ${path.method} ${path.expanded ? 'expanded' : 'collapsed'}'>
<div class="method ${path.method}" role="heading" aria-level="3"><span style="line-height: 1;">${path.method}</span></div>
<div style="${path.deprecated ? 'text-decoration: line-through;' : ''}">
${this.usePathInNavBar
? html`<div class="path">${path.path.split('/').filter(t => t.trim()).map(t => html`<span>/${t}</span>`)}</div>`
: html`<div class="">${path.summary || path.shortSummary}</div>`
}
${path.isWebhook ? html`<span style="color:var(--primary-color)"> (${getI18nText('operations.webhook')}) </span>` : ''}
<div role="heading" aria-level="3">
<div role="button" tabindex="0" class='endpoint-head ${path.method} ${path.expanded ? 'expanded' : 'collapsed'}' @click="${(e) => { toggleExpand.call(this, path, e); }}" @keydown="${(e) => { if (e.key === 'Enter') { e.target.click(); }}}" aria-controls="${path.elementId}" aria-expanded="${path.expanded}">
<div class="method ${path.method}" role="img" aria-label="${path.method}"><span style="line-height: 1;" aria-hidden="true">${path.method}</span></div>
<div style="${path.deprecated ? 'text-decoration: line-through;' : ''}">
${this.usePathInNavBar
? html`<div class="path">${path.path.split('/').filter(t => t.trim()).map(t => html`<span>/${t}</span>`)}</div>`
: html`<div class="">${path.summary || path.shortSummary}</div>`
}
${path.isWebhook ? html`<span style="color:var(--primary-color)"> (${getI18nText('operations.webhook')}) </span>` : ''}
</div>
</div>
</summary>
</div>
`;
}

Expand Down Expand Up @@ -125,9 +127,9 @@ function endpointBodyTemplate(path) {
export default function endpointTemplate() {
return html`
<div style="display:flex; justify-content:flex-end; padding-right: 1rem; font-size: 14px; margin-top: 16px;">
<span @click="${(e) => expandCollapseAll.call(this, e, true)}" style="color:var(--primary-color); cursor: pointer;">Expand</span>
<span @click="${(e) => expandCollapseAll.call(this, e, true)}" style="color:var(--primary-color); cursor: pointer;" role="button" tabindex="0" @keydown="${(e) => { if (e.key === 'Enter') { e.target.click(); }}}">Expand</span>
&nbsp;|&nbsp;
<span @click="${(e) => expandCollapseAll.call(this, e, false)}" style="color:var(--primary-color); cursor: pointer;">Collapse</span>
<span @click="${(e) => expandCollapseAll.call(this, e, false)}" style="color:var(--primary-color); cursor: pointer;" role="button" tabindex="0" @keydown="${(e) => { if (e.key === 'Enter') { e.target.click(); }}}">Collapse</span>
</div>
${(this.resolvedSpec && this.resolvedSpec.tags || []).map((tag) => html`
<div class='regular-font method-section-gap section-tag ${tag.expanded ? 'expanded' : 'collapsed'}'>
Expand Down
4 changes: 2 additions & 2 deletions src/templates/expanded-endpoint-template.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@ export function expandedEndpointBodyTemplate(path, tag) {
${this.renderStyle === 'read' ? html`<div class='divider' part="operation-divider"></div>` : ''}
<div class='expanded-endpoint-body observe-me ${path.method}' part="section-operation ${path.elementId}" id='${path.elementId}'>
${(this.renderStyle === 'focused' && tag && tag.name !== 'General ⦂')
? html`<h1 style="display: inline; align-self: center" class="title tag-link" role="heading" aria-level="1" data-content-id="${tag.elementId}"
@click="${(e) => this.scrollToEventTarget(e, false)}"> ${tag?.name} ${tagSummary}</h1>`
? html`<h1 style="display: inline; align-self: center" class="title" data-content-id="${tag.elementId}"
><span class="tag-link" role="link" tabindex="0" @click="${(e) => this.scrollToEventTarget(e, false)}" @keydown="${(e) => { if (e.key === 'Enter') { e.target.click(); }}}"> ${tag?.name} ${tagSummary}</span></h1>`
: ''}
<slot name="${tag.elementId}"></slot>

Expand Down
Loading
Loading