mirror of
https://github.com/garraflavatra/rolens.git
synced 2025-04-16 15:51:03 +00:00
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
127 lines
3.0 KiB
Svelte
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}
|
|
/>
|