fix: delete API when data has no category

This commit is contained in:
Aditya
2025-11-04 01:14:40 +05:30
parent 6ee810659c
commit 222899f189
+157 -154
View File
@@ -38,8 +38,8 @@ import {
Avatar, Avatar,
} from "@mui/material"; } from "@mui/material";
import { import {
DataGrid, DataGrid,
GridColDef, GridColDef,
} from '@mui/x-data-grid'; } from '@mui/x-data-grid';
@@ -70,15 +70,15 @@ import {
VisibilityOff as VisibilityOffIcon, VisibilityOff as VisibilityOffIcon,
Clear as ClearIcon, Clear as ClearIcon,
Add as AddIcon, Add as AddIcon,
Rocket as RocketIcon, Rocket as RocketIcon,
Webhook as WebhookIcon, Webhook as WebhookIcon,
Air as AirIcon, Air as AirIcon,
RocketLaunch as RocketLaunchIcon, RocketLaunch as RocketLaunchIcon,
Send as SendIcon, Send as SendIcon,
SmartToy as SmartToyIcon, SmartToy as SmartToyIcon,
Settings as SettingsIcon, Settings as SettingsIcon,
FilterAlt as FilterAltIcon, FilterAlt as FilterAltIcon,
CompareArrows as CompareArrowsIcon, CompareArrows as CompareArrowsIcon,
} from "@mui/icons-material"; } from "@mui/icons-material";
import { Context } from "../context/ContextApi.jsx"; import { Context } from "../context/ContextApi.jsx";
@@ -104,7 +104,7 @@ const useStyles = makeStyles({
}, },
}); });
// //
//const CacheView = (props) => { //const CacheView = (props) => {
const CacheView = memo((props) => { const CacheView = memo((props) => {
@@ -130,7 +130,7 @@ const CacheView = memo((props) => {
const [cursors, setCursors] = useState({ const [cursors, setCursors] = useState({
0: "", 0: "",
}) })
const [_, setUpdate] = useState(Math.random()) const [_, setUpdate] = useState(Math.random())
const [selectedRows, setSelectedRows] = useState([]); const [selectedRows, setSelectedRows] = useState([]);
// Direct category migration from ../components/Files.jsx // Direct category migration from ../components/Files.jsx
const [selectAllChecked, setSelectAllChecked] = React.useState(false) const [selectAllChecked, setSelectAllChecked] = React.useState(false)
@@ -170,7 +170,7 @@ const CacheView = memo((props) => {
"key": "workflow_id", "key": "workflow_id",
"value": "", "value": "",
}], }],
"icon": <AirIcon />, "icon": <AirIcon />,
"enabled": false, "enabled": false,
}, },
{ {
@@ -203,7 +203,7 @@ const CacheView = memo((props) => {
"key": "webhook_url", "key": "webhook_url",
"value": "", "value": "",
}], }],
"icon": <WebhookIcon />, "icon": <WebhookIcon />,
"enabled": false, "enabled": false,
}, },
@@ -237,7 +237,7 @@ const CacheView = memo((props) => {
const [categoryAutomations, setCategoryAutomations] = useState(defaultAutomation) const [categoryAutomations, setCategoryAutomations] = useState(defaultAutomation)
const [categoryConfig, setCategoryConfig] = useState(undefined) const [categoryConfig, setCategoryConfig] = useState(undefined)
const { themeMode, brandColor } = useContext(Context); const { themeMode, brandColor } = useContext(Context);
const theme = getTheme(themeMode, brandColor); const theme = getTheme(themeMode, brandColor);
const classes = useStyles(); const classes = useStyles();
@@ -312,9 +312,9 @@ const CacheView = memo((props) => {
useEffect(() => { useEffect(() => {
getWorkflows() getWorkflows()
getApps() getApps()
var chosenCategory = selectedCategory var chosenCategory = selectedCategory
const urlParams = new URLSearchParams(window.location.search) const urlParams = new URLSearchParams(window.location.search)
const categoryParam = urlParams.get("category") const categoryParam = urlParams.get("category")
if (categoryParam && categoryParam !== undefined && categoryParam !== "default" && categoryParam !== "") { if (categoryParam && categoryParam !== undefined && categoryParam !== "default" && categoryParam !== "") {
@@ -335,7 +335,7 @@ const CacheView = memo((props) => {
if (event.key === 'Escape'){ // not working for some reasons if (event.key === 'Escape'){ // not working for some reasons
console.log('escape pressed') console.log('escape pressed')
setRenderTextBox(false); setRenderTextBox(false);
} }
} }
@@ -359,7 +359,7 @@ const CacheView = memo((props) => {
if (page !== undefined && page !== null && page >= 0) { if (page !== undefined && page !== null && page >= 0) {
if (cursors[page-1] !== undefined && cursors[page-1] !== null && cursors[page-1] !== "") { if (cursors[page-1] !== undefined && cursors[page-1] !== null && cursors[page-1] !== "") {
url += "&cursor=" + cursors[page-1] url += "&cursor=" + cursors[page-1]
} }
} }
@@ -405,8 +405,8 @@ const CacheView = memo((props) => {
} }
// Especially important during first load // Especially important during first load
if (index < 2 && (category === "default" || category === "" || category === undefined)) { if (index < 2 && (category === "default" || category === "" || category === undefined)) {
// If it exists and isn't blank/default, load it // If it exists and isn't blank/default, load it
const urlParams = new URLSearchParams(window.location.search); const urlParams = new URLSearchParams(window.location.search);
const categoryParam = urlParams.get("category"); const categoryParam = urlParams.get("category");
if (categoryParam && categoryParam !== undefined && categoryParam !== "default" && categoryParam !== "") { if (categoryParam && categoryParam !== undefined && categoryParam !== "default" && categoryParam !== "") {
@@ -414,7 +414,7 @@ const CacheView = memo((props) => {
if (index === undefined || index === null) { if (index === undefined || index === null) {
index = 0 index = 0
} }
listOrgCache(orgId, categoryParam, index+1, amount, page) listOrgCache(orgId, categoryParam, index+1, amount, page)
} else { } else {
setSelectedCategory("default"); setSelectedCategory("default");
@@ -478,10 +478,10 @@ const CacheView = memo((props) => {
} else { } else {
setCategoryAutomations(defaultAutomation) setCategoryAutomations(defaultAutomation)
} }
} }
} else { } else {
//toast.warn("Failed to load keys. Please try again or contact support@shuffler if this persists.") //toast.warn("Failed to load keys. Please try again or contact support@shuffler if this persists.")
if (category !== undefined && category !== null && category !== "" && category !== "default") { if (category !== undefined && category !== null && category !== "" && category !== "default") {
toast.info(`No keys to load in category ${category}`) toast.info(`No keys to load in category ${category}`)
setSelectedCategory(category) setSelectedCategory(category)
@@ -495,6 +495,9 @@ const CacheView = memo((props) => {
const deleteEntry = (orgId, key, itemCategory, refreshList) => { const deleteEntry = (orgId, key, itemCategory, refreshList) => {
console.log(`Deleting entry for orgId: ${orgId}, key: ${key}, category: ${itemCategory}`);
const method = "POST" const method = "POST"
const url = `${globalUrl}/api/v1/orgs/${orgId}/delete_cache` const url = `${globalUrl}/api/v1/orgs/${orgId}/delete_cache`
var parsed = { var parsed = {
@@ -534,8 +537,8 @@ const CacheView = memo((props) => {
}; };
const editOrgCache = (orgId) => { const editOrgCache = (orgId) => {
var entry = { var entry = {
key: dataValue.key, key: dataValue.key,
value: value, value: value,
category: selectedCategory, category: selectedCategory,
} }
@@ -587,10 +590,10 @@ const CacheView = memo((props) => {
}; };
const addOrgCache = (orgId) => { const addOrgCache = (orgId) => {
const cache = { const cache = {
key: key, key: key,
value: value, value: value,
category: selectedCategory, category: selectedCategory,
} }
setCacheInput([cache]); setCacheInput([cache]);
@@ -709,7 +712,7 @@ const CacheView = memo((props) => {
fullWidth={true} fullWidth={true}
autoComplete="Key" autoComplete="Key"
placeholder="abc" placeholder="abc"
id="keyfield" id="keyfield"
margin="normal" margin="normal"
variant="outlined" variant="outlined"
value={editCache ? dataValue.key : key} value={editCache ? dataValue.key : key}
@@ -728,7 +731,7 @@ const CacheView = memo((props) => {
autoFixJson(value) autoFixJson(value)
}} }}
> >
<AutoFixNormalIcon /> <AutoFixNormalIcon />
</IconButton> </IconButton>
</Tooltip> </Tooltip>
</div> </div>
@@ -758,7 +761,7 @@ const CacheView = memo((props) => {
/> />
{editCache ? {editCache ?
<div> <div>
<Typography variant="body2" color="textSecondary" style={{ marginTop: 10, }}> <Typography variant="body2" color="textSecondary" style={{ marginTop: 10, }}>
Created: {timestamp(dataValue?.created)} Created: {timestamp(dataValue?.created)}
@@ -841,7 +844,7 @@ const CacheView = memo((props) => {
} }
}; };
const changeDistribution = (id, selectedSubOrg) => { const changeDistribution = (id, selectedSubOrg) => {
editFileConfig(id, [...new Set(selectedSubOrg)], selectedCategory) editFileConfig(id, [...new Set(selectedSubOrg)], selectedCategory)
} }
@@ -855,8 +858,8 @@ const CacheView = memo((props) => {
category: category === undefined || category === "" || category === "default" ? "" : category, category: category === undefined || category === "" || category === "default" ? "" : category,
} }
console.log("data: ", data); console.log("data: ", data);
const url = `${globalUrl}/api/v1/orgs/${orgId}/cache/config`; const url = `${globalUrl}/api/v1/orgs/${orgId}/cache/config`;
fetch(url, { fetch(url, {
@@ -989,7 +992,7 @@ const CacheView = memo((props) => {
const originalIcon = automation.icon const originalIcon = automation.icon
if (typeof automation.icon !== "string") { if (typeof automation.icon !== "string") {
automation.icon = ""; automation.icon = "";
} }
}) })
const url = `${globalUrl}/api/v2/datastore/automate` const url = `${globalUrl}/api/v2/datastore/automate`
@@ -999,7 +1002,7 @@ const CacheView = memo((props) => {
} }
if (settings !== undefined && settings !== null && Object.keys(settings).length > 0) { if (settings !== undefined && settings !== null && Object.keys(settings).length > 0) {
data["settings"] = settings data["settings"] = settings
} }
fetch(url, { fetch(url, {
@@ -1049,7 +1052,7 @@ const CacheView = memo((props) => {
} }
} }
const runSave = () => { const runSave = () => {
setUpdated(false) setUpdated(false)
const newAutomations = [...categoryAutomations] const newAutomations = [...categoryAutomations]
@@ -1062,11 +1065,11 @@ const CacheView = memo((props) => {
} }
return ( return (
<div key={index} style={{ <div key={index} style={{
marginBottom: 10, marginBottom: 10,
backgroundColor: hovered ? theme.palette.hoverColor : "transparent", backgroundColor: hovered ? theme.palette.hoverColor : "transparent",
paddingTop: 5, paddingTop: 5,
}} }}
onMouseEnter={() => setHovered(true)} onMouseEnter={() => setHovered(true)}
onMouseLeave={() => setHovered(false)} onMouseLeave={() => setHovered(false)}
> >
@@ -1085,15 +1088,15 @@ const CacheView = memo((props) => {
setUpdatedAutomation(updatedAutomation) setUpdatedAutomation(updatedAutomation)
setUpdated(true) setUpdated(true)
setUpdate(Math.random()) setUpdate(Math.random())
}} }}
/> />
</Tooltip> </Tooltip>
<div <div
style={{ style={{
display: "flex", display: "flex",
cursor: !automation?.disabled ? "pointer" : "not-allowed", cursor: !automation?.disabled ? "pointer" : "not-allowed",
width: "100%", width: "100%",
}} }}
disabled={automation?.disabled === true} disabled={automation?.disabled === true}
onClick={() => { onClick={() => {
@@ -1109,30 +1112,30 @@ const CacheView = memo((props) => {
} }
}} }}
> >
{typeof automation?.icon === "string" && automation?.icon?.length > 0 ? {typeof automation?.icon === "string" && automation?.icon?.length > 0 ?
<img src={automation.icon} alt={automation.name} style={{ width: 20, height: 20, }} /> <img src={automation.icon} alt={automation.name} style={{ width: 20, height: 20, }} />
: :
automation.icon automation.icon
} }
<Typography variant="body1" style={{ <Typography variant="body1" style={{
color: automation?.disabled === true ? theme.palette.text.secondary : theme.palette.text.primary, color: automation?.disabled === true ? theme.palette.text.secondary : theme.palette.text.primary,
marginLeft: 10, marginLeft: 10,
}}> }}>
{automation.name} {automation.name}
</Typography> </Typography>
</div> </div>
{automation?.disabled !== true ? {automation?.disabled !== true ?
<Button <Button
style={{ style={{
borderRadius: theme.palette.borderRadius, borderRadius: theme.palette.borderRadius,
textTransform: 'none', textTransform: 'none',
color: updated ? theme.palette.primary.main : theme.palette.text.secondary, color: updated ? theme.palette.primary.main : theme.palette.text.secondary,
marginTop: -6, marginTop: -6,
position: "absolute", position: "absolute",
right: 25, right: 25,
}} }}
disabled={!updated} disabled={!updated}
onClick={(e) => { onClick={(e) => {
@@ -1187,7 +1190,7 @@ const CacheView = memo((props) => {
if (newValue.length > 0) { if (newValue.length > 0) {
updatedAutomation.enabled = true updatedAutomation.enabled = true
} else { } else {
updatedAutomation.enabled = false updatedAutomation.enabled = false
} }
updatedAutomation.options[optionIndex] = option updatedAutomation.options[optionIndex] = option
@@ -1241,8 +1244,8 @@ const CacheView = memo((props) => {
value={data} value={data}
> >
<Typography style={{ <Typography style={{
display: "flex", display: "flex",
marginTop: 5, marginTop: 5,
color: keyfound ? red : theme.palette.text.primary, color: keyfound ? red : theme.palette.text.primary,
}}> }}>
<div style={{marginRight: 10, }}> <div style={{marginRight: 10, }}>
@@ -1296,7 +1299,7 @@ const CacheView = memo((props) => {
/> />
) )
} else if (option?.key === "workflow_id") { } else if (option?.key === "workflow_id") {
return ( return (
<Autocomplete <Autocomplete
key={optionIndex} key={optionIndex}
@@ -1323,7 +1326,7 @@ const CacheView = memo((props) => {
if (newValue.length > 0) { if (newValue.length > 0) {
updatedAutomation.enabled = true updatedAutomation.enabled = true
} else { } else {
updatedAutomation.enabled = false updatedAutomation.enabled = false
} }
updatedAutomation.options[optionIndex] = option updatedAutomation.options[optionIndex] = option
@@ -1435,8 +1438,8 @@ const CacheView = memo((props) => {
fullWidth fullWidth
style={{ style={{
...theme.palette.textFieldStyle, ...theme.palette.textFieldStyle,
marginBottom: 20, marginBottom: 20,
marginTop: 10, marginTop: 10,
}} }}
InputProps={{ InputProps={{
style: { style: {
@@ -1448,9 +1451,9 @@ const CacheView = memo((props) => {
defaultValue={option.value} defaultValue={option.value}
onBlur={(e) => { onBlur={(e) => {
if (e.target.value === "") { if (e.target.value === "") {
updatedAutomation.enabled = false updatedAutomation.enabled = false
} else { } else {
updatedAutomation.enabled = true updatedAutomation.enabled = true
} }
updatedAutomation.options[optionIndex].value = e.target.value; updatedAutomation.options[optionIndex].value = e.target.value;
@@ -1468,7 +1471,7 @@ const CacheView = memo((props) => {
const setCategorySettingsField = (field, value) => { const setCategorySettingsField = (field, value) => {
// Check if categoryConfig.settings is set or not. Otherwise set it. // Check if categoryConfig.settings is set or not. Otherwise set it.
var categoryConfig2 = categoryConfig var categoryConfig2 = categoryConfig
if (categoryConfig === undefined || categoryConfig === null) { if (categoryConfig === undefined || categoryConfig === null) {
categoryConfig2 = {} categoryConfig2 = {}
} }
@@ -1481,16 +1484,16 @@ const CacheView = memo((props) => {
setCategoryConfig(categoryConfig2) setCategoryConfig(categoryConfig2)
saveAutomation( saveAutomation(
categoryAutomations, categoryAutomations,
categoryConfig2.settings, categoryConfig2.settings,
) )
} }
const columns: GridColDef<(typeof rows)[number]>[] = [ const columns: GridColDef<(typeof rows)[number]>[] = [
{ {
field: 'key', field: 'key',
headerName: 'Key', headerName: 'Key',
width: 200, width: 200,
filterable: true, filterable: true,
sortable: true, sortable: true,
}, },
@@ -1502,10 +1505,10 @@ const CacheView = memo((props) => {
renderCell: (props) => { renderCell: (props) => {
const data = props.row const data = props.row
if (data?.category?.toLowerCase() === "protected") { if (data?.category?.toLowerCase() === "protected") {
return ( return (
<Typography <Typography
variant="body2" variant="body2"
type="password" type="password"
style={{maxHeight: 200, overflow: "hidden", }} style={{maxHeight: 200, overflow: "hidden", }}
> >
@@ -1532,7 +1535,7 @@ const CacheView = memo((props) => {
backgroundColor: theme.palette.platformColor, backgroundColor: theme.palette.platformColor,
border: theme.palette.defaultBorder, border: theme.palette.defaultBorder,
padding: 5, padding: 5,
minWidth: 500, minWidth: 500,
maxHeight: 500, maxHeight: 500,
overflowY: "auto", overflowY: "auto",
}} }}
@@ -1605,16 +1608,16 @@ const CacheView = memo((props) => {
style={{ style={{
color: "white", color: "white",
backgroundColor: iconDetails?.iconBackgroundColor || theme.palette.primary.secondary, backgroundColor: iconDetails?.iconBackgroundColor || theme.palette.primary.secondary,
marginLeft: 15, marginLeft: 15,
height: 30, height: 30,
width: 30, width: 30,
cursor: data.category !== "" && data.category !== "default" ? "pointer" : "default", cursor: data.category !== "" && data.category !== "default" ? "pointer" : "default",
}} }}
variant="rounded" variant="rounded"
> >
{iconDetails?.originalIcon ? {iconDetails?.originalIcon ?
iconDetails?.originalIcon iconDetails?.originalIcon
: :
avatarLetter avatarLetter
} }
</Avatar> </Avatar>
@@ -1633,7 +1636,7 @@ const CacheView = memo((props) => {
renderCell: (props) => { renderCell: (props) => {
const data = props.row const data = props.row
return ( return (
<span style={{ display: "flex" }}> <span style={{ display: "flex" }}>
{data?.workflow_id === "" || data?.workflow_id === null || data?.workflow_id === undefined || data?.workflow_id?.length !== 36 ? {data?.workflow_id === "" || data?.workflow_id === null || data?.workflow_id === undefined || data?.workflow_id?.length !== 36 ?
<IconButton <IconButton
@@ -1643,7 +1646,7 @@ const CacheView = memo((props) => {
<OpenInNewIcon <OpenInNewIcon
style={{ style={{
color: color:
data.workflow_id?.length === 36 data.workflow_id?.length === 36
? "#FF8444" ? "#FF8444"
: "grey", : "grey",
}} }}
@@ -1697,7 +1700,7 @@ const CacheView = memo((props) => {
onClick={(e) => { onClick={(e) => {
e.preventDefault() e.preventDefault()
e.stopPropagation() e.stopPropagation()
// Try to make the value JSON indented // Try to make the value JSON indented
const valid = validateJson(data.value) const valid = validateJson(data.value)
var newvalue = data.value var newvalue = data.value
if (valid.valid) { if (valid.valid) {
@@ -1867,23 +1870,23 @@ const CacheView = memo((props) => {
const isAutomating = categoryAutomations?.find((automation) => automation.enabled) !== undefined const isAutomating = categoryAutomations?.find((automation) => automation.enabled) !== undefined
return ( return (
<div style={{ <div style={{
minHeight: 2000, minHeight: 2000,
height: isSelectedDataStore?"100%":null, height: isSelectedDataStore?"100%":null,
paddingBottom: isSelectedDataStore?null:250, paddingBottom: isSelectedDataStore?null:250,
boxSizing: "border-box", boxSizing: "border-box",
width: isSelectedDataStore? "100%" :null, width: isSelectedDataStore? "100%" :null,
transition: "width 0.3s ease", transition: "width 0.3s ease",
padding:isSelectedDataStore?"27px 10px 27px 27px":null, padding:isSelectedDataStore?"27px 10px 27px 27px":null,
color: isSelectedDataStore?'#ffffff':null, color: isSelectedDataStore?'#ffffff':null,
backgroundColor: isSelectedDataStore? theme.palette.platformColor :null, backgroundColor: isSelectedDataStore? theme.palette.platformColor :null,
borderTopRightRadius: isSelectedDataStore?'8px':null, borderTopRightRadius: isSelectedDataStore?'8px':null,
borderBottomRightRadius: isSelectedDataStore?'8px':null, borderBottomRightRadius: isSelectedDataStore?'8px':null,
borderLeft: theme.palette.defaultBorder borderLeft: theme.palette.defaultBorder
}}> }}>
{modalView} {modalView}
<CollectIngestModal <CollectIngestModal
globalUrl={globalUrl} globalUrl={globalUrl}
open={showCollectIngestMenu} open={showCollectIngestMenu}
setOpen={setShowCollectIngestMenu} setOpen={setShowCollectIngestMenu}
@@ -1906,14 +1909,14 @@ const CacheView = memo((props) => {
Shuffle Datastore Shuffle Datastore
</Typography> </Typography>
{userdata?.support === true ? {userdata?.support === true ?
<Tooltip title={"Collect (support only)"} style={{}} aria-label={""}> <Tooltip title={"Collect (support only)"} style={{}} aria-label={""}>
<span style={{position: "absolute", right: 0, }}> <span style={{position: "absolute", right: 0, }}>
<Button <Button
style={{ style={{
whiteSpace: "nowrap", whiteSpace: "nowrap",
height: 35, height: 35,
textTransform: 'none', textTransform: 'none',
//border: isAutomating ? `1px solid ${theme.palette.primary.main}` : null, //border: isAutomating ? `1px solid ${theme.palette.primary.main}` : null,
}} }}
@@ -1924,10 +1927,10 @@ const CacheView = memo((props) => {
}} }}
> >
<FilterAltIcon style={{marginRight: 10, }}/> <FilterAltIcon style={{marginRight: 10, }}/>
Collect (beta) Collect (beta)
</Button> </Button>
</span> </span>
</Tooltip> </Tooltip>
: null} : null}
</div> </div>
@@ -1957,14 +1960,14 @@ const CacheView = memo((props) => {
style={{textTransform: isSelectedDataStore ? 'capitalize':null, width : isSelectedDataStore ? 120 : null, height:isSelectedDataStore?40:null}} style={{textTransform: isSelectedDataStore ? 'capitalize':null, width : isSelectedDataStore ? 120 : null, height:isSelectedDataStore?40:null}}
variant="contained" variant="contained"
color="primary" color="primary"
onClick={() =>{ onClick={() =>{
setEditCache(false) setEditCache(false)
setModalOpen(true) setModalOpen(true)
setValue("") setValue("")
}} }}
> >
Add Key Add Key
</Button> </Button>
<Button <Button
style={{ marginRight: 15, width:isSelectedDataStore ? 81:null, height:isSelectedDataStore?40:null, }} style={{ marginRight: 15, width:isSelectedDataStore ? 81:null, height:isSelectedDataStore?40:null, }}
@@ -2038,9 +2041,9 @@ const CacheView = memo((props) => {
<MenuItem <MenuItem
key={index} key={index}
value={data} value={data}
style={{ style={{
color: theme.palette.textFieldStyle.color, color: theme.palette.textFieldStyle.color,
display: "flex", display: "flex",
borderBottom: theme.palette.defaultBorder, borderBottom: theme.palette.defaultBorder,
}} }}
> >
@@ -2061,17 +2064,17 @@ const CacheView = memo((props) => {
) : null} ) : null}
<div style={{display: "inline-flex", position:"relative", top: 8}}> <div style={{display: "inline-flex", position:"relative", top: 8}}>
{renderTextBox ? {renderTextBox ?
<Tooltip title={"Close"} style={{}} aria-label={""}> <Tooltip title={"Close"} style={{}} aria-label={""}>
<Button <Button
style={{ style={{
height: 35, height: 35,
borderRadius: 4, borderRadius: 4,
textTransform: 'none', textTransform: 'none',
fontSize: 16, fontSize: 16,
borderRadius: "0px 5px 5px 0px", borderRadius: "0px 5px 5px 0px",
marginRight: 10, marginRight: 10,
}} }}
color="secondary" color="secondary"
variant="contained" variant="contained"
@@ -2086,12 +2089,12 @@ const CacheView = memo((props) => {
: :
<Tooltip title={"Add or find category"} style={{}} aria-label={""}> <Tooltip title={"Add or find category"} style={{}} aria-label={""}>
<Button <Button
style={{ style={{
whiteSpace: "nowrap", whiteSpace: "nowrap",
width: datastoreCategories !== undefined && datastoreCategories !== null && datastoreCategories.length > 1 ? 50 : 169, width: datastoreCategories !== undefined && datastoreCategories !== null && datastoreCategories.length > 1 ? 50 : 169,
height: 35, height: 35,
textTransform: 'none', textTransform: 'none',
fontSize: 16, fontSize: 16,
borderRadius: "0px 5px 5px 0px", borderRadius: "0px 5px 5px 0px",
}} }}
@@ -2104,7 +2107,7 @@ const CacheView = memo((props) => {
<AddIcon/> <AddIcon/>
{datastoreCategories !== undefined && datastoreCategories !== null && datastoreCategories.length > 1 ? "" : "Category"} {datastoreCategories !== undefined && datastoreCategories !== null && datastoreCategories.length > 1 ? "" : "Category"}
</Button> </Button>
</Tooltip> </Tooltip>
} }
{renderTextBox && <TextField {renderTextBox && <TextField
@@ -2115,11 +2118,11 @@ const CacheView = memo((props) => {
const foundValue = event.target.value.trim(); const foundValue = event.target.value.trim();
if(event.key === 'Enter' && foundValue?.length > 0){ if(event.key === 'Enter' && foundValue?.length > 0){
setUpdateToThisCategory(event.target.value) setUpdateToThisCategory(event.target.value)
listOrgCache(orgId, event.target.value, 0, pageSize, 0) listOrgCache(orgId, event.target.value, 0, pageSize, 0)
setPage(0) setPage(0)
} }
}} }}
style={{ style={{
height: 35, height: 35,
@@ -2151,10 +2154,10 @@ const CacheView = memo((props) => {
<Tooltip title={"Automate current Category"} style={{}} aria-label={""}> <Tooltip title={"Automate current Category"} style={{}} aria-label={""}>
<span> <span>
<Button <Button
style={{ style={{
whiteSpace: "nowrap", whiteSpace: "nowrap",
height: 35, height: 35,
textTransform: 'none', textTransform: 'none',
border: isAutomating ? `1px solid ${theme.palette.primary.main}` : null, border: isAutomating ? `1px solid ${theme.palette.primary.main}` : null,
}} }}
@@ -2162,27 +2165,27 @@ const CacheView = memo((props) => {
color="secondary" color="secondary"
disabled={selectedCategory === undefined || selectedCategory === "" || selectedCategory === "default"} disabled={selectedCategory === undefined || selectedCategory === "" || selectedCategory === "default"}
onClick={() => { onClick={() => {
// Set up: // Set up:
// Workflow triggers for when a key is added/edited/deleted. // Workflow triggers for when a key is added/edited/deleted.
// Automatic ingest mechanisms: // Automatic ingest mechanisms:
// - IOCs (monitor URLs) // - IOCs (monitor URLs)
// - Singul ingest // - Singul ingest
setShowAutomationMenu(true) setShowAutomationMenu(true)
}} }}
> >
{isAutomating ? <RocketLaunchIcon style={{color: theme.palette.primary.main, marginRight: 10 }}/> : <RocketIcon style={{marginRight: 10, color: theme.palette.secondary.main, }} />} {isAutomating ? <RocketLaunchIcon style={{color: theme.palette.primary.main, marginRight: 10 }}/> : <RocketIcon style={{marginRight: 10, color: theme.palette.secondary.main, }} />}
Automate (beta) Automate (beta)
</Button> </Button>
</span> </span>
</Tooltip> </Tooltip>
<Tooltip title={"Other category settings"} style={{}} aria-label={""}> <Tooltip title={"Other category settings"} style={{}} aria-label={""}>
<Button <Button
style={{ style={{
whiteSpace: "nowrap", whiteSpace: "nowrap",
height: 35, height: 35,
textTransform: 'none', textTransform: 'none',
marginLeft: 3, marginLeft: 3,
}} }}
variant="outlined" variant="outlined"
color="secondary" color="secondary"
@@ -2193,10 +2196,10 @@ const CacheView = memo((props) => {
> >
<SettingsIcon style={{color: theme.palette.secondary.main, }} /> <SettingsIcon style={{color: theme.palette.secondary.main, }} />
</Button> </Button>
</Tooltip> </Tooltip>
</ButtonGroup> </ButtonGroup>
{showAutomationMenu || showSettingsMenu ? {showAutomationMenu || showSettingsMenu ?
<Dialog <Dialog
open={showAutomationMenu || showSettingsMenu} open={showAutomationMenu || showSettingsMenu}
onClose={() => { onClose={() => {
@@ -2227,7 +2230,7 @@ const CacheView = memo((props) => {
<DialogTitle> <DialogTitle>
</DialogTitle> </DialogTitle>
<DialogContent style={{ paddingLeft: "30px", paddingRight: '30px', backgroundColor: theme.palette.DialogStyle.backgroundColor, }}> <DialogContent style={{ paddingLeft: "30px", paddingRight: '30px', backgroundColor: theme.palette.DialogStyle.backgroundColor, }}>
{showSettingsMenu === true ? {showSettingsMenu === true ?
<div> <div>
<Typography variant="h6" style={{ color: theme.palette.text.primary, marginBottom: 20 }}> <Typography variant="h6" style={{ color: theme.palette.text.primary, marginBottom: 20 }}>
<SettingsIcon style={{ verticalAlign: "middle", marginRight: 10 }} /> <SettingsIcon style={{ verticalAlign: "middle", marginRight: 10 }} />
@@ -2237,7 +2240,7 @@ const CacheView = memo((props) => {
<div style={{display: "flex", marginTop: 50, }}> <div style={{display: "flex", marginTop: 50, }}>
<div style={{flex: 2, }}> <div style={{flex: 2, }}>
<Typography variant="body1" style={{ color: theme.palette.text.primary, }}> <Typography variant="body1" style={{ color: theme.palette.text.primary, }}>
Timeout Timeout
</Typography> </Typography>
<Typography variant="body2" style={{ color: theme.palette.text.secondary, marginBottom: 20 }}> <Typography variant="body2" style={{ color: theme.palette.text.secondary, marginBottom: 20 }}>
You can set a timeout for the category. This will delete all keys in this category after the specified time. Timeout is in seconds and based on last <b>EDITED</b> time. You can set a timeout for the category. This will delete all keys in this category after the specified time. Timeout is in seconds and based on last <b>EDITED</b> time.
@@ -2266,7 +2269,7 @@ const CacheView = memo((props) => {
toast.info("Timeout must be a number. Setting to 0.") toast.info("Timeout must be a number. Setting to 0.")
} else { } else {
timeoutValue = parseInt(e.target.value, 10) timeoutValue = parseInt(e.target.value, 10)
if (timeoutValue < 60) { if (timeoutValue < 60) {
toast.info("Timeout must be between 60 seconds or more. Setting to 0.") toast.info("Timeout must be between 60 seconds or more. Setting to 0.")
} }
@@ -2283,7 +2286,7 @@ const CacheView = memo((props) => {
<div style={{display: "flex", marginTop: 25, }}> <div style={{display: "flex", marginTop: 25, }}>
<div style={{flex: 3, }}> <div style={{flex: 3, }}>
<Typography variant="body1" style={{ color: theme.palette.text.primary, }}> <Typography variant="body1" style={{ color: theme.palette.text.primary, }}>
{categoryConfig?.settings?.public === true ? "" : "NOT"} Public {categoryConfig?.settings?.public === true ? "" : "NOT"} Public
</Typography> </Typography>
<Typography variant="body2" style={{ color: theme.palette.text.secondary, marginBottom: 20 }}> <Typography variant="body2" style={{ color: theme.palette.text.secondary, marginBottom: 20 }}>
This will make the url for this category public. Metadata will be cleared, except for timestamps. Types: keys,ndjson,csv,values,json,meta This will make the url for this category public. Metadata will be cleared, except for timestamps. Types: keys,ndjson,csv,values,json,meta
@@ -2330,7 +2333,7 @@ const CacheView = memo((props) => {
When When
</Typography> </Typography>
<Typography variant="body1" style={{ color: theme.palette.text.primary, marginBottom: 20 }}> <Typography variant="body1" style={{ color: theme.palette.text.primary, marginBottom: 20 }}>
A key is edited A key is edited
</Typography> </Typography>
<Typography variant="body2" style={{ color: theme.palette.text.secondary, marginTop: 100, marginBottom: 20 }}> <Typography variant="body2" style={{ color: theme.palette.text.secondary, marginTop: 100, marginBottom: 20 }}>
@@ -2339,16 +2342,16 @@ const CacheView = memo((props) => {
{categoryAutomations.map((automation, index) => { {categoryAutomations.map((automation, index) => {
return ( return (
<AutomationOptions <AutomationOptions
key={index} key={index}
automation={automation} automation={automation}
index={index} index={index}
/> />
) )
})} })}
</div> </div>
} }
</DialogContent> </DialogContent>
</Dialog> </Dialog>
: null} : null}
@@ -2374,17 +2377,17 @@ const CacheView = memo((props) => {
setSelectedRows(newSelection); setSelectedRows(newSelection);
}} }}
keepNonExistentRowsSelected={false} keepNonExistentRowsSelected={false}
getRowId={(row) => `${row?.key}_${row?.category}`} getRowId={(row) => row?.category ? `${row.key}_${row.category}` : row.key}
autoHeight={true} autoHeight={true}
sx={{ sx={{
marginTop: 1, marginTop: 1,
height: listCache.length*52+500, height: listCache.length*52+500,
width: "100%", width: "100%",
'.MuiTablePagination-selectLabel, .MuiTablePagination-select, .MuiTablePagination-selectIcon': { '.MuiTablePagination-selectLabel, .MuiTablePagination-select, .MuiTablePagination-selectIcon': {
display: 'none', display: 'none',
}, },
marginBottom: 20, marginBottom: 20,
}} }}
loading={cachedLoaded === false} loading={cachedLoaded === false}
@@ -2404,7 +2407,7 @@ const CacheView = memo((props) => {
setCursors({ setCursors({
0: "", 0: "",
}) })
}} }}
@@ -2441,20 +2444,20 @@ const CacheView = memo((props) => {
}} }}
> >
<div style={{ <div style={{
width: 1200, width: 1200,
margin: "auto", margin: "auto",
padding: 10, padding: 10,
backgroundColor: theme.palette.platformColor, backgroundColor: theme.palette.platformColor,
borderRadius: 4, borderRadius: 4,
border: "1px solid rgba(255, 255, 255, 0.5)", border: "1px solid rgba(255, 255, 255, 0.5)",
display: "flex", display: "flex",
textAlign: "center", textAlign: "center",
}}> }}>
<Typography variant="body2" style={{ color: theme.palette.text.primary, marginRight: 50, marginTop: 6, marginLeft: 350, }}> <Typography variant="body2" style={{ color: theme.palette.text.primary, marginRight: 50, marginTop: 6, marginLeft: 350, }}>
{page * pageSize + 1} - {Math.min((page + 1) * pageSize, totalAmount)} of {totalAmount} {page * pageSize + 1} - {Math.min((page + 1) * pageSize, totalAmount)} of {totalAmount}
</Typography> </Typography>
<Pagination <Pagination
count={Number.parseInt(totalAmount/pageSize)} count={Number.parseInt(totalAmount/pageSize)}
page={page+1} page={page+1}
@@ -2462,7 +2465,7 @@ const CacheView = memo((props) => {
var disabled = false var disabled = false
if (item?.type === "page") { if (item?.type === "page") {
if (cursors[item.page-1] === undefined) { if (cursors[item.page-1] === undefined) {
disabled = true disabled = true
} }
} }
if (item?.type === "previous") { if (item?.type === "previous") {
@@ -2470,7 +2473,7 @@ const CacheView = memo((props) => {
} }
if (cachedLoaded === false) { if (cachedLoaded === false) {
disabled = true disabled = true
} }
return ( return (
@@ -2530,10 +2533,10 @@ const CacheView = memo((props) => {
variant={"outlined"} variant={"outlined"}
color="secondary" color="secondary"
> >
<DeleteOutlineIcon <DeleteOutlineIcon
style={{ style={{
color: red, color: red,
marginRight: 10, marginRight: 10,
}} }}
/> />
Delete {selectedRows.length} Key{ selectedRows.length > 1 ? "s" : "" } Delete {selectedRows.length} Key{ selectedRows.length > 1 ? "s" : "" }