From 93279b718bc7f9fb89aa329b7dbcc55d6e909b3e Mon Sep 17 00:00:00 2001 From: Bobby <30593201+luciferreeves@users.noreply.github.com> Date: Tue, 23 Dec 2025 13:17:59 +0530 Subject: some icons and stuff --- models/folders.go | 9 +++--- repository/folders.go | 58 ++++++++++++++++++++++++++++++-------- static/css/main.css | 17 ++++++++--- static/icons/dog.png | Bin 0 -> 84737 bytes static/icons/dog_open.png | Bin 0 -> 85772 bytes static/icons/encrypt.png | Bin 0 -> 31006 bytes static/icons/encrypt_open.png | Bin 0 -> 33154 bytes static/icons/folder.png | Bin 0 -> 32823 bytes static/icons/folder_open.png | Bin 0 -> 69270 bytes static/icons/inbox.png | Bin 0 -> 27645 bytes static/icons/inbox_open.png | Bin 0 -> 94875 bytes tags/tags.go | 2 +- templates/partials/sidebar.django | 16 +++++++++-- types/email.go | 5 ++++ 14 files changed, 85 insertions(+), 22 deletions(-) create mode 100644 static/icons/dog.png create mode 100644 static/icons/dog_open.png create mode 100644 static/icons/encrypt.png create mode 100644 static/icons/encrypt_open.png create mode 100644 static/icons/folder.png create mode 100644 static/icons/folder_open.png create mode 100644 static/icons/inbox.png create mode 100644 static/icons/inbox_open.png diff --git a/models/folders.go b/models/folders.go index 6c3800a..d823ba0 100644 --- a/models/folders.go +++ b/models/folders.go @@ -8,10 +8,11 @@ type Folder struct { gorm.Model UserEmail string `gorm:"index"` - Name string - IMAPName string - Icon string - ParentID *uint + Name string + IMAPName string + IconOpen string + IconClose string + ParentID *uint UnreadCount int `gorm:"default:0"` TotalCount int `gorm:"default:0"` diff --git a/repository/folders.go b/repository/folders.go index 973727a..63ccf88 100644 --- a/repository/folders.go +++ b/repository/folders.go @@ -3,6 +3,7 @@ package repository import ( "lain/database" "lain/models" + "lain/types" "lain/utils/crypto" "lain/utils/email" "net/url" @@ -11,7 +12,24 @@ import ( "github.com/gofiber/fiber/v2" ) -const defaultFolderIcon = "/static/images/icons/folder.png" +var folderIcons = map[string]types.FolderIconVariant{ + "default": { + Open: "/static/icons/folder_open.png", + Close: "/static/icons/folder.png", + }, + "inbox": { + Open: "/static/icons/inbox_open.png", + Close: "/static/icons/inbox.png", + }, + "encrypt": { + Open: "/static/icons/encrypt_open.png", + Close: "/static/icons/encrypt.png", + }, + "dog": { + Open: "/static/icons/dog_open.png", + Close: "/static/icons/dog.png", + }, +} func GetFolders(userEmail, activeFolder string) []fiber.Map { syncFolders(userEmail) @@ -25,18 +43,14 @@ func GetFolders(userEmail, activeFolder string) []fiber.Map { var rootFolders []fiber.Map for _, folder := range allFolders { - icon := folder.Icon - if icon == "" { - icon = defaultFolderIcon - } - displayName := getDisplayName(folder.IMAPName) folderData := fiber.Map{ "ID": folder.ID, "Name": displayName, "IMAPName": folder.IMAPName, - "Icon": icon, + "IconOpen": folder.IconOpen, + "IconClose": folder.IconClose, "UnreadCount": folder.UnreadCount, "Active": false, "ParentID": folder.ParentID, @@ -127,6 +141,26 @@ func sortFolders(folders []models.Folder) { } } +func getFolderType(folderName string) string { + nameLower := strings.ToLower(folderName) + + if strings.Contains(folderName, "/") { + parts := strings.Split(folderName, "/") + nameLower = strings.ToLower(parts[len(parts)-1]) + } + + for iconType := range folderIcons { + if iconType == "default" { + continue + } + if strings.Contains(nameLower, iconType) { + return iconType + } + } + + return "default" +} + func syncFolders(userEmail string) error { var prefs models.Preferences if err := database.DB.Where("email = ?", userEmail).First(&prefs).Error; err != nil { @@ -157,13 +191,16 @@ func syncFolders(userEmail string) error { result := database.DB.Where("user_email = ? AND LOWER(imap_name) = ?", userEmail, imapNameLower).First(&folder) sortOrder := getSortOrder(imapFolder.Name, i) + folderType := getFolderType(imapFolder.Name) + iconVariant := folderIcons[folderType] if result.Error != nil { folder = models.Folder{ UserEmail: userEmail, Name: imapFolder.Name, IMAPName: imapFolder.Name, - Icon: defaultFolderIcon, + IconOpen: iconVariant.Open, + IconClose: iconVariant.Close, SortOrder: sortOrder, } database.DB.Create(&folder) @@ -171,9 +208,8 @@ func syncFolders(userEmail string) error { } else { folder.Name = imapFolder.Name folder.SortOrder = sortOrder - if folder.Icon == "" { - folder.Icon = defaultFolderIcon - } + folder.IconOpen = iconVariant.Open + folder.IconClose = iconVariant.Close database.DB.Save(&folder) foldersByName[imapNameLower] = folder.ID } diff --git a/static/css/main.css b/static/css/main.css index 546eba1..84a1d59 100644 --- a/static/css/main.css +++ b/static/css/main.css @@ -118,7 +118,10 @@ footer a:hover { padding: 3px 8px; font-size: 10px; cursor: pointer; - display: block; + display: flex; + align-items: center; + gap: 2px; + flex-direction: column; } .nav-subitem a:hover { @@ -131,6 +134,11 @@ footer a:hover { cursor: not-allowed; } +.nav-subitem a img { + width: 16px; + height: 16px; +} + .options-dropdown { display: none; position: absolute; @@ -530,10 +538,11 @@ input[type="date"]:focus { .folder-item a { display: flex; align-items: center; - gap: 6px; + gap: 8px; padding: 5px 8px; color: var(--text-secondary); font-size: 11px; + border-left: 2px solid var(--bg-secondary); } .folder-item a:hover { @@ -548,8 +557,8 @@ input[type="date"]:focus { } .folder-icon { - width: 14px; - height: 14px; + width: 16px; + height: 16px; } .folder-name { diff --git a/static/icons/dog.png b/static/icons/dog.png new file mode 100644 index 0000000..22e0ac5 Binary files /dev/null and b/static/icons/dog.png differ diff --git a/static/icons/dog_open.png b/static/icons/dog_open.png new file mode 100644 index 0000000..f90b9c4 Binary files /dev/null and b/static/icons/dog_open.png differ diff --git a/static/icons/encrypt.png b/static/icons/encrypt.png new file mode 100644 index 0000000..5ab926f Binary files /dev/null and b/static/icons/encrypt.png differ diff --git a/static/icons/encrypt_open.png b/static/icons/encrypt_open.png new file mode 100644 index 0000000..9274859 Binary files /dev/null and b/static/icons/encrypt_open.png differ diff --git a/static/icons/folder.png b/static/icons/folder.png new file mode 100644 index 0000000..0b86933 Binary files /dev/null and b/static/icons/folder.png differ diff --git a/static/icons/folder_open.png b/static/icons/folder_open.png new file mode 100644 index 0000000..0f88026 Binary files /dev/null and b/static/icons/folder_open.png differ diff --git a/static/icons/inbox.png b/static/icons/inbox.png new file mode 100644 index 0000000..f137c7a Binary files /dev/null and b/static/icons/inbox.png differ diff --git a/static/icons/inbox_open.png b/static/icons/inbox_open.png new file mode 100644 index 0000000..da9e8b0 Binary files /dev/null and b/static/icons/inbox_open.png differ diff --git a/tags/tags.go b/tags/tags.go index 6229c20..a33b223 100644 --- a/tags/tags.go +++ b/tags/tags.go @@ -15,7 +15,7 @@ func Initialize() { tags := []templateTag{ {"url", url}, - {"static", static}, + // {"static", static}, } for _, t := range tags { diff --git a/templates/partials/sidebar.django b/templates/partials/sidebar.django index ea0a72d..12df271 100644 --- a/templates/partials/sidebar.django +++ b/templates/partials/sidebar.django @@ -2,7 +2,13 @@ {% for folder in Folders %}