diff --git a/src/components/DialogsContainer.js b/src/components/DialogsContainer.js index 8d1a0c56c..9fb8d8b76 100644 --- a/src/components/DialogsContainer.js +++ b/src/components/DialogsContainer.js @@ -42,6 +42,7 @@ import CustomerOpeningBalanceDialog from '../containers/Dialogs/CustomerOpeningB import VendorOpeningBalanceDialog from '../containers/Dialogs/VendorOpeningBalanceDialog'; import ProjectFormDialog from '../containers/Projects/containers/ProjectFormDialog'; import TaskFormDialog from '../containers/Projects/containers/TaskFormDialog'; +import TimeEntryFormDialog from '../containers/TimesheetsEntries/containers/TimeEntryFormDialog'; /** * Dialogs container. @@ -94,6 +95,7 @@ export default function DialogsContainer() { + ); } diff --git a/src/containers/Projects/containers/ProjectDetails/ProjectDetailActionsBar.tsx b/src/containers/Projects/containers/ProjectDetails/ProjectDetailActionsBar.tsx index 7d100f694..8e2c1368e 100644 --- a/src/containers/Projects/containers/ProjectDetails/ProjectDetailActionsBar.tsx +++ b/src/containers/Projects/containers/ProjectDetails/ProjectDetailActionsBar.tsx @@ -14,6 +14,7 @@ import { } from 'components'; import withSettings from '../../../Settings/withSettings'; import withSettingsActions from '../../../Settings/withSettingsActions'; +import withDialogActions from 'containers/Dialog/withDialogActions'; import { compose } from 'utils'; @@ -22,6 +23,9 @@ import { compose } from 'utils'; * @returns */ function ProjectDetailActionsBar({ + // #withDialogActions + openDialog, + // #withSettings timesheetsTableSize, @@ -36,6 +40,10 @@ function ProjectDetailActionsBar({ addSetting('timesheets', 'tableSize', size); }; + const handleTimeEntryBtnClick = () => { + openDialog('time-entry-form'); + }; + // Handle the refresh button click. const handleRefreshBtnClick = () => {}; @@ -51,7 +59,7 @@ function ProjectDetailActionsBar({ + + + + ); +} + +export default compose(withDialogActions)(TimeEntryFormFloatingActions); diff --git a/src/containers/Timesheets/containers/TimeEntryFormDialog/TimeEntryFormProvider.tsx b/src/containers/Timesheets/containers/TimeEntryFormDialog/TimeEntryFormProvider.tsx new file mode 100644 index 000000000..66257c9fe --- /dev/null +++ b/src/containers/Timesheets/containers/TimeEntryFormDialog/TimeEntryFormProvider.tsx @@ -0,0 +1,30 @@ +//@ts-nocheck +import React from 'react'; +import { DialogContent } from 'components'; + +const TimeEntryFormContext = React.createContext(); + +/** + * Time entry form provider. + * @returns + */ +function TimeEntryFormProvider({ + // #ownProps + dialogName, + timeEntryId, + ...props +}) { + const provider = { + dialogName, + }; + + return ( + + + + ); +} + +const useTimeEntryFormContext = () => React.useContext(TimeEntryFormContext); + +export { TimeEntryFormProvider, useTimeEntryFormContext }; diff --git a/src/containers/Timesheets/containers/TimeEntryFormDialog/index.tsx b/src/containers/Timesheets/containers/TimeEntryFormDialog/index.tsx new file mode 100644 index 000000000..dc8171068 --- /dev/null +++ b/src/containers/Timesheets/containers/TimeEntryFormDialog/index.tsx @@ -0,0 +1,64 @@ +import React from 'react'; +import styled from 'styled-components'; +import { Dialog, DialogSuspense, FormattedMessage as T } from 'components'; +import withDialogRedux from 'components/DialogReduxConnect'; +import { compose } from 'utils'; + +const TimeEntryFormDialogContent = React.lazy( + () => import('./TimeEntryFormDialogContent'), +); + +/** + * Time entry form dialog. + * @returns + */ +function TimeEntryFormDialog({ dialogName, isOpen, payload: { timeEntryId } }) { + return ( + } + isOpen={isOpen} + autoFocus={true} + canEscapeKeyClose={true} + style={{ width: '400px' }} + > + + + + + ); +} + +export default compose(withDialogRedux())(TimeEntryFormDialog); + +const TimeEntryFormDialogRoot = styled(Dialog)` + .bp3-dialog-body { + .bp3-form-group { + margin-bottom: 15px; + margin-top: 15px; + + label.bp3-label { + margin-bottom: 3px; + font-size: 13px; + } + } + + .form-group { + &--description { + .bp3-form-content { + textarea { + width: 100%; + min-width: 100%; + font-size: 14px; + } + } + } + } + } + .bp3-dialog-footer { + padding-top: 10px; + } +`; diff --git a/src/containers/Timesheets/index.ts b/src/containers/Timesheets/index.ts new file mode 100644 index 000000000..e69de29bb diff --git a/src/lang/en/index.json b/src/lang/en/index.json index e540d5999..f3ca4566b 100644 --- a/src/lang/en/index.json +++ b/src/lang/en/index.json @@ -2082,5 +2082,18 @@ "timesheets.column.task": "Task", "timesheets.column.user": "User", "timesheets.column.time": "Time", - "timesheets.column.billing_status": "Billing Status" + "timesheets.column.billing_status": "Billing Status", + "time_entry.dialog.label": "New time entry", + "time_entry.dialog.project": "Project", + "time_entry.dialog.task": "Task", + "time_entry.dialog.description": "Description", + "time_entry.dialog.duration": "Duration", + "time_entry.dialog.date": "Date", + "time_entry.dialog.create": "Create", + "time_entry.schema.label.project_name": "Project name", + "time_entry.schema.label.task_name": "Task name", + "time_entry.schema.label.duration": "Duration", + "time_entry.schema.label.date": "Date", + "find_or_choose_a_project": "Find or choose a project", + "choose_a_task": "Choose a task" } \ No newline at end of file