src/components/SchemaViewer.svelte (64 lines of code) (raw):

<script> import SchemaNode from "./SchemaNode.svelte"; import FilterInput from "./FilterInput.svelte"; import { pageState } from "../state/stores"; export let app; export let nodes = []; let nodesWithVisibility = []; $: { const filterTerms = $pageState.search ? $pageState.search .trim() .split(" ") .filter((t) => t.length > 0) : []; const addVisibility = (node, parentNodeNames = ["__root__"]) => { let modifiedNode = node; let parentNames = [...parentNodeNames]; parentNames.push(`${parentNames.slice(-1)}.${modifiedNode.name}`); if (modifiedNode.fields) { modifiedNode.fields.forEach((field) => { let modifiedNodeField = field; return addVisibility(modifiedNodeField, parentNames); }); } modifiedNode.visible = filterTerms.length === 0 || filterTerms.every( (term) => parentNames.some((val) => val.includes(term)) || modifiedNode.name.includes(term) ); modifiedNode.childrenVisible = modifiedNode.fields ? modifiedNode.fields.some( (child) => child.visible || child.childrenVisible ) : undefined; return modifiedNode; }; nodesWithVisibility = nodes.map((node) => addVisibility(node), filterTerms); } </script> <div class="schema-viewer"> <FilterInput /> <div class="schema-browser"> <p> {#each nodesWithVisibility as node} <SchemaNode {app} {node} /> {/each} </p> </div> </div> <style lang="scss"> .schema-viewer { margin-top: 2rem; .schema-browser { padding: $spacing-sm; border: 0.25rem solid $color-light-gray-60; max-height: 400px; overflow: scroll; margin-left: auto; margin-right: auto; } } </style>