Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
0b018d7
Bump andymckay/labeler from 1.0.2 to 1.0.4
dependabot[bot] Feb 20, 2026
e9cc045
Bump brettcannon/check-for-changed-files from 1.1.0 to 1.2.1
dependabot[bot] Feb 20, 2026
2212b7b
Bump actions/checkout from 4 to 6
dependabot[bot] Feb 20, 2026
9b33ab5
Bump actions/setup-node from 4.2.0 to 6.2.0
dependabot[bot] Feb 20, 2026
386de26
Bump actions/stale from 4 to 10
dependabot[bot] Feb 20, 2026
ffe80f9
Bump recharts from 3.6.0 to 3.7.0
dependabot[bot] Feb 20, 2026
132fb04
Bump react-i18next from 15.7.3 to 16.2.4
dependabot[bot] Feb 20, 2026
809b77b
Bump @mui/x-date-pickers from 8.27.0 to 8.27.2
dependabot[bot] Feb 20, 2026
96998c8
Bump mui-tiptap from 1.28.1 to 1.29.0
dependabot[bot] Feb 20, 2026
40504f5
Bump react-virtuoso from 4.17.0 to 4.18.1
dependabot[bot] Feb 20, 2026
c9fd9c3
Better sponsor display
Feb 20, 2026
0887357
null safety on repo search
JohnDuprey Feb 21, 2026
622f22d
Preserve listbox scroll position in autocomplete
JohnDuprey Feb 21, 2026
fae6856
use slotProps instead of ListboxProps
JohnDuprey Feb 21, 2026
aabe30e
update recommended interval to 1 hour
JohnDuprey Feb 21, 2026
efca9f1
Merge pull request #5424 from KelvinTegelaar/dependabot/npm_and_yarn/…
KelvinTegelaar Feb 22, 2026
10c154b
Merge pull request #5423 from KelvinTegelaar/dependabot/npm_and_yarn/…
KelvinTegelaar Feb 22, 2026
bd1dd56
Merge pull request #5422 from KelvinTegelaar/dependabot/npm_and_yarn/…
KelvinTegelaar Feb 22, 2026
f8e0dff
Merge pull request #5421 from KelvinTegelaar/dependabot/npm_and_yarn/…
KelvinTegelaar Feb 22, 2026
e3463e9
Merge pull request #5420 from KelvinTegelaar/dependabot/npm_and_yarn/…
KelvinTegelaar Feb 22, 2026
bc5d25f
Merge pull request #5419 from KelvinTegelaar/dependabot/github_action…
KelvinTegelaar Feb 22, 2026
a8ffc6c
Merge pull request #5418 from KelvinTegelaar/dependabot/github_action…
KelvinTegelaar Feb 22, 2026
d8676f7
Merge pull request #5415 from KelvinTegelaar/dependabot/github_action…
KelvinTegelaar Feb 22, 2026
f878db6
Merge pull request #5414 from KelvinTegelaar/dependabot/github_action…
KelvinTegelaar Feb 22, 2026
884d69a
Merge pull request #5413 from KelvinTegelaar/dependabot/github_action…
KelvinTegelaar Feb 22, 2026
34389ed
fix: update boolean values to strings in standards.json
kris6673 Feb 22, 2026
7d36131
Merge pull request #5432 from kris6673/fix-whoops
KelvinTegelaar Feb 23, 2026
de079fc
minor dev emulator improvement
Feb 23, 2026
7f484c4
Better tenant lookup
Feb 23, 2026
b6281de
Add device local-admin standard
Zacgoose Feb 24, 2026
75a6721
Merge pull request #5447 from Zacgoose/local-admin
KelvinTegelaar Feb 24, 2026
8bdaa85
length issues permissions check
KelvinTegelaar Feb 24, 2026
83a522f
fix: Update applied-standards.js to refer to Actions dropdown
bmsimp Feb 24, 2026
eac8c88
mandatory fields and tenant allow ist.
KelvinTegelaar Feb 24, 2026
610b3b2
mandatory fields and tenant allow ist.
KelvinTegelaar Feb 24, 2026
8f14195
Merge pull request #5449 from bmsimp/patch-7
KelvinTegelaar Feb 24, 2026
877bbae
fix: readd Start-CippDevInstallation into Start-CippDevEmulators.ps1
kris6673 Feb 24, 2026
3b6bca6
Merge pull request #5451 from kris6673/devins
rvdwegen Feb 24, 2026
3b55cb3
bump version
JohnDuprey Feb 24, 2026
242bce1
Merge pull request #5452 from KelvinTegelaar/dev
JohnDuprey Feb 24, 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
2 changes: 1 addition & 1 deletion .github/workflows/Check_for_Version_Update.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ jobs:
runs-on: ubuntu-slim
steps:
- name: Check for Changed Files
uses: brettcannon/check-for-changed-files@v1.1.0
uses: brettcannon/check-for-changed-files@v1.2.1
with:
file-pattern: public/version.json
failure-message: "You have not updated version.json. This is a required file to update at each PR. Please sync your latest changes and update the version number."
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/Close_Stale_Issues.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ jobs:
if: github.repository_owner == 'KelvinTegelaar'
runs-on: ubuntu-slim
steps:
- uses: actions/stale@v4
- uses: actions/stale@v10
with:
stale-issue-message: "This issue is stale because it has been open 10 days with no activity. We will close this issue soon. If you want this feature implemented you can contribute it. See: https://docs.cipp.app/dev-documentation/contributing-to-the-code . Please notify the team if you are working on this yourself."
close-issue-message: "This issue was closed because it has been stalled for 14 days with no activity."
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/Label_Issues.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ jobs:
issues: write
steps:
- name: Label Issues
uses: andymckay/labeler@5c59dabdfd4dd5bd9c6e6d255b01b9d764af4414
uses: andymckay/labeler@e6c4322d0397f3240f0e7e30a33b5c5df2d39e90
with:
add-labels: "not-assigned"
repo-token: ${{ secrets.GITHUB_TOKEN }}
Expand All @@ -23,7 +23,7 @@ jobs:
issues: write
steps:
- name: Label Issues
uses: andymckay/labeler@5c59dabdfd4dd5bd9c6e6d255b01b9d764af4414
uses: andymckay/labeler@e6c4322d0397f3240f0e7e30a33b5c5df2d39e90
with:
add-labels: "enhancement, not-assigned"
repo-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
uses: actions/setup-node@v6.2.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 @@ -15,7 +15,7 @@ jobs:
steps:
# Checkout the repository
- name: Checkout Code
uses: actions/checkout@v4.2.2
uses: actions/checkout@v6

# Set up Node.js
- name: Get Node version
Expand All @@ -26,7 +26,7 @@ jobs:
echo "node_version=$node_sanitized_version" >> $GITHUB_OUTPUT

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

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 @@ -15,7 +15,7 @@ jobs:
steps:
# Checkout the repository
- name: Checkout Code
uses: actions/checkout@v4.2.2
uses: actions/checkout@v6

# Set up Node.js
- name: Get Node version
Expand All @@ -26,7 +26,7 @@ jobs:
echo "node_version=$node_sanitized_version" >> $GITHUB_OUTPUT
- name: Set up Node.js
uses: actions/setup-node@v4.2.0
uses: actions/setup-node@v6.2.0
with:
node-version: ${{ steps.get_node_version.outputs.node_version }}

Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/dev_deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ jobs:
runs-on: ubuntu-latest
name: Build and Deploy Job
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
with:
submodules: true
- name: Build And Deploy
Expand Down
30 changes: 19 additions & 11 deletions Tools/Start-CippDevEmulators.ps1
Original file line number Diff line number Diff line change
@@ -1,18 +1,26 @@
Write-Host 'Starting CIPP Dev Emulators' -ForegroundColor Cyan

# Verify Windows Terminal is available
Get-Command wt -ErrorAction Stop | Out-Null

# Stop any existing node processes
Get-Process node -ErrorAction SilentlyContinue | Stop-Process -ErrorAction SilentlyContinue

# Get paths
$Path = (Get-Item $PSScriptRoot).Parent.Parent.FullName
Write-Host "CIPP Dev Emulators starting in $Path" -ForegroundColor Green

pwsh -file (Join-Path $PSScriptRoot 'Start-CippDevInstallation.ps1')
# Run installation script to ensure dependencies are installed and updated before starting emulators
pwsh -File (Join-Path $PSScriptRoot 'Start-CippDevInstallation.ps1')
$ApiPath = Join-Path -Path $Path -ChildPath 'CIPP-API'
$FrontendPath = Join-Path -Path $Path -ChildPath 'CIPP'

Write-Host 'Starting CIPP Dev Emulators'
Write-Host 'Starting emulators...' -ForegroundColor Cyan

if (Test-Path (Join-Path $Path 'CIPP-API-Processor')) {
$Process = Read-Host -Prompt 'Start Process Function (y/N)?'
}
# Build commands with error handling
$azuriteCommand = 'try { azurite } catch { Write-Error $_.Exception.Message } finally { Read-Host "Press Enter to exit" }'
$apiCommand = 'try { func start } catch { Write-Error $_.Exception.Message } finally { Read-Host "Press Enter to exit" }'
$frontendCommand = 'try { npm run dev } catch { Write-Error $_.Exception.Message } finally { Read-Host "Press Enter to exit" }'
$swaCommand = 'try { npm run start-swa } catch { Write-Error $_.Exception.Message } finally { Read-Host "Press Enter to exit" }'

if ($Process -eq 'y') {
wt --title CIPP`; new-tab --title 'Azurite' -d $Path pwsh -c azurite`; new-tab --title 'FunctionApp' -d $Path\CIPP-API pwsh -c func start`; new-tab --title 'CIPP Frontend' -d $Path\CIPP pwsh -c npm run dev`; new-tab --title 'SWA' -d $Path\CIPP pwsh -c npm run start-swa`; new-tab --title 'CIPP-API-Processor' -d $Path\CIPP-API-Processor pwsh -c func start --port 7072
} else {
wt --title CIPP`; new-tab --title 'Azurite' -d $Path pwsh -c azurite`; new-tab --title 'FunctionApp' -d $Path\CIPP-API pwsh -c func start`; new-tab --title 'CIPP Frontend' -d $Path\CIPP pwsh -c npm run dev`; new-tab --title 'SWA' -d $Path\CIPP pwsh -c npm run start-swa
}
# Start Windows Terminal with all tabs
wt --title CIPP`; new-tab --title 'Azurite' -d $Path pwsh -c $azuriteCommand`; new-tab --title 'FunctionApp' -d $ApiPath pwsh -c $apiCommand`; new-tab --title 'CIPP Frontend' -d $FrontendPath pwsh -c $frontendCommand`; new-tab --title 'SWA' -d $FrontendPath pwsh -c $swaCommand
3 changes: 2 additions & 1 deletion Tools/Start-CippDevInstallation.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -29,4 +29,5 @@ if (-not(yarn global list | Select-String -Pattern 'next')) {
yarn global add 'next'
}

yarn install --cwd (Join-Path $Path "CIPP") --network-timeout 500000
Write-Host 'Running yarn install for CIPP frontend...' -ForegroundColor Cyan
yarn install --cwd (Join-Path $Path 'CIPP') --network-timeout 500000
12 changes: 6 additions & 6 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "cipp",
"version": "10.1.0",
"version": "10.1.1",
"author": "CIPP Contributors",
"homepage": "https://cipp.app/",
"bugs": {
Expand Down Expand Up @@ -34,7 +34,7 @@
"@mui/lab": "7.0.0-beta.17",
"@mui/material": "7.3.7",
"@mui/system": "7.3.2",
"@mui/x-date-pickers": "^8.27.0",
"@mui/x-date-pickers": "^8.27.2",
"@musement/iso-duration": "^1.0.0",
"@nivo/core": "^0.99.0",
"@nivo/sankey": "^0.99.0",
Expand Down Expand Up @@ -71,7 +71,7 @@
"lodash.isequal": "4.5.0",
"material-react-table": "^3.0.1",
"monaco-editor": "^0.55.1",
"mui-tiptap": "^1.14.0",
"mui-tiptap": "^1.29.0",
"next": "^16.1.6",
"nprogress": "0.2.0",
"numeral": "2.0.6",
Expand All @@ -88,7 +88,7 @@
"react-hook-form": "^7.71.1",
"react-hot-toast": "2.6.0",
"react-html-parser": "^2.0.2",
"react-i18next": "15.7.3",
"react-i18next": "16.2.4",
"react-leaflet": "5.0.0",
"react-leaflet-markercluster": "^5.0.0-rc.0",
"react-markdown": "10.1.0",
Expand All @@ -98,9 +98,9 @@
"react-redux": "9.2.0",
"react-syntax-highlighter": "^16.1.0",
"react-time-ago": "^7.3.3",
"react-virtuoso": "^4.12.8",
"react-virtuoso": "^4.18.1",
"react-window": "^2.2.5",
"recharts": "^3.6.0",
"recharts": "^3.7.0",
"redux": "5.0.1",
"redux-devtools-extension": "2.13.9",
"redux-persist": "^6.0.0",
Expand Down
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.0"
"version": "10.1.1"
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { useEffect, useState } from "react";
import { useEffect, useState } from "react";
import { Button, Divider } from "@mui/material";
import { Grid } from "@mui/system";
import { useForm, useFormState, useWatch } from "react-hook-form";
Expand Down Expand Up @@ -67,7 +67,7 @@ export const CippAddTenantAllowBlockListDrawer = ({
formControl.setValue(
"listMethod",
{ label: "Block", value: "Block" },
{ shouldValidate: true }
{ shouldValidate: true },
);
}

Expand All @@ -86,16 +86,6 @@ export const CippAddTenantAllowBlockListDrawer = ({
formControl,
]);

useEffect(() => {
if (addEntry.isSuccess) {
const currentTenants = formControl.getValues("tenantID");
formControl.reset({
...defaultValues,
tenantID: currentTenants,
});
}
}, [addEntry.isSuccess, formControl]);

const validateEntries = (value) => {
if (!value) return true;

Expand Down Expand Up @@ -273,12 +263,12 @@ export const CippAddTenantAllowBlockListDrawer = ({
listType?.value === "FileHash"
? "Enter SHA256 hash values separated by commas or semicolons (e.g., 768a813668695ef2483b2bde7cf5d1b2db0423a0d3e63e498f3ab6f2eb13ea3e)"
: listType?.value === "Url"
? "Enter URLs, IPv4, or IPv6 addresses with optional wildcards separated by commas or semicolons"
: listType?.value === "Sender"
? "Enter domains or email addresses separated by commas or semicolons (e.g., contoso.com,user@example.com)"
: listType?.value === "IP"
? "Enter IPv6 addresses only in colon-hexadecimal format or CIDR notation"
: ""
? "Enter URLs, IPv4, or IPv6 addresses with optional wildcards separated by commas or semicolons"
: listType?.value === "Sender"
? "Enter domains or email addresses separated by commas or semicolons (e.g., contoso.com,user@example.com)"
: listType?.value === "IP"
? "Enter IPv6 addresses only in colon-hexadecimal format or CIDR notation"
: ""
}
/>
</Grid>
Expand Down
24 changes: 23 additions & 1 deletion src/components/CippComponents/CippAutocomplete.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,8 @@ export const CippAutoComplete = (props) => {
const [getRequestInfo, setGetRequestInfo] = useState({ url: "", waiting: false, queryKey: "" });
const hasPreselectedRef = useRef(false);
const autocompleteRef = useRef(null); // Ref for focusing input after selection
const listboxRef = useRef(null); // Ref for the listbox to preserve scroll position
const scrollPositionRef = useRef(0); // Store scroll position
const filter = createFilterOptions({
stringify: (option) => JSON.stringify(option),
});
Expand Down Expand Up @@ -367,6 +369,11 @@ export const CippAutoComplete = (props) => {
}
name={name}
onChange={(event, newValue) => {
// Store scroll position before processing the change
if (multiple && listboxRef.current) {
scrollPositionRef.current = listboxRef.current.scrollTop;
}

if (Array.isArray(newValue)) {
newValue = newValue.map((item) => {
// If user typed a new item or missing label
Expand Down Expand Up @@ -407,14 +414,19 @@ export const CippAutoComplete = (props) => {
onChange(newValue, newValue?.addedFields);
}

// In multiple mode, refocus the input after selection to allow continuous adding
// In multiple mode, refocus the input and restore scroll position
if (multiple && newValue && autocompleteRef.current) {
// Use setTimeout to ensure the selection is processed first
setTimeout(() => {
const input = autocompleteRef.current?.querySelector("input");
if (input) {
input.focus();
}

// Restore the scroll position
if (listboxRef.current && scrollPositionRef.current > 0) {
listboxRef.current.scrollTop = scrollPositionRef.current;
}
}, 0);
}
}}
Expand Down Expand Up @@ -625,6 +637,16 @@ export const CippAutoComplete = (props) => {
}}
groupBy={groupBy}
renderGroup={renderGroup}
slotProps={{
listbox: {
ref: listboxRef,
onScroll: (e) => {
if (listboxRef.current) {
scrollPositionRef.current = e.target.scrollTop;
}
},
},
}}
renderOption={(props, option) => {
const { key, ...optionProps } = props;
return (
Expand Down
97 changes: 97 additions & 0 deletions src/components/CippComponents/CippSponsor.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
import { useMemo } from "react";
import { Box, Divider, Tooltip, Typography } from "@mui/material";
import { useSettings } from "../../hooks/use-settings";
import sponsorsData from "../../data/sponsors.json";

// Filter sponsors by date (runs once on module load)
const getActiveSponsors = () => {
const now = new Date();
return sponsorsData.filter((sponsor) => {
if (!sponsor.startDate && !sponsor.endDate) {
return true;
}
const startDate = sponsor.startDate ? new Date(sponsor.startDate) : null;
const endDate = sponsor.endDate ? new Date(sponsor.endDate) : null;
const afterStart = !startDate || now >= startDate;
const beforeEnd = !endDate || now <= endDate;
return afterStart && beforeEnd;
});
};

// Select random sponsor based on priority (runs once on module load)
const selectRandomSponsor = (sponsors) => {
if (sponsors.length === 0) return null;

let totalPriority = 0;
for (let i = 0; i < sponsors.length; i++) {
totalPriority += sponsors[i].priority;
}
let random = Math.floor(Math.random() * totalPriority);
let runningTotal = 0;
for (let i = 0; i < sponsors.length; i++) {
runningTotal += sponsors[i].priority;
if (random < runningTotal) {
return sponsors[i];
}
}
return null;
};

const activeSponsors = getActiveSponsors();
const selectedSponsor = selectRandomSponsor(activeSponsors);

export const CippSponsor = () => {
const currentSettings = useSettings();
const theme = currentSettings?.currentTheme?.value;

// Get the appropriate image based on current theme
const randomimg = useMemo(() => {
if (!selectedSponsor) return null;
return {
link: selectedSponsor.link,
imagesrc: theme === "light" ? selectedSponsor.imagesrcLight : selectedSponsor.imagesrcDark,
altText: selectedSponsor.altText,
tooltip: selectedSponsor.tooltip,
};
}, [theme]);

// Don't render if no sponsors are available
if (!randomimg) {
return null;
}

return (
<>
<Divider />
<Typography
color="text.secondary"
variant="caption"
sx={{ lineHeight: 4, textAlign: "center" }}
>
This application is sponsored by
</Typography>
<Box
sx={{
display: "flex",
justifyContent: "center",
alignItems: "center",
height: "55px",
}}
>
<Tooltip title={randomimg.tooltip} arrow>
<img
src={randomimg.imagesrc}
alt={randomimg.altText}
style={{
cursor: "pointer",
maxHeight: "50px",
width: "auto",
maxWidth: "100px",
}}
onClick={() => window.open(randomimg.link)}
/>
</Tooltip>
</Box>
</>
);
};
Loading