From 7d6c6c6321b39b62e88f4e1412e04badcc9849c4 Mon Sep 17 00:00:00 2001 From: MK13 Date: Fri, 6 May 2022 23:01:23 +0200 Subject: [PATCH] Basic implementation for files app --- bookmarks/pom.xml | 38 ++ .../de/nbscloud/bookmarks/BookmarksApp.java | 38 ++ dashboard/pom.xml | 38 ++ .../de/nbscloud/dashboard/DashboardApp.java | 38 ++ .../controller/DashboardController.java | 27 ++ .../resources/static/css/dashboard_main.css | 3 + .../resources/templates/dashboard/index.html | 22 ++ files/pom.xml | 77 ++-- .../de/nbscloud/files/FileSystemService.java | 267 +++++++++++++- .../main/java/de/nbscloud/files/FilesApp.java | 38 ++ .../de/nbscloud/files/FilesFormatter.java | 110 ++++++ .../de/nbscloud/files/LocationTracker.java | 43 ++- .../de/nbscloud/files/config/FilesConfig.java | 47 +++ .../files/controller/FilesController.java | 336 ++++++++++++++++++ .../de/nbscloud/files/form/RenameForm.java | 37 ++ .../files/task/OrphanedThumbnailCleanup.java | 4 + .../resources/config/application.properties | 14 - .../config/files-application.properties | 29 ++ .../resources/i18n/files_messages.properties | 26 ++ .../i18n/files_messages_de_DE.properties | 26 ++ .../resources/static/css/files_gallery.css | 39 ++ .../main/resources/static/css/files_main.css | 170 +++++++++ .../resources/templates/files/filesIndex.html | 118 ++++++ .../resources/templates/files/gallery.html | 24 ++ .../templates/files/includes/menu.html | 35 ++ .../resources/templates/files/rename.html | 34 ++ notes/pom.xml | 37 ++ .../main/java/de/nbscloud/notes/NotesApp.java | 38 ++ pastebin/pom.xml | 38 ++ .../de/nbscloud/pastebin/PastebinApp.java | 38 ++ pom.xml | 143 +++++++- todo/pom.xml | 37 ++ .../main/java/de/nbscloud/todo/TodoApp.java | 38 ++ web-container-config/pom.xml | 26 ++ .../config/WebContainerSharedConfig.java | 43 +++ .../config/shared-application.properties | 10 + web-container-registry/pom.xml | 22 ++ .../nbscloud/webcontainer/registry/App.java | 18 + .../webcontainer/registry/AppRegistry.java | 23 ++ web-container/pom.xml | 62 +++- .../config/WebContainerConfig.java | 6 + .../controller/WebContainerController.java | 58 +++ .../resources/config/application.properties | 20 ++ .../i18n/container_messages.properties | 3 + .../i18n/container_messages_de_DE.properties | 3 + .../src/main/resources/static/changelog.txt | 2 + .../resources/static/css/darkModeColors.css | 12 + .../resources/static/css/lightModeColors.css | 12 + .../src/main/resources/static/css/main.css | 95 +++++ .../static/font/Material_Icons.woff2 | Bin 0 -> 100160 bytes .../static/font/SourceCodePro_Bold_600.woff2 | Bin 0 -> 14004 bytes .../font/SourceCodePro_Regular_400.woff2 | Bin 0 -> 14172 bytes .../resources/templates/includes/footer.html | 8 + .../resources/templates/includes/header.html | 5 + 54 files changed, 2381 insertions(+), 94 deletions(-) create mode 100644 bookmarks/pom.xml create mode 100644 bookmarks/src/main/java/de/nbscloud/bookmarks/BookmarksApp.java create mode 100644 dashboard/pom.xml create mode 100644 dashboard/src/main/java/de/nbscloud/dashboard/DashboardApp.java create mode 100644 dashboard/src/main/java/de/nbscloud/dashboard/controller/DashboardController.java create mode 100644 dashboard/src/main/resources/static/css/dashboard_main.css create mode 100644 dashboard/src/main/resources/templates/dashboard/index.html create mode 100644 files/src/main/java/de/nbscloud/files/FilesApp.java create mode 100644 files/src/main/java/de/nbscloud/files/FilesFormatter.java create mode 100644 files/src/main/java/de/nbscloud/files/controller/FilesController.java create mode 100644 files/src/main/java/de/nbscloud/files/form/RenameForm.java create mode 100644 files/src/main/java/de/nbscloud/files/task/OrphanedThumbnailCleanup.java delete mode 100644 files/src/main/resources/config/application.properties create mode 100644 files/src/main/resources/config/files-application.properties create mode 100644 files/src/main/resources/i18n/files_messages.properties create mode 100644 files/src/main/resources/i18n/files_messages_de_DE.properties create mode 100644 files/src/main/resources/static/css/files_gallery.css create mode 100644 files/src/main/resources/static/css/files_main.css create mode 100644 files/src/main/resources/templates/files/filesIndex.html create mode 100644 files/src/main/resources/templates/files/gallery.html create mode 100644 files/src/main/resources/templates/files/includes/menu.html create mode 100644 files/src/main/resources/templates/files/rename.html create mode 100644 notes/pom.xml create mode 100644 notes/src/main/java/de/nbscloud/notes/NotesApp.java create mode 100644 pastebin/pom.xml create mode 100644 pastebin/src/main/java/de/nbscloud/pastebin/PastebinApp.java create mode 100644 todo/pom.xml create mode 100644 todo/src/main/java/de/nbscloud/todo/TodoApp.java create mode 100644 web-container-config/pom.xml create mode 100644 web-container-config/src/main/java/de/nbscloud/webcontainer/shared/config/WebContainerSharedConfig.java create mode 100644 web-container-config/src/main/resources/config/shared-application.properties create mode 100644 web-container-registry/pom.xml create mode 100644 web-container-registry/src/main/java/de/nbscloud/webcontainer/registry/App.java create mode 100644 web-container-registry/src/main/java/de/nbscloud/webcontainer/registry/AppRegistry.java create mode 100644 web-container/src/main/java/de/nbscloud/webcontainer/controller/WebContainerController.java create mode 100644 web-container/src/main/resources/config/application.properties create mode 100644 web-container/src/main/resources/i18n/container_messages.properties create mode 100644 web-container/src/main/resources/i18n/container_messages_de_DE.properties create mode 100644 web-container/src/main/resources/static/changelog.txt create mode 100644 web-container/src/main/resources/static/css/darkModeColors.css create mode 100644 web-container/src/main/resources/static/css/lightModeColors.css create mode 100644 web-container/src/main/resources/static/css/main.css create mode 100644 web-container/src/main/resources/static/font/Material_Icons.woff2 create mode 100644 web-container/src/main/resources/static/font/SourceCodePro_Bold_600.woff2 create mode 100644 web-container/src/main/resources/static/font/SourceCodePro_Regular_400.woff2 create mode 100644 web-container/src/main/resources/templates/includes/footer.html create mode 100644 web-container/src/main/resources/templates/includes/header.html diff --git a/bookmarks/pom.xml b/bookmarks/pom.xml new file mode 100644 index 0000000..5019f7d --- /dev/null +++ b/bookmarks/pom.xml @@ -0,0 +1,38 @@ + + + 4.0.0 + + + nbs-cloud-aggregator + de.77zzcx7.nbs-cloud + 1-SNAPSHOT + + + de.77zzcx7.nbs-cloud + bookmarks + jar + + + + de.77zzcx7.nbs-cloud + web-container-registry + + + de.77zzcx7.nbs-cloud + web-container-config + + + org.springframework.boot + spring-boot-starter-thymeleaf + provided + + + org.springframework.boot + spring-boot-starter-web + provided + + + + \ No newline at end of file diff --git a/bookmarks/src/main/java/de/nbscloud/bookmarks/BookmarksApp.java b/bookmarks/src/main/java/de/nbscloud/bookmarks/BookmarksApp.java new file mode 100644 index 0000000..5d96e63 --- /dev/null +++ b/bookmarks/src/main/java/de/nbscloud/bookmarks/BookmarksApp.java @@ -0,0 +1,38 @@ +package de.nbscloud.bookmarks; + +import de.nbscloud.webcontainer.registry.App; +import de.nbscloud.webcontainer.registry.AppRegistry; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class BookmarksApp implements App, InitializingBean { + @Autowired + private AppRegistry appRegistry; + + @Override + public String getId() { + return "bookmarks"; + } + + @Override + public String getIcon() { + return null; + } + + @Override + public String getStartPath() { + return this.getId(); + } + + @Override + public int getIndex() { + return 30; + } + + @Override + public void afterPropertiesSet() throws Exception { + this.appRegistry.registerApp(this); + } +} diff --git a/dashboard/pom.xml b/dashboard/pom.xml new file mode 100644 index 0000000..476913a --- /dev/null +++ b/dashboard/pom.xml @@ -0,0 +1,38 @@ + + + 4.0.0 + + + nbs-cloud-aggregator + de.77zzcx7.nbs-cloud + 1-SNAPSHOT + + + de.77zzcx7.nbs-cloud + dashboard + jar + + + + de.77zzcx7.nbs-cloud + web-container-registry + + + de.77zzcx7.nbs-cloud + web-container-config + + + org.springframework.boot + spring-boot-starter-thymeleaf + provided + + + org.springframework.boot + spring-boot-starter-web + provided + + + + \ No newline at end of file diff --git a/dashboard/src/main/java/de/nbscloud/dashboard/DashboardApp.java b/dashboard/src/main/java/de/nbscloud/dashboard/DashboardApp.java new file mode 100644 index 0000000..2c44431 --- /dev/null +++ b/dashboard/src/main/java/de/nbscloud/dashboard/DashboardApp.java @@ -0,0 +1,38 @@ +package de.nbscloud.dashboard; + +import de.nbscloud.webcontainer.registry.App; +import de.nbscloud.webcontainer.registry.AppRegistry; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class DashboardApp implements App, InitializingBean { + @Autowired + private AppRegistry appRegistry; + + @Override + public String getId() { + return "dashboard"; + } + + @Override + public String getIcon() { + return null; + } + + @Override + public String getStartPath() { + return this.getId(); + } + + @Override + public int getIndex() { + return 0; + } + + @Override + public void afterPropertiesSet() throws Exception { + this.appRegistry.registerApp(this); + } +} diff --git a/dashboard/src/main/java/de/nbscloud/dashboard/controller/DashboardController.java b/dashboard/src/main/java/de/nbscloud/dashboard/controller/DashboardController.java new file mode 100644 index 0000000..a75362c --- /dev/null +++ b/dashboard/src/main/java/de/nbscloud/dashboard/controller/DashboardController.java @@ -0,0 +1,27 @@ +package de.nbscloud.dashboard.controller; + +import de.nbscloud.webcontainer.registry.AppRegistry; +import de.nbscloud.webcontainer.shared.config.WebContainerSharedConfig; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; + +import javax.servlet.http.HttpServletRequest; + +@Controller +public class DashboardController { + + @Autowired + private WebContainerSharedConfig webContainerSharedConfig; + @Autowired + private AppRegistry appRegistry; + + @GetMapping("/dashboard") + public String start(Model model, HttpServletRequest httpServletRequest, String sortOrder) { + model.addAttribute("apps", this.appRegistry.getAll()); + this.webContainerSharedConfig.addDefaults(model); + + return "dashboard/index"; + } +} diff --git a/dashboard/src/main/resources/static/css/dashboard_main.css b/dashboard/src/main/resources/static/css/dashboard_main.css new file mode 100644 index 0000000..c663e10 --- /dev/null +++ b/dashboard/src/main/resources/static/css/dashboard_main.css @@ -0,0 +1,3 @@ +#content-container { + padding-top: 2em; +} \ No newline at end of file diff --git a/dashboard/src/main/resources/templates/dashboard/index.html b/dashboard/src/main/resources/templates/dashboard/index.html new file mode 100644 index 0000000..192fcd1 --- /dev/null +++ b/dashboard/src/main/resources/templates/dashboard/index.html @@ -0,0 +1,22 @@ + + + + + + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <link th:if="${darkMode}" rel="stylesheet" th:href="@{/css/darkModeColors.css}" /> + <link th:if="${!darkMode}" rel="stylesheet" th:href="@{/css/lightModeColors.css}" /> + <link rel="stylesheet" th:href="@{/css/main.css}" /> + <link rel="stylesheet" th:href="@{/css/dashboard_main.css}" /> + <link rel="shortcut icon" th:href="@{/favicon.ico}" /> +</head> +<body> +<div id="main-container"> + <div th:replace="includes/header :: header"/> + <div id="content-container"> + Welcome to nbscloud + </div> + <div th:replace="includes/footer :: footer"/> +</div> +</body> +</html> \ No newline at end of file diff --git a/files/pom.xml b/files/pom.xml index 7be073b..47bec73 100644 --- a/files/pom.xml +++ b/files/pom.xml @@ -15,46 +15,61 @@ <packaging>jar</packaging> <dependencies> -<!-- <dependency>--> -<!-- <groupId>org.springframework.boot</groupId>--> -<!-- <artifactId>spring-boot-starter-data-jpa</artifactId>--> -<!-- </dependency>--> -<!-- <dependency>--> -<!-- <groupId>org.springframework.boot</groupId>--> -<!-- <artifactId>spring-boot-starter-security</artifactId>--> -<!-- </dependency>--> + <dependency> + <groupId>de.77zzcx7.nbs-cloud</groupId> + <artifactId>web-container-registry</artifactId> + </dependency> + <dependency> + <groupId>de.77zzcx7.nbs-cloud</groupId> + <artifactId>web-container-config</artifactId> + </dependency> + <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> + <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> - </dependency> -<!-- <dependency>--> -<!-- <groupId>org.flywaydb</groupId>--> -<!-- <artifactId>flyway-core</artifactId>--> -<!-- </dependency>--> -<!-- <dependency>--> -<!-- <groupId>org.thymeleaf.extras</groupId>--> -<!-- <artifactId>thymeleaf-extras-springsecurity5</artifactId>--> -<!-- </dependency>--> - - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> -<!-- <dependency>--> -<!-- <groupId>org.springframework.boot</groupId>--> -<!-- <artifactId>spring-boot-starter-test</artifactId>--> -<!-- <scope>test</scope>--> -<!-- </dependency>--> -<!-- <dependency>--> -<!-- <groupId>org.springframework.security</groupId>--> -<!-- <artifactId>spring-security-test</artifactId>--> -<!-- <scope>test</scope>--> -<!-- </dependency>--> + <dependency> + <groupId>org.overviewproject</groupId> + <artifactId>mime-types</artifactId> + </dependency> + <dependency> + <groupId>commons-io</groupId> + <artifactId>commons-io</artifactId> + </dependency> + <dependency> + <groupId>org.apache.commons</groupId> + <artifactId>commons-lang3</artifactId> + </dependency> + <!-- <dependency>--> + <!-- <groupId>org.flywaydb</groupId>--> + <!-- <artifactId>flyway-core</artifactId>--> + <!-- </dependency>--> + <!-- <dependency>--> + <!-- <groupId>org.thymeleaf.extras</groupId>--> + <!-- <artifactId>thymeleaf-extras-springsecurity5</artifactId>--> + <!-- </dependency>--> + + <!-- <dependency>--> + <!-- <groupId>org.springframework.boot</groupId>--> + <!-- <artifactId>spring-boot-starter-tomcat</artifactId>--> + <!-- <scope>provided</scope>--> + <!-- </dependency>--> + <!-- <dependency>--> + <!-- <groupId>org.springframework.boot</groupId>--> + <!-- <artifactId>spring-boot-starter-test</artifactId>--> + <!-- <scope>test</scope>--> + <!-- </dependency>--> + <!-- <dependency>--> + <!-- <groupId>org.springframework.security</groupId>--> + <!-- <artifactId>spring-security-test</artifactId>--> + <!-- <scope>test</scope>--> + <!-- </dependency>--> </dependencies> </project> \ No newline at end of file diff --git a/files/src/main/java/de/nbscloud/files/FileSystemService.java b/files/src/main/java/de/nbscloud/files/FileSystemService.java index 912f7eb..98677b9 100644 --- a/files/src/main/java/de/nbscloud/files/FileSystemService.java +++ b/files/src/main/java/de/nbscloud/files/FileSystemService.java @@ -1,20 +1,82 @@ package de.nbscloud.files; import de.nbscloud.files.config.FilesConfig; +import de.nbscloud.files.controller.FilesController; import de.nbscloud.files.exception.FileSystemServiceException; +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; +import org.overviewproject.mime_types.GetBytesException; +import org.overviewproject.mime_types.MimeTypeDetector; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.List; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.file.*; +import java.nio.file.attribute.BasicFileAttributes; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.*; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; import java.util.stream.Collectors; @Service public class FileSystemService { - public record ContentContainer(boolean directory, String name, long size) { + private static final Logger logger = LoggerFactory.getLogger(FileSystemService.class); + + public static record ContentContainer(boolean directory, Path path, String name, long size, + LocalDateTime lastModified) { + } + + public enum SortOrder { + /** + * First by type (directories first), then by name ignoring case + */ + NATURAL(Comparator.comparing(ContentContainer::directory) + .reversed() + .thenComparing(con -> con.path().getFileName().toString().toLowerCase())), + + NATURAL_REVERSE(NATURAL.comparator.reversed()), + + SIZE_DESC(Comparator.comparing(ContentContainer::size).reversed()), + + SIZE_ASC(Comparator.comparing(ContentContainer::size)), + + LAST_MOD_DESC(Comparator.comparing(ContentContainer::lastModified).reversed()), + + LAST_MOD_ASC(Comparator.comparing(ContentContainer::lastModified)); + + private Comparator<ContentContainer> comparator; + + SortOrder(Comparator<ContentContainer> comparator) { + this.comparator = comparator; + } + + public static SortOrder ofQueryParam(String param) { + return Arrays.stream(values()).filter(so -> so.name().equalsIgnoreCase(param)).findFirst() + .orElse(SortOrder.NATURAL); + } + } + + public enum MimeTypeFilter { + IMAGES("image/jpeg", "image/png"), + VIDEOS("video/mpeg", "video/mp4", "video/quicktime", "video/x-msvideo"), + AUDIO("audio/mpeg", "audio/x-wav", "audio/x-flac", "audio/flac", "audio/MPA", "audio/mpa-robust"); + + private List<String> mimeTypes; + + MimeTypeFilter(String... mimeTypes) { + this.mimeTypes = Arrays.asList(mimeTypes); + } + + public boolean match(String mimeType) { + return this.mimeTypes.contains(mimeType); + } } @Autowired @@ -23,44 +85,211 @@ public class FileSystemService { @Autowired private LocationTracker locationTracker; + private MimeTypeDetector mimeTypeDetector = new MimeTypeDetector(); + public Path createDirectory(String name) { try { - return Files.createDirectory(this.locationTracker.getCurrentLocation().resolve(name)); + return Files.createDirectories(this.locationTracker.getCurrentLocation().resolve(name)); } catch (IOException e) { throw new FileSystemServiceException("Could not create directory", e); } } + public void createFile(String name, byte[] content) { + try { + Files.write(this.locationTracker.getCurrentLocation() + .resolve(name), content, StandardOpenOption.WRITE, StandardOpenOption.CREATE_NEW); + } catch (IOException e) { + throw new FileSystemServiceException("Could not create file", e); + } + } + + public void createFile(Path path, byte[] content) { + try { + Files.write(path, content, StandardOpenOption.WRITE, StandardOpenOption.CREATE_NEW); + } catch (IOException e) { + throw new FileSystemServiceException("Could not create file", e); + } + } + public boolean delete(String name) { try { + // TODO does only delete dirs if they are empty - but maybe we want that? return Files.deleteIfExists(this.locationTracker.getCurrentLocation().resolve(name)); } catch (IOException e) { throw new FileSystemServiceException("Could not delete file", e); } } - // TODO soft vs hard delete - first move into /trash then delete from there public Path move(Path originalPath, Path newPath) { try { - return Files.move(originalPath, newPath); + return Files.move(originalPath, newPath, StandardCopyOption.ATOMIC_MOVE); } catch (IOException e) { throw new FileSystemServiceException("Could not move file", e); } } - public List<ContentContainer> list() { + public byte[] get(String name) { try { - return Files.list(this.locationTracker.getCurrentLocation()) - .map(path -> { - try { - return new ContentContainer(Files.isDirectory(path), - path.getFileName().toString(), - Files.size(path)); - } catch (IOException e) { - throw new FileSystemServiceException("Could not list files", e); - } - }) - .collect(Collectors.toList()); + return Files.readAllBytes(this.locationTracker.getCurrentLocation().resolve(name)); + } catch (IOException e) { + throw new FileSystemServiceException("Could not get file", e); + } + } + + public void stream(String name, OutputStream outputStream) { + try { + Files.copy(this.locationTracker.getCurrentLocation().resolve(name), outputStream); + } catch (IOException e) { + throw new FileSystemServiceException("Could not get file", e); + } + } + + public InputStream stream(String name) { + try { + return Files.newInputStream(this.locationTracker.getCurrentLocation().resolve(name)); + } catch (IOException e) { + throw new FileSystemServiceException("Could not get file", e); + } + } + + public long getSize(String name) { + try { + return Files.size(this.locationTracker.getCurrentLocation().resolve(name)); + } catch (IOException e) { + throw new FileSystemServiceException("Could not get file", e); + } + } + + public String getMimeType(String name) { + try { + final String detectedMimeType = this.mimeTypeDetector.detectMimeType(this.locationTracker.getCurrentLocation() + .resolve(name)); + + logger.debug("Detected mime type {} for file {}", detectedMimeType, name); + + return detectedMimeType; + } catch (GetBytesException e) { + throw new FileSystemServiceException("Could not get mime type", e); + } + } + + public List<String> getFilesWithMimeType(MimeTypeFilter mimeTypeFilter) { + try { + final Map<String, CompletableFuture<String>> fileFutureMap = new HashMap<>(); + + Files.list(this.locationTracker.getCurrentLocation()) + .filter(Files::isRegularFile) + .forEach(path -> { + fileFutureMap.put(path.getFileName().toString(), this.mimeTypeDetector.detectMimeTypeAsync(path) + .toCompletableFuture()); + }); + + CompletableFuture.allOf(fileFutureMap.values().toArray(new CompletableFuture[0])).join(); + + return fileFutureMap.entrySet().stream().filter(e -> { + try { + return mimeTypeFilter.match(e.getValue().get()); + } catch (InterruptedException | ExecutionException ex) { + throw new FileSystemServiceException("Could not determine mime types", ex); + } + }).map(Map.Entry::getKey).collect(Collectors.toList()); + } catch (IOException e) { + throw new FileSystemServiceException("Could not get file", e); + } + } + + public List<ContentContainer> list(SortOrder sortOrder) { + try { + List<ContentContainer> contentList = Files.list(this.locationTracker.getCurrentLocation()) + .filter(path -> { + boolean ok = Files.isRegularFile(path, LinkOption.NOFOLLOW_LINKS) || Files.isDirectory(path); + + try { + return ok && (this.filesConfig.isFilterHidden() ? !Files.isHidden(path) : true); + } catch (IOException e) { + throw new FileSystemServiceException("Could not filter files", e); + } + }) + .map(path -> { + try { + final boolean isDir = Files.isDirectory(path); + + return new ContentContainer(isDir, + this.locationTracker.getRelativeToBaseDir(path), + path.getFileName().toString(), + isDir ? FileUtils.sizeOfDirectory(path.toFile()) : Files.size(path), + LocalDateTime.ofInstant(Files.getLastModifiedTime(path) + .toInstant(), ZoneId.systemDefault())); + } catch (IOException e) { + throw new FileSystemServiceException("Could not list files", e); + } + }) + .collect(Collectors.toList()); + contentList.sort(sortOrder.comparator); + + return contentList; + } catch (IOException e) { + throw new FileSystemServiceException("Could not list files", e); + } + } + + public List<String> collectDirs(String sourceFile) { + try { + final List<String> resultList = new ArrayList<>(); + final Path sourcePath = this.locationTracker.getCurrentLocation().resolve(sourceFile); + final boolean sourceIsDir = Files.isDirectory(sourcePath); + + Files.walkFileTree(this.locationTracker.getBaseDirPath(), new SimpleFileVisitor<Path>() { + @Override + public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { + super.visitFile(dir, attrs); + + if (sourceIsDir && sourcePath.equals(dir)) { + return FileVisitResult.SKIP_SUBTREE; + } + + if (filesConfig.isFilterHidden() ? Files.isHidden(dir) : false) { + return FileVisitResult.SKIP_SUBTREE; + } + + if (dir.toString().contains(filesConfig.getTrashBinName())) { + return FileVisitResult.SKIP_SUBTREE; + } + + if (dir.toString().contains(filesConfig.getSharesName())) { + return FileVisitResult.SKIP_SUBTREE; + } + + final String relPath = locationTracker.getRelativeToBaseDir(dir).toString(); + + resultList.add("/" + relPath); + + return FileVisitResult.CONTINUE; + } + + public FileVisitResult postVisitDirectory(Path dir, IOException exc) { + return FileVisitResult.SKIP_SUBTREE; + } + + public FileVisitResult visitFileFailed(Path file, IOException exc) { + return FileVisitResult.SKIP_SUBTREE; + } + }); + + Collections.sort(resultList); + resultList.sort((s1, s2) -> { + if (StringUtils.equals(s1, "/")) { + return 1; + } + if (StringUtils.equals(s2, "/")) { + return 1; + } + + return 0; + }); + + return resultList; } catch (IOException e) { throw new FileSystemServiceException("Could not list files", e); } diff --git a/files/src/main/java/de/nbscloud/files/FilesApp.java b/files/src/main/java/de/nbscloud/files/FilesApp.java new file mode 100644 index 0000000..f49f557 --- /dev/null +++ b/files/src/main/java/de/nbscloud/files/FilesApp.java @@ -0,0 +1,38 @@ +package de.nbscloud.files; + +import de.nbscloud.webcontainer.registry.App; +import de.nbscloud.webcontainer.registry.AppRegistry; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class FilesApp implements App, InitializingBean { + @Autowired + private AppRegistry appRegistry; + + @Override + public String getId() { + return "files"; + } + + @Override + public String getIcon() { + return null; + } + + @Override + public String getStartPath() { + return this.getId() + "/browse"; + } + + @Override + public int getIndex() { + return 10; + } + + @Override + public void afterPropertiesSet() throws Exception { + this.appRegistry.registerApp(this); + } +} diff --git a/files/src/main/java/de/nbscloud/files/FilesFormatter.java b/files/src/main/java/de/nbscloud/files/FilesFormatter.java new file mode 100644 index 0000000..9749044 --- /dev/null +++ b/files/src/main/java/de/nbscloud/files/FilesFormatter.java @@ -0,0 +1,110 @@ +package de.nbscloud.files; + +import de.nbscloud.files.config.FilesConfig; +import org.apache.commons.io.FileUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.math.BigDecimal; +import java.math.BigInteger; +import java.math.MathContext; +import java.math.RoundingMode; + +@Component +public class FilesFormatter { + enum Units { + P(FileUtils.ONE_KB * FileUtils.ONE_KB * FileUtils.ONE_KB * FileUtils.ONE_KB * FileUtils.ONE_KB, null), + T(FileUtils.ONE_KB * FileUtils.ONE_KB * FileUtils.ONE_KB * FileUtils.ONE_KB, P), + G(FileUtils.ONE_KB * FileUtils.ONE_KB * FileUtils.ONE_KB, T), + M(FileUtils.ONE_KB * FileUtils.ONE_KB, G), + K(FileUtils.ONE_KB, M); + + final long minByteSize; + final Units immediatlyHigherUnit; + + private Units(long minByteSize, Units immediatlyHigherUnit) { + this.minByteSize = minByteSize; + this.immediatlyHigherUnit = immediatlyHigherUnit; + } + } + + private static final MathContext MC_BYTE_TO_HUMAN_LESS_100 = new MathContext(2, RoundingMode.UP); + private static final MathContext MC_BYTE_TO_HUMAN_LESS_1000 = new MathContext(3, RoundingMode.UP); + private static final MathContext MC_BYTE_TO_HUMAN_MORE_1000 = new MathContext(4, RoundingMode.UP); + + @Autowired + private FilesConfig filesConfig; + + public String truncateFilename(String name) { + String filename = name; + final int lastDotIndex = filename.lastIndexOf("."); + final int configMaxLength = this.filesConfig.getTruncateFileNameChars() - 5; // -5 for ellipses " ... " + final int filenameLength = filename.length(); + + if (lastDotIndex <= 0) { + if ((configMaxLength + 5) >= filenameLength) { + return filename; + } else { + return filename.substring(0, configMaxLength) + "..."; + } + } + + final String suffix = filename.substring(lastDotIndex, filenameLength); + + if ((configMaxLength + 5) >= filenameLength) { + return filename; + } else { + filename = filename.replace(suffix, ""); + + return filename.substring(0, configMaxLength - suffix.length()) + " ... " + suffix; + } + } + + public boolean needsTruncate(String name) { + return !name.equals(truncateFilename(name)); + } + + // Taken from: https://issues.apache.org/jira/secure/attachment/12670724/byteCountToHumanReadableGnu.patch + public String formatSize(final long size) { + String humanReadableOutput = null; + for (Units u : Units.values()) { + if (size >= u.minByteSize) { + double numOfUnits = (double) size / (double) u.minByteSize; + + // if there is no decimals and the number is less than ten + // then we want to format as X.0; numOfUnits.toString() does it for us + if (Math.ceil(numOfUnits) == numOfUnits && numOfUnits < 10d) { + humanReadableOutput = numOfUnits + u.toString(); + } else { + // we need to do some rounding + BigDecimal bdNumbOfUnits = new BigDecimal(numOfUnits); + + if (numOfUnits < 100d) { + bdNumbOfUnits = bdNumbOfUnits.round(MC_BYTE_TO_HUMAN_LESS_100); + } else if (numOfUnits < 1000d) { + bdNumbOfUnits = bdNumbOfUnits.round(MC_BYTE_TO_HUMAN_LESS_1000); + } else { + bdNumbOfUnits = bdNumbOfUnits.round(MC_BYTE_TO_HUMAN_MORE_1000); + // special case, if we get 1024, we should display one of the higher unit!! + if (bdNumbOfUnits.longValue() == FileUtils.ONE_KB && u.immediatlyHigherUnit != null) { + humanReadableOutput = "1.0" + u.immediatlyHigherUnit.toString(); + break; + } + } + + humanReadableOutput = bdNumbOfUnits.toPlainString() + u.toString(); + } + } + // exit the loop + if (humanReadableOutput != null) { + break; + } + } + + if (humanReadableOutput == null) { + humanReadableOutput = "" + size; + } + return humanReadableOutput; + } + +} diff --git a/files/src/main/java/de/nbscloud/files/LocationTracker.java b/files/src/main/java/de/nbscloud/files/LocationTracker.java index d527cfe..ded9ff4 100644 --- a/files/src/main/java/de/nbscloud/files/LocationTracker.java +++ b/files/src/main/java/de/nbscloud/files/LocationTracker.java @@ -1,6 +1,9 @@ package de.nbscloud.files; import de.nbscloud.files.config.FilesConfig; +import de.nbscloud.files.controller.FilesController; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -9,6 +12,8 @@ import java.nio.file.Paths; @Component public class LocationTracker { + private static final Logger logger = LoggerFactory.getLogger(LocationTracker.class); + @Autowired private FilesConfig filesConfig; @@ -17,10 +22,14 @@ public class LocationTracker { public void init() { this.baseDirPath = Paths.get(this.filesConfig.getBaseDir()); - this.currentLocation = baseDirPath.resolve(""); + this.currentLocation = this.baseDirPath.resolve(""); + + logger.info("Initialized location to {}", this.currentLocation); } public void reset() { + logger.debug("Reset location"); + init(); } @@ -28,10 +37,34 @@ public class LocationTracker { return this.currentLocation; } + public Path getRelativeLocation() { + return this.baseDirPath.relativize(this.currentLocation); + } + + public Path getRelativeToBaseDir(Path other) { + return this.baseDirPath.relativize(other); + } + + public Path getTrashBin() { + return this.baseDirPath.resolve(this.filesConfig.getTrashBinName()); + } + + public boolean isTrashBin() { + return this.currentLocation.equals(this.getTrashBin()); + } + + public boolean isBasePath() { + return this.baseDirPath.equals(this.currentLocation); + } + + public Path getParent() { + return this.baseDirPath.relativize(this.currentLocation.getParent()); + } + public void setCurrentLocation(String navigateTo) { validate(navigateTo); - this.currentLocation = this.currentLocation.resolve(navigateTo); + this.currentLocation = this.baseDirPath.resolve(navigateTo); } private void validate(String navigateTo) { @@ -47,8 +80,12 @@ public class LocationTracker { throw new IllegalStateException("Absolute path: " + navigateTo); } - if(!this.currentLocation.resolve(navigateTo).startsWith(this.baseDirPath)) { + if(!this.baseDirPath.resolve(navigateTo).startsWith(this.baseDirPath)) { throw new IllegalStateException("Illegal path: " + navigateTo); } } + + public Path getBaseDirPath() { + return baseDirPath; + } } diff --git a/files/src/main/java/de/nbscloud/files/config/FilesConfig.java b/files/src/main/java/de/nbscloud/files/config/FilesConfig.java index 698d33d..d59806e 100644 --- a/files/src/main/java/de/nbscloud/files/config/FilesConfig.java +++ b/files/src/main/java/de/nbscloud/files/config/FilesConfig.java @@ -2,11 +2,18 @@ package de.nbscloud.files.config; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; @Configuration @ConfigurationProperties(prefix = "nbs-cloud.files") +@PropertySource("classpath:/config/files-application.properties") public class FilesConfig { private String baseDir; + private boolean filterHidden; + private boolean useTrashBin; + private String trashBinName; + private int truncateFileNameChars; + private String sharesName; public String getBaseDir() { return baseDir; @@ -15,4 +22,44 @@ public class FilesConfig { public void setBaseDir(String baseDir) { this.baseDir = baseDir; } + + public boolean isFilterHidden() { + return filterHidden; + } + + public void setFilterHidden(boolean filterHidden) { + this.filterHidden = filterHidden; + } + + public boolean isUseTrashBin() { + return useTrashBin; + } + + public void setUseTrashBin(boolean useTrashBin) { + this.useTrashBin = useTrashBin; + } + + public String getTrashBinName() { + return trashBinName; + } + + public void setTrashBinName(String trashBinName) { + this.trashBinName = trashBinName; + } + + public int getTruncateFileNameChars() { + return truncateFileNameChars; + } + + public void setTruncateFileNameChars(int truncateFileNameChars) { + this.truncateFileNameChars = truncateFileNameChars; + } + + public String getSharesName() { + return sharesName; + } + + public void setSharesName(String sharesName) { + this.sharesName = sharesName; + } } diff --git a/files/src/main/java/de/nbscloud/files/controller/FilesController.java b/files/src/main/java/de/nbscloud/files/controller/FilesController.java new file mode 100644 index 0000000..391b349 --- /dev/null +++ b/files/src/main/java/de/nbscloud/files/controller/FilesController.java @@ -0,0 +1,336 @@ +package de.nbscloud.files.controller; + +import de.nbscloud.files.FileSystemService; +import de.nbscloud.files.LocationTracker; +import de.nbscloud.files.config.FilesConfig; +import de.nbscloud.files.exception.FileSystemServiceException; +import de.nbscloud.files.form.RenameForm; +import de.nbscloud.webcontainer.registry.AppRegistry; +import de.nbscloud.webcontainer.shared.config.WebContainerSharedConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.io.InputStreamResource; +import org.springframework.core.io.Resource; +import org.springframework.http.HttpHeaders; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.util.UriUtils; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.FileAlreadyExistsException; +import java.nio.file.Path; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +@Controller +public class FilesController implements InitializingBean { + + private static final Logger logger = LoggerFactory.getLogger(FilesController.class); + + @Autowired + private FilesConfig filesConfig; + @Autowired + private LocationTracker locationTracker; + @Autowired + private WebContainerSharedConfig webContainerSharedConfig; + @Autowired + private FileSystemService fileSystemService; + @Autowired + private AppRegistry appRegistry; + + // We have to temporarily store messages as we redirect: in the manipulation methods + // so everything we add to the model will be gone + private final List<String> errors = new ArrayList<>(); + private final List<String> shareInfo = new ArrayList<>(); + private final List<String> infoMessages = new ArrayList<>(); + + @GetMapping("/files/browse/**") + public String start(Model model, HttpServletRequest httpServletRequest, String sortOrder) { + final FileSystemService.SortOrder order = FileSystemService.SortOrder.ofQueryParam(sortOrder); + + updateLocation(httpServletRequest); + + model.addAttribute("errors", getAndClear(this.errors)); + model.addAttribute("infoMessages", getAndClear(this.infoMessages)); + model.addAttribute("shareInfo", getAndClear(this.shareInfo)); + model.addAttribute("currentLocation", getCurrentLocationPrefixed()); + model.addAttribute("content", getContent(order)); + model.addAttribute("sortOrder", order); + model.addAttribute("apps", this.appRegistry.getAll()); + this.webContainerSharedConfig.addDefaults(model); + + return "files/filesIndex"; + } + + @GetMapping("/files/delete") + public String deleteFile(String filename) { + if (this.filesConfig.isUseTrashBin() && !this.locationTracker.isTrashBin()) { + try { + // Soft delete + this.fileSystemService.move( + this.locationTracker.getCurrentLocation().resolve(Path.of(filename)), + this.locationTracker.getTrashBin().resolve(filename)); + + this.infoMessages.add("nbscloud.files.delete.success"); + } catch (RuntimeException e) { + logger.error("Could not soft delete file", e); + + this.errors.add(e.getMessage()); + } + } else { + // Hard delete + this.fileSystemService.delete(filename); + + this.infoMessages.add("nbscloud.files.delete.success"); + } + + return "redirect:/files/browse/" + this.locationTracker.getRelativeLocation(); + } + + @GetMapping("/files/rename") + public String rename(Model model, String filename) { + model.addAttribute("currentLocation", getCurrentLocationPrefixed()); + model.addAttribute("form", new RenameForm(filename, getCurrentLocation(), filename)); + model.addAttribute("targetDirs", this.fileSystemService.collectDirs(filename)); + model.addAttribute("apps", this.appRegistry.getAll()); + this.webContainerSharedConfig.addDefaults(model); + + return "files/rename"; + } + + @PostMapping("/files/doRename") + public String doRename(RenameForm form) { + final Path sourcePath = this.locationTracker.getCurrentLocation().resolve(Path.of(form.getOriginalFilename())); + + // We navigate to the target dir, so we display the content of that dir after the move + this.locationTracker.setCurrentLocation(form.getTargetDir().substring(1)); + + final Path targetPath = this.locationTracker.getCurrentLocation().resolve(Path.of(form.getFilename())); + + try { + this.fileSystemService.move(sourcePath, targetPath); + + this.infoMessages.add("nbscloud.files.rename.success"); + } catch (RuntimeException e) { + logger.error("Could not rename file", e); + + this.errors.add(e.getMessage()); + } + + return "redirect:/files/browse/" + this.locationTracker.getRelativeLocation(); + } + + @GetMapping("/files/download") + public ResponseEntity<Resource> downloadFile(String filename) { + // TODO download of directories via .zip? Also needs to be streaming + + try { + return ResponseEntity.ok() + .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + filename + "\"") + .header(HttpHeaders.CONTENT_TYPE, this.fileSystemService.getMimeType(filename)) + .header(HttpHeaders.CONTENT_LENGTH, String.valueOf(this.fileSystemService.getSize(filename))) + .body(new InputStreamResource(this.fileSystemService.stream(filename))); + } catch (RuntimeException e) { + logger.error("Could not get file", e); + + return ResponseEntity.internalServerError().body(null); + } + } + + @PostMapping("/files/upload") + public String uploadFiles(@RequestParam("files") MultipartFile[] files) { + for (MultipartFile file : files) { + try { + this.fileSystemService.createFile(file.getOriginalFilename(), file.getBytes()); + + this.infoMessages.add("nbscloud.files.created.file.success"); + } catch (IOException e) { + logger.error("Could not upload file", e); + + this.errors.add(e.getMessage()); + } + } + + return "redirect:/files/browse/" + this.locationTracker.getRelativeLocation(); + } + + @PostMapping("/files/createDir") + public String createDir(@RequestParam("dirName") String dirName) { + try { + this.fileSystemService.createDirectory(dirName); + + this.infoMessages.add("nbscloud.files.created.dir.success"); + } catch (RuntimeException e) { + logger.error("Could not create dir", e); + + this.errors.add(e.getMessage()); + } + + return "redirect:/files/browse/" + this.locationTracker.getRelativeLocation(); + } + + @GetMapping("/files/share") + public String share(String filename) { + final Path filePath = this.locationTracker.getRelativeToBaseDir(this.locationTracker.getCurrentLocation() + .resolve(filename)); + final String shareUuid = UUID.randomUUID().toString(); + + try { + this.fileSystemService.createFile(this.locationTracker.getBaseDirPath() + .resolve(this.filesConfig.getSharesName()) + .resolve(shareUuid), filePath.toString() + .getBytes(StandardCharsets.UTF_8)); + + this.shareInfo.add("/files/shares?shareUuid=" + shareUuid); + } catch (RuntimeException e) { + logger.error("Could not share file", e); + + this.errors.add(e.getMessage()); + } + + + return "redirect:/files/browse/" + this.locationTracker.getRelativeLocation(); + } + + @GetMapping("files/shares") + public ResponseEntity shares(String shareUuid) { + try { + final String sharedFile = new String(this.fileSystemService.get(this.locationTracker.getBaseDirPath() + .resolve(this.filesConfig.getSharesName()) + .resolve(shareUuid) + .toString())); + final Path sharedFilePath = this.locationTracker.getBaseDirPath().resolve(sharedFile); + final String filename = sharedFilePath.getFileName().toString(); + + return ResponseEntity.ok() + .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + filename + "\"") + .header(HttpHeaders.CONTENT_TYPE, this.fileSystemService.getMimeType(filename)) + .header(HttpHeaders.CONTENT_LENGTH, String.valueOf(this.fileSystemService.getSize(filename))) + .body(new InputStreamResource(this.fileSystemService.stream(filename))); + } catch (RuntimeException e) { + logger.error("Could not get shared file", e); + + return ResponseEntity.internalServerError().body(null); + } + } + + @GetMapping("files/preview") + public void preview(HttpServletResponse response, String filename) { + try { + response.setContentType(this.fileSystemService.getMimeType(filename)); + response.setHeader(HttpHeaders.CONTENT_LENGTH, String.valueOf(this.fileSystemService.getSize(filename))); + response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "filename=\"" + filename + "\""); + + this.fileSystemService.stream(filename, response.getOutputStream()); + } catch (FileSystemServiceException | IOException e) { + logger.error("Could not preview file", e); + } + } + + @GetMapping("files/gallery") + public String gallery(Model model) { + try { + final List<String> files = this.fileSystemService.getFilesWithMimeType(FileSystemService.MimeTypeFilter.IMAGES); + + model.addAttribute("files", files); + model.addAttribute("apps", this.appRegistry.getAll()); + this.webContainerSharedConfig.addDefaults(model); + + return "files/gallery"; + } catch (FileSystemServiceException e) { + logger.error("Could not generate gallery", e); + + this.errors.add(e.getMessage()); + + return "redirect:/files/browse/" + this.locationTracker.getRelativeLocation(); + } + } + + private List<String> getAndClear(List<String> source) { + final List<String> retList = new ArrayList<>(source); + + source.clear(); + + return retList; + } + + private List<FileSystemService.ContentContainer> getContent(FileSystemService.SortOrder order) { + final List<FileSystemService.ContentContainer> contentList = this.fileSystemService.list(order); + + if (!this.locationTracker.isBasePath()) { + contentList.add(0, + new FileSystemService.ContentContainer(true, + this.locationTracker.getParent(), + "..", + 0L, + LocalDateTime.ofInstant(Instant.EPOCH, ZoneId.of("UTC")))); + } + + return contentList; + } + + private void updateLocation(HttpServletRequest httpServletRequest) { + final String requestUrl = httpServletRequest.getRequestURL().toString(); + final String[] split = requestUrl.split("/files/browse"); + + if (split.length > 1) { + this.locationTracker.setCurrentLocation(UriUtils.decode(split[1].substring(1), StandardCharsets.UTF_8)); + } else { + this.locationTracker.reset(); + } + } + + private String getCurrentLocation() { + if (this.locationTracker.getRelativeLocation().toString().isEmpty()) { + return "/"; + } + + return this.locationTracker.getRelativeLocation().toString(); + } + + private String getCurrentLocationPrefixed() { + if (this.locationTracker.getRelativeLocation().toString().isEmpty()) { + return "/"; + } + + return "/" + this.locationTracker.getRelativeLocation().toString(); + } + + @Override + public void afterPropertiesSet() throws Exception { + this.locationTracker.init(); + + if (this.filesConfig.isUseTrashBin()) { + try { + this.fileSystemService.createDirectory(this.filesConfig.getTrashBinName()); + } catch (FileSystemServiceException e) { + if (!FileAlreadyExistsException.class.equals(e.getCause().getClass())) { + throw e; + } + // else: do nothing + } + } + try { + this.fileSystemService.createDirectory(this.filesConfig.getSharesName()); + } catch (FileSystemServiceException e) { + if (!FileAlreadyExistsException.class.equals(e.getCause().getClass())) { + throw e; + } + // else: do nothing + } + } +} diff --git a/files/src/main/java/de/nbscloud/files/form/RenameForm.java b/files/src/main/java/de/nbscloud/files/form/RenameForm.java new file mode 100644 index 0000000..77c17b0 --- /dev/null +++ b/files/src/main/java/de/nbscloud/files/form/RenameForm.java @@ -0,0 +1,37 @@ +package de.nbscloud.files.form; + +public class RenameForm { + private String filename; + private String targetDir; + private String originalFilename; + + public RenameForm(String filename, String targetDir, String originalFilename) { + this.filename = filename; + this.targetDir = targetDir; + this.originalFilename = originalFilename; + } + + public String getFilename() { + return filename; + } + + public void setFilename(String filename) { + this.filename = filename; + } + + public String getTargetDir() { + return targetDir; + } + + public void setTargetDir(String targetDir) { + this.targetDir = targetDir; + } + + public String getOriginalFilename() { + return originalFilename; + } + + public void setOriginalFilename(String originalFilename) { + this.originalFilename = originalFilename; + } +} diff --git a/files/src/main/java/de/nbscloud/files/task/OrphanedThumbnailCleanup.java b/files/src/main/java/de/nbscloud/files/task/OrphanedThumbnailCleanup.java new file mode 100644 index 0000000..2d0dd86 --- /dev/null +++ b/files/src/main/java/de/nbscloud/files/task/OrphanedThumbnailCleanup.java @@ -0,0 +1,4 @@ +package de.nbscloud.files.task; + +public class OrphanedThumbnailCleanup { +} diff --git a/files/src/main/resources/config/application.properties b/files/src/main/resources/config/application.properties deleted file mode 100644 index 9c3732e..0000000 --- a/files/src/main/resources/config/application.properties +++ /dev/null @@ -1,14 +0,0 @@ -### This is the main configuration file of the application. -### Filtering of the @...@ values happens via the maven-resource-plugin. The execution of the plugin is configured in -### the Spring Boot parent POM.// The same property exists on the server, look there for documentation -spring.profiles.active=@activeProfiles@ - -info.app.name=NoBullShit Cloud - Files app -info.app.description=A simple web file admin app -info.build.group=@project.groupId@ -info.build.artifact=@project.artifactId@ -info.build.version=@project.version@ - -nbs-cloud.files.baseDir=/home/marius - -spring.flyway.enabled=false \ No newline at end of file diff --git a/files/src/main/resources/config/files-application.properties b/files/src/main/resources/config/files-application.properties new file mode 100644 index 0000000..91a975b --- /dev/null +++ b/files/src/main/resources/config/files-application.properties @@ -0,0 +1,29 @@ +spring.profiles.active=@activeProfiles@ + +info.app.name=NoBullShit Cloud - Files app +info.app.description=A simple web file admin app + +# Knob to configure the base dir where files stores and reads files +# Make sure the permissions match +#nbs-cloud.files.baseDir=/home/marius/nbstest +nbs-cloud.files.baseDir=/home/marius + +# Knob to configure whether hidden files (e.g. starting with '.' on *NIX) +# will be filtered in the file view +# Possible values: true|false +nbs-cloud.files.filterHidden=true + +# Knob to configure whether a trash bin should be used +# or the files should be hard deleted +# Possible values: true|false +nbs-cloud.files.useTrashBin=true + +# Knob to configure the name of the trash bin directory +nbs-cloud.files.trashBinName=nbs.internal/nbs.trashbin + +# Knob to configure the amount of character after which the filename +# will be truncated +nbs-cloud.files.truncateFileNameChars=130 + +# Knob to configure the name of the shares directory +nbs-cloud.files.sharesName=nbs.internal/nbs.shares \ No newline at end of file diff --git a/files/src/main/resources/i18n/files_messages.properties b/files/src/main/resources/i18n/files_messages.properties new file mode 100644 index 0000000..9247cbf --- /dev/null +++ b/files/src/main/resources/i18n/files_messages.properties @@ -0,0 +1,26 @@ +nbscloud.files.index.title=nbscloud - files\:\u0020 + +nbscloud.files.files-content-table.table-header.filename=Filename +nbscloud.files.files-content-table.table-header.size=Size +nbscloud.files.files-content-table.table-header.lastmodified=Last modified +nbscloud.files.files-content-table.table-header.actions=Actions + +nbscloud.files-content-table.table.actions.delete=Delete +nbscloud.files-content-table.table.actions.rename=Rename/move +nbscloud.files-content-table.table.actions.download=Download +nbscloud.files-content-table.table.actions.share=Share +nbscloud.files-content-table.table.actions.preview=Preview + +nbscloud.files.rename.title=nbscloud - files\: rename/move \u0020 + +nbscloud.files.rename.label.filename=Filename\: +nbscloud.files.rename.label.targetDir=Target directory\: + +nbscloud.files.rename.submit=Rename/move + +nbscloud.files.share-message=Shared file\:\u0020 + +nbscloud.files.delete.success=File deleted +nbscloud.files.rename.success=File renamed +nbscloud.files.created.file.success=File created +nbscloud.files.created.dir.success=Directory created \ No newline at end of file diff --git a/files/src/main/resources/i18n/files_messages_de_DE.properties b/files/src/main/resources/i18n/files_messages_de_DE.properties new file mode 100644 index 0000000..a0f2eb6 --- /dev/null +++ b/files/src/main/resources/i18n/files_messages_de_DE.properties @@ -0,0 +1,26 @@ +nbscloud.files.index.title=nbscloud - Dateien\:\u0020 + +nbscloud.files.files-content-table.table-header.filename=Dateiname +nbscloud.files.files-content-table.table-header.size=Gr\u00F6\u00DFe +nbscloud.files.files-content-table.table-header.lastmodified=Zuletzt ge\u00E4ndert +nbscloud.files.files-content-table.table-header.actions=Aktionen + +nbscloud.files-content-table.table.actions.delete=L\u00F6schen +nbscloud.files-content-table.table.actions.rename=Umbenennen/verschieben +nbscloud.files-content-table.table.actions.download=Download +nbscloud.files-content-table.table.actions.share=Teilen +nbscloud.files-content-table.table.actions.preview=Vorschau + +nbscloud.files.rename.title=nbscloud - Dateien\: umbenennen/verschieben \u0020 + +nbscloud.files.rename.label.filename=Dateiname\: +nbscloud.files.rename.label.targetDir=Zielverzeichnis\: + +nbscloud.files.rename.submit=Umbenennen/verschieben + +nbscloud.files.share-message=Datei geteilt\:\u0020 + +nbscloud.files.delete.success=Datei gel\u00F6scht +nbscloud.files.rename.success=Datei verschoben/umbenannt +nbscloud.files.created.file.success=Datei erstellt +nbscloud.files.created.dir.success=Verzeichnis erstellt \ No newline at end of file diff --git a/files/src/main/resources/static/css/files_gallery.css b/files/src/main/resources/static/css/files_gallery.css new file mode 100644 index 0000000..38d5443 --- /dev/null +++ b/files/src/main/resources/static/css/files_gallery.css @@ -0,0 +1,39 @@ +#main-container { + padding-left: unset !important; + padding-right: unset !important; + padding-top: unset !important; + padding-bottom: unset !important; +} + +#gallery-container { + padding-top: 2em; +} + +#header-container { + padding-left: 3em; + padding-top: 3em; + padding-left: 3em; +} + +.galleryImage { + width: 15%; + padding-inline: 0.5em; + padding-bottom: 0.5em; + vertical-align: top; +} + +@media only screen and (max-width: 450px) { + .galleryImage { + width: 45%; + } + + #gallery-container { + padding-top: 1em; + } + + #header-container { + padding-left: 1em; + padding-top: 1em; + padding-left: 1em; + } +} \ No newline at end of file diff --git a/files/src/main/resources/static/css/files_main.css b/files/src/main/resources/static/css/files_main.css new file mode 100644 index 0000000..0c01f51 --- /dev/null +++ b/files/src/main/resources/static/css/files_main.css @@ -0,0 +1,170 @@ +#files-content-table { + width: 100%; +} + +#files-content-table th { + position: sticky; + background-color: var(--background-color); + top: 0px; +} + +#type-column { + width: 1%; +} + +#name-column { + width: auto; +} + +#size-column { + width: 1%; +} + +#lastmod-column { + width: 1%; +} + +#actions-column { + width: 1%; +} + +.files-table-padded-col { + padding-right: 2em; +} + +.files-table-text-align-right { + text-align: right; +} + +#files-content-table > tbody > tr > td > details > summary { + list-style-type: none; +} + +#files-content-table > tbody > tr > td > details[open] > summary { + list-style-type: none; +} + +#files-content-table > tbody > tr > td > details > summary:hover { + cursor: pointer; +} + +#rename-form { + margin-top: 3em; + margin-left: 3em; +} + +#rename-form * { + display: block; + margin-top: 1em; + box-sizing: border-box; +} +#rename-form > select > * { + margin-top: unset; +} + +#rename-form > select { + width: 70em; +} + +#rename-form > input[type=text] { + width: 70em; +} + +#menu-container { + padding-top: 2em; + margin-left: 3em; +} + +.files-menu-icon { + background: none !important; + border: none; + padding: 0 !important; + color: var(--text-color); + cursor: pointer; + font-size: 2em; +} + +.files-menu-icon:hover { + color: var(--link-color); +} + +#content-container { + padding-top: unset !important; +} + +#create-dir-container > details > summary { + list-style-type: none; +} + +#create-dir-container > details[open] > summary { + list-style-type: none; +} + +#menu-container > div { + display: inline-block !important; +} + +.create-dir-container-details-modal-content { + padding: 0.5em; + pointer-events: all; + display: inline; +} + +.create-dir-container-details-modal { + background: var(--background-color); + filter: brightness(var(--background-brightness)); + border-radius: 0.3em; + left: auto; + top: auto; + right: auto; + bottom: auto; + padding: 0; + pointer-events: none; + position: absolute; + display: flex; + flex-direction: column; + z-index: 100; +} + +.menu-spacer { + width: 2em; +} + +.messageContainer { + width: 100%; + display: flex; + flex-direction: row; + justify-content: center; +} + +.message { + margin-top: 2em; + border: 1px; + border-style: solid; + border-radius: 0.3em; + padding: 1em; + display: inline-block; +} + +.shareMessage { + border-color: var(--good-color) !important; +} + +.infoMessage { + border-color: var(--good-color) !important; +} + +.errorMessage { + border-color: var(--error-color) !important; +} + +@media only screen and (max-width: 450px) { + #menu-container { + padding-top: 1em; + margin-left: 1em; + } + + .menu-spacer { + width: 1em; + } +} \ No newline at end of file diff --git a/files/src/main/resources/templates/files/filesIndex.html b/files/src/main/resources/templates/files/filesIndex.html new file mode 100644 index 0000000..299217d --- /dev/null +++ b/files/src/main/resources/templates/files/filesIndex.html @@ -0,0 +1,118 @@ +<!DOCTYPE HTML> +<html xmlns:th="http://www.thymeleaf.org"> +<head> + <title th:text="#{nbscloud.files.index.title} + ${currentLocation}"/> + + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <link th:if="${darkMode}" rel="stylesheet" th:href="@{/css/darkModeColors.css}"/> + <link th:if="${!darkMode}" rel="stylesheet" th:href="@{/css/lightModeColors.css}"/> + <link rel="stylesheet" th:href="@{/css/main.css}"/> + <link rel="stylesheet" th:href="@{/css/files_main.css}"/> + <link rel="shortcut icon" th:href="@{/favicon.ico}"/> +</head> +<body> +<div id="main-container"> + <div th:replace="includes/header :: header"/> + <div class="messageContainer" th:each="shareInfo : ${shareInfo}"> + <div th:if="${!shareInfo.isEmpty()}" class="shareMessage message"> + <span th:text="#{'nbscloud.files.share-message'}"/> + <a th:href="@{${shareInfo}}" th:text="${shareInfo}"/> + </div> + </div> + <div class="messageContainer" th:each="error : ${errors}"> + <div th:if="${!errors.isEmpty()}" class="errorMessage message"> + <span th:text="${error}"/> + </div> + </div> + <div class="messageContainer" th:each="infoMessage : ${infoMessages}"> + <div th:if="${!infoMessages.isEmpty()}" class="infoMessage message"> + <span th:text="#{${infoMessage}}"/> + </div> + </div> + <div th:replace="files/includes/menu :: menu"/> + <div id="content-container"> + <table id="files-content-table"> + <tr> + <th id="type-column" class="no-mobile"/> + <th id="name-column"> + <a nowrap th:if="${sortOrder != T(de.nbscloud.files.FileSystemService.SortOrder).NATURAL}" + th:href="@{''(sortOrder=NATURAL)}" + th:text="#{nbscloud.files.files-content-table.table-header.filename}"/> + <a nowrap th:if="${sortOrder == T(de.nbscloud.files.FileSystemService.SortOrder).NATURAL}" + th:href="@{''(sortOrder=NATURAL_REVERSE)}" + th:text="#{nbscloud.files.files-content-table.table-header.filename}"/> + </th> + <th id="size-column" class="no-mobile"> + <a nowrap th:if="${sortOrder != T(de.nbscloud.files.FileSystemService.SortOrder).SIZE_DESC}" + th:href="@{''(sortOrder=SIZE_DESC)}" + th:text="#{nbscloud.files.files-content-table.table-header.size}"/> + <a nowrap th:if="${sortOrder == T(de.nbscloud.files.FileSystemService.SortOrder).SIZE_DESC}" + th:href="@{''(sortOrder=SIZE_ASC)}" + th:text="#{nbscloud.files.files-content-table.table-header.size}"/> + </th> + <th id="lastmod-column" class="no-mobile"> + <a nowrap th:if="${sortOrder != T(de.nbscloud.files.FileSystemService.SortOrder).LAST_MOD_DESC}" + th:href="@{''(sortOrder=LAST_MOD_DESC)}" + th:text="#{nbscloud.files.files-content-table.table-header.lastmodified}"/> + <a nowrap th:if="${sortOrder == T(de.nbscloud.files.FileSystemService.SortOrder).LAST_MOD_DESC}" + th:href="@{''(sortOrder=LAST_MOD_ASC)}" + th:text="#{nbscloud.files.files-content-table.table-header.lastmodified}"/> + </th> + <th nowrap id="actions-column" th:text="#{nbscloud.files.files-content-table.table-header.actions}"/> + </tr> + <tr th:each="fileEntry : ${content}"> + <td th:if="${fileEntry.directory}" class="no-mobile">d</td> + <td th:if="${!fileEntry.directory}" class="no-mobile">-</td> + <td th:if="${fileEntry.directory}"> + <a th:if="${fileEntry.name != '..'}" th:href="@{/files/browse/} + ${fileEntry.path}" + th:text="${fileEntry.name}"/> + <a th:if="${fileEntry.name == '..'}" th:href="@{/files/browse/} + ${fileEntry.path}" + th:text="${fileEntry.name}"/> + </td> + <td th:if="${!fileEntry.directory && @filesFormatter.needsTruncate(fileEntry.name)}" + th:text="${@filesFormatter.truncateFilename(fileEntry.name)}" + th:title="${fileEntry.name}"/> + <td th:if="${!fileEntry.directory && !@filesFormatter.needsTruncate(fileEntry.name)}" + th:text="${fileEntry.name}"/> + <td nowrap th:text="${@filesFormatter.formatSize(fileEntry.size)}" + class="files-table-padded-col files-table-text-align-right no-mobile"/> + <td nowrap th:text="${#temporals.format(fileEntry.lastModified, 'SHORT')}" + class="files-table-padded-col files-table-text-align-right no-mobile"/> + <td nowrap> + <details th:if="${fileEntry.name != '..'}" class="files-table-text-align-right"> + <summary th:text="#{nbscloud.show-actions}"/> + <div id="files-content-table-show-actions-detail-container"> + <div id="files-content-table-show-actions-detail-container-rename"> + <a th:href="@{/files/rename(filename=${fileEntry.name})}" + th:text="#{nbscloud.files-content-table.table.actions.rename}"/> + </div> + <div id="files-content-table-show-actions-detail-container-delete"> + <a th:href="@{/files/delete(filename=${fileEntry.name})}" + th:text="#{nbscloud.files-content-table.table.actions.delete}"/> + </div> + <div th:if="${!fileEntry.directory}" + id="files-content-table-show-actions-detail-container-download"> + <a th:href="@{/files/download(filename=${fileEntry.name})}" + th:text="#{nbscloud.files-content-table.table.actions.download}"/> + </div> + <div th:if="${!fileEntry.directory}" + id="files-content-table-show-actions-detail-container-preview"> + <a th:href="@{/files/preview(filename=${fileEntry.name})}" + th:text="#{nbscloud.files-content-table.table.actions.preview}"/> + </div> + <div th:if="${!fileEntry.directory}" + id="files-content-table-show-actions-detail-container-share"> + <a th:href="@{/files/share(filename=${fileEntry.name})}" + th:text="#{nbscloud.files-content-table.table.actions.share}"/> + </div> + </div> + </details> + <div th:if="${fileEntry.name == '..'}"/> + </td> + </tr> + </table> + </div> + <div th:replace="includes/footer :: footer"/> +</div> +</body> +</html> \ No newline at end of file diff --git a/files/src/main/resources/templates/files/gallery.html b/files/src/main/resources/templates/files/gallery.html new file mode 100644 index 0000000..3a6cedd --- /dev/null +++ b/files/src/main/resources/templates/files/gallery.html @@ -0,0 +1,24 @@ +<!DOCTYPE html> +<html xmlns:th="http://www.thymeleaf.org"> +<html lang="en"> +<head> + <title th:text="#{nbscloud.files.gallery.title}"/> + + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <link th:if="${darkMode}" rel="stylesheet" th:href="@{/css/darkModeColors.css}"/> + <link th:if="${!darkMode}" rel="stylesheet" th:href="@{/css/lightModeColors.css}"/> + <link rel="stylesheet" th:href="@{/css/main.css}"/> + <link rel="stylesheet" th:href="@{/css/files_main.css}"/> + <link rel="stylesheet" th:href="@{/css/files_gallery.css}"/> + <link rel="shortcut icon" th:href="@{/favicon.ico}"/> +</head> +<body> +<div id="main-container"> + <div th:replace="includes/header :: header"/> + <div id="gallery-container"> + <img class="galleryImage" th:each="file : ${files}" th:src="@{/files/preview(filename=${file})}"> + </div> + <div th:replace="includes/footer :: footer"/> +</div> +</body> +</html> \ No newline at end of file diff --git a/files/src/main/resources/templates/files/includes/menu.html b/files/src/main/resources/templates/files/includes/menu.html new file mode 100644 index 0000000..31afd0c --- /dev/null +++ b/files/src/main/resources/templates/files/includes/menu.html @@ -0,0 +1,35 @@ +<div id="menu-container" th:fragment="menu"> + <div class="menu-spacer"></div> + <div id="upload-container"> + <form method="POST" action="#" th:action="@{/files/upload}" enctype="multipart/form-data"> + <!-- JavaScript required unfortunately --> + <input id="upload-container-file-input" type="file" name="files" onchange="this.form.submit()" + style="display: none;" multiple> + <span id="upload-container-span-input" class="icon files-menu-icon" + onclick="document.getElementById('upload-container-file-input').click();"></span> + </form> + </div> + <div class="menu-spacer"></div> + <div id="create-dir-container"> + <details> + <summary> + <span id="create-dir-container-span-input" class="icon files-menu-icon"></span> + <div class="create-dir-container-details-modal-overlay"></div> + </summary> + <div class="create-dir-container-details-modal"> + <div class="create-dir-container-details-modal-content"> + <form method="POST" action="#" th:action="@{/files/createDir}" enctype="multipart/form-data"> + <input id="create-dir-container-dir-name" type="text" name="dirName" /> + <input type="submit" value="Create"/> + </form> + </div> + </div> + </details> + </div> + <div class="menu-spacer"></div> + <div> + <a th:href="@{/files/gallery}"> + <span class="icon files-menu-icon"></span> + </a> + </div> +</div> \ No newline at end of file diff --git a/files/src/main/resources/templates/files/rename.html b/files/src/main/resources/templates/files/rename.html new file mode 100644 index 0000000..e63da42 --- /dev/null +++ b/files/src/main/resources/templates/files/rename.html @@ -0,0 +1,34 @@ +<!DOCTYPE HTML> +<html xmlns:th="http://www.thymeleaf.org"> +<head> + <title th:text="#{nbscloud.files.rename.title} + ${filename}"/> + + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <link th:if="${darkMode}" rel="stylesheet" th:href="@{/css/darkModeColors.css}"/> + <link th:if="${!darkMode}" rel="stylesheet" th:href="@{/css/lightModeColors.css}"/> + <link rel="stylesheet" th:href="@{/css/main.css}"/> + <link rel="stylesheet" th:href="@{/css/files_main.css}"/> + <link rel="shortcut icon" th:href="@{/favicon.ico}"/> +</head> +<body> +<div id="main-container"> + <div th:replace="includes/header :: header"/> + <form id="rename-form" action="#" th:action="@{/files/doRename}" th:object="${form}" + method="post" enctype="multipart/form-data"> + <label for="filename" th:text="#{nbscloud.files.rename.label.filename}"/> + <input type="text" id="filename" th:field="*{filename}"/> + <label for="targetDir" th:text="#{nbscloud.files.rename.label.targetDir}"/> + <!-- We can't use th:field here because of th:selected, they don't work together --> + <select size="25" id="targetDir" name="targetDir"> + <option th:each="targetDir : ${targetDirs}" + th:value="${targetDir}" + th:text="${targetDir}" + th:selected="${targetDir.equals(currentLocation)}"/> + </select> + <input type="hidden" id="originalPath" th:field="*{originalFilename}"/> + <input type="submit" th:value="#{nbscloud.files.rename.submit}" /> + </form> + <div th:replace="includes/footer :: footer"/> +</div> +</body> +</html> \ No newline at end of file diff --git a/notes/pom.xml b/notes/pom.xml new file mode 100644 index 0000000..be1abb4 --- /dev/null +++ b/notes/pom.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <parent> + <artifactId>nbs-cloud-aggregator</artifactId> + <groupId>de.77zzcx7.nbs-cloud</groupId> + <version>1-SNAPSHOT</version> + </parent> + + <groupId>de.77zzcx7.nbs-cloud</groupId> + <artifactId>notes</artifactId> + <packaging>jar</packaging> + + <dependencies> + <dependency> + <groupId>de.77zzcx7.nbs-cloud</groupId> + <artifactId>web-container-registry</artifactId> + </dependency> + <dependency> + <groupId>de.77zzcx7.nbs-cloud</groupId> + <artifactId>web-container-config</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-thymeleaf</artifactId> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-web</artifactId> + <scope>provided</scope> + </dependency> + </dependencies> +</project> \ No newline at end of file diff --git a/notes/src/main/java/de/nbscloud/notes/NotesApp.java b/notes/src/main/java/de/nbscloud/notes/NotesApp.java new file mode 100644 index 0000000..fbf28b1 --- /dev/null +++ b/notes/src/main/java/de/nbscloud/notes/NotesApp.java @@ -0,0 +1,38 @@ +package de.nbscloud.notes; + +import de.nbscloud.webcontainer.registry.App; +import de.nbscloud.webcontainer.registry.AppRegistry; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class NotesApp implements App, InitializingBean { + @Autowired + private AppRegistry appRegistry; + + @Override + public String getId() { + return "notes"; + } + + @Override + public String getIcon() { + return null; + } + + @Override + public String getStartPath() { + return this.getId(); + } + + @Override + public int getIndex() { + return 20; + } + + @Override + public void afterPropertiesSet() throws Exception { + this.appRegistry.registerApp(this); + } +} diff --git a/pastebin/pom.xml b/pastebin/pom.xml new file mode 100644 index 0000000..71f5dc4 --- /dev/null +++ b/pastebin/pom.xml @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <parent> + <artifactId>nbs-cloud-aggregator</artifactId> + <groupId>de.77zzcx7.nbs-cloud</groupId> + <version>1-SNAPSHOT</version> + </parent> + + <groupId>de.77zzcx7.nbs-cloud</groupId> + <artifactId>pastebin</artifactId> + <packaging>jar</packaging> + + <dependencies> + <dependency> + <groupId>de.77zzcx7.nbs-cloud</groupId> + <artifactId>web-container-registry</artifactId> + </dependency> + <dependency> + <groupId>de.77zzcx7.nbs-cloud</groupId> + <artifactId>web-container-config</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-thymeleaf</artifactId> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-web</artifactId> + <scope>provided</scope> + </dependency> + </dependencies> + +</project> \ No newline at end of file diff --git a/pastebin/src/main/java/de/nbscloud/pastebin/PastebinApp.java b/pastebin/src/main/java/de/nbscloud/pastebin/PastebinApp.java new file mode 100644 index 0000000..a9729d3 --- /dev/null +++ b/pastebin/src/main/java/de/nbscloud/pastebin/PastebinApp.java @@ -0,0 +1,38 @@ +package de.nbscloud.pastebin; + +import de.nbscloud.webcontainer.registry.App; +import de.nbscloud.webcontainer.registry.AppRegistry; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class PastebinApp implements App, InitializingBean { + @Autowired + private AppRegistry appRegistry; + + @Override + public String getId() { + return "pastebin"; + } + + @Override + public String getIcon() { + return null; + } + + @Override + public String getStartPath() { + return this.getId(); + } + + @Override + public int getIndex() { + return 50; + } + + @Override + public void afterPropertiesSet() throws Exception { + this.appRegistry.registerApp(this); + } +} diff --git a/pom.xml b/pom.xml index 91821d6..d333345 100644 --- a/pom.xml +++ b/pom.xml @@ -3,18 +3,6 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> - <build> - <plugins> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-compiler-plugin</artifactId> - <configuration> - <source>16</source> - <target>16</target> - </configuration> - </plugin> - </plugins> - </build> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> @@ -32,13 +20,18 @@ <modules> <module>files</module> <module>web-container</module> + <module>web-container-registry</module> + <module>notes</module> + <module>pastebin</module> + <module>bookmarks</module> + <module>web-container-config</module> + <module>todo</module> + <module>dashboard</module> </modules> <properties> - <maven.compiler.source>17</maven.compiler.source> - <maven.compiler.target>17</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> - <java.version>17</java.version> + <java.version>18</java.version> </properties> <distributionManagement> @@ -55,16 +48,132 @@ <dependencyManagement> <dependencies> <dependency> - <groupId>de.77zzc7.nbs-cloud</groupId> + <groupId>de.77zzcx7.nbs-cloud</groupId> <artifactId>web-container</artifactId> <version>${project.version}</version> </dependency> <dependency> - <groupId>de.77zzc7.nbs-cloud</groupId> + <groupId>de.77zzcx7.nbs-cloud</groupId> <artifactId>files</artifactId> <version>${project.version}</version> </dependency> + <dependency> + <groupId>de.77zzcx7.nbs-cloud</groupId> + <artifactId>web-container-registry</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>de.77zzcx7.nbs-cloud</groupId> + <artifactId>notes</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>de.77zzcx7.nbs-cloud</groupId> + <artifactId>pastebin</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>de.77zzcx7.nbs-cloud</groupId> + <artifactId>bookmarks</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>de.77zzcx7.nbs-cloud</groupId> + <artifactId>web-container-config</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>de.77zzcx7.nbs-cloud</groupId> + <artifactId>todo</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>de.77zzcx7.nbs-cloud</groupId> + <artifactId>dashboard</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>org.apache.commons</groupId> + <artifactId>commons-collections4</artifactId> + <version>4.3</version> + </dependency> + <dependency> + <groupId>commons-io</groupId> + <artifactId>commons-io</artifactId> + <version>2.11.0</version> + </dependency> + <dependency> + <groupId>org.overviewproject</groupId> + <artifactId>mime-types</artifactId> + <version>1.0.2</version> + </dependency> </dependencies> </dependencyManagement> + <build> + <pluginManagement> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + <configuration> + <source>18</source> + <target>18</target> + </configuration> + </plugin> + <plugin> + <groupId>fr.jcgay.maven.plugins</groupId> + <artifactId>buildplan-maven-plugin</artifactId> + <version>1.5</version> + <executions> + <execution> + <id>build-plan</id> + <phase>initialize</phase> + <goals> + <goal>list</goal> + </goals> + </execution> + </executions> + </plugin> + <plugin> + <!-- As we had to rename the config file for modules (since Spring only supports one + application.properties), we also need to adjust the filtering --> + <artifactId>maven-resources-plugin</artifactId> + <executions> + <execution> + <id>process-module-configs</id> + <phase>process-resources</phase> + <goals> + <goal>resources</goal> + </goals> + <configuration> + <propertiesEncoding>UTF-8</propertiesEncoding> + <delimiters> + <delimiter>@</delimiter> + </delimiters> + <useDefaultDelimiters>false</useDefaultDelimiters> + <resources> + <resource> + <directory>${project.basedir}/src/main/resources</directory> + <includes> + <include>**/*-application.properties</include> + <include>**/*-application-*.properties</include> + </includes> + <filtering>true</filtering> + </resource> + </resources> + </configuration> + </execution> + </executions> + </plugin> + </plugins> + </pluginManagement> + + <plugins> + <plugin> + <groupId>fr.jcgay.maven.plugins</groupId> + <artifactId>buildplan-maven-plugin</artifactId> + </plugin> + </plugins> + </build> </project> \ No newline at end of file diff --git a/todo/pom.xml b/todo/pom.xml new file mode 100644 index 0000000..d91c52a --- /dev/null +++ b/todo/pom.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <parent> + <artifactId>nbs-cloud-aggregator</artifactId> + <groupId>de.77zzcx7.nbs-cloud</groupId> + <version>1-SNAPSHOT</version> + </parent> + + <groupId>de.77zzcx7.nbs-cloud</groupId> + <artifactId>todo</artifactId> + <packaging>jar</packaging> + + <dependencies> + <dependency> + <groupId>de.77zzcx7.nbs-cloud</groupId> + <artifactId>web-container-registry</artifactId> + </dependency> + <dependency> + <groupId>de.77zzcx7.nbs-cloud</groupId> + <artifactId>web-container-config</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-thymeleaf</artifactId> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-web</artifactId> + <scope>provided</scope> + </dependency> + </dependencies> +</project> \ No newline at end of file diff --git a/todo/src/main/java/de/nbscloud/todo/TodoApp.java b/todo/src/main/java/de/nbscloud/todo/TodoApp.java new file mode 100644 index 0000000..e4eedfb --- /dev/null +++ b/todo/src/main/java/de/nbscloud/todo/TodoApp.java @@ -0,0 +1,38 @@ +package de.nbscloud.todo; + +import de.nbscloud.webcontainer.registry.App; +import de.nbscloud.webcontainer.registry.AppRegistry; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class TodoApp implements App, InitializingBean { + @Autowired + private AppRegistry appRegistry; + + @Override + public String getId() { + return "todo"; + } + + @Override + public String getIcon() { + return null; + } + + @Override + public String getStartPath() { + return this.getId(); + } + + @Override + public int getIndex() { + return 40; + } + + @Override + public void afterPropertiesSet() throws Exception { + this.appRegistry.registerApp(this); + } +} diff --git a/web-container-config/pom.xml b/web-container-config/pom.xml new file mode 100644 index 0000000..9f56bc4 --- /dev/null +++ b/web-container-config/pom.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <parent> + <artifactId>nbs-cloud-aggregator</artifactId> + <groupId>de.77zzcx7.nbs-cloud</groupId> + <version>1-SNAPSHOT</version> + </parent> + + <artifactId>web-container-config</artifactId> + + <dependencies> + <!-- Spring --> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-context</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-web</artifactId> + </dependency> + </dependencies> +</project> \ No newline at end of file diff --git a/web-container-config/src/main/java/de/nbscloud/webcontainer/shared/config/WebContainerSharedConfig.java b/web-container-config/src/main/java/de/nbscloud/webcontainer/shared/config/WebContainerSharedConfig.java new file mode 100644 index 0000000..684cc3d --- /dev/null +++ b/web-container-config/src/main/java/de/nbscloud/webcontainer/shared/config/WebContainerSharedConfig.java @@ -0,0 +1,43 @@ +package de.nbscloud.webcontainer.shared.config; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; +import org.springframework.ui.Model; + +@Configuration +@ConfigurationProperties(prefix = "nbs-cloud.web-container.shared") +@PropertySource("classpath:/config/shared-application.properties") +public class WebContainerSharedConfig { + private String version; + private boolean darkMode; + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public boolean isDarkMode() { + return darkMode; + } + + public void setDarkMode(boolean darkMode) { + this.darkMode = darkMode; + } + + public void addDefaults(Model model) { + addDarkMode(model); + addVersionAttribute(model); + } + + private final void addVersionAttribute(Model model) { + model.addAttribute("nbsVersion", this.version); + } + + private final void addDarkMode(Model model) { + model.addAttribute("darkMode", this.darkMode); + } +} diff --git a/web-container-config/src/main/resources/config/shared-application.properties b/web-container-config/src/main/resources/config/shared-application.properties new file mode 100644 index 0000000..f281398 --- /dev/null +++ b/web-container-config/src/main/resources/config/shared-application.properties @@ -0,0 +1,10 @@ +spring.profiles.active=@activeProfiles@ + +info.app.name=NoBullShit Cloud - web container config +info.app.description=Config for web projects + +nbs-cloud.web-container.shared.version=@project.version@ + +# Whether dark mode should be enabled by default +# Possible values: true|false +nbs-cloud.web-container.shared.darkMode=true \ No newline at end of file diff --git a/web-container-registry/pom.xml b/web-container-registry/pom.xml new file mode 100644 index 0000000..069e3af --- /dev/null +++ b/web-container-registry/pom.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <parent> + <artifactId>nbs-cloud-aggregator</artifactId> + <groupId>de.77zzcx7.nbs-cloud</groupId> + <version>1-SNAPSHOT</version> + </parent> + + <artifactId>web-container-registry</artifactId> + + <dependencies> + <!-- Spring --> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-context</artifactId> + </dependency> + </dependencies> +</project> \ No newline at end of file diff --git a/web-container-registry/src/main/java/de/nbscloud/webcontainer/registry/App.java b/web-container-registry/src/main/java/de/nbscloud/webcontainer/registry/App.java new file mode 100644 index 0000000..0a2a9ce --- /dev/null +++ b/web-container-registry/src/main/java/de/nbscloud/webcontainer/registry/App.java @@ -0,0 +1,18 @@ +package de.nbscloud.webcontainer.registry; + +public interface App { + // New app: + // 1) Create module + // 2) Add dependencies (like other app modules) + // 3) Register module in web-container module + // 4) Add module to dependency management in aggregator pom + // 5) Add module package to web-container application @ComponentScan + + String getId(); + + String getIcon(); + + String getStartPath(); + + int getIndex(); +} diff --git a/web-container-registry/src/main/java/de/nbscloud/webcontainer/registry/AppRegistry.java b/web-container-registry/src/main/java/de/nbscloud/webcontainer/registry/AppRegistry.java new file mode 100644 index 0000000..9c94026 --- /dev/null +++ b/web-container-registry/src/main/java/de/nbscloud/webcontainer/registry/AppRegistry.java @@ -0,0 +1,23 @@ +package de.nbscloud.webcontainer.registry; + +import org.springframework.stereotype.Component; + +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; + +@Component +public class AppRegistry { + private final List<App> apps = new CopyOnWriteArrayList<>(); + + public void registerApp(App app) { + this.apps.add(app); + + this.apps.sort(Comparator.comparing(App::getIndex)); + } + + public List<App> getAll() { + return Collections.unmodifiableList(this.apps); + } +} diff --git a/web-container/pom.xml b/web-container/pom.xml index 37c09ae..a3c130f 100644 --- a/web-container/pom.xml +++ b/web-container/pom.xml @@ -21,21 +21,44 @@ <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-compiler-plugin</artifactId> - <configuration> - <source>17</source> - <target>17</target> - </configuration> - </plugin> </plugins> </build> <dependencies> - <!-- nbs-cloud modules --> + <!-- optional nbs-cloud modules --> + <!-- comment the ones you don't need --> <dependency> - <groupId>de.77zzc7.nbs-cloud</groupId> + <groupId>de.77zzcx7.nbs-cloud</groupId> + <artifactId>notes</artifactId> + </dependency> + <dependency> + <groupId>de.77zzcx7.nbs-cloud</groupId> + <artifactId>pastebin</artifactId> + </dependency> + <dependency> + <groupId>de.77zzcx7.nbs-cloud</groupId> + <artifactId>bookmarks</artifactId> + </dependency> + <dependency> + <groupId>de.77zzcx7.nbs-cloud</groupId> + <artifactId>todo</artifactId> + </dependency> + + <!-- required nbs-cloud modules --> + <dependency> + <groupId>de.77zzcx7.nbs-cloud</groupId> + <artifactId>web-container-registry</artifactId> + </dependency> + <dependency> + <groupId>de.77zzcx7.nbs-cloud</groupId> + <artifactId>web-container-config</artifactId> + </dependency> + <dependency> + <groupId>de.77zzcx7.nbs-cloud</groupId> + <artifactId>dashboard</artifactId> + </dependency> + <dependency> + <groupId>de.77zzcx7.nbs-cloud</groupId> <artifactId>files</artifactId> </dependency> @@ -44,6 +67,25 @@ <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-thymeleaf</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-tomcat</artifactId> + <scope>provided</scope> + </dependency> + + <!-- Misc --> + <dependency> + <groupId>org.apache.commons</groupId> + <artifactId>commons-lang3</artifactId> + </dependency> + <dependency> + <groupId>org.apache.commons</groupId> + <artifactId>commons-collections4</artifactId> + </dependency> </dependencies> </project> \ No newline at end of file diff --git a/web-container/src/main/java/de/nbscloud/webcontainer/config/WebContainerConfig.java b/web-container/src/main/java/de/nbscloud/webcontainer/config/WebContainerConfig.java index 18f5299..55df885 100644 --- a/web-container/src/main/java/de/nbscloud/webcontainer/config/WebContainerConfig.java +++ b/web-container/src/main/java/de/nbscloud/webcontainer/config/WebContainerConfig.java @@ -6,6 +6,12 @@ import org.springframework.context.annotation.Configuration; @Configuration @ConfigurationProperties(prefix = "nbs-cloud.web-container") +@ComponentScan("de.nbscloud.webcontainer.shared") @ComponentScan("de.nbscloud.files") +@ComponentScan("de.nbscloud.notes") +@ComponentScan("de.nbscloud.pastebin") +@ComponentScan("de.nbscloud.bookmarks") +@ComponentScan("de.nbscloud.todo") +@ComponentScan("de.nbscloud.dashboard") public class WebContainerConfig { } diff --git a/web-container/src/main/java/de/nbscloud/webcontainer/controller/WebContainerController.java b/web-container/src/main/java/de/nbscloud/webcontainer/controller/WebContainerController.java new file mode 100644 index 0000000..fdd8964 --- /dev/null +++ b/web-container/src/main/java/de/nbscloud/webcontainer/controller/WebContainerController.java @@ -0,0 +1,58 @@ +package de.nbscloud.webcontainer.controller; + +import de.nbscloud.webcontainer.registry.App; +import de.nbscloud.webcontainer.registry.AppRegistry; +import de.nbscloud.webcontainer.shared.config.WebContainerSharedConfig; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; + +import javax.servlet.http.HttpServletRequest; +import java.net.MalformedURLException; +import java.net.URISyntaxException; +import java.net.URL; +import java.util.stream.Collectors; + +@Controller +public class WebContainerController { + + private static final Logger logger = LoggerFactory.getLogger(WebContainerController.class); + + @Autowired + private WebContainerSharedConfig webContainerSharedConfig; + + @Autowired + private AppRegistry appRegistry; + + @GetMapping("/") + public String landing(Model model) { + logger.info("NBSCloud started - apps available: {}", this.appRegistry.getAll().stream().map(App::getId) + .collect(Collectors.joining(", "))); + + return "redirect:dashboard"; + } + + @GetMapping("/toggleDarkMode") + public String toggleDarkMode(Model model, HttpServletRequest httpServletRequest) { + String navigateTo = "/"; + + try { + final String fullPath = new URL(httpServletRequest.getHeader("referer")).toURI().getPath(); + // FIXME - will break if the app is deployed on http://host/a/b/financer instead of http://host/financer + final String tmpPath = StringUtils.removeStart(fullPath, "/"); + navigateTo = tmpPath.substring(tmpPath.indexOf("/")); + } catch (MalformedURLException | URISyntaxException | StringIndexOutOfBoundsException e) { + // TODO + e.printStackTrace(); + } + + this.webContainerSharedConfig.setDarkMode(!this.webContainerSharedConfig.isDarkMode()); + + return "redirect:" + navigateTo; + } + +} diff --git a/web-container/src/main/resources/config/application.properties b/web-container/src/main/resources/config/application.properties new file mode 100644 index 0000000..c954ff6 --- /dev/null +++ b/web-container/src/main/resources/config/application.properties @@ -0,0 +1,20 @@ +### This is the main configuration file of the application. +### Filtering of the @...@ values happens via the maven-resource-plugin. The execution of the plugin is configured in +### the Spring Boot parent POM. +spring.profiles.active=@activeProfiles@ + +info.app.name=NoBullShit Cloud - web container +info.app.description=Aggregator for web projects +info.build.group=@project.groupId@ +info.build.artifact=@project.artifactId@ +info.build.version=@project.version@ + +spring.messages.basename=i18n/container_messages,i18n/files_messages + +spring.servlet.multipart.max-file-size=-1 +spring.servlet.multipart.max-request-size=-1 + +logging.level.de.nbscloud=DEBUG +logging.file=nbscloud.log +logging.file.max-history=7 +logging.file.max-size=50MB \ No newline at end of file diff --git a/web-container/src/main/resources/i18n/container_messages.properties b/web-container/src/main/resources/i18n/container_messages.properties new file mode 100644 index 0000000..c9f441c --- /dev/null +++ b/web-container/src/main/resources/i18n/container_messages.properties @@ -0,0 +1,3 @@ +nbscloud.show-actions=... +nbscloud.footer.changelog=Changelog +nbscloud.footer.toggleDarkMode=Toggle dark mode \ No newline at end of file diff --git a/web-container/src/main/resources/i18n/container_messages_de_DE.properties b/web-container/src/main/resources/i18n/container_messages_de_DE.properties new file mode 100644 index 0000000..6ffb6b3 --- /dev/null +++ b/web-container/src/main/resources/i18n/container_messages_de_DE.properties @@ -0,0 +1,3 @@ +nbscloud.show-actions=... +nbscloud.footer.changelog=\u00C4nderungshistorie +nbscloud.footer.toggleDarkMode=Dark Mode umschalten \ No newline at end of file diff --git a/web-container/src/main/resources/static/changelog.txt b/web-container/src/main/resources/static/changelog.txt new file mode 100644 index 0000000..759a035 --- /dev/null +++ b/web-container/src/main/resources/static/changelog.txt @@ -0,0 +1,2 @@ +v1: +- Initial \ No newline at end of file diff --git a/web-container/src/main/resources/static/css/darkModeColors.css b/web-container/src/main/resources/static/css/darkModeColors.css new file mode 100644 index 0000000..0ee5159 --- /dev/null +++ b/web-container/src/main/resources/static/css/darkModeColors.css @@ -0,0 +1,12 @@ +/* Color definitions for dark mode */ +:root { + --error-color: #D30000; + --text-color: #7f7f7f; + --background-color: #1d1f21; + --link-color: #87ab63; + --hover-color: #1f1f2f; + --border-color: #7f7f7f; + --background-brightness: 1.5; + --good-color: #479A37; +} +/* --------------------- */ \ No newline at end of file diff --git a/web-container/src/main/resources/static/css/lightModeColors.css b/web-container/src/main/resources/static/css/lightModeColors.css new file mode 100644 index 0000000..e028c57 --- /dev/null +++ b/web-container/src/main/resources/static/css/lightModeColors.css @@ -0,0 +1,12 @@ +/* Color definitions for light mode */ +:root { + --error-color: #D30000; + --text-color: #000000; + --background-color: #FFFFFF; + --link-color: #0000EE; + --hover-color: lightgrey; + --border-color: #ddd; + --background-brightness: 0.5; + --good-color: #479A37; +} +/* --------------------- */ \ No newline at end of file diff --git a/web-container/src/main/resources/static/css/main.css b/web-container/src/main/resources/static/css/main.css new file mode 100644 index 0000000..14afdba --- /dev/null +++ b/web-container/src/main/resources/static/css/main.css @@ -0,0 +1,95 @@ +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(../font/SourceCodePro_Regular_400.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 600; + font-display: swap; + src: url(../font/SourceCodePro_Bold_600.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +@font-face { + font-family: 'Material Icons'; + font-style: normal; + font-weight: 400; + src: url(../font/Material_Icons.woff2) format('woff2'); +} + +.icon { + font-family: 'Material Icons'; + vertical-align: middle; +} + +body { + color: var(--text-color); + background-color: var(--background-color); + font-family: 'Source Code Pro', monospace; +} + +* { + font-family: 'Source Code Pro', monospace; +} + +a { + color: var(--link-color); +} + +tr:hover { + background-color: var(--hover-color); +} + +#footer-container { + margin-top: 1em; +} +#footer-container > hr, +#footer-container > div { + display: block; +} +#footer-container > hr { + width: 100%; +} +#footer-container > div { + text-align: center; + font-size: 0.9em; +} +.errorMessage { + color: var(--error-color); +} + +.menu-entry { + display: inline; + padding-right: 6em; +} + +#main-container { + display: flex; + flex-direction: column; + padding-left: 3em; + padding-right: 3em; + padding-top: 3em; + padding-bottom: 3em; +} + +@media only screen and (max-width: 450px) { + .no-mobile { + display: none; + } + + #main-container { + padding-left: 1em; + padding-right: 1em; + padding-top: 1em; + padding-bottom: 1em; + } + + .menu-entry { + display: inline; + padding-right: 1em; + } +} \ No newline at end of file diff --git a/web-container/src/main/resources/static/font/Material_Icons.woff2 b/web-container/src/main/resources/static/font/Material_Icons.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..6a23a558258deb194f50b94be806cd4bc612c20e GIT binary patch literal 100160 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 literal 0 HcmV?d00001 diff --git a/web-container/src/main/resources/static/font/SourceCodePro_Bold_600.woff2 b/web-container/src/main/resources/static/font/SourceCodePro_Bold_600.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..3605950d24b4b9a41c1bba1a7107612f96c9a9cb GIT binary patch literal 14004 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 GbktzC^8Hb(n=*#t)mED8<c7El3# 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 a^tvc>q8ruZmn6q_+}<zWNG~Lj-yr}#Nz_3A literal 0 HcmV?d00001 diff --git a/web-container/src/main/resources/static/font/SourceCodePro_Regular_400.woff2 b/web-container/src/main/resources/static/font/SourceCodePro_Regular_400.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..90d1a423b435e7955a4f52c20627668b552edf1e GIT binary patch literal 14172 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 literal 0 HcmV?d00001 diff --git a/web-container/src/main/resources/templates/includes/footer.html b/web-container/src/main/resources/templates/includes/footer.html new file mode 100644 index 0000000..9ed6d4c --- /dev/null +++ b/web-container/src/main/resources/templates/includes/footer.html @@ -0,0 +1,8 @@ +<div id="footer-container" th:fragment="footer"> + <hr> + <div> + <span th:text="'nbs-cloud v' + ${nbsVersion}"/> +  (<a th:href="@{/changelog.txt}" th:text="#{nbscloud.footer.changelog}" />, + <a th:href="@{/toggleDarkMode}" th:text="#{nbscloud.footer.toggleDarkMode}" />) + </div> +</div> \ No newline at end of file diff --git a/web-container/src/main/resources/templates/includes/header.html b/web-container/src/main/resources/templates/includes/header.html new file mode 100644 index 0000000..25f0972 --- /dev/null +++ b/web-container/src/main/resources/templates/includes/header.html @@ -0,0 +1,5 @@ +<div id="header-container" th:fragment="header"> + <div th:each="app : ${apps}" class="menu-entry"> + <a th:href="@{/} + ${app.startPath}" th:text="${app.id}"/> + </div> +</div> \ No newline at end of file