Revert "CEC-2977 Filter portal access based on auth provider (#231)"

This reverts commit f2f046968e.
This commit is contained in:
jwu-fisker
2022-11-08 16:49:10 -08:00
parent f2f046968e
commit 33bfc4fb13
76 changed files with 912 additions and 1316 deletions

View File

@@ -16,7 +16,7 @@ import {
waitForElementToBeRemoved,
} from "@testing-library/react";
import { setToken } from "../Contexts/UserContext";
import {TEST_AUTH_OBJECT, TEST_AUTH_OBJECT_FISKER} from "../../utils/testing";
import { TEST_AUTH_OBJECT } from "../../utils/testing";
import App from ".";
import addSnapshotSerializer from "../../utils/snapshot";
@@ -35,7 +35,7 @@ const check = async (path, selector, compare) => {
let container
await act(async () => {
container = await renderRoute(path);
});
})
expect(container.querySelector(selector).innerHTML).toEqual(compare);
expect(container).toMatchSnapshot();
};
@@ -117,57 +117,57 @@ describe("App", () => {
await check("/page-not-found", "h1", "Page Not Found");
});
it("Route / authenticated", async () => {
setToken(TEST_AUTH_OBJECT_FISKER);
setToken(TEST_AUTH_OBJECT);
await sleepAndCheck("/", "h6", "Home");
});
it("Route /home authenticated", async () => {
setToken(TEST_AUTH_OBJECT_FISKER);
setToken(TEST_AUTH_OBJECT);
await sleepAndCheck("/home", "h6", "Home");
});
it("Route /page-not-found authenticated", async () => {
setToken(TEST_AUTH_OBJECT_FISKER);
setToken(TEST_AUTH_OBJECT);
await check("/page-not-found", "h1", "Page Not Found");
});
it("Route /packages authenticated", async () => {
setToken(TEST_AUTH_OBJECT_FISKER);
setToken(TEST_AUTH_OBJECT);
await check("/packages", "h6", "Deployments");
});
it("Route /package-status authenticated", async () => {
setToken(TEST_AUTH_OBJECT_FISKER);
setToken(TEST_AUTH_OBJECT);
await check("/package-status/1", "h6", "Manifest Test Manifest 1.0");
});
it("Route /package-deploy authenticated", async () => {
setToken(TEST_AUTH_OBJECT_FISKER);
setToken(TEST_AUTH_OBJECT);
await check("/package-deploy/1", "h6", "Deploy Test Manifest 1.0");
});
it("Route /vehicle-add authenticated", async () => {
setToken(TEST_AUTH_OBJECT_FISKER);
setToken(TEST_AUTH_OBJECT);
await check("/vehicle-add", "h6", "Add Vehicle");
});
it("Route /vehicles authenticated", async () => {
setToken(TEST_AUTH_OBJECT_FISKER);
setToken(TEST_AUTH_OBJECT);
await check("/vehicles", "h6", "Vehicles");
});
it("Route /vehicle-status authenticated", async () => {
setToken(TEST_AUTH_OBJECT_FISKER);
setToken(TEST_AUTH_OBJECT);
await check("/vehicle-status/FISKER123", "h6", "Vehicle FISKER123 Details");
});
it("Route /tools/certificates/add authenticated", async () => {
setToken(TEST_AUTH_OBJECT_FISKER);
await sleepAndCheck("/tools/certificates/add", "h6", "Create Certificate");
setToken(TEST_AUTH_OBJECT);
await check("/tools/certificates/add", "h6", "Create Certificate");
});
it("Route /tools/sms/send authenticated", async () => {
setToken(TEST_AUTH_OBJECT_FISKER);
await sleepAndCheck("/tools/sms/send", "h6", "Send SMS");
setToken(TEST_AUTH_OBJECT);
await check("/tools/sms/send", "h6", "Send SMS");
});
});

View File

@@ -35,7 +35,7 @@ exports[`App Route / authenticated 1`] = `
<span
class="MuiButton-label"
>
Anvar
John
</span>
<span
class="MuiTouchRipple-root"
@@ -270,42 +270,6 @@ exports[`App Route / authenticated 1`] = `
</li>
</ul>
</li>
<li>
<a
aria-disabled="false"
class="MuiButtonBase-root MuiListItem-root MuiListItem-gutters MuiListItem-button"
href="/suppliers"
role="button"
tabindex="0"
>
<div
class="MuiListItemIcon-root"
>
<svg
aria-hidden="true"
class="MuiSvgIcon-root"
focusable="false"
viewBox="0 0 24 24"
>
<path
d="M5 2c0-.55-.45-1-1-1s-1 .45-1 1v4H1v6h6V6H5V2zm4 14c0 1.3.84 2.4 2 2.82V23h2v-4.18c1.16-.41 2-1.51 2-2.82v-2H9v2zm-8 0c0 1.3.84 2.4 2 2.82V23h2v-4.18C6.16 18.4 7 17.3 7 16v-2H1v2zM21 6V2c0-.55-.45-1-1-1s-1 .45-1 1v4h-2v6h6V6h-2zm-8-4c0-.55-.45-1-1-1s-1 .45-1 1v4H9v6h6V6h-2V2zm4 14c0 1.3.84 2.4 2 2.82V23h2v-4.18c1.16-.41 2-1.51 2-2.82v-2h-6v2z"
/>
</svg>
</div>
<div
class="MuiListItemText-root"
>
<span
class="MuiTypography-root MuiListItemText-primary MuiTypography-body1 MuiTypography-displayBlock"
>
Suppliers
</span>
</div>
<span
class="MuiTouchRipple-root"
/>
</a>
</li>
<span>
<li>
<a
@@ -630,7 +594,7 @@ exports[`App Route /home authenticated 1`] = `
<span
class="MuiButton-label"
>
Anvar
John
</span>
<span
class="MuiTouchRipple-root"
@@ -865,42 +829,6 @@ exports[`App Route /home authenticated 1`] = `
</li>
</ul>
</li>
<li>
<a
aria-disabled="false"
class="MuiButtonBase-root MuiListItem-root MuiListItem-gutters MuiListItem-button"
href="/suppliers"
role="button"
tabindex="0"
>
<div
class="MuiListItemIcon-root"
>
<svg
aria-hidden="true"
class="MuiSvgIcon-root"
focusable="false"
viewBox="0 0 24 24"
>
<path
d="M5 2c0-.55-.45-1-1-1s-1 .45-1 1v4H1v6h6V6H5V2zm4 14c0 1.3.84 2.4 2 2.82V23h2v-4.18c1.16-.41 2-1.51 2-2.82v-2H9v2zm-8 0c0 1.3.84 2.4 2 2.82V23h2v-4.18C6.16 18.4 7 17.3 7 16v-2H1v2zM21 6V2c0-.55-.45-1-1-1s-1 .45-1 1v4h-2v6h6V6h-2zm-8-4c0-.55-.45-1-1-1s-1 .45-1 1v4H9v6h6V6h-2V2zm4 14c0 1.3.84 2.4 2 2.82V23h2v-4.18c1.16-.41 2-1.51 2-2.82v-2h-6v2z"
/>
</svg>
</div>
<div
class="MuiListItemText-root"
>
<span
class="MuiTypography-root MuiListItemText-primary MuiTypography-body1 MuiTypography-displayBlock"
>
Suppliers
</span>
</div>
<span
class="MuiTouchRipple-root"
/>
</a>
</li>
<span>
<li>
<a
@@ -1261,7 +1189,7 @@ exports[`App Route /package-deploy authenticated 1`] = `
<span
class="MuiButton-label"
>
Anvar
John
</span>
<span
class="MuiTouchRipple-root"
@@ -1496,42 +1424,6 @@ exports[`App Route /package-deploy authenticated 1`] = `
</li>
</ul>
</li>
<li>
<a
aria-disabled="false"
class="MuiButtonBase-root MuiListItem-root MuiListItem-gutters MuiListItem-button"
href="/suppliers"
role="button"
tabindex="0"
>
<div
class="MuiListItemIcon-root"
>
<svg
aria-hidden="true"
class="MuiSvgIcon-root"
focusable="false"
viewBox="0 0 24 24"
>
<path
d="M5 2c0-.55-.45-1-1-1s-1 .45-1 1v4H1v6h6V6H5V2zm4 14c0 1.3.84 2.4 2 2.82V23h2v-4.18c1.16-.41 2-1.51 2-2.82v-2H9v2zm-8 0c0 1.3.84 2.4 2 2.82V23h2v-4.18C6.16 18.4 7 17.3 7 16v-2H1v2zM21 6V2c0-.55-.45-1-1-1s-1 .45-1 1v4h-2v6h6V6h-2zm-8-4c0-.55-.45-1-1-1s-1 .45-1 1v4H9v6h6V6h-2V2zm4 14c0 1.3.84 2.4 2 2.82V23h2v-4.18c1.16-.41 2-1.51 2-2.82v-2h-6v2z"
/>
</svg>
</div>
<div
class="MuiListItemText-root"
>
<span
class="MuiTypography-root MuiListItemText-primary MuiTypography-body1 MuiTypography-displayBlock"
>
Suppliers
</span>
</div>
<span
class="MuiTouchRipple-root"
/>
</a>
</li>
<span>
<li>
<a
@@ -2256,7 +2148,7 @@ exports[`App Route /package-status authenticated 1`] = `
<span
class="MuiButton-label"
>
Anvar
John
</span>
<span
class="MuiTouchRipple-root"
@@ -2491,42 +2383,6 @@ exports[`App Route /package-status authenticated 1`] = `
</li>
</ul>
</li>
<li>
<a
aria-disabled="false"
class="MuiButtonBase-root MuiListItem-root MuiListItem-gutters MuiListItem-button"
href="/suppliers"
role="button"
tabindex="0"
>
<div
class="MuiListItemIcon-root"
>
<svg
aria-hidden="true"
class="MuiSvgIcon-root"
focusable="false"
viewBox="0 0 24 24"
>
<path
d="M5 2c0-.55-.45-1-1-1s-1 .45-1 1v4H1v6h6V6H5V2zm4 14c0 1.3.84 2.4 2 2.82V23h2v-4.18c1.16-.41 2-1.51 2-2.82v-2H9v2zm-8 0c0 1.3.84 2.4 2 2.82V23h2v-4.18C6.16 18.4 7 17.3 7 16v-2H1v2zM21 6V2c0-.55-.45-1-1-1s-1 .45-1 1v4h-2v6h6V6h-2zm-8-4c0-.55-.45-1-1-1s-1 .45-1 1v4H9v6h6V6h-2V2zm4 14c0 1.3.84 2.4 2 2.82V23h2v-4.18c1.16-.41 2-1.51 2-2.82v-2h-6v2z"
/>
</svg>
</div>
<div
class="MuiListItemText-root"
>
<span
class="MuiTypography-root MuiListItemText-primary MuiTypography-body1 MuiTypography-displayBlock"
>
Suppliers
</span>
</div>
<span
class="MuiTouchRipple-root"
/>
</a>
</li>
<span>
<li>
<a
@@ -2969,7 +2825,7 @@ exports[`App Route /packages authenticated 1`] = `
<span
class="MuiButton-label"
>
Anvar
John
</span>
<span
class="MuiTouchRipple-root"
@@ -3204,42 +3060,6 @@ exports[`App Route /packages authenticated 1`] = `
</li>
</ul>
</li>
<li>
<a
aria-disabled="false"
class="MuiButtonBase-root MuiListItem-root MuiListItem-gutters MuiListItem-button"
href="/suppliers"
role="button"
tabindex="0"
>
<div
class="MuiListItemIcon-root"
>
<svg
aria-hidden="true"
class="MuiSvgIcon-root"
focusable="false"
viewBox="0 0 24 24"
>
<path
d="M5 2c0-.55-.45-1-1-1s-1 .45-1 1v4H1v6h6V6H5V2zm4 14c0 1.3.84 2.4 2 2.82V23h2v-4.18c1.16-.41 2-1.51 2-2.82v-2H9v2zm-8 0c0 1.3.84 2.4 2 2.82V23h2v-4.18C6.16 18.4 7 17.3 7 16v-2H1v2zM21 6V2c0-.55-.45-1-1-1s-1 .45-1 1v4h-2v6h6V6h-2zm-8-4c0-.55-.45-1-1-1s-1 .45-1 1v4H9v6h6V6h-2V2zm4 14c0 1.3.84 2.4 2 2.82V23h2v-4.18c1.16-.41 2-1.51 2-2.82v-2h-6v2z"
/>
</svg>
</div>
<div
class="MuiListItemText-root"
>
<span
class="MuiTypography-root MuiListItemText-primary MuiTypography-body1 MuiTypography-displayBlock"
>
Suppliers
</span>
</div>
<span
class="MuiTouchRipple-root"
/>
</a>
</li>
<span>
<li>
<a
@@ -3662,6 +3482,25 @@ exports[`App Route /packages authenticated 1`] = `
/>
</svg>
</a>
<span>
<a
class=""
href="/packages"
title="Delete \\"Test Manifest 1.0\\""
>
<svg
aria-hidden="true"
aria-label="Delete Test Manifest 1.0"
class="MuiSvgIcon-root"
focusable="false"
viewBox="0 0 24 24"
>
<path
d="M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z"
/>
</svg>
</a>
</span>
</td>
</tr>
</tbody>
@@ -3890,7 +3729,7 @@ exports[`App Route /page-not-found authenticated 1`] = `
<span
class="MuiButton-label"
>
Anvar
John
</span>
<span
class="MuiTouchRipple-root"
@@ -4125,42 +3964,6 @@ exports[`App Route /page-not-found authenticated 1`] = `
</li>
</ul>
</li>
<li>
<a
aria-disabled="false"
class="MuiButtonBase-root MuiListItem-root MuiListItem-gutters MuiListItem-button"
href="/suppliers"
role="button"
tabindex="0"
>
<div
class="MuiListItemIcon-root"
>
<svg
aria-hidden="true"
class="MuiSvgIcon-root"
focusable="false"
viewBox="0 0 24 24"
>
<path
d="M5 2c0-.55-.45-1-1-1s-1 .45-1 1v4H1v6h6V6H5V2zm4 14c0 1.3.84 2.4 2 2.82V23h2v-4.18c1.16-.41 2-1.51 2-2.82v-2H9v2zm-8 0c0 1.3.84 2.4 2 2.82V23h2v-4.18C6.16 18.4 7 17.3 7 16v-2H1v2zM21 6V2c0-.55-.45-1-1-1s-1 .45-1 1v4h-2v6h6V6h-2zm-8-4c0-.55-.45-1-1-1s-1 .45-1 1v4H9v6h6V6h-2V2zm4 14c0 1.3.84 2.4 2 2.82V23h2v-4.18c1.16-.41 2-1.51 2-2.82v-2h-6v2z"
/>
</svg>
</div>
<div
class="MuiListItemText-root"
>
<span
class="MuiTypography-root MuiListItemText-primary MuiTypography-body1 MuiTypography-displayBlock"
>
Suppliers
</span>
</div>
<span
class="MuiTouchRipple-root"
/>
</a>
</li>
<span>
<li>
<a
@@ -4448,7 +4251,7 @@ exports[`App Route /tools/certificates/add authenticated 1`] = `
<span
class="MuiButton-label"
>
Anvar
John
</span>
<span
class="MuiTouchRipple-root"
@@ -4683,42 +4486,6 @@ exports[`App Route /tools/certificates/add authenticated 1`] = `
</li>
</ul>
</li>
<li>
<a
aria-disabled="false"
class="MuiButtonBase-root MuiListItem-root MuiListItem-gutters MuiListItem-button"
href="/suppliers"
role="button"
tabindex="0"
>
<div
class="MuiListItemIcon-root"
>
<svg
aria-hidden="true"
class="MuiSvgIcon-root"
focusable="false"
viewBox="0 0 24 24"
>
<path
d="M5 2c0-.55-.45-1-1-1s-1 .45-1 1v4H1v6h6V6H5V2zm4 14c0 1.3.84 2.4 2 2.82V23h2v-4.18c1.16-.41 2-1.51 2-2.82v-2H9v2zm-8 0c0 1.3.84 2.4 2 2.82V23h2v-4.18C6.16 18.4 7 17.3 7 16v-2H1v2zM21 6V2c0-.55-.45-1-1-1s-1 .45-1 1v4h-2v6h6V6h-2zm-8-4c0-.55-.45-1-1-1s-1 .45-1 1v4H9v6h6V6h-2V2zm4 14c0 1.3.84 2.4 2 2.82V23h2v-4.18c1.16-.41 2-1.51 2-2.82v-2h-6v2z"
/>
</svg>
</div>
<div
class="MuiListItemText-root"
>
<span
class="MuiTypography-root MuiListItemText-primary MuiTypography-body1 MuiTypography-displayBlock"
>
Suppliers
</span>
</div>
<span
class="MuiTouchRipple-root"
/>
</a>
</li>
<span>
<li>
<a
@@ -5239,7 +5006,7 @@ exports[`App Route /tools/sms/send authenticated 1`] = `
<span
class="MuiButton-label"
>
Anvar
John
</span>
<span
class="MuiTouchRipple-root"
@@ -5474,42 +5241,6 @@ exports[`App Route /tools/sms/send authenticated 1`] = `
</li>
</ul>
</li>
<li>
<a
aria-disabled="false"
class="MuiButtonBase-root MuiListItem-root MuiListItem-gutters MuiListItem-button"
href="/suppliers"
role="button"
tabindex="0"
>
<div
class="MuiListItemIcon-root"
>
<svg
aria-hidden="true"
class="MuiSvgIcon-root"
focusable="false"
viewBox="0 0 24 24"
>
<path
d="M5 2c0-.55-.45-1-1-1s-1 .45-1 1v4H1v6h6V6H5V2zm4 14c0 1.3.84 2.4 2 2.82V23h2v-4.18c1.16-.41 2-1.51 2-2.82v-2H9v2zm-8 0c0 1.3.84 2.4 2 2.82V23h2v-4.18C6.16 18.4 7 17.3 7 16v-2H1v2zM21 6V2c0-.55-.45-1-1-1s-1 .45-1 1v4h-2v6h6V6h-2zm-8-4c0-.55-.45-1-1-1s-1 .45-1 1v4H9v6h6V6h-2V2zm4 14c0 1.3.84 2.4 2 2.82V23h2v-4.18c1.16-.41 2-1.51 2-2.82v-2h-6v2z"
/>
</svg>
</div>
<div
class="MuiListItemText-root"
>
<span
class="MuiTypography-root MuiListItemText-primary MuiTypography-body1 MuiTypography-displayBlock"
>
Suppliers
</span>
</div>
<span
class="MuiTouchRipple-root"
/>
</a>
</li>
<span>
<li>
<a
@@ -5896,7 +5627,7 @@ exports[`App Route /vehicle-add authenticated 1`] = `
<span
class="MuiButton-label"
>
Anvar
John
</span>
<span
class="MuiTouchRipple-root"
@@ -6131,42 +5862,6 @@ exports[`App Route /vehicle-add authenticated 1`] = `
</li>
</ul>
</li>
<li>
<a
aria-disabled="false"
class="MuiButtonBase-root MuiListItem-root MuiListItem-gutters MuiListItem-button"
href="/suppliers"
role="button"
tabindex="0"
>
<div
class="MuiListItemIcon-root"
>
<svg
aria-hidden="true"
class="MuiSvgIcon-root"
focusable="false"
viewBox="0 0 24 24"
>
<path
d="M5 2c0-.55-.45-1-1-1s-1 .45-1 1v4H1v6h6V6H5V2zm4 14c0 1.3.84 2.4 2 2.82V23h2v-4.18c1.16-.41 2-1.51 2-2.82v-2H9v2zm-8 0c0 1.3.84 2.4 2 2.82V23h2v-4.18C6.16 18.4 7 17.3 7 16v-2H1v2zM21 6V2c0-.55-.45-1-1-1s-1 .45-1 1v4h-2v6h6V6h-2zm-8-4c0-.55-.45-1-1-1s-1 .45-1 1v4H9v6h6V6h-2V2zm4 14c0 1.3.84 2.4 2 2.82V23h2v-4.18c1.16-.41 2-1.51 2-2.82v-2h-6v2z"
/>
</svg>
</div>
<div
class="MuiListItemText-root"
>
<span
class="MuiTypography-root MuiListItemText-primary MuiTypography-body1 MuiTypography-displayBlock"
>
Suppliers
</span>
</div>
<span
class="MuiTouchRipple-root"
/>
</a>
</li>
<span>
<li>
<a
@@ -7111,7 +6806,7 @@ exports[`App Route /vehicle-status authenticated 1`] = `
<span
class="MuiButton-label"
>
Anvar
John
</span>
<span
class="MuiTouchRipple-root"
@@ -7346,42 +7041,6 @@ exports[`App Route /vehicle-status authenticated 1`] = `
</li>
</ul>
</li>
<li>
<a
aria-disabled="false"
class="MuiButtonBase-root MuiListItem-root MuiListItem-gutters MuiListItem-button"
href="/suppliers"
role="button"
tabindex="0"
>
<div
class="MuiListItemIcon-root"
>
<svg
aria-hidden="true"
class="MuiSvgIcon-root"
focusable="false"
viewBox="0 0 24 24"
>
<path
d="M5 2c0-.55-.45-1-1-1s-1 .45-1 1v4H1v6h6V6H5V2zm4 14c0 1.3.84 2.4 2 2.82V23h2v-4.18c1.16-.41 2-1.51 2-2.82v-2H9v2zm-8 0c0 1.3.84 2.4 2 2.82V23h2v-4.18C6.16 18.4 7 17.3 7 16v-2H1v2zM21 6V2c0-.55-.45-1-1-1s-1 .45-1 1v4h-2v6h6V6h-2zm-8-4c0-.55-.45-1-1-1s-1 .45-1 1v4H9v6h6V6h-2V2zm4 14c0 1.3.84 2.4 2 2.82V23h2v-4.18c1.16-.41 2-1.51 2-2.82v-2h-6v2z"
/>
</svg>
</div>
<div
class="MuiListItemText-root"
>
<span
class="MuiTypography-root MuiListItemText-primary MuiTypography-body1 MuiTypography-displayBlock"
>
Suppliers
</span>
</div>
<span
class="MuiTouchRipple-root"
/>
</a>
</li>
<span>
<li>
<a
@@ -7536,6 +7195,7 @@ exports[`App Route /vehicle-status authenticated 1`] = `
</button>
<button
aria-controls="tabpanel-2"
aria-selected="false"
class="MuiButtonBase-root MuiTab-root MuiTab-textColorInherit"
id="tab-2"
role="tab"
@@ -7553,6 +7213,7 @@ exports[`App Route /vehicle-status authenticated 1`] = `
</button>
<button
aria-controls="tabpanel-3"
aria-selected="false"
class="MuiButtonBase-root MuiTab-root MuiTab-textColorInherit"
id="tab-3"
role="tab"
@@ -7570,6 +7231,7 @@ exports[`App Route /vehicle-status authenticated 1`] = `
</button>
<button
aria-controls="tabpanel-4"
aria-selected="false"
class="MuiButtonBase-root MuiTab-root MuiTab-textColorInherit"
id="tab-4"
role="tab"
@@ -7587,6 +7249,7 @@ exports[`App Route /vehicle-status authenticated 1`] = `
</button>
<button
aria-controls="tabpanel-5"
aria-selected="false"
class="MuiButtonBase-root MuiTab-root MuiTab-textColorInherit"
id="tab-5"
role="tab"
@@ -7604,6 +7267,7 @@ exports[`App Route /vehicle-status authenticated 1`] = `
</button>
<button
aria-controls="tabpanel-6"
aria-selected="false"
class="MuiButtonBase-root MuiTab-root MuiTab-textColorInherit"
id="tab-6"
role="tab"
@@ -7733,6 +7397,23 @@ exports[`App Route /vehicle-status authenticated 1`] = `
/>
</svg>
</a>
<a
class=""
href="/vehicle-status/FISKER123"
title="Delete \\"FISKER123\\""
>
<svg
aria-hidden="true"
aria-label="Delete \\"FISKER123\\""
class="MuiSvgIcon-root"
focusable="false"
viewBox="0 0 24 24"
>
<path
d="M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z"
/>
</svg>
</a>
</div>
</div>
<div />
@@ -7935,7 +7616,7 @@ exports[`App Route /vehicles authenticated 1`] = `
<span
class="MuiButton-label"
>
Anvar
John
</span>
<span
class="MuiTouchRipple-root"
@@ -8170,42 +7851,6 @@ exports[`App Route /vehicles authenticated 1`] = `
</li>
</ul>
</li>
<li>
<a
aria-disabled="false"
class="MuiButtonBase-root MuiListItem-root MuiListItem-gutters MuiListItem-button"
href="/suppliers"
role="button"
tabindex="0"
>
<div
class="MuiListItemIcon-root"
>
<svg
aria-hidden="true"
class="MuiSvgIcon-root"
focusable="false"
viewBox="0 0 24 24"
>
<path
d="M5 2c0-.55-.45-1-1-1s-1 .45-1 1v4H1v6h6V6H5V2zm4 14c0 1.3.84 2.4 2 2.82V23h2v-4.18c1.16-.41 2-1.51 2-2.82v-2H9v2zm-8 0c0 1.3.84 2.4 2 2.82V23h2v-4.18C6.16 18.4 7 17.3 7 16v-2H1v2zM21 6V2c0-.55-.45-1-1-1s-1 .45-1 1v4h-2v6h6V6h-2zm-8-4c0-.55-.45-1-1-1s-1 .45-1 1v4H9v6h6V6h-2V2zm4 14c0 1.3.84 2.4 2 2.82V23h2v-4.18c1.16-.41 2-1.51 2-2.82v-2h-6v2z"
/>
</svg>
</div>
<div
class="MuiListItemText-root"
>
<span
class="MuiTypography-root MuiListItemText-primary MuiTypography-body1 MuiTypography-displayBlock"
>
Suppliers
</span>
</div>
<span
class="MuiTouchRipple-root"
/>
</a>
</li>
<span>
<li>
<a
@@ -8315,7 +7960,22 @@ exports[`App Route /vehicles authenticated 1`] = `
>
<div
class="MuiGrid-root makeStyles-textJustifyAlign-0 MuiGrid-item MuiGrid-grid-md-4"
/>
>
<a
href="/vehicle-add"
>
<svg
aria-hidden="true"
class="MuiSvgIcon-root MuiSvgIcon-fontSizeLarge"
focusable="false"
viewBox="0 0 24 24"
>
<path
d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm5 11h-4v4h-2v-4H7v-2h4V7h2v4h4v2z"
/>
</svg>
</a>
</div>
<div
class="MuiGrid-root makeStyles-textCenterAlign-0 MuiGrid-item MuiGrid-grid-md-4"
>

View File

@@ -1,5 +1,3 @@
import {TEST_AUTH_OBJECT_FISKER} from "../../../utils/testing";
jest.mock("../../Contexts/CANFiltersContext");
jest.mock("../../Contexts/StatusContext");
jest.mock("../../Contexts/UserContext");
@@ -10,6 +8,7 @@ import { BrowserRouter } from "react-router-dom";
import { CANFiltersProvider } from "../../Contexts/CANFiltersContext";
import { StatusProvider } from "../../Contexts/StatusContext";
import { UserProvider, setToken } from "../../Contexts/UserContext";
import { TEST_AUTH_OBJECT } from "../../../utils/testing";
import MainForm from "./index";
import addSnapshotSerializer from "../../../utils/snapshot";
@@ -36,7 +35,7 @@ describe("CANFiltersAdd", () => {
});
it("Render", async () => {
setToken(TEST_AUTH_OBJECT_FISKER);
setToken(TEST_AUTH_OBJECT);
const container = await renderCANFiltersAdd();
expect(container).toMatchSnapshot();
});

View File

@@ -250,6 +250,23 @@ exports[`CANFiltersTable Render 1`] = `
/>
</svg>
</a>
<a
class=""
href="/"
title="Delete \\"123\\""
>
<svg
aria-hidden="true"
aria-label="Delete 123"
class="MuiSvgIcon-root"
focusable="false"
viewBox="0 0 24 24"
>
<path
d="M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z"
/>
</svg>
</a>
</td>
</tr>
<tr
@@ -296,6 +313,23 @@ exports[`CANFiltersTable Render 1`] = `
/>
</svg>
</a>
<a
class=""
href="/"
title="Delete \\"456-789\\""
>
<svg
aria-hidden="true"
aria-label="Delete 456-789"
class="MuiSvgIcon-root"
focusable="false"
viewBox="0 0 24 24"
>
<path
d="M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z"
/>
</svg>
</a>
</td>
</tr>
<tr
@@ -342,6 +376,23 @@ exports[`CANFiltersTable Render 1`] = `
/>
</svg>
</a>
<a
class=""
href="/"
title="Delete \\"1\\""
>
<svg
aria-hidden="true"
aria-label="Delete 1"
class="MuiSvgIcon-root"
focusable="false"
viewBox="0 0 24 24"
>
<path
d="M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z"
/>
</svg>
</a>
</td>
</tr>
</tbody>

View File

@@ -1,3 +1,5 @@
import React, { useEffect, useState } from "react";
import { Link } from 'react-router-dom';
import {
Grid,
Table,
@@ -10,46 +12,46 @@ import {
} from "@material-ui/core";
import AddCircleIcon from "@material-ui/icons/AddCircle";
import DeleteIcon from "@material-ui/icons/Delete";
import EditIcon from "@material-ui/icons/Edit";
import EditIcon from '@material-ui/icons/Edit';
import clsx from "clsx";
import React, { useEffect, useState } from "react";
import { Link } from "react-router-dom";
import { logger } from "../../../services/monitoring";
import { hasRole, Permissions } from "../../../utils/roles";
import { trimIfMoreThan } from "../../../utils/strings";
import {
CANFiltersProvider,
useCANFiltersContext,
} from "../../Contexts/CANFiltersContext";
import { useStatusContext } from "../../Contexts/StatusContext";
import { useUserContext } from "../../Contexts/UserContext";
import SearchField from "../../Controls/SearchField";
import TableHeaderSortable from "../../Table/HeaderSortable";
import { useLocalStorage } from "../../useLocalStorage";
import {
useUserContext
} from "../../Contexts/UserContext"
import { useStatusContext } from "../../Contexts/StatusContext";
import useStyles from "../../useStyles";
import SearchField from "../../Controls/SearchField";
import { logger } from "../../../services/monitoring";
import { Roles, hasRole } from "../../../utils/roles";
import {useLocalStorage} from "../../useLocalStorage";
import {trimIfMoreThan} from "../../../utils/strings";
const tableColumns = [
{
id: "can_id",
label: "CAN ID",
label: "CAN ID"
},
{
id: "interval",
label: "Interval (ms)",
label: "Interval (ms)"
},
{
id: "fleet",
label: "Fleet",
label: "Fleet"
},
{
id: "edge_mask",
label: "Edge mask",
label: "Edge mask"
},
{
id: "",
label: "Actions",
},
label: "Actions"
}
];
const PAGE_SIZE = "CAN_FILTER_TABLE_PAGE_SIZE";
@@ -61,16 +63,9 @@ const MainForm = ({ vin }) => {
const [pageIndex, setPageIndex] = useState(0);
const [orderBy, setOrderBy] = useState("id");
const [order, setOrder] = useState("desc");
const { getFilters, deleteFilter, filters, totalFilters } =
useCANFiltersContext();
const { getFilters, deleteFilter, filters, totalFilters } = useCANFiltersContext();
const { setMessage } = useStatusContext();
const {
token: {
idToken: { jwtToken: token },
},
groups,
providers,
} = useUserContext();
const { token: { idToken: { jwtToken: token } }, groups } = useUserContext();
useEffect(() => {
(async () => {
@@ -123,7 +118,7 @@ const MainForm = ({ vin }) => {
const onDelete = async (can_id) => {
try {
await deleteFilter(vin, can_id, token);
setMessage(`Deleted ${can_id}`);
setMessage(`Deleted ${can_id}`)
} catch (e) {
setMessage(e.message);
logger.warn(e.stack);
@@ -131,24 +126,24 @@ const MainForm = ({ vin }) => {
};
const Actions = (row) => {
if (row.fleet != null) {
return;
if(row.fleet != null) {
return
}
let actions = [];
if (hasRole(groups, Permissions.FiskerCreate, providers)) {
if (hasRole([Roles.CREATE], groups)) {
actions.push({
tip: `Update "${row.can_id}"`,
link: `/filter-update?vin=${vin}&can_id=${row.can_id}&interval=${row.interval}`,
icon: <EditIcon aria-label={`Update ${row.can_id}`} />,
icon: <EditIcon aria-label={`Update ${row.can_id}`} />
});
}
if (hasRole(groups, Permissions.FiskerDelete, providers)) {
if (hasRole([Roles.DELETE], groups)) {
actions.push({
tip: `Delete "${row.can_id}"`,
id: row.can_id,
icon: <DeleteIcon aria-label={`Delete ${row.can_id}`} />,
});
icon: <DeleteIcon aria-label={`Delete ${row.can_id}`} />
})
}
if (actions.length === 0) return ["No actions"];
@@ -182,7 +177,7 @@ const MainForm = ({ vin }) => {
</Link>
</Grid>
<Grid item md={8} className={classes.textCenterAlign}>
<SearchField classes={classes} onSearch={onSearch} />
<SearchField classes={classes} onSearch={onSearch}/>
</Grid>
</Grid>
<Table>
@@ -201,9 +196,7 @@ const MainForm = ({ vin }) => {
<TableCell align="center">
<Link to={`/fleet/${row.fleet}`}>{row.fleet}</Link>
</TableCell>
<TableCell align="center">
{trimIfMoreThan(row.edge_mask, 15, "...")}
</TableCell>
<TableCell align="center">{trimIfMoreThan(row.edge_mask, 15, "...")}</TableCell>
<TableCell align="center">{Actions(row)}</TableCell>
</TableRow>
))}
@@ -226,7 +219,7 @@ const MainForm = ({ vin }) => {
</TableRow>
</TableFooter>
</Table>
</div>
</div >
);
};

View File

@@ -11,7 +11,7 @@ import { BrowserRouter } from "react-router-dom";
import { CANFiltersProvider } from "../../Contexts/CANFiltersContext";
import { StatusProvider } from "../../Contexts/StatusContext";
import { UserProvider, setToken } from "../../Contexts/UserContext";
import {TEST_AUTH_OBJECT_FISKER} from "../../../utils/testing";
import { TEST_AUTH_OBJECT } from "../../../utils/testing";
import MainForm from "./index";
import addSnapshotSerializer from "../../../utils/snapshot";
@@ -37,7 +37,7 @@ describe("CANFiltersTable", () => {
});
it("Render", async () => {
setToken(TEST_AUTH_OBJECT_FISKER);
setToken(TEST_AUTH_OBJECT);
const container = await renderCANFiltersTable();
expect(container).toMatchSnapshot();
});

View File

@@ -8,7 +8,7 @@ import { BrowserRouter } from "react-router-dom";
import { CANFiltersProvider } from "../../Contexts/CANFiltersContext";
import { StatusProvider } from "../../Contexts/StatusContext";
import { UserProvider, setToken } from "../../Contexts/UserContext";
import { TEST_AUTH_OBJECT_FISKER } from "../../../utils/testing";
import { TEST_AUTH_OBJECT } from "../../../utils/testing";
import MainForm from "./index";
import addSnapshotSerializer from "../../../utils/snapshot";
@@ -34,7 +34,7 @@ describe("CANFiltersUpdate", () => {
});
it("Render", async () => {
setToken(TEST_AUTH_OBJECT_FISKER);
setToken(TEST_AUTH_OBJECT);
const container = await renderCANFiltersUpdate();
expect(container).toMatchSnapshot();
});

View File

@@ -8,7 +8,7 @@ import { BrowserRouter } from "react-router-dom";
import { VehicleProvider } from "../../Contexts/VehicleContext";
import { StatusProvider } from "../../Contexts/StatusContext";
import { UserProvider, setToken } from "../../Contexts/UserContext";
import { TEST_AUTH_OBJECT_FISKER } from "../../../utils/testing";
import { TEST_AUTH_OBJECT } from "../../../utils/testing";
import MainForm from "./index";
import addSnapshotSerializer from "../../../utils/snapshot";
@@ -36,7 +36,7 @@ describe("VehicleAddForm", () => {
});
it("Render", async () => {
setToken(TEST_AUTH_OBJECT_FISKER);
setToken(TEST_AUTH_OBJECT);
const container = await renderVehicleAdd();
expect(container).toMatchSnapshot();
});

View File

@@ -22,7 +22,22 @@ exports[`VehicleTable Render 1`] = `
>
<div
class="MuiGrid-root makeStyles-textJustifyAlign-0 MuiGrid-item MuiGrid-grid-md-4"
/>
>
<a
href="/vehicle-add"
>
<svg
aria-hidden="true"
class="MuiSvgIcon-root MuiSvgIcon-fontSizeLarge"
focusable="false"
viewBox="0 0 24 24"
>
<path
d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm5 11h-4v4h-2v-4H7v-2h4V7h2v4h4v2z"
/>
</svg>
</a>
</div>
<div
class="MuiGrid-root makeStyles-textCenterAlign-0 MuiGrid-item MuiGrid-grid-md-4"
>

View File

@@ -1,18 +1,16 @@
import React, { useEffect, useState } from "react";
import { Checkbox, FormControlLabel, Grid, MenuItem } from "@material-ui/core";
import AddCircleIcon from "@material-ui/icons/AddCircle";
import clsx from "clsx";
import React, { useEffect, useState } from "react";
import { Link } from "react-router-dom";
import clsx from "clsx";
import { Permissions } from "../../../utils/roles";
import { useStatusContext } from "../../Contexts/StatusContext";
import { useUserContext } from "../../Contexts/UserContext";
import { VehicleProvider } from "../../Contexts/VehicleContext";
import { useUserContext } from "../../Contexts/UserContext";
import { useStatusContext } from "../../Contexts/StatusContext";
import useStyles from "../../useStyles";
import SearchField from "../../Controls/SearchField";
import CarSelectionTable from "../../Controls/CarSelectionTable";
import OptionsDropdown from "../../Controls/OptionsDropdown";
import { RoleWrap } from "../../Controls/RoleWrap";
import SearchField from "../../Controls/SearchField";
import useStyles from "../../useStyles";
const MainForm = () => {
const classes = useStyles();
@@ -24,8 +22,6 @@ const MainForm = () => {
token: {
idToken: { jwtToken: token },
},
groups,
providers,
} = useUserContext();
const handleSearch = (query) => {
@@ -34,11 +30,11 @@ const MainForm = () => {
const handleOnline = (event) => {
setOnline(event.target.checked);
};
}
const handleOnlineHMI = (event) => {
setOnlineHMI(event.target.checked);
};
}
useEffect(() => {
setTitle("Vehicles");
@@ -50,34 +46,30 @@ const MainForm = () => {
<div className={clsx(classes.paper, classes.tableSize)}>
<Grid container className={classes.root} spacing={2}>
<Grid item md={4} className={classes.textJustifyAlign}>
<RoleWrap
groups={groups}
providers={providers}
rolesPerProvider={Permissions.FiskerDelete}
>
<Link to="/vehicle-add">
<AddCircleIcon fontSize="large" />
</Link>
</RoleWrap>
<Link to="/vehicle-add">
<AddCircleIcon fontSize="large" />
</Link>
</Grid>
<Grid item md={4} className={classes.textCenterAlign}>
<SearchField classes={classes} onSearch={handleSearch} />
</Grid>
<Grid item md={2} className={classes.textJustifyAlign}>
<OptionsDropdown listId="filter-menu">
<OptionsDropdown listId='filter-menu'>
<MenuItem>
<FormControlLabel
control={<Checkbox checked={online} onChange={handleOnline} />}
label="Only online"
/>
<FormControlLabel control={
<Checkbox
checked={online}
onChange={handleOnline}
/>
} label="Only online" />
</MenuItem>
<MenuItem>
<FormControlLabel
control={
<Checkbox checked={onlineHMI} onChange={handleOnlineHMI} />
}
label="Only online HMI"
/>
<FormControlLabel control={
<Checkbox
checked={onlineHMI}
onChange={handleOnlineHMI}
/>
} label="Only online HMI" />
</MenuItem>
</OptionsDropdown>
</Grid>
@@ -87,11 +79,7 @@ const MainForm = () => {
classes={classes}
token={token}
multiSelect={false}
search={{
search,
online: online ? true : null,
online_hmi: onlineHMI ? true : null,
}}
search={{ search, online: online? true : null, online_hmi: onlineHMI? true : null }}
/>
</div>
);

View File

@@ -11,7 +11,7 @@ import { BrowserRouter } from "react-router-dom";
import { VehicleProvider } from "../../Contexts/VehicleContext";
import { StatusProvider } from "../../Contexts/StatusContext";
import { UserProvider, setToken } from "../../Contexts/UserContext";
import { TEST_AUTH_OBJECT_FISKER } from "../../../utils/testing";
import { TEST_AUTH_OBJECT } from "../../../utils/testing";
import MainForm from "./index";
import addSnapshotSerializer from "../../../utils/snapshot";
@@ -39,7 +39,7 @@ describe("VehicleTable", () => {
});
it("Render", async () => {
setToken(TEST_AUTH_OBJECT_FISKER);
setToken(TEST_AUTH_OBJECT);
const container = await renderVehicleTable();
expect(container).toMatchSnapshot();
});

View File

@@ -9,7 +9,7 @@ import { render, waitFor } from "@testing-library/react";
import { BrowserRouter } from "react-router-dom";
import { setToken } from "../../Contexts/UserContext";
import { TEST_AUTH_OBJECT_FISKER } from "../../../utils/testing";
import { TEST_AUTH_OBJECT } from "../../../utils/testing";
import CANFiltersTab from "./CANFiltersTab";
import addSnapshotSerializer from "../../../utils/snapshot";
@@ -31,7 +31,7 @@ describe("CANFiltersTab", () => {
});
it("Render", async () => {
setToken(TEST_AUTH_OBJECT_FISKER);
setToken(TEST_AUTH_OBJECT);
const container = await renderCANFiltersTab();
expect(container).toMatchSnapshot();
});

View File

@@ -11,7 +11,7 @@ import { render, waitFor } from "@testing-library/react";
import { BrowserRouter } from "react-router-dom";
import CANSignalsTab from "./CANSignalsTab";
import {setToken} from "../../Contexts/UserContext";
import { TEST_AUTH_OBJECT_FISKER } from "../../../utils/testing";
import {TEST_AUTH_OBJECT} from "../../../utils/testing";
const renderCANSignalsTab = async () => {
const { container } = render(
@@ -31,7 +31,7 @@ describe("CANSignalsTab", () => {
});
it("Render", async () => {
setToken(TEST_AUTH_OBJECT_FISKER);
setToken(TEST_AUTH_OBJECT);
const container = await renderCANSignalsTab();
expect(container).toMatchSnapshot();
});

View File

@@ -11,7 +11,7 @@ import { BrowserRouter } from "react-router-dom";
import { CANFiltersProvider } from "../../Contexts/CANFiltersContext";
import { StatusProvider } from "../../Contexts/StatusContext";
import { UserProvider, setToken } from "../../Contexts/UserContext";
import { TEST_AUTH_OBJECT_FISKER } from "../../../utils/testing";
import { TEST_AUTH_OBJECT } from "../../../utils/testing";
import MainForm from "./CarUpdatesTab";
import addSnapshotSerializer from "../../../utils/snapshot";
@@ -39,7 +39,7 @@ describe("CarUpdatesTab", () => {
});
it("Render", async () => {
setToken(TEST_AUTH_OBJECT_FISKER);
setToken(TEST_AUTH_OBJECT);
const container = await renderCarUpdatesTab();
expect(container).toMatchSnapshot();
});

View File

@@ -101,6 +101,23 @@ exports[`VehicleDetailsTab Render 1`] = `
/>
</svg>
</a>
<a
class=""
href="/"
title="Delete \\"TESTVIN1234567890\\""
>
<svg
aria-hidden="true"
aria-label="Delete \\"TESTVIN1234567890\\""
class="MuiSvgIcon-root"
focusable="false"
viewBox="0 0 24 24"
>
<path
d="M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z"
/>
</svg>
</a>
</div>
</div>
<div />

View File

@@ -1,36 +1,28 @@
import { Grid, Tooltip } from "@material-ui/core";
import DeleteIcon from "@material-ui/icons/Delete";
import EditIcon from "@material-ui/icons/Edit";
import clsx from "clsx";
import React, { useEffect, useState } from "react";
import { Redirect } from "react-router";
import { Link } from "react-router-dom";
import { logger } from "../../../../services/monitoring";
import { Permissions } from "../../../../utils/roles";
import { useStatusContext } from "../../../Contexts/StatusContext";
import { useUserContext } from "../../../Contexts/UserContext";
import { Link } from 'react-router-dom';
import {
useVehicleContext,
VehicleProvider
} from "../../../Contexts/VehicleContext";
import { RoleWrap } from "../../../Controls/RoleWrap";
import DeleteConfirmation from "../../../DeleteConfirmation";
Grid,
Tooltip,
} from "@material-ui/core";
import EditIcon from "@material-ui/icons/Edit"
import DeleteIcon from "@material-ui/icons/Delete";
import clsx from "clsx";
import { useUserContext } from "../../../Contexts/UserContext"
import { useStatusContext } from "../../../Contexts/StatusContext";
import useStyles from "../../../useStyles";
import { logger } from "../../../../services/monitoring";
import { useVehicleContext, VehicleProvider } from "../../../Contexts/VehicleContext";
import DeleteConfirmation from "../../../DeleteConfirmation";
const MainForm = ({ vin }) => {
const classes = useStyles();
const { setMessage } = useStatusContext();
const { vehicle, getVehicle, deleteVehicle } = useVehicleContext();
const [redirect, setRedirect] = useState(null);
const [showDeleteModal, setShowDeleteModal] = useState(false);
const {
token: {
idToken: { jwtToken: token },
},
groups,
providers,
} = useUserContext();
const [showDeleteModal, setShowDeleteModal] = useState(false)
const { token: { idToken: { jwtToken: token } } } = useUserContext();
useEffect(() => {
(async () => {
@@ -48,7 +40,7 @@ const MainForm = ({ vin }) => {
const onDelete = async () => {
try {
await deleteVehicle(vin, token);
setMessage(`Deleted ${vin}`);
setMessage(`Deleted ${vin}`)
setRedirect(`/vehicles`);
} catch (e) {
setMessage(e.message);
@@ -64,67 +56,36 @@ const MainForm = ({ vin }) => {
<div className={clsx(classes.paper, classes.tableSize)}>
<Grid container className={classes.root} spacing={2}>
<Grid item md={12} className={classes.textCenterAlign}>
<p>
<b>VIN</b>: {vin}
</p>
<p><b>VIN</b>: {vin}</p>
{vehicle.log_level != null && (
<p>
<b>Log Level</b>: {vehicle.log_level}
</p>
<p><b>Log Level</b>: {vehicle.log_level}</p>
)}
</Grid>
{vehicle.canbus && (
<Grid item md={12} className={classes.textCenterAlign}>
<b>CANBus</b>
<p>
<b>Enabled</b>: {vehicle.canbus.enabled.toString()}
</p>
<p>
<b>Max Memory Buffer Size</b>: {vehicle.canbus.max_mem_buffer_size ?? "Default"}
</p>
<p>
<b>Enabled</b>: {vehicle.canbus.data_logger_enabled.toString()}
</p>
<p>
<b>Max Disk Buffer Size</b>: {vehicle.canbus.max_disk_buffer_size ?? "Default"}
</p>
<p>
<b>Filters</b>: {vehicle.canbus.filters ? vehicle.canbus.filters.length : 0}
</p>
<p><b>Enabled</b>: {vehicle.canbus.enabled.toString()}</p>
<p><b>Max Memory Buffer Size</b>: {vehicle.canbus.max_mem_buffer_size ?? "Default"}</p>
<p><b>Enabled</b>: {vehicle.canbus.data_logger_enabled.toString()}</p>
<p><b>Max Disk Buffer Size</b>: {vehicle.canbus.max_disk_buffer_size ?? "Default"}</p>
<p><b>Filters</b>: {vehicle.canbus.filters ? vehicle.canbus.filters.length : 0}</p>
</Grid>
)}
<Grid item md={12} className={classes.textCenterAlign}>
<RoleWrap
groups={groups}
providers={providers}
rolesPerProvider={Permissions.FiskerCreate}
>
<Tooltip key={`update-${vin}`} title={`Update "${vin}"`}>
<Link to={`/vehicle-update?vin=${vin}`} style={{ margin: 5 }}>
<EditIcon aria-label={`Update "${vin}"`} />
</Link>
</Tooltip>
</RoleWrap>
<RoleWrap
groups={groups}
providers={providers}
rolesPerProvider={Permissions.FiskerDelete}
>
<Tooltip key={`delete-${vin}`} title={`Delete "${vin}"`}>
<Link to="#" onClick={() => setShowDeleteModal(true)}>
<DeleteIcon aria-label={`Delete "${vin}"`} />
</Link>
</Tooltip>
</RoleWrap>
<Tooltip key={`update-${vin}`} title={`Update "${vin}"`}>
<Link to={`/vehicle-update?vin=${vin}`} style={{ margin: 5 }}>
<EditIcon aria-label={`Update "${vin}"`} />
</Link>
</Tooltip>
<Tooltip key={`delete-${vin}`} title={`Delete "${vin}"`}>
<Link to="#" onClick={() => setShowDeleteModal(true)}>
<DeleteIcon aria-label={`Delete "${vin}"`} />
</Link>
</Tooltip>
</Grid>
</Grid>
<DeleteConfirmation
message={vin}
open={showDeleteModal}
close={() => setShowDeleteModal(false)}
deleteFunction={onDelete}
/>
</div>
<DeleteConfirmation message={vin} open={showDeleteModal} close={()=> setShowDeleteModal(false)} deleteFunction={onDelete}/>
</div >
);
};

View File

@@ -9,7 +9,7 @@ import routeData from "react-router";
import { VehicleProvider } from "../../../Contexts/VehicleContext";
import { StatusProvider } from "../../../Contexts/StatusContext";
import { UserProvider, setToken } from "../../../Contexts/UserContext";
import { TEST_AUTH_OBJECT_FISKER }from "../../../../utils/testing";
import { TEST_AUTH_OBJECT } from "../../../../utils/testing";
import MainForm from "./index";
import addSnapshotSerializer from "../../../../utils/snapshot";
@@ -42,7 +42,7 @@ describe("VehicleDetailsTab", () => {
})
it("Render", async () => {
setToken(TEST_AUTH_OBJECT_FISKER);
setToken(TEST_AUTH_OBJECT);
const container = await renderVehicleDetailsTab();
expect(container).toMatchSnapshot();
});

View File

@@ -11,7 +11,7 @@ import { MemoryRouter, Route } from "react-router-dom";
import { VehicleProvider } from "../../Contexts/VehicleContext";
import { StatusProvider } from "../../Contexts/StatusContext";
import { UserProvider, setToken } from "../../Contexts/UserContext";
import { TEST_AUTH_OBJECT_FISKER } from "../../../utils/testing";
import { TEST_AUTH_OBJECT } from "../../../utils/testing";
import MainForm from "./DetailsTab";
import addSnapshotSerializer from "../../../utils/snapshot";
@@ -41,7 +41,7 @@ describe("DetailsTab", () => {
});
it("Render", async () => {
setToken(TEST_AUTH_OBJECT_FISKER);
setToken(TEST_AUTH_OBJECT);
const container = await renderDetailsTab();
expect(container).toMatchSnapshot();
});

View File

@@ -10,7 +10,7 @@ import { render, waitFor } from "@testing-library/react";
import { StatusProvider } from "../../Contexts/StatusContext";
import { UserProvider, setToken } from "../../Contexts/UserContext";
import { TEST_AUTH_OBJECT_FISKER } from "../../../utils/testing";
import { TEST_AUTH_OBJECT } from "../../../utils/testing";
import DigitalTwinTab from "./DigitalTwinTab";
import addSnapshotSerializer from "../../../utils/snapshot";
@@ -34,7 +34,7 @@ describe("DigitalTwinTab", () => {
});
it("Render", async () => {
setToken(TEST_AUTH_OBJECT_FISKER);
setToken(TEST_AUTH_OBJECT);
const container = await renderDetailsTab();
expect(container).toMatchSnapshot();
});

View File

@@ -12,7 +12,7 @@ import { BrowserRouter } from "react-router-dom";
import {StatusProvider} from "../../Contexts/StatusContext";
import {VehicleProvider} from "../../Contexts/VehicleContext";
import {setToken, UserProvider} from "../../Contexts/UserContext";
import { TEST_AUTH_OBJECT_FISKER } from "../../../utils/testing";
import {TEST_AUTH_OBJECT} from "../../../utils/testing";
import addSnapshotSerializer from "../../../utils/snapshot";
import FleetsTab from "./FleetsTab";
@@ -40,7 +40,7 @@ describe("FleetsTab", () => {
});
it("Render", async () => {
setToken(TEST_AUTH_OBJECT_FISKER);
setToken(TEST_AUTH_OBJECT);
const container = await renderFleetsTab();
expect(container).toMatchSnapshot();
});

View File

@@ -10,7 +10,7 @@ import {StatusProvider} from "../../Contexts/StatusContext";
import {setToken, UserProvider} from "../../Contexts/UserContext";
import RemoteCommandsTab from "./RemoteCommandsTab";
import addSnapshotSerializer from "../../../utils/snapshot";
import { TEST_AUTH_OBJECT_FISKER } from "../../../utils/testing";
import {TEST_AUTH_OBJECT} from "../../../utils/testing";
import React from "react";
const renderRemoteCommandsTab = async () => {
@@ -33,7 +33,7 @@ describe("RemoteCommandsTab", () => {
});
it("Render", async () => {
setToken(TEST_AUTH_OBJECT_FISKER);
setToken(TEST_AUTH_OBJECT);
const container = await renderRemoteCommandsTab();
expect(container).toMatchSnapshot();
});

View File

@@ -249,6 +249,23 @@ exports[`CANFiltersTab Render 1`] = `
/>
</svg>
</a>
<a
class=""
href="/"
title="Delete \\"123\\""
>
<svg
aria-hidden="true"
aria-label="Delete 123"
class="MuiSvgIcon-root"
focusable="false"
viewBox="0 0 24 24"
>
<path
d="M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z"
/>
</svg>
</a>
</td>
</tr>
<tr
@@ -295,6 +312,23 @@ exports[`CANFiltersTab Render 1`] = `
/>
</svg>
</a>
<a
class=""
href="/"
title="Delete \\"456-789\\""
>
<svg
aria-hidden="true"
aria-label="Delete 456-789"
class="MuiSvgIcon-root"
focusable="false"
viewBox="0 0 24 24"
>
<path
d="M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z"
/>
</svg>
</a>
</td>
</tr>
<tr
@@ -341,6 +375,23 @@ exports[`CANFiltersTab Render 1`] = `
/>
</svg>
</a>
<a
class=""
href="/"
title="Delete \\"1\\""
>
<svg
aria-hidden="true"
aria-label="Delete 1"
class="MuiSvgIcon-root"
focusable="false"
viewBox="0 0 24 24"
>
<path
d="M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z"
/>
</svg>
</a>
</td>
</tr>
</tbody>

View File

@@ -109,6 +109,23 @@ exports[`DetailsTab Render 1`] = `
/>
</svg>
</a>
<a
class=""
href="/testroute/TESTVIN1234567890"
title="Delete \\"TESTVIN1234567890\\""
>
<svg
aria-hidden="true"
aria-label="Delete \\"TESTVIN1234567890\\""
class="MuiSvgIcon-root"
focusable="false"
viewBox="0 0 24 24"
>
<path
d="M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z"
/>
</svg>
</a>
</div>
</div>
<div />

View File

@@ -67,6 +67,7 @@ exports[`CarStatus Render 1`] = `
</button>
<button
aria-controls="tabpanel-2"
aria-selected="false"
class="MuiButtonBase-root MuiTab-root MuiTab-textColorInherit"
id="tab-2"
role="tab"
@@ -84,6 +85,7 @@ exports[`CarStatus Render 1`] = `
</button>
<button
aria-controls="tabpanel-3"
aria-selected="false"
class="MuiButtonBase-root MuiTab-root MuiTab-textColorInherit"
id="tab-3"
role="tab"
@@ -101,6 +103,7 @@ exports[`CarStatus Render 1`] = `
</button>
<button
aria-controls="tabpanel-4"
aria-selected="false"
class="MuiButtonBase-root MuiTab-root MuiTab-textColorInherit"
id="tab-4"
role="tab"
@@ -118,6 +121,7 @@ exports[`CarStatus Render 1`] = `
</button>
<button
aria-controls="tabpanel-5"
aria-selected="false"
class="MuiButtonBase-root MuiTab-root MuiTab-textColorInherit"
id="tab-5"
role="tab"
@@ -135,6 +139,7 @@ exports[`CarStatus Render 1`] = `
</button>
<button
aria-controls="tabpanel-6"
aria-selected="false"
class="MuiButtonBase-root MuiTab-root MuiTab-textColorInherit"
id="tab-6"
role="tab"
@@ -212,6 +217,23 @@ exports[`CarStatus Render 1`] = `
/>
</svg>
</a>
<a
class=""
href="/"
title="Delete \\"TESTVIN1234567890\\""
>
<svg
aria-hidden="true"
aria-label="Delete \\"TESTVIN1234567890\\""
class="MuiSvgIcon-root"
focusable="false"
viewBox="0 0 24 24"
>
<path
d="M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z"
/>
</svg>
</a>
</div>
</div>
<div />

View File

@@ -1,22 +1,19 @@
import { Box, Tab, Tabs } from "@material-ui/core";
import clsx from "clsx";
import React, { useEffect } from "react";
import { useParams } from "react-router";
import { useLocation } from "react-router-dom";
import clsx from "clsx";
import { Box, Tab, Tabs } from "@material-ui/core";
import { Permissions } from "../../../utils/roles";
import { useStatusContext } from "../../Contexts/StatusContext";
import { useUserContext } from "../../Contexts/UserContext";
import { RoleWrap } from "../../Controls/RoleWrap";
import TabPanel from "../../Controls/TabPanel";
import useStyles from "../../useStyles";
import CANFiltersTab from "./CANFiltersTab";
import CANSignalsTab from "./CANSignalsTab";
import CarUpdatesTab from "./CarUpdatesTab";
import CarDetailsTab from "./DetailsTab";
import CarUpdatesTab from "./CarUpdatesTab";
import CANFiltersTab from "./CANFiltersTab";
import DigitalTwinTab from "./DigitalTwinTab";
import FleetsTab from "./FleetsTab";
import TabPanel from "../../Controls/TabPanel";
import { useStatusContext } from "../../Contexts/StatusContext";
import useStyles from "../../useStyles";
import CANSignalsTab from "./CANSignalsTab";
import RemoteCommandsTab from "./RemoteCommandsTab";
import FleetsTab from "./FleetsTab";
const tabHashes = ["details", "updates", "filters"];
@@ -27,8 +24,6 @@ const CarStatus = () => {
const { hash } = useLocation();
const [tabIndex, setTabIndex] = React.useState(0);
const { groups, providers } = useUserContext();
useEffect(() => {
const key = hash.replace("#", "");
const index = tabHashes.findIndex((element) => element === key);
@@ -68,18 +63,12 @@ const CarStatus = () => {
>
<Tab label="Details" {...tabProps(0)} />
<Tab label="Car Updates" {...tabProps(1)} />
<RoleWrap
groups={groups}
providers={providers}
rolesPerProvider={Permissions.FiskerRead}
>
<Tab label="CAN Filters" {...tabProps(2)} />
<Tab label="Digital Twin" {...tabProps(3)} />
<Tab label="CAN Filters" {...tabProps(2)} />
<Tab label="Digital Twin" {...tabProps(3)} />
<Tab label="CAN Signals" {...tabProps(4)} />
<Tab label="Remote Commands" {...tabProps(5)} />
<Tab label="Fleets" {...tabProps(6)} />
<Tab label="CAN Signals" {...tabProps(4)} />
<Tab label="Remote Commands" {...tabProps(5)} />
<Tab label="Fleets" {...tabProps(6)} />
</RoleWrap>
</Tabs>
</Box>
@@ -91,30 +80,25 @@ const CarStatus = () => {
<CarUpdatesTab />
</TabPanel>
<RoleWrap
groups={groups}
providers={providers}
rolesPerProvider={Permissions.FiskerRead}
>
<TabPanel value={tabIndex} index={2}>
<CANFiltersTab />
</TabPanel>
<TabPanel value={tabIndex} index={3}>
<DigitalTwinTab vin={vin} />
</TabPanel>
<TabPanel value={tabIndex} index={2}>
<CANFiltersTab />
</TabPanel>
<TabPanel value={tabIndex} index={4} className={classes.fullWidth}>
<CANSignalsTab vin={vin} />
</TabPanel>
<TabPanel value={tabIndex} index={3}>
<DigitalTwinTab vin={vin} />
</TabPanel>
<TabPanel value={tabIndex} index={5} className={classes.fullWidth}>
<RemoteCommandsTab vin={vin} />
</TabPanel>
<TabPanel value={tabIndex} index={4} className={classes.fullWidth}>
<CANSignalsTab vin={vin} />
</TabPanel>
<TabPanel value={tabIndex} index={6} className={classes.fullWidth}>
<FleetsTab vin={vin} />
</TabPanel>
</RoleWrap>
<TabPanel value={tabIndex} index={5} className={classes.fullWidth}>
<RemoteCommandsTab vin={vin} />
</TabPanel>
<TabPanel value={tabIndex} index={6} className={classes.fullWidth}>
<FleetsTab vin={vin} />
</TabPanel>
</div>
);
};

View File

@@ -12,7 +12,7 @@ import routeData from "react-router";
import { CANFiltersProvider } from "../../Contexts/CANFiltersContext";
import { StatusProvider } from "../../Contexts/StatusContext";
import { UserProvider, setToken } from "../../Contexts/UserContext";
import { TEST_AUTH_OBJECT_FISKER } from "../../../utils/testing";
import { TEST_AUTH_OBJECT } from "../../../utils/testing";
import CarStatus from "./index";
import addSnapshotSerializer from "../../../utils/snapshot";
@@ -45,7 +45,7 @@ describe("CarStatus", () => {
})
it("Render", async () => {
setToken(TEST_AUTH_OBJECT_FISKER);
setToken(TEST_AUTH_OBJECT);
const container = await renderCarStatus();
expect(container).toMatchSnapshot();
});

View File

@@ -8,7 +8,7 @@ import { BrowserRouter } from "react-router-dom";
import { VehicleProvider } from "../../Contexts/VehicleContext";
import { StatusProvider } from "../../Contexts/StatusContext";
import { UserProvider, setToken } from "../../Contexts/UserContext";
import { TEST_AUTH_OBJECT_FISKER } from "../../../utils/testing";
import { TEST_AUTH_OBJECT } from "../../../utils/testing";
import MainForm from "./index";
import addSnapshotSerializer from "../../../utils/snapshot";
@@ -36,7 +36,7 @@ describe("VehicleUpdate", () => {
});
it("Render", async () => {
setToken(TEST_AUTH_OBJECT_FISKER);
setToken(TEST_AUTH_OBJECT);
const container = await renderVehicleUpdate();
expect(container).toMatchSnapshot();
});

View File

@@ -2,7 +2,7 @@ import React, { useContext, useEffect, useState } from "react";
import auth from "../../services/auth";
import getTimerWorker from "../../services/getTimerWorker";
import { parsePayload } from "../../utils/jwt";
import {getGroups, getProviders} from "../../utils/roles";
import { getGroups } from "../../utils/roles";
const UserContext = React.createContext();
@@ -10,7 +10,6 @@ export const UserProvider = ({ children }) => {
const [fetching, setFetching] = useState(false);
const [token, setToken] = useState(null);
const [groups, setGroups] = useState(null);
const [providers, setProviders] = useState(null);
const [error, setError] = useState(null);
let timer;
@@ -74,7 +73,6 @@ export const UserProvider = ({ children }) => {
}
setGroups(getGroups(idToken));
setProviders(getProviders(idToken));
startSessionTimer();
} catch (e) {
setError(`Verify error. ${e.message}`);
@@ -108,7 +106,6 @@ export const UserProvider = ({ children }) => {
const signOut = () => {
setGroups(null);
setProviders(null);
setToken(null);
if (localStorage) {
localStorage.removeItem("token");
@@ -156,7 +153,6 @@ export const UserProvider = ({ children }) => {
error,
fetching,
groups,
providers,
token,
getAuthorizeURL,
getLogoutURL,

View File

@@ -1,10 +1,9 @@
import React from "react";
import {getGroups, getProviders} from "../../../utils/roles";
import { getGroups } from "../../../utils/roles";
let token = null;
let groups = null;
let providers = null;
let fetching = false;
let error = null;
let signInResp = {};
@@ -21,7 +20,6 @@ export const useUserContext = () => ({
error,
fetching,
groups,
providers,
token,
getAuthorizeURL: jest.fn(() => authorizeURL),
getLogoutURL: jest.fn(() => logoutURL),
@@ -37,10 +35,8 @@ export const setToken = (val) => {
token = val;
if (!val || !val.idToken || !val.idToken.jwtToken) {
groups = null;
providers = null
} else {
groups = getGroups(val.idToken.jwtToken);
providers = getProviders(val.idToken.jwtToken);
}
};

View File

@@ -6,14 +6,14 @@ import { render, waitFor } from "@testing-library/react";
import { CarUpdatesProvider } from "../../Contexts/CarUpdatesContext";
import CarUpdateStatusTable from "../CarUpdateStatusTable";
import { StatusProvider } from "../../Contexts/StatusContext";
import { TEST_AUTH_OBJECT_FISKER } from "../../../utils/testing";
import { TEST_AUTH_OBJECT } from "../../../utils/testing";
import addSnapshotSerializer from "../../../utils/snapshot";
const renderCarUpdateStatusTable = async () => {
const { container } = render(
<StatusProvider>
<CarUpdatesProvider>
<CarUpdateStatusTable carupdateid={283} token={TEST_AUTH_OBJECT_FISKER} />
<CarUpdateStatusTable carupdateid={283} token={TEST_AUTH_OBJECT} />
</CarUpdatesProvider>
</StatusProvider>
);

View File

@@ -1,3 +1,4 @@
import React, { useEffect, useState } from "react";
import {
LinearProgress,
Table,
@@ -8,22 +9,19 @@ import {
TableRow,
Tooltip,
} from "@material-ui/core";
import CancelIcon from "@material-ui/icons/Cancel";
import React, { useEffect, useState } from "react";
import { Link } from "react-router-dom";
import CancelIcon from "@material-ui/icons/Cancel";
import { logger } from "../../../services/monitoring";
import { LocalDateTimeString } from "../../../utils/dates";
import TableHeaderSortable from "../../Table/HeaderSortable";
import {
CarUpdatesProvider,
useCarUpdatesContext,
} from "../../Contexts/CarUpdatesContext";
import { useStatusContext } from "../../Contexts/StatusContext";
import { useUserContext } from "../../Contexts/UserContext";
import TableHeaderSortable from "../../Table/HeaderSortable";
import { useLocalStorage } from "../../useLocalStorage";
import useStyles from "../../useStyles";
import { RoleWrap } from "../RoleWrap";
import { logger } from "../../../services/monitoring";
import { useLocalStorage } from "../../useLocalStorage";
const tableColumns = [
{
@@ -70,8 +68,6 @@ const MainForm = ({ vin, token }) => {
} = useCarUpdatesContext();
const { setMessage } = useStatusContext();
const { groups, providers } = useUserContext();
useEffect(() => {
(async () => {
try {
@@ -180,17 +176,11 @@ const MainForm = ({ vin, token }) => {
{LocalDateTimeString(row.updated)}
</TableCell>
<TableCell>
<RoleWrap
groups={groups}
providers={providers}
rolesPerProvider={Permissions.FiskerCreate}
>
<Tooltip key={row.vin} title={`Send cancel for ${row.vin}`}>
<Link to="#" onClick={() => sendCancel(row)}>
<CancelIcon />
</Link>
</Tooltip>
</RoleWrap>
<Tooltip key={row.vin} title={`Send cancel for ${row.vin}`}>
<Link to="#" onClick={() => sendCancel(row)}>
<CancelIcon />
</Link>
</Tooltip>
</TableCell>
</TableRow>
))}

View File

@@ -1,23 +0,0 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`RoleWrap RoleWrap with access, child renders 1`] = `
<div>
<div
data-testid="test-role-wrap-child"
>
Test
</div>
</div>
`;
exports[`RoleWrap RoleWrap without access, child does not render 1`] = `<div />`;
exports[`RoleWrap RoleWrap without access, eitherComponent renders 1`] = `
<div>
<div
data-testid="test-role-wrap-child"
>
Either
</div>
</div>
`;

View File

@@ -1,19 +0,0 @@
import {hasRole} from "../../../utils/roles";
import React from "react";
export const RoleWrap = (props) => {
const {groups, rolesPerProvider, providers} = props;
const eitherComponent = props["eitherComponent"] || null;
if (!hasRole(groups, rolesPerProvider, providers)) {
return eitherComponent != null ? eitherComponent : <></>;
}
return (
<React.Fragment>
{props.children}
</React.Fragment>
)
}

View File

@@ -1,70 +0,0 @@
import { render, screen } from "@testing-library/react";
import { Permissions, Providers, Roles } from "../../../utils/roles";
import addSnapshotSerializer from "../../../utils/snapshot";
import { RoleWrap } from "./index";
const selector = "test-role-wrap-child";
const renderRoleWrap = async (
groups,
providers,
rolesPerProvider,
eitherComponent
) => {
const { container } = render(
<RoleWrap
groups={groups}
providers={providers}
rolesPerProvider={rolesPerProvider}
eitherComponent={eitherComponent}
>
<div data-testid={selector}>Test</div>
</RoleWrap>
);
return container;
};
describe("RoleWrap", () => {
beforeAll(() => {
addSnapshotSerializer(expect);
});
it("RoleWrap with access, child renders", async () => {
const view = await renderRoleWrap(
[Roles.READ],
[Providers.FISKER],
Permissions.FiskerRead,
null
);
const childComponent = screen.getByTestId(selector);
expect(childComponent).toHaveTextContent("Test");
expect(view).toMatchSnapshot();
});
it("RoleWrap without access, child does not render", async () => {
const view = await renderRoleWrap(
[Roles.READ],
[Providers.FISKER],
Permissions.FiskerCreate,
null
);
const childComponent = screen.queryByTestId(selector);
expect(childComponent).toBeNull();
expect(view).toMatchSnapshot();
});
it("RoleWrap without access, eitherComponent renders", async () => {
const view = await renderRoleWrap(
[Roles.READ],
[Providers.FISKER],
Permissions.FiskerCreate,
<div data-testid={selector}>Either</div>
);
const childComponent = screen.getByTestId(selector);
expect(childComponent).toHaveTextContent("Either");
expect(view).toMatchSnapshot();
});
});

View File

@@ -8,7 +8,7 @@ import { BrowserRouter } from "react-router-dom";
import { FleetProvider } from "../../Contexts/FleetContext";
import { StatusProvider } from "../../Contexts/StatusContext";
import { UserProvider, setToken } from "../../Contexts/UserContext";
import { TEST_AUTH_OBJECT_FISKER } from "../../../utils/testing";
import { TEST_AUTH_OBJECT } from "../../../utils/testing";
import MainForm from "./index";
import addSnapshotSerializer from "../../../utils/snapshot";
@@ -36,7 +36,7 @@ describe("FleetAddForm", () => {
});
it("Render", async () => {
setToken(TEST_AUTH_OBJECT_FISKER);
setToken(TEST_AUTH_OBJECT);
const container = await renderFleetAdd();
expect(container).toMatchSnapshot();
});

View File

@@ -8,7 +8,7 @@ import { BrowserRouter } from "react-router-dom";
import { FleetProvider } from "../../../../Contexts/FleetContext";
import { StatusProvider } from "../../../../Contexts/StatusContext";
import { UserProvider, setToken } from "../../../../Contexts/UserContext";
import { TEST_AUTH_OBJECT_FISKER }from "../../../../../utils/testing";
import { TEST_AUTH_OBJECT } from "../../../../../utils/testing";
import MainForm from "./index";
import addSnapshotSerializer from "../../../../../utils/snapshot";
@@ -34,7 +34,7 @@ describe("FleetCANFilterAdd", () => {
});
it("Render", async () => {
setToken(TEST_AUTH_OBJECT_FISKER);
setToken(TEST_AUTH_OBJECT);
const container = await renderFleetCANFilterAdd();
expect(container).toMatchSnapshot();
});

View File

@@ -221,6 +221,23 @@ exports[`FleetCANFiltersTable Render 1`] = `
/>
</svg>
</a>
<a
class=""
href="/"
title="Delete \\"123-456\\""
>
<svg
aria-hidden="true"
aria-label="Delete 123-456"
class="MuiSvgIcon-root"
focusable="false"
viewBox="0 0 24 24"
>
<path
d="M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z"
/>
</svg>
</a>
</td>
</tr>
<tr
@@ -260,6 +277,23 @@ exports[`FleetCANFiltersTable Render 1`] = `
/>
</svg>
</a>
<a
class=""
href="/"
title="Delete \\"1\\""
>
<svg
aria-hidden="true"
aria-label="Delete 1"
class="MuiSvgIcon-root"
focusable="false"
viewBox="0 0 24 24"
>
<path
d="M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z"
/>
</svg>
</a>
</td>
</tr>
<tr
@@ -299,6 +333,23 @@ exports[`FleetCANFiltersTable Render 1`] = `
/>
</svg>
</a>
<a
class=""
href="/"
title="Delete \\"1000\\""
>
<svg
aria-hidden="true"
aria-label="Delete 1000"
class="MuiSvgIcon-root"
focusable="false"
viewBox="0 0 24 24"
>
<path
d="M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z"
/>
</svg>
</a>
</td>
</tr>
</tbody>

View File

@@ -1,3 +1,5 @@
import React, { useEffect, useState } from "react";
import { Link } from 'react-router-dom';
import {
Grid,
Table,
@@ -10,42 +12,37 @@ import {
} from "@material-ui/core";
import AddCircleIcon from "@material-ui/icons/AddCircle";
import DeleteIcon from "@material-ui/icons/Delete";
import EditIcon from "@material-ui/icons/Edit";
import EditIcon from '@material-ui/icons/Edit';
import clsx from "clsx";
import React, { useEffect, useState } from "react";
import { Link } from "react-router-dom";
import { logger } from "../../../../../services/monitoring";
import { hasRole, Permissions } from "../../../../../utils/roles";
import { trimIfMoreThan } from "../../../../../utils/strings";
import {
FleetProvider,
useFleetContext,
} from "../../../../Contexts/FleetContext";
import { useStatusContext } from "../../../../Contexts/StatusContext";
import { useUserContext } from "../../../../Contexts/UserContext";
import SearchField from "../../../../Controls/SearchField";
import TableHeaderSortable from "../../../../Table/HeaderSortable";
import { useLocalStorage } from "../../../../useLocalStorage";
import { useUserContext } from "../../../../Contexts/UserContext"
import { useStatusContext } from "../../../../Contexts/StatusContext";
import { FleetProvider, useFleetContext } from "../../../../Contexts/FleetContext"
import useStyles from "../../../../useStyles";
import SearchField from "../../../../Controls/SearchField";
import { logger } from "../../../../../services/monitoring";
import { Roles, hasRole } from "../../../../../utils/roles";
import {useLocalStorage} from "../../../../useLocalStorage";
import {trimIfMoreThan} from "../../../../../utils/strings"
const tableColumns = [
{
id: "can_id",
label: "CAN ID",
label: "CAN ID"
},
{
id: "interval",
label: "Interval (ms)",
label: "Interval (ms)"
},
{
id: "edge_mask",
label: "Edge mask",
label: "Edge mask"
},
{
id: "",
label: "Actions",
},
label: "Actions"
}
];
const PAGE_SIZE = "FLEET_STATUS_CAN_FILTER_TABLE_PAGE_SIZE";
@@ -57,19 +54,8 @@ const MainForm = ({ name }) => {
const [order, setOrder] = useState("desc");
const classes = useStyles();
const { setMessage } = useStatusContext();
const {
fleetCANFilters,
totalFleetCANFilters,
getFleetCANFilters,
deleteFleetCANFilter,
} = useFleetContext();
const {
token: {
idToken: { jwtToken: token },
},
groups,
providers,
} = useUserContext();
const { fleetCANFilters, totalFleetCANFilters, getFleetCANFilters, deleteFleetCANFilter } = useFleetContext();
const { token: { idToken: { jwtToken: token } }, groups } = useUserContext();
useEffect(() => {
(async () => {
@@ -121,7 +107,7 @@ const MainForm = ({ name }) => {
const onDelete = async (can_id) => {
try {
await deleteFleetCANFilter(name, can_id, token);
setMessage(`Deleted ${can_id}`);
setMessage(`Deleted ${can_id}`)
} catch (e) {
setMessage(e.message);
logger.warn(e.stack);
@@ -130,19 +116,19 @@ const MainForm = ({ name }) => {
const Actions = (row) => {
let actions = [];
if (hasRole(groups, Permissions.FiskerCreate, providers)) {
if (hasRole([Roles.CREATE], groups)) {
actions.push({
tip: `Update "${row.can_id}"`,
link: `/fleet/${name}/filter-update?name=${name}&can_id=${row.can_id}&interval=${row.interval}`,
icon: <EditIcon aria-label={`Update ${row.can_id}`} />,
icon: <EditIcon aria-label={`Update ${row.can_id}`} />
});
}
if (hasRole(groups, Permissions.FiskerDelete, providers)) {
if (hasRole([Roles.DELETE], groups)) {
actions.push({
tip: `Delete "${row.can_id}"`,
id: row.can_id,
icon: <DeleteIcon aria-label={`Delete ${row.can_id}`} />,
});
icon: <DeleteIcon aria-label={`Delete ${row.can_id}`} />
})
}
if (actions.length === 0) return ["No actions"];
@@ -171,10 +157,7 @@ const MainForm = ({ name }) => {
<div className={clsx(classes.paper, classes.tableSize)}>
<Grid container className={classes.root} spacing={2}>
<Grid item md={4} className={classes.textJustifyAlign}>
<Link
to={`/fleet/${name}/filter-add`}
className={classes.labelInline}
>
<Link to={`/fleet/${name}/filter-add`} className={classes.labelInline}>
<AddCircleIcon fontSize="large" />
</Link>
</Grid>
@@ -191,13 +174,11 @@ const MainForm = ({ name }) => {
onSortRequest={handleSort}
/>
<TableBody>
{fleetCANFilters.map((row) => (
{fleetCANFilters.map(row => (
<TableRow key={row.can_id}>
<TableCell align="center">{row.can_id}</TableCell>
<TableCell align="center">{row.interval}</TableCell>
<TableCell align="center">
{trimIfMoreThan(row.edge_mask, 15, "...")}
</TableCell>
<TableCell align="center">{trimIfMoreThan(row.edge_mask, 15, "...")}</TableCell>
<TableCell align="center">{Actions(row)}</TableCell>
</TableRow>
))}
@@ -220,7 +201,7 @@ const MainForm = ({ name }) => {
</TableRow>
</TableFooter>
</Table>
</div>
</div >
);
};

View File

@@ -11,7 +11,7 @@ import { BrowserRouter } from "react-router-dom";
import { FleetProvider } from "../../../../Contexts/FleetContext";
import { StatusProvider } from "../../../../Contexts/StatusContext";
import { UserProvider, setToken } from "../../../../Contexts/UserContext";
import { TEST_AUTH_OBJECT_FISKER }from "../../../../../utils/testing";
import { TEST_AUTH_OBJECT } from "../../../../../utils/testing";
import MainForm from "./index";
import addSnapshotSerializer from "../../../../../utils/snapshot";
@@ -37,7 +37,7 @@ describe("FleetCANFiltersTable", () => {
});
it("Render", async () => {
setToken(TEST_AUTH_OBJECT_FISKER);
setToken(TEST_AUTH_OBJECT);
const container = await renderFleetCANFiltersTable();
expect(container).toMatchSnapshot();
});

View File

@@ -8,7 +8,7 @@ import { BrowserRouter } from "react-router-dom";
import { FleetProvider } from "../../../../Contexts/FleetContext";
import { StatusProvider } from "../../../../Contexts/StatusContext";
import { UserProvider, setToken } from "../../../../Contexts/UserContext";
import { TEST_AUTH_OBJECT_FISKER } from "../../../../../utils/testing";
import { TEST_AUTH_OBJECT } from "../../../../../utils/testing";
import MainForm from "./index";
import addSnapshotSerializer from "../../../../../utils/snapshot";
@@ -34,7 +34,7 @@ describe("FleetCANFilterUpdate", () => {
});
it("Render", async () => {
setToken(TEST_AUTH_OBJECT_FISKER);
setToken(TEST_AUTH_OBJECT);
const container = await renderFleetCANFilterUpdate();
expect(container).toMatchSnapshot();
});

View File

@@ -9,7 +9,7 @@ import { render, waitFor } from "@testing-library/react";
import { BrowserRouter } from "react-router-dom";
import { setToken } from "../../Contexts/UserContext";
import { TEST_AUTH_OBJECT_FISKER } from "../../../utils/testing";
import { TEST_AUTH_OBJECT } from "../../../utils/testing";
import CANFiltersTab from "./CANFiltersTab";
import addSnapshotSerializer from "../../../utils/snapshot";
@@ -31,7 +31,7 @@ describe("CANFiltersTab", () => {
});
it("Render", async () => {
setToken(TEST_AUTH_OBJECT_FISKER);
setToken(TEST_AUTH_OBJECT);
const container = await renderCANFitlersTab();
expect(container).toMatchSnapshot();
});

View File

@@ -9,7 +9,7 @@ import routeData from "react-router";
import { FleetProvider } from "../../../Contexts/FleetContext";
import { StatusProvider } from "../../../Contexts/StatusContext";
import { UserProvider, setToken } from "../../../Contexts/UserContext";
import { TEST_AUTH_OBJECT_FISKER }from "../../../../utils/testing";
import { TEST_AUTH_OBJECT } from "../../../../utils/testing";
import MainForm from "./index";
import addSnapshotSerializer from "../../../../utils/snapshot";
@@ -42,7 +42,7 @@ describe("FleetDetailsTab", () => {
})
it("Render", async () => {
setToken(TEST_AUTH_OBJECT_FISKER);
setToken(TEST_AUTH_OBJECT);
const container = await renderFleetDetailsTab();
expect(container).toMatchSnapshot();
});

View File

@@ -11,7 +11,7 @@ import { MemoryRouter, Route } from "react-router-dom";
import { FleetProvider } from "../../Contexts/FleetContext";
import { StatusProvider } from "../../Contexts/StatusContext";
import { UserProvider, setToken } from "../../Contexts/UserContext";
import { TEST_AUTH_OBJECT_FISKER } from "../../../utils/testing";
import { TEST_AUTH_OBJECT } from "../../../utils/testing";
import MainForm from "./DetailsTab";
import addSnapshotSerializer from "../../../utils/snapshot";
@@ -41,7 +41,7 @@ describe("DetailsTab", () => {
});
it("Render", async () => {
setToken(TEST_AUTH_OBJECT_FISKER);
setToken(TEST_AUTH_OBJECT);
const container = await renderDetailsTab();
expect(container).toMatchSnapshot();
});

View File

@@ -8,7 +8,7 @@ import { BrowserRouter } from "react-router-dom";
import { FleetProvider } from "../../../../Contexts/FleetContext";
import { StatusProvider } from "../../../../Contexts/StatusContext";
import { UserProvider, setToken } from "../../../../Contexts/UserContext";
import { TEST_AUTH_OBJECT_FISKER }from "../../../../../utils/testing";
import { TEST_AUTH_OBJECT } from "../../../../../utils/testing";
import MainForm from "./index";
import addSnapshotSerializer from "../../../../../utils/snapshot";
@@ -36,7 +36,7 @@ describe("FleetVehicleAdd", () => {
});
it("Render", async () => {
setToken(TEST_AUTH_OBJECT_FISKER);
setToken(TEST_AUTH_OBJECT);
const container = await renderFleetVehicleAdd();
expect(container).toMatchSnapshot();
});

View File

@@ -153,7 +153,26 @@ exports[`FleetVehiclesTable Render 1`] = `
<td
class="MuiTableCell-root MuiTableCell-body MuiTableCell-alignCenter"
>
No actions
<span>
<a
class=""
href="/"
title="Delete \\"USWESTVIN12345678\\""
>
<svg
aria-hidden="true"
aria-label="Delete USWESTVIN12345678"
class="MuiSvgIcon-root"
focusable="false"
viewBox="0 0 24 24"
>
<path
d="M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z"
/>
</svg>
</a>
<div />
</span>
</td>
</tr>
<tr
@@ -171,7 +190,26 @@ exports[`FleetVehiclesTable Render 1`] = `
<td
class="MuiTableCell-root MuiTableCell-body MuiTableCell-alignCenter"
>
No actions
<span>
<a
class=""
href="/"
title="Delete \\"USWESTVIN12345679\\""
>
<svg
aria-hidden="true"
aria-label="Delete USWESTVIN12345679"
class="MuiSvgIcon-root"
focusable="false"
viewBox="0 0 24 24"
>
<path
d="M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z"
/>
</svg>
</a>
<div />
</span>
</td>
</tr>
<tr
@@ -189,7 +227,26 @@ exports[`FleetVehiclesTable Render 1`] = `
<td
class="MuiTableCell-root MuiTableCell-body MuiTableCell-alignCenter"
>
No actions
<span>
<a
class=""
href="/"
title="Delete \\"USWESTVIN12345670\\""
>
<svg
aria-hidden="true"
aria-label="Delete USWESTVIN12345670"
class="MuiSvgIcon-root"
focusable="false"
viewBox="0 0 24 24"
>
<path
d="M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z"
/>
</svg>
</a>
<div />
</span>
</td>
</tr>
</tbody>

View File

@@ -1,3 +1,5 @@
import React, { useEffect, useState } from "react";
import { Link } from 'react-router-dom';
import {
Grid,
Table,
@@ -11,32 +13,27 @@ import {
import AddCircleIcon from "@material-ui/icons/AddCircle";
import DeleteIcon from "@material-ui/icons/Delete";
import clsx from "clsx";
import React, { useEffect, useState } from "react";
import { Link } from "react-router-dom";
import { logger } from "../../../../../services/monitoring";
import { hasRole, Permissions } from "../../../../../utils/roles";
import {
FleetProvider,
useFleetContext,
} from "../../../../Contexts/FleetContext";
import { useStatusContext } from "../../../../Contexts/StatusContext";
import { useUserContext } from "../../../../Contexts/UserContext";
import SearchField from "../../../../Controls/SearchField";
import DeleteConfirmation from "../../../../DeleteConfirmation";
import TableHeaderSortable from "../../../../Table/HeaderSortable";
import { useLocalStorage } from "../../../../useLocalStorage";
import { useUserContext } from "../../../../Contexts/UserContext"
import { useStatusContext } from "../../../../Contexts/StatusContext";
import { FleetProvider, useFleetContext } from "../../../../Contexts/FleetContext"
import useStyles from "../../../../useStyles";
import SearchField from "../../../../Controls/SearchField";
import { logger } from "../../../../../services/monitoring";
import { Roles, hasRole } from "../../../../../utils/roles";
import { useLocalStorage } from "../../../../useLocalStorage";
import DeleteConfirmation from "../../../../DeleteConfirmation";
const tableColumns = [
{
id: "vin",
label: "VIN",
label: "VIN"
},
{
id: "",
label: "Actions",
},
label: "Actions"
}
];
const PAGE_SIZE = "FLEET_STATUS_VEHICLES_TABLE_PAGE_SIZE";
@@ -47,22 +44,11 @@ const MainForm = ({ name }) => {
const [orderBy, setOrderBy] = useState("id");
const [order, setOrder] = useState("desc");
const [search, setSearch] = useState("");
const [showDeleteModal, setShowDeleteModal] = useState(false);
const [showDeleteModal, setShowDeleteModal] = useState(false)
const classes = useStyles();
const { setMessage } = useStatusContext();
const {
fleetVehicles,
totalFleetVehicles,
getFleetVehicles,
deleteFleetVehicle,
} = useFleetContext();
const {
token: {
idToken: { jwtToken: token },
},
groups,
providers,
} = useUserContext();
const { fleetVehicles, totalFleetVehicles, getFleetVehicles, deleteFleetVehicle } = useFleetContext();
const { token: { idToken: { jwtToken: token } }, groups } = useUserContext();
const handleSearch = (query) => {
setSearch(query);
@@ -119,7 +105,7 @@ const MainForm = ({ name }) => {
const onDelete = async (vin) => {
try {
await deleteFleetVehicle(name, { vin: vin }, token);
setMessage(`Deleted ${vin}`);
setMessage(`Deleted ${vin}`)
} catch (e) {
setMessage(e.message);
logger.warn(e.stack);
@@ -128,12 +114,12 @@ const MainForm = ({ name }) => {
const Actions = (vin) => {
let actions = [];
if (hasRole(groups, Permissions.FiskerDelete, providers)) {
if (hasRole([Roles.DELETE], groups)) {
actions.push({
tip: `Delete "${vin}"`,
id: vin,
icon: <DeleteIcon aria-label={`Delete ${vin}`} />,
});
icon: <DeleteIcon aria-label={`Delete ${vin}`} />
})
}
if (actions.length === 0) return ["No actions"];
@@ -154,13 +140,9 @@ const MainForm = ({ name }) => {
{action.icon}
</Link>
</Tooltip>
<DeleteConfirmation
message={action.id}
open={showDeleteModal}
close={() => setShowDeleteModal(false)}
deleteFunction={() => onDelete(action.id)}
/>
<DeleteConfirmation message={action.id} open={showDeleteModal} close={() => setShowDeleteModal(false)} deleteFunction={() => onDelete(action.id)} />
</span>
);
}
});
@@ -170,10 +152,7 @@ const MainForm = ({ name }) => {
<div className={clsx(classes.paper, classes.tableSize)}>
<Grid container className={classes.root} spacing={2}>
<Grid item md={4} className={classes.textJustifyAlign}>
<Link
to={`/fleet/${name}/vehicle-add`}
className={classes.labelInline}
>
<Link to={`/fleet/${name}/vehicle-add`} className={classes.labelInline}>
<AddCircleIcon fontSize="large" />
</Link>
</Grid>
@@ -190,7 +169,7 @@ const MainForm = ({ name }) => {
onSortRequest={handleSort}
/>
<TableBody>
{fleetVehicles.map((vin) => (
{fleetVehicles.map(vin => (
<TableRow key={vin}>
<TableCell align="center">
<Link to={`/vehicle-status/${vin}`}>{vin}</Link>
@@ -217,7 +196,7 @@ const MainForm = ({ name }) => {
</TableRow>
</TableFooter>
</Table>
</div>
</div >
);
};

View File

@@ -11,7 +11,7 @@ import { BrowserRouter } from "react-router-dom";
import { FleetProvider } from "../../../../Contexts/FleetContext";
import { StatusProvider } from "../../../../Contexts/StatusContext";
import { UserProvider, setToken } from "../../../../Contexts/UserContext";
import { TEST_AUTH_OBJECT_FISKER }from "../../../../../utils/testing";
import { TEST_AUTH_OBJECT } from "../../../../../utils/testing";
import MainForm from "./index";
import addSnapshotSerializer from "../../../../../utils/snapshot";
@@ -39,7 +39,7 @@ describe("FleetVehiclesTable", () => {
});
it("Render", async () => {
setToken(TEST_AUTH_OBJECT_FISKER);
setToken(TEST_AUTH_OBJECT);
const container = await renderFleetVehiclesTable();
expect(container).toMatchSnapshot();
});

View File

@@ -9,7 +9,7 @@ import { render, waitFor } from "@testing-library/react";
import { BrowserRouter } from "react-router-dom";
import { setToken } from "../../Contexts/UserContext";
import { TEST_AUTH_OBJECT_FISKER } from "../../../utils/testing";
import { TEST_AUTH_OBJECT } from "../../../utils/testing";
import VehiclesTab from "./VehiclesTab";
import addSnapshotSerializer from "../../../utils/snapshot";
@@ -31,7 +31,7 @@ describe("VehiclesTab", () => {
});
it("Render", async () => {
setToken(TEST_AUTH_OBJECT_FISKER);
setToken(TEST_AUTH_OBJECT);
const container = await renderVehiclesTab();
expect(container).toMatchSnapshot();
});

View File

@@ -220,6 +220,23 @@ exports[`CANFiltersTab Render 1`] = `
/>
</svg>
</a>
<a
class=""
href="/"
title="Delete \\"123-456\\""
>
<svg
aria-hidden="true"
aria-label="Delete 123-456"
class="MuiSvgIcon-root"
focusable="false"
viewBox="0 0 24 24"
>
<path
d="M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z"
/>
</svg>
</a>
</td>
</tr>
<tr
@@ -259,6 +276,23 @@ exports[`CANFiltersTab Render 1`] = `
/>
</svg>
</a>
<a
class=""
href="/"
title="Delete \\"1\\""
>
<svg
aria-hidden="true"
aria-label="Delete 1"
class="MuiSvgIcon-root"
focusable="false"
viewBox="0 0 24 24"
>
<path
d="M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z"
/>
</svg>
</a>
</td>
</tr>
<tr
@@ -298,6 +332,23 @@ exports[`CANFiltersTab Render 1`] = `
/>
</svg>
</a>
<a
class=""
href="/"
title="Delete \\"1000\\""
>
<svg
aria-hidden="true"
aria-label="Delete 1000"
class="MuiSvgIcon-root"
focusable="false"
viewBox="0 0 24 24"
>
<path
d="M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z"
/>
</svg>
</a>
</td>
</tr>
</tbody>

View File

@@ -152,7 +152,26 @@ exports[`VehiclesTab Render 1`] = `
<td
class="MuiTableCell-root MuiTableCell-body MuiTableCell-alignCenter"
>
No actions
<span>
<a
class=""
href="/"
title="Delete \\"USWESTVIN12345678\\""
>
<svg
aria-hidden="true"
aria-label="Delete USWESTVIN12345678"
class="MuiSvgIcon-root"
focusable="false"
viewBox="0 0 24 24"
>
<path
d="M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z"
/>
</svg>
</a>
<div />
</span>
</td>
</tr>
<tr
@@ -170,7 +189,26 @@ exports[`VehiclesTab Render 1`] = `
<td
class="MuiTableCell-root MuiTableCell-body MuiTableCell-alignCenter"
>
No actions
<span>
<a
class=""
href="/"
title="Delete \\"USWESTVIN12345679\\""
>
<svg
aria-hidden="true"
aria-label="Delete USWESTVIN12345679"
class="MuiSvgIcon-root"
focusable="false"
viewBox="0 0 24 24"
>
<path
d="M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z"
/>
</svg>
</a>
<div />
</span>
</td>
</tr>
<tr
@@ -188,7 +226,26 @@ exports[`VehiclesTab Render 1`] = `
<td
class="MuiTableCell-root MuiTableCell-body MuiTableCell-alignCenter"
>
No actions
<span>
<a
class=""
href="/"
title="Delete \\"USWESTVIN12345670\\""
>
<svg
aria-hidden="true"
aria-label="Delete USWESTVIN12345670"
class="MuiSvgIcon-root"
focusable="false"
viewBox="0 0 24 24"
>
<path
d="M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z"
/>
</svg>
</a>
<div />
</span>
</td>
</tr>
</tbody>

View File

@@ -12,7 +12,7 @@ import routeData from "react-router";
import { FleetProvider } from "../../Contexts/FleetContext";
import { StatusProvider } from "../../Contexts/StatusContext";
import { UserProvider, setToken } from "../../Contexts/UserContext";
import { TEST_AUTH_OBJECT_FISKER } from "../../../utils/testing";
import { TEST_AUTH_OBJECT } from "../../../utils/testing";
import FleetStatus from "./index";
import addSnapshotSerializer from "../../../utils/snapshot";
@@ -45,7 +45,7 @@ describe("FleetStatus", () => {
})
it("Render", async () => {
setToken(TEST_AUTH_OBJECT_FISKER);
setToken(TEST_AUTH_OBJECT);
const container = await renderCarStatus();
expect(container).toMatchSnapshot();
});

View File

@@ -11,7 +11,7 @@ import { BrowserRouter } from "react-router-dom";
import { FleetProvider } from "../../Contexts/FleetContext";
import { StatusProvider } from "../../Contexts/StatusContext";
import { UserProvider, setToken } from "../../Contexts/UserContext";
import { TEST_AUTH_OBJECT_FISKER } from "../../../utils/testing";
import { TEST_AUTH_OBJECT } from "../../../utils/testing";
import MainForm from "./index";
import addSnapshotSerializer from "../../../utils/snapshot";
@@ -39,7 +39,7 @@ describe("FleetTable", () => {
});
it("Render", async () => {
setToken(TEST_AUTH_OBJECT_FISKER);
setToken(TEST_AUTH_OBJECT);
const container = await renderFleetTable();
expect(container).toMatchSnapshot();
});

View File

@@ -8,7 +8,7 @@ import { BrowserRouter } from "react-router-dom";
import { FleetProvider } from "../../Contexts/FleetContext";
import { StatusProvider } from "../../Contexts/StatusContext";
import { UserProvider, setToken } from "../../Contexts/UserContext";
import { TEST_AUTH_OBJECT_FISKER } from "../../../utils/testing";
import { TEST_AUTH_OBJECT } from "../../../utils/testing";
import MainForm from "./index";
import addSnapshotSerializer from "../../../utils/snapshot";
@@ -36,7 +36,7 @@ describe("FleetUpdate", () => {
});
it("Render", async () => {
setToken(TEST_AUTH_OBJECT_FISKER);
setToken(TEST_AUTH_OBJECT);
const container = await renderFleetUpdate();
expect(container).toMatchSnapshot();
});

View File

@@ -1,17 +1,17 @@
import React from "react";
import { List } from "@material-ui/core";
import HomeIcon from "@material-ui/icons/Home";
import DirectionsCarIcon from "@material-ui/icons/DirectionsCar";
import CommuteIcon from "@material-ui/icons/Commute";
import CloudDownloadIcon from "@material-ui/icons/CloudDownload";
import AssessmentIcon from "@material-ui/icons/Assessment";
import BuildIcon from "@material-ui/icons/Build";
import CloudDownloadIcon from "@material-ui/icons/CloudDownload";
import CommuteIcon from "@material-ui/icons/Commute";
import DirectionsCarIcon from "@material-ui/icons/DirectionsCar";
import HomeIcon from "@material-ui/icons/Home";
import SettingsInputCompositeIcon from "@material-ui/icons/SettingsInputComposite";
import { default as React, useEffect, useState } from "react";
import { hasRole, Permissions } from "../../utils/roles";
import { useUserContext } from "../Contexts/UserContext";
import SupersetDashboardList from "../SupersetDashboardList/SupersetDashboardList";
import { Roles, hasRole } from "../../utils/roles";
import { ExpandableSideMenuItem, MenuItem } from "./MenuItem";
import SupersetDashboardList from "../SupersetDashboardList/SupersetDashboardList";
const menuData = [
{
@@ -24,60 +24,65 @@ const menuData = [
label: "Deployments",
to: "/packages",
icon: <CloudDownloadIcon />,
rolesPerProvider: Permissions.FiskerMagnaRead,
roles: [Roles.READ, Roles.CREATE],
},
{
label: "Vehicles",
to: "/vehicles",
icon: <DirectionsCarIcon />,
rolesPerProvider: Permissions.FiskerMagnaRead,
roles: [Roles.READ, Roles.CREATE],
},
{
label: "Fleets",
to: "/fleets",
icon: <CommuteIcon />,
rolesPerProvider: Permissions.FiskerRead,
roles: [Roles.READ, Roles.CREATE],
},
{
label: "Datascope",
to: null,
icon: <AssessmentIcon />,
rolesPerProvider: Permissions.FiskerRead,
component: SupersetDashboardList,
roles: [Roles.READ, Roles.CREATE],
component: SupersetDashboardList
},
{
label: "Suppliers",
to: "/suppliers",
icon: <SettingsInputCompositeIcon />,
rolesPerProvider: Permissions.FiskerSupplierAdmin,
roles: [Roles.APPROVESUPPLIERS],
},
{
label: "Tools",
to: "/tools/certificates/add",
icon: <BuildIcon />,
rolesPerProvider: Permissions.FiskerTools,
roles: [Roles.CERTIFICATES, Roles.APPROVESUPPLIERS],
submenus: [
{
label: "Certificate",
to: "/tools/certificates/add",
rolesPerProvider: Permissions.FiskerCertificate,
roles: [Roles.CERTIFICATES],
},
{
label: "SMS",
to: "/tools/sms/send",
rolesPerProvider: Permissions.FiskerCreate,
},
roles: [Roles.CREATE],
}
],
},
];
const SideMenu = () => {
const { groups, providers } = useUserContext();
const [menu, setMenu] = useState(menuData);
useEffect(() => {
filterAccessible(groups, providers, setMenu);
}, [groups, providers]);
const SideMenu = () => {
const { groups } = useUserContext();
const menu = menuData.reduce((result, item) => {
if (hasRole(item.roles, groups)) {
result.push(item);
}
return result;
}, []);
return (
<List>
@@ -91,14 +96,4 @@ const SideMenu = () => {
);
};
const filterAccessible = (groups, providers, setMenu) => {
const filteredMenu = menuData.reduce((result, item) => {
if (hasRole(groups, item.rolesPerProvider, providers)) {
result.push(item);
}
return result;
}, []);
setMenu(filteredMenu);
};
export default SideMenu;
export default SideMenu;

View File

@@ -1,12 +1,12 @@
jest.mock("../Contexts/UserContext");
jest.mock("../../services/superset");
jest.mock("../../services/superset")
import { render, screen, waitFor } from "@testing-library/react";
import { render, waitFor, screen } from "@testing-library/react";
import { BrowserRouter } from "react-router-dom";
import addSnapshotSerializer from "../../utils/snapshot";
import { TEST_AUTH_OBJECT_FISKER } from "../../utils/testing";
import { setToken, UserProvider } from "../Contexts/UserContext";
import { UserProvider, setToken } from "../Contexts/UserContext";
import { TEST_AUTH_OBJECT } from "../../utils/testing";
import SideMenu from "./SideMenu";
import addSnapshotSerializer from "../../utils/snapshot";
const renderMenu = async () => {
const { container } = render(
@@ -23,20 +23,15 @@ const renderMenu = async () => {
describe("SideMenu", () => {
beforeAll(() => {
addSnapshotSerializer(expect);
});
it("Unauthenticated", async () => {
setToken({ idToken: { jwtToken: null } });
const container = await renderMenu();
expect(container).toMatchSnapshot();
});
it("Authenticated", async () => {
setToken(TEST_AUTH_OBJECT_FISKER);
setToken(TEST_AUTH_OBJECT);
const container = await renderMenu();
await waitFor(() => {
expect(screen.getByText("Datascope")).toBeInTheDocument();
});
expect(screen.getByText('Datascope')).toBeInTheDocument()
})
expect(container).toMatchSnapshot();
});
});

View File

@@ -213,42 +213,6 @@ exports[`SideMenu Authenticated 1`] = `
</li>
</ul>
</li>
<li>
<a
aria-disabled="false"
class="MuiButtonBase-root MuiListItem-root MuiListItem-gutters MuiListItem-button"
href="/suppliers"
role="button"
tabindex="0"
>
<div
class="MuiListItemIcon-root"
>
<svg
aria-hidden="true"
class="MuiSvgIcon-root"
focusable="false"
viewBox="0 0 24 24"
>
<path
d="M5 2c0-.55-.45-1-1-1s-1 .45-1 1v4H1v6h6V6H5V2zm4 14c0 1.3.84 2.4 2 2.82V23h2v-4.18c1.16-.41 2-1.51 2-2.82v-2H9v2zm-8 0c0 1.3.84 2.4 2 2.82V23h2v-4.18C6.16 18.4 7 17.3 7 16v-2H1v2zM21 6V2c0-.55-.45-1-1-1s-1 .45-1 1v4h-2v6h6V6h-2zm-8-4c0-.55-.45-1-1-1s-1 .45-1 1v4H9v6h6V6h-2V2zm4 14c0 1.3.84 2.4 2 2.82V23h2v-4.18c1.16-.41 2-1.51 2-2.82v-2h-6v2z"
/>
</svg>
</div>
<div
class="MuiListItemText-root"
>
<span
class="MuiTypography-root MuiListItemText-primary MuiTypography-body1 MuiTypography-displayBlock"
>
Suppliers
</span>
</div>
<span
class="MuiTouchRipple-root"
/>
</a>
</li>
<span>
<li>
<a
@@ -339,52 +303,3 @@ exports[`SideMenu Authenticated 1`] = `
</div>
</div>
`;
exports[`SideMenu Unauthenticated 1`] = `
<div>
<div
data-testid="mocked-userprovider"
>
<ul
class="MuiList-root MuiList-padding"
>
<li>
<a
aria-disabled="false"
class="MuiButtonBase-root MuiListItem-root MuiListItem-gutters MuiListItem-button"
href="/home"
role="button"
tabindex="0"
>
<div
class="MuiListItemIcon-root"
>
<svg
aria-hidden="true"
class="MuiSvgIcon-root"
focusable="false"
viewBox="0 0 24 24"
>
<path
d="M10 20v-6h4v6h5v-8h3L12 3 2 12h3v8z"
/>
</svg>
</div>
<div
class="MuiListItemText-root"
>
<span
class="MuiTypography-root MuiListItemText-primary MuiTypography-body1 MuiTypography-displayBlock"
>
Home
</span>
</div>
<span
class="MuiTouchRipple-root"
/>
</a>
</li>
</ul>
</div>
</div>
`;

View File

@@ -9,7 +9,7 @@ import { ManifestsProvider } from "../../Contexts/ManifestsContext";
import { UserProvider, setToken } from "../../Contexts/UserContext";
import { StatusProvider } from "../../Contexts/StatusContext";
import ManifestDetails from ".";
import { TEST_AUTH_OBJECT_FISKER } from "../../../utils/testing";
import { TEST_AUTH_OBJECT } from "../../../utils/testing";
import addSnapshotSerializer from "../../../utils/snapshot";
const TestComponent = (opened) => (
@@ -26,7 +26,7 @@ const TestComponent = (opened) => (
describe("Manifest Details Component", () => {
beforeAll(() => {
setToken(TEST_AUTH_OBJECT_FISKER);
setToken(TEST_AUTH_OBJECT);
addSnapshotSerializer(expect);
});

View File

@@ -1,3 +1,5 @@
import React, { useEffect, useState } from "react";
import { Link } from "react-router-dom";
import {
Grid,
Table,
@@ -8,30 +10,28 @@ import {
TableRow,
Tooltip,
} from "@material-ui/core";
import DeleteIcon from "@material-ui/icons/Delete";
import SendIcon from "@material-ui/icons/Send";
import VisibilityIcon from "@material-ui/icons/Visibility";
import DeleteIcon from "@material-ui/icons/Delete";
import clsx from "clsx";
import React, { useEffect, useState } from "react";
import { Link } from "react-router-dom";
import EditIcon from "@material-ui/icons/Edit";
import { logger } from "../../../services/monitoring";
import { LocalDateTimeString } from "../../../utils/dates";
import { TYPE_MANIFEST_SOFTWARE } from "../../../utils/manifest_types";
import { hasRole, Permissions } from "../../../utils/roles";
import {
ManifestsProvider,
useManifestsContext,
ManifestsProvider,
} from "../../Contexts/ManifestsContext";
import { useStatusContext } from "../../Contexts/StatusContext";
import { useUserContext } from "../../Contexts/UserContext";
import ECUList from "../../Controls/ECUList";
import SearchField from "../../Controls/SearchField";
import DeleteConfirmation from "../../DeleteConfirmation";
import TableHeaderSortable from "../../Table/HeaderSortable";
import { useLocalStorage } from "../../useLocalStorage";
import { useStatusContext } from "../../Contexts/StatusContext";
import useStyles from "../../useStyles";
import { LocalDateTimeString } from "../../../utils/dates";
import TableHeaderSortable from "../../Table/HeaderSortable";
import SearchField from "../../Controls/SearchField";
import { logger } from "../../../services/monitoring";
import ECUList from "../../Controls/ECUList";
import { Roles, hasRole } from "../../../utils/roles";
import { useLocalStorage } from "../../useLocalStorage";
import { TYPE_MANIFEST_SOFTWARE } from "../../../utils/manifest_types";
import DeleteConfirmation from "../../DeleteConfirmation";
import EditIcon from "@material-ui/icons/Edit";
const tableColumns = [
{
@@ -71,7 +71,7 @@ const formatManifestType = (type) => {
default:
return "Standard";
}
};
}
const PAGE_SIZE = "MANIFEST_LIST_PAGE_SIZE";
@@ -95,7 +95,6 @@ const MainForm = () => {
idToken: { jwtToken: token },
},
groups,
providers,
} = useUserContext();
const sortHandler = (event, property) => {
@@ -156,7 +155,7 @@ const MainForm = () => {
setDeleteId(id);
setDeleteRowName(`${row.name} ${row.version}`);
setShowDeleteModal(true);
};
}
const onDelete = async (manifest_id) => {
try {
@@ -169,30 +168,29 @@ const MainForm = () => {
const Actions = (row) => {
let actions = [];
if (hasRole(groups, Permissions.FiskerMagnaRead, providers)) {
if (hasRole([Roles.CREATE, Roles.READ], groups)) {
actions.push({
tip: `Status "${row.name} ${row.version}"`,
link: `/package-status/${row.id}`,
icon: (
<VisibilityIcon aria-label={`Status ${row.name} ${row.version}`} />
),
});
}
if (hasRole(groups, Permissions.FiskerRead, providers)) {
actions.push({
}, {
tip: `Update "${row.name} ${row.version}"`,
link: `/package-update/${row.id}`,
icon: <EditIcon aria-label={`Update ${row.name} ${row.version}`} />,
icon: (
<EditIcon aria-label={`Update ${row.name} ${row.version}`} />
),
});
}
if (hasRole(groups, Permissions.FiskerMagnaCreate, providers)) {
if (hasRole([Roles.CREATE], groups)) {
actions.push({
tip: `Deploy "${row.name} ${row.version}"`,
link: `/package-deploy/${row.id}`,
icon: <SendIcon aria-label={`Deploy ${row.name} ${row.version}`} />,
});
}
if (hasRole(groups, Permissions.FiskerDelete, providers)) {
if (hasRole([Roles.DELETE], groups)) {
actions.push({
tip: `Delete "${row.name} ${row.version}"`,
id: row.id,
@@ -259,9 +257,7 @@ const MainForm = () => {
)}
</TableCell>
<TableCell align="center">{row.version}</TableCell>
<TableCell align="center">
{formatManifestType(row.type)}
</TableCell>
<TableCell align="center">{formatManifestType(row.type)}</TableCell>
<TableCell align="center">
{LocalDateTimeString(row.created)}
</TableCell>
@@ -294,8 +290,7 @@ const MainForm = () => {
message={deleteRowName}
open={showDeleteModal}
close={() => setShowDeleteModal(false)}
deleteFunction={() => onDelete(deleteId)}
/>
deleteFunction={() => onDelete(deleteId)} />
</div>
);
};

View File

@@ -1,3 +1,6 @@
import React, { useEffect, useState } from "react";
import { useParams } from "react-router";
import { Link } from "react-router-dom";
import {
LinearProgress,
Table,
@@ -11,27 +14,22 @@ import {
} from "@material-ui/core";
import CancelIcon from "@material-ui/icons/Cancel";
import clsx from "clsx";
import React, { useEffect, useState } from "react";
import { useParams } from "react-router";
import { Link } from "react-router-dom";
import { logger } from "../../../services/monitoring";
import { LocalDateTimeString } from "../../../utils/dates";
import { Permissions } from "../../../utils/roles";
import {
CarUpdatesProvider,
useCarUpdatesContext,
} from "../../Contexts/CarUpdatesContext";
import {
ManifestsProvider,
useManifestsContext,
} from "../../Contexts/ManifestsContext";
import { useStatusContext } from "../../Contexts/StatusContext";
import {
CarUpdatesProvider,
useCarUpdatesContext,
} from "../../Contexts/CarUpdatesContext";
import { useUserContext } from "../../Contexts/UserContext";
import { RoleWrap } from "../../Controls/RoleWrap";
import { useLocalStorage } from "../../useLocalStorage";
import { useStatusContext } from "../../Contexts/StatusContext";
import useStyles from "../../useStyles";
import { LocalDateTimeString } from "../../../utils/dates";
import { logger } from "../../../services/monitoring";
import ManifestDetails from "../Details";
import { useLocalStorage } from "../../useLocalStorage";
const PAGE_SIZE = "MANIFEST_STATUS_PAGE_SIZE";
@@ -54,8 +52,6 @@ const MainForm = () => {
token: {
idToken: { jwtToken: token },
},
groups,
providers,
} = useUserContext();
useEffect(() => {
@@ -176,18 +172,11 @@ const MainForm = () => {
{LocalDateTimeString(row.updated)}
</TableCell>
<TableCell>
<RoleWrap
groups={groups}
providers={providers}
rolesPerProvider={Permissions.FiskerCreate}
eitherComponent={<>No action</>}
>
<Tooltip key={row.vin} title={`Send cancel for ${row.vin}`}>
<Link to="#" onClick={() => sendCancel(row)}>
<CancelIcon />
</Link>
</Tooltip>
</RoleWrap>
<Tooltip key={row.vin} title={`Send cancel for ${row.vin}`}>
<Link to="#" onClick={() => sendCancel(row)}>
<CancelIcon />
</Link>
</Tooltip>
</TableCell>
</TableRow>
))}

View File

@@ -49,7 +49,9 @@ const MainForm = () => {
const onSubmit = async (e) => {
e.preventDefault();
try {
const result = await updateManifest(manifest_id, {name, type}, token);
const data = {name, type};
console.log(data);
const result = await updateManifest(manifest_id, data, token);
if (!result || result.error) return;
setMessage(`Updated manifest ${manifest_id}`);

View File

@@ -9,7 +9,7 @@ import { ManifestsProvider } from "../../Contexts/ManifestsContext";
import { UserProvider, setToken } from "../../Contexts/UserContext";
import { StatusProvider } from "../../Contexts/StatusContext";
import ManifestUpdate from ".";
import { TEST_AUTH_OBJECT_FISKER } from "../../../utils/testing";
import { TEST_AUTH_OBJECT } from "../../../utils/testing";
import addSnapshotSerializer from "../../../utils/snapshot";
const renderManifestUpdate = async () => {
@@ -33,12 +33,12 @@ const renderManifestUpdate = async () => {
describe("Manifest Details Component", () => {
beforeAll(() => {
setToken(TEST_AUTH_OBJECT_FISKER);
setToken(TEST_AUTH_OBJECT);
addSnapshotSerializer(expect);
});
it("Render", async () => {
setToken(TEST_AUTH_OBJECT_FISKER);
setToken(TEST_AUTH_OBJECT);
const view = await renderManifestUpdate();
expect(view).toMatchSnapshot();
});

View File

@@ -8,7 +8,7 @@ export const TYPES = {
PROTECTED: 2,
};
export const AuthRoute = ({ token, type, groups, rolesPerGroup, providers, ...others }) => {
export const AuthRoute = ({ token, type, roles, groups, ...others }) => {
if (type === TYPES.PROTECTED && !token) {
return <Redirect to="/" />;
} else if (type === TYPES.GUEST && token) {
@@ -16,9 +16,8 @@ export const AuthRoute = ({ token, type, groups, rolesPerGroup, providers, ...ot
} else if (
type === TYPES.PROTECTED &&
token &&
rolesPerGroup &&
providers &&
!hasRole(groups, rolesPerGroup, providers)
roles &&
!hasRole(roles, groups)
) {
return <Redirect to="/home" />;
}

View File

@@ -1,10 +1,10 @@
import React, { Suspense } from "react";
import { Switch } from "react-router-dom";
import { Permissions } from "../../utils/roles";
import { useUserContext } from "../Contexts/UserContext";
import { MessageBar } from "../MessageBar";
import { AuthRoute, TYPES } from "../Routes/AuthRoute";
import { MessageBar } from "../MessageBar";
import { useUserContext } from "../Contexts/UserContext";
import { Roles } from "../../utils/roles";
const CANFilterCreate = React.lazy(() => import("../CANFilter/Add"));
const CANFilterUpdate = React.lazy(() => import("../CANFilter/Update"));
@@ -39,7 +39,7 @@ const SuppliersList = React.lazy(() => import("../Suppliers/List"));
const SupplierDetails = React.lazy(() => import("../Suppliers/Details"));
const Datascope = React.lazy(() => import("../Dashboard"));
const SiteRoutes = () => {
const { token, groups, providers } = useUserContext();
const { token, groups } = useUserContext();
return (
<Suspense fallback={"Loading..."}>
<MessageBar />
@@ -57,8 +57,7 @@ const SiteRoutes = () => {
type={TYPES.PROTECTED}
token={token}
groups={groups}
rolesPerGroup={Permissions.FiskerCreate}
providers={providers}
roles={[Roles.CREATE]}
/>
<AuthRoute
path="/filter-update"
@@ -66,8 +65,7 @@ const SiteRoutes = () => {
type={TYPES.PROTECTED}
token={token}
groups={groups}
rolesPerGroup={Permissions.FiskerCreate}
providers={providers}
roles={[Roles.CREATE]}
/>
<AuthRoute
path="/fleets"
@@ -75,8 +73,7 @@ const SiteRoutes = () => {
type={TYPES.PROTECTED}
token={token}
groups={groups}
rolesPerGroup={Permissions.FiskerRead}
providers={providers}
roles={[Roles.READ, Roles.CREATE]}
/>
<AuthRoute
path="/fleet/:name/vehicle-add"
@@ -84,8 +81,7 @@ const SiteRoutes = () => {
type={TYPES.PROTECTED}
token={token}
groups={groups}
rolesPerGroup={Permissions.FiskerRead}
providers={providers}
roles={[Roles.READ, Roles.CREATE]}
/>
<AuthRoute
path="/fleet/:name/filter-add"
@@ -93,8 +89,7 @@ const SiteRoutes = () => {
type={TYPES.PROTECTED}
token={token}
groups={groups}
rolesPerGroup={Permissions.FiskerRead}
providers={providers}
roles={[Roles.READ, Roles.CREATE]}
/>
<AuthRoute
path="/fleet/:name/filter-update"
@@ -102,8 +97,7 @@ const SiteRoutes = () => {
type={TYPES.PROTECTED}
token={token}
groups={groups}
rolesPerGroup={Permissions.FiskerRead}
providers={providers}
roles={[Roles.READ, Roles.CREATE]}
/>
<AuthRoute
path="/fleet/:name"
@@ -111,8 +105,7 @@ const SiteRoutes = () => {
type={TYPES.PROTECTED}
token={token}
groups={groups}
rolesPerGroup={Permissions.FiskerRead}
providers={providers}
roles={[Roles.READ, Roles.CREATE]}
/>
<AuthRoute
path="/fleet-add"
@@ -120,8 +113,7 @@ const SiteRoutes = () => {
type={TYPES.PROTECTED}
token={token}
groups={groups}
rolesPerGroup={Permissions.FiskerRead}
providers={providers}
roles={[Roles.CREATE]}
/>
<AuthRoute
path="/fleet-update"
@@ -129,8 +121,7 @@ const SiteRoutes = () => {
type={TYPES.PROTECTED}
token={token}
groups={groups}
rolesPerGroup={Permissions.FiskerCreate}
providers={providers}
roles={[Roles.CREATE]}
/>
<AuthRoute
path="/home"
@@ -144,8 +135,7 @@ const SiteRoutes = () => {
type={TYPES.PROTECTED}
token={token}
groups={groups}
rolesPerGroup={Permissions.FiskerMagnaRead}
providers={providers}
roles={[Roles.READ, Roles.CREATE]}
/>
<AuthRoute
path="/package-deploy/:manifest_id"
@@ -153,8 +143,7 @@ const SiteRoutes = () => {
type={TYPES.PROTECTED}
token={token}
groups={groups}
rolesPerGroup={Permissions.FiskerMagnaRead}
providers={providers}
roles={[Roles.CREATE]}
/>
<AuthRoute
path="/package-status/:manifest_id"
@@ -162,8 +151,7 @@ const SiteRoutes = () => {
type={TYPES.PROTECTED}
token={token}
groups={groups}
rolesPerGroup={Permissions.FiskerMagnaRead}
providers={providers}
roles={[Roles.READ, Roles.CREATE]}
/>
<AuthRoute
path="/package-update/:manifest_id"
@@ -171,8 +159,7 @@ const SiteRoutes = () => {
type={TYPES.PROTECTED}
token={token}
groups={groups}
rolesPerGroup={Permissions.FiskerRead}
providers={providers}
roles={[Roles.READ, Roles.CREATE]}
/>
<AuthRoute
path="/vehicles"
@@ -180,8 +167,7 @@ const SiteRoutes = () => {
type={TYPES.PROTECTED}
token={token}
groups={groups}
rolesPerGroup={Permissions.FiskerMagnaRead}
providers={providers}
roles={[Roles.READ, Roles.CREATE]}
/>
<AuthRoute
path="/vehicle-add"
@@ -189,8 +175,7 @@ const SiteRoutes = () => {
type={TYPES.PROTECTED}
token={token}
groups={groups}
rolesPerGroup={Permissions.FiskerCreate}
providers={providers}
roles={[Roles.CREATE]}
/>
<AuthRoute
path="/vehicle-status/:vin/:carupdateid"
@@ -198,8 +183,7 @@ const SiteRoutes = () => {
type={TYPES.PROTECTED}
token={token}
groups={groups}
rolesPerGroup={Permissions.FiskerMagnaRead}
providers={providers}
roles={[Roles.READ, Roles.CREATE]}
/>
<AuthRoute
path="/vehicle-status/:vin"
@@ -207,8 +191,7 @@ const SiteRoutes = () => {
type={TYPES.PROTECTED}
token={token}
groups={groups}
rolesPerGroup={Permissions.FiskerMagnaRead}
providers={providers}
roles={[Roles.READ, Roles.CREATE]}
/>
<AuthRoute
path="/vehicle-update"
@@ -216,8 +199,7 @@ const SiteRoutes = () => {
type={TYPES.PROTECTED}
token={token}
groups={groups}
rolesPerGroup={Permissions.FiskerCreate}
providers={providers}
roles={[Roles.CREATE]}
/>
<AuthRoute
path="/tools/certificates/add"
@@ -225,8 +207,7 @@ const SiteRoutes = () => {
type={TYPES.PROTECTED}
token={token}
groups={groups}
rolesPerGroup={Permissions.FiskerCertificate}
providers={providers}
roles={[Roles.CERTIFICATES]}
/>
<AuthRoute
path="/tools/sms/send"
@@ -234,8 +215,7 @@ const SiteRoutes = () => {
type={TYPES.PROTECTED}
token={token}
groups={groups}
rolesPerGroup={Permissions.FiskerCreate}
providers={providers}
roles={[Roles.CREATE]}
/>
<AuthRoute
path="/suppliers"
@@ -243,8 +223,7 @@ const SiteRoutes = () => {
type={TYPES.PROTECTED}
token={token}
groups={groups}
rolesPerGroup={Permissions.FiskerSupplierAdmin}
providers={providers}
roles={[Roles.APPROVESUPPLIERS]}
/>
<AuthRoute
path="/supplier/:email"
@@ -252,8 +231,7 @@ const SiteRoutes = () => {
type={TYPES.PROTECTED}
token={token}
groups={groups}
rolesPerGroup={Permissions.FiskerSupplierAdmin}
providers={providers}
roles={[Roles.APPROVESUPPLIERS]}
/>
<AuthRoute
path="/datascope"
@@ -261,8 +239,7 @@ const SiteRoutes = () => {
type={TYPES.PROTECTED}
token={token}
groups={groups}
rolesPerGroup={Permissions.FiskerRead}
providers={providers}
roles={[Roles.READ, Roles.CREATE]}
/>
<PageNotFound />
</Switch>

View File

@@ -15,7 +15,7 @@ import { BrowserRouter } from "react-router-dom";
import { SupplierProvider } from "../../Contexts/SupplierContext";
import { StatusProvider } from "../../Contexts/StatusContext";
import { UserProvider, setToken } from "../../Contexts/UserContext";
import { TEST_AUTH_OBJECT_FISKER } from "../../../utils/testing";
import { TEST_AUTH_OBJECT } from "../../../utils/testing";
import MainForm from "./index";
import addSnapshotSerializer from "../../../utils/snapshot";
@@ -43,7 +43,7 @@ describe("Supplier page", () => {
});
it("Render", async () => {
setToken(TEST_AUTH_OBJECT_FISKER);
setToken(TEST_AUTH_OBJECT);
const container = await renderSupplierDetailsPage();
expect(container).toMatchSnapshot();
});

View File

@@ -10,7 +10,7 @@ import { BrowserRouter } from "react-router-dom";
import { SupplierProvider } from "../../Contexts/SupplierContext";
import { StatusProvider } from "../../Contexts/StatusContext";
import { UserProvider, setToken } from "../../Contexts/UserContext";
import { TEST_AUTH_OBJECT_FISKER } from "../../../utils/testing";
import { TEST_AUTH_OBJECT } from "../../../utils/testing";
import MainForm from "./index";
import addSnapshotSerializer from "../../../utils/snapshot";
@@ -38,7 +38,7 @@ describe("Suppliers page", () => {
});
it("Render", async () => {
setToken(TEST_AUTH_OBJECT_FISKER);
setToken(TEST_AUTH_OBJECT);
const container = await renderSuppliersPage();
expect(container).toMatchSnapshot();
});