diff --git a/package.json b/package.json index 1f10255..5dfe5de 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ }, "dependencies": { "@vueuse/core": "^9.13.0", + "bulma": "^0.9.4", "nanoid": "^4.0.2", "pinia": "^2.0.34", "pinia-plugin-persistedstate": "^3.1.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 101f785..12a6daf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,6 +4,9 @@ dependencies: '@vueuse/core': specifier: ^9.13.0 version: 9.13.0(vue@3.2.47) + bulma: + specifier: ^0.9.4 + version: 0.9.4 nanoid: specifier: ^4.0.2 version: 4.0.2 @@ -1283,6 +1286,10 @@ packages: ieee754: 1.2.1 dev: true + /bulma@0.9.4: + resolution: {integrity: sha512-86FlT5+1GrsgKbPLRRY7cGDg8fsJiP/jzTqXXVqiUZZ2aZT8uemEOHlU1CDU+TxklPEZ11HZNNWclRBBecP4CQ==} + dev: false + /cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} @@ -1832,6 +1839,21 @@ packages: stop-iteration-iterator: 1.0.0 dev: true + /es-set-tostringtag@2.0.1: + resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.0 + has-symbols: 1.0.3 + is-arguments: 1.1.1 + is-map: 2.0.2 + is-set: 2.0.2 + is-string: 1.0.7 + isarray: 2.0.5 + stop-iteration-iterator: 1.0.0 + dev: true + /es-set-tostringtag@2.0.1: resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} engines: {node: '>= 0.4'} diff --git a/src/App.vue b/src/App.vue index 73439dc..1c51fbc 100644 --- a/src/App.vue +++ b/src/App.vue @@ -4,76 +4,12 @@ import { RouterLink, RouterView } from 'vue-router' - + diff --git a/src/assets/base.css b/src/assets/base.css deleted file mode 100644 index 1241e3d..0000000 --- a/src/assets/base.css +++ /dev/null @@ -1,78 +0,0 @@ -@import url('https://fonts.googleapis.com/css2?family=Oxygen+Mono&display=swap'); - -/* color palette from */ -:root { - --vt-c-white: #ffffff; - --vt-c-white-soft: #f8f8f8; - --vt-c-white-mute: #f2f2f2; - - --vt-c-black: #181818; - --vt-c-black-soft: #222222; - --vt-c-black-mute: #282828; - - --vt-c-indigo: #2c3e50; - - --vt-c-divider-light-1: rgba(60, 60, 60, 0.29); - --vt-c-divider-light-2: rgba(60, 60, 60, 0.12); - --vt-c-divider-dark-1: rgba(84, 84, 84, 0.65); - --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48); - - --vt-c-text-light-1: var(--vt-c-indigo); - --vt-c-text-light-2: rgba(60, 60, 60, 0.66); - --vt-c-text-dark-1: var(--vt-c-white); - --vt-c-text-dark-2: rgba(251, 251, 251, 0.798); -} - -/* semantic color variables for this project */ -:root { - --color-background: var(--vt-c-white); - --color-background-soft: var(--vt-c-white-soft); - --color-background-mute: var(--vt-c-white-mute); - - --color-border: var(--vt-c-divider-light-2); - --color-border-hover: var(--vt-c-divider-light-1); - - --color-heading: var(--vt-c-text-light-1); - --color-text: var(--vt-c-text-light-1); - - --section-gap: 160px; -} - -@media (prefers-color-scheme: dark) { - :root { - --color-background: var(--vt-c-black); - --color-background-soft: var(--vt-c-black-soft); - --color-background-mute: var(--vt-c-black-mute); - - --color-border: var(--vt-c-divider-dark-2); - --color-border-hover: var(--vt-c-divider-dark-1); - - --color-heading: var(--vt-c-text-dark-1); - --color-text: var(--vt-c-text-dark-2); - } -} - -*, -*::before, -*::after { - box-sizing: border-box; - margin: 0; - position: relative; - font-weight: normal; -} - -body { - color: var(--color-text); - background: var(--color-background); - transition: color 0.5s, background-color 0.5s; - line-height: 1.6; - font-family: 'Oxygen Mono', monospace; - font-size: 15px; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -button { - font-family: 'Oxygen Mono', monospace; -} diff --git a/src/assets/main.css b/src/assets/main.css deleted file mode 100644 index 454eb37..0000000 --- a/src/assets/main.css +++ /dev/null @@ -1,29 +0,0 @@ -@import './base.css'; - -#app { - max-width: 1280px; - margin: 0 auto; - padding: 0 1rem; - - font-weight: normal; -} - -a, -.green { - text-decoration: none; - color: hsla(160, 100%, 37%, 1); - transition: 0.4s; -} - -@media (hover: hover) { - a:hover { - background-color: hsla(160, 100%, 37%, 0.2); - } -} - -@media (min-width: 1024px) { - body { - display: flex; - place-items: center; - } -} diff --git a/src/assets/main.scss b/src/assets/main.scss new file mode 100644 index 0000000..07530a2 --- /dev/null +++ b/src/assets/main.scss @@ -0,0 +1,26 @@ +@charset "utf-8"; +@import url('https://fonts.googleapis.com/css2?family=Oxygen+Mono&display=swap'); + +$family-monospace: 'Oxygen Mono', + monospace; + +$family-primary: $family-monospace; + +@import '../../node_modules/bulma/bulma.sass'; + +*, +*::before, +*::after { + box-sizing: border-box; + margin: 0; + padding: 0; +} + +body { + transition: color 0.5s, background-color 0.5s; + font-size: 16px; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + margin: 0 1rem; +} \ No newline at end of file diff --git a/src/main.ts b/src/main.ts index 49a844f..aa8388b 100644 --- a/src/main.ts +++ b/src/main.ts @@ -4,7 +4,7 @@ import { createApp } from 'vue' import App from './App.vue' import { router } from './router' -import './assets/main.css' +import './assets/main.scss' const app = createApp(App) diff --git a/src/modules/record/components/RecordControls.vue b/src/modules/record/components/RecordControls.vue new file mode 100644 index 0000000..c6d41c7 --- /dev/null +++ b/src/modules/record/components/RecordControls.vue @@ -0,0 +1,94 @@ + + + diff --git a/src/modules/record/components/RecordProgress.vue b/src/modules/record/components/RecordProgress.vue new file mode 100644 index 0000000..c57c791 --- /dev/null +++ b/src/modules/record/components/RecordProgress.vue @@ -0,0 +1,33 @@ + + + diff --git a/src/modules/record/components/StepRecord.vue b/src/modules/record/components/StepRecord.vue index 9e8535b..4a38ed4 100644 --- a/src/modules/record/components/StepRecord.vue +++ b/src/modules/record/components/StepRecord.vue @@ -59,17 +59,21 @@ const isSuperiorToEstimation = computed(() => { ⚠️ - -
- {{ step.title }} + +
+
+ {{ step.title }} +
- {{ step.estimation }} minutes - {{ duration }} minutes + {{ step.estimation }} min + {{ duration }} min diff --git a/src/modules/record/components/TaskRecordLink.vue b/src/modules/record/components/TaskRecordLink.vue index 9f9a3c6..65f324e 100644 --- a/src/modules/record/components/TaskRecordLink.vue +++ b/src/modules/record/components/TaskRecordLink.vue @@ -11,20 +11,23 @@ const { duration } = useTaskRecordMetadata(props.record) diff --git a/src/modules/record/components/TaskRecordList.vue b/src/modules/record/components/TaskRecordList.vue index 803a25f..2ffa21d 100644 --- a/src/modules/record/components/TaskRecordList.vue +++ b/src/modules/record/components/TaskRecordList.vue @@ -14,22 +14,20 @@ const newRecordId = createUuid() - - diff --git a/src/modules/record/hooks/useTaskRecordMetadata.ts b/src/modules/record/hooks/useTaskRecordMetadata.ts index 31debac..7aece08 100644 --- a/src/modules/record/hooks/useTaskRecordMetadata.ts +++ b/src/modules/record/hooks/useTaskRecordMetadata.ts @@ -2,7 +2,9 @@ import { formatDiffInMinutes } from '@/shared/format-date' import { computed, isRef, type Ref } from 'vue' import type { TaskRecord } from '../models/task-record' -export const useTaskRecordMetadata = (record: TaskRecord | Ref) => { +export const useTaskRecordMetadata = ( + record: TaskRecord | Ref +) => { const duration = computed(() => { const recordValue = isRef(record) ? record.value : record if (!recordValue?.end) { diff --git a/src/modules/record/stores/useTaskRecordStore.ts b/src/modules/record/stores/useTaskRecordStore.ts index 5e1713c..87a2775 100644 --- a/src/modules/record/stores/useTaskRecordStore.ts +++ b/src/modules/record/stores/useTaskRecordStore.ts @@ -16,8 +16,11 @@ export const useTaskRecordStore = defineStore('task-record-store', { records: {} }), actions: { - addRecord(taskRecord: TaskRecord) { - this.records[taskRecord.id] = taskRecord + addRecord(taskId: string, recordId: string) { + if (recordId in this.records) { + return + } + this.records[recordId] = new TaskRecord(recordId, taskId) }, removeRecord(recordId: string) { delete this.records[recordId] @@ -51,7 +54,7 @@ export const useTaskRecordStore = defineStore('task-record-store', { }, endStepRecord(params: { recordId: string; stepId: string; end: ISODate }) { const stepRecord = - this.records[params.recordId].stepRecords[params.stepId] + this.records[params.recordId]?.stepRecords[params.stepId] if (!stepRecord) { return @@ -83,6 +86,10 @@ export const useTaskRecordStore = defineStore('task-record-store', { }) }, endRecord(recordId: string) { + if (!this.records[recordId]) { + return + } + this.records[recordId].end = toISODate(new Date()) this.currentStepId = null }, @@ -100,6 +107,14 @@ export const useTaskRecordStore = defineStore('task-record-store', { } }) } + }, + reset(recordId: string) { + this.currentStepId = null + if (!this.records[recordId]) { + return + } + this.records[recordId].stepRecords = {} + this.records[recordId].end = undefined } }, getters: { @@ -109,22 +124,20 @@ export const useTaskRecordStore = defineStore('task-record-store', { .filter((record) => record.taskId === taskId) .map((record) => TaskRecord.fromRecordable(record)) }, - createAndRetrieveTaskRecord() { - return (taskId: string, recordId: string): TaskRecord => { + getTaskRecord() { + return (recordId: string): TaskRecord | null => { const hasTaskRecord = !!this.records[recordId] if (hasTaskRecord) { return TaskRecord.fromRecordable(this.records[recordId]) } - const newTaskRecord = new TaskRecord(recordId, taskId) - this.records[recordId] = newTaskRecord - - return newTaskRecord + return null } }, getRecord() { - return (recordId: string) => this.records[recordId] ?? null + return (recordId: string): Recordable | null => + this.records[recordId] ?? null }, getStepRecord() { return (recordId: string, stepId: string): StepRecordable | null => diff --git a/src/modules/task/components/NewTaskForm.vue b/src/modules/task/components/NewTaskForm.vue index ccd4383..c0f0f52 100644 --- a/src/modules/task/components/NewTaskForm.vue +++ b/src/modules/task/components/NewTaskForm.vue @@ -43,21 +43,29 @@ const saveTask = () => { diff --git a/src/modules/task/components/StepInput.vue b/src/modules/task/components/StepInput.vue index 66d1088..d7b0add 100644 --- a/src/modules/task/components/StepInput.vue +++ b/src/modules/task/components/StepInput.vue @@ -29,15 +29,18 @@ const stepsTextarea = computed({ diff --git a/src/modules/task/components/TaskList.vue b/src/modules/task/components/TaskList.vue index 09916a4..d92dea6 100644 --- a/src/modules/task/components/TaskList.vue +++ b/src/modules/task/components/TaskList.vue @@ -6,18 +6,25 @@ const taskStore = useTaskStore() diff --git a/src/views/HomeView.vue b/src/views/HomeView.vue index ab0d86a..16f5b3e 100644 --- a/src/views/HomeView.vue +++ b/src/views/HomeView.vue @@ -7,8 +7,12 @@ const taskStore = useTaskStore() diff --git a/src/views/record/RecordView.vue b/src/views/record/RecordView.vue index 0a3f79f..ed3e169 100644 --- a/src/views/record/RecordView.vue +++ b/src/views/record/RecordView.vue @@ -12,8 +12,3 @@ defineProps<{ - - diff --git a/src/views/task/TaskView.vue b/src/views/task/TaskView.vue index 9c44be8..ab21b99 100644 --- a/src/views/task/TaskView.vue +++ b/src/views/task/TaskView.vue @@ -14,27 +14,24 @@ const task = computed(() => taskStore.getTask(props.id)) - -