Dimchikkk / velo

App for brainstorming & sharing ideas šŸ¦€ Learning Project
Apache License 2.0
320 stars 27 forks source link

Storage re-write and more šŸš€ #199

Open Dimchikkk opened 1 year ago

Dimchikkk commented 1 year ago

Ideas for the issue was contemplated from https://github.com/StaffEngineer/velo/issues/184; https://github.com/StaffEngineer/velo/issues/184 is closed in favour of this issue that will allow to implement clone & fork note easily

Warning: I can't draw šŸ˜„

First of all velo removes concept of "document" and "tab". Instead of documents and tabs there are groups. Group has zero or more notes. Note is abstraction for data, it can be just a note with specific style (paper-like note, rounded rectangle note, circle note), drawing, image, etc. Group is abstraction for organising (connecting) data, say connect notes with arrows or organising notes in specific positions, etc. Of course, the ways of organising data is also a data (!), so app has basically only one type, on pseudocode:

type Note = Circle | RoundedCorners | Paper | Drawing | Image | Group
type Group = { type: Brainstorm, notes: Note[] }

So basically:

image

What is left then? Infinite canvas is left, call it "universe" or "root group". Basically user can zoom-in, zoom-out and move in universe adding/connecting notes. Technically, universe can be seen as "tab". Tab could load different types of notes connected by arrows... in proposed issue it also can load different types of notes connected by arrows BUT functionality is extended to contain another groups, basically tab can contain tabs. To avoid memory overflow group doesn't load contained groups (in future iterations of the feature it may start load groups with specific child depth).

Let's see how it can be represented:

image

User has ability to click on "Group B" and it will despawn current group and load notes from group B (in future iterations of the feature it may start just unfolding/folding groups). User should be able to go back to previous group if needed (going level up so to speak).

Bookmarks panel should be implemented as well. It's something similar to current document list. User can pin any group and it will appear in bookmark panel, then user can quickly open it if needed.

Going deeper in technicalities. There are gonna be "Notes" and "Group" store, also relationships store. Relationships store is needed for implementing "Search everywhere" feature. Say user types "hello": it should look in group store for a group that contains "hello" title, then it should look in notes store and check notes text for "hello" world... it should show list of found notes. While selecting any found note, note preview should be opened allowing to explore note content. Finally there should be a way to see to which groups belongs this note, so that's where relationships store comes in.

There should be group view, so user can quickly find & open any group, or insert group into current group.

There should be notes view, so user can search for specific note and be able to use it across multiple documents. Changing note in one document updates it for another document as well, this is clone note feature speaking in git terminology (in future iterations of the feature ability to fork note will be added as well).