From f22b9b4947e56b4bb04d66ca073609b94cc8620a Mon Sep 17 00:00:00 2001 From: Gisle Aune Date: Wed, 20 Jan 2021 22:05:52 +0100 Subject: [PATCH] add multiple statuses to proejcts, though it's a bit hacked on. --- database/postgres/project.go | 7 ++- ...20210752_add_project_column_status_tag.sql | 11 ++++ ...301_update_project_inactive_status_tag.sql | 9 +++ models/project.go | 21 +++++-- svelte-ui/src/components/ParentEntry.svelte | 8 ++- svelte-ui/src/components/Progress.svelte | 5 ++ svelte-ui/src/components/ProjectEntry.svelte | 43 +++++++------- svelte-ui/src/components/ProjectIcon.svelte | 41 +++++++++++++ .../src/components/ProjectProgress.svelte | 3 +- svelte-ui/src/components/QLList.svelte | 2 +- svelte-ui/src/components/QLListItem.svelte | 57 ++++++++----------- svelte-ui/src/components/QuestLog.svelte | 13 ++++- svelte-ui/src/components/StatusColor.svelte | 42 ++++++++++++++ svelte-ui/src/forms/ProjectForm.svelte | 18 ++++-- svelte-ui/src/models/project.ts | 4 ++ 15 files changed, 214 insertions(+), 70 deletions(-) create mode 100644 migrations/postgres/20210120210752_add_project_column_status_tag.sql create mode 100644 migrations/postgres/20210120211301_update_project_inactive_status_tag.sql create mode 100644 svelte-ui/src/components/ProjectIcon.svelte create mode 100644 svelte-ui/src/components/StatusColor.svelte diff --git a/database/postgres/project.go b/database/postgres/project.go index 8f9cd68..7ba1a93 100644 --- a/database/postgres/project.go +++ b/database/postgres/project.go @@ -62,9 +62,9 @@ func (r *projectRepository) List(ctx context.Context, filter models.ProjectFilte func (r *projectRepository) Insert(ctx context.Context, project models.Project) error { _, err := r.db.NamedExecContext(ctx, ` INSERT INTO project( - project_id, user_id, name, description, icon, active, created_time, end_time + project_id, user_id, name, description, icon, active, created_time, end_time, status_tag ) VALUES ( - :project_id, :user_id, :name, :description, :icon, :active, :created_time, :end_time + :project_id, :user_id, :name, :description, :icon, :active, :created_time, :end_time, :status_tag ) `, &project) if err != nil { @@ -81,7 +81,8 @@ func (r *projectRepository) Update(ctx context.Context, project models.Project) description = :description, icon = :icon, active = :active, - end_time = :end_time + end_time = :end_time, + status_tag = :status_tag WHERE project_id=:project_id `, &project) if err != nil { diff --git a/migrations/postgres/20210120210752_add_project_column_status_tag.sql b/migrations/postgres/20210120210752_add_project_column_status_tag.sql new file mode 100644 index 0000000..1be3987 --- /dev/null +++ b/migrations/postgres/20210120210752_add_project_column_status_tag.sql @@ -0,0 +1,11 @@ +-- +goose Up +-- +goose StatementBegin +ALTER TABLE project + ADD COLUMN status_tag TEXT DEFAULT NULL; +-- +goose StatementEnd + +-- +goose Down +-- +goose StatementBegin +ALTER TABLE project + DROP COLUMN status_tag; +-- +goose StatementEnd diff --git a/migrations/postgres/20210120211301_update_project_inactive_status_tag.sql b/migrations/postgres/20210120211301_update_project_inactive_status_tag.sql new file mode 100644 index 0000000..f733422 --- /dev/null +++ b/migrations/postgres/20210120211301_update_project_inactive_status_tag.sql @@ -0,0 +1,9 @@ +-- +goose Up +-- +goose StatementBegin +UPDATE project SET status_tag='completed' WHERE active=false; +-- +goose StatementEnd + +-- +goose Down +-- +goose StatementBegin +SELECT 'Nothing to do'; +-- +goose StatementEnd diff --git a/models/project.go b/models/project.go index 7496a3d..b8fdd76 100644 --- a/models/project.go +++ b/models/project.go @@ -14,6 +14,7 @@ type Project struct { Active bool `json:"active" db:"active"` CreatedTime time.Time `json:"createdTime" db:"created_time"` EndTime *time.Time `json:"endTime" db:"end_time"` + StatusTag *string `json:"statusTag" db:"status_tag"` } func (project *Project) Update(update ProjectUpdate) { @@ -36,15 +37,23 @@ func (project *Project) Update(update ProjectUpdate) { if update.ClearEndTime { project.EndTime = nil } + if update.StatusTag != nil { + project.StatusTag = update.StatusTag + } + if update.ClearStatusTag { + project.StatusTag = nil + } } type ProjectUpdate struct { - Name *string `json:"name"` - Description *string `json:"description"` - Icon *string `json:"icon"` - Active *bool `json:"active"` - EndTime *time.Time `json:"endTime"` - ClearEndTime bool `json:"clearEndTime"` + Name *string `json:"name"` + Description *string `json:"description"` + Icon *string `json:"icon"` + Active *bool `json:"active"` + EndTime *time.Time `json:"endTime"` + ClearEndTime bool `json:"clearEndTime"` + StatusTag *string `json:"statusTag"` + ClearStatusTag bool `json:"clearStatusTag"` } type ProjectResult struct { diff --git a/svelte-ui/src/components/ParentEntry.svelte b/svelte-ui/src/components/ParentEntry.svelte index 74f4199..ab8c0c9 100644 --- a/svelte-ui/src/components/ParentEntry.svelte +++ b/svelte-ui/src/components/ParentEntry.svelte @@ -5,6 +5,7 @@ import Icon from "./Icon.svelte"; import LinkHook from "./LinkHook.svelte"; import Markdown from "./Markdown.svelte"; +import ProjectIcon from "./ProjectIcon.svelte"; import ProjectProgress from "./ProjectProgress.svelte"; import TimeProgress from "./TimeProgress.svelte"; @@ -24,6 +25,7 @@ import TimeProgress from "./TimeProgress.svelte"; project?: EntryIconHolder tasks?: TaskResult[] active?: boolean + statusName?: string } export let entry: EntryCommon; @@ -50,7 +52,11 @@ import TimeProgress from "./TimeProgress.svelte"; {#if !hideIcon}
- + {#if entry.active != null} + + {:else} + + {/if}
{/if}
diff --git a/svelte-ui/src/components/Progress.svelte b/svelte-ui/src/components/Progress.svelte index 306a94a..7165b67 100644 --- a/svelte-ui/src/components/Progress.svelte +++ b/svelte-ui/src/components/Progress.svelte @@ -18,6 +18,7 @@ export let gray = false; export let titlePercentageOnly = false; export let titleTime = false; + export let contextColor = false; let offClass = COLORS[0]; let onClass = COLORS[1]; @@ -52,6 +53,10 @@ onClass = "gray" offClass = "none" } + if (contextColor) { + onClass = "sccpb" + 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. diff --git a/svelte-ui/src/components/ProjectEntry.svelte b/svelte-ui/src/components/ProjectEntry.svelte index e3831f2..dc77d44 100644 --- a/svelte-ui/src/components/ProjectEntry.svelte +++ b/svelte-ui/src/components/ProjectEntry.svelte @@ -8,6 +8,7 @@ import Composition from "./Composition.svelte"; import Option from "./Option.svelte"; import OptionRow from "./OptionRow.svelte"; import ParentEntry from "./ParentEntry.svelte"; +import StatusColor from "./StatusColor.svelte"; import TaskEntry from "./TaskEntry.svelte"; export let project: ProjectResult = null; @@ -26,24 +27,26 @@ import Composition from "./Composition.svelte"; $: mdProjectDelete = {name:"project.delete", project}; - - {#if showAllOptions} - - - - - - {/if} - {#each project.tasks as task (task.id)} - {#if !hideInactive || task.active} - + + + {#if showAllOptions} + + + + + {/if} - {/each} - \ No newline at end of file + {#each project.tasks as task (task.id)} + {#if !hideInactive || task.active} + + {/if} + {/each} + + diff --git a/svelte-ui/src/components/ProjectIcon.svelte b/svelte-ui/src/components/ProjectIcon.svelte new file mode 100644 index 0000000..f4a0030 --- /dev/null +++ b/svelte-ui/src/components/ProjectIcon.svelte @@ -0,0 +1,41 @@ + + + + + + + \ No newline at end of file diff --git a/svelte-ui/src/components/ProjectProgress.svelte b/svelte-ui/src/components/ProjectProgress.svelte index cfd04d2..7e7287b 100644 --- a/svelte-ui/src/components/ProjectProgress.svelte +++ b/svelte-ui/src/components/ProjectProgress.svelte @@ -4,6 +4,7 @@ interface ProjectLike { tasks?: TaskResult[] + statusTag?: string } export let project: ProjectLike; @@ -18,4 +19,4 @@ $: progressTarget = Math.max((project.tasks||[]).map(t => t.itemAmount * t.item.groupWeight).reduce((n,m) => n+m, 0), 1); - + diff --git a/svelte-ui/src/components/QLList.svelte b/svelte-ui/src/components/QLList.svelte index bbbad5f..3248005 100644 --- a/svelte-ui/src/components/QLList.svelte +++ b/svelte-ui/src/components/QLList.svelte @@ -1,6 +1,6 @@ -
-
- -
-
-
-
{project.name}
+ +
+
+ +
+
+
+
{project.name}
+ {#if project.endTime} +
+ +
+ {/if} +
+ {#if project.endTime} -
- -
+ {/if}
- - {#if project.endTime} - - {/if}
-
+ \ No newline at end of file diff --git a/svelte-ui/src/forms/ProjectForm.svelte b/svelte-ui/src/forms/ProjectForm.svelte index 247db79..73f3777 100644 --- a/svelte-ui/src/forms/ProjectForm.svelte +++ b/svelte-ui/src/forms/ProjectForm.svelte @@ -34,7 +34,7 @@ let endTime = formatFormTime(project.endTime); let name = project.name; let description = project.description; - let completed = !project.active; + let statusTag = project.statusTag || ""; let icon = project.icon; let error = null; let loading = false; @@ -45,8 +45,9 @@ if (creation) { stuffLogClient.createProject({ - active: !completed, + active: statusTag === "", endTime: ( endTime == "" ) ? null : new Date(endTime), + statusTag: statusTag || null, name, description, icon, }).then(() => { @@ -70,7 +71,8 @@ stuffLogClient.updateProject(project.id, { endTime: ( endTime == "" ) ? null : new Date(endTime), clearEndTime: ( endTime == "" ), - active: !completed, + active: statusTag === "", + statusTag: statusTag || null, name, description, icon, }).then(() => { @@ -100,8 +102,14 @@ - - + +
diff --git a/svelte-ui/src/models/project.ts b/svelte-ui/src/models/project.ts index 08c3300..79ae37c 100644 --- a/svelte-ui/src/models/project.ts +++ b/svelte-ui/src/models/project.ts @@ -9,6 +9,7 @@ export default interface Project { active: boolean createdTime: string endTime?: string + statusTag?: string } export interface ProjectResult extends Project { @@ -26,6 +27,7 @@ export interface ProjectInput { icon: IconName active: boolean endTime?: string | Date + statusTag?: string } export interface ProjectUpdate { @@ -35,4 +37,6 @@ export interface ProjectUpdate { active?: boolean endTime?: string | Date clearEndTime?: boolean + statusTag?: string + clearStatusTag?: boolean } \ No newline at end of file