Sync
This commit is contained in:
@@ -238,7 +238,7 @@ const Admin2 = (props) => {
|
||||
const data = {
|
||||
name: name,
|
||||
description: description,
|
||||
org_id: orgId,
|
||||
org_id: orgId?.length > 0 ? orgId : selectedOrganization?.id,
|
||||
image: image,
|
||||
defaults: defaults,
|
||||
sso_config: sso_config,
|
||||
@@ -263,6 +263,7 @@ const Admin2 = (props) => {
|
||||
if (responseJson["success"] === false) {
|
||||
toast("Failed updating org: ", responseJson.reason);
|
||||
} else {
|
||||
handleGetOrg(selectedOrganization?.id);
|
||||
if (
|
||||
lead_info === undefined ||
|
||||
lead_info === null ||
|
||||
@@ -329,7 +330,7 @@ const Admin2 = (props) => {
|
||||
}
|
||||
|
||||
return (
|
||||
<div style={{ display: 'flex', justifyContent: 'center', paddingTop: 29, zoom: 0.8, }}>
|
||||
<div style={{ display: 'flex', justifyContent: 'center', paddingTop: 29, zoom: 0.9}}>
|
||||
<AdminNavBar userdata={userdata} isLoaded={isLoaded} selectedStatus={selectedStatus} setSelectedStatus={setSelectedStatus} selectedTab={selectedTab} orgId={selectedOrganization.id} handleStatusChange={handleStatusChange} handleEditOrg={handleEditOrg} handleGetOrg={handleGetOrg} setSelectedOrganization={setSelectedOrganization} selectedOrganization={selectedOrganization} setNotifications={setNotifications} stripeKey={stripeKey} notifications={notifications} checkLogin={checkLogin} globalUrl={globalUrl} isCloud={isCloud} serverside={serverside} />
|
||||
</div>
|
||||
);
|
||||
|
||||
@@ -4859,7 +4859,7 @@ const releaseToConnectLabel = "Release to Connect"
|
||||
// This causes memory referencing to become a nightmare
|
||||
const data = event.target.data()
|
||||
if (data.app_name === "Shuffle Workflow") {
|
||||
if ((data.parameters !== undefined) && (data.parameters.length > 0)) {
|
||||
if ((data?.parameters !== undefined) && (data?.parameters?.length > 0)) {
|
||||
getWorkflowApps(data.parameters[0].value)
|
||||
}
|
||||
}
|
||||
@@ -10657,7 +10657,7 @@ const releaseToConnectLabel = "Release to Connect"
|
||||
|
||||
|
||||
return(
|
||||
<div style={{marginLeft: index !== 0 ? 5 : 0, }}>
|
||||
<div key={index} style={{marginLeft: index !== 0 ? 5 : 0, }}>
|
||||
<ParsedAppPaper small={true} action={trigger.name} app={JSON.parse(JSON.stringify(trigger))} />
|
||||
</div>
|
||||
)
|
||||
@@ -11200,7 +11200,7 @@ const releaseToConnectLabel = "Release to Connect"
|
||||
const minSize = 370
|
||||
var rightsidebarStyle = {
|
||||
position: "fixed",
|
||||
top: appBarSize - 35,
|
||||
top: workflow?.public && !isLoggedIn ? 100 : showWorkflowRevisions ? 100 : appBarSize - 35,
|
||||
right: 25,
|
||||
height: "90vh",
|
||||
maxWidth: 600,
|
||||
@@ -13218,7 +13218,7 @@ const releaseToConnectLabel = "Release to Connect"
|
||||
};
|
||||
|
||||
|
||||
if (Object.getOwnPropertyNames(selectedTrigger).length > 0) {
|
||||
if (Object.getOwnPropertyNames(selectedTrigger)?.length > 0) {
|
||||
if (workflow.triggers[selectedTriggerIndex] === undefined) {
|
||||
return null;
|
||||
}
|
||||
@@ -14378,7 +14378,7 @@ const releaseToConnectLabel = "Release to Connect"
|
||||
|
||||
// Special SCHEDULE handler
|
||||
var trigger_header_auth = ""
|
||||
if (Object.getOwnPropertyNames(selectedTrigger).length > 0 && workflow.triggers !== null && workflow.triggers !== undefined && workflow.triggers.length >= selectedTriggerIndex && workflow.triggers[selectedTriggerIndex] !== undefined ) {
|
||||
if (Object.getOwnPropertyNames(selectedTrigger)?.length > 0 && workflow?.triggers !== null && workflow?.triggers !== undefined && workflow?.triggers?.length >= selectedTriggerIndex && workflow?.triggers[selectedTriggerIndex] !== undefined ) {
|
||||
if (selectedTrigger.trigger_type === "SCHEDULE" && workflow.triggers[selectedTriggerIndex].parameters === undefined || workflow.triggers[selectedTriggerIndex].parameters === null) {
|
||||
console.log("Autofixing schedule")
|
||||
|
||||
@@ -14447,7 +14447,7 @@ const releaseToConnectLabel = "Release to Connect"
|
||||
if (
|
||||
workflow.triggers[selectedTriggerIndex].parameters === undefined ||
|
||||
workflow.triggers[selectedTriggerIndex].parameters === null ||
|
||||
workflow.triggers[selectedTriggerIndex].parameters.length === 0
|
||||
workflow?.triggers[selectedTriggerIndex]?.parameters?.length === 0
|
||||
) {
|
||||
workflow.triggers[selectedTriggerIndex].parameters = [];
|
||||
workflow.triggers[selectedTriggerIndex].parameters[0] = {
|
||||
@@ -14485,7 +14485,7 @@ const releaseToConnectLabel = "Release to Connect"
|
||||
}
|
||||
}
|
||||
|
||||
const WebhookSidebar = Object.getOwnPropertyNames(selectedTrigger).length === 0 || workflow.triggers[selectedTriggerIndex] === undefined || selectedTrigger.trigger_type !== "WEBHOOK" ? null :
|
||||
const WebhookSidebar =!selectedTrigger || Object.getOwnPropertyNames(selectedTrigger)?.length === 0 || !workflow?.triggers || workflow?.triggers[selectedTriggerIndex] === undefined || selectedTrigger?.trigger_type !== "WEBHOOK" ? null :
|
||||
<div style={appApiViewStyle}>
|
||||
<h3 style={{ marginBottom: "5px" }}>
|
||||
{selectedTrigger.app_name}: {selectedTrigger.status}
|
||||
@@ -14752,8 +14752,8 @@ const releaseToConnectLabel = "Release to Connect"
|
||||
</div>
|
||||
<TextField
|
||||
style={{
|
||||
backgroundColor: theme.palette.inputColor,
|
||||
borderRadius: theme.palette?.borderRadius,
|
||||
backgroundColor: theme.palette.textFieldStyle.backgroundColor,
|
||||
borderRadius: theme.palette.textFieldStyle.borderRadius,
|
||||
}}
|
||||
id="webhook_uri_field"
|
||||
onClick={() => {
|
||||
@@ -15217,7 +15217,7 @@ const releaseToConnectLabel = "Release to Connect"
|
||||
})
|
||||
}
|
||||
|
||||
const UserinputSidebar = Object.getOwnPropertyNames(selectedTrigger).length === 0 || workflow.triggers[selectedTriggerIndex] === undefined || selectedTrigger.trigger_type !== "USERINPUT" ? null :
|
||||
const UserinputSidebar = !selectedTrigger || Object.getOwnPropertyNames(selectedTrigger)?.length === 0 || !workflow?.triggers || !workflow?.triggers[selectedTriggerIndex] || !selectedTrigger.trigger_type || selectedTrigger.trigger_type !== "USERINPUT" ? null :
|
||||
<div style={appApiViewStyle}>
|
||||
<h3 style={{ marginBottom: "5px" }}>
|
||||
{selectedTrigger.app_name}
|
||||
@@ -15378,7 +15378,13 @@ const releaseToConnectLabel = "Release to Connect"
|
||||
label={<div style={{ color: "white" }}>SMS</div>}
|
||||
/>
|
||||
</FormGroup>
|
||||
{workflow.triggers[selectedTriggerIndex].parameters[2] !== undefined && workflow.triggers[selectedTriggerIndex].parameters[2].value.includes("subflow") ? (
|
||||
{workflow?.triggers &&
|
||||
workflow?.triggers[selectedTriggerIndex] &&
|
||||
workflow?.triggers[selectedTriggerIndex].parameters &&
|
||||
workflow?.triggers[selectedTriggerIndex].parameters[2] &&
|
||||
workflow?.triggers[selectedTriggerIndex].parameters[2].value &&
|
||||
workflow?.triggers[selectedTriggerIndex].parameters[2].value.includes("subflow")
|
||||
? (
|
||||
<div style={{ }}>
|
||||
{workflows === undefined ||
|
||||
workflows === null ||
|
||||
@@ -15506,9 +15512,13 @@ const releaseToConnectLabel = "Release to Connect"
|
||||
</div>
|
||||
) : null}
|
||||
|
||||
{workflow.triggers[selectedTriggerIndex].parameters[2] !==
|
||||
undefined &&
|
||||
workflow.triggers[selectedTriggerIndex].parameters[2].value.includes("email") ? (
|
||||
{workflow?.triggers &&
|
||||
workflow?.triggers[selectedTriggerIndex] &&
|
||||
workflow?.triggers[selectedTriggerIndex].parameters &&
|
||||
workflow?.triggers[selectedTriggerIndex].parameters[2] &&
|
||||
workflow?.triggers[selectedTriggerIndex].parameters[2].value &&
|
||||
workflow?.triggers[selectedTriggerIndex].parameters[2].value.includes("email")
|
||||
? (
|
||||
<TextField
|
||||
style={{
|
||||
backgroundColor: theme.palette.inputColor,
|
||||
@@ -15538,11 +15548,15 @@ const releaseToConnectLabel = "Release to Connect"
|
||||
/>
|
||||
) : null}
|
||||
|
||||
{workflow.triggers[selectedTriggerIndex].parameters[2] !==
|
||||
undefined &&
|
||||
workflow.triggers[
|
||||
selectedTriggerIndex
|
||||
].parameters[2].value.includes("sms") ? (
|
||||
{workflow?.triggers &&
|
||||
workflow?.triggers[selectedTriggerIndex] &&
|
||||
workflow?.triggers[selectedTriggerIndex].parameters &&
|
||||
workflow?.triggers[selectedTriggerIndex].parameters[2] &&
|
||||
workflow?.triggers[selectedTriggerIndex].parameters[2].value &&
|
||||
(
|
||||
workflow?.triggers[selectedTriggerIndex].parameters[2].value.includes("email") ||
|
||||
workflow?.triggers[selectedTriggerIndex].parameters[2].value.includes("sms")
|
||||
) ? (
|
||||
<TextField
|
||||
style={{
|
||||
backgroundColor: theme.palette.inputColor,
|
||||
@@ -15639,7 +15653,7 @@ const releaseToConnectLabel = "Release to Connect"
|
||||
selectedTrigger.environment = defaultEnvironment.Name
|
||||
setSelectedTrigger(selectedTrigger) }
|
||||
|
||||
const PipelineSidebar = Object.getOwnPropertyNames(selectedTrigger).length === 0 || workflow.triggers[selectedTriggerIndex] === undefined && selectedTrigger.trigger_type !== "SCHEDULE" ? null :
|
||||
const PipelineSidebar = !selectedTrigger || Object.getOwnPropertyNames(selectedTrigger)?.length === 0 || !workflow?.triggers || !workflow?.triggers[selectedTriggerIndex] || !selectedTrigger.trigger_type || selectedTrigger.trigger_type !== "SCHEDULE" ? null :
|
||||
<div style={appApiViewStyle}>
|
||||
<h3 style={{ marginBottom: "5px" }}>
|
||||
{selectedTrigger.app_name}: {selectedTrigger.status}
|
||||
@@ -15901,7 +15915,7 @@ const releaseToConnectLabel = "Release to Connect"
|
||||
</div>
|
||||
</div>
|
||||
|
||||
const ScheduleSidebar = Object.getOwnPropertyNames(selectedTrigger).length === 0 || workflow.triggers[selectedTriggerIndex] === undefined && selectedTrigger.trigger_type !== "SCHEDULE" ? null :
|
||||
const ScheduleSidebar = !selectedTrigger || Object.getOwnPropertyNames(selectedTrigger)?.length === 0 || !workflow?.triggers || !workflow?.triggers[selectedTriggerIndex] && (!selectedTrigger.trigger_type || selectedTrigger.trigger_type !== "SCHEDULE") ? null :
|
||||
<div style={appApiViewStyle}>
|
||||
<h3 style={{ marginBottom: "5px" }}>
|
||||
{selectedTrigger.app_name}: {selectedTrigger.status}
|
||||
@@ -16158,9 +16172,8 @@ const releaseToConnectLabel = "Release to Connect"
|
||||
position: "absolute",
|
||||
|
||||
top: isMobile ? 30 : 25,
|
||||
left: isMobile ? 20 : leftSideBarOpenByClick ? leftBarSize + 275 : leftBarSize+135,
|
||||
|
||||
transition: "left 0.3s ease",
|
||||
transform: isMobile ? "translateX(20px)" : `translateX(${leftBarSize}px)`,
|
||||
transition: "all 0.3s ease",
|
||||
zoom: 0.9,
|
||||
}
|
||||
|
||||
@@ -16922,7 +16935,7 @@ const releaseToConnectLabel = "Release to Connect"
|
||||
border: "1px solid rgba(255,255,255,0.1)",
|
||||
position: "absolute",
|
||||
bottom: 100,
|
||||
left: leftSideBarOpenByClick ? leftBarSize+300 : leftBarSize+115,
|
||||
left: leftSideBarOpenByClick ? leftBarSize+270 : leftBarSize+115,
|
||||
|
||||
color: "white",
|
||||
padding: 10,
|
||||
@@ -17374,8 +17387,8 @@ const releaseToConnectLabel = "Release to Connect"
|
||||
color="secondary"
|
||||
variant="text"
|
||||
style={{
|
||||
height: workflow.public ? 100 : buttonHeights,
|
||||
width: workflow.public ? 100 : 64,
|
||||
height: buttonHeights,
|
||||
width: 64,
|
||||
}}
|
||||
variant={
|
||||
lastSaved && !workflow.public ? "text" : "contained"
|
||||
@@ -17619,7 +17632,7 @@ const releaseToConnectLabel = "Release to Connect"
|
||||
defaultReturn = <CommentSidebar />
|
||||
} else if (Object.getOwnPropertyNames(selectedTrigger).length > 0) {
|
||||
if (selectedTrigger.trigger_type === undefined) {
|
||||
//defaultReturn = <UserinputSidebar />
|
||||
// defaultReturn = <UserinputSidebar />
|
||||
return null;
|
||||
} else {
|
||||
/*
|
||||
@@ -17776,7 +17789,7 @@ const releaseToConnectLabel = "Release to Connect"
|
||||
<Typography variant="body1" style={{ marginRight: 10, }}>
|
||||
Tags
|
||||
</Typography>
|
||||
<div style={{ display: "flex" }}>
|
||||
<div style={{ display: "flex", flexWrap: 'wrap', gap: 5, }}>
|
||||
{workflow.tags.map((tag, index) => {
|
||||
if (index >= 3) {
|
||||
return null;
|
||||
@@ -17958,9 +17971,8 @@ const releaseToConnectLabel = "Release to Connect"
|
||||
</Typography>
|
||||
<Button
|
||||
color="primary"
|
||||
variant="contained"
|
||||
fullWidth
|
||||
style={{ marginTop: 15, }}
|
||||
style={{ marginTop: 15, backgroundColor: "#ff8544", color: "#1a1a1a", fontSize: 16, textTransform: "none" }}
|
||||
onClick={() => {
|
||||
// Further checks are being done on the backend
|
||||
// Even if the user can "edit" a workflow on the frontend,
|
||||
@@ -17990,7 +18002,7 @@ const releaseToConnectLabel = "Release to Connect"
|
||||
variant="outlined"
|
||||
disabled={workflow.public !== true}
|
||||
fullWidth
|
||||
style={{ marginTop: 15, }}
|
||||
style={{ marginTop: 15, textTransform: "none", fontSize: 16}}
|
||||
onClick={() => {
|
||||
// setEditWorkflowDetails(true)
|
||||
// workflow.public = false
|
||||
@@ -20554,7 +20566,7 @@ const releaseToConnectLabel = "Release to Connect"
|
||||
);
|
||||
|
||||
const newView = (
|
||||
<div style={{ color: "white", marginLeft: leftSideBarOpenByClick ? 280 : 100, transition: "margin-left 0.3s ease", }}>
|
||||
<div style={{ color: "white", marginLeft: leftSideBarOpenByClick ? workflow?.public ? 210 : 250 : workflow?.public ? isLoggedIn ? 60 : 0 : isLoggedIn ? 100 : 0, transition: "margin-left 0.3s ease", overflow: 'hidden' }}>
|
||||
<div
|
||||
style={{ display: "flex", borderTop: "0px solid rgba(91, 96, 100, 1)" }}
|
||||
>
|
||||
@@ -20590,8 +20602,8 @@ const releaseToConnectLabel = "Release to Connect"
|
||||
maxZoom={2.0}
|
||||
wheelSensitivity={0.25}
|
||||
style={{
|
||||
width: cytoscapeWidth,
|
||||
height: bodyHeight - 5,
|
||||
width: workflow?.public && !isLoggedIn ? cytoscapeWidth + 50 : cytoscapeWidth ,
|
||||
height: workflow?.public && !isLoggedIn ? (bodyHeight - 50) : bodyHeight - 2,
|
||||
backgroundColor: theme.palette.surfaceColor,
|
||||
}}
|
||||
stylesheet={cystyle}
|
||||
@@ -20678,7 +20690,7 @@ const releaseToConnectLabel = "Release to Connect"
|
||||
{/* Most important: Actions. But these are a lot more complex */}
|
||||
{rightSideBarOpen && (selectedTrigger.trigger_type === "SCHEDULE" || selectedTrigger.trigger_type === "WEBHOOK" || selectedTrigger.trigger_type === "PIPELINE" || selectedTrigger.trigger_type === "USERINPUT") ?
|
||||
<div id="rightside_actions" style={rightsidebarStyle}>
|
||||
{Object.getOwnPropertyNames(selectedTrigger).length > 0 ?
|
||||
{Object.getOwnPropertyNames(selectedTrigger)?.length > 0 ?
|
||||
selectedTrigger.trigger_type === "SCHEDULE" ?
|
||||
ScheduleSidebar
|
||||
: selectedTrigger.trigger_type === "PIPELINE" ?
|
||||
@@ -20693,7 +20705,7 @@ const releaseToConnectLabel = "Release to Connect"
|
||||
: null}
|
||||
|
||||
{
|
||||
rightSideBarOpen && selectedTrigger.trigger_type === "SUBFLOW"&& Object.getOwnPropertyNames(selectedTrigger).length > 0 ?
|
||||
rightSideBarOpen && selectedTrigger?.trigger_type === "SUBFLOW"&& Object.getOwnPropertyNames(selectedTrigger)?.length > 0 ?
|
||||
<div id="rightside_actions" style={rightsidebarStyle}>
|
||||
<SubflowSidebar/>
|
||||
</div> : null
|
||||
@@ -22033,6 +22045,7 @@ const releaseToConnectLabel = "Release to Connect"
|
||||
<Paper
|
||||
style={{padding: "15px 15px 15px 25px", minHeight: 105, maxHeight: 105, cursor: "pointer", backgroundColor: newrevision.edited === selectedVersion.edited ? "rgba(255,255,255,0.3)" : theme.palette.surfaceColor, border: showBorder === true ? `1px solid ${green}` : "1px solid rgba(255,255,255,0.3)", marginBottom: 10,
|
||||
}} onClick={(e) => {
|
||||
setRightSideBarOpen(false)
|
||||
if (newrevision.edited === selectedVersion.edited) {
|
||||
console.log("Same revision! No setting.")
|
||||
return
|
||||
|
||||
@@ -64,6 +64,7 @@ const inputColor = "#383B40";
|
||||
const bodyDivStyle = {
|
||||
margin: "auto",
|
||||
width: "900px",
|
||||
zoom: 0.8,
|
||||
};
|
||||
|
||||
const actionListStyle = {
|
||||
@@ -72,10 +73,11 @@ const actionListStyle = {
|
||||
paddingBottom: "10px",
|
||||
paddingTop: "10px",
|
||||
marginTop: "5px",
|
||||
backgroundColor: inputColor,
|
||||
display: "flex",
|
||||
color: "white",
|
||||
position: "relative",
|
||||
position: "relative",
|
||||
|
||||
backgroundColor: theme.palette.platformColor,
|
||||
};
|
||||
|
||||
const boxStyle = {
|
||||
@@ -89,7 +91,8 @@ const boxStyle = {
|
||||
paddingTop: "30px",
|
||||
display: "flex",
|
||||
flexDirection: "column",
|
||||
backgroundColor: surfaceColor,
|
||||
|
||||
backgroundColor: theme.palette.backgroundColor,
|
||||
};
|
||||
|
||||
const dividerStyle = {
|
||||
@@ -6191,7 +6194,7 @@ const AppCreator = (defaultprops) => {
|
||||
{testView}
|
||||
*/}
|
||||
|
||||
<div style={{height: 50, padding: 25, display: "flex", marginTop: 35, position: "fixed", bottom: 0, left: 0, width: "100%", backgroundColor: theme.palette?.backgroundColor, borderTop: "1px solid rgba(255,255,255,0.3)",}}>
|
||||
<div style={{height: 50, padding: 15, display: "flex", marginTop: 35, position: "fixed", bottom: 0, left: 0, width: "100%", backgroundColor: theme.palette?.backgroundColor, borderTop: "1px solid rgba(255,255,255,0.3)",}}>
|
||||
<div style={{width: 450, margin: "auto", display: "flex", textAlign: "center", }}>
|
||||
{appDownloadData.length > 0 ?
|
||||
<Tooltip title="Download the OpenAPI specification for the App" placement="bottom">
|
||||
|
||||
+141
-83
@@ -20,14 +20,18 @@ import {
|
||||
IconButton,
|
||||
} from "@mui/material";
|
||||
import { Context } from "../context/ContextApi.jsx";
|
||||
import Add from '@mui/icons-material/Add';
|
||||
import CachedIcon from '@mui/icons-material/Cached';
|
||||
import CloudDownloadIcon from '@mui/icons-material/CloudDownload';
|
||||
import EditIcon from '@mui/icons-material/Edit';
|
||||
|
||||
import {
|
||||
Add as AddIcon,
|
||||
Edit as EditIcon,
|
||||
Search as SearchIcon,
|
||||
Clear as ClearIcon,
|
||||
Close as CloseIcon,
|
||||
Cached as CachedIcon,
|
||||
CloudDownload as CloudDownloadIcon,
|
||||
} from "@mui/icons-material";
|
||||
|
||||
import InputAdornment from '@mui/material/InputAdornment';
|
||||
import Search from '@mui/icons-material/Search';
|
||||
import ClearIcon from '@mui/icons-material/Clear';
|
||||
import CloseIcon from '@mui/icons-material/Close';
|
||||
|
||||
import { ClearRefinements, connectHits, connectSearchBox, connectStateResults, InstantSearch, RefinementList, connectRefinementList, Configure } from "react-instantsearch-dom";
|
||||
import { removeQuery } from "../components/ScrollToTop.jsx";
|
||||
@@ -45,7 +49,7 @@ const searchClient = algoliasearch(
|
||||
);
|
||||
|
||||
// AppCard Component
|
||||
const AppCard = ({ data, index, mouseHoverIndex, setMouseHoverIndex, globalUrl, deactivatedIndexes, currTab, handleAppClick, leftSideBarOpenByClick, userdata }) => {
|
||||
const AppCard = ({ data, index, mouseHoverIndex, setMouseHoverIndex, globalUrl, deactivatedIndexes, currTab, handleAppClick, leftSideBarOpenByClick, userdata, fetchApps }) => {
|
||||
const navigate = useNavigate();
|
||||
const isCloud = window.location.host === "localhost:3002" || window.location.host === "shuffler.io" || window.location.host === "localhost:3000";
|
||||
const appUrl = isCloud ? `/apps/${data.id}` : `https://shuffler.io/apps/${data.id}`;
|
||||
@@ -117,9 +121,17 @@ const AppCard = ({ data, index, mouseHoverIndex, setMouseHoverIndex, globalUrl,
|
||||
fontWeight: 600,
|
||||
whiteSpace: "nowrap",
|
||||
marginLeft: 8,
|
||||
maxWidth: "90%",
|
||||
gap: 8
|
||||
}}>
|
||||
{data.name.replace(/_/g, ' ').replace(/\b\w/g, char => char.toUpperCase())}
|
||||
<div style={{
|
||||
overflow: "hidden",
|
||||
textOverflow: "ellipsis",
|
||||
whiteSpace: "nowrap",
|
||||
color: '#F1F1F1'
|
||||
}}>
|
||||
{data.name.replace(/_/g, ' ').replace(/\b\w/g, char => char.toUpperCase())}
|
||||
</div>
|
||||
</div>
|
||||
<div style={{
|
||||
overflow: "hidden",
|
||||
@@ -182,12 +194,13 @@ const AppCard = ({ data, index, mouseHoverIndex, setMouseHoverIndex, globalUrl,
|
||||
<Button
|
||||
className="deactivate-button"
|
||||
sx={{
|
||||
width: 102,
|
||||
width: 110,
|
||||
height: 35,
|
||||
borderRadius: 0.75,
|
||||
bgcolor: "rgba(73, 73, 73, 1)",
|
||||
color: "rgba(241, 241, 241, 1)",
|
||||
textTransform: "none",
|
||||
fontSize: 16,
|
||||
fontFamily: theme?.typography?.fontFamily,
|
||||
transition: "background-color 0.3s ease",
|
||||
"&:hover": {
|
||||
@@ -213,6 +226,7 @@ const AppCard = ({ data, index, mouseHoverIndex, setMouseHoverIndex, globalUrl,
|
||||
toast.error(responseJson.reason);
|
||||
} else {
|
||||
toast.success("App Deactivated Successfully.");
|
||||
fetchApps();
|
||||
}
|
||||
})
|
||||
.catch(error => {
|
||||
@@ -445,13 +459,21 @@ const Hits = ({
|
||||
overflow: "hidden",
|
||||
gap: 8,
|
||||
fontWeight: 600,
|
||||
maxWidth: "90%",
|
||||
textOverflow: "ellipsis",
|
||||
whiteSpace: "nowrap",
|
||||
color: '#F1F1F1'
|
||||
}}
|
||||
>
|
||||
{(allActivatedAppIds && allActivatedAppIds.includes(data.objectID)) && <Box sx={{ width: 8, height: 8, backgroundColor: "#02CB70", borderRadius: '50%' }} />}
|
||||
{normalizedString(data.name)}
|
||||
<div style={{
|
||||
overflow: "hidden",
|
||||
textOverflow: "ellipsis",
|
||||
whiteSpace: "nowrap",
|
||||
color: '#F1F1F1'
|
||||
}}>
|
||||
{normalizedString(data.name)}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div
|
||||
@@ -535,18 +557,19 @@ const Hits = ({
|
||||
paddingRight: 10,
|
||||
minWidth: 110
|
||||
}}>
|
||||
{hoverEffect === index && isCloud && (
|
||||
{hoverEffect === index && (
|
||||
<div>
|
||||
{allActivatedAppIds && allActivatedAppIds.includes(data.objectID) ? (
|
||||
<Button
|
||||
style={{
|
||||
width: 102,
|
||||
width: 110,
|
||||
height: 35,
|
||||
borderRadius: 3,
|
||||
borderRadius: 4,
|
||||
backgroundColor: "rgba(73, 73, 73, 1)",
|
||||
color: "rgba(241, 241, 241, 1)",
|
||||
textTransform: "none",
|
||||
fontFamily: theme?.typography?.fontFamily,
|
||||
fontSize: 16,
|
||||
}}
|
||||
onClick={(event) => {
|
||||
handleActivateButton(event, data, "deactivate");
|
||||
@@ -560,9 +583,10 @@ const Hits = ({
|
||||
color: "black",
|
||||
width: 102,
|
||||
height: 35,
|
||||
borderRadius: 3,
|
||||
borderRadius: 4,
|
||||
textTransform: "none",
|
||||
fontFamily: theme?.typography?.fontFamily,
|
||||
fontSize: 16
|
||||
}}
|
||||
onClick={(event) => {
|
||||
handleActivateButton(event, data, "activate");
|
||||
@@ -655,15 +679,15 @@ const SearchBox = ({ refine, searchQuery, setSearchQuery }) => {
|
||||
event.preventDefault();
|
||||
}
|
||||
}}
|
||||
style={{ borderRadius: 8, height: 45, fontFamily: theme?.typography?.fontFamily, flex: 1 }}
|
||||
style={{ borderRadius: 4, height: 45, fontFamily: theme?.typography?.fontFamily, flex: 1 }}
|
||||
InputProps={{
|
||||
style: {
|
||||
borderRadius: 8,
|
||||
borderRadius: 4,
|
||||
height: 45
|
||||
},
|
||||
endAdornment: (
|
||||
<InputAdornment position="end">
|
||||
{localQuery?.length === 0 ? <Search /> : (
|
||||
{localQuery?.length === 0 ? <SearchIcon /> : (
|
||||
<ClearIcon
|
||||
style={{
|
||||
cursor: "pointer",
|
||||
@@ -703,7 +727,7 @@ const CategoryDropdown = ({ items, currentRefinement, refine }) => {
|
||||
onChange={handleChange}
|
||||
displayEmpty
|
||||
multiple
|
||||
style={{ borderRadius: 8, height: 45, fontFamily: theme?.typography?.fontFamily, flex: 1 }}
|
||||
style={{ borderRadius: 4, height: 45, fontFamily: theme?.typography?.fontFamily, flex: 1 }}
|
||||
renderValue={(selected) => {
|
||||
if (selected.length === 0) return 'All Categories';
|
||||
return (
|
||||
@@ -764,7 +788,7 @@ const LabelDropdown = ({ items, currentRefinement, refine }) => {
|
||||
onChange={handleChange}
|
||||
displayEmpty
|
||||
multiple
|
||||
style={{ borderRadius: 8, height: 45, fontFamily: theme?.typography?.fontFamily, flex: 1 }}
|
||||
style={{ borderRadius: 4, height: 45, fontFamily: theme?.typography?.fontFamily, flex: 1 }}
|
||||
renderValue={(selected) => {
|
||||
if (selected.length === 0) return 'All Labels';
|
||||
return (
|
||||
@@ -855,7 +879,7 @@ const AppSkeleton = () => {
|
||||
backgroundColor: "#212121",
|
||||
width: "100%",
|
||||
height: 120,
|
||||
borderRadius: 8,
|
||||
borderRadius: 4,
|
||||
}}>
|
||||
<div style={{
|
||||
display: "flex",
|
||||
@@ -868,7 +892,7 @@ const AppSkeleton = () => {
|
||||
width={100}
|
||||
height={90}
|
||||
style={{
|
||||
borderRadius: 6,
|
||||
borderRadius: 4,
|
||||
backgroundColor: "rgba(255, 255, 255, 0.1)"
|
||||
}}
|
||||
/>
|
||||
@@ -1024,43 +1048,43 @@ const Apps2 = (props) => {
|
||||
}, []);
|
||||
|
||||
// Fetch apps based on the current tab : 0 -> org_apps, 1 -> my_apps, 2 -> all_apps
|
||||
useEffect(() => {
|
||||
const fetchApps = async () => {
|
||||
const baseUrl = globalUrl;
|
||||
let url;
|
||||
setIsLoading(true);
|
||||
const userId = userdata?.id;
|
||||
if (currTab === 1 && userId) {
|
||||
url = `${baseUrl}/api/v1/users/${userId}/apps`;
|
||||
const fetchApps = async () => {
|
||||
const baseUrl = globalUrl;
|
||||
let url;
|
||||
setIsLoading(true);
|
||||
const userId = userdata?.id;
|
||||
if (currTab === 1 && userId) {
|
||||
url = `${baseUrl}/api/v1/users/${userId}/apps`;
|
||||
} else if (currTab === 0) {
|
||||
url = `${baseUrl}/api/v1/apps`;
|
||||
}
|
||||
try {
|
||||
const response = await fetch(url, {
|
||||
method: "GET",
|
||||
credentials: "include",
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
});
|
||||
const data = await response.json();
|
||||
if (currTab === 1) {
|
||||
setAppsToShow(data);
|
||||
setUserApps(data);
|
||||
} else if (currTab === 0) {
|
||||
url = `${baseUrl}/api/v1/apps`;
|
||||
setAppsToShow(data);
|
||||
setOrgApps(data);
|
||||
// For testing the empty state
|
||||
// setAppsToShow([]);
|
||||
// setOrgApps([]);
|
||||
}
|
||||
try {
|
||||
const response = await fetch(url, {
|
||||
method: "GET",
|
||||
credentials: "include",
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
});
|
||||
const data = await response.json();
|
||||
if (currTab === 1) {
|
||||
setAppsToShow(data);
|
||||
setUserApps(data);
|
||||
} else if (currTab === 0) {
|
||||
setAppsToShow(data);
|
||||
setOrgApps(data);
|
||||
// For testing the empty state
|
||||
// setAppsToShow([]);
|
||||
// setOrgApps([]);
|
||||
}
|
||||
setIsLoading(false);
|
||||
} catch (err) {
|
||||
console.error("Error fetching apps:", err);
|
||||
setIsLoading(false);
|
||||
}
|
||||
};
|
||||
setIsLoading(false);
|
||||
} catch (err) {
|
||||
console.error("Error fetching apps:", err);
|
||||
setIsLoading(false);
|
||||
}
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
|
||||
// Only fetch if we have required data
|
||||
if (globalUrl && (currTab === 0 || (currTab === 1 && userdata?.id))) {
|
||||
@@ -1164,15 +1188,16 @@ const Apps2 = (props) => {
|
||||
return response.json();
|
||||
})
|
||||
.then((responseJson) => {
|
||||
//responseJson = sortByKey(responseJson, "large_image")
|
||||
//responseJson = sortByKey(responseJson, "is_valid")
|
||||
//setFilteredApps(responseJson.filter(app => !internalIds.includes(app.name) && !(!app.activated && app.generated)))
|
||||
console.log("responseJson: from getApps ", responseJson)
|
||||
var privateapps = [];
|
||||
var valid = [];
|
||||
var invalid = [];
|
||||
for (var key in responseJson) {
|
||||
const app = responseJson[key];
|
||||
|
||||
if (app.categories !== undefined && app.categories !== null && app?.categories.includes("Eradication")) {
|
||||
app.categories = ["EDR"]
|
||||
}
|
||||
|
||||
if (app.is_valid && !(!app.activated && app.generated)) {
|
||||
privateapps.push(app);
|
||||
} else if (
|
||||
@@ -1185,21 +1210,13 @@ const Apps2 = (props) => {
|
||||
}
|
||||
}
|
||||
|
||||
//console.log(privateapps)
|
||||
//console.log(valid)
|
||||
//console.log(invalid)
|
||||
//console.log(privateapps)
|
||||
//privateapps.reverse()
|
||||
privateapps.push(...valid);
|
||||
privateapps.push(...invalid);
|
||||
console.log("privateapps: setting apps ", privateapps)
|
||||
setAppsToShow(privateapps);
|
||||
setOrgApps(privateapps);
|
||||
setApps(privateapps);
|
||||
// setCursearch("");
|
||||
|
||||
//handleSearchChange(event.target.value)
|
||||
//setCursearch(event.target.value)
|
||||
// setFilteredApps(privateapps);
|
||||
if (privateapps.length > 0) {
|
||||
if (selectedApp.id === undefined || selectedApp.id === null) {
|
||||
@@ -1707,8 +1724,24 @@ const Apps2 = (props) => {
|
||||
setOpenModal(false)
|
||||
}
|
||||
|
||||
const tabStyle = {
|
||||
textTransform: 'none',
|
||||
marginRight: 20,
|
||||
fontFamily: theme?.typography?.fontFamily,
|
||||
fontSize: 16,
|
||||
borderBottom: "5px solid transparent",
|
||||
minHeight: "48px",
|
||||
padding: "12px 16px",
|
||||
}
|
||||
|
||||
const tabActive = {
|
||||
borderBottom: "5px solid #FF8544",
|
||||
borderRadius: "2px",
|
||||
color: "#FF8544"
|
||||
}
|
||||
|
||||
return (
|
||||
<div style={{ paddingTop: 70, paddingLeft: leftSideBarOpenByClick ? 200 : 0, transition: "padding-left 0.3s ease", backgroundColor: "#1A1A1A", fontFamily: theme?.typography?.fontFamily, zoom: 0.8, }}>
|
||||
<div style={{ paddingTop: 70, paddingLeft: leftSideBarOpenByClick ? 200 : 0, transition: "padding-left 0.3s ease", backgroundColor: "#1A1A1A", fontFamily: theme?.typography?.fontFamily, zoom: 0.7, }}>
|
||||
<InstantSearch searchClient={searchClient} indexName="appsearch">
|
||||
<AppModal
|
||||
open={openModal}
|
||||
@@ -1728,7 +1761,7 @@ const Apps2 = (props) => {
|
||||
<div style={boxStyle}>
|
||||
<div style={{ display: "flex", flexDirection: "row", width: "100%", justifyContent: "space-between" }}>
|
||||
<Typography variant="h4" style={{ marginBottom: 20, paddingLeft: 15, textTransform: 'none', fontFamily: theme?.typography?.fontFamily }}>
|
||||
Apps
|
||||
{currTab === 0 ? "Org" : currTab === 1 ? "Your" : "Discover"} Apps
|
||||
</Typography>
|
||||
{isCloud ? null : (
|
||||
<span style={{ display: "flex", gap: 15 }}>
|
||||
@@ -1755,7 +1788,7 @@ const Apps2 = (props) => {
|
||||
height: 45,
|
||||
minWidth: 45,
|
||||
backgroundColor: "#2F2F2F",
|
||||
borderRadius: 8,
|
||||
borderRadius: 4,
|
||||
padding: "8px 16px",
|
||||
}}
|
||||
disabled={isLoading}
|
||||
@@ -1795,7 +1828,7 @@ const Apps2 = (props) => {
|
||||
height: 45,
|
||||
minWidth: 45,
|
||||
backgroundColor: "#2F2F2F",
|
||||
borderRadius: 8,
|
||||
borderRadius: 4,
|
||||
padding: "8px 16px",
|
||||
}}
|
||||
disabled={isLoading}
|
||||
@@ -1820,12 +1853,35 @@ const Apps2 = (props) => {
|
||||
<Tabs
|
||||
value={currTab}
|
||||
onChange={(event, newTab) => handleTabChange(event, newTab)}
|
||||
TabIndicatorProps={{ style: { height: '3px', borderRadius: 10, backgroundColor: "#FF8544" } }}
|
||||
style={{ fontFamily: theme?.typography?.fontFamily }}
|
||||
style={{
|
||||
fontFamily: theme?.typography?.fontFamily,
|
||||
fontSize: 16,
|
||||
marginBottom: "-2px"
|
||||
}}
|
||||
TabIndicatorProps={{ style: { display: 'none' } }}
|
||||
>
|
||||
<Tab label="Organization Apps" style={{ textTransform: 'none', marginRight: 20, fontFamily: theme?.typography?.fontFamily }} />
|
||||
<Tab label="My Apps" style={{ textTransform: 'none', marginRight: 20, fontFamily: theme?.typography?.fontFamily }} />
|
||||
<Tab label="Discover Apps" style={{ textTransform: 'none', fontFamily: theme?.typography?.fontFamily }} />
|
||||
<Tab
|
||||
label="Organization Apps"
|
||||
style={{
|
||||
...tabStyle,
|
||||
...(currTab === 0 ? tabActive : {})
|
||||
}}
|
||||
/>
|
||||
<Tab
|
||||
label="My Apps"
|
||||
style={{
|
||||
...tabStyle,
|
||||
...(currTab === 1 ? tabActive : {})
|
||||
}}
|
||||
/>
|
||||
<Tab
|
||||
label="Discover Apps"
|
||||
style={{
|
||||
...tabStyle,
|
||||
marginRight: 0,
|
||||
...(currTab === 2 ? tabActive : {})
|
||||
}}
|
||||
/>
|
||||
</Tabs>
|
||||
</div>
|
||||
<div style={{ display: "flex", justifyContent: "space-between", gap: 10, marginBottom: 20, height: 45, paddingRight: 25 }}>
|
||||
@@ -1850,12 +1906,12 @@ const Apps2 = (props) => {
|
||||
limit={5}
|
||||
InputProps={{
|
||||
style: {
|
||||
borderRadius: 8,
|
||||
borderRadius: 4,
|
||||
height: 45
|
||||
},
|
||||
endAdornment: (
|
||||
<InputAdornment position="end">
|
||||
{searchQuery.length === 0 ? <Search /> : (
|
||||
{searchQuery.length === 0 ? <SearchIcon /> : (
|
||||
<ClearIcon
|
||||
style={{ cursor: "pointer" }}
|
||||
onClick={() => {
|
||||
@@ -1892,7 +1948,7 @@ const Apps2 = (props) => {
|
||||
displayEmpty
|
||||
multiple
|
||||
style={{
|
||||
borderRadius: 8,
|
||||
borderRadius: 4,
|
||||
height: 45,
|
||||
fontFamily: theme?.typography?.fontFamily
|
||||
}}
|
||||
@@ -1956,7 +2012,7 @@ const Apps2 = (props) => {
|
||||
displayEmpty
|
||||
multiple
|
||||
style={{
|
||||
borderRadius: 8,
|
||||
borderRadius: 4,
|
||||
height: 45,
|
||||
fontFamily: theme?.typography?.fontFamily
|
||||
}}
|
||||
@@ -2014,7 +2070,7 @@ const Apps2 = (props) => {
|
||||
style={{
|
||||
height: "100%",
|
||||
width: '100%',
|
||||
borderRadius: '7px',
|
||||
borderRadius: '4px',
|
||||
textTransform: 'none',
|
||||
backgroundColor: "#FF8544",
|
||||
color: "#1A1A1A",
|
||||
@@ -2022,7 +2078,7 @@ const Apps2 = (props) => {
|
||||
fontSize: 16,
|
||||
fontWeight: 500
|
||||
}}
|
||||
startIcon={<Add style={{ color: "#1A1A1A" }} />}
|
||||
startIcon={<AddIcon style={{ color: "#1A1A1A" }} />}
|
||||
>
|
||||
Create an App
|
||||
</Button>
|
||||
@@ -2062,6 +2118,7 @@ const Apps2 = (props) => {
|
||||
handleAppClick={handleAppClick}
|
||||
leftSideBarOpenByClick={leftSideBarOpenByClick}
|
||||
userdata={userdata}
|
||||
fetchApps={fetchApps}
|
||||
/>
|
||||
))}
|
||||
</div>
|
||||
@@ -2106,6 +2163,7 @@ const Apps2 = (props) => {
|
||||
{appsToShow.map((data, index) => (
|
||||
<AppCard key={index} data={data} index={index} mouseHoverIndex={mouseHoverIndex} setMouseHoverIndex={setMouseHoverIndex} globalUrl={globalUrl} deactivatedIndexes={deactivatedIndexes} currTab={currTab} userdata={userdata}
|
||||
handleAppClick={handleAppClick} leftSideBarOpenByClick={leftSideBarOpenByClick}
|
||||
fetchApps={fetchApps}
|
||||
/>
|
||||
))}
|
||||
</div>
|
||||
|
||||
+727
-397
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user