improve performance of object view

This commit is contained in:
marlon-erler
2024-07-15 21:58:32 +02:00
parent 5057d90727
commit bffacb7499
4 changed files with 48 additions and 27 deletions
+20 -13
View File
@@ -2085,7 +2085,7 @@
[appliedFilter, resultCount], [appliedFilter, resultCount],
() => translation.searchTitleText(appliedFilter.value, resultCount.value) () => translation.searchTitleText(appliedFilter.value, resultCount.value)
); );
const messageObjects = new MapState(); const showingMessageObjects = new MapState();
const cannotReset = createProxyState( const cannotReset = createProxyState(
[appliedFilter], [appliedFilter],
() => appliedFilter.value == "" () => appliedFilter.value == ""
@@ -2096,20 +2096,27 @@
} }
function applyFilter() { function applyFilter() {
appliedFilter.value = filterInput.value; appliedFilter.value = filterInput.value;
}
function updateObjects() {
const allObjects = [...chat.objects.value.entries()]; const allObjects = [...chat.objects.value.entries()];
const matchingObjects = allObjects.filter((entry) => { const matchingObjects = allObjects.filter((entry) => {
let objectTitle = entry[1].title || translation.untitledObject; return checkMatchesFilter(entry[1]);
const regex = new RegExp(appliedFilter.value.toLowerCase());
return regex.test(objectTitle.toLowerCase());
}); });
resultCount.value = matchingObjects.length; resultCount.value = matchingObjects.length;
messageObjects.clear(); showingMessageObjects.clear();
matchingObjects.forEach((entry) => messageObjects.set(...entry)); matchingObjects.forEach((entry) => showingMessageObjects.set(...entry));
} }
bulkSubscribe([appliedFilter, chat.objects], updateObjects); chat.objects.handleAddition((messageObject) => {
updateObjects(); if (checkMatchesFilter(messageObject) == false) return;
showingMessageObjects.set(messageObject.id, messageObject);
chat.objects.handleRemoval(messageObject, () => {
showingMessageObjects.remove(messageObject.id);
});
});
function checkMatchesFilter(messageObject) {
let objectTitle = messageObject.title || translation.untitledObject;
const regex = new RegExp(appliedFilter.value.toLowerCase());
return regex.test(objectTitle.toLowerCase());
}
applyFilter();
const objectModal = createProxyState( const objectModal = createProxyState(
[chat.objects, selectedObject], [chat.objects, selectedObject],
() => { () => {
@@ -2136,7 +2143,7 @@
} }
return getViewFunction()( return getViewFunction()(
chat, chat,
messageObjects, showingMessageObjects,
selectedObject, selectedObject,
isShowingObjectModal isShowingObjectModal
); );
@@ -2165,7 +2172,7 @@
class: "object-content width-100 height-100 flex scroll-no", class: "object-content width-100 height-100 flex scroll-no",
"children:set": mainView "children:set": mainView
} }
), /* @__PURE__ */ createElement("div", { class: "modal", "toggle:open": isShowingFilterModel }, /* @__PURE__ */ createElement("div", { style: "max-width: unset; width: 100%" }, /* @__PURE__ */ createElement("main", null, /* @__PURE__ */ createElement("h2", null, translation.filterObjects), /* @__PURE__ */ createElement("div", { class: "flex-column" }, /* @__PURE__ */ createElement("label", { class: "tile" }, /* @__PURE__ */ createElement("span", { class: "icon" }, "search"), /* @__PURE__ */ createElement("div", null, /* @__PURE__ */ createElement("span", null, translation.searchByTitle), /* @__PURE__ */ createElement( ), /* @__PURE__ */ createElement("div", { class: "modal", "toggle:open": isShowingFilterModel }, /* @__PURE__ */ createElement("div", { style: "max-width: 2084px" }, /* @__PURE__ */ createElement("main", null, /* @__PURE__ */ createElement("h2", null, translation.filterObjects), /* @__PURE__ */ createElement("div", { class: "flex-column" }, /* @__PURE__ */ createElement("label", { class: "tile" }, /* @__PURE__ */ createElement("span", { class: "icon" }, "search"), /* @__PURE__ */ createElement("div", null, /* @__PURE__ */ createElement("span", null, translation.searchByTitle), /* @__PURE__ */ createElement(
"input", "input",
{ {
"bind:value": filterInput, "bind:value": filterInput,
@@ -2182,7 +2189,7 @@
translation.reset translation.reset
), /* @__PURE__ */ createElement("button", { class: "width-50 flex primary", "on:click": applyFilter }, translation.search, /* @__PURE__ */ createElement("span", { class: "icon" }, "arrow_forward"))), /* @__PURE__ */ createElement("hr", null), /* @__PURE__ */ createElement("span", { class: "secondary", "subscribe:innerText": resultText }), ObjectGridView( ), /* @__PURE__ */ createElement("button", { class: "width-50 flex primary", "on:click": applyFilter }, translation.search, /* @__PURE__ */ createElement("span", { class: "icon" }, "arrow_forward"))), /* @__PURE__ */ createElement("hr", null), /* @__PURE__ */ createElement("span", { class: "secondary", "subscribe:innerText": resultText }), ObjectGridView(
chat, chat,
messageObjects, showingMessageObjects,
selectedObject, selectedObject,
isShowingObjectModal isShowingObjectModal
)), /* @__PURE__ */ createElement("button", { "on:click": closeFilters }, translation.close, /* @__PURE__ */ createElement("span", { class: "icon" }, "close")))), /* @__PURE__ */ createElement("div", { "children:set": objectModal })); )), /* @__PURE__ */ createElement("button", { "on:click": closeFilters }, translation.close, /* @__PURE__ */ createElement("span", { class: "icon" }, "close")))), /* @__PURE__ */ createElement("div", { "children:set": objectModal }));
+4
View File
@@ -787,6 +787,10 @@ header button {
max-height: 100% !important; max-height: 100% !important;
} }
.modal > div > :is(button, div.flex-row) {
min-height: var(--control-height);
}
.ellipsis { .ellipsis {
max-width: 100%; max-width: 100%;
} }
+23 -13
View File
@@ -48,7 +48,7 @@ export function ObjectPane(chat: Chat) {
const resultText = React.createProxyState([appliedFilter, resultCount], () => const resultText = React.createProxyState([appliedFilter, resultCount], () =>
translation.searchTitleText(appliedFilter.value, resultCount.value) translation.searchTitleText(appliedFilter.value, resultCount.value)
); );
const messageObjects = new React.MapState<MessageObject>(); const showingMessageObjects = new React.MapState<MessageObject>();
const cannotReset = React.createProxyState( const cannotReset = React.createProxyState(
[appliedFilter], [appliedFilter],
() => appliedFilter.value == "" () => appliedFilter.value == ""
@@ -60,21 +60,31 @@ export function ObjectPane(chat: Chat) {
} }
function applyFilter() { function applyFilter() {
appliedFilter.value = filterInput.value; appliedFilter.value = filterInput.value;
}
function updateObjects() {
const allObjects = [...chat.objects.value.entries()]; const allObjects = [...chat.objects.value.entries()];
const matchingObjects = allObjects.filter((entry) => { const matchingObjects = allObjects.filter((entry) => {
let objectTitle = entry[1].title || translation.untitledObject; return checkMatchesFilter(entry[1]);
const regex = new RegExp(appliedFilter.value.toLowerCase());
return regex.test(objectTitle.toLowerCase());
}); });
resultCount.value = matchingObjects.length; resultCount.value = matchingObjects.length;
messageObjects.clear(); showingMessageObjects.clear();
matchingObjects.forEach((entry) => messageObjects.set(...entry)); matchingObjects.forEach((entry) => showingMessageObjects.set(...entry));
} }
React.bulkSubscribe([appliedFilter, chat.objects], updateObjects);
updateObjects(); chat.objects.handleAddition(messageObject => {
if (checkMatchesFilter(messageObject) == false) return;
showingMessageObjects.set(messageObject.id, messageObject);
chat.objects.handleRemoval(messageObject, () => {
showingMessageObjects.remove(messageObject.id);
})
})
function checkMatchesFilter(messageObject: MessageObject) {
let objectTitle = messageObject.title || translation.untitledObject;
const regex = new RegExp(appliedFilter.value.toLowerCase());
return regex.test(objectTitle.toLowerCase());
}
applyFilter();
// view // view
const objectModal = React.createProxyState( const objectModal = React.createProxyState(
@@ -106,7 +116,7 @@ export function ObjectPane(chat: Chat) {
return getViewFunction()( return getViewFunction()(
chat, chat,
messageObjects, showingMessageObjects,
selectedObject, selectedObject,
isShowingObjectModal isShowingObjectModal
); );
@@ -144,7 +154,7 @@ export function ObjectPane(chat: Chat) {
></div> ></div>
<div class="modal" toggle:open={isShowingFilterModel}> <div class="modal" toggle:open={isShowingFilterModel}>
<div style="max-width: unset; width: 100%"> <div style="max-width: 2084px">
<main> <main>
<h2>{translation.filterObjects}</h2> <h2>{translation.filterObjects}</h2>
@@ -181,7 +191,7 @@ export function ObjectPane(chat: Chat) {
{ObjectGridView( {ObjectGridView(
chat, chat,
messageObjects, showingMessageObjects,
selectedObject, selectedObject,
isShowingObjectModal isShowingObjectModal
)} )}