| <!DOCTYPE html> |
| <html> |
|
|
| <head> |
| <title>ChatChain Visualizer</title> |
| <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css"> |
| <style> |
| body { |
| display: flex; |
| justify-content: center; |
| align-items: center; |
| height: 100vh; |
| } |
| |
| #visualization { |
| display: flex; |
| flex-wrap: nowrap; |
| overflow-x: auto; |
| max-width: 1800px; |
| margin: 20px; |
| } |
| |
| .card { |
| margin-right: 10px; |
| background-color: #f0f0f0; |
| display: inline-block; |
| min-width: 350px; |
| vertical-align: top; |
| } |
| |
| .card-content { |
| padding: 10px; |
| } |
| </style> |
| </head> |
|
|
| <body> |
| <div class="container"> |
| <h2>ChatChain Visualizer</h2> |
| <p>Select your ChatChainConfig.json to visualize</p> |
| <input type="file" id="fileInput"> |
| <div id="visualization"></div> |
| </div> |
|
|
| <script> |
| document.getElementById('fileInput').addEventListener('change', handleFileSelect, false); |
| |
| function handleFileSelect(event) { |
| const file = event.target.files[0]; |
| if (!file) return; |
| |
| const reader = new FileReader(); |
| reader.onload = function(event) { |
| try { |
| const jsonContent = JSON.parse(event.target.result); |
| visualizeChain(jsonContent.chain); |
| } catch (error) { |
| alert('Error parsing JSON file.'); |
| } |
| }; |
| reader.readAsText(file); |
| } |
| |
| function createCard(element) { |
| const card = document.createElement('div'); |
| card.className = 'card'; |
| |
| const cardContent = document.createElement('div'); |
| cardContent.className = 'card-content'; |
| |
| |
| |
| |
| if (element.phaseType === "ComposedPhase") { |
| delete element.Composition; |
| } |
| |
| const phase = document.createElement('span'); |
| phase.innerHTML = `<strong>PhaseName: </strong>${element.phase || 'No PhaseName'}`; |
| |
| |
| const phaseType = document.createElement('p'); |
| phaseType.innerHTML = `<strong>PhaseType: </strong>${element.phaseType || 'No phaseType'}`; |
| |
| |
| delete element.phase; |
| delete element.phaseType; |
| const jsonContent = document.createElement('pre'); |
| jsonContent.innerText = JSON.stringify(element, null, 2); |
| |
| cardContent.appendChild(phase); |
| cardContent.appendChild(phaseType); |
| cardContent.appendChild(jsonContent); |
| |
| card.appendChild(cardContent); |
| |
| return card; |
| } |
| |
| function visualizeChain(chain) { |
| const visualization = document.getElementById('visualization'); |
| visualization.innerHTML = ''; |
| |
| chain.forEach(element => { |
| if (element.phaseType === "ComposedPhase") { |
| const composition = element.Composition || []; |
| const card = createCard(element); |
| |
| const nestedCards = composition.map(composedElement => { |
| return createCard(composedElement); |
| }); |
| |
| const nestedCardWrapper = document.createElement('div'); |
| nestedCardWrapper.style.marginTop = '10px'; |
| |
| nestedCards.forEach(nestedCard => { |
| nestedCardWrapper.appendChild(nestedCard); |
| }); |
| |
| card.appendChild(nestedCardWrapper); |
| visualization.appendChild(card); |
| } else { |
| const card = createCard(element); |
| visualization.appendChild(card); |
| } |
| }); |
| } |
| </script> |
| </body> |
|
|
| </html> |