From c739a057d915554224e7164c1ebbd8f717c475b3 Mon Sep 17 00:00:00 2001
From: danieldeng2 <danieldeng223@gmail.com>
Date: Wed, 12 Aug 2020 00:02:22 +0100
Subject: [PATCH] Add basic selection to folders

---
 .../src/components/atoms/FileCard/index.tsx   |   2 +-
 .../src/components/atoms/FolderCard/index.tsx |   9 +-
 .../molecules/ResourceFolders/index.tsx       | 103 ++++++++++++++----
 3 files changed, 90 insertions(+), 24 deletions(-)

diff --git a/frontend/src/components/atoms/FileCard/index.tsx b/frontend/src/components/atoms/FileCard/index.tsx
index 15eff91bd..8eb6924f3 100644
--- a/frontend/src/components/atoms/FileCard/index.tsx
+++ b/frontend/src/components/atoms/FileCard/index.tsx
@@ -32,7 +32,7 @@ const FileCard: React.FC<FileCardProps> = ({
       <Card.Footer>
 				{
 					tags.map(tag => 
-						<Badge pill className={classNames(styles.quickViewTag, tag==="new" ? styles.tagTeal : styles.tagBlue)}>
+						<Badge pill key={tag} className={classNames(styles.quickViewTag, tag==="new" ? styles.tagTeal : styles.tagBlue)}>
 						{tag}
 					</Badge>
 					)
diff --git a/frontend/src/components/atoms/FolderCard/index.tsx b/frontend/src/components/atoms/FolderCard/index.tsx
index 5c8042550..2063603a3 100644
--- a/frontend/src/components/atoms/FolderCard/index.tsx
+++ b/frontend/src/components/atoms/FolderCard/index.tsx
@@ -2,20 +2,21 @@ import React from "react";
 import styles from "./style.module.scss";
 import Card from "react-bootstrap/Card";
 import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
-import { faFolder } from "@fortawesome/free-solid-svg-icons";
+import { IconDefinition } from "@fortawesome/free-solid-svg-icons";
 
 export interface FolderCardProps{
     title: string;
-    id: number;
+		icon: IconDefinition;
+		onIconClick: (event: React.MouseEvent) => void;
 }
 
 
-const FolderCard: React.FC<FolderCardProps> = ({title, id}: FolderCardProps) => {
+const FolderCard: React.FC<FolderCardProps> = ({title, icon, onIconClick}: FolderCardProps) => {
   return (
     <Card className={styles.folderCard}>
       <Card.Body style={{ padding: ".6rem" }}>
         <Card.Text style={{ marginBottom: 0 }}>{title}</Card.Text>
-        <FontAwesomeIcon style={{ fontSize: "1.125rem" }} icon={faFolder} />
+        <FontAwesomeIcon style={{ fontSize: "1.125rem" }} icon={icon} onClick={onIconClick}/>
       </Card.Body>
     </Card>
   );
diff --git a/frontend/src/components/molecules/ResourceFolders/index.tsx b/frontend/src/components/molecules/ResourceFolders/index.tsx
index 9e65c68cc..5ca493d02 100644
--- a/frontend/src/components/molecules/ResourceFolders/index.tsx
+++ b/frontend/src/components/molecules/ResourceFolders/index.tsx
@@ -3,28 +3,93 @@ import Row from "react-bootstrap/esm/Row";
 import Col from "react-bootstrap/esm/Col";
 import ResourceSectionHeader from "../ResourceSectionHeader";
 import FolderCard from "components/atoms/FolderCard";
-
-export interface ResourceFoldersProps{
-	folderItems: {
+import {
+  faSquare,
+  faCheckSquare,
+} from "@fortawesome/free-regular-svg-icons";
+import {
+  faFolder
+} from "@fortawesome/free-solid-svg-icons";
+export interface ResourceFoldersProps {
+  folderItems: {
     title: string;
     id: number;
-	}[];
+  }[];
+}
+
+type idBooleanMap = { [key: number]: boolean };
+interface MyState {
+  isSelected: idBooleanMap;
 }
 
-const ResourceFolders: React.FC<ResourceFoldersProps> = ({folderItems}: ResourceFoldersProps) => {
-  return (
-    <>
-      <ResourceSectionHeader heading="Folders" />
-
-      <Row style={{ marginTop: "10px" }}>
-        {folderItems.map(({title, id}) => (
-          <Col xs={6} sm={6} md={3} key={id}>
-            <FolderCard title={title} id={id}/>
-          </Col>
-        ))}
-      </Row>
-    </>
-  );
-};
+class ResourceFolders extends React.Component<ResourceFoldersProps, MyState> {
+  constructor(props: ResourceFoldersProps) {
+    super(props);
+    let isSelected: idBooleanMap = [];
+    this.state = { isSelected };
+  }
+
+  componentDidMount() {
+    let isSelected: idBooleanMap = [];
+    this.props.folderItems.forEach(({ id }: { id: number }) => {
+      isSelected[id] = false;
+    });
+    this.setState({ isSelected });
+  }
+
+  isAnySelected(): boolean {
+    let items = this.props.folderItems;
+    let isSelected = this.state.isSelected;
+    for (let item in items) {
+      if (isSelected[items[item].id]) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  isAllSelected(): boolean {
+    let items = this.props.folderItems;
+    let isSelected = this.state.isSelected;
+    for (let item in items) {
+      if (!isSelected[items[item].id]) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  handleIconClick(id: number) {
+    let isSelected = JSON.parse(JSON.stringify(this.state.isSelected));
+    isSelected[id] = !isSelected[id];
+    this.setState({ isSelected });
+  }
+
+  render() {
+    return (
+      <>
+        <ResourceSectionHeader heading="Folders" />
+
+        <Row style={{ marginTop: "10px" }}>
+          {this.props.folderItems.map(({ title, id }) => (
+            <Col xs={6} sm={6} md={3} key={id}>
+              <FolderCard
+                title={title}
+                icon={
+                  this.isAnySelected()
+                    ? this.state.isSelected[id]
+                      ? faCheckSquare
+                      : faSquare
+                    : faFolder
+                }
+                onIconClick={() => this.handleIconClick(id)}
+              />
+            </Col>
+          ))}
+        </Row>
+      </>
+    );
+  }
+}
 
 export default ResourceFolders;
-- 
GitLab