blob: 070b9f73e351509605b923fd80f8b9fc6a411459 [file] [log] [blame] [edit]
// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
/**
* @fileoverview Simple search view for component manifests.
*/
class ManifestView {
constructor() {
this.search = document.getElementById('manifest-search');
this.searchButton = document.getElementById('manifest-search-button');
this.searchButton.addEventListener('click', () => this.searchManifests());
this.searchResults = document.getElementById('search-results');
}
async init() {
console.log('[Manifests] - Loading all component manifests');
this.components = await post_request(location.origin + '/api/components', null);
}
async searchManifests() {
let query = this.search.value;
// Clear out all the current search tiles.
while (this.searchResults.firstChild) {
this.searchResults.removeChild(this.searchResults.firstChild);
}
let requests = [];
let urls = [];
this.components.forEach((component) => {
if (component.url.includes(query) && !component.inferred) {
// Populate with new manifest search tiles.
let api = location.origin + '/api/component/manifest';
let query = JSON.stringify({'component_id': component.id});
requests.push(post_request(api, query));
urls.push(component.url);
}
});
let manifests = await Promise.all(requests);
let matches = [];
for (let i = 0; i < manifests.length; i++) {
matches.push({'url': urls[i], 'manifest': manifests[i]});
}
matches.sort((lhs, rhs) => {
if (lhs.url > rhs.url) {
return 1;
}
if (rhs.url > lhs.url) {
return -1;
}
return 0;
});
let stats = document.createElement('pre');
stats.className = 'search-stats';
stats.appendChild(document.createTextNode(matches.length + ' results'));
this.searchResults.appendChild(stats);
matches.forEach((component) => {
let manifest = component.manifest;
try {
manifest = JSON.parse(manifest);
manifest = JSON.stringify(manifest, undefined, 4);
} catch (err) {
console.log('[Malformed Manifest] ' + query);
}
let tile = document.createElement('div');
tile.className = 'tile tile-content';
let header = document.createElement('div');
header.className = 'tile-header tile-header-search';
let title = document.createElement('span');
title.className = 'search-header-text';
title.appendChild(document.createTextNode(component.url));
header.appendChild(title);
let body = document.createElement('div');
body.className = 'tile-body';
let text = document.createElement('pre');
text.appendChild(document.createTextNode(manifest));
body.appendChild(text);
tile.appendChild(header);
tile.appendChild(body);
this.searchResults.appendChild(tile);
});
}
}
window.onload = async function(e) {
const view = new ManifestView();
view.init();
}