![Das Baumkarten-Diagramm eines Google Drive-Kontos](https://cdn.sanity.io/images/q5a4ie5j/production/f9699c92f98e3ac9f8a20357e832068df6de1e76-2290x1278.png?w=1200&fit=clip&auto=format)
Google Drive Speicherplatz-Analyse
Wenn der Speicherplatz knapp wird, generiere ich gerne sogenannte Treemaps meiner Speichermedien. Auf Windows verwende ich dazu Wiztree, auf Linux den Disk Usage Analyze (Baobab). Auf Google Drive... bietet Google eine Liste mit den 50 größten Dateien. Man kann also nur schwer große Ordner voller vieler kleiner Dateien finden.
Praktischerweise lassen sich aber in nur kurzer Zeit alle gespeicherten Dateien über die Google Drive API abrufen. Ich schrieb daher eine Vue-Applikation, die genau das tut und den Speicherverbrauch über Apache ECharts anzeigt.
Das Auge löscht mit, also erstellte ich noch eine SVG-Animation mit Inkscape und GSAP, bei der sich das Drive-Icon in eine Treemap verwandelt. Eigentlich hätte ich lieber Anime.js für das SVG-Morphing verwendet, um das Projekt opensourcen zu können, doch wurde mir letztlich der Aufwand zu groß.
Ich hatte bereits Code geschrieben, der alle Pfadelemente in meiner SVG nach ID sortierte und zu Animationsgruppen zusammenfasste, als mir bewusst wurde, dass Anime.js offenbar nicht nur die gleiche Anzahl an Pfad-Vertices, sondern auch die gleichen Pfadbefehle benötigt, um die Formen sauber ineinander übergehen zu lassen. Wahrscheinlich müsste man den SVG-Erstellungsprozess laufend überwachen (wie hier beschrieben), um sofort auf Inkongruenzen aufmerksam zu werden.
Nachdem der Prototyp sehr gut funktionierte, ich aber nicht bei jedem Aufruf des Tools auf den Download aller Metadaten warten wollte, war es Zeit für ein erstes Refactoring. Mir gefiel das Konzept, für jeden Datei-Hoster eine eigene Vue-Komponente zu erstellen, die dann nur mehr zentral registriert werden muss, um in das Tool eingebunden zu werden. Auch der Import von zuvor gesicherten JSON-Dateien wurde so zur eigenen Komponente.
![ein Screenshot des Codes, in dem die einzelnen Vue-Komponenten registriert werden](https://cdn.sanity.io/images/q5a4ie5j/production/d0117c43c59e7e0147c567c132ee7d3f8f46c8ab-661x357.png?w=661&h=357&auto=format)
Zudem erstellte ich für alle wesentlichen Komponenten Tests mit Vitest und vue-test-utils.
Da das Umschalten zwischen Diagrammtypen in echarts recht leicht von der Hand geht, fügte ich außerdem die Möglichkeit hinzu, zwischen Treemap und Sunburst-Diagramm zu wechseln.
![ein Sunburst-Diagramm](https://cdn.sanity.io/images/q5a4ie5j/production/fb0a1dccfc3be367c9ed90df3703702e730465ca-2290x1278.png?w=2290&h=1278&auto=format)
![ein herangezoomtes Sunburst-Diagramm](https://cdn.sanity.io/images/q5a4ie5j/production/22006478886fae1cd1b89ab16eb6f187a4a89ece-2290x1278.png?w=2290&h=1278&auto=format)
Letztlich wollte ich die Seite ansprechender gestalten, da die Wartezeiten bei der API-Abfrage doch recht lang werden können. Die Startseite erhielt daher eine Three.js-Animation, die der Maus folgt. Alle Design-Elemente sind in den Google-Farben gehalten.
![die Startseite der App mit Three.js-Animation](https://cdn.sanity.io/images/q5a4ie5j/production/19c442477ffd51f1421583ab8e94b5da7cffcadc-1896x1170.png?w=1896&h=1170&auto=format)
Die App ist natürlich auch komplett responsive.
![ein Screenshot der App auf mobilien Geräten](https://cdn.sanity.io/images/q5a4ie5j/production/477a56c7640d0b91afad747a88324ddc342f016a-454x906.png?w=454&h=906&auto=format)