mirror of
https://github.com/vrtmrz/obsidian-livesync.git
synced 2026-04-03 23:55:25 +00:00
- Error handling on booting now works fine. - Replication is now started automatically in LiveSync mode. - Batch database update is now disabled in LiveSync mode. - No longer automatically reconnection while off-focused. - Status saves are thinned out. - Now Self-hosted LiveSync waits for all files between the local database and storage to be surely checked. - Improved: - The job scheduler is now more robust and stable. - The status indicator no longer flickers and keeps zero for a while. - No longer meaningless frequent updates of status indicators. - Now we can configure regular expression filters in handy UI. Thank you so much, @eth-p! - `Fetch` or `Rebuild everything` is now more safely performed. - Minor things - Some utility function has been added. - Customisation sync now less wrong messages. - Digging the weeds for eradication of type errors.
84 lines
2.3 KiB
Svelte
84 lines
2.3 KiB
Svelte
<script lang="ts">
|
|
export let patterns = [] as string[];
|
|
export let originals = [] as string[];
|
|
|
|
export let apply: (args: string[]) => Promise<void> = (_: string[]) => Promise.resolve();
|
|
function revert() {
|
|
patterns = [...originals];
|
|
}
|
|
const CHECK_OK = "✔";
|
|
const CHECK_NG = "⚠";
|
|
const MARK_MODIFIED = "✏ ";
|
|
function checkRegExp(pattern: string) {
|
|
if (pattern.trim() == "") return "";
|
|
try {
|
|
const _ = new RegExp(pattern);
|
|
return CHECK_OK;
|
|
} catch (ex) {
|
|
return CHECK_NG;
|
|
}
|
|
}
|
|
$: status = patterns.map((e) => checkRegExp(e));
|
|
$: modified = patterns.map((e, i) => (e != originals?.[i] ?? "" ? MARK_MODIFIED : ""));
|
|
|
|
function remove(idx: number) {
|
|
patterns[idx] = "";
|
|
}
|
|
function add() {
|
|
patterns = [...patterns, ""];
|
|
}
|
|
</script>
|
|
|
|
<ul>
|
|
{#each patterns as pattern, idx}
|
|
<li><label>{modified[idx]}{status[idx]}</label><input type="text" bind:value={pattern} class={modified[idx]} /><button class="iconbutton" on:click={() => remove(idx)}>🗑</button></li>
|
|
{/each}
|
|
<li>
|
|
<label><button on:click={() => add()}>Add</button></label>
|
|
</li>
|
|
<li class="buttons">
|
|
<button on:click={() => apply(patterns)} disabled={status.some((e) => e == CHECK_NG) || modified.every((e) => e == "")}>Apply</button>
|
|
<button on:click={() => revert()} disabled={status.some((e) => e == CHECK_NG) || modified.every((e) => e == "")}>Revert</button>
|
|
</li>
|
|
</ul>
|
|
|
|
<style>
|
|
label {
|
|
min-width: 4em;
|
|
width: 4em;
|
|
display: inline-flex;
|
|
flex-direction: row;
|
|
justify-content: flex-end;
|
|
}
|
|
ul {
|
|
flex-grow: 1;
|
|
display: inline-flex;
|
|
flex-direction: column;
|
|
list-style-type: none;
|
|
margin-block-start: 0;
|
|
margin-block-end: 0;
|
|
margin-inline-start: 0px;
|
|
margin-inline-end: 0px;
|
|
padding-inline-start: 0;
|
|
}
|
|
li {
|
|
padding: var(--size-2-1) var(--size-4-1);
|
|
display: inline-flex;
|
|
flex-grow: 1;
|
|
align-items: center;
|
|
justify-content: flex-end;
|
|
gap: var(--size-4-2);
|
|
}
|
|
li input {
|
|
min-width: 10em;
|
|
}
|
|
li.buttons {
|
|
}
|
|
button.iconbutton {
|
|
max-width: 4em;
|
|
}
|
|
span.spacer {
|
|
flex-grow: 1;
|
|
}
|
|
</style>
|