From 93559b3ccae14a30ae1fdf160c54d626290af71c Mon Sep 17 00:00:00 2001 From: Matias Daloia Date: Thu, 6 Mar 2025 11:29:50 +0100 Subject: [PATCH] feat: ES-141 add shortcut for app settings --- Makefile | 2 +- app.go | 10 +- backend/entities/keyboard.go | 12 +- backend/entities/scanoss_settings.go | 209 ++++++++++++++++++ .../scanoss_settings_repository_json_impl.go | 40 +++- frontend/src/components/AppSettings.tsx | 10 +- frontend/src/lib/shortcuts.ts | 5 + frontend/wailsjs/go/models.ts | 1 + .../go/service/ScanossSettingsServiceImp.d.ts | 8 + .../go/service/ScanossSettingsServiceImp.js | 16 ++ 10 files changed, 298 insertions(+), 15 deletions(-) diff --git a/Makefile b/Makefile index 5b1cbe8..9788176 100644 --- a/Makefile +++ b/Makefile @@ -48,7 +48,7 @@ go_lint_docker: ## Run docker instance of Go linting across the code base run: cp_assets ## Runs the application in development mode $(eval APPARGS := $(ARGS)) - @wails dev -ldflags "-X github.com/scanoss/scanoss.cc/backend/entities.AppVersion=$(VERSION)" $(if $(strip $(APPARGS)),-appargs "$(APPARGS)") + @wails dev -ldflags "-X github.com/scanoss/scanoss.cc/backend/entities.AppVersion=$(VERSION)" $(if $(strip $(APPARGS)),-appargs "--debug $(APPARGS)") npm: ## Install NPM dependencies for the frontend @echo "Running npm install for frontend..." diff --git a/app.go b/app.go index 9f9783b..36f10c5 100644 --- a/app.go +++ b/app.go @@ -118,7 +118,7 @@ func (a *App) initializeMenu() { groupedShortcuts := a.keyboardService.GetGroupedShortcuts() actionShortcuts := groupedShortcuts[entities.GroupActions] globalShortcuts := groupedShortcuts[entities.GroupGlobal] - + viewShortcuts := groupedShortcuts[entities.GroupView] // Global edit menu EditMenu := AppMenu.AddSubmenu("Edit") for _, shortcut := range globalShortcuts { @@ -133,9 +133,11 @@ func (a *App) initializeMenu() { // View menu ViewMenu := AppMenu.AddSubmenu("View") - ViewMenu.AddText("Sync Scroll Position", keys.Combo("e", keys.ShiftKey, keys.CmdOrCtrlKey), func(cd *menu.CallbackData) { - runtime.EventsEmit(a.ctx, string(entities.ActionToggleSyncScrollPosition)) - }) + for _, shortcut := range viewShortcuts { + ViewMenu.AddText(shortcut.Name, shortcut.Accelerator, func(cd *menu.CallbackData) { + runtime.EventsEmit(a.ctx, string(shortcut.Action)) + }) + } // Scan menu ScanMenu := AppMenu.AddSubmenu("Scan") diff --git a/backend/entities/keyboard.go b/backend/entities/keyboard.go index b8c1589..ddbff2f 100644 --- a/backend/entities/keyboard.go +++ b/backend/entities/keyboard.go @@ -55,7 +55,7 @@ const ( // View ActionToggleSyncScrollPosition Action = "toggleSyncScrollPosition" ActionShowKeyboardShortcutsModal Action = "showKeyboardShortcutsModal" - + ActionOpenSettings Action = "openSettings" // Scan ActionScanWithOptions Action = "scanWithOptions" ) @@ -108,6 +108,7 @@ var AllShortcutActions = []struct { {ActionToggleSyncScrollPosition, "ToggleSyncScrollPosition"}, {ActionShowKeyboardShortcutsModal, "ShowKeyboardShortcutsModal"}, {ActionScanWithOptions, "ScanWithOptions"}, + {ActionOpenSettings, "OpenSettings"}, } var DefaultShortcuts = []Shortcut{ @@ -291,6 +292,7 @@ var DefaultShortcuts = []Shortcut{ Action: ActionReplaceComponentWithComments, }, + // View { Name: "Sync Scroll Position", Description: "Sync the scroll position of the editors", @@ -299,6 +301,14 @@ var DefaultShortcuts = []Shortcut{ Group: GroupView, Action: ActionToggleSyncScrollPosition, }, + { + Name: "Settings", + Description: "Open the app settings", + Accelerator: keys.CmdOrCtrl(","), + Keys: "mod+,", + Group: GroupView, + Action: ActionOpenSettings, + }, // Scan { diff --git a/backend/entities/scanoss_settings.go b/backend/entities/scanoss_settings.go index fc12f58..6b43798 100644 --- a/backend/entities/scanoss_settings.go +++ b/backend/entities/scanoss_settings.go @@ -184,3 +184,212 @@ func (sf *SettingsFile) GetBomEntryFromResult(result Result) ComponentFilter { return ComponentFilter{} } + +var DefaultSkippedDirs = []string{ + "nbproject", + "nbbuild", + "nbdist", + "__pycache__", + "venv", + "_yardoc", + "eggs", + "wheels", + "htmlcov", + "__pypackages__", + "example", + "examples", + "docs", + "tests", + "doc", + "test", +} + +var DefaultSkippedFiles = []string{ + "gradlew", + "gradlew.bat", + "mvnw", + "mvnw.cmd", + "gradle-wrapper.jar", + "maven-wrapper.jar", + "thumbs.db", + "babel.config.js", + "license.txt", + "license.md", + "copying.lib", + "makefile", +} + +var DefaultSkippedDirExtensions = []string{".egg-info"} + +var DefaultSkippedExtensions = []string{ + ".1", + ".2", + ".3", + ".4", + ".5", + ".6", + ".7", + ".8", + ".9", + ".ac", + ".adoc", + ".am", + ".asciidoc", + ".bmp", + ".build", + ".cfg", + ".chm", + ".class", + ".cmake", + ".cnf", + ".conf", + ".config", + ".contributors", + ".copying", + ".crt", + ".csproj", + ".css", + ".csv", + ".dat", + ".data", + ".doc", + ".docx", + ".dtd", + ".dts", + ".iws", + ".c9", + ".c9revisions", + ".dtsi", + ".dump", + ".eot", + ".eps", + ".geojson", + ".gdoc", + ".gif", + ".glif", + ".gmo", + ".gradle", + ".guess", + ".hex", + ".htm", + ".html", + ".ico", + ".iml", + ".in", + ".inc", + ".info", + ".ini", + ".ipynb", + ".jpeg", + ".jpg", + ".json", + ".jsonld", + ".lock", + ".log", + ".m4", + ".map", + ".markdown", + ".md", + ".md5", + ".meta", + ".mk", + ".mxml", + ".o", + ".otf", + ".out", + ".pbtxt", + ".pdf", + ".pem", + ".phtml", + ".plist", + ".png", + ".po", + ".ppt", + ".prefs", + ".properties", + ".pyc", + ".qdoc", + ".result", + ".rgb", + ".rst", + ".scss", + ".sha", + ".sha1", + ".sha2", + ".sha256", + ".sln", + ".spec", + ".sql", + ".sub", + ".svg", + ".svn-base", + ".tab", + ".template", + ".test", + ".tex", + ".tiff", + ".toml", + ".ttf", + ".txt", + ".utf-8", + ".vim", + ".wav", + ".woff", + ".woff2", + ".xht", + ".xhtml", + ".xls", + ".xlsx", + ".xml", + ".xpm", + ".xsd", + ".xul", + ".yaml", + ".yml", + ".wfp", + ".editorconfig", + ".dotcover", + ".pid", + ".lcov", + ".egg", + ".manifest", + ".cache", + ".coverage", + ".cover", + ".gem", + ".lst", + ".pickle", + ".pdb", + ".gml", + ".pot", + ".plt", + ".whml", + ".pom", + ".smtml", + ".min.js", + ".mf", + ".base64", + ".s", + ".diff", + ".patch", + ".rules", + // File endings + "-doc", + "changelog", + "config", + "copying", + "license", + "authors", + "news", + "licenses", + "notice", + "readme", + "swiftdoc", + "texidoc", + "todo", + "version", + "ignore", + "manifest", + "sqlite", + "sqlite3", +} diff --git a/backend/repository/scanoss_settings_repository_json_impl.go b/backend/repository/scanoss_settings_repository_json_impl.go index cf71698..01b169c 100644 --- a/backend/repository/scanoss_settings_repository_json_impl.go +++ b/backend/repository/scanoss_settings_repository_json_impl.go @@ -39,8 +39,9 @@ import ( ) type ScanossSettingsJsonRepository struct { - fr utils.FileReader - mutex sync.RWMutex + fr utils.FileReader + mutex sync.RWMutex + defaultSkipPatterns []string } func NewScanossSettingsJsonRepository(fr utils.FileReader) ScanossSettingsRepository { @@ -58,6 +59,8 @@ func (r *ScanossSettingsJsonRepository) Init() error { return err } + r.defaultSkipPatterns = r.generateDefaultSkipPatterns() + r.setSettingsFile(cfg.GetScanSettingsFilePath()) cfg.RegisterListener(r.onConfigChange) @@ -244,16 +247,37 @@ func (r *ScanossSettingsJsonRepository) MatchesScanningSkipPattern(path string) isDir = fileInfo.IsDir() } - if ps.Match(strings.Split(path, "/"), isDir) { - return true - } - - return false + pathParts := strings.Split(path, "/") + return ps.Match(pathParts, isDir) } func (r *ScanossSettingsJsonRepository) getScanningSkipPatterns() []string { sf := r.GetSettings() - return sf.Settings.Skip.Patterns.Scanning + return append(r.defaultSkipPatterns, sf.Settings.Skip.Patterns.Scanning...) +} + +func (r *ScanossSettingsJsonRepository) generateDefaultSkipPatterns() []string { + defaultSkipPatterns := make([]string, 0, len(entities.DefaultSkippedDirExtensions)+len(entities.DefaultSkippedExtensions)+len(entities.DefaultSkippedDirs)+len(entities.DefaultSkippedFiles)) + + for _, dirExtension := range entities.DefaultSkippedDirExtensions { + defaultSkipPatterns = append(defaultSkipPatterns, fmt.Sprintf("*%s", dirExtension)) + } + + for _, extension := range entities.DefaultSkippedExtensions { + defaultSkipPatterns = append(defaultSkipPatterns, fmt.Sprintf("*%s", extension)) + } + + for _, dir := range entities.DefaultSkippedDirs { + defaultSkipPatterns = append(defaultSkipPatterns, fmt.Sprintf("%s/", dir)) + } + + defaultSkipPatterns = append(defaultSkipPatterns, entities.DefaultSkippedFiles...) + + return defaultSkipPatterns +} + +func (r *ScanossSettingsJsonRepository) GetDefaultSkipPatterns(sf *entities.SettingsFile) []string { + return r.defaultSkipPatterns } func (r *ScanossSettingsJsonRepository) AddScanningSkipPattern(pattern string) error { diff --git a/frontend/src/components/AppSettings.tsx b/frontend/src/components/AppSettings.tsx index dd573d3..7ceea3b 100644 --- a/frontend/src/components/AppSettings.tsx +++ b/frontend/src/components/AppSettings.tsx @@ -22,8 +22,10 @@ */ import { Settings } from 'lucide-react'; -import { useState } from 'react'; +import { useEffect, useState } from 'react'; +import { entities } from '../../wailsjs/go/models'; +import { EventsOn } from '../../wailsjs/runtime/runtime'; import SettingsDialog from './SettingsDialog'; import { Tooltip, TooltipContent, TooltipTrigger } from './ui/tooltip'; @@ -33,6 +35,12 @@ export default function AppSettings() { const handleOpenSettingsModal = () => setShowSettingsModal(true); const handleCloseSettingsModal = () => setShowSettingsModal(false); + useEffect(() => { + EventsOn(entities.Action.OpenSettings, () => { + setShowSettingsModal(true); + }); + }, []); + return ( <> diff --git a/frontend/src/lib/shortcuts.ts b/frontend/src/lib/shortcuts.ts index a54e738..1a07b59 100644 --- a/frontend/src/lib/shortcuts.ts +++ b/frontend/src/lib/shortcuts.ts @@ -149,6 +149,11 @@ export const KEYBOARD_SHORTCUTS: Record = { description: 'Show the keyboard shortcuts modal', keys: 'mod+shift+k', }, + [entities.Action.OpenSettings]: { + name: 'Open Settings', + description: 'Open the app settings', + keys: 'mod+,', + }, // Scan [entities.Action.ScanWithOptions]: { diff --git a/frontend/wailsjs/go/models.ts b/frontend/wailsjs/go/models.ts index f1d1f85..e77e42c 100755 --- a/frontend/wailsjs/go/models.ts +++ b/frontend/wailsjs/go/models.ts @@ -24,6 +24,7 @@ export namespace entities { ToggleSyncScrollPosition = "toggleSyncScrollPosition", ShowKeyboardShortcutsModal = "showKeyboardShortcutsModal", ScanWithOptions = "scanWithOptions", + OpenSettings = "openSettings", } export class ComponentFilter { path?: string; diff --git a/frontend/wailsjs/go/service/ScanossSettingsServiceImp.d.ts b/frontend/wailsjs/go/service/ScanossSettingsServiceImp.d.ts index abc2bd8..5fabbd6 100755 --- a/frontend/wailsjs/go/service/ScanossSettingsServiceImp.d.ts +++ b/frontend/wailsjs/go/service/ScanossSettingsServiceImp.d.ts @@ -4,10 +4,18 @@ import {entities} from '../models'; export function AddScanningSkipPattern(arg1:string):Promise; +export function CleanupConflictingPatterns():Promise; + +export function GetMatchingSkipPattern(arg1:string):Promise; + export function GetSettings():Promise; export function HasUnsavedChanges():Promise; +export function IsDefaultSkipPattern(arg1:string):Promise; + export function RemoveScanningSkipPattern(arg1:string):Promise; export function Save():Promise; + +export function ToggleSkipPattern(arg1:string,arg2:boolean):Promise; diff --git a/frontend/wailsjs/go/service/ScanossSettingsServiceImp.js b/frontend/wailsjs/go/service/ScanossSettingsServiceImp.js index c11965e..1ec86bd 100755 --- a/frontend/wailsjs/go/service/ScanossSettingsServiceImp.js +++ b/frontend/wailsjs/go/service/ScanossSettingsServiceImp.js @@ -6,6 +6,14 @@ export function AddScanningSkipPattern(arg1) { return window['go']['service']['ScanossSettingsServiceImp']['AddScanningSkipPattern'](arg1); } +export function CleanupConflictingPatterns() { + return window['go']['service']['ScanossSettingsServiceImp']['CleanupConflictingPatterns'](); +} + +export function GetMatchingSkipPattern(arg1) { + return window['go']['service']['ScanossSettingsServiceImp']['GetMatchingSkipPattern'](arg1); +} + export function GetSettings() { return window['go']['service']['ScanossSettingsServiceImp']['GetSettings'](); } @@ -14,6 +22,10 @@ export function HasUnsavedChanges() { return window['go']['service']['ScanossSettingsServiceImp']['HasUnsavedChanges'](); } +export function IsDefaultSkipPattern(arg1) { + return window['go']['service']['ScanossSettingsServiceImp']['IsDefaultSkipPattern'](arg1); +} + export function RemoveScanningSkipPattern(arg1) { return window['go']['service']['ScanossSettingsServiceImp']['RemoveScanningSkipPattern'](arg1); } @@ -21,3 +33,7 @@ export function RemoveScanningSkipPattern(arg1) { export function Save() { return window['go']['service']['ScanossSettingsServiceImp']['Save'](); } + +export function ToggleSkipPattern(arg1, arg2) { + return window['go']['service']['ScanossSettingsServiceImp']['ToggleSkipPattern'](arg1, arg2); +}