From 605518408436d7485ede4599d7706a2f79e60317 Mon Sep 17 00:00:00 2001
From: elforjani13 <39470382+elforjani13@users.noreply.github.com>
Date: Sun, 25 Sep 2022 22:24:06 +0200
Subject: [PATCH] feat: add api project billable entries dialog.
---
.../ProjectBillableEntriesFormContent.tsx | 19 +++--
.../ProjectBillableEntriesFormFields.tsx | 28 ++++++--
...jectBillableEntriesFormFloatingActions.tsx | 12 ++--
.../ProjectBillableEntriesFormProvider.tsx | 25 ++++++-
.../components.tsx | 70 +++++++++++--------
5 files changed, 111 insertions(+), 43 deletions(-)
diff --git a/src/containers/Projects/containers/ProjectBillableEntriesFormDialog/ProjectBillableEntriesFormContent.tsx b/src/containers/Projects/containers/ProjectBillableEntriesFormDialog/ProjectBillableEntriesFormContent.tsx
index 36b5de71f..50a02af41 100644
--- a/src/containers/Projects/containers/ProjectBillableEntriesFormDialog/ProjectBillableEntriesFormContent.tsx
+++ b/src/containers/Projects/containers/ProjectBillableEntriesFormDialog/ProjectBillableEntriesFormContent.tsx
@@ -2,6 +2,9 @@
import React from 'react';
import { Form } from 'formik';
+import { Choose } from '@/components';
+import { EmptyStatuCallout } from './utils';
+import { useProjectBillableEntriesFormContext } from './ProjectBillableEntriesFormProvider';
import ProjectBillableEntriesFormFields from './ProjectBillableEntriesFormFields';
import ProjectBillableEntriesFormFloatingActions from './ProjectBillableEntriesFormFloatingActions';
@@ -10,10 +13,18 @@ import ProjectBillableEntriesFormFloatingActions from './ProjectBillableEntriesF
* @returns
*/
export default function ProjectBillableEntriesFormContent() {
+ const { isEmptyStatus } = useProjectBillableEntriesFormContext();
return (
-
+
+
+
+
+
+
+
+
);
}
diff --git a/src/containers/Projects/containers/ProjectBillableEntriesFormDialog/ProjectBillableEntriesFormFields.tsx b/src/containers/Projects/containers/ProjectBillableEntriesFormDialog/ProjectBillableEntriesFormFields.tsx
index f561ed3e8..38cb3ed81 100644
--- a/src/containers/Projects/containers/ProjectBillableEntriesFormDialog/ProjectBillableEntriesFormFields.tsx
+++ b/src/containers/Projects/containers/ProjectBillableEntriesFormDialog/ProjectBillableEntriesFormFields.tsx
@@ -2,16 +2,25 @@
import React from 'react';
import { useFormikContext } from 'formik';
-import { Classes } from '@blueprintjs/core';
+import { Classes, Position } from '@blueprintjs/core';
import {
FFormGroup,
FInputGroup,
+ FDateInput,
FieldRequiredHint,
FormattedMessage as T,
} from '@/components';
+import {
+ inputIntent,
+ momentFormatter,
+ tansformDateValue,
+ handleDateChange,
+} from '@/utils';
+import classNames from 'classnames';
+import { CLASSES } from '@/constants/classes';
import { ProjectBillableTypeSuggestField } from '../../components';
import { billableTypeOption } from '../common';
-import { ProjectRowDivider, ProjectEntiresBox } from './components';
+import { ProjectRowDivider, BillableEntiresBox } from './components';
import { useProjectBillableEntriesFormContext } from './ProjectBillableEntriesFormProvider';
/**
@@ -22,6 +31,8 @@ export default function ProjectBillableEntriesFormFields() {
// Formik context.
const { values } = useFormikContext();
+ const { billableEntries } = useProjectBillableEntriesFormContext();
+
return (
{/*------------ Filter by Date -----------*/}
@@ -29,8 +40,17 @@ export default function ProjectBillableEntriesFormFields() {
name={'date'}
label={
}
labelInfo={
}
+ className={classNames(CLASSES.FILL, 'form-group--date')}
>
-
+
date.toLocaleString()}
+ popoverProps={{
+ position: Position.BOTTOM,
+ minimal: true,
+ }}
+ />
@@ -47,7 +67,7 @@ export default function ProjectBillableEntriesFormFields() {
/>
-
+
);
}
diff --git a/src/containers/Projects/containers/ProjectBillableEntriesFormDialog/ProjectBillableEntriesFormFloatingActions.tsx b/src/containers/Projects/containers/ProjectBillableEntriesFormDialog/ProjectBillableEntriesFormFloatingActions.tsx
index e11502d57..cb8142e39 100644
--- a/src/containers/Projects/containers/ProjectBillableEntriesFormDialog/ProjectBillableEntriesFormFloatingActions.tsx
+++ b/src/containers/Projects/containers/ProjectBillableEntriesFormDialog/ProjectBillableEntriesFormFloatingActions.tsx
@@ -5,6 +5,7 @@ import styled from 'styled-components';
import { useFormikContext } from 'formik';
import { Intent, Button, Classes } from '@blueprintjs/core';
import { FormattedMessage as T } from '@/components';
+import { useProjectBillableEntriesFormContext } from './ProjectBillableEntriesFormProvider';
import withDialogActions from '@/containers/Dialog/withDialogActions';
import { compose } from '@/utils';
@@ -17,7 +18,9 @@ function ProjectEntriesFormFloatingActions({
closeDialog,
}) {
// Formik context.
- const { isSubmitting } = useFormikContext();
+ const { isSubmitting, values } = useFormikContext();
+
+ const { dialogName } = useProjectBillableEntriesFormContext();
// Handle close button click.
const handleCancelBtnClick = () => {
@@ -32,8 +35,11 @@ function ProjectEntriesFormFloatingActions({
loading={isSubmitting}
type="submit"
>
- Save
+
+
);
@@ -43,8 +49,6 @@ export default compose(withDialogActions)(ProjectEntriesFormFloatingActions);
const SaveButton = styled(Button)`
&.bp3-button {
- min-width: 80px;
- border-radius: 16px;
margin-left: 0px;
}
`;
diff --git a/src/containers/Projects/containers/ProjectBillableEntriesFormDialog/ProjectBillableEntriesFormProvider.tsx b/src/containers/Projects/containers/ProjectBillableEntriesFormDialog/ProjectBillableEntriesFormProvider.tsx
index 4f9aa522f..99e5442e4 100644
--- a/src/containers/Projects/containers/ProjectBillableEntriesFormDialog/ProjectBillableEntriesFormProvider.tsx
+++ b/src/containers/Projects/containers/ProjectBillableEntriesFormDialog/ProjectBillableEntriesFormProvider.tsx
@@ -1,6 +1,8 @@
// @ts-nocheck
import React from 'react';
+import { isEmpty } from 'lodash';
+import { useProjectBillableEntries } from '../../hooks';
import { DialogContent } from '@/components';
const ProjectBillableEntriesFormContext = React.createContext();
@@ -15,14 +17,35 @@ function ProjectBillableEntriesFormProvider({
projectId,
...props
}) {
+ // Handle fetch project billable entries.
+ const { data: billableEntries, isLoading: isProjectBillableEntriesLoading } =
+ useProjectBillableEntries(
+ projectId,
+ {
+ enabled: !!projectId,
+ },
+ {
+ // billable_type: '',
+ // to_date: '',
+ },
+ );
+
+ // Detarmines the datatable empty status.
+ const isEmptyStatus = isEmpty(billableEntries);
+
//state provider.
const provider = {
dialogName,
+ billableEntries,
projectId,
+ isEmptyStatus,
};
return (
-
+
);
diff --git a/src/containers/Projects/containers/ProjectBillableEntriesFormDialog/components.tsx b/src/containers/Projects/containers/ProjectBillableEntriesFormDialog/components.tsx
index b10523a6e..21da1a3fd 100644
--- a/src/containers/Projects/containers/ProjectBillableEntriesFormDialog/components.tsx
+++ b/src/containers/Projects/containers/ProjectBillableEntriesFormDialog/components.tsx
@@ -1,32 +1,42 @@
// @ts-nocheck
import React from 'react';
-import { Button } from '@blueprintjs/core';
import intl from 'react-intl-universal';
+import { Button } from '@blueprintjs/core';
import styled from 'styled-components';
/**
- * Projec billable entries item box.
+ * Projec billable entries box.
* @returns
*/
-function ProjectBillableEntriesItemBox({ projectBillableEntry }) {
+function BillableEntriesBox({ billableEntry }) {
return (
-
-
- {projectBillableEntry.title}
-
- {projectBillableEntry.date}
- {projectBillableEntry.time}
-
-
-
- {projectBillableEntry.billable_amount}
-
-
- Add
- Show
-
-
+
+
+
+ {intl.get('project_billable_entries.billable_type', {
+ value: billableEntry.billable_type,
+ })}
+
+
+ {billableEntry.date}
+ {billableEntry.time}
+
+
+
+
+ {billableEntry.billable_amount_formatted}
+
+
+
+
+ {intl.get('project_billable_entries.dialog.add')}
+
+
+ {intl.get('project_billable_entries.dialog.show')}
+
+
+
);
}
@@ -34,13 +44,13 @@ function ProjectBillableEntriesItemBox({ projectBillableEntry }) {
* Project billable entries box.
* @returns
*/
-export function ProjectEntiresBox({ billableEntries }) {
+export function BillableEntiresBox({ billableEntries }) {
return billableEntries.map((entries) => (
-
+
));
}
-const ProjectEntryBox = styled.div`
+const BillableEntriesWrap = styled.div`
display: flex;
flex-direction: column;
border-radius: 5px;
@@ -51,30 +61,30 @@ const ProjectEntryBox = styled.div`
margin-bottom: 15px;
position: relative;
`;
-const ProjectEntryHeader = styled.div``;
-const ProjectEntryTitle = styled.div`
+const BillableEntriesHeader = styled.div``;
+const BillableEntryType = styled.div`
font-size: 14px;
line-height: 1.5;
font-weight: 500;
color: #444444;
`;
-const ProjectEntrtyItemContent = styled.div`
+const BillableEntryContent = styled.div`
display: flex;
justify-content: space-between;
`;
-const ProjectEntryItem = styled.div`
+const BillableEntryItem = styled.div`
font-weight: 400;
font-size: 10px;
color: #666666;
`;
-const ProjectEntryContent = styled.div`
+const BillableEntriesContent = styled.div`
flex: 1 0 auto;
line-height: 2rem;
border-bottom: 1px solid #e3e3e3;
`;
-const ProjectEntryAmount = styled.div`
+const BillableEntryAmount = styled.div`
font-size: 14px;
font-weight: 500;
color: #111111;
@@ -87,11 +97,11 @@ export const ProjectRowDivider = styled.div`
margin-top: 15px;
`;
-const ProjectEntryFoorer = styled.div`
+const BillableEntryFooter = styled.div`
padding: 0;
`;
-const ProjectEntryButton = styled(Button)`
+const BillableEntryButton = styled(Button)`
&.bp3-button.bp3-small,
&.bp3-button:not([class*='bp3-intent-']):not(.bp3-minimal).bp3-small {
font-size: 12px;