CEC-4576: update permission for updateDeploy action (#370)
* CEC-4576: use new UpdateDeploy permission * update manifest deploy permission
This commit is contained in:
@@ -15,6 +15,7 @@ REACT_APP_ROLE_GENERATE_CERTIFICATE=9af2d8c0-c26d-4d6d-bbd1-ac53cbd37ebc
|
|||||||
REACT_APP_ROLE_MANUFACTURE=3412e11a-a2d1-4355-be3e-ef9aa5065b69
|
REACT_APP_ROLE_MANUFACTURE=3412e11a-a2d1-4355-be3e-ef9aa5065b69
|
||||||
REACT_APP_ROLE_SUPPLIER_APPROVER=a6c9805e-80b2-42b2-bfbb-9df52e5504d8
|
REACT_APP_ROLE_SUPPLIER_APPROVER=a6c9805e-80b2-42b2-bfbb-9df52e5504d8
|
||||||
REACT_APP_ROLE_MANIFEST_MIGRATION=42798c8a-9fa7-4fb4-82c0-9582cabe364f
|
REACT_APP_ROLE_MANIFEST_MIGRATION=42798c8a-9fa7-4fb4-82c0-9582cabe364f
|
||||||
|
REACT_APP_ROLE_UPDATE_DEPLOY=e4af2c4c-6c5e-4784-9097-7c18e776d7b6
|
||||||
REACT_APP_ECCKEY_ENV=
|
REACT_APP_ECCKEY_ENV=
|
||||||
REACT_APP_HOME_MAP_DEFAULT_LOCATION={"lat":49.8327,"lng":9.8816,"zoom":4.5}
|
REACT_APP_HOME_MAP_DEFAULT_LOCATION={"lat":49.8327,"lng":9.8816,"zoom":4.5}
|
||||||
REACT_APP_ENABLE_DEBUGMASK=1
|
REACT_APP_ENABLE_DEBUGMASK=1
|
||||||
@@ -15,6 +15,7 @@ REACT_APP_ROLE_GENERATE_CERTIFICATE=9af2d8c0-c26d-4d6d-bbd1-ac53cbd37ebc
|
|||||||
REACT_APP_ROLE_MANUFACTURE=3412e11a-a2d1-4355-be3e-ef9aa5065b69
|
REACT_APP_ROLE_MANUFACTURE=3412e11a-a2d1-4355-be3e-ef9aa5065b69
|
||||||
REACT_APP_ROLE_SUPPLIER_APPROVER=a6c9805e-80b2-42b2-bfbb-9df52e5504d8
|
REACT_APP_ROLE_SUPPLIER_APPROVER=a6c9805e-80b2-42b2-bfbb-9df52e5504d8
|
||||||
REACT_APP_ROLE_MANIFEST_MIGRATION=42798c8a-9fa7-4fb4-82c0-9582cabe364f
|
REACT_APP_ROLE_MANIFEST_MIGRATION=42798c8a-9fa7-4fb4-82c0-9582cabe364f
|
||||||
|
REACT_APP_ROLE_UPDATE_DEPLOY=e4af2c4c-6c5e-4784-9097-7c18e776d7b6
|
||||||
REACT_APP_ECCKEY_ENV=
|
REACT_APP_ECCKEY_ENV=
|
||||||
REACT_APP_HOME_MAP_DEFAULT_LOCATION={"lat":37.0902,"lng":-95.7129,"zoom":4.5}
|
REACT_APP_HOME_MAP_DEFAULT_LOCATION={"lat":37.0902,"lng":-95.7129,"zoom":4.5}
|
||||||
REACT_APP_ENABLE_DEBUGMASK=1
|
REACT_APP_ENABLE_DEBUGMASK=1
|
||||||
1
.env.dev
1
.env.dev
@@ -15,6 +15,7 @@ REACT_APP_ROLE_GENERATE_CERTIFICATE=746f34b0-9ba0-4b5d-8d84-0256a9c8e390
|
|||||||
REACT_APP_ROLE_MANUFACTURE=3412e11a-a2d1-4355-be3e-ef9aa5065b69
|
REACT_APP_ROLE_MANUFACTURE=3412e11a-a2d1-4355-be3e-ef9aa5065b69
|
||||||
REACT_APP_ROLE_SUPPLIER_APPROVER=a6c9805e-80b2-42b2-bfbb-9df52e5504d8
|
REACT_APP_ROLE_SUPPLIER_APPROVER=a6c9805e-80b2-42b2-bfbb-9df52e5504d8
|
||||||
REACT_APP_ROLE_MANIFEST_MIGRATION=42798c8a-9fa7-4fb4-82c0-9582cabe364f
|
REACT_APP_ROLE_MANIFEST_MIGRATION=42798c8a-9fa7-4fb4-82c0-9582cabe364f
|
||||||
|
REACT_APP_ROLE_UPDATE_DEPLOY=3590ec3f-1c05-428b-81a4-40b00baf83de
|
||||||
REACT_APP_ECCKEY_ENV=stage,prod
|
REACT_APP_ECCKEY_ENV=stage,prod
|
||||||
REACT_APP_HOME_MAP_DEFAULT_LOCATION={"lat":37.0902,"lng":-95.7129,"zoom":4.5}
|
REACT_APP_HOME_MAP_DEFAULT_LOCATION={"lat":37.0902,"lng":-95.7129,"zoom":4.5}
|
||||||
REACT_APP_ENABLE_DEBUGMASK=1
|
REACT_APP_ENABLE_DEBUGMASK=1
|
||||||
@@ -15,6 +15,7 @@ REACT_APP_ROLE_GENERATE_CERTIFICATE=746f34b0-9ba0-4b5d-8d84-0256a9c8e390
|
|||||||
REACT_APP_ROLE_MANUFACTURE=3412e11a-a2d1-4355-be3e-ef9aa5065b69
|
REACT_APP_ROLE_MANUFACTURE=3412e11a-a2d1-4355-be3e-ef9aa5065b69
|
||||||
REACT_APP_ROLE_SUPPLIER_APPROVER=a6c9805e-80b2-42b2-bfbb-9df52e5504d8
|
REACT_APP_ROLE_SUPPLIER_APPROVER=a6c9805e-80b2-42b2-bfbb-9df52e5504d8
|
||||||
REACT_APP_ROLE_MANIFEST_MIGRATION=42798c8a-9fa7-4fb4-82c0-9582cabe364f
|
REACT_APP_ROLE_MANIFEST_MIGRATION=42798c8a-9fa7-4fb4-82c0-9582cabe364f
|
||||||
|
REACT_APP_ROLE_UPDATE_DEPLOY=3590ec3f-1c05-428b-81a4-40b00baf83de
|
||||||
REACT_APP_ECCKEY_ENV=dev,stage,prod
|
REACT_APP_ECCKEY_ENV=dev,stage,prod
|
||||||
REACT_APP_HOME_MAP_DEFAULT_LOCATION={"lat":37.0902,"lng":-95.7129,"zoom":4.5}
|
REACT_APP_HOME_MAP_DEFAULT_LOCATION={"lat":37.0902,"lng":-95.7129,"zoom":4.5}
|
||||||
REACT_APP_ENABLE_DEBUGMASK=1
|
REACT_APP_ENABLE_DEBUGMASK=1
|
||||||
1
.env.prd
1
.env.prd
@@ -15,6 +15,7 @@ REACT_APP_ROLE_GENERATE_CERTIFICATE=746f34b0-9ba0-4b5d-8d84-0256a9c8e390
|
|||||||
REACT_APP_ROLE_MANUFACTURE=3412e11a-a2d1-4355-be3e-ef9aa5065b69
|
REACT_APP_ROLE_MANUFACTURE=3412e11a-a2d1-4355-be3e-ef9aa5065b69
|
||||||
REACT_APP_ROLE_SUPPLIER_APPROVER=a6c9805e-80b2-42b2-bfbb-9df52e5504d8
|
REACT_APP_ROLE_SUPPLIER_APPROVER=a6c9805e-80b2-42b2-bfbb-9df52e5504d8
|
||||||
REACT_APP_ROLE_MANIFEST_MIGRATION=42798c8a-9fa7-4fb4-82c0-9582cabe364f
|
REACT_APP_ROLE_MANIFEST_MIGRATION=42798c8a-9fa7-4fb4-82c0-9582cabe364f
|
||||||
|
REACT_APP_ROLE_UPDATE_DEPLOY=e4af2c4c-6c5e-4784-9097-7c18e776d7b6
|
||||||
REACT_APP_ECCKEY_ENV=stage
|
REACT_APP_ECCKEY_ENV=stage
|
||||||
REACT_APP_HOME_MAP_DEFAULT_LOCATION={"lat":37.0902,"lng":-95.7129,"zoom":4.5}
|
REACT_APP_HOME_MAP_DEFAULT_LOCATION={"lat":37.0902,"lng":-95.7129,"zoom":4.5}
|
||||||
REACT_APP_ENABLE_DEBUGMASK=1
|
REACT_APP_ENABLE_DEBUGMASK=1
|
||||||
1
.env.stg
1
.env.stg
@@ -15,6 +15,7 @@ REACT_APP_ROLE_GENERATE_CERTIFICATE=746f34b0-9ba0-4b5d-8d84-0256a9c8e390
|
|||||||
REACT_APP_ROLE_MANUFACTURE=3412e11a-a2d1-4355-be3e-ef9aa5065b69
|
REACT_APP_ROLE_MANUFACTURE=3412e11a-a2d1-4355-be3e-ef9aa5065b69
|
||||||
REACT_APP_ROLE_SUPPLIER_APPROVER=a6c9805e-80b2-42b2-bfbb-9df52e5504d8
|
REACT_APP_ROLE_SUPPLIER_APPROVER=a6c9805e-80b2-42b2-bfbb-9df52e5504d8
|
||||||
REACT_APP_ROLE_MANIFEST_MIGRATION=42798c8a-9fa7-4fb4-82c0-9582cabe364f
|
REACT_APP_ROLE_MANIFEST_MIGRATION=42798c8a-9fa7-4fb4-82c0-9582cabe364f
|
||||||
|
REACT_APP_ROLE_UPDATE_DEPLOY=3590ec3f-1c05-428b-81a4-40b00baf83de
|
||||||
REACT_APP_ECCKEY_ENV=prod
|
REACT_APP_ECCKEY_ENV=prod
|
||||||
REACT_APP_HOME_MAP_DEFAULT_LOCATION={"lat":37.0902,"lng":-95.7129,"zoom":4.5}
|
REACT_APP_HOME_MAP_DEFAULT_LOCATION={"lat":37.0902,"lng":-95.7129,"zoom":4.5}
|
||||||
REACT_APP_ENABLE_DEBUGMASK=1
|
REACT_APP_ENABLE_DEBUGMASK=1
|
||||||
@@ -15,5 +15,6 @@ REACT_APP_ROLE_GENERATE_CERTIFICATE=746f34b0-9ba0-4b5d-8d84-0256a9c8e390
|
|||||||
REACT_APP_ROLE_MANUFACTURE=3412e11a-a2d1-4355-be3e-ef9aa5065b69
|
REACT_APP_ROLE_MANUFACTURE=3412e11a-a2d1-4355-be3e-ef9aa5065b69
|
||||||
REACT_APP_ROLE_SUPPLIER_APPROVER=a6c9805e-80b2-42b2-bfbb-9df52e5504d8
|
REACT_APP_ROLE_SUPPLIER_APPROVER=a6c9805e-80b2-42b2-bfbb-9df52e5504d8
|
||||||
REACT_APP_ROLE_MANIFEST_MIGRATION=42798c8a-9fa7-4fb4-82c0-9582cabe364f
|
REACT_APP_ROLE_MANIFEST_MIGRATION=42798c8a-9fa7-4fb4-82c0-9582cabe364f
|
||||||
|
REACT_APP_ROLE_UPDATE_DEPLOY=3590ec3f-1c05-428b-81a4-40b00baf83de
|
||||||
REACT_APP_ECCKEY_ENV=dev,stage,prod
|
REACT_APP_ECCKEY_ENV=dev,stage,prod
|
||||||
REACT_APP_HOME_MAP_DEFAULT_LOCATION={"lat":37.0902,"lng":-95.7129,"zoom":4.5}
|
REACT_APP_HOME_MAP_DEFAULT_LOCATION={"lat":37.0902,"lng":-95.7129,"zoom":4.5}
|
||||||
|
|||||||
@@ -6651,24 +6651,6 @@ exports[`App Route /packages authenticated 1`] = `
|
|||||||
/>
|
/>
|
||||||
</svg>
|
</svg>
|
||||||
</a>
|
</a>
|
||||||
<a
|
|
||||||
class=""
|
|
||||||
href="/package-deploy/1"
|
|
||||||
style="margin: 5px;"
|
|
||||||
title="Deploy \\"Test Manifest 1.0\\""
|
|
||||||
>
|
|
||||||
<svg
|
|
||||||
aria-hidden="true"
|
|
||||||
aria-label="Deploy Test Manifest 1.0"
|
|
||||||
class="MuiSvgIcon-root"
|
|
||||||
focusable="false"
|
|
||||||
viewBox="0 0 24 24"
|
|
||||||
>
|
|
||||||
<path
|
|
||||||
d="M2.01 21L23 12 2.01 3 2 10l15 2-15 2z"
|
|
||||||
/>
|
|
||||||
</svg>
|
|
||||||
</a>
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
@@ -11561,63 +11543,7 @@ exports[`App Route /vehicle-status authenticated 1`] = `
|
|||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
class="MuiGrid-root makeStyles-textCenterAlign-0 MuiGrid-item MuiGrid-grid-md-12"
|
class="MuiGrid-root makeStyles-textCenterAlign-0 MuiGrid-item MuiGrid-grid-md-12"
|
||||||
>
|
/>
|
||||||
<label
|
|
||||||
class="MuiFormControlLabel-root"
|
|
||||||
>
|
|
||||||
<span
|
|
||||||
aria-disabled="false"
|
|
||||||
class="MuiButtonBase-root MuiIconButton-root PrivateSwitchBase-root-0 MuiCheckbox-root MuiCheckbox-colorSecondary MuiIconButton-colorSecondary"
|
|
||||||
>
|
|
||||||
<span
|
|
||||||
class="MuiIconButton-label"
|
|
||||||
>
|
|
||||||
<input
|
|
||||||
class="PrivateSwitchBase-input-0"
|
|
||||||
data-indeterminate="false"
|
|
||||||
type="checkbox"
|
|
||||||
value=""
|
|
||||||
/>
|
|
||||||
<svg
|
|
||||||
aria-hidden="true"
|
|
||||||
class="MuiSvgIcon-root"
|
|
||||||
focusable="false"
|
|
||||||
viewBox="0 0 24 24"
|
|
||||||
>
|
|
||||||
<path
|
|
||||||
d="M19 5v14H5V5h14m0-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z"
|
|
||||||
/>
|
|
||||||
</svg>
|
|
||||||
</span>
|
|
||||||
<span
|
|
||||||
class="MuiTouchRipple-root"
|
|
||||||
/>
|
|
||||||
</span>
|
|
||||||
<span
|
|
||||||
class="MuiTypography-root MuiFormControlLabel-label MuiTypography-body1"
|
|
||||||
>
|
|
||||||
Force Config Update
|
|
||||||
</span>
|
|
||||||
</label>
|
|
||||||
<a
|
|
||||||
class=""
|
|
||||||
href="/vehicle-status/FISKER123"
|
|
||||||
title="Push Config Update to \\"FISKER123\\""
|
|
||||||
>
|
|
||||||
<svg
|
|
||||||
aria-hidden="true"
|
|
||||||
aria-label="Push Config Update to \\"FISKER123\\""
|
|
||||||
class="MuiSvgIcon-root MuiSvgIcon-fontSizeLarge css-tzssek-MuiSvgIcon-root"
|
|
||||||
data-testid="UploadIcon"
|
|
||||||
focusable="false"
|
|
||||||
viewBox="0 0 24 24"
|
|
||||||
>
|
|
||||||
<path
|
|
||||||
d="M5 20h14v-2H5v2zm0-10h4v6h6v-6h4l-7-7-7 7z"
|
|
||||||
/>
|
|
||||||
</svg>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div
|
<div
|
||||||
class="MuiGrid-root makeStyles-textCenterAlign-0 MuiGrid-item MuiGrid-grid-md-12"
|
class="MuiGrid-root makeStyles-textCenterAlign-0 MuiGrid-item MuiGrid-grid-md-12"
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -160,63 +160,7 @@ exports[`VehicleDetailsTab Render 1`] = `
|
|||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
class="MuiGrid-root makeStyles-textCenterAlign-0 MuiGrid-item MuiGrid-grid-md-12"
|
class="MuiGrid-root makeStyles-textCenterAlign-0 MuiGrid-item MuiGrid-grid-md-12"
|
||||||
>
|
/>
|
||||||
<label
|
|
||||||
class="MuiFormControlLabel-root"
|
|
||||||
>
|
|
||||||
<span
|
|
||||||
aria-disabled="false"
|
|
||||||
class="MuiButtonBase-root MuiIconButton-root PrivateSwitchBase-root-0 MuiCheckbox-root MuiCheckbox-colorSecondary MuiIconButton-colorSecondary"
|
|
||||||
>
|
|
||||||
<span
|
|
||||||
class="MuiIconButton-label"
|
|
||||||
>
|
|
||||||
<input
|
|
||||||
class="PrivateSwitchBase-input-0"
|
|
||||||
data-indeterminate="false"
|
|
||||||
type="checkbox"
|
|
||||||
value=""
|
|
||||||
/>
|
|
||||||
<svg
|
|
||||||
aria-hidden="true"
|
|
||||||
class="MuiSvgIcon-root"
|
|
||||||
focusable="false"
|
|
||||||
viewBox="0 0 24 24"
|
|
||||||
>
|
|
||||||
<path
|
|
||||||
d="M19 5v14H5V5h14m0-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z"
|
|
||||||
/>
|
|
||||||
</svg>
|
|
||||||
</span>
|
|
||||||
<span
|
|
||||||
class="MuiTouchRipple-root"
|
|
||||||
/>
|
|
||||||
</span>
|
|
||||||
<span
|
|
||||||
class="MuiTypography-root MuiFormControlLabel-label MuiTypography-body1"
|
|
||||||
>
|
|
||||||
Force Config Update
|
|
||||||
</span>
|
|
||||||
</label>
|
|
||||||
<a
|
|
||||||
class=""
|
|
||||||
href="/"
|
|
||||||
title="Push Config Update to \\"TESTVIN1234567890\\""
|
|
||||||
>
|
|
||||||
<svg
|
|
||||||
aria-hidden="true"
|
|
||||||
aria-label="Push Config Update to \\"TESTVIN1234567890\\""
|
|
||||||
class="MuiSvgIcon-root MuiSvgIcon-fontSizeLarge css-tzssek-MuiSvgIcon-root"
|
|
||||||
data-testid="UploadIcon"
|
|
||||||
focusable="false"
|
|
||||||
viewBox="0 0 24 24"
|
|
||||||
>
|
|
||||||
<path
|
|
||||||
d="M5 20h14v-2H5v2zm0-10h4v6h6v-6h4l-7-7-7 7z"
|
|
||||||
/>
|
|
||||||
</svg>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div
|
<div
|
||||||
class="MuiGrid-root makeStyles-textCenterAlign-0 MuiGrid-item MuiGrid-grid-md-12"
|
class="MuiGrid-root makeStyles-textCenterAlign-0 MuiGrid-item MuiGrid-grid-md-12"
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -115,38 +115,38 @@ const MainForm = ({ vin }) => {
|
|||||||
<b>Info Source</b>: {vehicle.info_source}
|
<b>Info Source</b>: {vehicle.info_source}
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
<b>Tags</b>: {vehicle.tags ? vehicle.tags.join(", ") : "none" }
|
<b>Tags</b>: {vehicle.tags ? vehicle.tags.join(", ") : "none"}
|
||||||
</p>
|
</p>
|
||||||
</Grid>
|
</Grid>
|
||||||
<Grid item md={12} className={classes.textCenterAlign}>
|
<Grid item md={12} className={classes.textCenterAlign}>
|
||||||
{vehicle.log_level != null && (
|
{vehicle.log_level != null && (
|
||||||
<p>
|
<p>
|
||||||
<b>Log Level</b>: {vehicle.log_level}
|
<b>Log Level</b>: {vehicle.log_level}
|
||||||
</p>
|
</p>
|
||||||
)}
|
)}
|
||||||
{vehicle.canbus && (
|
{vehicle.canbus && (
|
||||||
<>
|
<>
|
||||||
<p>
|
<p>
|
||||||
<b>CANBus Enabled</b>: {vehicle.canbus.enabled.toString()}
|
<b>CANBus Enabled</b>: {vehicle.canbus.enabled.toString()}
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
<b>Max Memory Buffer Size</b>: {vehicle.canbus.max_mem_buffer_size ?? "Default"}
|
<b>Max Memory Buffer Size</b>: {vehicle.canbus.max_mem_buffer_size ?? "Default"}
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
<b>Data Logger Enabled</b>: {vehicle.canbus.data_logger_enabled.toString()}
|
<b>Data Logger Enabled</b>: {vehicle.canbus.data_logger_enabled.toString()}
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
<b>Max Disk Buffer Size</b>: {vehicle.canbus.max_disk_buffer_size ?? "Default"}
|
<b>Max Disk Buffer Size</b>: {vehicle.canbus.max_disk_buffer_size ?? "Default"}
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
<b>Filters</b>: {vehicle.canbus.filters ? vehicle.canbus.filters.length : 0}
|
<b>Filters</b>: {vehicle.canbus.filters ? vehicle.canbus.filters.length : 0}
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
<b>DTC Enabled</b>: { (vehicle.canbus.dtc_enabled || false).toString() }
|
<b>DTC Enabled</b>: {(vehicle.canbus.dtc_enabled || false).toString()}
|
||||||
</p>
|
</p>
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
</Grid>
|
</Grid>
|
||||||
{showDebugMask && (
|
{showDebugMask && (
|
||||||
<Grid item md={12} className={classes.textCenterAlign}>
|
<Grid item md={12} className={classes.textCenterAlign}>
|
||||||
<p>
|
<p>
|
||||||
@@ -156,19 +156,19 @@ const MainForm = ({ vin }) => {
|
|||||||
)}
|
)}
|
||||||
<Grid item md={12} className={classes.textCenterAlign}>
|
<Grid item md={12} className={classes.textCenterAlign}>
|
||||||
<RoleWrap
|
<RoleWrap
|
||||||
groups={groups}
|
groups={groups}
|
||||||
providers={providers}
|
providers={providers}
|
||||||
rolesPerProvider={Permissions.FiskerCreate}
|
rolesPerProvider={Permissions.FiskerUpdateDeploy}
|
||||||
>
|
>
|
||||||
<FormControlLabel
|
<FormControlLabel
|
||||||
label="Force Config Update"
|
label="Force Config Update"
|
||||||
control={
|
control={
|
||||||
<Checkbox
|
<Checkbox
|
||||||
checked={forced}
|
checked={forced}
|
||||||
onChange={onForcedChange}
|
onChange={onForcedChange}
|
||||||
/>
|
|
||||||
}
|
|
||||||
/>
|
/>
|
||||||
|
}
|
||||||
|
/>
|
||||||
<Tooltip key={`push-config-${vin}`} title={`Push Config Update to "${vin}"`}>
|
<Tooltip key={`push-config-${vin}`} title={`Push Config Update to "${vin}"`}>
|
||||||
<Link to="#" onClick={() => setShowUploadConfigModal(true)} >
|
<Link to="#" onClick={() => setShowUploadConfigModal(true)} >
|
||||||
<UploadIcon aria-label={`Push Config Update to "${vin}"`} fontSize="large" />
|
<UploadIcon aria-label={`Push Config Update to "${vin}"`} fontSize="large" />
|
||||||
|
|||||||
@@ -2,24 +2,25 @@ jest.mock("../../../Contexts/VehicleContext");
|
|||||||
jest.mock("../../../Contexts/StatusContext");
|
jest.mock("../../../Contexts/StatusContext");
|
||||||
jest.mock("../../../Contexts/UserContext");
|
jest.mock("../../../Contexts/UserContext");
|
||||||
|
|
||||||
import { render, waitFor } from "@testing-library/react";
|
import { render, screen, waitFor } from "@testing-library/react";
|
||||||
import { BrowserRouter } from "react-router-dom";
|
import { BrowserRouter } from "react-router-dom";
|
||||||
import routeData from "react-router";
|
import routeData from "react-router";
|
||||||
|
|
||||||
import { VehicleProvider } from "../../../Contexts/VehicleContext";
|
import { VehicleProvider } from "../../../Contexts/VehicleContext";
|
||||||
import { StatusProvider } from "../../../Contexts/StatusContext";
|
import { StatusProvider } from "../../../Contexts/StatusContext";
|
||||||
import { UserProvider, setToken } from "../../../Contexts/UserContext";
|
import { UserProvider, setToken } from "../../../Contexts/UserContext";
|
||||||
import { TEST_AUTH_OBJECT_FISKER }from "../../../../utils/testing";
|
import { TEST_AUTH_OBJECT_FISKER } from "../../../../utils/testing";
|
||||||
import MainForm from "./index";
|
import MainForm from "./index";
|
||||||
import addSnapshotSerializer from "../../../../utils/snapshot";
|
import addSnapshotSerializer from "../../../../utils/snapshot";
|
||||||
|
import * as Roles from "../../../../utils/roles";
|
||||||
|
|
||||||
const renderVehicleDetailsTab = async () => {
|
const renderVehicleDetailsTab = async () => {
|
||||||
const { container } = render(
|
const { container } = render(
|
||||||
<VehicleProvider>
|
<VehicleProvider>
|
||||||
<StatusProvider>
|
<StatusProvider>
|
||||||
<UserProvider>
|
<UserProvider >
|
||||||
<BrowserRouter>
|
<BrowserRouter>
|
||||||
<MainForm vin="TESTVIN1234567890"/>
|
<MainForm vin="TESTVIN1234567890" />
|
||||||
</BrowserRouter>
|
</BrowserRouter>
|
||||||
</UserProvider>
|
</UserProvider>
|
||||||
</StatusProvider>
|
</StatusProvider>
|
||||||
@@ -46,4 +47,23 @@ describe("VehicleDetailsTab", () => {
|
|||||||
const container = await renderVehicleDetailsTab();
|
const container = await renderVehicleDetailsTab();
|
||||||
expect(container).toMatchSnapshot();
|
expect(container).toMatchSnapshot();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("renders update config control when required permission is present.", () => {
|
||||||
|
const hasRole = jest.spyOn(Roles, 'hasRole');
|
||||||
|
hasRole.mockReturnValue(true);
|
||||||
|
render(
|
||||||
|
<VehicleProvider>
|
||||||
|
<StatusProvider>
|
||||||
|
<UserProvider>
|
||||||
|
<BrowserRouter>
|
||||||
|
<MainForm vin="TESTVIN1234567890" />
|
||||||
|
</BrowserRouter>
|
||||||
|
</UserProvider>
|
||||||
|
</StatusProvider>
|
||||||
|
</VehicleProvider>
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(screen.getByLabelText("Force Config Update")).toBeTruthy();
|
||||||
|
hasRole.mockRestore();
|
||||||
|
})
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -168,63 +168,7 @@ exports[`DetailsTab Render 1`] = `
|
|||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
class="MuiGrid-root makeStyles-textCenterAlign-0 MuiGrid-item MuiGrid-grid-md-12"
|
class="MuiGrid-root makeStyles-textCenterAlign-0 MuiGrid-item MuiGrid-grid-md-12"
|
||||||
>
|
/>
|
||||||
<label
|
|
||||||
class="MuiFormControlLabel-root"
|
|
||||||
>
|
|
||||||
<span
|
|
||||||
aria-disabled="false"
|
|
||||||
class="MuiButtonBase-root MuiIconButton-root PrivateSwitchBase-root-0 MuiCheckbox-root MuiCheckbox-colorSecondary MuiIconButton-colorSecondary"
|
|
||||||
>
|
|
||||||
<span
|
|
||||||
class="MuiIconButton-label"
|
|
||||||
>
|
|
||||||
<input
|
|
||||||
class="PrivateSwitchBase-input-0"
|
|
||||||
data-indeterminate="false"
|
|
||||||
type="checkbox"
|
|
||||||
value=""
|
|
||||||
/>
|
|
||||||
<svg
|
|
||||||
aria-hidden="true"
|
|
||||||
class="MuiSvgIcon-root"
|
|
||||||
focusable="false"
|
|
||||||
viewBox="0 0 24 24"
|
|
||||||
>
|
|
||||||
<path
|
|
||||||
d="M19 5v14H5V5h14m0-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z"
|
|
||||||
/>
|
|
||||||
</svg>
|
|
||||||
</span>
|
|
||||||
<span
|
|
||||||
class="MuiTouchRipple-root"
|
|
||||||
/>
|
|
||||||
</span>
|
|
||||||
<span
|
|
||||||
class="MuiTypography-root MuiFormControlLabel-label MuiTypography-body1"
|
|
||||||
>
|
|
||||||
Force Config Update
|
|
||||||
</span>
|
|
||||||
</label>
|
|
||||||
<a
|
|
||||||
class=""
|
|
||||||
href="/testroute/TESTVIN1234567890"
|
|
||||||
title="Push Config Update to \\"TESTVIN1234567890\\""
|
|
||||||
>
|
|
||||||
<svg
|
|
||||||
aria-hidden="true"
|
|
||||||
aria-label="Push Config Update to \\"TESTVIN1234567890\\""
|
|
||||||
class="MuiSvgIcon-root MuiSvgIcon-fontSizeLarge css-tzssek-MuiSvgIcon-root"
|
|
||||||
data-testid="UploadIcon"
|
|
||||||
focusable="false"
|
|
||||||
viewBox="0 0 24 24"
|
|
||||||
>
|
|
||||||
<path
|
|
||||||
d="M5 20h14v-2H5v2zm0-10h4v6h6v-6h4l-7-7-7 7z"
|
|
||||||
/>
|
|
||||||
</svg>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div
|
<div
|
||||||
class="MuiGrid-root makeStyles-textCenterAlign-0 MuiGrid-item MuiGrid-grid-md-12"
|
class="MuiGrid-root makeStyles-textCenterAlign-0 MuiGrid-item MuiGrid-grid-md-12"
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -349,63 +349,7 @@ exports[`CarStatus Render 1`] = `
|
|||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
class="MuiGrid-root makeStyles-textCenterAlign-0 MuiGrid-item MuiGrid-grid-md-12"
|
class="MuiGrid-root makeStyles-textCenterAlign-0 MuiGrid-item MuiGrid-grid-md-12"
|
||||||
>
|
/>
|
||||||
<label
|
|
||||||
class="MuiFormControlLabel-root"
|
|
||||||
>
|
|
||||||
<span
|
|
||||||
aria-disabled="false"
|
|
||||||
class="MuiButtonBase-root MuiIconButton-root PrivateSwitchBase-root-0 MuiCheckbox-root MuiCheckbox-colorSecondary MuiIconButton-colorSecondary"
|
|
||||||
>
|
|
||||||
<span
|
|
||||||
class="MuiIconButton-label"
|
|
||||||
>
|
|
||||||
<input
|
|
||||||
class="PrivateSwitchBase-input-0"
|
|
||||||
data-indeterminate="false"
|
|
||||||
type="checkbox"
|
|
||||||
value=""
|
|
||||||
/>
|
|
||||||
<svg
|
|
||||||
aria-hidden="true"
|
|
||||||
class="MuiSvgIcon-root"
|
|
||||||
focusable="false"
|
|
||||||
viewBox="0 0 24 24"
|
|
||||||
>
|
|
||||||
<path
|
|
||||||
d="M19 5v14H5V5h14m0-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z"
|
|
||||||
/>
|
|
||||||
</svg>
|
|
||||||
</span>
|
|
||||||
<span
|
|
||||||
class="MuiTouchRipple-root"
|
|
||||||
/>
|
|
||||||
</span>
|
|
||||||
<span
|
|
||||||
class="MuiTypography-root MuiFormControlLabel-label MuiTypography-body1"
|
|
||||||
>
|
|
||||||
Force Config Update
|
|
||||||
</span>
|
|
||||||
</label>
|
|
||||||
<a
|
|
||||||
class=""
|
|
||||||
href="/"
|
|
||||||
title="Push Config Update to \\"TESTVIN1234567890\\""
|
|
||||||
>
|
|
||||||
<svg
|
|
||||||
aria-hidden="true"
|
|
||||||
aria-label="Push Config Update to \\"TESTVIN1234567890\\""
|
|
||||||
class="MuiSvgIcon-root MuiSvgIcon-fontSizeLarge css-tzssek-MuiSvgIcon-root"
|
|
||||||
data-testid="UploadIcon"
|
|
||||||
focusable="false"
|
|
||||||
viewBox="0 0 24 24"
|
|
||||||
>
|
|
||||||
<path
|
|
||||||
d="M5 20h14v-2H5v2zm0-10h4v6h6v-6h4l-7-7-7 7z"
|
|
||||||
/>
|
|
||||||
</svg>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div
|
<div
|
||||||
class="MuiGrid-root makeStyles-textCenterAlign-0 MuiGrid-item MuiGrid-grid-md-12"
|
class="MuiGrid-root makeStyles-textCenterAlign-0 MuiGrid-item MuiGrid-grid-md-12"
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -2,9 +2,9 @@ import React from "react";
|
|||||||
import { hasRole } from "../../../utils/roles";
|
import { hasRole } from "../../../utils/roles";
|
||||||
|
|
||||||
export const RoleWrap = (props) => {
|
export const RoleWrap = (props) => {
|
||||||
const {groups, rolesPerProvider, providers} = props;
|
const { groups, rolesPerProvider, providers } = props;
|
||||||
|
|
||||||
const eitherComponent = props["eitherComponent"] || null;
|
const eitherComponent = props["eitherComponent"] || null;
|
||||||
|
|
||||||
if (!hasRole(groups, rolesPerProvider, providers)) {
|
if (!hasRole(groups, rolesPerProvider, providers)) {
|
||||||
return eitherComponent != null ? eitherComponent : <></>;
|
return eitherComponent != null ? eitherComponent : <></>;
|
||||||
|
|||||||
@@ -231,7 +231,7 @@ const MainForm = () => {
|
|||||||
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(groups, Permissions.FiskerUpdateDeploy, providers)) {
|
||||||
actions.push({
|
actions.push({
|
||||||
tip: `Deploy "${row.name} ${row.version}"`,
|
tip: `Deploy "${row.name} ${row.version}"`,
|
||||||
link: `/package-deploy/${row.id}`,
|
link: `/package-deploy/${row.id}`,
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ export const Roles = {
|
|||||||
DELETE: process.env.REACT_APP_ROLE_DELETE,
|
DELETE: process.env.REACT_APP_ROLE_DELETE,
|
||||||
CERTIFICATES: process.env.REACT_APP_ROLE_GENERATE_CERTIFICATE,
|
CERTIFICATES: process.env.REACT_APP_ROLE_GENERATE_CERTIFICATE,
|
||||||
APPROVESUPPLIERS: process.env.REACT_APP_ROLE_SUPPLIER_APPROVER,
|
APPROVESUPPLIERS: process.env.REACT_APP_ROLE_SUPPLIER_APPROVER,
|
||||||
|
UPDATEDEPLOY: process.env.REACT_APP_ROLE_UPDATE_DEPLOY,
|
||||||
MANUFACTURE: process.env.REACT_APP_ROLE_MANUFACTURE,
|
MANUFACTURE: process.env.REACT_APP_ROLE_MANUFACTURE,
|
||||||
MAGNAGROUP: process.env.REACT_APP_MAGNA_GROUP_ID,
|
MAGNAGROUP: process.env.REACT_APP_MAGNA_GROUP_ID,
|
||||||
MANIFEST_MIGRATION: process.env.REACT_APP_ROLE_MANIFEST_MIGRATION
|
MANIFEST_MIGRATION: process.env.REACT_APP_ROLE_MANIFEST_MIGRATION
|
||||||
@@ -81,6 +82,9 @@ export const Permissions = {
|
|||||||
[Providers.FISKER_QA]: [Roles.MANUFACTURE],
|
[Providers.FISKER_QA]: [Roles.MANUFACTURE],
|
||||||
[Providers.MAGNA]: [Roles.MAGNAGROUP],
|
[Providers.MAGNA]: [Roles.MAGNAGROUP],
|
||||||
},
|
},
|
||||||
|
FiskerUpdateDeploy: {
|
||||||
|
[Providers.FISKER]: [Roles.UPDATEDEPLOY],
|
||||||
|
},
|
||||||
Magna: {
|
Magna: {
|
||||||
[Providers.FISKER_QA]: [Roles.MANUFACTURE],
|
[Providers.FISKER_QA]: [Roles.MANUFACTURE],
|
||||||
[Providers.MAGNA]: [Roles.MAGNAGROUP],
|
[Providers.MAGNA]: [Roles.MAGNAGROUP],
|
||||||
|
|||||||
@@ -68,6 +68,15 @@ describe("Roles Helper", () => {
|
|||||||
).toEqual(true);
|
).toEqual(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("Check FiskerUpdateDeploy permission", () => {
|
||||||
|
expect(
|
||||||
|
hasRole([Roles.UPDATEDEPLOY], Permissions.FiskerUpdateDeploy, [Providers.FISKER])
|
||||||
|
).toEqual(true);
|
||||||
|
expect(
|
||||||
|
hasRole([Roles.UPDATEDEPLOY], Permissions.FiskerUpdateDeploy, [Providers.MAGNA])
|
||||||
|
).toEqual(false);
|
||||||
|
});
|
||||||
|
|
||||||
it("Check Magna permission", () => {
|
it("Check Magna permission", () => {
|
||||||
expect(
|
expect(
|
||||||
hasRole([Roles.MAGNAGROUP], Permissions.Magna, [Providers.MAGNA])
|
hasRole([Roles.MAGNAGROUP], Permissions.Magna, [Providers.MAGNA])
|
||||||
|
|||||||
Reference in New Issue
Block a user