ElementsContextProvider
basic idea
Use this to load, sort and filter a collection of elements and provide them to child components through the context.
Props
Prop |
Type |
Default |
Description |
discoverProperty* |
|
|
|
discoverableColumn* |
|
|
|
includePropertiesAny* |
|
|
|
excludePropertiesAny* |
|
|
|
hideColumn* |
|
|
|
sortColumn* |
|
|
|
referenceElementColumn* |
|
|
|
referenceElementStore* |
|
|
|
sheetKey* |
|
|
|
Slots
Name |
Default |
Props |
Fallback |
|
Yes |
|
|
Source
<script>
export let sheetKey
export let referenceElementStore
export let referenceElementColumn
export let sortColumn
export let hideColumn
export let excludePropertiesAny
export let includePropertiesAny
export let discoverableColumn
export let discoverProperty
import { onMount, onDestroy, setContext } from "svelte"
import { get, writable } from "svelte/store"
import { InterkitClient, util } from "../"
let unsubscribe;
let unfilteredData;
let providedData = writable([]);
const elementProperties = InterkitClient.getGlobalStore("elementProperties")
const filterData = (data) => {
console.log("filterData", data, $elementProperties, hideColumn, sortColumn, excludePropertiesAny, includePropertiesAny)
if(!data) return [];
if(referenceElementStore && referenceElementColumn) {
const referenceElement = InterkitClient.getGlobalStore(referenceElementStore);
if(referenceElement) {
let references = get(referenceElement)?.values?.[util.colKey(referenceElementColumn)]?.rowKeys
if(references) {
data = data.filter(a => references.includes(a.key))
}
}
}
if(hideColumn) {
data = data.filter(a => a.hideColumn != "true")
}
if(excludePropertiesAny) {
for(let property of excludePropertiesAny.split(", ")) {
data = data.filter(a => $elementProperties?.[a.key]?.[property])
}
}
if(includePropertiesAny) {
let filteredData = [];
for(let element of data) {
for(let property of includePropertiesAny.split(", ")) {
if($elementProperties?.[element.key]?.[property]) {
filteredData.push(element)
break;
}
}
}
data = filteredData;
}
if(discoverableColumn && discoverProperty) {
console.log("ElementsContextProvider filtering for discovered elements", data, $elementProperties)
let filteredData = [];
for(let element of data) {
if(!element.discoverableColumn
|| (element.discoverableColumn && $elementProperties?.[element.key]?.[discoverProperty])) {
filteredData.push(element)
}
}
data = filteredData;
}
if(sortColumn) {
data.sort((a, b) => { return (a.sortColumn || 0) - (b.sortColumn || 0) })
}
return data;
}
const refilter = () => {
providedData.set(filterData(unfilteredData));
}
const initSubs = async () => {
if(!sheetKey) {
alert("ElementsContextProvider - no sheetKey set")
return;
}
let rows = await InterkitClient.getRowSubStore(sheetKey, { sortColumn, hideColumn, discoverableColumn });
unsubscribe = rows.subscribe((data) => {
unfilteredData = data;
refilter();
})
}
$: {
if($elementProperties) {
refilter();
}
}
setContext("elementsProvider", {
elements: providedData
})
onMount(initSubs);
onDestroy(()=>{
if(unsubscribe) unsubscribe();
})
</script>
<slot/>