diff --git a/.claude/settings.local.json b/.claude/settings.local.json new file mode 100644 index 0000000..d2b86b2 --- /dev/null +++ b/.claude/settings.local.json @@ -0,0 +1,10 @@ +{ + "permissions": { + "allow": [ + "Bash(dotnet publish:*)", + "WebFetch(domain:github.com)", + "WebFetch(domain:raw.githubusercontent.com)", + "mcp__ide__getDiagnostics" + ] + } +} diff --git a/Clockify/AvailableOptions.cs b/Clockify/AvailableOptions.cs new file mode 100644 index 0000000..a24b6a7 --- /dev/null +++ b/Clockify/AvailableOptions.cs @@ -0,0 +1,10 @@ +using System.Collections.Generic; + +namespace Clockify; + +public class AvailableOptions +{ + public List WorkspaceNames { get; set; } = []; + public List ProjectNames { get; set; } = []; + public List TaskNames { get; set; } = []; +} diff --git a/Clockify/ClockifyService.cs b/Clockify/ClockifyService.cs index b8baf21..f00820b 100644 --- a/Clockify/ClockifyService.cs +++ b/Clockify/ClockifyService.cs @@ -25,10 +25,17 @@ public class ClockifyService(Logger logger) private List _tags = []; private TaskDtoV1 _task = new(); + private List _allWorkspaceNames = []; + private List _allProjectNames = []; + private List _allTaskNames = []; + public bool IsValid => _clockifyClient is not null && !string.IsNullOrWhiteSpace(_settings.WorkspaceName) && _workspace is not null; + public AvailableOptions GetAvailableOptions() => + new() { WorkspaceNames = _allWorkspaceNames, ProjectNames = _allProjectNames, TaskNames = _allTaskNames }; + public async Task ToggleTimerAsync() { logger.LogInfo("Toggling timer..."); @@ -211,24 +218,39 @@ private async Task ReloadCacheAsync() _project = null; _tags = []; _task = null; - + _allWorkspaceNames = []; + _allProjectNames = []; + _allTaskNames = []; + try { var workspaces = await _clockifyClient.V1.Workspaces.GetAsync(); + _allWorkspaceNames = workspaces?.Select(w => w.Name).ToList() ?? []; _workspace = workspaces?.SingleOrDefault(w => w.Name == _settings.WorkspaceName); if (_workspace is not null) { + var allProjects = await _clockifyClient.V1.Workspaces[_workspace.Id].Projects + .GetAsync(q => q.QueryParameters.PageSize = MaxPageSize); + _allProjectNames = allProjects?.Select(p => p.Name).ToList() ?? []; + var client = await FindMatchingClientAsync(_workspace.Id, _settings.ClientName); _project = await FindMatchingProjectAsync(_workspace.Id, _settings.ProjectName, client?.Id); _tags = await FindMatchingTagsAsync(_workspace.Id, _settings.Tags); if (_project is not null) { - _task = await FindMatchingTaskAsync(_workspace.Id, _project.Id, _settings.TaskName); + var allTasks = await _clockifyClient.V1.Workspaces[_workspace.Id].Projects[_project.Id].Tasks + .GetAsync(q => + { + q.QueryParameters.PageSize = MaxPageSize; + q.QueryParameters.IsActive = true; + }); + _allTaskNames = allTasks?.Select(t => t.Name).ToList() ?? []; + _task = allTasks?.FirstOrDefault(t => t.Name == _settings.TaskName); } } - + logger.LogInfo("Reloading cache successful"); } catch (Exception exception) when (exception is ApiException or HttpRequestException) diff --git a/Clockify/ToggleAction.cs b/Clockify/ToggleAction.cs index 8cea331..673953e 100644 --- a/Clockify/ToggleAction.cs +++ b/Clockify/ToggleAction.cs @@ -1,6 +1,7 @@ using System; using System.Threading.Tasks; using BarRaider.SdTools; +using Newtonsoft.Json.Linq; // ReSharper disable AsyncVoidMethod - Async overridse for SdTools namespace Clockify; @@ -100,6 +101,12 @@ public override async void ReceivedSettings(ReceivedSettingsPayload payload) Tools.AutoPopulateSettings(_settings, payload.Settings); _logger.LogInfo($"Settings Received: {_settings}"); await _clockifyService.UpdateSettingsAsync(_settings); + await SendOptionsToPropertyInspectorAsync(); + } + + public override async void PropertyInspectorDidAppear() + { + await SendOptionsToPropertyInspectorAsync(); } public override void ReceivedGlobalSettings(ReceivedGlobalSettingsPayload payload) @@ -107,6 +114,12 @@ public override void ReceivedGlobalSettings(ReceivedGlobalSettingsPayload payloa _logger.LogInfo("Global Settings Received"); } + private async Task SendOptionsToPropertyInspectorAsync() + { + var options = _clockifyService.GetAvailableOptions(); + await Connection.SendToPropertyInspectorAsync(JObject.FromObject(options)); + } + private async Task TryInitializingClockifyContext() { if (_clockifyService.IsValid) diff --git a/PropertyInspector/PluginActionPI.html b/PropertyInspector/PluginActionPI.html index 1e3e75d..f78a374 100644 --- a/PropertyInspector/PluginActionPI.html +++ b/PropertyInspector/PluginActionPI.html @@ -1,4 +1,4 @@ - + @@ -11,21 +11,32 @@
+ + + + +
API Key
- +
-
Workspace Name
- +
Workspace
+
-
Project Name
- +
Project
+
-
Task Name
- +
Task
+
Timer Name
@@ -69,10 +80,11 @@
Server Url
- +
+