Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 26 additions & 7 deletions src/app/api/query/zones.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { useQueryClient, useMutation } from "@tanstack/react-query";
import { useMutation, useQueryClient } from "@tanstack/react-query";

import { useWebsocketAwareQuery } from "@/app/api/query/base";
import {
Expand All @@ -15,6 +15,9 @@ import type {
GetZoneData,
GetZoneErrors,
GetZoneResponses,
ListZonesData,
ListZonesErrors,
ListZonesResponses,
ListZonesWithSummaryData,
ListZonesWithSummaryErrors,
ListZonesWithSummaryResponses,
Expand All @@ -24,24 +27,40 @@ import type {
UpdateZoneResponses,
} from "@/app/apiclient";
import {
deleteZone,
updateZone,
createZone,
deleteZone,
getZone,
listZones,
listZonesWithSummary,
updateZone,
} from "@/app/apiclient";
import {
getZoneQueryKey,
listZonesQueryKey,
listZonesWithSummaryQueryKey,
} from "@/app/apiclient/@tanstack/react-query.gen";

export const useZones = (options?: Options<ListZonesWithSummaryData>) => {
return useWebsocketAwareQuery(
queryOptionsWithHeaders<
export const useZones = (
options?: Options<ListZonesWithSummaryData>,
enabled?: boolean
) => {
return useWebsocketAwareQuery({
...queryOptionsWithHeaders<
ListZonesWithSummaryResponses,
ListZonesWithSummaryErrors,
ListZonesWithSummaryData
>(options, listZonesWithSummary, listZonesWithSummaryQueryKey(options))
>(options, listZonesWithSummary, listZonesWithSummaryQueryKey(options)),
enabled: enabled !== undefined ? enabled : true,
});
};

export const useBaseZones = (options?: Options<ListZonesData>) => {
return useWebsocketAwareQuery(
queryOptionsWithHeaders<ListZonesResponses, ListZonesErrors, ListZonesData>(
options,
listZones,
listZonesQueryKey(options)
)
);
};

Expand Down
55 changes: 47 additions & 8 deletions src/app/zones/components/ZonesTable/ZonesTable.tsx
Original file line number Diff line number Diff line change
@@ -1,36 +1,75 @@
import React from "react";
import React, { useMemo } from "react";

import { GenericTable } from "@canonical/maas-react-components";

import { useZones } from "@/app/api/query/zones";
import { useBaseZones, useZones } from "@/app/api/query/zones";
import usePagination from "@/app/base/hooks/usePagination/usePagination";
import type { ZoneRow } from "@/app/zones/components/ZonesTable/useZonesTableColumns/useZonesTableColumns";
import useZonesTableColumns from "@/app/zones/components/ZonesTable/useZonesTableColumns/useZonesTableColumns";

import "./_index.scss";

const ZonesTable: React.FC = () => {
const { page, debouncedPage, size, handlePageSizeChange, setPage } =
usePagination();
const zones = useZones({

const baseZones = useBaseZones({
query: { page: debouncedPage, size },
});

const columns = useZonesTableColumns();
const zonesWithSummary = useZones(
{
query: { page: debouncedPage, size },
},
baseZones.isSuccess
);

const columns = useZonesTableColumns({
isSummaryPending: zonesWithSummary.isPending,
});

const data = useMemo((): ZoneRow[] => {
if (!baseZones.data) {
return [];
}

if (!zonesWithSummary.data) {
return baseZones.data.items.map((item) => ({

Check failure on line 37 in src/app/zones/components/ZonesTable/ZonesTable.tsx

View workflow job for this annotation

GitHub Actions / Test

src/app/zones/components/ZonesTable/ZonesTable.test.tsx > ZonesTable > actions > opens delete zone side panel form

TestingLibraryElementError: Unable to find an accessible element with the role "button" and name "Delete" Here are the accessible roles: heading: Name "Unexpected Application Error!": <h2 /> Name "Cannot read properties of undefined (reading 'map')": <h3 style="font-style: italic;" /> -------------------------------------------------- paragraph: Name "": <p /> Name "": <p /> -------------------------------------------------- code: Name "": <code style="padding: 2px 4px; background-color: rgba(200, 200, 200, 0.5);" /> Name "": <code style="padding: 2px 4px; background-color: rgba(200, 200, 200, 0.5);" /> -------------------------------------------------- Ignored nodes: comments, script, style <body> <div> <h2> Unexpected Application Error! </h2> <h3 style="font-style: italic;" > Cannot read properties of undefined (reading 'map') </h3> <pre style="padding: 0.5rem; background-color: rgba(200, 200, 200, 0.5);" > TypeError: Cannot read properties of undefined (reading 'map') at /home/runner/work/maas-ui/maas-ui/src/app/zones/components/ZonesTable/ZonesTable.tsx:37:35 at updateMemo (/home/runner/work/maas-ui/maas-ui/node_modules/react-dom/cjs/react-dom-client.development.js:8795:19) at Object.useMemo (/home/runner/work/maas-ui/maas-ui/node_modules/react-dom/cjs/react-dom-client.development.js:26484:18) at Proxy.process.env.NODE_ENV.exports.useMemo (/home/runner/work/maas-ui/maas-ui/node_modules/react/cjs/react.development.js:1251:34) at ZonesTable (/home/runner/work/maas-ui/maas-ui/src/app/zones/components/ZonesTable/ZonesTable.tsx:31:16) at Object.react_stack_bottom_frame (/home/runner/work/maas-ui/maas-ui/node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) at renderWithHooks (/home/runner/work/maas-ui/maas-ui/node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) at updateFunctionComponent (/home/runner/work/maas-ui/maas-ui/node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) at beginWork (/home/runner/work/maas-ui/maas-ui/node_modules/react-dom/cjs/react-dom-client.development.js:11778:18) at runWithFiberInDEV (/home/runner/work/maas-ui/maas-ui/node_modules/react-dom/cjs/react-dom-client.development.js:874:13) </pre> <p> 💿 Hey developer 👋 </p> <p> You can provide a way better UX than this when your app throws errors by providing your own <code style="padding: 2px 4px; background-color: rgba(200, 200, 200, 0.5);" > ErrorBoundary </code> or <code style="padding: 2px 4px; background-color: rgba(200, 200, 200, 0.5);" > errorElement </code> prop on your route. </p> </div> </body> ❯ src/app/zones/components/ZonesTable/ZonesTable.tsx:37:35 ❯ updateMemo node_modules/react-dom/cjs/react-dom-client.development.js:8795:19 ❯ Object.useMemo node_modules/react-dom/cjs/react-dom-client.development.js:26484:18 ❯ Proxy.process.env.NODE_ENV.exports.useMemo node_modules/react/cjs/react.development.js:1251:34 ❯ ZonesTable src/app/zones/components/ZonesTable/ZonesTable.tsx:31:16 ❯ Object.react_stack_bottom_frame node_modules/react-dom/cjs/react-dom-client.development.js:25904:20 ❯ renderWithHooks node_modules/react-dom/cjs/react-dom-client.development.js:7662:22 ❯ updateFunctionComponent node_modules/react-dom/cjs/react-dom-client.development.js:10166:19 ❯ beginWork node_modules/react-dom/cjs/react-dom-client.development.js:11778:18 ❯ Object.getElementError node_modules/@testing-library/dom/dist/config.js:37:19 ❯ node_modules/@testing-library/dom/dist/query-helpers.js:76:38 ❯ node_modules/@testing-library/dom/dist/query-helpers.js:52:17 ❯ node_modules/@testing-library/dom/dist/query-helpers.js:95:19 ❯ src/app/zones/components/ZonesTable/ZonesTable.test.tsx:225:18

Check failure on line 37 in src/app/zones/components/ZonesTable/ZonesTable.tsx

View workflow job for this annotation

GitHub Actions / Test

src/app/zones/components/ZonesTable/ZonesTable.test.tsx > ZonesTable > actions > opens edit zones side panel form

TestingLibraryElementError: Unable to find an accessible element with the role "button" and name "Edit" Here are the accessible roles: heading: Name "Unexpected Application Error!": <h2 /> Name "Cannot read properties of undefined (reading 'map')": <h3 style="font-style: italic;" /> -------------------------------------------------- paragraph: Name "": <p /> Name "": <p /> -------------------------------------------------- code: Name "": <code style="padding: 2px 4px; background-color: rgba(200, 200, 200, 0.5);" /> Name "": <code style="padding: 2px 4px; background-color: rgba(200, 200, 200, 0.5);" /> -------------------------------------------------- Ignored nodes: comments, script, style <body> <div> <h2> Unexpected Application Error! </h2> <h3 style="font-style: italic;" > Cannot read properties of undefined (reading 'map') </h3> <pre style="padding: 0.5rem; background-color: rgba(200, 200, 200, 0.5);" > TypeError: Cannot read properties of undefined (reading 'map') at /home/runner/work/maas-ui/maas-ui/src/app/zones/components/ZonesTable/ZonesTable.tsx:37:35 at updateMemo (/home/runner/work/maas-ui/maas-ui/node_modules/react-dom/cjs/react-dom-client.development.js:8795:19) at Object.useMemo (/home/runner/work/maas-ui/maas-ui/node_modules/react-dom/cjs/react-dom-client.development.js:26484:18) at Proxy.process.env.NODE_ENV.exports.useMemo (/home/runner/work/maas-ui/maas-ui/node_modules/react/cjs/react.development.js:1251:34) at ZonesTable (/home/runner/work/maas-ui/maas-ui/src/app/zones/components/ZonesTable/ZonesTable.tsx:31:16) at Object.react_stack_bottom_frame (/home/runner/work/maas-ui/maas-ui/node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) at renderWithHooks (/home/runner/work/maas-ui/maas-ui/node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) at updateFunctionComponent (/home/runner/work/maas-ui/maas-ui/node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) at beginWork (/home/runner/work/maas-ui/maas-ui/node_modules/react-dom/cjs/react-dom-client.development.js:11778:18) at runWithFiberInDEV (/home/runner/work/maas-ui/maas-ui/node_modules/react-dom/cjs/react-dom-client.development.js:874:13) </pre> <p> 💿 Hey developer 👋 </p> <p> You can provide a way better UX than this when your app throws errors by providing your own <code style="padding: 2px 4px; background-color: rgba(200, 200, 200, 0.5);" > ErrorBoundary </code> or <code style="padding: 2px 4px; background-color: rgba(200, 200, 200, 0.5);" > errorElement </code> prop on your route. </p> </div> </body> ❯ src/app/zones/components/ZonesTable/ZonesTable.tsx:37:35 ❯ updateMemo node_modules/react-dom/cjs/react-dom-client.development.js:8795:19 ❯ Object.useMemo node_modules/react-dom/cjs/react-dom-client.development.js:26484:18 ❯ Proxy.process.env.NODE_ENV.exports.useMemo node_modules/react/cjs/react.development.js:1251:34 ❯ ZonesTable src/app/zones/components/ZonesTable/ZonesTable.tsx:31:16 ❯ Object.react_stack_bottom_frame node_modules/react-dom/cjs/react-dom-client.development.js:25904:20 ❯ renderWithHooks node_modules/react-dom/cjs/react-dom-client.development.js:7662:22 ❯ updateFunctionComponent node_modules/react-dom/cjs/react-dom-client.development.js:10166:19 ❯ beginWork node_modules/react-dom/cjs/react-dom-client.development.js:11778:18 ❯ Object.getElementError node_modules/@testing-library/dom/dist/config.js:37:19 ❯ node_modules/@testing-library/dom/dist/query-helpers.js:76:38 ❯ node_modules/@testing-library/dom/dist/query-helpers.js:52:17 ❯ node_modules/@testing-library/dom/dist/query-helpers.js:95:19 ❯ src/app/zones/components/ZonesTable/ZonesTable.test.tsx:196:18

Check failure on line 37 in src/app/zones/components/ZonesTable/ZonesTable.tsx

View workflow job for this annotation

GitHub Actions / Test

src/app/zones/components/ZonesTable/ZonesTable.test.tsx > ZonesTable > permissions > disables the delete button for default zones

TestingLibraryElementError: Unable to find an accessible element with the role "button" and name "Delete" Here are the accessible roles: heading: Name "Unexpected Application Error!": <h2 /> Name "Cannot read properties of undefined (reading 'map')": <h3 style="font-style: italic;" /> -------------------------------------------------- paragraph: Name "": <p /> Name "": <p /> -------------------------------------------------- code: Name "": <code style="padding: 2px 4px; background-color: rgba(200, 200, 200, 0.5);" /> Name "": <code style="padding: 2px 4px; background-color: rgba(200, 200, 200, 0.5);" /> -------------------------------------------------- Ignored nodes: comments, script, style <body> <div> <h2> Unexpected Application Error! </h2> <h3 style="font-style: italic;" > Cannot read properties of undefined (reading 'map') </h3> <pre style="padding: 0.5rem; background-color: rgba(200, 200, 200, 0.5);" > TypeError: Cannot read properties of undefined (reading 'map') at /home/runner/work/maas-ui/maas-ui/src/app/zones/components/ZonesTable/ZonesTable.tsx:37:35 at updateMemo (/home/runner/work/maas-ui/maas-ui/node_modules/react-dom/cjs/react-dom-client.development.js:8795:19) at Object.useMemo (/home/runner/work/maas-ui/maas-ui/node_modules/react-dom/cjs/react-dom-client.development.js:26484:18) at Proxy.process.env.NODE_ENV.exports.useMemo (/home/runner/work/maas-ui/maas-ui/node_modules/react/cjs/react.development.js:1251:34) at ZonesTable (/home/runner/work/maas-ui/maas-ui/src/app/zones/components/ZonesTable/ZonesTable.tsx:31:16) at Object.react_stack_bottom_frame (/home/runner/work/maas-ui/maas-ui/node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) at renderWithHooks (/home/runner/work/maas-ui/maas-ui/node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) at updateFunctionComponent (/home/runner/work/maas-ui/maas-ui/node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) at beginWork (/home/runner/work/maas-ui/maas-ui/node_modules/react-dom/cjs/react-dom-client.development.js:11778:18) at runWithFiberInDEV (/home/runner/work/maas-ui/maas-ui/node_modules/react-dom/cjs/react-dom-client.development.js:874:13) </pre> <p> 💿 Hey developer 👋 </p> <p> You can provide a way better UX than this when your app throws errors by providing your own <code style="padding: 2px 4px; background-color: rgba(200, 200, 200, 0.5);" > ErrorBoundary </code> or <code style="padding: 2px 4px; background-color: rgba(200, 200, 200, 0.5);" > errorElement </code> prop on your route. </p> </div> </body> ❯ src/app/zones/components/ZonesTable/ZonesTable.tsx:37:35 ❯ updateMemo node_modules/react-dom/cjs/react-dom-client.development.js:8795:19 ❯ Object.useMemo node_modules/react-dom/cjs/react-dom-client.development.js:26484:18 ❯ Proxy.process.env.NODE_ENV.exports.useMemo node_modules/react/cjs/react.development.js:1251:34 ❯ ZonesTable src/app/zones/components/ZonesTable/ZonesTable.tsx:31:16 ❯ Object.react_stack_bottom_frame node_modules/react-dom/cjs/react-dom-client.development.js:25904:20 ❯ renderWithHooks node_modules/react-dom/cjs/react-dom-client.development.js:7662:22 ❯ updateFunctionComponent node_modules/react-dom/cjs/react-dom-client.development.js:10166:19 ❯ beginWork node_modules/react-dom/cjs/react-dom-client.development.js:11778:18 ❯ Object.getElementError node_modules/@testing-library/dom/dist/config.js:37:19 ❯ node_modules/@testing-library/dom/dist/query-helpers.js:76:38 ❯ node_modules/@testing-library/dom/dist/query-helpers.js:52:17 ❯ node_modules/@testing-library/dom/dist/query-helpers.js:95:19 ❯ src/app/zones/components/ZonesTable/ZonesTable.test.tsx:177:18

Check failure on line 37 in src/app/zones/components/ZonesTable/ZonesTable.tsx

View workflow job for this annotation

GitHub Actions / Test

src/app/zones/components/ZonesTable/ZonesTable.test.tsx > ZonesTable > display > can show a controller filter link

TestingLibraryElementError: Unable to find an accessible element with the role "row" and name `/^default/i` Here are the accessible roles: heading: Name "Unexpected Application Error!": <h2 /> Name "Cannot read properties of undefined (reading 'map')": <h3 style="font-style: italic;" /> -------------------------------------------------- paragraph: Name "": <p /> Name "": <p /> -------------------------------------------------- code: Name "": <code style="padding: 2px 4px; background-color: rgba(200, 200, 200, 0.5);" /> Name "": <code style="padding: 2px 4px; background-color: rgba(200, 200, 200, 0.5);" /> -------------------------------------------------- Ignored nodes: comments, script, style <body> <div> <h2> Unexpected Application Error! </h2> <h3 style="font-style: italic;" > Cannot read properties of undefined (reading 'map') </h3> <pre style="padding: 0.5rem; background-color: rgba(200, 200, 200, 0.5);" > TypeError: Cannot read properties of undefined (reading 'map') at /home/runner/work/maas-ui/maas-ui/src/app/zones/components/ZonesTable/ZonesTable.tsx:37:35 at updateMemo (/home/runner/work/maas-ui/maas-ui/node_modules/react-dom/cjs/react-dom-client.development.js:8795:19) at Object.useMemo (/home/runner/work/maas-ui/maas-ui/node_modules/react-dom/cjs/react-dom-client.development.js:26484:18) at Proxy.process.env.NODE_ENV.exports.useMemo (/home/runner/work/maas-ui/maas-ui/node_modules/react/cjs/react.development.js:1251:34) at ZonesTable (/home/runner/work/maas-ui/maas-ui/src/app/zones/components/ZonesTable/ZonesTable.tsx:31:16) at Object.react_stack_bottom_frame (/home/runner/work/maas-ui/maas-ui/node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) at renderWithHooks (/home/runner/work/maas-ui/maas-ui/node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) at updateFunctionComponent (/home/runner/work/maas-ui/maas-ui/node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) at beginWork (/home/runner/work/maas-ui/maas-ui/node_modules/react-dom/cjs/react-dom-client.development.js:11778:18) at runWithFiberInDEV (/home/runner/work/maas-ui/maas-ui/node_modules/react-dom/cjs/react-dom-client.development.js:874:13) </pre> <p> 💿 Hey developer 👋 </p> <p> You can provide a way better UX than this when your app throws errors by providing your own <code style="padding: 2px 4px; background-color: rgba(200, 200, 200, 0.5);" > ErrorBoundary </code> or <code style="padding: 2px 4px; background-color: rgba(200, 200, 200, 0.5);" > errorElement </code> prop on your route. </p> </div> </body> ❯ src/app/zones/components/ZonesTable/ZonesTable.tsx:37:35 ❯ updateMemo node_modules/react-dom/cjs/react-dom-client.development.js:8795:19 ❯ Object.useMemo node_modules/react-dom/cjs/react-dom-client.development.js:26484:18 ❯ Proxy.process.env.NODE_ENV.exports.useMemo node_modules/react/cjs/react.development.js:1251:34 ❯ ZonesTable src/app/zones/components/ZonesTable/ZonesTable.tsx:31:16 ❯ Object.react_stack_bottom_frame node_modules/react-dom/cjs/react-dom-client.development.js:25904:20 ❯ renderWithHooks node_modules/react-dom/cjs/react-dom-client.development.js:7662:22 ❯ updateFunctionComponent node_modules/react-dom/cjs/react-dom-client.development.js:10166:19 ❯ beginWork node_modules/react-dom/cjs/react-dom-client.development.js:11778:18 ❯ Object.getElementError node_modules/@testing-library/dom/dist/config.js:37:19 ❯ node_modules/@testing-library/dom/dist/query-helpers.js:76:38 ❯ node_modules/@testing-library/dom/dist/query-helpers.js:52:17 ❯ node_modules/@testing-library/dom/dist/query-helpers.js:95:19 ❯ src/app/zones/components/ZonesTable/ZonesTable.test.tsx:142:20

Check failure on line 37 in src/app/zones/components/ZonesTable/ZonesTable.tsx

View workflow job for this annotation

GitHub Actions / Test

src/app/zones/components/ZonesTable/ZonesTable.test.tsx > ZonesTable > display > can show a device filter link

TestingLibraryElementError: Unable to find an accessible element with the role "row" and name `/^default/i` Here are the accessible roles: heading: Name "Unexpected Application Error!": <h2 /> Name "Cannot read properties of undefined (reading 'map')": <h3 style="font-style: italic;" /> -------------------------------------------------- paragraph: Name "": <p /> Name "": <p /> -------------------------------------------------- code: Name "": <code style="padding: 2px 4px; background-color: rgba(200, 200, 200, 0.5);" /> Name "": <code style="padding: 2px 4px; background-color: rgba(200, 200, 200, 0.5);" /> -------------------------------------------------- Ignored nodes: comments, script, style <body> <div> <h2> Unexpected Application Error! </h2> <h3 style="font-style: italic;" > Cannot read properties of undefined (reading 'map') </h3> <pre style="padding: 0.5rem; background-color: rgba(200, 200, 200, 0.5);" > TypeError: Cannot read properties of undefined (reading 'map') at /home/runner/work/maas-ui/maas-ui/src/app/zones/components/ZonesTable/ZonesTable.tsx:37:35 at updateMemo (/home/runner/work/maas-ui/maas-ui/node_modules/react-dom/cjs/react-dom-client.development.js:8795:19) at Object.useMemo (/home/runner/work/maas-ui/maas-ui/node_modules/react-dom/cjs/react-dom-client.development.js:26484:18) at Proxy.process.env.NODE_ENV.exports.useMemo (/home/runner/work/maas-ui/maas-ui/node_modules/react/cjs/react.development.js:1251:34) at ZonesTable (/home/runner/work/maas-ui/maas-ui/src/app/zones/components/ZonesTable/ZonesTable.tsx:31:16) at Object.react_stack_bottom_frame (/home/runner/work/maas-ui/maas-ui/node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) at renderWithHooks (/home/runner/work/maas-ui/maas-ui/node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) at updateFunctionComponent (/home/runner/work/maas-ui/maas-ui/node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) at beginWork (/home/runner/work/maas-ui/maas-ui/node_modules/react-dom/cjs/react-dom-client.development.js:11778:18) at runWithFiberInDEV (/home/runner/work/maas-ui/maas-ui/node_modules/react-dom/cjs/react-dom-client.development.js:874:13) </pre> <p> 💿 Hey developer 👋 </p> <p> You can provide a way better UX than this when your app throws errors by providing your own <code style="padding: 2px 4px; background-color: rgba(200, 200, 200, 0.5);" > ErrorBoundary </code> or <code style="padding: 2px 4px; background-color: rgba(200, 200, 200, 0.5);" > errorElement </code> prop on your route. </p> </div> </body> ❯ src/app/zones/components/ZonesTable/ZonesTable.tsx:37:35 ❯ updateMemo node_modules/react-dom/cjs/react-dom-client.development.js:8795:19 ❯ Object.useMemo node_modules/react-dom/cjs/react-dom-client.development.js:26484:18 ❯ Proxy.process.env.NODE_ENV.exports.useMemo node_modules/react/cjs/react.development.js:1251:34 ❯ ZonesTable src/app/zones/components/ZonesTable/ZonesTable.tsx:31:16 ❯ Object.react_stack_bottom_frame node_modules/react-dom/cjs/react-dom-client.development.js:25904:20 ❯ renderWithHooks node_modules/react-dom/cjs/react-dom-client.development.js:7662:22 ❯ updateFunctionComponent node_modules/react-dom/cjs/react-dom-client.development.js:10166:19 ❯ beginWork node_modules/react-dom/cjs/react-dom-client.development.js:11778:18 ❯ Object.getElementError node_modules/@testing-library/dom/dist/config.js:37:19 ❯ node_modules/@testing-library/dom/dist/query-helpers.js:76:38 ❯ node_modules/@testing-library/dom/dist/query-helpers.js:52:17 ❯ node_modules/@testing-library/dom/dist/query-helpers.js:95:19 ❯ src/app/zones/components/ZonesTable/ZonesTable.test.tsx:114:20

Check failure on line 37 in src/app/zones/components/ZonesTable/ZonesTable.tsx

View workflow job for this annotation

GitHub Actions / Test

src/app/zones/components/ZonesTable/ZonesTable.test.tsx > ZonesTable > display > can show a machine filter link

TestingLibraryElementError: Unable to find an accessible element with the role "row" and name `/^default/i` Here are the accessible roles: heading: Name "Unexpected Application Error!": <h2 /> Name "Cannot read properties of undefined (reading 'map')": <h3 style="font-style: italic;" /> -------------------------------------------------- paragraph: Name "": <p /> Name "": <p /> -------------------------------------------------- code: Name "": <code style="padding: 2px 4px; background-color: rgba(200, 200, 200, 0.5);" /> Name "": <code style="padding: 2px 4px; background-color: rgba(200, 200, 200, 0.5);" /> -------------------------------------------------- Ignored nodes: comments, script, style <body> <div> <h2> Unexpected Application Error! </h2> <h3 style="font-style: italic;" > Cannot read properties of undefined (reading 'map') </h3> <pre style="padding: 0.5rem; background-color: rgba(200, 200, 200, 0.5);" > TypeError: Cannot read properties of undefined (reading 'map') at /home/runner/work/maas-ui/maas-ui/src/app/zones/components/ZonesTable/ZonesTable.tsx:37:35 at updateMemo (/home/runner/work/maas-ui/maas-ui/node_modules/react-dom/cjs/react-dom-client.development.js:8795:19) at Object.useMemo (/home/runner/work/maas-ui/maas-ui/node_modules/react-dom/cjs/react-dom-client.development.js:26484:18) at Proxy.process.env.NODE_ENV.exports.useMemo (/home/runner/work/maas-ui/maas-ui/node_modules/react/cjs/react.development.js:1251:34) at ZonesTable (/home/runner/work/maas-ui/maas-ui/src/app/zones/components/ZonesTable/ZonesTable.tsx:31:16) at Object.react_stack_bottom_frame (/home/runner/work/maas-ui/maas-ui/node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) at renderWithHooks (/home/runner/work/maas-ui/maas-ui/node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) at updateFunctionComponent (/home/runner/work/maas-ui/maas-ui/node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) at beginWork (/home/runner/work/maas-ui/maas-ui/node_modules/react-dom/cjs/react-dom-client.development.js:11778:18) at runWithFiberInDEV (/home/runner/work/maas-ui/maas-ui/node_modules/react-dom/cjs/react-dom-client.development.js:874:13) </pre> <p> 💿 Hey developer 👋 </p> <p> You can provide a way better UX than this when your app throws errors by providing your own <code style="padding: 2px 4px; background-color: rgba(200, 200, 200, 0.5);" > ErrorBoundary </code> or <code style="padding: 2px 4px; background-color: rgba(200, 200, 200, 0.5);" > errorElement </code> prop on your route. </p> </div> </body> ❯ src/app/zones/components/ZonesTable/ZonesTable.tsx:37:35 ❯ updateMemo node_modules/react-dom/cjs/react-dom-client.development.js:8795:19 ❯ Object.useMemo node_modules/react-dom/cjs/react-dom-client.development.js:26484:18 ❯ Proxy.process.env.NODE_ENV.exports.useMemo node_modules/react/cjs/react.development.js:1251:34 ❯ ZonesTable src/app/zones/components/ZonesTable/ZonesTable.tsx:31:16 ❯ Object.react_stack_bottom_frame node_modules/react-dom/cjs/react-dom-client.development.js:25904:20 ❯ renderWithHooks node_modules/react-dom/cjs/react-dom-client.development.js:7662:22 ❯ updateFunctionComponent node_modules/react-dom/cjs/react-dom-client.development.js:10166:19 ❯ beginWork node_modules/react-dom/cjs/react-dom-client.development.js:11778:18 ❯ Object.getElementError node_modules/@testing-library/dom/dist/config.js:37:19 ❯ node_modules/@testing-library/dom/dist/query-helpers.js:76:38 ❯ node_modules/@testing-library/dom/dist/query-helpers.js:52:17 ❯ node_modules/@testing-library/dom/dist/query-helpers.js:95:19 ❯ src/app/zones/components/ZonesTable/ZonesTable.test.tsx:86:20

Check failure on line 37 in src/app/zones/components/ZonesTable/ZonesTable.tsx

View workflow job for this annotation

GitHub Actions / Test

src/app/zones/components/ZonesTable/ZonesTable.test.tsx > ZonesTable > display > displays a message when rendering an empty list

TestingLibraryElementError: Unable to find an element with the text: No zones found.. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible. Ignored nodes: comments, script, style <body> <div> <h2> Unexpected Application Error! </h2> <h3 style="font-style: italic;" > Cannot read properties of undefined (reading 'map') </h3> <pre style="padding: 0.5rem; background-color: rgba(200, 200, 200, 0.5);" > TypeError: Cannot read properties of undefined (reading 'map') at /home/runner/work/maas-ui/maas-ui/src/app/zones/components/ZonesTable/ZonesTable.tsx:37:35 at updateMemo (/home/runner/work/maas-ui/maas-ui/node_modules/react-dom/cjs/react-dom-client.development.js:8795:19) at Object.useMemo (/home/runner/work/maas-ui/maas-ui/node_modules/react-dom/cjs/react-dom-client.development.js:26484:18) at Proxy.process.env.NODE_ENV.exports.useMemo (/home/runner/work/maas-ui/maas-ui/node_modules/react/cjs/react.development.js:1251:34) at ZonesTable (/home/runner/work/maas-ui/maas-ui/src/app/zones/components/ZonesTable/ZonesTable.tsx:31:16) at Object.react_stack_bottom_frame (/home/runner/work/maas-ui/maas-ui/node_modules/react-dom/cjs/react-dom-client.development.js:25904:20) at renderWithHooks (/home/runner/work/maas-ui/maas-ui/node_modules/react-dom/cjs/react-dom-client.development.js:7662:22) at updateFunctionComponent (/home/runner/work/maas-ui/maas-ui/node_modules/react-dom/cjs/react-dom-client.development.js:10166:19) at beginWork (/home/runner/work/maas-ui/maas-ui/node_modules/react-dom/cjs/react-dom-client.development.js:11778:18) at runWithFiberInDEV (/home/runner/work/maas-ui/maas-ui/node_modules/react-dom/cjs/react-dom-client.development.js:874:13) </pre> <p> 💿 Hey developer 👋 </p> <p> You can provide a way better UX than this when your app throws errors by providing your own <code style="padding: 2px 4px; background-color: rgba(200, 200, 200, 0.5);" > ErrorBoundary </code> or <code style="padding: 2px 4px; background-color: rgba(200, 200, 200, 0.5);" > errorElement </code> prop on your route. </p> </div> </body> ❯ src/app/zones/components/ZonesTable/ZonesTable.tsx:37:35 ❯ updateMemo node_modules/react-dom/cjs/react-dom-client.development.js:8795:19 ❯ Object.useMemo node_modules/react-dom/cjs/react-dom-client.development.js:26484:18 ❯ Proxy.process.env.NODE_ENV.exports.useMemo node_modules/react/cjs/react.development.js:1251:34 ❯ ZonesTable src/app/zones/components/ZonesTable/ZonesTable.tsx:31:16 ❯ Object.react_stack_bottom_frame node_modules/react-dom/cjs/react-dom-client.development.js:25904:20 ❯ renderWithHooks node_modules/react-dom/cjs/react-dom-client.development.js:7662:22 ❯ updateFunctionComponent node_modules/react-dom/cjs/react-dom-client.development.js:10166:19 ❯ beginWork node_modules/react-dom/cjs/react-dom-client.development.js:11778:18 ❯ Object.getElementError node_modules/@testing-library/dom/dist/config.js:37:19 ❯ node_modules/@testing-library/dom/dist/query-helpers.js:76:38 ❯ node_modules/@testing-library/dom/dist/query-helpers.js:52:17 ❯ node_modules/@testing-library/dom/dist/query-helpers.js:95:19 ❯ src/app/zones/components/ZonesTable/ZonesTable.test.tsx:43:23
...item,
devices_count: undefined,
machines_count: undefined,
controllers_count: undefined,
}));
}

return baseZones.data.items.map((item) => ({
...item,
devices_count: zonesWithSummary.data.items.find(
(zone) => zone.id === item.id
)?.devices_count,
controllers_count: zonesWithSummary.data.items.find(
(zone) => zone.id === item.id
)?.controllers_count,
machines_count: zonesWithSummary.data.items.find(
(zone) => zone.id === item.id
)?.machines_count,
}));
}, [baseZones.data, zonesWithSummary.data]);

return (
<GenericTable
columns={columns}
data={zones.data?.items ?? []}
isLoading={zones.isPending}
data={data}
isLoading={baseZones.isPending}
noData="No zones found."
pagination={{
currentPage: page,
dataContext: "zones",
handlePageSizeChange: handlePageSizeChange,
isPending: zones.isPending,
isPending: baseZones.isPending,
itemsPerPage: size,
setCurrentPage: setPage,
totalItems: zones.data?.total ?? 0,
totalItems: zonesWithSummary.data?.total ?? 0,
}}
sorting={[{ id: "machines_count", desc: true }]}
/>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,21 +1,27 @@
import { useMemo } from "react";

import type { ColumnDef, Row } from "@tanstack/react-table";
import { Spinner } from "@canonical/react-components";
import type { ColumnDef } from "@tanstack/react-table";
import { Link } from "react-router";

import { useGetIsSuperUser } from "@/app/api/query/auth";
import type { ZoneWithSummaryResponse } from "@/app/apiclient";
import type { ZoneResponse, ZoneWithSummaryResponse } from "@/app/apiclient";
import TableActions from "@/app/base/components/TableActions";
import { useSidePanel } from "@/app/base/side-panel-context-new";
import urls from "@/app/base/urls";
import { FilterDevices } from "@/app/store/device/utils";
import { FilterMachines } from "@/app/store/machine/utils";
import { DeleteZone, EditZone } from "@/app/zones/components";

export type ZoneColumnDef = ColumnDef<
ZoneWithSummaryResponse,
Partial<ZoneWithSummaryResponse>
>;
export type ZoneRow = Partial<
Pick<
ZoneWithSummaryResponse,
"controllers_count" | "devices_count" | "machines_count"
>
> &
ZoneResponse;

export type ZoneColumnDef = ColumnDef<ZoneRow, Partial<ZoneRow>>;

const filterDevices = (name: string) =>
FilterDevices.filtersToQueryString({
Expand All @@ -27,11 +33,15 @@ const machinesFilter = (name: string) =>
zone: [name],
});

const useZonesTableColumns = (): ZoneColumnDef[] => {
const useZonesTableColumns = ({
isSummaryPending,
}: {
isSummaryPending: boolean;
}): ZoneColumnDef[] => {
const { openSidePanel } = useSidePanel();
const isSuperUser = useGetIsSuperUser();
return useMemo(
() => [
(): ZoneColumnDef[] => [
{
id: "name",
accessorKey: "name",
Expand All @@ -50,6 +60,10 @@ const useZonesTableColumns = (): ZoneColumnDef[] => {
enableSorting: true,
header: "Machines",
cell: ({ row }) => {
if (isSummaryPending) {
return <Spinner />;
}

return (
<Link
className="u-align--right"
Expand All @@ -66,6 +80,10 @@ const useZonesTableColumns = (): ZoneColumnDef[] => {
enableSorting: true,
header: "Devices",
cell: ({ row }) => {
if (isSummaryPending) {
return <Spinner />;
}

return (
<Link
className="u-align--right"
Expand All @@ -82,6 +100,10 @@ const useZonesTableColumns = (): ZoneColumnDef[] => {
enableSorting: true,
header: "Controllers",
cell: ({ row }) => {
if (isSummaryPending) {
return <Spinner />;
}

return (
<Link className="u-align--right" to={`${urls.controllers.index}`}>
{row.original.controllers_count}
Expand All @@ -94,7 +116,7 @@ const useZonesTableColumns = (): ZoneColumnDef[] => {
accessorKey: "id",
enableSorting: false,
header: "Actions",
cell: ({ row }: { row: Row<ZoneWithSummaryResponse> }) => {
cell: ({ row }) => {
const canBeDeleted = isSuperUser.data && row.original.id !== 1;
return (
<TableActions
Expand Down Expand Up @@ -124,7 +146,7 @@ const useZonesTableColumns = (): ZoneColumnDef[] => {
},
},
],
[isSuperUser.data, openSidePanel]
[isSummaryPending, isSuperUser.data, openSidePanel]
);
};

Expand Down
Loading