From 75f2050063a041d1d158a65e005183648648f41b Mon Sep 17 00:00:00 2001 From: Gimleux Date: Wed, 12 May 2021 15:14:10 +0200 Subject: [PATCH 01/30] Extracted FileIcon --- package-lock.json | 26 ++- .../icons/reactSvgIcons}/SymbolFile.tsx | 0 .../redux/actions/filesystemTypes.ts | 2 +- src/background/redux/reducers/filesystem.ts | 10 +- src/components/pages/filesytem/FileIcon.tsx | 62 +++++ src/components/pages/filesytem/FileList.tsx | 2 +- .../pages/filesytem/FileListItem.tsx | 212 +++++++----------- .../pages/filesytem/SelectedFsEntities.tsx | 2 +- .../pages/filesytem/ToolbarActions.tsx | 2 +- 9 files changed, 161 insertions(+), 157 deletions(-) rename src/{elements/svg => assets/images/icons/reactSvgIcons}/SymbolFile.tsx (100%) create mode 100644 src/components/pages/filesytem/FileIcon.tsx diff --git a/package-lock.json b/package-lock.json index b7a7dbc9..225278e3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12671,9 +12671,9 @@ "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==" }, "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==" + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" }, "hpack.js": { "version": "2.1.6", @@ -16632,11 +16632,6 @@ "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==" }, - "nanoid": { - "version": "3.1.22", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.22.tgz", - "integrity": "sha512-/2ZUaJX2ANuLtTvqTlgqBQNJoQO398KyJgZloL0PZkC0dpysjncRUPsFe3DUPzz/y3h+u7C46np8RMuvF3jsSQ==" - }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -19142,13 +19137,20 @@ }, "dependencies": { "postcss": { - "version": "8.2.9", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.9.tgz", - "integrity": "sha512-b+TmuIL4jGtCHtoLi+G/PisuIl9avxs8IZMSmlABRwNz5RLUUACrC+ws81dcomz1nRezm5YPdXiMEzBEKgYn+Q==", + "version": "8.2.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.15.tgz", + "integrity": "sha512-2zO3b26eJD/8rb106Qu2o7Qgg52ND5HPjcyQiK2B98O388h43A448LCslC0dI2P97wCAQRJsFvwTRcXxTKds+Q==", "requires": { "colorette": "^1.2.2", - "nanoid": "^3.1.22", + "nanoid": "^3.1.23", "source-map": "^0.6.1" + }, + "dependencies": { + "nanoid": { + "version": "3.1.23", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz", + "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==" + } } } } diff --git a/src/elements/svg/SymbolFile.tsx b/src/assets/images/icons/reactSvgIcons/SymbolFile.tsx similarity index 100% rename from src/elements/svg/SymbolFile.tsx rename to src/assets/images/icons/reactSvgIcons/SymbolFile.tsx diff --git a/src/background/redux/actions/filesystemTypes.ts b/src/background/redux/actions/filesystemTypes.ts index 32854212..8f26db3b 100644 --- a/src/background/redux/actions/filesystemTypes.ts +++ b/src/background/redux/actions/filesystemTypes.ts @@ -6,7 +6,7 @@ export const REMOVE_FROM_SELECTED = "REMOVE_FROM_SELECTED"; export const REPLACE_SELECTED = "REPLACE_SELECTED"; export interface FilesystemState { - selectedFsEnties: FsEntity[], + selectedFsEntities: FsEntity[], } export interface AddToSelected { diff --git a/src/background/redux/reducers/filesystem.ts b/src/background/redux/reducers/filesystem.ts index b0d61e97..c8cf16a4 100644 --- a/src/background/redux/reducers/filesystem.ts +++ b/src/background/redux/reducers/filesystem.ts @@ -9,7 +9,7 @@ import { import { FsEntity } from "../../api/filesystemTypes"; const initialState: FilesystemState = { - selectedFsEnties: [] + selectedFsEntities: [] }; export default function filesystem( @@ -20,24 +20,24 @@ export default function filesystem( case ADD_TO_SELECTED: { console.log("[REDUX] ADD_TO_SELECTED", action.payload); return { - selectedFsEnties: [...state.selectedFsEnties, action.payload] //concat because it does not modify the original array + selectedFsEntities: [...state.selectedFsEntities, action.payload] //concat because it does not modify the original array }; } case REMOVE_FROM_SELECTED: { return { - selectedFsEnties: state.selectedFsEnties.filter( + selectedFsEntities: state.selectedFsEntities.filter( (e: FsEntity) => e.fileSystemId !== action.payload.fileSystemId ) //filter return a new array }; } case CLEAR_SELECTED: { return { - selectedFsEnties: [] + selectedFsEntities: [] }; } case REPLACE_SELECTED: { return { - selectedFsEnties: action.payload + selectedFsEntities: action.payload }; } default: diff --git a/src/components/pages/filesytem/FileIcon.tsx b/src/components/pages/filesytem/FileIcon.tsx new file mode 100644 index 00000000..efed6610 --- /dev/null +++ b/src/components/pages/filesytem/FileIcon.tsx @@ -0,0 +1,62 @@ +import React, {ReactElement} from "react"; +import { + FileEarmarkCodeIcon, + FileEarmarkIcon, + FileEarmarkImageIcon, + FileEarmarkLock2Icon, + FileEarmarkMusicIcon, + FileEarmarkPDFIcon, + FileEarmarkPlayIcon, + FileEarmarkRichtextIcon, + FileEarmarkTextIcon, + FileEarmarkZipIcon, + FolderIcon +} from "../../../assets/images/icons/reactSvgIcons/SymbolFile"; +import {reverseString} from "../../../background/methods/strings"; + +const ICON_PREFERENCES = { + height: "40px", + width: "100%", + color: "secondary" +}; + +function FileIcon(isFolder: boolean, name: string): ReactElement { + if (isFolder) return ; + + let positionOfPoint = reverseString(name).indexOf("."); + if (positionOfPoint < 0) return ; + + const fileExtension = reverseString( + reverseString(name).substr(0, positionOfPoint + 1) + ); + switch (fileExtension) { + case ".txt": + return ; + case ".jpg": + return ; + case ".mp4": + return ; + case ".mp3": + return ; + case ".crypt": + return ; + case ".pdf": + return ; + case ".zip": + case ".7z": + return ; + case ".ts": + case ".tsx": + case ".js": + case ".jsx": + case ".java": + return ; + case ".md": + case ".html": + return ; + default: + return ; + } +} + +export default FileIcon \ No newline at end of file diff --git a/src/components/pages/filesytem/FileList.tsx b/src/components/pages/filesytem/FileList.tsx index f23e5a53..8b349755 100644 --- a/src/components/pages/filesytem/FileList.tsx +++ b/src/components/pages/filesytem/FileList.tsx @@ -18,7 +18,7 @@ import { FFLoading } from "../../basicElements/Loading"; const mapState = (state: SystemState) => ({ filesystem: { - selectedFsEnties: state.filesystem.selectedFsEnties + selectedFsEntities: state.filesystem.selectedFsEntities } }); diff --git a/src/components/pages/filesytem/FileListItem.tsx b/src/components/pages/filesytem/FileListItem.tsx index 85f4e20e..d72e0dd5 100644 --- a/src/components/pages/filesytem/FileListItem.tsx +++ b/src/components/pages/filesytem/FileListItem.tsx @@ -1,40 +1,24 @@ -import { FsEntity } from "../../../background/api/filesystemTypes"; -import React, { ReactElement } from "react"; -import { Col, Form } from "react-bootstrap"; -import { Link } from "react-router-dom"; -import { - FileEarmarkCodeIcon, - FileEarmarkIcon, - FileEarmarkImageIcon, - FileEarmarkLock2Icon, - FileEarmarkMusicIcon, - FileEarmarkPDFIcon, - FileEarmarkPlayIcon, - FileEarmarkRichtextIcon, - FileEarmarkTextIcon, - FileEarmarkZipIcon, - FolderIcon -} from "../../../elements/svg/SymbolFile"; -import { reverseString } from "../../../background/methods/strings"; -import { getDateAsStringFromTimestamp } from "../../../background/methods/time"; -import { formatBytes } from "../../../background/methods/bytes"; -import { connect, ConnectedProps } from "react-redux"; -import { SystemState } from "../../../background/redux/actions/sytemState"; -import { - addToSelected, - removeFromSelected -} from "../../../background/redux/actions/filesystem"; +import {FsEntity} from "../../../background/api/filesystemTypes"; +import React, {ReactElement} from "react"; +import {Col, Form} from "react-bootstrap"; +import {Link} from "react-router-dom"; +import {getDateAsStringFromTimestamp} from "../../../background/methods/time"; +import {formatBytes} from "../../../background/methods/bytes"; +import {connect, ConnectedProps} from "react-redux"; +import {SystemState} from "../../../background/redux/actions/sytemState"; +import {addToSelected, removeFromSelected} from "../../../background/redux/actions/filesystem"; +import FileIcon from "./FileIcon"; const mapState = (state: SystemState) => ({ - filesystem: { - selectedFsEnties: state.filesystem.selectedFsEnties - } + filesystem: { + selectedFsEntities: state.filesystem.selectedFsEntities + } }); // this takes the redux actions and maps them to the props const mapDispatch = { - addToSelected, - removeFromSelected + addToSelected, + removeFromSelected }; const connector = connect(mapState, mapDispatch); @@ -42,119 +26,75 @@ const connector = connect(mapState, mapDispatch); type PropsFromRedux = ConnectedProps; type Props = PropsFromRedux & { - fileListItem: FsEntity; - setPath?: Function; + fileListItem: FsEntity; + setPath?: Function; }; function FileListItem(props: Props): ReactElement { - let isSelected = !!props.filesystem.selectedFsEnties.find( - (e: FsEntity) => e.fileSystemId === props.fileListItem.fileSystemId - ); + let isSelected = !!props.filesystem.selectedFsEntities.find( + (e: FsEntity) => e.fileSystemId === props.fileListItem.fileSystemId + ); - const ICON_PREFERENCES = { - height: "40px", - width: "100%", - color: "secondary" - }; - const FileIcon = (isFolder: boolean, name: string): ReactElement => { - if (isFolder) return ; + const onClick = () => { + if ( + props.fileListItem.type === "FOLDER" && + props.setPath && + props.fileListItem.path + ) { + props.setPath(props.fileListItem.path); + } + }; - let positionOfPoint = reverseString(name).indexOf("."); - if (positionOfPoint < 0) return ; + const handleSelectedChanged = () => { + if (isSelected) { + props.removeFromSelected(props.fileListItem); + } else { + props.addToSelected(props.fileListItem); + } + }; - const fileExtension = reverseString( - reverseString(name).substr(0, positionOfPoint + 1) + return ( + <> + + + + + + + {FileIcon( + props.fileListItem.type === "FOLDER", + props.fileListItem.name + )} + + ... + + + {props.fileListItem.name} + + + + {props.fileListItem.lastUpdatedBy.username} + + + {getDateAsStringFromTimestamp(props.fileListItem.lastUpdated)} + + + {formatBytes(props.fileListItem.size)} + + ); - switch (fileExtension) { - case ".txt": - return ; - case ".jpg": - return ; - case ".mp4": - return ; - case ".mp3": - return ; - case ".crypt": - return ; - case ".pdf": - return ; - case ".zip": - case ".7z": - return ; - case ".ts": - case ".tsx": - case ".js": - case ".jsx": - case ".java": - return ; - case ".md": - case ".html": - return ; - default: - return ; - } - }; - - const onClick = () => { - if ( - props.fileListItem.type === "FOLDER" && - props.setPath && - props.fileListItem.path - ) { - props.setPath(props.fileListItem.path); - } - }; - - const handleSelectedChanged = () => { - if (isSelected) { - props.removeFromSelected(props.fileListItem); - } else { - props.addToSelected(props.fileListItem); - } - }; - - return ( - <> - - - - - - - {FileIcon( - props.fileListItem.type === "FOLDER", - props.fileListItem.name - )} - - ... - - - {props.fileListItem.name} - - - - {props.fileListItem.lastUpdatedBy.username} - - - {getDateAsStringFromTimestamp(props.fileListItem.lastUpdated)} - - - {formatBytes(props.fileListItem.size)} - - - ); } export default connector(FileListItem); diff --git a/src/components/pages/filesytem/SelectedFsEntities.tsx b/src/components/pages/filesytem/SelectedFsEntities.tsx index 9f898211..355b8878 100644 --- a/src/components/pages/filesytem/SelectedFsEntities.tsx +++ b/src/components/pages/filesytem/SelectedFsEntities.tsx @@ -6,7 +6,7 @@ import { FsEntity } from "../../../background/api/filesystemTypes"; import { clearSelected } from "../../../background/redux/actions/filesystem"; const mapState = (state: SystemState) => ({ - selectedFsEnties: state.filesystem.selectedFsEnties + selectedFsEntities: state.filesystem.selectedFsEntities }); const mapDispatch = { diff --git a/src/components/pages/filesytem/ToolbarActions.tsx b/src/components/pages/filesytem/ToolbarActions.tsx index 75317e71..9c6c3096 100644 --- a/src/components/pages/filesytem/ToolbarActions.tsx +++ b/src/components/pages/filesytem/ToolbarActions.tsx @@ -4,7 +4,7 @@ import { SystemState } from "../../../background/redux/actions/sytemState"; import { connect, ConnectedProps } from "react-redux"; const mapState = (state: SystemState) => ({ - selectedFsEntiesCount: state.filesystem.selectedFsEnties.length + selectedFsEntiesCount: state.filesystem.selectedFsEntities.length }); const connector = connect(mapState); From 73a55ae84bb60371485d041d4c7248c45536c7f0 Mon Sep 17 00:00:00 2001 From: Gimleux <56401687+Gimleux@users.noreply.github.com> Date: Mon, 17 May 2021 09:32:04 +0200 Subject: [PATCH 02/30] Corrected Typo in FileEntities --- src/components/pages/filesytem/FileList.tsx | 2 +- src/components/pages/filesytem/SelectedFsEntities.tsx | 8 ++++---- src/components/pages/filesytem/ToolbarActions.tsx | 6 +++--- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/components/pages/filesytem/FileList.tsx b/src/components/pages/filesytem/FileList.tsx index 8b349755..48191f3e 100644 --- a/src/components/pages/filesytem/FileList.tsx +++ b/src/components/pages/filesytem/FileList.tsx @@ -49,7 +49,7 @@ function FileList(props: Props): ReactElement { const [sortedBy, setSortedBy] = useState(null); const [sortIncreasing, setSortIncreasing] = useState(false); const allAreSelected = - filesAndFolders?.length === props.filesystem.selectedFsEnties.length; + filesAndFolders?.length === props.filesystem.selectedFsEntities.length; const clearSelected = props.clearSelected; diff --git a/src/components/pages/filesytem/SelectedFsEntities.tsx b/src/components/pages/filesytem/SelectedFsEntities.tsx index 355b8878..745eb218 100644 --- a/src/components/pages/filesytem/SelectedFsEntities.tsx +++ b/src/components/pages/filesytem/SelectedFsEntities.tsx @@ -20,7 +20,7 @@ type PropsFromRedux = ConnectedProps; type Props = PropsFromRedux & {}; function SelectedFsEntities(props: Props): ReactElement { - if (props.selectedFsEnties?.length > 0) + if (props.selectedFsEntities?.length > 0) return (
    - {props.selectedFsEnties.map((e: FsEntity) => { + {props.selectedFsEntities.map((e: FsEntity) => { return (
  • - Selected {props.selectedFsEnties.length} file - {props.selectedFsEnties.length > 1 ? "s" : ""} + Selected {props.selectedFsEntities.length} file + {props.selectedFsEntities.length > 1 ? "s" : ""} ({ - selectedFsEntiesCount: state.filesystem.selectedFsEntities.length + selectedFsEntitiesCount: state.filesystem.selectedFsEntities.length }); const connector = connect(mapState); @@ -16,10 +16,10 @@ type Props = PropsFromRedux & {}; function ToolbarActions(props: Props): ReactElement | null { return ( - + - 0}> + 0}> From 164e25a13564b23cba3f7cee4e733edfd0edace4 Mon Sep 17 00:00:00 2001 From: Gimleux <56401687+Gimleux@users.noreply.github.com> Date: Mon, 17 May 2021 09:33:42 +0200 Subject: [PATCH 03/30] Corrected Typo in FileEntities --- src/components/pages/filesytem/FileList.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/pages/filesytem/FileList.tsx b/src/components/pages/filesytem/FileList.tsx index 48191f3e..2f4787a0 100644 --- a/src/components/pages/filesytem/FileList.tsx +++ b/src/components/pages/filesytem/FileList.tsx @@ -60,9 +60,9 @@ function FileList(props: Props): ReactElement { console.log("got folder content"); setFilesAndFolders([ ...response.filter( - (fsEntiy: FsEntity) => fsEntiy.type === "FOLDER" + (fsEntity: FsEntity) => fsEntity.type === "FOLDER" ), - ...response.filter((fsEntiy: FsEntity) => fsEntiy.type !== "FOLDER") + ...response.filter((fsEntity: FsEntity) => fsEntity.type !== "FOLDER") ]); setError(""); }) From 986791076e365c0a022a4570a31f75187bb89cb8 Mon Sep 17 00:00:00 2001 From: Gimleux <56401687+Gimleux@users.noreply.github.com> Date: Mon, 17 May 2021 10:39:44 +0200 Subject: [PATCH 04/30] Add FileListContextMenu Basic --- .../pages/filesytem/FileListContextMenu.tsx | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/components/pages/filesytem/FileListContextMenu.tsx diff --git a/src/components/pages/filesytem/FileListContextMenu.tsx b/src/components/pages/filesytem/FileListContextMenu.tsx new file mode 100644 index 00000000..04d1801f --- /dev/null +++ b/src/components/pages/filesytem/FileListContextMenu.tsx @@ -0,0 +1,20 @@ +import React from "react"; +import useContextMenu from "../../../background/reactHooks/useContextMenu"; + +const Menu = ({outerRef}: any) => { + const {xPos, yPos, menu} = useContextMenu(outerRef); + + if (!menu) { + return <> + } + return ( +
      +
    • Item1
    • +
    • Item2
    • +
    • Item3
    • +
    + ); + +}; + +export default Menu; \ No newline at end of file From 3480964b4e780eb73ddded0bfa4c569d07cd950d Mon Sep 17 00:00:00 2001 From: Gimleux <56401687+Gimleux@users.noreply.github.com> Date: Mon, 17 May 2021 13:53:07 +0200 Subject: [PATCH 05/30] WIP Context menu --- src/components/pages/filesytem/FileList.tsx | 9 +++++++-- src/components/pages/filesytem/FileListContextMenu.tsx | 6 +++--- src/components/pages/filesytem/FileListItem.tsx | 8 ++++---- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/components/pages/filesytem/FileList.tsx b/src/components/pages/filesytem/FileList.tsx index 40bc80c1..4ff6ea93 100644 --- a/src/components/pages/filesytem/FileList.tsx +++ b/src/components/pages/filesytem/FileList.tsx @@ -1,4 +1,4 @@ -import React, {ReactElement, useEffect, useState} from "react"; +import React, {ReactElement, useEffect, useRef, useState} from "react"; import {getFolderContents} from "../../../background/api/filesystem"; import {FsEntity} from "../../../background/api/filesystemTypes"; import {Col, Container, Form, Row} from "react-bootstrap"; @@ -11,6 +11,7 @@ import {addToSelected, clearSelected, removeFromSelected, replaceSelected, setCo import {connect, ConnectedProps} from "react-redux"; import {FFLoading} from "../../basicElements/Loading"; import {AxiosResponse} from "axios"; +import FileListContextMenu from "./FileListContextMenu"; const mapState = (state: SystemState) => ({ filesystem: { @@ -58,6 +59,7 @@ function FileList(props: Props): ReactElement { const setCurrentPath = props.setCurrentPath; const setCurrentFsItemId = props.setCurrentFsItemId; + const outerRef = useRef(null); useEffect(() => { function updateStates(): void { @@ -143,7 +145,9 @@ function FileList(props: Props): ReactElement { console.log("[FileList path]" + path, filesAndFolders); return ( + + {/*//Head*/} @@ -179,7 +183,8 @@ function FileList(props: Props): ReactElement {
    - + {/*//Body*/} + {error ? ( {error} ) : filesAndFolders?.length === 0 ? ( diff --git a/src/components/pages/filesytem/FileListContextMenu.tsx b/src/components/pages/filesytem/FileListContextMenu.tsx index 04d1801f..007b98e1 100644 --- a/src/components/pages/filesytem/FileListContextMenu.tsx +++ b/src/components/pages/filesytem/FileListContextMenu.tsx @@ -1,14 +1,14 @@ import React from "react"; import useContextMenu from "../../../background/reactHooks/useContextMenu"; -const Menu = ({outerRef}: any) => { +const FileListContextMenu = ({outerRef}: any) => { const {xPos, yPos, menu} = useContextMenu(outerRef); if (!menu) { return <> } return ( -
      +
      • Item1
      • Item2
      • Item3
      • @@ -17,4 +17,4 @@ const Menu = ({outerRef}: any) => { }; -export default Menu; \ No newline at end of file +export default FileListContextMenu; \ No newline at end of file diff --git a/src/components/pages/filesytem/FileListItem.tsx b/src/components/pages/filesytem/FileListItem.tsx index d72e0dd5..57e1e99e 100644 --- a/src/components/pages/filesytem/FileListItem.tsx +++ b/src/components/pages/filesytem/FileListItem.tsx @@ -47,11 +47,11 @@ function FileListItem(props: Props): ReactElement { }; const handleSelectedChanged = () => { - if (isSelected) { - props.removeFromSelected(props.fileListItem); - } else { - props.addToSelected(props.fileListItem); + if (!isSelected){ + return props.addToSelected(props.fileListItem); } + props.removeFromSelected(props.fileListItem); + }; return ( From c906eb240f83974b0606d005c53f3686cac34a37 Mon Sep 17 00:00:00 2001 From: Gimleux <56401687+Gimleux@users.noreply.github.com> Date: Mon, 17 May 2021 14:00:17 +0200 Subject: [PATCH 06/30] Positioning Context Menu --- src/background/reactHooks/useContextMenu.ts | 3 +-- src/components/App.css | 2 +- .../pages/filesytem/FileListContextMenu.tsx | 2 +- src/style/helpers.scss | 12 +++++++++++- 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/background/reactHooks/useContextMenu.ts b/src/background/reactHooks/useContextMenu.ts index f5e1977e..acf8f1c7 100644 --- a/src/background/reactHooks/useContextMenu.ts +++ b/src/background/reactHooks/useContextMenu.ts @@ -1,5 +1,3 @@ -// thx to https://dev.to/rafi993/implementing-context-menu-using-react-hooks-34ke - import {RefObject, useCallback, useEffect, useState} from "react"; const useContextMenu = (outerRef: RefObject) => { @@ -10,6 +8,7 @@ const useContextMenu = (outerRef: RefObject) => { const handleContextMenu = useCallback( event => { event.preventDefault(); + console.log(outerRef) if (!outerRef?.current?.contains(event.target)) { return showMenu(false) } diff --git a/src/components/App.css b/src/components/App.css index 673d0063..f702fb35 100644 --- a/src/components/App.css +++ b/src/components/App.css @@ -15,4 +15,4 @@ main > .container { to { transform: rotate(360deg); } -} +} \ No newline at end of file diff --git a/src/components/pages/filesytem/FileListContextMenu.tsx b/src/components/pages/filesytem/FileListContextMenu.tsx index 007b98e1..6b577fd2 100644 --- a/src/components/pages/filesytem/FileListContextMenu.tsx +++ b/src/components/pages/filesytem/FileListContextMenu.tsx @@ -8,7 +8,7 @@ const FileListContextMenu = ({outerRef}: any) => { return <> } return ( -
          +
          • Item1
          • Item2
          • Item3
          • diff --git a/src/style/helpers.scss b/src/style/helpers.scss index 3ded7ac4..40bb7a4c 100644 --- a/src/style/helpers.scss +++ b/src/style/helpers.scss @@ -126,5 +126,15 @@ .login-input { max-width: 450px; - } + +/********Context Menu*********/ +.fileListContextMenu { + background-color: black; + border-radius: 2px; + padding: 10px; + margin: 10px; + position: absolute; + list-style: none; + z-index: 1000; +} \ No newline at end of file From 6b5be5eb947fd38c37d23d51b4f1aa5c3bbc7c90 Mon Sep 17 00:00:00 2001 From: Gimleux <56401687+Gimleux@users.noreply.github.com> Date: Mon, 17 May 2021 14:03:19 +0200 Subject: [PATCH 07/30] changed context menu items --- src/components/pages/filesytem/FileListContextMenu.tsx | 8 +++++--- src/style/helpers.scss | 1 + 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/components/pages/filesytem/FileListContextMenu.tsx b/src/components/pages/filesytem/FileListContextMenu.tsx index 6b577fd2..3773d471 100644 --- a/src/components/pages/filesytem/FileListContextMenu.tsx +++ b/src/components/pages/filesytem/FileListContextMenu.tsx @@ -9,9 +9,11 @@ const FileListContextMenu = ({outerRef}: any) => { } return ( ); diff --git a/src/style/helpers.scss b/src/style/helpers.scss index 40bb7a4c..19ecdd81 100644 --- a/src/style/helpers.scss +++ b/src/style/helpers.scss @@ -131,6 +131,7 @@ /********Context Menu*********/ .fileListContextMenu { background-color: black; + color: mintcream; border-radius: 2px; padding: 10px; margin: 10px; From d7dfff3383481d66003b3deaa65f40ac09492d4a Mon Sep 17 00:00:00 2001 From: Gimleux <56401687+Gimleux@users.noreply.github.com> Date: Mon, 17 May 2021 14:07:51 +0200 Subject: [PATCH 08/30] Added icons --- src/components/pages/filesytem/FileListContextMenu.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/pages/filesytem/FileListContextMenu.tsx b/src/components/pages/filesytem/FileListContextMenu.tsx index 3773d471..96d8981f 100644 --- a/src/components/pages/filesytem/FileListContextMenu.tsx +++ b/src/components/pages/filesytem/FileListContextMenu.tsx @@ -9,11 +9,11 @@ const FileListContextMenu = ({outerRef}: any) => { } return ( ); From 94fa9afbaff7203526add2d906bb91767f31847a Mon Sep 17 00:00:00 2001 From: Gimleux <56401687+Gimleux@users.noreply.github.com> Date: Mon, 17 May 2021 14:29:28 +0200 Subject: [PATCH 09/30] Added commits --- src/background/reactHooks/useContextMenu.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/background/reactHooks/useContextMenu.ts b/src/background/reactHooks/useContextMenu.ts index acf8f1c7..86bdea8b 100644 --- a/src/background/reactHooks/useContextMenu.ts +++ b/src/background/reactHooks/useContextMenu.ts @@ -1,8 +1,8 @@ import {RefObject, useCallback, useEffect, useState} from "react"; const useContextMenu = (outerRef: RefObject) => { - const [xPos, setXPos] = useState("0px"); - const [yPos, setYPos] = useState("0px"); + const [xPos, setXPos] = useState(0); //e.g. "5px" + const [yPos, setYPos] = useState(0); //e.g. "5px" const [menu, showMenu] = useState(false); const handleContextMenu = useCallback( From eca8ae2628824272ac295ae7d1396d78408df037 Mon Sep 17 00:00:00 2001 From: Gimleux <56401687+Gimleux@users.noreply.github.com> Date: Mon, 17 May 2021 14:39:26 +0200 Subject: [PATCH 10/30] removed context menu on right click --- src/background/reactHooks/useContextMenu.ts | 38 ------------------- src/components/pages/filesytem/FileList.tsx | 6 +-- .../pages/filesytem/FileListContextMenu.tsx | 22 ----------- src/style/helpers.scss | 12 ------ 4 files changed, 1 insertion(+), 77 deletions(-) delete mode 100644 src/background/reactHooks/useContextMenu.ts delete mode 100644 src/components/pages/filesytem/FileListContextMenu.tsx diff --git a/src/background/reactHooks/useContextMenu.ts b/src/background/reactHooks/useContextMenu.ts deleted file mode 100644 index 86bdea8b..00000000 --- a/src/background/reactHooks/useContextMenu.ts +++ /dev/null @@ -1,38 +0,0 @@ -import {RefObject, useCallback, useEffect, useState} from "react"; - -const useContextMenu = (outerRef: RefObject) => { - const [xPos, setXPos] = useState(0); //e.g. "5px" - const [yPos, setYPos] = useState(0); //e.g. "5px" - const [menu, showMenu] = useState(false); - - const handleContextMenu = useCallback( - event => { - event.preventDefault(); - console.log(outerRef) - if (!outerRef?.current?.contains(event.target)) { - return showMenu(false) - } - setXPos(`${event.pageX}px`); - setYPos(`${event.pageY}px`); - showMenu(true); - }, - [showMenu, outerRef, setXPos, setYPos] - ); - - const handleClick = useCallback(() => { - showMenu(false); - }, [showMenu]); - - useEffect(() => { - document.addEventListener("click", handleClick); - document.addEventListener("contextmenu", handleContextMenu); - return () => { - document.removeEventListener("click", handleClick); - document.removeEventListener("contextmenu", handleContextMenu); - }; - }, []); - - return {xPos, yPos, menu}; -}; - -export default useContextMenu; diff --git a/src/components/pages/filesytem/FileList.tsx b/src/components/pages/filesytem/FileList.tsx index 4ff6ea93..fc1fb790 100644 --- a/src/components/pages/filesytem/FileList.tsx +++ b/src/components/pages/filesytem/FileList.tsx @@ -11,7 +11,6 @@ import {addToSelected, clearSelected, removeFromSelected, replaceSelected, setCo import {connect, ConnectedProps} from "react-redux"; import {FFLoading} from "../../basicElements/Loading"; import {AxiosResponse} from "axios"; -import FileListContextMenu from "./FileListContextMenu"; const mapState = (state: SystemState) => ({ filesystem: { @@ -59,8 +58,6 @@ function FileList(props: Props): ReactElement { const setCurrentPath = props.setCurrentPath; const setCurrentFsItemId = props.setCurrentFsItemId; - const outerRef = useRef(null); - useEffect(() => { function updateStates(): void { getFolderContents(path) @@ -145,7 +142,6 @@ function FileList(props: Props): ReactElement { console.log("[FileList path]" + path, filesAndFolders); return ( - {/*//Head*/} @@ -184,7 +180,7 @@ function FileList(props: Props): ReactElement {
            {/*//Body*/} - + {error ? ( {error} ) : filesAndFolders?.length === 0 ? ( diff --git a/src/components/pages/filesytem/FileListContextMenu.tsx b/src/components/pages/filesytem/FileListContextMenu.tsx deleted file mode 100644 index 96d8981f..00000000 --- a/src/components/pages/filesytem/FileListContextMenu.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import React from "react"; -import useContextMenu from "../../../background/reactHooks/useContextMenu"; - -const FileListContextMenu = ({outerRef}: any) => { - const {xPos, yPos, menu} = useContextMenu(outerRef); - - if (!menu) { - return <> - } - return ( - - ); - -}; - -export default FileListContextMenu; \ No newline at end of file diff --git a/src/style/helpers.scss b/src/style/helpers.scss index 19ecdd81..da181c75 100644 --- a/src/style/helpers.scss +++ b/src/style/helpers.scss @@ -126,16 +126,4 @@ .login-input { max-width: 450px; -} - -/********Context Menu*********/ -.fileListContextMenu { - background-color: black; - color: mintcream; - border-radius: 2px; - padding: 10px; - margin: 10px; - position: absolute; - list-style: none; - z-index: 1000; } \ No newline at end of file From 2fa59e2678bdef44f3f40293509cd8032889e37f Mon Sep 17 00:00:00 2001 From: Gimleux <56401687+Gimleux@users.noreply.github.com> Date: Mon, 17 May 2021 14:43:47 +0200 Subject: [PATCH 11/30] refactoring --- src/components/pages/filesytem/FileList.tsx | 41 ++++++++++++++------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/src/components/pages/filesytem/FileList.tsx b/src/components/pages/filesytem/FileList.tsx index fc1fb790..f163be96 100644 --- a/src/components/pages/filesytem/FileList.tsx +++ b/src/components/pages/filesytem/FileList.tsx @@ -1,4 +1,4 @@ -import React, {ReactElement, useEffect, useRef, useState} from "react"; +import React, {ReactElement, useEffect, useState} from "react"; import {getFolderContents} from "../../../background/api/filesystem"; import {FsEntity} from "../../../background/api/filesystemTypes"; import {Col, Container, Form, Row} from "react-bootstrap"; @@ -7,7 +7,15 @@ import {FilesBreadcrumb} from "./FilesBreadcrumb"; import {filesBaseUrl} from "./Filesystem"; import FileListItem from "./FileListItem"; import {SystemState} from "../../../background/redux/actions/sytemState"; -import {addToSelected, clearSelected, removeFromSelected, replaceSelected, setContents, setCurrentFsItemId, setCurrentPath} from "../../../background/redux/actions/filesystem"; +import { + addToSelected, + clearSelected, + removeFromSelected, + replaceSelected, + setContents, + setCurrentFsItemId, + setCurrentPath +} from "../../../background/redux/actions/filesystem"; import {connect, ConnectedProps} from "react-redux"; import {FFLoading} from "../../basicElements/Loading"; import {AxiosResponse} from "axios"; @@ -62,7 +70,7 @@ function FileList(props: Props): ReactElement { function updateStates(): void { getFolderContents(path) .then((response: AxiosResponse) => { - console.log("got folder content",response); + console.log("got folder content", response); setContents([ ...response.data.filter( @@ -95,22 +103,27 @@ function FileList(props: Props): ReactElement { const handleSelectAllChanged = () => { if (allAreSelected) { - props.clearSelected(); - } else { - if (filesAndFolders) { - props.replaceSelected([...filesAndFolders]); - } + return props.clearSelected(); + } + if (filesAndFolders) { + props.replaceSelected([...filesAndFolders]); } }; - function handleSortClick(property: keyof FsEntity) { - if (!filesAndFolders || filesAndFolders.length < 2) return; + function setSortingOrder(property: keyof FsEntity) { if (sortedBy === property) { - setSortIncreasing(!sortIncreasing); - } else { - setSortedBy(property); - setSortIncreasing(true); + return setSortIncreasing(!sortIncreasing); } + setSortedBy(property); + setSortIncreasing(true); + } + + function handleSortClick(property: keyof FsEntity) { + if (!filesAndFolders || filesAndFolders.length < 2) { + return; + } + + setSortingOrder(property) let toSort = [...(filesAndFolders ?? [])]; if (property === "lastUpdated" || property === "size") { From 5c4e3b35eef79dc2121f63f9f085dc99240dda67 Mon Sep 17 00:00:00 2001 From: Gimleux <56401687+Gimleux@users.noreply.github.com> Date: Mon, 17 May 2021 14:50:46 +0200 Subject: [PATCH 12/30] extracted sorting method --- src/components/pages/filesytem/FileList.tsx | 51 +++++++++++---------- 1 file changed, 28 insertions(+), 23 deletions(-) diff --git a/src/components/pages/filesytem/FileList.tsx b/src/components/pages/filesytem/FileList.tsx index f163be96..862edb69 100644 --- a/src/components/pages/filesytem/FileList.tsx +++ b/src/components/pages/filesytem/FileList.tsx @@ -118,6 +118,33 @@ function FileList(props: Props): ReactElement { setSortIncreasing(true); } + function getSortingFunction(property: keyof FsEntity) { + switch (property) { + case "lastUpdatedBy": + case "size": + return (a: any, b: any) => + a[property] - b[property] === 0 + ? a.fileSystemId - b.fileSystemId + : a[property] - b[property] + case "name": + case "type": + return (a:any, b:any) => + a[property].toLowerCase().localeCompare(b[property].toLowerCase()) === 0 + ? a.fileSystemId - b.fileSystemId + : a[property].toLowerCase().localeCompare(b[property].toLowerCase()) + case "lastUpdated": + default: + return (a:any, b:any) => + a.lastUpdatedBy.username + .toLowerCase() + .localeCompare(b.lastUpdatedBy.username.toLowerCase()) === 0 + ? a.fileSystemId - b.fileSystemId + : a.lastUpdatedBy.username + .toLowerCase() + .localeCompare(b.lastUpdatedBy.username.toLowerCase()) + } + } + function handleSortClick(property: keyof FsEntity) { if (!filesAndFolders || filesAndFolders.length < 2) { return; @@ -126,29 +153,7 @@ function FileList(props: Props): ReactElement { setSortingOrder(property) let toSort = [...(filesAndFolders ?? [])]; - if (property === "lastUpdated" || property === "size") { - toSort.sort((a, b) => - a[property] - b[property] === 0 - ? a.fileSystemId - b.fileSystemId - : a[property] - b[property] - ); - } else if (property === "name" || property === "type") { - toSort.sort((a, b) => - a[property].toLowerCase().localeCompare(b[property].toLowerCase()) === 0 - ? a.fileSystemId - b.fileSystemId - : a[property].toLowerCase().localeCompare(b[property].toLowerCase()) - ); - } else if (property === "lastUpdatedBy") { - toSort.sort((a, b) => - a.lastUpdatedBy.username - .toLowerCase() - .localeCompare(b.lastUpdatedBy.username.toLowerCase()) === 0 - ? a.fileSystemId - b.fileSystemId - : a.lastUpdatedBy.username - .toLowerCase() - .localeCompare(b.lastUpdatedBy.username.toLowerCase()) - ); - } + toSort.sort(getSortingFunction(property)) setFilesAndFolders(sortIncreasing ? toSort.reverse() : toSort); } From 11defae3f947e9aadd954a56ab288013db357666 Mon Sep 17 00:00:00 2001 From: Gimleux <56401687+Gimleux@users.noreply.github.com> Date: Mon, 17 May 2021 14:54:15 +0200 Subject: [PATCH 13/30] remove else --- src/background/api/auth.ts | 176 +++++++++--------- .../pages/filesytem/SelectedFsEntities.tsx | 99 +++++----- 2 files changed, 136 insertions(+), 139 deletions(-) diff --git a/src/background/api/auth.ts b/src/background/api/auth.ts index 57ef7458..2480bcce 100644 --- a/src/background/api/auth.ts +++ b/src/background/api/auth.ts @@ -1,17 +1,12 @@ -import Axios, { AxiosResponse } from "axios"; +import Axios, {AxiosResponse} from "axios"; -import { hostname, userPath } from "./api"; +import {hostname, userPath} from "./api"; -import { UserState } from "../redux/actions/userTypes"; +import {UserState} from "../redux/actions/userTypes"; import store from "../redux/store"; -import { - addAccessToken, - addRefreshToken, - checkedCookies, - removeTokens -} from "../redux/actions/tokens"; -import { AccessToken, CookieStatus } from "../redux/actions/tokenTypes"; -import { deleteCookie, getCookie, setCookie } from "../methods/cookies"; +import {addAccessToken, addRefreshToken, checkedCookies, removeTokens} from "../redux/actions/tokens"; +import {AccessToken, CookieStatus} from "../redux/actions/tokenTypes"; +import {deleteCookie, getCookie, setCookie} from "../methods/cookies"; import {updateUser} from "../redux/actions/user"; import {hashPassword} from "../methods/passwords"; @@ -20,109 +15,110 @@ import {hashPassword} from "../methods/passwords"; const cookieName: string = "refreshToken"; export interface BackendLoginData { - tokenValue: string; - user: UserState; + tokenValue: string; + user: UserState; } export interface BackendAuthData { - tokenValue: string; - userId: number; - validUntil: number; + tokenValue: string; + userId: number; + validUntil: number; } export const checkForCookie = () => { - let refreshTokenCookieValue = getCookie(cookieName); - if (refreshTokenCookieValue) { + let refreshTokenCookieValue = getCookie(cookieName); + if (!refreshTokenCookieValue) { + return store.dispatch(checkedCookies(CookieStatus.FINISHED)); + } + store.dispatch(addRefreshToken(refreshTokenCookieValue)); store.dispatch(checkedCookies(CookieStatus.LOADING)); getAccessTokenWithRefreshToken(); - } else { - store.dispatch(checkedCookies(CookieStatus.FINISHED)); - } + }; -export const loginWithUsernameAndPassword = async ( - userName: string, - password: string, - stayLoggedIn: boolean +export const loginWithUsernameAndPassword = async ( + userName: string, + password: string, + stayLoggedIn: boolean ): Promise => { - console.log("[Auth] loginWithUsernameAndPassword", userName); - let hashed = await hashPassword(password); - return new Promise((resolve, reject) => { - let config = { - headers: { - Authorization: `Basic ${btoa(userName + ":" + hashed)}` - } - }; - - return Axios.get(hostname + userPath + "/login", config) - .then((data: AxiosResponse) => { - console.log(data.data); - store.dispatch(addRefreshToken(data.data.tokenValue)); - store.dispatch(updateUser(data.data.user as UserState)); - - if (stayLoggedIn) { - setCookie(cookieName, data.data.tokenValue, 60); - } - - getAccessTokenWithRefreshToken(); - }) - .catch((error) => { - reject(error); - }); - }); + console.log("[Auth] loginWithUsernameAndPassword", userName); + let hashed = await hashPassword(password); + return new Promise((resolve, reject) => { + let config = { + headers: { + Authorization: `Basic ${btoa(userName + ":" + hashed)}` + } + }; + + return Axios.get(hostname + userPath + "/login", config) + .then((data: AxiosResponse) => { + console.log(data.data); + store.dispatch(addRefreshToken(data.data.tokenValue)); + store.dispatch(updateUser(data.data.user as UserState)); + + if (stayLoggedIn) { + setCookie(cookieName, data.data.tokenValue, 60); + } + + getAccessTokenWithRefreshToken(); + }) + .catch((error) => { + reject(error); + }); + }); }; export const getAccessTokenWithRefreshToken = () => { - console.log("getAccessTokenWithRefreshToken"); + console.log("getAccessTokenWithRefreshToken"); - let refreshToken: string | null = store.getState().tokens.refreshToken; + let refreshToken: string | null = store.getState().tokens.refreshToken; - let config = { - headers: { - Authorization: `Bearer ${refreshToken}` - } - }; - - Axios.get(hostname + userPath + "/auth", config) - .then((data: AxiosResponse) => { - store.dispatch(checkedCookies(CookieStatus.FINISHED)); - setAuthHeaderToAxios(data.data.tokenValue); - - store.dispatch( - addAccessToken({ - token: data.data.tokenValue, - timestamp: data.data.validUntil - } as AccessToken) - ); - if (!store.getState().user.username) { - getOwnUserData(data.data.userId); - } - }) - .catch((error) => { - store.dispatch(removeTokens()); - store.dispatch(checkedCookies(CookieStatus.FINISHED)); - - console.log(error); - //you probably want to notify the user, maybe with a toast or similar - }); + let config = { + headers: { + Authorization: `Bearer ${refreshToken}` + } + }; + + Axios.get(hostname + userPath + "/auth", config) + .then((data: AxiosResponse) => { + store.dispatch(checkedCookies(CookieStatus.FINISHED)); + setAuthHeaderToAxios(data.data.tokenValue); + + store.dispatch( + addAccessToken({ + token: data.data.tokenValue, + timestamp: data.data.validUntil + } as AccessToken) + ); + if (!store.getState().user.username) { + getOwnUserData(data.data.userId); + } + }) + .catch((error) => { + store.dispatch(removeTokens()); + store.dispatch(checkedCookies(CookieStatus.FINISHED)); + + console.log(error); + //you probably want to notify the user, maybe with a toast or similar + }); }; const getOwnUserData = (userId: number) => { - Axios.get(`${hostname}${userPath}/${userId}/info`) - .then((response: AxiosResponse) => { - store.dispatch(updateUser(response.data)); - }) - .catch((error) => { - console.log(error); - }); + Axios.get(`${hostname}${userPath}/${userId}/info`) + .then((response: AxiosResponse) => { + store.dispatch(updateUser(response.data)); + }) + .catch((error) => { + console.log(error); + }); }; export const logout = () => { - store.dispatch(removeTokens()); - deleteCookie(cookieName); + store.dispatch(removeTokens()); + deleteCookie(cookieName); }; function setAuthHeaderToAxios(accessToken: string) { - Axios.defaults.headers.common["Authorization"] = `Bearer ${accessToken}`; + Axios.defaults.headers.common["Authorization"] = `Bearer ${accessToken}`; } diff --git a/src/components/pages/filesytem/SelectedFsEntities.tsx b/src/components/pages/filesytem/SelectedFsEntities.tsx index 74d72aa1..e6644247 100644 --- a/src/components/pages/filesytem/SelectedFsEntities.tsx +++ b/src/components/pages/filesytem/SelectedFsEntities.tsx @@ -1,16 +1,16 @@ -import { SystemState } from "../../../background/redux/actions/sytemState"; -import { connect, ConnectedProps } from "react-redux"; -import React, { ReactElement } from "react"; -import { OverlayTrigger, Tooltip } from "react-bootstrap"; -import { FsEntity } from "../../../background/api/filesystemTypes"; -import { clearSelected } from "../../../background/redux/actions/filesystem"; +import {SystemState} from "../../../background/redux/actions/sytemState"; +import {connect, ConnectedProps} from "react-redux"; +import React, {ReactElement} from "react"; +import {OverlayTrigger, Tooltip} from "react-bootstrap"; +import {FsEntity} from "../../../background/api/filesystemTypes"; +import {clearSelected} from "../../../background/redux/actions/filesystem"; const mapState = (state: SystemState) => ({ - selectedFsEntities: state.filesystem.selectedFsEntities + selectedFsEntities: state.filesystem.selectedFsEntities }); const mapDispatch = { - clearSelected + clearSelected }; const connector = connect(mapState, mapDispatch); @@ -20,55 +20,56 @@ type PropsFromRedux = ConnectedProps; type Props = PropsFromRedux & {}; function SelectedFsEntities(props: Props): ReactElement { - if (props.selectedFsEntities?.length > 0) + if (props.selectedFsEntities?.length < 1) + return {} + return ( -
            - -
              - {props.selectedFsEntities.map((e: FsEntity) => { - return ( -
            • - {e.path} -
            • - ); - })} -
            - - } - > +
            + +
              + {props.selectedFsEntities.map((e: FsEntity) => { + return ( +
            • + {e.path} +
            • + ); + })} +
            + + } + > Selected {props.selectedFsEntities.length} file - {props.selectedFsEntities.length > 1 ? "s" : ""} + {props.selectedFsEntities.length > 1 ? "s" : ""} -
            - - Clear the selection - - } - > - - -
            + +
            +
            ); - else return ; } export default connector(SelectedFsEntities); From 9940e5dbd208f1da9e97471aed6850ec493c1d4b Mon Sep 17 00:00:00 2001 From: Gimleux <56401687+Gimleux@users.noreply.github.com> Date: Mon, 17 May 2021 14:55:14 +0200 Subject: [PATCH 14/30] removed else in arrays.ts --- src/background/methods/arrays.ts | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/src/background/methods/arrays.ts b/src/background/methods/arrays.ts index 84169bd4..981ed031 100644 --- a/src/background/methods/arrays.ts +++ b/src/background/methods/arrays.ts @@ -1,16 +1,15 @@ export function divideArrayByCondition( - input: T[], - condition: (a: T) => boolean + input: T[], + condition: (a: T) => boolean ) { - let output: T[][] = [[], []]; + let output: T[][] = [[], []]; - input.forEach((el: T) => { - if (condition(el)) { - output[0].push(el); - } else { - output[1].push(el); - } - }); + input.forEach((el: T) => { + if (!condition(el)) { + return output[1].push(el); + } + output[0].push(el); + }); - return output; + return output; } From 522b45b59f41497cbf9f6494a44d8f2f04070b95 Mon Sep 17 00:00:00 2001 From: Gimleux <56401687+Gimleux@users.noreply.github.com> Date: Mon, 17 May 2021 14:58:24 +0200 Subject: [PATCH 15/30] removed else in serviceWorker --- src/serviceWorker.ts | 217 ++++++++++++++++++++++--------------------- 1 file changed, 109 insertions(+), 108 deletions(-) diff --git a/src/serviceWorker.ts b/src/serviceWorker.ts index b09523f1..e461ff58 100644 --- a/src/serviceWorker.ts +++ b/src/serviceWorker.ts @@ -11,139 +11,140 @@ // opt-in, read https://bit.ly/CRA-PWA const isLocalhost = Boolean( - window.location.hostname === 'localhost' || + window.location.hostname === 'localhost' || // [::1] is the IPv6 localhost address. window.location.hostname === '[::1]' || // 127.0.0.0/8 are considered localhost for IPv4. window.location.hostname.match( - /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/ + /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/ ) ); type Config = { - onSuccess?: (registration: ServiceWorkerRegistration) => void; - onUpdate?: (registration: ServiceWorkerRegistration) => void; + onSuccess?: (registration: ServiceWorkerRegistration) => void; + onUpdate?: (registration: ServiceWorkerRegistration) => void; }; export function register(config?: Config) { - if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) { - // The URL constructor is available in all browsers that support SW. - const publicUrl = new URL( - process.env.PUBLIC_URL, - window.location.href - ); - if (publicUrl.origin !== window.location.origin) { - // Our service worker won't work if PUBLIC_URL is on a different origin - // from what our page is served on. This might happen if a CDN is used to - // serve assets; see https://github.com/facebook/create-react-app/issues/2374 - return; - } + if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) { + // The URL constructor is available in all browsers that support SW. + const publicUrl = new URL( + process.env.PUBLIC_URL, + window.location.href + ); + if (publicUrl.origin !== window.location.origin) { + // Our service worker won't work if PUBLIC_URL is on a different origin + // from what our page is served on. This might happen if a CDN is used to + // serve assets; see https://github.com/facebook/create-react-app/issues/2374 + return; + } - window.addEventListener('load', () => { - const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`; + window.addEventListener('load', () => { + const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`; + + if (!isLocalhost) { + // Is not localhost. Just register service worker + registerValidSW(swUrl, config); + } - if (isLocalhost) { - // This is running on localhost. Let's check if a service worker still exists or not. - checkValidServiceWorker(swUrl, config); + // This is running on localhost. Let's check if a service worker still exists or not. + checkValidServiceWorker(swUrl, config); - // Add some additional logging to localhost, pointing developers to the - // service worker/PWA documentation. - navigator.serviceWorker.ready.then(() => { - console.log( - 'This web app is being served cache-first by a service ' + - 'worker. To learn more, visit https://bit.ly/CRA-PWA' - ); + // Add some additional logging to localhost, pointing developers to the + // service worker/PWA documentation. + navigator.serviceWorker.ready.then(() => { + console.log( + 'This web app is being served cache-first by a service ' + + 'worker. To learn more, visit https://bit.ly/CRA-PWA' + ); + }); }); - } else { - // Is not localhost. Just register service worker - registerValidSW(swUrl, config); - } - }); - } + } } function registerValidSW(swUrl: string, config?: Config) { - navigator.serviceWorker - .register(swUrl) - .then(registration => { - registration.onupdatefound = () => { - const installingWorker = registration.installing; - if (installingWorker == null) { - return; - } - installingWorker.onstatechange = () => { - if (installingWorker.state === 'installed') { - if (navigator.serviceWorker.controller) { - // At this point, the updated precached content has been fetched, - // but the previous service worker will still serve the older - // content until all client tabs are closed. - console.log( - 'New content is available and will be used when all ' + - 'tabs for this page are closed. See https://bit.ly/CRA-PWA.' - ); + navigator.serviceWorker + .register(swUrl) + .then(registration => { + registration.onupdatefound = () => { + const installingWorker = registration.installing; + if (installingWorker == null) { + return; + } + installingWorker.onstatechange = () => { + if (installingWorker.state === 'installed') { + if (!navigator.serviceWorker.controller) { + // At this point, everything has been precached. + // It's the perfect time to display a + // "Content is cached for offline use." message. + console.log('Content is cached for offline use.'); - // Execute callback - if (config && config.onUpdate) { - config.onUpdate(registration); - } - } else { - // At this point, everything has been precached. - // It's the perfect time to display a - // "Content is cached for offline use." message. - console.log('Content is cached for offline use.'); + // Execute callback + if (config && config.onSuccess) { + config.onSuccess(registration); + } + return + } + // At this point, the updated precached content has been fetched, + // but the previous service worker will still serve the older + // content until all client tabs are closed. + console.log( + 'New content is available and will be used when all ' + + 'tabs for this page are closed. See https://bit.ly/CRA-PWA.' + ); - // Execute callback - if (config && config.onSuccess) { - config.onSuccess(registration); - } - } - } - }; - }; - }) - .catch(error => { - console.error('Error during service worker registration:', error); - }); + // Execute callback + if (config && config.onUpdate) { + config.onUpdate(registration); + } + + } + }; + }; + }) + .catch(error => { + console.error('Error during service worker registration:', error); + }); } function checkValidServiceWorker(swUrl: string, config?: Config) { - // Check if the service worker can be found. If it can't reload the page. - fetch(swUrl, { - headers: { 'Service-Worker': 'script' } - }) - .then(response => { - // Ensure service worker exists, and that we really are getting a JS file. - const contentType = response.headers.get('content-type'); - if ( - response.status === 404 || - (contentType != null && contentType.indexOf('javascript') === -1) - ) { - // No service worker found. Probably a different app. Reload the page. - navigator.serviceWorker.ready.then(registration => { - registration.unregister().then(() => { - window.location.reload(); - }); - }); - } else { - // Service worker found. Proceed as normal. - registerValidSW(swUrl, config); - } + // Check if the service worker can be found. If it can't reload the page. + fetch(swUrl, { + headers: {'Service-Worker': 'script'} }) - .catch(() => { - console.log( - 'No internet connection found. App is running in offline mode.' - ); - }); + .then(response => { + // Ensure service worker exists, and that we really are getting a JS file. + const contentType = response.headers.get('content-type'); + if ( + response.status === 404 || + (contentType != null && contentType.indexOf('javascript') === -1) + ) { + // No service worker found. Probably a different app. Reload the page. + navigator.serviceWorker.ready.then(registration => { + registration.unregister().then(() => { + window.location.reload(); + }); + }); + } else { + // Service worker found. Proceed as normal. + registerValidSW(swUrl, config); + } + }) + .catch(() => { + console.log( + 'No internet connection found. App is running in offline mode.' + ); + }); } export function unregister() { - if ('serviceWorker' in navigator) { - navigator.serviceWorker.ready - .then(registration => { - registration.unregister(); - }) - .catch(error => { - console.error(error.message); - }); - } + if ('serviceWorker' in navigator) { + navigator.serviceWorker.ready + .then(registration => { + registration.unregister(); + }) + .catch(error => { + console.error(error.message); + }); + } } From 48333e79f421b0702e84bbf165d1bbd647f3abb5 Mon Sep 17 00:00:00 2001 From: Gimleux <56401687+Gimleux@users.noreply.github.com> Date: Mon, 17 May 2021 15:16:22 +0200 Subject: [PATCH 16/30] remove else in sortFilesAndFolders --- src/components/pages/filesytem/sortFilesAndFolders.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/components/pages/filesytem/sortFilesAndFolders.ts b/src/components/pages/filesytem/sortFilesAndFolders.ts index 2cd476f4..1aa27f31 100644 --- a/src/components/pages/filesytem/sortFilesAndFolders.ts +++ b/src/components/pages/filesytem/sortFilesAndFolders.ts @@ -10,7 +10,8 @@ function mergeObjectArraysByProperty(leftArray: any, rightArray: any, propertyNa let help: FsEntity | undefined = leftArray.shift(); if (help) arr.push(help) continue; - } else if (leftArray[0] === undefined || leftArray[0][propertyName] === undefined || !leftArray[0].hasOwnProperty(propertyName)) { + } + if (leftArray[0] === undefined || leftArray[0][propertyName] === undefined || !leftArray[0].hasOwnProperty(propertyName)) { let help: (FsEntity) | undefined = rightArray.shift(); if (help) arr.push(help) continue; @@ -26,10 +27,10 @@ function mergeObjectArraysByProperty(leftArray: any, rightArray: any, propertyNa ) { let help: (FsEntity) | undefined = leftArray.shift(); if (help) arr.push(help) - } else { - let help: (FsEntity) | undefined = rightArray.shift(); - if (help) arr.push(help) + continue; } + let help: (FsEntity) | undefined = rightArray.shift(); + if (help) arr.push(help) } // Concatenating leftover elements From e568362b31e9fa4adb6f3e049dfbfee1c35792b3 Mon Sep 17 00:00:00 2001 From: Gimleux <56401687+Gimleux@users.noreply.github.com> Date: Mon, 17 May 2021 16:14:46 +0200 Subject: [PATCH 17/30] added drop down menu --- .../__snapshots__/storybook.test.ts.snap | 144 ++++++++++++++++++ .../filesytem/FileItemContextMenu.stories.tsx | 10 ++ .../pages/filesytem/FileItemContextMenu.tsx | 25 +++ .../pages/filesytem/FileListItem.tsx | 3 +- src/style/helpers.scss | 6 + 5 files changed, 187 insertions(+), 1 deletion(-) create mode 100644 src/components/pages/filesytem/FileItemContextMenu.stories.tsx create mode 100644 src/components/pages/filesytem/FileItemContextMenu.tsx diff --git a/src/__tests__/__snapshots__/storybook.test.ts.snap b/src/__tests__/__snapshots__/storybook.test.ts.snap index e089a3f5..c404a642 100644 --- a/src/__tests__/__snapshots__/storybook.test.ts.snap +++ b/src/__tests__/__snapshots__/storybook.test.ts.snap @@ -17,6 +17,150 @@ exports[`Storyshots Error404 default 1`] = `
`; +exports[`Storyshots Filesystem Context Menu default 1`] = ` +
+
+
+ + + + + +
+ +
+
+ +
+
+
+ +
+
+
+
+ +
+
+
+
+ Type +
+
+ Share +
+
+ Name +
+
+ Last updated by +
+
+ Last changes +
+
+ Size +
+
+
+
+
+ Nothing to see here. +
+
+
+
+
+
+`; + exports[`Storyshots Filesystem UploadDecisionsModal 1`] = ` Array [
{ + return ( + + ); +}); \ No newline at end of file diff --git a/src/components/pages/filesytem/FileItemContextMenu.tsx b/src/components/pages/filesytem/FileItemContextMenu.tsx new file mode 100644 index 00000000..a209a342 --- /dev/null +++ b/src/components/pages/filesytem/FileItemContextMenu.tsx @@ -0,0 +1,25 @@ +import React from "react"; +import {Dropdown} from "react-bootstrap"; + +interface FileItemContextMenuInterface { + id: string|number +} + +function FileItemContextMenu(props:FileItemContextMenuInterface) { + const {id} = props; + return( + + + ●●● + + + + Action + Another action + Something else + + + ) +} + +export default FileItemContextMenu; \ No newline at end of file diff --git a/src/components/pages/filesytem/FileListItem.tsx b/src/components/pages/filesytem/FileListItem.tsx index 57e1e99e..2018e759 100644 --- a/src/components/pages/filesytem/FileListItem.tsx +++ b/src/components/pages/filesytem/FileListItem.tsx @@ -8,6 +8,7 @@ import {connect, ConnectedProps} from "react-redux"; import {SystemState} from "../../../background/redux/actions/sytemState"; import {addToSelected, removeFromSelected} from "../../../background/redux/actions/filesystem"; import FileIcon from "./FileIcon"; +import FileItemContextMenu from "./FileItemContextMenu"; const mapState = (state: SystemState) => ({ filesystem: { @@ -71,7 +72,7 @@ function FileListItem(props: Props): ReactElement { props.fileListItem.name )} - ... + Date: Mon, 17 May 2021 16:16:07 +0200 Subject: [PATCH 18/30] rename fileList Header --- src/components/pages/filesytem/FileList.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/pages/filesytem/FileList.tsx b/src/components/pages/filesytem/FileList.tsx index 862edb69..5df7acf9 100644 --- a/src/components/pages/filesytem/FileList.tsx +++ b/src/components/pages/filesytem/FileList.tsx @@ -181,7 +181,7 @@ function FileList(props: Props): ReactElement { {"Type"} - {"Share"} + {"Interact"} handleSortClick("name")}> {"Name"} From c374852fac9ffd24ffcda6a5c13d958b06d69cf6 Mon Sep 17 00:00:00 2001 From: Gimleux <56401687+Gimleux@users.noreply.github.com> Date: Mon, 17 May 2021 16:35:56 +0200 Subject: [PATCH 19/30] WIP Context Menu Content --- .../pages/filesytem/FileItemContextMenu.tsx | 23 ++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/src/components/pages/filesytem/FileItemContextMenu.tsx b/src/components/pages/filesytem/FileItemContextMenu.tsx index a209a342..83455203 100644 --- a/src/components/pages/filesytem/FileItemContextMenu.tsx +++ b/src/components/pages/filesytem/FileItemContextMenu.tsx @@ -5,6 +5,21 @@ interface FileItemContextMenuInterface { id: string|number } +interface DropdownItemTitleInterface { + icon?: string; + description: string +} + +const DropdownItemTitle = (props:DropdownItemTitleInterface) => { + const {icon, description} = props; + return( + + {icon} + {description} + + ) +} + function FileItemContextMenu(props:FileItemContextMenuInterface) { const {id} = props; return( @@ -14,9 +29,11 @@ function FileItemContextMenu(props:FileItemContextMenuInterface) { - Action - Another action - Something else + + 💾 Download + ⛧ Details + + ⤷ Share ) From 8c7c7cd302e240713bcbbb2c39884689769c7f83 Mon Sep 17 00:00:00 2001 From: Gimleux <56401687+Gimleux@users.noreply.github.com> Date: Tue, 18 May 2021 09:33:22 +0200 Subject: [PATCH 20/30] Basic Menu done --- .../pages/filesytem/FileItemContextMenu.tsx | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/components/pages/filesytem/FileItemContextMenu.tsx b/src/components/pages/filesytem/FileItemContextMenu.tsx index 83455203..fa84708c 100644 --- a/src/components/pages/filesytem/FileItemContextMenu.tsx +++ b/src/components/pages/filesytem/FileItemContextMenu.tsx @@ -7,16 +7,20 @@ interface FileItemContextMenuInterface { interface DropdownItemTitleInterface { icon?: string; - description: string + description: string; + target: string; + disabled?:boolean; } -const DropdownItemTitle = (props:DropdownItemTitleInterface) => { - const {icon, description} = props; +const DropdownItem = (props:DropdownItemTitleInterface) => { + const {icon, description, target, disabled=false} = props; return( - - {icon} + + + {icon} {description} + ) } @@ -29,11 +33,11 @@ function FileItemContextMenu(props:FileItemContextMenuInterface) { - - 💾 Download - ⛧ Details + + + - ⤷ Share + ) From 4c7dd2def4998cf7f9510d4a60e62c787435a842 Mon Sep 17 00:00:00 2001 From: Gimleux <56401687+Gimleux@users.noreply.github.com> Date: Tue, 18 May 2021 11:13:31 +0200 Subject: [PATCH 21/30] Implemented Download to Dropdown Menu --- src/assets/images/solidarity/61H+wX8lKPL.jpg | Bin 108943 -> 0 bytes .../solidarity/Black_Lives_Matter_logo.svg | 151 ------------------ .../solidarity/RaisedFistRainbow_MicroOne.jpg | Bin 63181 -> 0 bytes .../maxresdefault-e1549886036248-400x225.jpg | Bin 13913 -> 0 bytes .../filesytem/FileItemContextMenu.stories.tsx | 11 +- .../pages/filesytem/FileItemContextMenu.tsx | 50 ++++-- .../pages/filesytem/ToolbarActions.tsx | 5 +- 7 files changed, 44 insertions(+), 173 deletions(-) delete mode 100644 src/assets/images/solidarity/61H+wX8lKPL.jpg delete mode 100644 src/assets/images/solidarity/Black_Lives_Matter_logo.svg delete mode 100644 src/assets/images/solidarity/RaisedFistRainbow_MicroOne.jpg delete mode 100644 src/assets/images/solidarity/maxresdefault-e1549886036248-400x225.jpg diff --git a/src/assets/images/solidarity/61H+wX8lKPL.jpg b/src/assets/images/solidarity/61H+wX8lKPL.jpg deleted file mode 100644 index 1a00a423dc992928dc5df5d4672c08f9f6f4d9f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 108943 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 diff --git a/src/assets/images/solidarity/Black_Lives_Matter_logo.svg b/src/assets/images/solidarity/Black_Lives_Matter_logo.svg deleted file mode 100644 index 9831698d..00000000 --- a/src/assets/images/solidarity/Black_Lives_Matter_logo.svg +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/assets/images/solidarity/RaisedFistRainbow_MicroOne.jpg b/src/assets/images/solidarity/RaisedFistRainbow_MicroOne.jpg deleted file mode 100644 index 84b3d483fd61a3535f09a1ffe5a405f0b761cf4b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63181 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 diff --git a/src/assets/images/solidarity/maxresdefault-e1549886036248-400x225.jpg b/src/assets/images/solidarity/maxresdefault-e1549886036248-400x225.jpg deleted file mode 100644 index fe2c9ba34f181f30a42b418e169b5b18e7835c9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13913 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 diff --git a/src/components/pages/filesytem/FileItemContextMenu.stories.tsx b/src/components/pages/filesytem/FileItemContextMenu.stories.tsx index 46f3ce4d..a4f32622 100644 --- a/src/components/pages/filesytem/FileItemContextMenu.stories.tsx +++ b/src/components/pages/filesytem/FileItemContextMenu.stories.tsx @@ -3,8 +3,9 @@ import React from "react"; import FileItemContextMenu from "./FileItemContextMenu"; -storiesOf("Filesystem Context Menu", module).add("default", () => { - return ( - - ); -}); \ No newline at end of file +storiesOf("Filesystem Context Menu", module) + .add("default", () => { + return ( + + ); + }); \ No newline at end of file diff --git a/src/components/pages/filesytem/FileItemContextMenu.tsx b/src/components/pages/filesytem/FileItemContextMenu.tsx index fa84708c..247b4e13 100644 --- a/src/components/pages/filesytem/FileItemContextMenu.tsx +++ b/src/components/pages/filesytem/FileItemContextMenu.tsx @@ -1,20 +1,22 @@ -import React from "react"; -import {Dropdown} from "react-bootstrap"; +import React, {ReactElement} from "react"; +import {Button, Dropdown} from "react-bootstrap"; +import {constants} from "../../../background/constants"; interface FileItemContextMenuInterface { - id: string|number + id: number } interface DropdownItemTitleInterface { icon?: string; description: string; - target: string; - disabled?:boolean; + selectedID: number; + target?: string; + disabled?: boolean; } -const DropdownItem = (props:DropdownItemTitleInterface) => { - const {icon, description, target, disabled=false} = props; - return( +const DropdownItem = (props: DropdownItemTitleInterface): ReactElement => { + const {icon, description, selectedID, target, disabled = false} = props; + return ( {icon} @@ -24,20 +26,38 @@ const DropdownItem = (props:DropdownItemTitleInterface) => { ) } -function FileItemContextMenu(props:FileItemContextMenuInterface) { +const DropdownItemDownload = (props: DropdownItemTitleInterface) => { + const {icon, description, selectedID, disabled = false} = props; + return ( +
+ + {icon} + {description} + + +
+ ) +} + +function FileItemContextMenu(props: FileItemContextMenuInterface) { const {id} = props; - return( + return ( ●●● - - - - - + + + + + ) diff --git a/src/components/pages/filesytem/ToolbarActions.tsx b/src/components/pages/filesytem/ToolbarActions.tsx index 35e2004c..bafbca83 100644 --- a/src/components/pages/filesytem/ToolbarActions.tsx +++ b/src/components/pages/filesytem/ToolbarActions.tsx @@ -22,7 +22,7 @@ function ToolbarActions(props: Props): ReactElement | null { } /* function handleDownloadClicked() { - downloadFiles(props.selectedFsEnties) + downloadFiles(props.selectedFsEntities) } */ return ( @@ -33,7 +33,8 @@ function ToolbarActions(props: Props): ReactElement | null { 0}> -
+
From d82fe6445d82e3e303ce8cee246bb8e02a7f6808 Mon Sep 17 00:00:00 2001 From: Gimleux <56401687+Gimleux@users.noreply.github.com> Date: Tue, 18 May 2021 11:19:38 +0200 Subject: [PATCH 22/30] fixed bug in filesystem toolbar which allowed to click buttons when they are faded out --- src/components/pages/filesytem/ToolbarActions.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/pages/filesytem/ToolbarActions.tsx b/src/components/pages/filesytem/ToolbarActions.tsx index bafbca83..b9f0bda1 100644 --- a/src/components/pages/filesytem/ToolbarActions.tsx +++ b/src/components/pages/filesytem/ToolbarActions.tsx @@ -28,14 +28,14 @@ function ToolbarActions(props: Props): ReactElement | null { return ( - + - 0}> + 0} > - +
- +
From 51065c5e2d1ea9f4715d9aa84dcb724a8c067f5f Mon Sep 17 00:00:00 2001 From: Gimleux <56401687+Gimleux@users.noreply.github.com> Date: Tue, 18 May 2021 11:47:33 +0200 Subject: [PATCH 23/30] Added Binary Icon --- .../images/icons/reactSvgIcons/SymbolFile.tsx | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/assets/images/icons/reactSvgIcons/SymbolFile.tsx b/src/assets/images/icons/reactSvgIcons/SymbolFile.tsx index 890f3852..b5524c2d 100644 --- a/src/assets/images/icons/reactSvgIcons/SymbolFile.tsx +++ b/src/assets/images/icons/reactSvgIcons/SymbolFile.tsx @@ -184,6 +184,24 @@ export function FileEarmarkPDFIcon(props: React.SVGProps) { ); } +export function FileEarmarkBinaryIcon(props: React.SVGProps) { + return ( + + + + + ); +} + +export default FileEarmarkBinaryIcon; + + //--------------------------------------------------------------------\\ //--------------------------------------------------------------------\\ From 3c71a9886bfed27831ca49af7b02dfe8fbcbdd36 Mon Sep 17 00:00:00 2001 From: Gimleux <56401687+Gimleux@users.noreply.github.com> Date: Tue, 18 May 2021 12:44:09 +0200 Subject: [PATCH 24/30] Refactored FileIcons --- .prettierrc | 2 +- .../images/icons/reactSvgIcons/SymbolFile.tsx | 2 - src/background/api/filesystemTypes.ts | 1 + src/background/methods/filesystem.ts | 41 +++++++----- src/components/pages/filesytem/FileIcon.tsx | 62 ------------------- .../pages/filesytem/FileListItem.tsx | 13 ++-- .../pages/filesytem/fileIcon/FileIcon.tsx | 54 ++++++++++++++++ .../fileIcon/FileIconApplication.tsx | 46 ++++++++++++++ .../pages/filesytem/fileIcon/FileIconText.tsx | 24 +++++++ 9 files changed, 159 insertions(+), 86 deletions(-) delete mode 100644 src/components/pages/filesytem/FileIcon.tsx create mode 100644 src/components/pages/filesytem/fileIcon/FileIcon.tsx create mode 100644 src/components/pages/filesytem/fileIcon/FileIconApplication.tsx create mode 100644 src/components/pages/filesytem/fileIcon/FileIconText.tsx diff --git a/.prettierrc b/.prettierrc index d011210d..6f01081c 100644 --- a/.prettierrc +++ b/.prettierrc @@ -1,7 +1,7 @@ { "useTabs": false, "printWidth": 80, - "tabWidth": 2, + "tabWidth": 4, "singleQuote": false, "trailingComma": "none", diff --git a/src/assets/images/icons/reactSvgIcons/SymbolFile.tsx b/src/assets/images/icons/reactSvgIcons/SymbolFile.tsx index b5524c2d..10be3477 100644 --- a/src/assets/images/icons/reactSvgIcons/SymbolFile.tsx +++ b/src/assets/images/icons/reactSvgIcons/SymbolFile.tsx @@ -199,8 +199,6 @@ export function FileEarmarkBinaryIcon(props: React.SVGProps) { ); } -export default FileEarmarkBinaryIcon; - //--------------------------------------------------------------------\\ diff --git a/src/background/api/filesystemTypes.ts b/src/background/api/filesystemTypes.ts index 66cb3e3d..3f6691c7 100644 --- a/src/background/api/filesystemTypes.ts +++ b/src/background/api/filesystemTypes.ts @@ -27,4 +27,5 @@ export interface FsEntity { shared: boolean; size: number; type: string; + mimeType:string; } diff --git a/src/background/methods/filesystem.ts b/src/background/methods/filesystem.ts index 943c2017..4170e440 100644 --- a/src/background/methods/filesystem.ts +++ b/src/background/methods/filesystem.ts @@ -1,24 +1,35 @@ -import {FsEntity} from "../api/filesystemTypes"; +import { FsEntity } from "../api/filesystemTypes"; +import { reverseString } from "./strings"; export const getPathWithoutName = ( - pathWithName: string, - name: string + pathWithName: string, + name: string ): string => { - return pathWithName.substr(0, pathWithName.lastIndexOf(name.toLowerCase())); + return pathWithName.substr(0, pathWithName.lastIndexOf(name.toLowerCase())); }; -export const removeTrailingBackslash = (path : string): string => { - if (path.lastIndexOf("/") +1 === path.length){ - return path.substr(0,path.length -1) - } - return path -} +export const removeTrailingBackslash = (path: string): string => { + if (path.lastIndexOf("/") + 1 === path.length) { + return path.substr(0, path.length - 1); + } + return path; +}; + +export const isFsEntityInFolder = (fsEntity: FsEntity, path: string) => { + let fsEntityPath = getPathWithoutName(fsEntity.path, fsEntity.name); + fsEntityPath = removeTrailingBackslash(fsEntityPath); -export const isFsEntityInFolder = (fsEntity: FsEntity, path :string) =>{ - let fsEntityPath = getPathWithoutName(fsEntity.path,fsEntity.name); - fsEntityPath = removeTrailingBackslash(fsEntityPath); + return fsEntityPath === path.toLocaleLowerCase(); +}; + +export const getFileExtension = (fileName: string): string => { + let positionOfPoint = reverseString(fileName).indexOf("."); + return reverseString(reverseString(fileName).substr(0, positionOfPoint)); +}; - return fsEntityPath === path.toLocaleLowerCase(); -} +export const getMimeType = (fileName: string): string => { + let positionOfFirstSlash = fileName.indexOf("/"); + return fileName.substr(0, positionOfFirstSlash); +}; \ No newline at end of file diff --git a/src/components/pages/filesytem/FileIcon.tsx b/src/components/pages/filesytem/FileIcon.tsx deleted file mode 100644 index efed6610..00000000 --- a/src/components/pages/filesytem/FileIcon.tsx +++ /dev/null @@ -1,62 +0,0 @@ -import React, {ReactElement} from "react"; -import { - FileEarmarkCodeIcon, - FileEarmarkIcon, - FileEarmarkImageIcon, - FileEarmarkLock2Icon, - FileEarmarkMusicIcon, - FileEarmarkPDFIcon, - FileEarmarkPlayIcon, - FileEarmarkRichtextIcon, - FileEarmarkTextIcon, - FileEarmarkZipIcon, - FolderIcon -} from "../../../assets/images/icons/reactSvgIcons/SymbolFile"; -import {reverseString} from "../../../background/methods/strings"; - -const ICON_PREFERENCES = { - height: "40px", - width: "100%", - color: "secondary" -}; - -function FileIcon(isFolder: boolean, name: string): ReactElement { - if (isFolder) return ; - - let positionOfPoint = reverseString(name).indexOf("."); - if (positionOfPoint < 0) return ; - - const fileExtension = reverseString( - reverseString(name).substr(0, positionOfPoint + 1) - ); - switch (fileExtension) { - case ".txt": - return ; - case ".jpg": - return ; - case ".mp4": - return ; - case ".mp3": - return ; - case ".crypt": - return ; - case ".pdf": - return ; - case ".zip": - case ".7z": - return ; - case ".ts": - case ".tsx": - case ".js": - case ".jsx": - case ".java": - return ; - case ".md": - case ".html": - return ; - default: - return ; - } -} - -export default FileIcon \ No newline at end of file diff --git a/src/components/pages/filesytem/FileListItem.tsx b/src/components/pages/filesytem/FileListItem.tsx index 2018e759..94a9ad13 100644 --- a/src/components/pages/filesytem/FileListItem.tsx +++ b/src/components/pages/filesytem/FileListItem.tsx @@ -7,7 +7,7 @@ import {formatBytes} from "../../../background/methods/bytes"; import {connect, ConnectedProps} from "react-redux"; import {SystemState} from "../../../background/redux/actions/sytemState"; import {addToSelected, removeFromSelected} from "../../../background/redux/actions/filesystem"; -import FileIcon from "./FileIcon"; +import FileIcon from "./fileIcon/FileIcon"; import FileItemContextMenu from "./FileItemContextMenu"; const mapState = (state: SystemState) => ({ @@ -48,7 +48,7 @@ function FileListItem(props: Props): ReactElement { }; const handleSelectedChanged = () => { - if (!isSelected){ + if (!isSelected) { return props.addToSelected(props.fileListItem); } props.removeFromSelected(props.fileListItem); @@ -67,10 +67,11 @@ function FileListItem(props: Props): ReactElement { - {FileIcon( - props.fileListItem.type === "FOLDER", - props.fileListItem.name - )} + diff --git a/src/components/pages/filesytem/fileIcon/FileIcon.tsx b/src/components/pages/filesytem/fileIcon/FileIcon.tsx new file mode 100644 index 00000000..77451f33 --- /dev/null +++ b/src/components/pages/filesytem/fileIcon/FileIcon.tsx @@ -0,0 +1,54 @@ +import React, { ReactElement } from "react"; +import { + FileEarmarkIcon, + FileEarmarkImageIcon, + FileEarmarkMusicIcon, + FileEarmarkPlayIcon, + FolderIcon +} from "../../../../assets/images/icons/reactSvgIcons/SymbolFile"; +import { getFileExtension } from "../../../../background/methods/filesystem"; +import FileIconApplication from "./FileIconApplication"; +import FileIconText from "./FileIconText"; + +export interface IconPreferencesInterface { + height: string, + width: string, + color: string +} + +const ICON_PREFERENCES: IconPreferencesInterface = { + height: "40px", + width: "100%", + color: "secondary" +}; + +export interface FileIconInterface { + type: string; + mimeType: string; + name: string; +} + +function FileIcon(props: FileIconInterface): ReactElement { + //https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types + const { type, name } = props; + if (type.toUpperCase() === "FOLDER") return ; + if (getFileExtension(name) === "") return ; + + switch (type.toLowerCase()) { + case "folder": + return ; + case "text": + return ; + case "image": + return ; + case "video": + return ; + case "audio": + return ; + case "application": + default: + return ; + } +} + +export default FileIcon; \ No newline at end of file diff --git a/src/components/pages/filesytem/fileIcon/FileIconApplication.tsx b/src/components/pages/filesytem/fileIcon/FileIconApplication.tsx new file mode 100644 index 00000000..f6c5cc47 --- /dev/null +++ b/src/components/pages/filesytem/fileIcon/FileIconApplication.tsx @@ -0,0 +1,46 @@ +import React from "react"; +import { FileIconInterface, IconPreferencesInterface } from "./FileIcon"; +import { getFileExtension, getMimeType } from "../../../../background/methods/filesystem"; +import { + FileEarmarkBinaryIcon, + FileEarmarkCodeIcon, + FileEarmarkIcon, + FileEarmarkLock2Icon, + FileEarmarkPDFIcon, + FileEarmarkRichtextIcon, + FileEarmarkZipIcon +} from "../../../../assets/images/icons/reactSvgIcons/SymbolFile"; + +export default function FileIconApplication(props: { ICON_PREFERENCES: IconPreferencesInterface, FileInformation: FileIconInterface }) { + const { ICON_PREFERENCES, FileInformation } = props; + console.log("-------------------------"); + console.log(getFileExtension(FileInformation.name.toLowerCase())); + console.table(FileInformation); + console.log(getMimeType(FileInformation.mimeType)); + console.log("_________________________"); + switch (getFileExtension(FileInformation.name.toLowerCase())) { + case "java": + case "jsx": + case "ts": + case "tsx": + return ; + case "crypt": + return ; + case "md": + return ; + case "pdf": + return ; + case "7z": + case "zip": + return ; + default: { + if (FileInformation.mimeType.toLowerCase() === "application/octet-stream") { + //mime default type + return ; + } + return ; + + } + + } +} \ No newline at end of file diff --git a/src/components/pages/filesytem/fileIcon/FileIconText.tsx b/src/components/pages/filesytem/fileIcon/FileIconText.tsx new file mode 100644 index 00000000..67ca22df --- /dev/null +++ b/src/components/pages/filesytem/fileIcon/FileIconText.tsx @@ -0,0 +1,24 @@ +import React from "react"; +import FileIcon, { FileIconInterface, IconPreferencesInterface } from "./FileIcon"; +import { getFileExtension } from "../../../../background/methods/filesystem"; +import { + FileEarmarkCodeIcon, + FileEarmarkRichtextIcon, + FileEarmarkTextIcon +} from "../../../../assets/images/icons/reactSvgIcons/SymbolFile"; + +export default function FileIconText(ICON_PREFERENCES: IconPreferencesInterface, FileInformation: FileIconInterface) { + switch (getFileExtension(FileIcon.name.toLowerCase())) { + case "css": + case "java": + case "js": + case "jsx": + case "ts": + case "tsx": + return ; + case "html": + return ; + default: + return ; + } +} \ No newline at end of file From 8a32c113c6b9c6c81ea1ffd6887a2c1ca42e00d0 Mon Sep 17 00:00:00 2001 From: Gimleux <56401687+Gimleux@users.noreply.github.com> Date: Tue, 18 May 2021 13:08:33 +0200 Subject: [PATCH 25/30] Code Style --- .../pages/filesytem/FileItemContextMenu.tsx | 34 +++++++++---------- .../pages/filesytem/ToolbarActions.tsx | 20 +++++------ .../fileIcon/FileIconApplication.tsx | 12 +++---- 3 files changed, 33 insertions(+), 33 deletions(-) diff --git a/src/components/pages/filesytem/FileItemContextMenu.tsx b/src/components/pages/filesytem/FileItemContextMenu.tsx index 247b4e13..1d9652a4 100644 --- a/src/components/pages/filesytem/FileItemContextMenu.tsx +++ b/src/components/pages/filesytem/FileItemContextMenu.tsx @@ -1,6 +1,6 @@ -import React, {ReactElement} from "react"; -import {Button, Dropdown} from "react-bootstrap"; -import {constants} from "../../../background/constants"; +import React, { ReactElement } from "react"; +import { Button, Dropdown } from "react-bootstrap"; +import { constants } from "../../../background/constants"; interface FileItemContextMenuInterface { id: number @@ -15,7 +15,7 @@ interface DropdownItemTitleInterface { } const DropdownItem = (props: DropdownItemTitleInterface): ReactElement => { - const {icon, description, selectedID, target, disabled = false} = props; + const { icon, description, target, disabled = false } = props; return ( @@ -23,14 +23,14 @@ const DropdownItem = (props: DropdownItemTitleInterface): ReactElement => { {description} - ) -} + ); +}; const DropdownItemDownload = (props: DropdownItemTitleInterface) => { - const {icon, description, selectedID, disabled = false} = props; + const { icon, description, selectedID, disabled = false } = props; return (
{icon} @@ -38,11 +38,11 @@ const DropdownItemDownload = (props: DropdownItemTitleInterface) => {
- ) -} + ); +}; function FileItemContextMenu(props: FileItemContextMenuInterface) { - const {id} = props; + const { id } = props; return ( @@ -51,16 +51,16 @@ function FileItemContextMenu(props: FileItemContextMenuInterface) { - + disabled={true} /> + - + disabled={true} /> + + disabled={true} /> - ) + ); } export default FileItemContextMenu; \ No newline at end of file diff --git a/src/components/pages/filesytem/ToolbarActions.tsx b/src/components/pages/filesytem/ToolbarActions.tsx index b9f0bda1..65af027f 100644 --- a/src/components/pages/filesytem/ToolbarActions.tsx +++ b/src/components/pages/filesytem/ToolbarActions.tsx @@ -1,10 +1,10 @@ -import React, {ReactElement} from "react"; -import {Button, Fade} from "react-bootstrap"; -import {SystemState} from "../../../background/redux/actions/sytemState"; -import {connect, ConnectedProps} from "react-redux"; -import {deleteFsEntities} from "../../../background/api/filesystem"; -import {constants} from "../../../background/constants"; -import {FsEntity} from "../../../background/api/filesystemTypes"; +import React, { ReactElement } from "react"; +import { Button, Fade } from "react-bootstrap"; +import { SystemState } from "../../../background/redux/actions/sytemState"; +import { connect, ConnectedProps } from "react-redux"; +import { deleteFsEntities } from "../../../background/api/filesystem"; +import { constants } from "../../../background/constants"; +import { FsEntity } from "../../../background/api/filesystemTypes"; const mapState = (state: SystemState) => ({ selectedFsEntities: state.filesystem.selectedFsEntities @@ -30,11 +30,11 @@ function ToolbarActions(props: Props): ReactElement | null { - 0} > + 0}> -
+ Download
diff --git a/src/components/pages/filesytem/fileIcon/FileIconApplication.tsx b/src/components/pages/filesytem/fileIcon/FileIconApplication.tsx index f6c5cc47..2cf76363 100644 --- a/src/components/pages/filesytem/fileIcon/FileIconApplication.tsx +++ b/src/components/pages/filesytem/fileIcon/FileIconApplication.tsx @@ -1,6 +1,6 @@ import React from "react"; import { FileIconInterface, IconPreferencesInterface } from "./FileIcon"; -import { getFileExtension, getMimeType } from "../../../../background/methods/filesystem"; +import { getFileExtension } from "../../../../background/methods/filesystem"; import { FileEarmarkBinaryIcon, FileEarmarkCodeIcon, @@ -13,11 +13,11 @@ import { export default function FileIconApplication(props: { ICON_PREFERENCES: IconPreferencesInterface, FileInformation: FileIconInterface }) { const { ICON_PREFERENCES, FileInformation } = props; - console.log("-------------------------"); - console.log(getFileExtension(FileInformation.name.toLowerCase())); - console.table(FileInformation); - console.log(getMimeType(FileInformation.mimeType)); - console.log("_________________________"); + // console.log("-------------------------"); + // console.log(getFileExtension(FileInformation.name.toLowerCase())); + // console.table(FileInformation); + // console.log(getMimeType(FileInformation.mimeType)); + // console.log("_________________________"); switch (getFileExtension(FileInformation.name.toLowerCase())) { case "java": case "jsx": From d6d7b7bbf8bcbbd9cbf927327c0bf1d337a6b2fe Mon Sep 17 00:00:00 2001 From: Gimleux <56401687+Gimleux@users.noreply.github.com> Date: Tue, 18 May 2021 13:10:39 +0200 Subject: [PATCH 26/30] updated snapshot tests --- .../__snapshots__/storybook.test.ts.snap | 161 ++---------------- 1 file changed, 18 insertions(+), 143 deletions(-) diff --git a/src/__tests__/__snapshots__/storybook.test.ts.snap b/src/__tests__/__snapshots__/storybook.test.ts.snap index c404a642..5298ca0f 100644 --- a/src/__tests__/__snapshots__/storybook.test.ts.snap +++ b/src/__tests__/__snapshots__/storybook.test.ts.snap @@ -19,145 +19,20 @@ exports[`Storyshots Error404 default 1`] = ` exports[`Storyshots Filesystem Context Menu default 1`] = `
-
-
- - - - - -
- -
-
- -
-
-
- -
-
-
-
- -
-
-
-
- Type -
-
- Share -
-
- Name -
-
- Last updated by -
-
- Last changes -
-
- Size -
-
-
-
-
- Nothing to see here. -
-
-
-
-
+
`; @@ -308,7 +183,7 @@ exports[`Storyshots Filesystem default 1`] = `
Download + action={constants.url.FH_URL + "/download"}> + e.fileSystemId.toString())}/> +
From d509313d931fbb52cda97f3aa19c8050db0c2bac Mon Sep 17 00:00:00 2001 From: qvalentin Date: Tue, 18 May 2021 17:46:21 +0200 Subject: [PATCH 30/30] add query parameter forwarding to nginx --- webapp_provider/nginx.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapp_provider/nginx.conf b/webapp_provider/nginx.conf index ad4fa46b..06c0ceaf 100644 --- a/webapp_provider/nginx.conf +++ b/webapp_provider/nginx.conf @@ -36,7 +36,7 @@ http { client_max_body_size 30G; resolver 127.0.0.11 valid=30s; set $upstream_Filehandler FileFighterFileHandler; - proxy_pass http://$upstream_Filehandler:5000$uri; + proxy_pass http://$upstream_Filehandler:5000$uri$is_args$args; proxy_redirect off; }