Pass timed activity to App
This commit is contained in:
@@ -22,9 +22,19 @@ import InvalidConfigurationError from "components/Errors/InvalidConfigurationErr
|
|||||||
import UpgradeRequiredError from "components/Errors/UpgradeRequiredError"
|
import UpgradeRequiredError from "components/Errors/UpgradeRequiredError"
|
||||||
import UnknownError from "components/Errors/UnknownError"
|
import UnknownError from "components/Errors/UnknownError"
|
||||||
import Header from "./shared/Header"
|
import Header from "./shared/Header"
|
||||||
import { head } from "lodash"
|
import { head, isNil } from "lodash"
|
||||||
import TimeInputParser from "utils/TimeInputParser"
|
import TimeInputParser from "utils/TimeInputParser"
|
||||||
|
|
||||||
|
const findTimedActivity = (activities, service) => {
|
||||||
|
if (!service) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
return activities.find(
|
||||||
|
activity => activity.remote_id === service.id && !isNil(activity.timer_started_at),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
@observer
|
@observer
|
||||||
class App extends Component {
|
class App extends Component {
|
||||||
static propTypes = {
|
static propTypes = {
|
||||||
@@ -41,9 +51,15 @@ class App extends Component {
|
|||||||
activities: PropTypes.array,
|
activities: PropTypes.array,
|
||||||
schedules: PropTypes.array,
|
schedules: PropTypes.array,
|
||||||
projects: PropTypes.array,
|
projects: PropTypes.array,
|
||||||
|
timedActivity: PropTypes.shape({
|
||||||
|
customer_name: PropTypes.string.isRequired,
|
||||||
|
assignment_name: PropTypes.string.isRequired,
|
||||||
|
task_name: PropTypes.string.isRequired,
|
||||||
|
timer_started_at: PropTypes.string.isRequired,
|
||||||
|
seconds: PropTypes.number.isRequired,
|
||||||
|
}),
|
||||||
lastProjectId: PropTypes.number,
|
lastProjectId: PropTypes.number,
|
||||||
lastTaskId: PropTypes.number,
|
lastTaskId: PropTypes.number,
|
||||||
roundTimeEntries: PropTypes.bool,
|
|
||||||
fromDate: PropTypes.string,
|
fromDate: PropTypes.string,
|
||||||
toDate: PropTypes.string,
|
toDate: PropTypes.string,
|
||||||
errorType: PropTypes.string,
|
errorType: PropTypes.string,
|
||||||
@@ -54,7 +70,6 @@ class App extends Component {
|
|||||||
activities: [],
|
activities: [],
|
||||||
schedules: [],
|
schedules: [],
|
||||||
projects: [],
|
projects: [],
|
||||||
roundTimeEntries: false,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@observable changeset = {}
|
@observable changeset = {}
|
||||||
@@ -161,10 +176,12 @@ class App extends Component {
|
|||||||
loading,
|
loading,
|
||||||
subdomain,
|
subdomain,
|
||||||
projects,
|
projects,
|
||||||
|
timedActivity,
|
||||||
activities,
|
activities,
|
||||||
schedules,
|
schedules,
|
||||||
fromDate,
|
fromDate,
|
||||||
toDate,
|
toDate,
|
||||||
|
service,
|
||||||
errorType,
|
errorType,
|
||||||
errorMessage,
|
errorMessage,
|
||||||
} = this.props
|
} = this.props
|
||||||
@@ -191,25 +208,28 @@ class App extends Component {
|
|||||||
<animated.div className="moco-bx-app-container" style={props}>
|
<animated.div className="moco-bx-app-container" style={props}>
|
||||||
<Header subdomain={subdomain} />
|
<Header subdomain={subdomain} />
|
||||||
<Observer>
|
<Observer>
|
||||||
{() => (
|
{() =>
|
||||||
<>
|
timedActivity ? null : (
|
||||||
<Calendar
|
<>
|
||||||
fromDate={parseISO(fromDate)}
|
<Calendar
|
||||||
toDate={parseISO(toDate)}
|
fromDate={parseISO(fromDate)}
|
||||||
activities={activities}
|
toDate={parseISO(toDate)}
|
||||||
schedules={schedules}
|
activities={activities}
|
||||||
selectedDate={new Date(this.changesetWithDefaults.date)}
|
schedules={schedules}
|
||||||
onChange={this.handleSelectDate}
|
selectedDate={new Date(this.changesetWithDefaults.date)}
|
||||||
/>
|
onChange={this.handleSelectDate}
|
||||||
<Form
|
/>
|
||||||
changeset={this.changesetWithDefaults}
|
<Form
|
||||||
projects={projects}
|
changeset={this.changesetWithDefaults}
|
||||||
errors={this.formErrors}
|
projects={projects}
|
||||||
onChange={this.handleChange}
|
timedActivity={findTimedActivity(activities, service)}
|
||||||
onSubmit={this.handleSubmit}
|
errors={this.formErrors}
|
||||||
/>
|
onChange={this.handleChange}
|
||||||
</>
|
onSubmit={this.handleSubmit}
|
||||||
)}
|
/>
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
}
|
||||||
</Observer>
|
</Observer>
|
||||||
</animated.div>
|
</animated.div>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -6,8 +6,14 @@ import cn from "classnames"
|
|||||||
class Form extends Component {
|
class Form extends Component {
|
||||||
static propTypes = {
|
static propTypes = {
|
||||||
changeset: PropTypes.shape({
|
changeset: PropTypes.shape({
|
||||||
project: PropTypes.object,
|
assignment_id: PropTypes.number.isRequired,
|
||||||
task: PropTypes.object,
|
billable: PropTypes.bool.isRequired,
|
||||||
|
date: PropTypes.string.isRequired,
|
||||||
|
task_id: PropTypes.number.isRequired,
|
||||||
|
remote_id: PropTypes.string,
|
||||||
|
remote_service: PropTypes.string,
|
||||||
|
remote_url: PropTypes.string,
|
||||||
|
seconds: PropTypes.number,
|
||||||
hours: PropTypes.string,
|
hours: PropTypes.string,
|
||||||
}).isRequired,
|
}).isRequired,
|
||||||
errors: PropTypes.object,
|
errors: PropTypes.object,
|
||||||
@@ -35,7 +41,7 @@ class Form extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const { projects, changeset, errors, onChange, onSubmit } = this.props
|
const { projects, changeset, timedActivity, errors, onChange, onSubmit } = this.props
|
||||||
const project = Select.findOptionByValue(projects, changeset.assignment_id)
|
const project = Select.findOptionByValue(projects, changeset.assignment_id)
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
@@ -48,12 +48,10 @@ class Popup extends Component {
|
|||||||
"loading",
|
"loading",
|
||||||
"service",
|
"service",
|
||||||
"subdomain",
|
"subdomain",
|
||||||
"lastProjectId",
|
|
||||||
"lastTaskId",
|
|
||||||
"roundTimeEntries",
|
|
||||||
"projects",
|
"projects",
|
||||||
"activities",
|
"activities",
|
||||||
"schedules",
|
"schedules",
|
||||||
|
"timedActivity",
|
||||||
"lastProjectId",
|
"lastProjectId",
|
||||||
"lastTaskId",
|
"lastTaskId",
|
||||||
"fromDate",
|
"fromDate",
|
||||||
|
|||||||
@@ -12,9 +12,7 @@ const parsedProps = parseProps([
|
|||||||
"projects",
|
"projects",
|
||||||
"activities",
|
"activities",
|
||||||
"schedules",
|
"schedules",
|
||||||
"lastProjectId",
|
"timedActivity",
|
||||||
"lastTaskId",
|
|
||||||
"roundTimeEntries",
|
|
||||||
"lastProjectId",
|
"lastProjectId",
|
||||||
"lastTaskId",
|
"lastTaskId",
|
||||||
"fromDate",
|
"fromDate",
|
||||||
|
|||||||
@@ -83,19 +83,26 @@ async function openPopup(tab, { service, messenger }) {
|
|||||||
const toDate = getEndOfWeek()
|
const toDate = getEndOfWeek()
|
||||||
const settings = await getSettings()
|
const settings = await getSettings()
|
||||||
const apiClient = new ApiClient(settings)
|
const apiClient = new ApiClient(settings)
|
||||||
|
const responses = []
|
||||||
try {
|
try {
|
||||||
const responses = await Promise.all([
|
responses.push(await apiClient.login(service))
|
||||||
apiClient.login(service),
|
// we can forgo the following calls if a timed activity exists
|
||||||
apiClient.projects(),
|
if (!responses[0].data.timed_activity) {
|
||||||
apiClient.activities(fromDate, toDate),
|
responses.push(
|
||||||
apiClient.schedules(fromDate, toDate),
|
...(await Promise.all([
|
||||||
])
|
apiClient.projects(),
|
||||||
|
apiClient.activities(fromDate, toDate),
|
||||||
|
apiClient.schedules(fromDate, toDate),
|
||||||
|
])),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
const action = {
|
const action = {
|
||||||
type: "openPopup",
|
type: "openPopup",
|
||||||
payload: {
|
payload: {
|
||||||
service,
|
service,
|
||||||
subdomain: settings.subdomain,
|
subdomain: settings.subdomain,
|
||||||
|
timedActivity: get("[0].data.timed_activity", responses),
|
||||||
lastProjectId: get("[0].data.last_project_id", responses),
|
lastProjectId: get("[0].data.last_project_id", responses),
|
||||||
lastTaskId: get("[0].data.last_task_id", responses),
|
lastTaskId: get("[0].data.last_task_id", responses),
|
||||||
roundTimeEntries: get("[0].data.round_time_entries", responses),
|
roundTimeEntries: get("[0].data.round_time_entries", responses),
|
||||||
|
|||||||
Reference in New Issue
Block a user