From 92753f0be791f64624c3e459c96347340cd1b70f Mon Sep 17 00:00:00 2001 From: frikky Date: Wed, 31 Mar 2021 09:24:19 +0200 Subject: [PATCH] Added filtering to workflow view --- frontend/src/views/Workflows.jsx | 123 ++++++++++++++++++++++++++++--- 1 file changed, 114 insertions(+), 9 deletions(-) diff --git a/frontend/src/views/Workflows.jsx b/frontend/src/views/Workflows.jsx index 0b30170e..a2655857 100644 --- a/frontend/src/views/Workflows.jsx +++ b/frontend/src/views/Workflows.jsx @@ -140,6 +140,7 @@ const Workflows = (props) => { const [file, setFile] = React.useState(""); const [workflows, setWorkflows] = React.useState([]); + const [filteredWorkflows, setFilteredWorkflows] = React.useState([]); const [selectedWorkflow, setSelectedWorkflow] = React.useState({}); const [selectedExecution, setSelectedExecution] = React.useState({}); const [workflowExecutions, setWorkflowExecutions] = React.useState([]); @@ -166,8 +167,81 @@ const Workflows = (props) => { const [importLoading, setImportLoading] = React.useState(false) const [isDropzone, setIsDropzone] = React.useState(false); const [view, setView] = React.useState("grid") + const [filters, setFilters] = React.useState([]) const isCloud = window.location.host === "localhost:3002" || window.location.host === "shuffler.io" + const findWorkflow = (filters) => { + if (filters.length === 0) { + setFilteredWorkflows(workflows) + return + } + + var newWorkflows = [] + for (var workflowKey in workflows) { + const curWorkflow = workflows[workflowKey] + + var found = [false] + if (curWorkflow.tags === undefined || curWorkflow.tags === null) { + found = filters.map(filter => curWorkflow.name.toLowerCase().includes(filter)) + } else { + found = filters.map(filter => curWorkflow.name.toLowerCase().includes(filter.toLowerCase()) || curWorkflow.tags.includes(filter)) + } + //console.log("FOUND: ", found) + //if (found) { + if (found.every(v => v === true)) { + newWorkflows.push(curWorkflow) + continue + } + } + + if (newWorkflows.length !== workflows.length) { + setFilteredWorkflows(newWorkflows) + } + } + + const addFilter = (data) => { + if (data === null || data === undefined) { + return + } + + if (data.includes("<") && data.includes(">")) { + return + } + + if (filters.includes(data)) { + return + } + + filters.push(data.toLowerCase()) + setFilters(filters) + + findWorkflow(filters) + } + + const removeFilter = (index) => { + var newfilters = filters + + if (index < 0) { + console.log("Can't handle index: ", index) + return + } + + + //console.log("Removing filter index", index) + newfilters.splice(index, 1) + //console.log("FILTER LENGTH: ", filters.length) + + if (newfilters.length === 0) { + newfilters = [] + setFilters(newfilters) + } else { + setFilters(newfilters) + } + //console.log("FILTERS: ", newfilters) + + findWorkflow(newfilters) + } + const deleteModal = deleteModalOpen ? { if (responseJson !== undefined) { setWorkflows(responseJson) + setFilteredWorkflows(responseJson) setWorkflowDone(true) } else { if (isLoggedIn) { @@ -635,6 +710,11 @@ const Workflows = (props) => { }); } + + const handleChipClick = (e) => { + addFilter(e.target.innerHTML) + } + const WorkflowPaper = (props) => { const { data } = props; const [open, setOpen] = React.useState(false); @@ -674,8 +754,10 @@ const Workflows = (props) => {
- - {parsedName} + + + {parsedName} + @@ -732,6 +814,7 @@ const Workflows = (props) => { key={index} style={{backgroundColor: "#3d3f43", height: 30, marginRight: 5, paddingLeft: 5, paddingRight: 5, height: 28, cursor: "pointer", borderColor: "#3d3f43", color: "white",}} label={tag} + onClick={handleChipClick} variant="outlined" color="primary" /> @@ -809,7 +892,7 @@ const Workflows = (props) => { - + @@ -1180,7 +1263,7 @@ const Workflows = (props) => { borderRadius: "4px", color: "black", height: "20px", "width": "20px", fontSize: "small"}} /> - + executeWorkflow(data.id)} /> @@ -1296,10 +1379,11 @@ const Workflows = (props) => { fullWidth /> {
-
+

Workflows

+
+ { + addFilter(chip) + }} + onDelete={(chip, index) => { + removeFilter(index) + //setUpdate("delete "+chip) + }} + /> +
{/* @@ -1475,7 +1580,7 @@ const Workflows = (props) => {
- This is your workflow view. Learn more about Workflows + Your workflow view. Learn more about Workflows
{workflowButtons} @@ -1484,7 +1589,7 @@ const Workflows = (props) => {
{view === "grid" && ( - {workflows.map((data, index) => { + {filteredWorkflows.map((data, index) => { return ( ) @@ -1600,7 +1705,7 @@ const Workflows = (props) => { onChange={e => setDownloadUrl(e.target.value)} placeholder="https://github.com/frikky/shuffle-apps" fullWidth - /> + /> Branch (default value is "master"):