Files

266 lines
9.3 KiB
Svelte
Raw Permalink Normal View History

2023-10-02 23:10:49 +03:00
<script>
import {friendlyDate} from "../../helpers";
import Avatar from "../account/Avatar.svelte";
import {usernameById} from "../account/users";
import Icon from "../common/Icon.svelte";
import RevisionCell from "./revisions/RevisionCell.svelte";
2023-10-15 19:14:07 +03:00
import {getContext} from "svelte";
import RevisionEdgeRow from "./revisions/RevisionEdgeRow.svelte";
2024-10-10 16:44:08 +03:00
import axios from "axios";
import {hasDataChanged} from "./editor.js";
2023-10-02 23:10:49 +03:00
2023-10-15 19:14:07 +03:00
const channel = getContext("channel");
2023-10-02 23:10:49 +03:00
export let record;
2023-10-15 19:14:07 +03:00
export let graph;
2023-10-02 23:10:49 +03:00
export let users;
export let schema;
2023-10-15 19:14:07 +03:00
let revisionSection;
2023-10-02 23:10:49 +03:00
let rollbackError = "";
$: revisions = [];
$: fieldsWithDiff = [];
$: selectedRevision = null;
2023-10-15 19:14:07 +03:00
$: edgeFieldsDiff = {};
2023-10-02 23:10:49 +03:00
axios
2023-10-15 19:14:07 +03:00
.get(`${channel.lucentUrl}/records/${record.id}/revisions`)
2023-10-02 23:10:49 +03:00
.then((response) => {
revisions = response.data;
})
.catch((error) => {
console.log(error);
});
2023-10-15 19:14:07 +03:00
function getEdgesByField(fieldsWithDiff, revision) {
edgeFieldsDiff = graph.edges.filter((e) => e.depth === 1).reduce((c, e) => {
if (!c[e.field]) {
c[e.field] = {
record: [],
revision: [],
}
}
c[e.field]["record"].push(e)
return c;
}, {});
edgeFieldsDiff = revision._edges.reduce((c, e) => {
if (!c[e.field]) {
c[e.field] = {
record: [],
revision: [],
}
}
c[e.field]["revision"].push(e)
return c;
}, edgeFieldsDiff);
2023-10-02 23:10:49 +03:00
}
function compare(e, revision) {
e.preventDefault();
selectedRevision = revision;
fieldsWithDiff = schema.fields.filter((f) => {
2024-10-10 16:44:08 +03:00
return hasDataChanged(false,selectedRevision.data[f.name], record.data[f.name]);
2023-10-02 23:10:49 +03:00
});
2023-10-15 19:14:07 +03:00
getEdgesByField(fieldsWithDiff, revision)
revisionSection.scrollIntoView();
2023-10-02 23:10:49 +03:00
}
function rollback(e) {
e.preventDefault();
rollbackError = "";
axios
.post(
2023-10-15 19:14:07 +03:00
`${channel.lucentUrl}/records/${record.id}/rollback/${selectedRevision._sys.version}`
2023-10-02 23:10:49 +03:00
)
.then((response) => {
window.location.reload();
})
.catch((error) => {
const firstError = error.response.data.error;
rollbackError =
firstError.fieldLabel + ": " + firstError.message;
});
}
</script>
<div class="lx-card ">
<div class="row">
<div class="col-8">
<div>
<span class="label text-end text-muted">record id </span>
<small>{record.id}</small>
</div>
<div>
<span class="label text-end text-muted">current version </span>
{record._sys.version}
</div>
<div>
<span class="label text-end text-muted"> created </span>
<Avatar
2023-10-15 19:14:07 +03:00
name={usernameById(users, record._sys.createdBy)}
side={24}
2023-10-02 23:10:49 +03:00
/>
{friendlyDate(record._sys.createdAt)}
</div>
<div>
<span class="label text-end text-muted">updated </span>
<Avatar
2023-10-15 19:14:07 +03:00
name={usernameById(users, record._sys.updatedBy)}
side={24}
2023-10-02 23:10:49 +03:00
/>
{friendlyDate(record._sys.updatedAt)}
</div>
</div>
<div class="col-4">
<span class="label d-block text-muted "
>Rules for this schema
</span>
<small>
2023-10-15 19:14:07 +03:00
Each record maintains the last {schema.revisions}
2023-10-02 23:10:49 +03:00
versions
</small>
</div>
</div>
</div>
2024-08-18 19:04:32 +03:00
<div class="revisions">
2023-10-15 19:14:07 +03:00
{#if schema.revisions > 0}
2023-10-02 23:10:49 +03:00
<div class="header-small mb-3">Revisions</div>
{#each revisions as revision}
2024-08-18 19:04:32 +03:00
{#if revision._sys.version !== record._sys.version}
2023-10-02 23:10:49 +03:00
<div
2024-08-18 19:04:32 +03:00
class="revision"
2023-10-15 19:14:07 +03:00
class:active={revision._sys.version ===
2023-10-02 23:10:49 +03:00
selectedRevision?._sys.version}
>
2023-10-15 19:14:07 +03:00
2024-08-18 19:04:32 +03:00
<div class="version">
<span>version {revision._sys.version}</span>
2023-10-02 23:10:49 +03:00
<Avatar
2023-10-15 19:14:07 +03:00
name={usernameById(users, revision._sys.updatedBy)}
side={24}
2023-10-02 23:10:49 +03:00
/>
{friendlyDate(revision._sys.updatedAt)}
</div>
<div class="col-3 text-center">
<button
2023-10-15 19:14:07 +03:00
disabled={revision._sys.version ===
2023-10-02 23:10:49 +03:00
selectedRevision?._sys.version}
2024-08-18 19:04:32 +03:00
class="button"
2023-10-15 19:14:07 +03:00
on:click={(e) => compare(e, revision)}
2023-10-02 23:10:49 +03:00
>Compare
</button
>
</div>
</div>
{/if}
{/each}
{:else}
<div class="card-body">
<span>Revisions are not enabled for this Schema</span>
</div>
{/if}
</div>
2023-10-15 19:14:07 +03:00
<div bind:this={revisionSection}>
{#if selectedRevision}
2024-08-18 19:04:32 +03:00
<div class="selected-revision">
2023-10-15 19:14:07 +03:00
{#if fieldsWithDiff.length > 0}
<p class="text-center fw-bold mb-3 mt-5">
If you choose to rollback to this revision
</p>
<button
on:click={rollback}
2024-08-18 19:04:32 +03:00
class="button"
2023-10-15 19:14:07 +03:00
>
Rollback to version {selectedRevision._sys.version}
</button>
{#if rollbackError}
<span class="d-block text-danger mt-3">{rollbackError}</span>
{/if}
<div class="mt-3">
{#each fieldsWithDiff as field}
<!-- <div
class=" lx-card d-flex p-4 mb-4"
style="overflow:hidden"
> -->
<!-- <div class="d-block" style="width:200px;">
{field.label}
</div> -->
<div
2024-08-18 19:04:32 +03:00
class="revision-field"
2023-10-15 19:14:07 +03:00
style="overflow:hidden"
>
2024-08-18 19:04:32 +03:00
<div class="compare-left">
2023-10-15 19:14:07 +03:00
<RevisionCell
{field}
side={record.data[field.name]}
colorClass="text-danger"
/>
</div>
2024-08-18 19:04:32 +03:00
<div class="compare-center">
<span class="me-1">{field.label}</span>
<Icon
icon="angle-right"
width="12"
height="12"
/>
2023-10-15 19:14:07 +03:00
</div>
2024-08-18 19:04:32 +03:00
<div class="compare-right">
2023-10-15 19:14:07 +03:00
<RevisionCell
edges={selectedRevision._edges}
{field}
side={selectedRevision.data[field.name]}
colorClass="text-success"
/>
</div>
</div>
<!-- </div> -->
{/each}
</div>
{:else}
<div class=" lx-card text-center">
<span>Nothing will change</span>
</div>
2023-10-02 23:10:49 +03:00
{/if}
2023-10-15 19:14:07 +03:00
2023-10-02 23:10:49 +03:00
<div class="mt-3">
2023-10-15 19:14:07 +03:00
<p class="text-center fw-bold mb-3 mt-5">
Record References
</p>
{#each Object.entries(edgeFieldsDiff) as [field, edges]}
2023-10-02 23:10:49 +03:00
<div
2024-08-18 19:04:32 +03:00
class="revision-references"
2023-10-15 19:14:07 +03:00
style="overflow:hidden"
2023-10-02 23:10:49 +03:00
>
2024-08-18 19:04:32 +03:00
<div class="reference-field">
2023-10-15 19:14:07 +03:00
{field}:
2023-10-02 23:10:49 +03:00
</div>
2024-08-18 19:04:32 +03:00
<div class="reference-compare">
<p class="">Record</p>
2023-10-15 19:14:07 +03:00
{#each edges.record as edge}
2024-08-18 19:04:32 +03:00
<RevisionEdgeRow {edge}/>
2023-10-15 19:14:07 +03:00
{:else}
<p>No references</p>
{/each}
2024-08-18 19:04:32 +03:00
</div>
<div class="reference-compare">
<p class="text-success">Revision</p>
2023-10-15 19:14:07 +03:00
{#each edges.revision as edge}
2024-08-18 19:04:32 +03:00
<RevisionEdgeRow {edge}/>
2023-10-15 19:14:07 +03:00
{:else}
<p>No references</p>
{/each}
2023-10-02 23:10:49 +03:00
</div>
</div>
{/each}
</div>
2023-10-15 19:14:07 +03:00
</div>
{/if}
</div>
2023-10-02 23:10:49 +03:00