This commit is contained in:
2026-05-06 21:43:13 +03:00
parent 8b3a3964a5
commit 93a16ee916
23 changed files with 148 additions and 387 deletions
-3
View File
@@ -1,13 +1,10 @@
<script>
import RecordRow from "./RecordRow.svelte";
import { previewTitle } from "../records/Preview";
import { usernameById } from "../account/users";
import { getContext } from "svelte";
import Avatar from "../account/Avatar.svelte";
import { selectRecord, toggleAll } from "./functions/recordSelect.js";
import Checkbox from "../common/Checkbox.svelte";
import Preview from "../files/Preview.svelte";
import { fileurl } from "../files/imageserver.js";
const channel = getContext("channel");
@@ -1,9 +1,7 @@
<script>
import {createEventDispatcher, getContext} from "svelte";
import {previewTitle} from "../../records/Preview";
import { createEventDispatcher, getContext } from "svelte";
import Icon from "../../common/Icon.svelte";
const channel = getContext("channel");
const dispatch = createEventDispatcher();
export let schema;
export let operators;
@@ -19,13 +17,10 @@
isReference: key.startsWith("children"),
};
filter = [
extractOperator(key),
extractLabel(schema, key),
].reduce((mem, fn) => fn(mem), filter);
filter = [extractOperator(key), extractLabel(schema, key)].reduce(
(mem, fn) => fn(mem),
filter,
);
function extractOperator(key) {
return (filter) => {
@@ -50,18 +45,16 @@
const filterField = schema.fields.find((f) => f.name === fieldName);
filter.label = filterField?.label ?? fieldName;
return filter;
}
};
}
const filterRecord = extractFilterRecord(graph, value);
function extractFilterRecord(graph, value) {
if (!filter.isReference) {
return null;
}
return graph.records.find(r => r.id === value);
return graph.records.find((r) => r.id === value);
}
function removeFilter(k) {
@@ -78,19 +71,21 @@
</script>
<span class="applied-filter">
{#if filter.isReference && filterRecord}
{filter.label} is {filterRecord.data.name}
{:else}
{filter.label}
{operators.find((o) => o.name === filter.operator)?.symbol ?? ""}
{operators.find((o) => o.name === filter.operator)?.hasValue
? value
: ""}
{/if}
{#if filter.isReference && filterRecord}
{filter.label} is {previewTitle(channel.schemas, filterRecord)}
{:else}
{filter.label} {operators.find((o) => o.name === filter.operator)?.symbol ?? ""} {operators.find((o) => o.name === filter.operator)?.hasValue ? value : ""}
{/if}
<button
on:click|preventDefault={() => removeFilter(key)}
type="button"
class="button-text"
aria-label="Close"
><Icon width={12} height={12} icon="close"></Icon></button>
<button
on:click|preventDefault={() => removeFilter(key)}
type="button"
class="button-text"
aria-label="Close"
><Icon width={12} height={12} icon="close"></Icon></button
>
</span>
@@ -1,8 +1,6 @@
<script>
import {createEventDispatcher, getContext} from "svelte";
import {debounce} from "lodash";
import {previewTitle} from "../../records/Preview";
import { createEventDispatcher, getContext } from "svelte";
import { debounce } from "lodash";
const channel = getContext("channel");
const dispatch = createEventDispatcher();
@@ -10,9 +8,8 @@
export let value = "";
export let field;
let search = ""
$: searchOptions = []
let search = "";
$: searchOptions = [];
const updateResults = debounce((e) => {
axios
@@ -35,46 +32,36 @@
function apply(e, newOption) {
e.preventDefault();
value = newOption.id
value = newOption.id;
dispatch("addFilter");
value = ""
value = "";
}
</script>
<div class="reference-tags">
<input
type="search"
on:keyup={updateResults}
bind:value={search}
placeholder={"Search for "+field.label}
autocomplete="off"
type="search"
on:keyup={updateResults}
bind:value={search}
placeholder={"Search for " + field.label}
autocomplete="off"
/>
<div class="reference-tags-results">
{#if searchOptions}
{#each searchOptions as option (option.id)}
<div
class="reference-tags-option"
role="button"
tabindex="0"
on:click={(e) => apply(e, option)}
on:keypress={(e) => apply(e, option)}
class="reference-tags-option"
role="button"
tabindex="0"
on:click={(e) => apply(e, option)}
on:keypress={(e) => apply(e, option)}
>
{previewTitle(channel.schemas, option)}
{option.data.name}
</div>
{:else}
<div
class="start-typing">
Start typing...
</div>
<div class="start-typing">Start typing...</div>
{/each}
{/if}
</div>
</div>