= {
id: col.id,
header: col.header as any,
diff --git a/web/src/plugins/logs/DetailTable.vue b/web/src/plugins/logs/DetailTable.vue
index 7bfb2b56c4..56ce9138f3 100644
--- a/web/src/plugins/logs/DetailTable.vue
+++ b/web/src/plugins/logs/DetailTable.vue
@@ -232,10 +232,10 @@ along with this program. If not, see .
.
:class="localSavedViews.length > 0 ? 'tw:border-r tw:border-[var(--o2-border-color)]' : ''"
:style="localSavedViews.length > 0 ? 'width: 60%' : 'width: 100%'"
>
-
+
.
class="tw:flex tw:flex-col tw:w-[40%] tw:ml-0 tw:pl-3"
v-if="localSavedViews.length > 0"
>
-
+
.
-
+
@@ -277,6 +277,9 @@ along with this program. If not, see .
tree
tree-column-id="index"
:default-columns="false"
+ :enable-column-resize="true"
+ :persist-columns="true"
+ table-id="logs-search-job-inspector"
style="width: 100%;"
class="o2-quasar-table o2-row-md o2-quasar-table-header-sticky"
data-test="inspector-events-table"
@@ -298,8 +301,12 @@ along with this program. If not, see .
+
+ {{ row.component }}
+
+
- {{ row.desc || '-' }}
+ {{ row.desc || '-' }}
@@ -455,7 +462,7 @@ export default defineComponent({
header: "Node Name",
accessorKey: "node_name",
meta: { align: "left" },
- size: 200,
+ size: 280,
},
{
id: "search_role",
@@ -469,7 +476,7 @@ export default defineComponent({
header: "Operation",
accessorKey: "component",
meta: { align: "left" },
- size: 250,
+ size: 340,
},
{
id: "desc",
diff --git a/web/src/plugins/traces/components/TraceServiceCell.spec.ts b/web/src/plugins/traces/components/TraceServiceCell.spec.ts
index 62828a5605..c5afdd838c 100644
--- a/web/src/plugins/traces/components/TraceServiceCell.spec.ts
+++ b/web/src/plugins/traces/components/TraceServiceCell.spec.ts
@@ -15,6 +15,7 @@
import { describe, it, expect, afterEach, vi } from "vitest";
import { mount, VueWrapper } from "@vue/test-utils";
+import { createStore } from "vuex";
const mockServiceColors: Record = {
frontend: "#4caf50",
@@ -48,6 +49,7 @@ vi.mock("@/utils/traces/convertTraceData", () => ({
import TraceServiceCell from "./TraceServiceCell.vue";
import { getServiceIconDataUrl } from "@/utils/traces/convertTraceData";
+const store = createStore({ state: { theme: "light" } });
const makeItem = (overrides: Record = {}) => ({
service_name: "frontend",
@@ -66,19 +68,19 @@ describe("TraceServiceCell", () => {
describe("rendering", () => {
it("mounts without errors", () => {
- wrapper = mount(TraceServiceCell, { props: { item: makeItem() } });
+ wrapper = mount(TraceServiceCell, { props: { item: makeItem() }, global: { plugins: [store] } });
expect(wrapper.exists()).toBe(true);
});
it("renders the service row container", () => {
- wrapper = mount(TraceServiceCell, { props: { item: makeItem() } });
+ wrapper = mount(TraceServiceCell, { props: { item: makeItem() }, global: { plugins: [store] } });
expect(wrapper.find('[data-test="trace-row-service"]').exists()).toBe(
true,
);
});
it("renders service name", () => {
- wrapper = mount(TraceServiceCell, { props: { item: makeItem() } });
+ wrapper = mount(TraceServiceCell, { props: { item: makeItem() }, global: { plugins: [store] } });
const name = wrapper.find('[data-test="trace-row-service-name"]');
expect(name.exists()).toBe(true);
expect(name.text()).toBe("frontend");
@@ -87,7 +89,7 @@ describe("TraceServiceCell", () => {
// TraceServiceCell only renders service name and icon.
// Operation name is rendered by a separate column cell — not this component.
it.skip("renders operation name", () => {
- wrapper = mount(TraceServiceCell, { props: { item: makeItem() } });
+ wrapper = mount(TraceServiceCell, { props: { item: makeItem() }, global: { plugins: [store] } });
const op = wrapper.find('[data-test="trace-row-operation-name"]');
expect(op.exists()).toBe(true);
expect(op.text()).toBe("GET /api/v1/users");
@@ -96,20 +98,20 @@ describe("TraceServiceCell", () => {
describe("service icon", () => {
it("should render the service icon img", () => {
- wrapper = mount(TraceServiceCell, { props: { item: makeItem() } });
+ wrapper = mount(TraceServiceCell, { props: { item: makeItem() }, global: { plugins: [store] } });
expect(
wrapper.find('[data-test="trace-row-service-icon"]').exists(),
).toBe(true);
});
it("should set the icon src from getServiceIconDataUrl", () => {
- wrapper = mount(TraceServiceCell, { props: { item: makeItem() } });
+ wrapper = mount(TraceServiceCell, { props: { item: makeItem() }, global: { plugins: [store] } });
const img = wrapper.find('[data-test="trace-row-service-icon"]');
expect(img.attributes("src")).toBe("data:image/svg+xml;base64,TEST");
});
it("should call getServiceIconDataUrl with service name and color", () => {
- wrapper = mount(TraceServiceCell, { props: { item: makeItem() } });
+ wrapper = mount(TraceServiceCell, { props: { item: makeItem() }, global: { plugins: [store] } });
expect(vi.mocked(getServiceIconDataUrl)).toHaveBeenCalledWith(
"frontend",
expect.any(Boolean),
@@ -120,6 +122,7 @@ describe("TraceServiceCell", () => {
it("should use fallback color #9e9e9e for unknown service", () => {
wrapper = mount(TraceServiceCell, {
props: { item: makeItem({ service_name: "unknown-svc" }) },
+ global: { plugins: [store] },
});
expect(vi.mocked(getServiceIconDataUrl)).toHaveBeenCalledWith(
"unknown-svc",
@@ -135,6 +138,7 @@ describe("TraceServiceCell", () => {
props: {
item: makeItem({ services: { frontend: { duration: 100 } } }),
},
+ global: { plugins: [store] },
});
expect(
wrapper.find('[data-test="trace-row-extra-services"]').exists(),
@@ -149,6 +153,7 @@ describe("TraceServiceCell", () => {
services: { frontend: { duration: 100 } },
}),
},
+ global: { plugins: [store] },
});
expect(
wrapper.find('[data-test="trace-row-extra-services"]').exists(),
@@ -160,6 +165,7 @@ describe("TraceServiceCell", () => {
it("handles undefined services gracefully", () => {
wrapper = mount(TraceServiceCell, {
props: { item: { service_name: "frontend", operation_name: "op" } },
+ global: { plugins: [store] },
});
expect(wrapper.find('[data-test="trace-row-service-name"]').text()).toBe(
"frontend",
@@ -172,6 +178,7 @@ describe("TraceServiceCell", () => {
it("handles empty services object", () => {
wrapper = mount(TraceServiceCell, {
props: { item: makeItem({ services: {} }) },
+ global: { plugins: [store] },
});
expect(
wrapper.find('[data-test="trace-row-extra-services"]').exists(),
diff --git a/web/src/plugins/traces/components/TraceServiceCell.vue b/web/src/plugins/traces/components/TraceServiceCell.vue
index 9c4cda402f..43572710ff 100644
--- a/web/src/plugins/traces/components/TraceServiceCell.vue
+++ b/web/src/plugins/traces/components/TraceServiceCell.vue
@@ -42,6 +42,7 @@ along with this program. If not, see .