From 98c7a66fd0725a883c5dae6fe7a80c9c2a24ea3b Mon Sep 17 00:00:00 2001 From: Gisle Aune Date: Sun, 10 Jan 2021 13:11:52 +0100 Subject: [PATCH] clean up task modal and add non-segmented progress bars. --- models/task.go | 7 +- services/loader.go | 18 +++ svelte-ui/src/App.svelte | 12 +- svelte-ui/src/components/ItemSelect.svelte | 3 +- svelte-ui/src/components/Modal.svelte | 4 + svelte-ui/src/components/Progress.svelte | 29 ++++- svelte-ui/src/components/ProjectEntry.svelte | 2 +- svelte-ui/src/components/TaskEntry.svelte | 9 +- svelte-ui/src/forms/TaskAddForm.svelte | 82 ------------- svelte-ui/src/forms/TaskDeleteForm.svelte | 68 ----------- svelte-ui/src/forms/TaskEditForm.svelte | 74 ----------- svelte-ui/src/forms/TaskForm.svelte | 122 +++++++++++++++++++ svelte-ui/src/models/task.ts | 2 + 13 files changed, 186 insertions(+), 246 deletions(-) delete mode 100644 svelte-ui/src/forms/TaskAddForm.svelte delete mode 100644 svelte-ui/src/forms/TaskDeleteForm.svelte delete mode 100644 svelte-ui/src/forms/TaskEditForm.svelte create mode 100644 svelte-ui/src/forms/TaskForm.svelte diff --git a/models/task.go b/models/task.go index 055a8cc..7a00139 100644 --- a/models/task.go +++ b/models/task.go @@ -52,9 +52,10 @@ type TaskUpdate struct { type TaskResult struct { Task - Item *Item `json:"item"` - Logs []*Log `json:"logs"` - CompletedAmount int `json:"completedAmount"` + Item *Item `json:"item"` + Logs []*Log `json:"logs"` + CompletedAmount int `json:"completedAmount"` + Project *Project `json:"project,omitempty"` } type TaskFilter struct { diff --git a/services/loader.go b/services/loader.go index 91f3278..d743dfa 100644 --- a/services/loader.go +++ b/services/loader.go @@ -329,6 +329,7 @@ func (l *Loader) FindTask(ctx context.Context, id string) (*models.TaskResult, e result := &models.TaskResult{Task: *task} result.Item, _ = l.DB.Items().Find(ctx, task.ItemID) + result.Project, _ = l.DB.Projects().Find(ctx, task.ProjectID) result.Logs, err = l.DB.Logs().List(ctx, models.LogFilter{ UserID: task.UserID, IDs: []string{task.ID}, @@ -354,9 +355,11 @@ func (l *Loader) ListTasks(ctx context.Context, filter models.TaskFilter) ([]*mo taskIDs := make([]string, 0, len(tasks)) itemIDs := stringset.New() + projectIDs := stringset.New() for _, task := range tasks { taskIDs = append(taskIDs, task.ID) itemIDs.Add(task.ItemID) + projectIDs.Add(task.ProjectID) } logs, err := l.DB.Logs().List(ctx, models.LogFilter{ @@ -375,6 +378,14 @@ func (l *Loader) ListTasks(ctx context.Context, filter models.TaskFilter) ([]*mo return nil, err } + projects, err := l.DB.Projects().List(ctx, models.ProjectFilter{ + UserID: auth.UserID(ctx), + IDs: projectIDs.Strings(), + }) + if err != nil { + return nil, err + } + results := make([]*models.TaskResult, 0, len(tasks)) for _, task := range tasks { result := &models.TaskResult{ @@ -395,6 +406,13 @@ func (l *Loader) ListTasks(ctx context.Context, filter models.TaskFilter) ([]*mo } } + for _, project := range projects { + if project.ID == task.ProjectID { + result.Project = project + break + } + } + result.CompletedAmount = len(result.Logs) results = append(results, result) diff --git a/svelte-ui/src/App.svelte b/svelte-ui/src/App.svelte index a938c2c..e8962ca 100644 --- a/svelte-ui/src/App.svelte +++ b/svelte-ui/src/App.svelte @@ -8,13 +8,12 @@ import GroupPage from "./pages/GroupPage.svelte"; import GoalPage from "./pages/GoalPage.svelte"; - import TaskAddForm from "./forms/TaskAddForm.svelte"; - import TaskEditForm from "./forms/TaskEditForm.svelte"; - import TaskDeleteForm from "./forms/TaskDeleteForm.svelte"; import GroupForm from "./forms/GroupForm.svelte"; import GoalForm from "./forms/GoalForm.svelte"; import LogForm from "./forms/LogForm.svelte"; import ProjectForm from "./forms/ProjectForm.svelte"; + import ItemForm from "./forms/ItemForm.svelte"; + import TaskForm from "./forms/TaskForm.svelte"; import LoginForm from "./forms/LoginForm.svelte"; import ModalRoute from "./components/ModalRoute.svelte"; @@ -22,7 +21,6 @@ import Menu from "./components/Menu.svelte"; import authStore from "./stores/auth"; -import ItemForm from "./forms/ItemForm.svelte"; onMount(() => { authStore.check() @@ -45,9 +43,9 @@ import ItemForm from "./forms/ItemForm.svelte"; - - - + + + diff --git a/svelte-ui/src/components/ItemSelect.svelte b/svelte-ui/src/components/ItemSelect.svelte index 5f6aaf6..1de9a58 100644 --- a/svelte-ui/src/components/ItemSelect.svelte +++ b/svelte-ui/src/components/ItemSelect.svelte @@ -3,6 +3,7 @@ export let value = ""; export let name = ""; + export let disabled = false; $: { if ($groupStore.stale && !$groupStore.loading) { @@ -20,7 +21,7 @@ } - {#each $groupStore.groups as group (group.id)} {#each group.items as item (item.id)} diff --git a/svelte-ui/src/components/Modal.svelte b/svelte-ui/src/components/Modal.svelte index cdf34c9..3e4b570 100644 --- a/svelte-ui/src/components/Modal.svelte +++ b/svelte-ui/src/components/Modal.svelte @@ -169,6 +169,10 @@ div.modal :global(input), div.modal :global(select), div.modal :global(textarea) div.modal :global(select) { padding-left: 0.5ch; } +div.modal :global(select:disabled) { + background: #4a4a4a; + color: #aaa; +} div.modal :global(input:disabled) { background: #444; color: #aaa; diff --git a/svelte-ui/src/components/Progress.svelte b/svelte-ui/src/components/Progress.svelte index 90b02ff..3356a70 100644 --- a/svelte-ui/src/components/Progress.svelte +++ b/svelte-ui/src/components/Progress.svelte @@ -18,6 +18,7 @@ let onClass = COLORS[1]; let ons = 0; let offs = 1; + let nonSegmented = false; $: { let level = Math.floor(count / target); @@ -41,16 +42,27 @@ onClass = "green" offClass = "none" } + + // Mark it non-segmented if the target is too high. This prevents a clunky progress bar, + // or a browser freeze if you set the target very high. + if (target > 50) { + nonSegmented = true; + } }
- {#each {length: ons} as _} -
- {/each} - {#each {length: offs} as _} -
- {/each} + {#if nonSegmented} +
+
+ {:else} + {#each {length: ons} as _} +
+ {/each} + {#each {length: offs} as _} +
+ {/each} + {/if}