diff --git a/application/chronography/controllers/fetch-chronography.ts b/application/chronography/controllers/fetch-chronography.ts index b6e2d80..6a34342 100644 --- a/application/chronography/controllers/fetch-chronography.ts +++ b/application/chronography/controllers/fetch-chronography.ts @@ -38,8 +38,8 @@ export const fetchChronography = async (dayRange: DayRange) => { timings.description as description from main.timings - left join main.activities on timings.activity_id = activities.id - left join main.categories on activities.category_id = categories.id + inner join main.activities on timings.activity_id = activities.id + inner join main.categories on activities.category_id = categories.id where date(timings.start_at) between ? and ? order by timings.start_at asc; `, [activityDayStart, activityDayEnd]); diff --git a/application/chronography/controllers/post-activity-input.ts b/application/chronography/controllers/post-activity-input.ts index 9c28175..29d96c2 100644 --- a/application/chronography/controllers/post-activity-input.ts +++ b/application/chronography/controllers/post-activity-input.ts @@ -5,7 +5,12 @@ import { completeActiveTiming, insertTiming } from '@application/chronography/co import { ActivityData } from '@application/types'; export const postActivityInput = async (activityData: ActivityData): Promise => { - const { category: categoryName, activity: activityName, startTime, endTime } = activityData + const { + category: categoryName, + activity: activityName, + description: activityDescription, + startTime, endTime, + } = activityData; const startTimeString = new Date(startTime).toISOString(); const endTimeString = endTime ? new Date(endTime).toISOString() : null; @@ -20,5 +25,5 @@ export const postActivityInput = async (activityData: ActivityData): Promise ( await knex('timings') - .select('activity_id') + .select('activity_id', 'description') .where({ id: timingId }) ); @@ -16,9 +16,9 @@ export const completeActiveTiming = async (startTime: string) => ( .update({ end_at: startTime }) ); -export const insertTiming = async (activityId: number, startTime: string, endTime: string | null) => ( +export const insertTiming = async (activityId: number, description: string, startTime: string, endTime: string | null) => ( await knex('timings') - .insert({ activity_id: activityId, start_at: startTime, end_at: endTime }) + .insert({ activity_id: activityId, description, start_at: startTime, end_at: endTime }) ); export const fetchActiveTiming = async (): Promise => { @@ -46,8 +46,8 @@ export const fetchActiveTiming = async (): Promise = (strftime('%s', timings.end_at) - strftime('%s', timings.start_at)) / 60 as duration from main.timings - left join main.activities on timings.activity_id = activities.id - left join main.categories on activities.category_id = categories.id + inner join main.activities on timings.activity_id = activities.id + inner join main.categories on activities.category_id = categories.id where date(timings.start_at) = ?`, [activeTimingDate.start_date_at]); @@ -74,7 +74,7 @@ export const repeatTiming = async (timingId: number) => { const [timing] = await fetchTiming(timingId); await completeActiveTiming(currentTime); - await insertTiming(timing.activity_id, currentTime, null); + await insertTiming(timing.activity_id, timing.description, currentTime, null); }; export const deleteTiming = async (timingId: number) => ( diff --git a/application/chronography/create-activity.ts b/application/chronography/create-activity.ts index 9e95c2e..ddf63bb 100644 --- a/application/chronography/create-activity.ts +++ b/application/chronography/create-activity.ts @@ -6,6 +6,7 @@ export const getActivity = (friendlyString: string): ActivityData => { activity: friendlyString, category: null, endTime: null, + description: null, startTime: null, }; diff --git a/application/types/index.ts b/application/types/index.ts index d0b7683..f58a8a2 100644 --- a/application/types/index.ts +++ b/application/types/index.ts @@ -4,6 +4,7 @@ export { ActivityView, activeTimingStart, CurrentActivityView } from './views'; export interface ActivityData { activity: string; category: string | null; + description: string | null; startTime: Date; endTime: Date | null; } diff --git a/frontend/components/activity/__description/activity__description.scss b/frontend/components/activity/__description/activity__description.scss index 073b523..f5c59ec 100644 --- a/frontend/components/activity/__description/activity__description.scss +++ b/frontend/components/activity/__description/activity__description.scss @@ -1,3 +1,11 @@ -.#{$b}__description { +@import '@blueprintjs/core/lib/scss/variables'; + +.#{$b}__title { flex-grow: 1; } + +.#{$b}__description { + color: $gray1; + font-size: $pt-font-size-small; + margin: 3px 0 5px; +} diff --git a/frontend/components/activity/__description/activity__description.tsx b/frontend/components/activity/__description/activity__description.tsx index 0974d46..0884c67 100644 --- a/frontend/components/activity/__description/activity__description.tsx +++ b/frontend/components/activity/__description/activity__description.tsx @@ -7,8 +7,13 @@ interface ActivityDescriptionProps { isCurrent: boolean; } -export const Activity__Description = ({ category, activity, isCurrent }: ActivityDescriptionProps) => ( -
+export const Activity__Description = ({ category, activity, description, isCurrent }: ActivityDescriptionProps) => ( +
{activity} {category}
+ {description && ( +
+ {description} +
+ )}
) diff --git a/frontend/components/activity/__time/activity__time.scss b/frontend/components/activity/__time/activity__time.scss index 417125b..6d4cab7 100644 --- a/frontend/components/activity/__time/activity__time.scss +++ b/frontend/components/activity/__time/activity__time.scss @@ -1,4 +1,6 @@ .#{$b}__time { - width: 110px; + width: 90px; text-align: left; + white-space: nowrap; + margin-right: 10px; } diff --git a/frontend/views/append-activity/append-activity.tsx b/frontend/views/append-activity/append-activity.tsx index 8287f3f..efc9994 100644 --- a/frontend/views/append-activity/append-activity.tsx +++ b/frontend/views/append-activity/append-activity.tsx @@ -5,7 +5,7 @@ import { createRoot } from 'react-dom/client'; import 'dayjs/locale/ru'; import localizedFormat from 'dayjs/plugin/localizedFormat'; -import { FocusStyleManager, FormGroup, InputGroup, Button } from '@blueprintjs/core'; +import { FocusStyleManager, FormGroup, InputGroup, TextArea, Button } from '@blueprintjs/core'; import { Section, Section__Row, Section__Text } from '@frontend/components/section'; import { Form } from '@frontend/components/form'; @@ -28,12 +28,14 @@ FocusStyleManager.onlyShowFocusOnTabs(); const defaultActivityData: ActivityData = { activity: '', category: '', + description: '', startTime: new Date(), endTime: null, }; const AppendActivityView = () => { const [activityInput, setActivityInput] = useState(''); + const [activityDescription, setActivityDescription] = useState(''); const [activityData, setActivityData] = useState(defaultActivityData); const [isLoading, setLoadingStatus] = useState(false); @@ -54,11 +56,17 @@ const AppendActivityView = () => { setActivityInput(value); }; + const changeActivityDescription = (event: FormEvent) => { + const { value } = event.currentTarget; + + setActivityDescription(value); + }; + const submitActivityInput = async () => { setLoadingStatus(true); try { - await postActivityInput(activityData) + await postActivityInput({ ...activityData, description: activityDescription }); } catch (error) { // eslint-disable-next-line no-console console.error(error); @@ -94,6 +102,17 @@ const AppendActivityView = () => { + + +