Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
107 commits
Select commit Hold shift + click to select a range
0ec9e66
feat: Add license backfill and caching utilities
JohnDuprey Feb 27, 2026
0a683e6
feat: Add BitLocker key search page and component
JohnDuprey Feb 28, 2026
64471a1
fix: prevent HTML escaping of URLs in action links
kris6673 Feb 28, 2026
b68dc3b
12 Hour Update
Zacgoose Feb 28, 2026
b55ba63
Merge pull request #5493 from Zacgoose/12-hours
JohnDuprey Feb 28, 2026
25d3417
Add BitLocker recovery key retrieval UI
JohnDuprey Feb 28, 2026
c9efb18
Dead page, replaced with draw on index page
Zacgoose Mar 2, 2026
023e5fd
What even is this, old dead page - add domain to cipp
Zacgoose Mar 2, 2026
2a7e678
Another dead page, looks to be replaced with a draw
Zacgoose Mar 2, 2026
121ba78
fix queue tracker
JohnDuprey Mar 2, 2026
811b248
Add Types property to Mailboxes data
JohnDuprey Mar 2, 2026
195a814
Add CloudFlare Tunnel option for PWPush extension
Brad-M-K Mar 2, 2026
8539526
Merge pull request #5500 from Zacgoose/more-dead-pages
KelvinTegelaar Mar 2, 2026
60f0f8f
Merge pull request #5499 from Zacgoose/dead-page
KelvinTegelaar Mar 2, 2026
16831de
Merge pull request #5498 from Zacgoose/tenantgroups
KelvinTegelaar Mar 2, 2026
ce93e23
Merge pull request #5492 from kris6673/link-url-fix
KelvinTegelaar Mar 2, 2026
d15b4df
fix(reusable-settings): normalize RawJSON casing in templates
MWG-Logan Mar 2, 2026
fd2c096
Merge branch 'KelvinTegelaar:dev' into dev
Brad-M-K Mar 2, 2026
047e9c0
Fix PWPush email field condition logic
Brad-M-K Mar 3, 2026
be8d5d4
Bitlocker search improvements :)
Zacgoose Mar 3, 2026
d162676
Update authentication link in CippDirectTenantDeploy
bmsimp Mar 3, 2026
e4e484b
Update GDAP documentation link in CippGDAPTenantSetup
bmsimp Mar 3, 2026
c702e0e
Update service account documentation link
bmsimp Mar 3, 2026
8368043
Update link to recommended roles documentation
bmsimp Mar 3, 2026
e4417b2
Add default passphrase field to PWPush extension
Brad-M-K Mar 3, 2026
9d7e9d5
Update PWPush retrieval step label to clarify passphrase recommendation
Brad-M-K Mar 3, 2026
70486bf
Reorder PWPush extension fields and update CF-ZTNA label
Brad-M-K Mar 3, 2026
fd766d3
Add bookmark management to sidebar and top navigation with drag-and-d…
Brad-M-K Mar 4, 2026
8f51c1e
Merge pull request #5502 from MWG-Logan/fix/reusable-settings-2
KelvinTegelaar Mar 4, 2026
cafa836
Merge pull request #5503 from Zacgoose/bitlocker-search
KelvinTegelaar Mar 4, 2026
5c94f4f
Merge pull request #5509 from bmsimp/bmsimp-patch-1
KelvinTegelaar Mar 4, 2026
c48361f
fix: update CA Test Results table columns and fetching state
kris6673 Mar 4, 2026
10f74a9
feat: add authentication flow selection and reorder parameters
kris6673 Mar 4, 2026
fca3d93
fix: update autoComplete fields to disable creatable option
kris6673 Mar 4, 2026
c0bdac8
fix: restore Shift+Home text selection in autocomplete inputs
kris6673 Mar 4, 2026
4877f71
feat: add Ctrl+Alt+K shortcut to focus tenant selector
kris6673 Mar 4, 2026
18f8d25
feat: add assignment filter options to application assignments
kris6673 Mar 4, 2026
03dc06d
feat: add button to deploy group template on the groups page
kris6673 Mar 4, 2026
b433dd1
Bump react-hook-form from 7.71.1 to 7.71.2
dependabot[bot] Mar 4, 2026
de8c5fc
Bump react from 19.2.3 to 19.2.4
dependabot[bot] Mar 4, 2026
0aeb445
Bump LanceMcCarthy/Action-AzureBlobUpload from 3.7.0 to 3.8.0
dependabot[bot] Mar 4, 2026
8cb96ab
Bump actions/setup-node from 6.2.0 to 6.3.0
dependabot[bot] Mar 4, 2026
1b9bb8f
feat: update button link to new "add a tenant" wizard
kris6673 Mar 4, 2026
2028b6c
Merge pull request #4 from KelvinTegelaar/dev
Brad-M-K Mar 4, 2026
887dab9
Merge branch 'dev' of https://github.com/Brad-M-K/CIPP into dev
Brad-M-K Mar 5, 2026
d8461ab
Revert "Add bookmark management to sidebar and top navigation with dr…
Brad-M-K Mar 5, 2026
f7a2fd1
Update CippStandardsSideBar.jsx
Zacgoose Mar 5, 2026
09b67e0
Merge branch 'KelvinTegelaar:main' into Zacgoose-patch-2
Zacgoose Mar 5, 2026
7ec3e3f
Update confirmation message for applying standard
Zacgoose Mar 5, 2026
62383f1
Merge branch 'dev' into Zacgoose-patch-2
Zacgoose Mar 5, 2026
07a2098
Merge pull request #5531 from Zacgoose/Zacgoose-patch-2
KelvinTegelaar Mar 5, 2026
63b719e
Feat: New Standard: Restrict User Device Registration
Zacgoose Mar 5, 2026
9439f83
Merge pull request #5517 from kris6673/ca-test
KelvinTegelaar Mar 5, 2026
6d20c42
feat: add severity color mapping for logbook
kris6673 Mar 5, 2026
286c3aa
feat: add enabled/disabled status filter to standards dialog
kris6673 Mar 5, 2026
303a4f4
Merge pull request #5534 from Zacgoose/RestrictUserDeviceRegistration
KelvinTegelaar Mar 6, 2026
e1c6e52
Merge pull request #5539 from kris6673/standards-filter
KelvinTegelaar Mar 6, 2026
02fb8ca
Merge pull request #5538 from kris6673/log-severity-colors
KelvinTegelaar Mar 6, 2026
cf81d4a
Merge pull request #5528 from kris6673/youre-a-wizard-harry
KelvinTegelaar Mar 6, 2026
feb0e50
Merge pull request #5518 from kris6673/shift-home-and-maybe-more
KelvinTegelaar Mar 6, 2026
c7b8455
Merge pull request #5521 from kris6673/apps-assignmentfilter
KelvinTegelaar Mar 6, 2026
f0b7fa8
Remove BitLocker Key Search from tools list
Zacgoose Mar 6, 2026
0a27754
Merge pull request #5541 from Zacgoose/patch-2
KelvinTegelaar Mar 6, 2026
eab121e
feat(vacation-mode): add standalone wizard with mailbox permissions a…
kris6673 Feb 23, 2026
65b72c5
feat: add validation to user forms and update form modes
kris6673 Feb 23, 2026
309f90c
Merge pull request #5527 from KelvinTegelaar/dependabot/github_action…
KelvinTegelaar Mar 6, 2026
353b36e
Merge pull request #5526 from KelvinTegelaar/dependabot/github_action…
KelvinTegelaar Mar 6, 2026
f325963
Merge pull request #5525 from KelvinTegelaar/dependabot/npm_and_yarn/…
KelvinTegelaar Mar 6, 2026
c285252
Merge pull request #5522 from kris6673/yahaw-its-a-button
KelvinTegelaar Mar 6, 2026
4174a75
fix: Set code blocks to read-only in various components, default to f…
JohnDuprey Mar 6, 2026
a9ef350
fix: one more read only
JohnDuprey Mar 6, 2026
42d3559
Merge pull request #5512 from Brad-M-K/dev
KelvinTegelaar Mar 6, 2026
5ba067e
Merge pull request #5 from KelvinTegelaar/dev
Brad-M-K Mar 6, 2026
19a6061
chore: bump react-dom to 19.2.4
JohnDuprey Mar 7, 2026
07cc2dc
Bump react-error-boundary from 6.1.0 to 6.1.1
dependabot[bot] Mar 7, 2026
827ee7a
feat: Enhanced bookmark management with sidebar, sorting, drag-and-dr…
Brad-M-K Mar 7, 2026
5915004
feat: update workflow name and trigger for issue assignment
kris6673 Mar 7, 2026
b58e6d4
Merge pull request #5459 from kris6673/vacation
KelvinTegelaar Mar 7, 2026
5c12adb
Merge pull request #5543 from Brad-M-K/Improved_Bookmarks
KelvinTegelaar Mar 7, 2026
cf48294
Merge pull request #5546 from kris6673/Assign-Issue-to-Volunteer
KelvinTegelaar Mar 7, 2026
39e720c
Merge pull request #5523 from KelvinTegelaar/dependabot/npm_and_yarn/…
KelvinTegelaar Mar 7, 2026
cb7e0e5
Merge pull request #5443 from kris6673/input-validation
KelvinTegelaar Mar 7, 2026
b6802df
Merge pull request #5463 from KelvinTegelaar/dependabot/npm_and_yarn/…
KelvinTegelaar Mar 7, 2026
eb013e2
Bump react-grid-layout from 1.5.3 to 2.2.2
dependabot[bot] Mar 7, 2026
310e34f
Bump react-apexcharts from 1.7.0 to 1.9.0
dependabot[bot] Mar 7, 2026
7a251c3
Merge pull request #5466 from KelvinTegelaar/dependabot/npm_and_yarn/…
KelvinTegelaar Mar 7, 2026
56d7f92
Merge pull request #5524 from KelvinTegelaar/dependabot/npm_and_yarn/…
KelvinTegelaar Mar 7, 2026
7de4343
Merge pull request #6 from KelvinTegelaar/dev
Brad-M-K Mar 7, 2026
0ae0eec
feat: add CippRestoreWizard component for backup restoration process
JohnDuprey Mar 8, 2026
0d9bd6a
Merge branch 'dev' of https://github.com/KelvinTegelaar/CIPP into dev
JohnDuprey Mar 8, 2026
74a4bc2
feat: enhance backup management with dialogs for running and scheduli…
JohnDuprey Mar 8, 2026
73a98b4
chore: swap alert and infobar placement
JohnDuprey Mar 8, 2026
ae81d6f
Feat: Incident Report and Attachment options
Zacgoose Mar 8, 2026
3b67dab
feat: enhance CippRestoreWizard layout with improved dialog content a…
JohnDuprey Mar 8, 2026
6a12f08
chore: unify table button style
JohnDuprey Mar 8, 2026
affe135
feat: Improve sidebar scroll behavior and close popover on navigation
Brad-M-K Mar 8, 2026
f527912
Merge pull request #5548 from Brad-M-K/Sidemenu_and_Profile_Popover
KelvinTegelaar Mar 8, 2026
f74efc9
Merge pull request #5547 from Zacgoose/transport-rule
KelvinTegelaar Mar 8, 2026
b3823af
feat: add IncludeDisabled input to MFAAdmins alert
kris6673 Mar 8, 2026
5e1b19d
Merge pull request #5550 from kris6673/issue5448
KelvinTegelaar Mar 8, 2026
d813b61
feat: add verifyAssignments switch to policy configuration
JohnDuprey Mar 9, 2026
b1052a0
feat: close popover after executing custom action in ActionsMenu
JohnDuprey Mar 9, 2026
a3e7f9c
feat: improve applied standards check for package tags
JohnDuprey Mar 9, 2026
412a4a1
chore: bump version to 10.2.0
JohnDuprey Mar 9, 2026
2219a7a
Merge pull request #5556 from KelvinTegelaar/dev
KelvinTegelaar Mar 9, 2026
e9ee071
fix: sponsor change on router path update
JohnDuprey Mar 9, 2026
be1a9ff
Merge pull request #5557 from KelvinTegelaar/dev
JohnDuprey Mar 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 6 additions & 4 deletions .github/workflows/Assign_Issue_Volunteer.yml
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
---
name: "Assign Issue to Volunteer"
on: [issue_comment] # yamllint disable-line rule:truthy
name: "Issue volunteer assignment"
on:
issue_comment:
types: [created]
jobs:
build:
volunteer:
runs-on: ubuntu-slim
steps:
- uses: bhermann/issue-volunteer@v0.1.20
- uses: kris6673/issue-volunteer@v0.2.0
with:
GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
2 changes: 1 addition & 1 deletion .github/workflows/Node_Project_Check.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ jobs:
steps:
- uses: actions/checkout@v6
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v6.2.0
uses: actions/setup-node@v6.3.0
with:
node-version: ${{ matrix.node-version }}
- name: Install and Build Test
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/cipp_dev_build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ jobs:
echo "node_version=$node_sanitized_version" >> $GITHUB_OUTPUT

- name: Set up Node.js
uses: actions/setup-node@v6.2.0
uses: actions/setup-node@v6.3.0
with:
node-version: ${{ steps.get_node_version.outputs.node_version }}

Expand All @@ -47,7 +47,7 @@ jobs:

# Upload to Azure Blob Storage
- name: Azure Blob Upload
uses: LanceMcCarthy/Action-AzureBlobUpload@v3.7.0
uses: LanceMcCarthy/Action-AzureBlobUpload@v3.8.0
with:
connection_string: ${{ secrets.AZURE_CONNECTION_STRING }}
container_name: cipp
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/cipp_frontend_build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ jobs:
echo "node_version=$node_sanitized_version" >> $GITHUB_OUTPUT

- name: Set up Node.js
uses: actions/setup-node@v6.2.0
uses: actions/setup-node@v6.3.0
with:
node-version: ${{ steps.get_node_version.outputs.node_version }}

Expand All @@ -47,7 +47,7 @@ jobs:

# Upload to Azure Blob Storage
- name: Azure Blob Upload
uses: LanceMcCarthy/Action-AzureBlobUpload@v3.7.0
uses: LanceMcCarthy/Action-AzureBlobUpload@v3.8.0
with:
connection_string: ${{ secrets.AZURE_CONNECTION_STRING }}
container_name: cipp
Expand Down
16 changes: 8 additions & 8 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "cipp",
"version": "10.1.2",
"version": "10.2.0",
"author": "CIPP Contributors",
"homepage": "https://cipp.app/",
"bugs": {
Expand Down Expand Up @@ -77,15 +77,15 @@
"numeral": "2.0.6",
"prop-types": "15.8.1",
"punycode": "^2.3.1",
"react": "19.2.3",
"react-apexcharts": "1.7.0",
"react": "19.2.4",
"react-apexcharts": "1.9.0",
"react-beautiful-dnd": "13.1.1",
"react-copy-to-clipboard": "^5.1.0",
"react-dom": "19.2.3",
"react-dom": "19.2.4",
"react-dropzone": "14.3.8",
"react-error-boundary": "^6.1.0",
"react-grid-layout": "^1.5.0",
"react-hook-form": "^7.71.1",
"react-error-boundary": "^6.1.1",
"react-grid-layout": "^2.2.2",
"react-hook-form": "^7.71.2",
"react-hot-toast": "2.6.0",
"react-html-parser": "^2.0.2",
"react-i18next": "16.2.4",
Expand Down Expand Up @@ -118,4 +118,4 @@
"eslint": "9.39.2",
"eslint-config-next": "16.1.6"
}
}
}
2 changes: 1 addition & 1 deletion public/version.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
{
"version": "10.1.2"
"version": "10.2.0"
}
160 changes: 144 additions & 16 deletions src/components/CippCards/CippUniversalSearchV2.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,27 +10,32 @@ import {
CircularProgress,
InputAdornment,
Portal,
Button,
} from "@mui/material";
import { Search as SearchIcon } from "@mui/icons-material";
import { ApiGetCall } from "../../api/ApiCall";
import { useSettings } from "../../hooks/use-settings";
import { useRouter } from "next/router";
import { BulkActionsMenu } from "../bulk-actions-menu";
import { Button } from "@mui/material";
import { CippOffCanvas } from "../CippComponents/CippOffCanvas";
import { CippBitlockerKeySearch } from "../CippComponents/CippBitlockerKeySearch";

export const CippUniversalSearchV2 = React.forwardRef(
({ onConfirm = () => {}, onChange = () => {}, maxResults = 10, value = "" }, ref) => {
const [searchValue, setSearchValue] = useState(value);
const [searchType, setSearchType] = useState("Users");
const [bitlockerLookupType, setBitlockerLookupType] = useState("keyId");
const [showDropdown, setShowDropdown] = useState(false);
const [bitlockerDrawerVisible, setBitlockerDrawerVisible] = useState(false);
const [bitlockerDrawerDefaults, setBitlockerDrawerDefaults] = useState({
searchTerm: "",
searchType: "keyId",
});
const [dropdownPosition, setDropdownPosition] = useState({ top: 0, left: 0, width: 0 });
const containerRef = useRef(null);
const textFieldRef = useRef(null);
const router = useRouter();
const settings = useSettings();
const { currentTenant } = settings;

const search = ApiGetCall({
const universalSearch = ApiGetCall({
url: `/api/ExecUniversalSearchV2`,
data: {
searchTerms: searchValue,
Expand All @@ -41,6 +46,17 @@ export const CippUniversalSearchV2 = React.forwardRef(
waiting: false,
});

const bitlockerSearch = ApiGetCall({
url: "/api/ExecBitlockerSearch",
data: {
[bitlockerLookupType]: searchValue,
},
queryKey: `bitlocker-universal-${bitlockerLookupType}-${searchValue}`,
waiting: false,
});

const activeSearch = searchType === "BitLocker" ? bitlockerSearch : universalSearch;

const handleChange = (event) => {
const newValue = event.target.value;
setSearchValue(newValue);
Expand Down Expand Up @@ -71,7 +87,7 @@ export const CippUniversalSearchV2 = React.forwardRef(
const handleSearch = () => {
if (searchValue.length > 0) {
updateDropdownPosition();
search.refetch();
activeSearch.refetch();
setShowDropdown(true);
}
};
Expand All @@ -93,6 +109,21 @@ export const CippUniversalSearchV2 = React.forwardRef(

const handleTypeChange = (type) => {
setSearchType(type);
if (type === "BitLocker") {
setBitlockerLookupType("keyId");
}
setShowDropdown(false);
};

const handleBitlockerResultClick = (match) => {
setBitlockerDrawerDefaults({
searchTerm:
bitlockerLookupType === "deviceId"
? match?.deviceId || searchValue
: match?.keyId || searchValue,
searchType: bitlockerLookupType,
});
setBitlockerDrawerVisible(true);
setShowDropdown(false);
};

Expand All @@ -107,6 +138,24 @@ export const CippUniversalSearchV2 = React.forwardRef(
icon: "Group",
onClick: () => handleTypeChange("Groups"),
},
{
label: "BitLocker",
icon: "FilePresent",
onClick: () => handleTypeChange("BitLocker"),
},
];

const bitlockerLookupActions = [
{
label: "Key ID",
icon: "FilePresent",
onClick: () => setBitlockerLookupType("keyId"),
},
{
label: "Device ID",
icon: "Laptop",
onClick: () => setBitlockerLookupType("deviceId"),
},
];

// Close dropdown when clicking outside
Expand Down Expand Up @@ -144,14 +193,23 @@ export const CippUniversalSearchV2 = React.forwardRef(
}
}, [showDropdown]);

const hasResults = Array.isArray(search?.data) && search.data.length > 0;
const bitlockerResults = Array.isArray(bitlockerSearch?.data?.Results)
? bitlockerSearch.data.Results
: [];
const universalResults = Array.isArray(universalSearch?.data) ? universalSearch.data : [];
const hasResults =
searchType === "BitLocker" ? bitlockerResults.length > 0 : universalResults.length > 0;
const shouldShowDropdown = showDropdown && searchValue.length > 0;

const getLabel = () => {
if (searchType === "Users") {
return "Search users by UPN or Display Name";
} else if (searchType === "Groups") {
return "Search groups by Display Name";
} else if (searchType === "BitLocker") {
return bitlockerLookupType === "deviceId"
? "Search BitLocker by Device ID"
: "Search BitLocker by Recovery Key ID";
}
return "Search";
};
Expand All @@ -163,6 +221,12 @@ export const CippUniversalSearchV2 = React.forwardRef(
buttonName={searchType}
actions={typeMenuActions}
/>
{searchType === "BitLocker" && (
<BulkActionsMenu
buttonName={bitlockerLookupType === "deviceId" ? "Device ID" : "Key ID"}
actions={bitlockerLookupActions}
/>
)}
<TextField
ref={(node) => {
textFieldRef.current = node;
Expand All @@ -187,7 +251,7 @@ export const CippUniversalSearchV2 = React.forwardRef(
<SearchIcon color="action" sx={{ fontSize: 20 }} />
</InputAdornment>
),
endAdornment: search.isFetching ? (
endAdornment: activeSearch.isFetching ? (
<InputAdornment position="end">
<CircularProgress size={20} />
</InputAdornment>
Expand All @@ -203,7 +267,7 @@ export const CippUniversalSearchV2 = React.forwardRef(
<Button
variant="contained"
onClick={handleSearch}
disabled={searchValue.length === 0 || search.isFetching}
disabled={searchValue.length === 0 || activeSearch.isFetching}
startIcon={<SearchIcon />}
sx={{ flexShrink: 0 }}
>
Expand All @@ -229,18 +293,25 @@ export const CippUniversalSearchV2 = React.forwardRef(
borderColor: "divider",
}}
>
{search.isFetching ? (
{activeSearch.isFetching ? (
<Box sx={{ p: 2 }}>
<Skeleton height={60} sx={{ mb: 1 }} />
<Skeleton height={60} />
</Box>
) : hasResults ? (
<Results
items={search.data}
searchValue={searchValue}
onResultClick={handleResultClick}
searchType={searchType}
/>
searchType === "BitLocker" ? (
<BitlockerResults
items={bitlockerResults}
onResultClick={handleBitlockerResultClick}
/>
) : (
<Results
items={universalResults}
searchValue={searchValue}
onResultClick={handleResultClick}
searchType={searchType}
/>
)
) : (
<Box sx={{ p: 3, textAlign: "center" }}>
<Typography variant="body2" color="text.secondary">
Expand All @@ -251,6 +322,20 @@ export const CippUniversalSearchV2 = React.forwardRef(
</Paper>
</Portal>
)}

<CippOffCanvas
title="BitLocker Key Details"
visible={bitlockerDrawerVisible}
onClose={() => setBitlockerDrawerVisible(false)}
size="xl"
contentPadding={0}
>
<CippBitlockerKeySearch
initialSearchTerm={bitlockerDrawerDefaults.searchTerm}
initialSearchType={bitlockerDrawerDefaults.searchType}
autoSearch={true}
/>
</CippOffCanvas>
</>
);
},
Expand Down Expand Up @@ -337,3 +422,46 @@ const Results = ({ items = [], searchValue, onResultClick, searchType = "Users"
</>
);
};

const BitlockerResults = ({ items = [], onResultClick }) => {
return (
<>
{items.map((result, index) => (
<MenuItem
key={result.keyId || index}
onClick={() => onResultClick(result)}
sx={{
py: 1.5,
px: 2,
borderBottom: index < items.length - 1 ? "1px solid" : "none",
borderColor: "divider",
"&:hover": {
backgroundColor: "action.hover",
},
}}
>
<ListItemText
primary={
<Typography variant="body1" fontWeight="medium">
{result.deviceName || "Unknown Device"}
</Typography>
}
secondary={
<Box>
<Typography variant="body2" color="text.secondary">
Key ID: {result.keyId || "N/A"}
</Typography>
<Typography variant="body2" color="text.secondary">
Device ID: {result.deviceId || "N/A"}
</Typography>
<Typography variant="caption" color="text.secondary" sx={{ display: "block", mt: 0.5 }}>
Tenant: {result.tenant || "N/A"}
</Typography>
</Box>
}
/>
</MenuItem>
))}
</>
);
};
5 changes: 5 additions & 0 deletions src/components/CippCards/CippUserInfoCard.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,17 @@ import { getCippFormatting } from "../../utils/get-cipp-formatting";
import { Stack, Grid, Box } from "@mui/system";
import { useState, useRef, useCallback } from "react";
import { ApiPostCall } from "../../api/ApiCall";
import { useLicenseBackfill } from "../../hooks/use-license-backfill";

export const CippUserInfoCard = (props) => {
const { user, tenant, isFetching = false, ...other } = props;
const [photoTimestamp, setPhotoTimestamp] = useState(Date.now());
const [uploadError, setUploadError] = useState(null);
const [successMessage, setSuccessMessage] = useState(null);
const fileInputRef = useRef(null);

// Hook to trigger re-render when license backfill completes
const { updateTrigger } = useLicenseBackfill();

// API mutations
const setPhotoMutation = ApiPostCall({ urlFromData: true });
Expand Down Expand Up @@ -280,6 +284,7 @@ export const CippUserInfoCard = (props) => {
<PropertyListItem
divider
label="Licenses"
key={`licenses-${updateTrigger}`}
value={
isFetching ? (
<Skeleton variant="text" width={180} />
Expand Down
Loading