Pass timed activity to App

This commit is contained in:
manubo
2019-09-19 17:37:56 +02:00
parent 714e9bd139
commit 71fbbd30fa
5 changed files with 66 additions and 37 deletions

View File

@@ -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>
)} )}

View File

@@ -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 (

View File

@@ -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",

View File

@@ -12,9 +12,7 @@ const parsedProps = parseProps([
"projects", "projects",
"activities", "activities",
"schedules", "schedules",
"lastProjectId", "timedActivity",
"lastTaskId",
"roundTimeEntries",
"lastProjectId", "lastProjectId",
"lastTaskId", "lastTaskId",
"fromDate", "fromDate",

View File

@@ -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),