1
0
mirror of https://github.com/garraflavatra/rolens.git synced 2025-04-20 01:01:03 +00:00
rolens/frontend/src/components/objectgrid.svelte

120 lines
2.8 KiB
Svelte
Raw Normal View History

2023-01-10 17:28:27 +01:00
<script>
2023-01-31 16:58:23 +01:00
import { isDate } from 'date-fns';
import { isBsonBuiltin } from '../utils';
2023-01-10 17:28:27 +01:00
import Grid from './grid.svelte';
export let data = [];
export let key = '_id';
2023-01-18 16:31:13 +01:00
export let activePath = [];
export let hideObjectIndicators = false;
export let getRootMenu = () => undefined;
2023-01-10 20:22:57 +01:00
const columns = [
{ key: 'key', label: 'Key' },
{ key: 'value', label: 'Value' },
{ key: 'type', label: 'Type' },
];
2023-01-10 17:28:27 +01:00
let items = [];
$: if (data) {
2023-01-24 20:55:53 +01:00
// items = dissectObject(data).map(item => ({ ...item, menu: getRootMenu(item.key, item) }));
2023-01-10 17:28:27 +01:00
items = [];
if (Array.isArray(data)) {
for (const item of data) {
2023-01-17 21:03:01 +01:00
const newItem = {};
2023-01-24 20:55:53 +01:00
newItem.key = stringifyValue(item[key]);
2023-01-18 14:15:54 +01:00
newItem.type = getType(item[key]);
2023-01-18 16:31:13 +01:00
newItem.children = dissectObject(item);
newItem.menu = getRootMenu(key, item[key]);
2023-01-17 21:03:01 +01:00
items = [ ...items, newItem ];
2023-01-10 17:28:27 +01:00
}
}
else {
items = dissectObject(data);
}
}
function getType(value) {
2023-01-24 20:55:53 +01:00
if (isBsonBuiltin(value)) {
return value._bsontype;
}
else if (isDate(value)) {
return 'Date';
}
else if (Array.isArray(value)) {
2023-01-10 17:28:27 +01:00
return `array (${value.length} item${value.length === 1 ? '' : 's'})`;
}
2023-01-10 20:10:39 +01:00
else if (typeof value === 'number') {
if (value.toString().includes('.')) {
return 'double';
}
return 'integer';
}
2023-01-21 10:25:19 +01:00
else if (value === null) {
return 'null';
}
else if (typeof value === 'object') {
2023-01-10 17:28:27 +01:00
const keys = Object.keys(value);
return `object (${keys.length} item${keys.length === 1 ? '' : 's'})`;
}
else {
return typeof value;
}
}
2023-01-24 20:55:53 +01:00
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(')) {
2023-01-25 16:16:40 +01:00
value = `BinData(${JSON.stringify(value.sub_type || 0)}, ${value.slice(19, -1)}`;
2023-01-24 20:55:53 +01:00
}
}
else if (isDate(value)) {
value = value.toString();
}
return value;
}
2023-01-18 16:31:13 +01:00
function dissectObject(object) {
2023-01-13 16:56:48 +01:00
const entries = [ ...Array.isArray(object) ? object.entries() : Object.entries(object) ];
2023-01-18 16:31:13 +01:00
return entries.map(([ key, value ]) => {
2023-01-10 17:28:27 +01:00
const type = getType(value);
2023-01-24 20:55:53 +01:00
key = key + '';
const child = {
key,
type,
value: stringifyValue(value),
menu: value?.menu,
};
2023-01-10 17:28:27 +01:00
2023-01-13 16:56:48 +01:00
if (type.startsWith('object') || type.startsWith('array')) {
2023-01-10 17:28:27 +01:00
child.children = dissectObject(value);
}
return child;
});
}
</script>
2023-01-15 12:02:17 +01:00
<Grid
key="key"
on:select
on:trigger
2023-01-18 16:31:13 +01:00
bind:activePath
2023-01-15 12:02:17 +01:00
{columns}
{items}
{hideObjectIndicators}
2023-01-15 12:02:17 +01:00
/>