Merge branch 'master' into develop

* master:
  Optimize test cases
  Optimize test cases
  Optimize test cases
  Optimize test cases
  add test for editor-docs
  Minor Cleanup
  docMap adds flowchart configuration
  Optimized type structure
  Optimize style, optimize URL matching logic
  New feature: add quick document entry
  Fix tab style exception
  Fix Favicon
This commit is contained in:
Sidharth Vinod
2022-03-14 16:21:35 +05:30
5 changed files with 115 additions and 21 deletions
+36
View File
@@ -0,0 +1,36 @@
describe('Editor docs tests', () => {
beforeEach(() => {
cy.on('uncaught:exception', () => {
return false;
});
cy.clearLocalStorage();
cy.visit('/edit');
cy.contains('Sample Diagrams').click();
});
it('Test default loading', () => {
cy.get(`[data-cy=docs][href^="https://mermaid-js.github.io/mermaid"]`).should('exist');
});
it('Test to see if the correct URL loads when changing from one diagram to other', () => {
cy.contains('Flow Chart').click();
cy.get(`[data-cy=docs][href$="/#/flowchart"]`).should('exist');
cy.contains('Config').click();
cy.get(`[data-cy=docs][href$="/#/flowchart?id=configuration"]`).should('exist');
cy.contains('Sequence Diagram').click();
cy.get(`[data-cy=docs][href$="/#/sequenceDiagram?id=configuration"]`).should('exist');
cy.contains('Code').click();
cy.get(`[data-cy=docs][href$="/#/sequenceDiagram"]`).should('exist');
});
it("Test to check URLs for a case where config URL doesn't exist", () => {
cy.contains('State Diagram').click();
cy.get(`[data-cy=docs][href$="/#/stateDiagram"]`).should('exist');
cy.contains('Config').click();
cy.get(`[data-cy=docs][href$="/#/stateDiagram"]`).should('exist');
});
});
+2 -2
View File
@@ -11,8 +11,8 @@
<meta
name="description"
content="Simplify documentation and avoid heavy tools. Open source Visio Alternative. Commonly used for explaining your code! Mermaid is a simple markdown-like script language for generating charts from text via javascript." />
<link rel="icon" type="image/png" href="favicon.png" />
<link rel="manifest" href="manifest.json" />
<link rel="icon" type="image/png" href="/favicon.png" />
<link rel="manifest" href="/manifest.json" />
<link
rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.2/css/all.min.css" />
+1 -1
View File
@@ -26,7 +26,7 @@
<ul class="tabs" transition:fade>
{#each tabs as tab}
<div
class="tab tab-lifted text-primary-content {activeTabID === tab.id ? 'tab-active' : ''}"
class="tab tab-lifted {activeTabID === tab.id ? 'tab-active' : 'text-primary-content'}"
on:click|stopPropagation={() => toggleTabs(tab)}>
<i class="mr-1 {tab.icon}" />
{tab.title}
+7
View File
@@ -57,4 +57,11 @@ export interface HistoryEntry {
url?: string;
}
export interface DocConfig {
[key: string]: {
code: string;
config?: string;
};
}
type Loader = (url: string) => Promise<State>;
+69 -18
View File
@@ -12,17 +12,58 @@
import { onMount } from 'svelte';
import mermaid from 'mermaid';
import type monaco from 'monaco-editor';
import type { EditorUpdateEvent, State, Tab } from '$lib/types';
import type { EditorUpdateEvent, State, Tab, DocConfig } from '$lib/types';
import { base } from '$app/paths';
serializedState; // Weird fix for error > serializedState is not defined. Treeshaking?
let selectedMode = 'code';
const languageMap = {
type Modes = 'code' | 'config';
type Languages = 'mermaid' | 'json';
let selectedMode: Modes = 'code';
const languageMap: { [key in Modes]: Languages } = {
code: 'mermaid',
config: 'json'
};
const docURLBase = 'https://mermaid-js.github.io/mermaid';
const docMap: DocConfig = {
graph: {
code: '/#/flowchart',
config: '/#/flowchart?id=configuration'
},
flowchart: {
code: '/#/flowchart',
config: '/#/flowchart?id=configuration'
},
sequenceDiagram: {
code: '/#/sequenceDiagram',
config: '/#/sequenceDiagram?id=configuration'
},
classDiagram: {
code: '/#/classDiagram',
config: '/#/classDiagram?id=configuration'
},
'stateDiagram-v2': {
code: '/#/stateDiagram'
},
gantt: {
code: '/#/gantt',
config: '/#/gantt?id=configuration'
},
pie: {
code: '/#/pie'
},
erDiagram: {
code: '/#/entityRelationshipDiagram',
config: '/#/entityRelationshipDiagram?id=styling'
},
journey: {
code: '/#/user-journey'
}
};
let text = '';
let language: 'mermaid' | 'json' = 'mermaid';
let docURL = docURLBase;
let language: Languages = 'mermaid';
let errorMarkers: monaco.editor.IMarkerData[] = [];
$: language = languageMap[selectedMode];
$: {
@@ -37,10 +78,16 @@
if (state.updateEditor) {
text = selectedMode === 'code' ? state.code : state.mermaid;
}
const codeTypeMatch = /([\S]+)[\s\n]/.exec(state.code);
if (codeTypeMatch && codeTypeMatch.length > 1) {
const docKey = codeTypeMatch[1];
const docConfig = docMap[docKey] ?? { code: '' };
docURL = docURLBase + (docConfig[selectedMode] ?? docConfig.code ?? '');
}
});
const tabSelectHandler = (message: CustomEvent<Tab>) => {
selectedMode = message.detail.id === 'code' ? 'code' : 'config';
$codeStore.updateEditor = true;
selectedMode = message.detail.id;
};
const tabs: Tab[] = [
{
@@ -128,24 +175,28 @@
<Card on:select={tabSelectHandler} {tabs} isCloseable={false} title="Mermaid">
<div slot="actions">
<div class="flex flex-row items-center">
<div class="form-control flex-row items-center">
<label class="cursor-pointer label" for="autoSync">
<span> Auto sync</span>
<input
type="checkbox"
class="toggle {$codeStore.autoSync ? 'btn-secondary' : 'toggle-primary'} ml-1"
id="autoSync"
bind:checked={$codeStore.autoSync} />
</label>
</div>
{#if !$codeStore.autoSync}
<button
class="btn btn-secondary btn-xs"
class="btn btn-secondary btn-xs mr-1"
title="Sync Diagram"
data-cy="sync"
on:click={syncDiagram}><i class="fas fa-sync" /></button>
{/if}
<div class="form-control">
<label class="cursor-pointer label" for="autoSync">
<input
type="checkbox"
class="toggle toggle-primary mr-1"
id="autoSync"
bind:checked={$codeStore.autoSync} />
<span> Auto sync</span>
</label>
</div>
<button class="btn btn-secondary btn-xs" title="View documentation">
<a target="_blank" href={docURL} data-cy="docs"><i class="fas fa-book mr-1" />Docs</a>
</button>
</div>
</div>
@@ -163,9 +214,9 @@
<Card title="Diagram" isCloseable={false}>
<button
slot="actions"
class="btn btn-primary btn-xs shadow-lg"
class="btn btn-secondary btn-xs"
title="View diagram in new page"
on:click|stopPropagation={() => viewDiagram()}><i class="far fa-eye mr-2" /> View</button>
on:click|stopPropagation={() => viewDiagram()}><i class="far fa-eye mr-1" />View</button>
<div class="flex-1 overflow-auto">
<View />