1
0
mirror of https://github.com/garraflavatra/rolens.git synced 2025-04-16 15:51:03 +00:00
rolens/frontend/src/components/objectgrid.svelte
Romein van Buren 24b0df95df
Add ability to see host logs (#54)
Squashed commit of the following:

commit 93b2d67cef77d89df728ffbf831e5ce79904673e
Author: Romein van Buren <romein@vburen.nl>
Date:   Sat Jul 1 20:07:33 2023 +0200

    Add filter functionality

commit 30b65a198fc8d494fe660babd409e42a85c85d14
Author: Romein van Buren <romein@vburen.nl>
Date:   Sat Jul 1 19:27:20 2023 +0200

    Renamed `form-row` class to `formrow`

commit 21afb01ea191c6d5b597884fae637ae1b8f49a7a
Author: Romein van Buren <romein@vburen.nl>
Date:   Sat Jul 1 19:26:04 2023 +0200

    Hide object types in object grid

commit 037d5432a454720ad58f3c201bc60980759cc44f
Author: Romein van Buren <romein@vburen.nl>
Date:   Sat Jul 1 19:21:54 2023 +0200

    Make auto reload interval input smaller

commit 49d50220272d87c34cd84678baf01557d4c24051
Author: Romein van Buren <romein@vburen.nl>
Date:   Sat Jul 1 15:08:00 2023 +0200

    Implement logs autoreload

commit 1f8984766bbd8a1f6ce232daa40b8c49bf079d9f
Author: Romein van Buren <romein@vburen.nl>
Date:   Sat Jul 1 15:04:00 2023 +0200

    Return on error

commit 9c8525996494f023634ac3ea64370fc2778e717c
Author: Romein van Buren <romein@vburen.nl>
Date:   Sat Jul 1 15:03:37 2023 +0200

    Add log error handling

commit 7a98a63866b6fbfe3be5897feddbacf3fafd7dbf
Author: Romein van Buren <romein@vburen.nl>
Date:   Sat Jul 1 14:46:39 2023 +0200

    Update log tab icon

commit f30827ae2ec1c6254e0aab451de6763556c90ac5
Author: Romein van Buren <romein@vburen.nl>
Date:   Sat Jul 1 14:41:59 2023 +0200

    Add host log panel
2023-07-01 20:30:43 +02:00

127 lines
3.0 KiB
Svelte

<script>
import { isBsonBuiltin } from '$lib/mongo';
import { isDate } from 'date-fns';
import Grid from './grid.svelte';
export let data = [];
export let key = '_id';
export let activePath = [];
export let hideObjectIndicators = false;
export let getRootMenu = () => undefined;
export let errorTitle = '';
export let errorDescription = '';
export let busy = false;
export let showTypes = true;
let items = [];
$: columns = [
{ key: 'key', label: 'Key' },
{ key: 'value', label: 'Value' },
showTypes ? { key: 'type', label: 'Type' } : undefined,
].filter(c => !!c);
$: if (data) {
// items = dissectObject(data).map(item => ({ ...item, menu: getRootMenu(item.key, item) }));
items = [];
if (Array.isArray(data)) {
for (const item of data) {
const newItem = {};
newItem.key = stringifyValue(item[key]);
newItem.type = getType(item[key]);
newItem.children = dissectObject(item);
newItem.menu = getRootMenu(key, item[key]);
items = [ ...items, newItem ];
}
}
else {
items = dissectObject(data);
}
}
function getType(value) {
if (isBsonBuiltin(value)) {
return value._bsontype;
}
else if (isDate(value)) {
return 'Date';
}
else if (Array.isArray(value)) {
return `array (${value.length} item${value.length === 1 ? '' : 's'})`;
}
else if (typeof value === 'number') {
if (value.toString().includes('.')) {
return 'double';
}
return 'integer';
}
else if (value === null) {
return 'null';
}
else if (typeof value === 'object') {
const keys = Object.keys(value);
return `object (${keys.length} item${keys.length === 1 ? '' : 's'})`;
}
else {
return typeof value;
}
}
function stringifyValue(value) {
if (isBsonBuiltin(value)) {
value = value.inspect?.();
if (value.startsWith('new ')) {
value = value.slice(4);
}
if (value.startsWith('Int32(')) {
value = value.slice(6, -1);
}
else if (value.startsWith('Double(')) {
value = value.slice(7, -1);
}
else if (value.startsWith('Binary(Buffer.from(')) {
value = `BinData(${JSON.stringify(value.sub_type || 0)}, ${value.slice(19, -1)}`;
}
}
else if (isDate(value)) {
value = value.toString();
}
return value;
}
function dissectObject(object) {
const entries = [ ...Array.isArray(object) ? object.entries() : Object.entries(object) ];
return entries.map(([ key, value ]) => {
const type = getType(value);
key = key + '';
const child = {
key,
type,
value: stringifyValue(value),
menu: value?.menu,
};
if (type.startsWith('object') || type.startsWith('array')) {
child.children = dissectObject(value);
}
return child;
});
}
</script>
<Grid
key="key"
on:select
on:trigger
bind:activePath
{columns}
{items}
{hideObjectIndicators}
{errorTitle}
{errorDescription}
{busy}
/>