parent
9659f1bbd2
commit
f7ee5457ef
@ -0,0 +1,37 @@ |
|||||||
|
<!-- |
||||||
|
// Copyright (c) 2022-2024 Niko Bonnieure, Par le Peuple, NextGraph.org developers |
||||||
|
// All rights reserved. |
||||||
|
// Licensed under the Apache License, Version 2.0 |
||||||
|
// <LICENSE-APACHE2 or http://www.apache.org/licenses/LICENSE-2.0> |
||||||
|
// or the MIT license <LICENSE-MIT or http://opensource.org/licenses/MIT>, |
||||||
|
// at your option. All files in the project carrying such |
||||||
|
// notice may not be copied, modified, or distributed except |
||||||
|
// according to those terms. |
||||||
|
--> |
||||||
|
|
||||||
|
<script lang="ts"> |
||||||
|
|
||||||
|
export let pane_name = ""; |
||||||
|
|
||||||
|
const panes = { |
||||||
|
"history": "History", |
||||||
|
}; |
||||||
|
|
||||||
|
const load_pane = async (pane_name) => { |
||||||
|
let component = await import(`./panes/${panes[pane_name]}.svelte`); |
||||||
|
return component.default; |
||||||
|
}; |
||||||
|
|
||||||
|
</script> |
||||||
|
|
||||||
|
<div> |
||||||
|
|
||||||
|
{#if pane_name} |
||||||
|
{#await load_pane(pane_name) then pane} |
||||||
|
<div class="flex w-full" style="overflow-wrap: anywhere;"> |
||||||
|
<svelte:component this={pane}/> |
||||||
|
</div> |
||||||
|
{/await} |
||||||
|
{/if} |
||||||
|
|
||||||
|
</div> |
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
@ -0,0 +1,155 @@ |
|||||||
|
<!-- |
||||||
|
// Copyright (c) 2022-2024 Niko Bonnieure, Par le Peuple, NextGraph.org developers |
||||||
|
// All rights reserved. |
||||||
|
// Licensed under the Apache License, Version 2.0 |
||||||
|
// <LICENSE-APACHE2 or http://www.apache.org/licenses/LICENSE-2.0> |
||||||
|
// or the MIT license <LICENSE-MIT or http://opensource.org/licenses/MIT>, |
||||||
|
// at your option. All files in the project carrying such |
||||||
|
// notice may not be copied, modified, or distributed except |
||||||
|
// according to those terms. |
||||||
|
--> |
||||||
|
|
||||||
|
<script lang="ts"> |
||||||
|
import { |
||||||
|
branch_subscribe, |
||||||
|
active_session, |
||||||
|
cannot_load_offline, |
||||||
|
online, |
||||||
|
get_blob |
||||||
|
} from "../../store"; |
||||||
|
import { get } from "svelte/store"; |
||||||
|
import { onMount, onDestroy, tick } from "svelte"; |
||||||
|
import { |
||||||
|
Sun, |
||||||
|
Cloud, |
||||||
|
DocumentPlus, |
||||||
|
DocumentMinus, |
||||||
|
CircleStack, |
||||||
|
Funnel, |
||||||
|
FingerPrint, |
||||||
|
Key, |
||||||
|
Cog, |
||||||
|
Icon, |
||||||
|
ShieldCheck, |
||||||
|
} from "svelte-heros-v2"; |
||||||
|
import BranchIcon from "../components/BranchIcon.svelte"; |
||||||
|
|
||||||
|
import { t } from "svelte-i18n"; |
||||||
|
import { Button, Progressbar, Spinner, Alert } from "flowbite-svelte"; |
||||||
|
import { cur_tab, nav_bar, can_have_header, header_icon, header_title, header_description, cur_branch, set_header_in_view, edit_header_button, cur_app, load_official_app } from "../../tab"; |
||||||
|
import ng from "../../api"; |
||||||
|
|
||||||
|
import { |
||||||
|
createGitgraph, |
||||||
|
templateExtend, |
||||||
|
TemplateName, |
||||||
|
} from "./history/gitgraph-js/gitgraph"; |
||||||
|
|
||||||
|
let gitgraph; |
||||||
|
let history = []; |
||||||
|
let unsub = () => {}; |
||||||
|
|
||||||
|
onMount(async ()=>{ |
||||||
|
const graphContainer = document.getElementById("graph-container"); |
||||||
|
gitgraph = createGitgraph(graphContainer, { |
||||||
|
template: templateExtend(TemplateName.Metro, { |
||||||
|
branch: { label: { display: false } }, |
||||||
|
commit: { message: { displayAuthor: false, displayHash: false } }, |
||||||
|
}), |
||||||
|
}); |
||||||
|
let res = await ng.branch_history($active_session.session_id, "did:ng:"+$cur_tab.branch.nuri); |
||||||
|
// for (const h of res.history) { |
||||||
|
// console.log(h[0], h[1]); |
||||||
|
// } |
||||||
|
//console.log(res.swimlane_state); |
||||||
|
history = [...res.history].reverse(); |
||||||
|
|
||||||
|
gitgraph.swimlanes(res.swimlane_state.map((s)=> s || false)); |
||||||
|
gitgraph.import(res.history.map((h)=>{return { |
||||||
|
hash:h[0], |
||||||
|
branch:h[1].branch, |
||||||
|
author:h[1].author, |
||||||
|
parents:h[1].past, |
||||||
|
x:h[1].x, |
||||||
|
y:h[1].y, |
||||||
|
subject:h[1].timestamp, |
||||||
|
onClick:()=>openCommit(h[0]), |
||||||
|
onMessageClick:()=>openCommit(h[0]) |
||||||
|
};})); |
||||||
|
|
||||||
|
let branch = branch_subscribe($cur_tab.branch.nuri,false); |
||||||
|
unsub = branch.subscribe((b) => { |
||||||
|
//console.log("subscription callbak",b.history.commits); |
||||||
|
if (Array.isArray(b.history.commits)) { |
||||||
|
for (var h; h = b.history.commits.pop(); ) { |
||||||
|
//console.log(h); |
||||||
|
history.unshift(h); |
||||||
|
history = history; |
||||||
|
gitgraph.commit({ |
||||||
|
hash: h[0], |
||||||
|
author:h[1].author, |
||||||
|
parents:h[1].past, |
||||||
|
subject:h[1].timestamp, |
||||||
|
onClick:()=>openCommit(h[0]), |
||||||
|
onMessageClick:()=>openCommit(h[0]) |
||||||
|
}); |
||||||
|
} |
||||||
|
} |
||||||
|
}); |
||||||
|
get(branch).history.start(); |
||||||
|
}); |
||||||
|
|
||||||
|
onDestroy( ()=>{ |
||||||
|
let branch = branch_subscribe($cur_tab.branch.nuri,false); |
||||||
|
get(branch).history.stop(); |
||||||
|
unsub(); |
||||||
|
}); |
||||||
|
|
||||||
|
const openCommit = (id:string) => { |
||||||
|
console.log("open commit",id); |
||||||
|
} |
||||||
|
|
||||||
|
const commit_type_icons = { |
||||||
|
"TransactionGraph": Sun, |
||||||
|
"TransactionDiscrete": Cloud, |
||||||
|
"TransactionBoth": Sun, |
||||||
|
"FileAdd": DocumentPlus, |
||||||
|
"FileRemove": DocumentMinus, |
||||||
|
"Snapshot": CircleStack, |
||||||
|
"Compact": Funnel, |
||||||
|
"AsyncSignature": FingerPrint, |
||||||
|
"SyncSignature": FingerPrint, |
||||||
|
"Branch": BranchIcon, |
||||||
|
"UpdateBranch": BranchIcon, |
||||||
|
"BranchCapRefresh": Key, |
||||||
|
"CapRefreshed": Key, |
||||||
|
"Other": Cog, |
||||||
|
}; |
||||||
|
|
||||||
|
</script> |
||||||
|
|
||||||
|
<div style="width:120px; min-width:120px;font-family: monospace; font: Courier; font-size:16px;"> |
||||||
|
|
||||||
|
{#each history as commit} |
||||||
|
|
||||||
|
<div class="w-full commit relative text-gray-500" style="height:60px;" role="button" title={commit[0]} tabindex=0 on:click={()=>openCommit(commit[0])} on:keypress={()=>openCommit(commit[0])}> |
||||||
|
{#if commit[1].final_consistency}<ShieldCheck tabindex="-1" class="w-5 h-5 absolute text-primary-600" style="top:9px;right:20px;" /> |
||||||
|
{:else if commit[1].signature}<ShieldCheck tabindex="-1" class="w-5 h-5 absolute text-green-600" style="top:9px;right:20px;" /> |
||||||
|
{/if} |
||||||
|
<Icon tabindex="-1" class="w-5 h-5 outline-none absolute " style="top:9px;right:0px;" variation="outline" color="currentColor" icon={commit_type_icons[commit[1].commit_type]} /> |
||||||
|
{#if commit[1].commit_type==="TransactionBoth"}<Cloud tabindex="-1" class="w-5 h-5 absolute " style="top:28px;right:0px;" />{/if} |
||||||
|
<b>{commit[0].substring(0,7)}</b><br/> |
||||||
|
<span class="text-xs leading-tight">{commit[1].author.substring(0,9)}</span> |
||||||
|
</div> |
||||||
|
|
||||||
|
{/each} |
||||||
|
|
||||||
|
</div> |
||||||
|
|
||||||
|
<div style="cursor:pointer;" id="graph-container"></div> |
||||||
|
|
||||||
|
<style> |
||||||
|
.commit { |
||||||
|
padding: 8px; |
||||||
|
} |
||||||
|
</style> |
Loading…
Reference in new issue