Skip to content
This repository was archived by the owner on Jan 14, 2023. It is now read-only.

Commit 4b818d8

Browse files
authored
feat: time entries tab (#55)
* refactor: migrated remaining components to ts * feat: quick draft of time entries section on issue details page * feat: modal manager * feat: delete time entry via overmind action * feat: fetch a list of time entry activities * feat: wip - create new time entry modal * feat: select component. Quick draft of time entry modal * refactor: TimePicker * feat: adding a new time entry * fix: fixed unmounting issue with date picker * fix: reset create time entry modal when closed * feat: icons for time entry card * feat: raw validation * fix: time picker max values * fix: block manual typing on date picker * style: add styles for validation errors on create time entry modal * feat: updating time entries. Used external time picker * fix: modal offset top * chore: cleanup timeEntries reducer
1 parent 2b74408 commit 4b818d8

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

65 files changed

+2121
-2678
lines changed

.eslintrc.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@
8282
"no-use-before-define": "off",
8383
"arrow-parens": "off",
8484
"consistent-return": "off",
85+
"jsx-quotes": "off",
8586
"react/jsx-filename-extension": [
8687
2,
8788
{ "extensions": [".js", ".jsx", ".ts", ".tsx"] }

main/redmine.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,14 +84,14 @@ const createRequestClient = () => {
8484

8585
console.log(response.statusCode, response.body);
8686

87-
if (response.statusCode === 200) {
87+
if (response.statusCode === 200 || response.statusCode === 201) {
8888
return {
8989
data: transform({ route: data.route, method: data.method }, response.body),
9090
success: true,
9191
};
9292
}
9393

94-
if (data.method === 'PUT' && response.statusCode === 204) {
94+
if (['PUT', 'DELETE'].includes(data.method) && response.statusCode === 204) {
9595
return {
9696
success: true
9797
};

main/transformers/enumerations.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
const toExternalActivity = (activity) => ({
2+
id: activity.id,
3+
name: activity.name,
4+
isDefault: activity.is_default,
5+
active: activity.active
6+
});
7+
8+
const transform = ({ route }, responseBody) => {
9+
if (route === 'enumerations/time_entry_activities.json') {
10+
const { time_entry_activities } = responseBody;
11+
return {
12+
activities: time_entry_activities.map((activity) => toExternalActivity(activity))
13+
};
14+
}
15+
16+
return responseBody;
17+
};
18+
19+
module.exports = {
20+
transform
21+
};

main/transformers/index.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ const issues = require('./issues');
33
const issueStatuses = require('./issueStatuses');
44
const projects = require('./projects');
55
const timeEntries = require('./timeEntries');
6+
const enumerations = require('./enumerations');
67

78
const transform = ({ route, method }, responseBody) => {
89
const [entity] = route.split('/')[0].split('.');
@@ -20,6 +21,8 @@ const transform = ({ route, method }, responseBody) => {
2021
return projects.transform({ route, method }, responseBody);
2122
case 'time_entries':
2223
return timeEntries.transform({ route, method }, responseBody);
24+
case 'enumerations':
25+
return enumerations.transform({ route, method }, responseBody);
2326
default:
2427
return responseBody;
2528
}

main/transformers/timeEntries.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@ const transform = ({ route, method }, responseBody) => {
3434
if (/time_entries\/\d{1,}\.json/.test(route)) {
3535
const { time_entry } = responseBody;
3636

37+
if (method === 'GET') {
38+
return toExternalTimeEntry(time_entry);
39+
}
40+
3741
return {
3842
timeEntry: toExternalTimeEntry(time_entry)
3943
};

package.json

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@
9393
"@types/hapi__joi": "^17.1.7",
9494
"@types/jest": "^27.0.1",
9595
"@types/lodash": "^4.14.173",
96+
"@types/react-query": "^1.2.9",
9697
"@types/react-redux": "^7.1.18",
9798
"@types/react-router-dom": "^5.3.2",
9899
"@types/showdown": "^1.9.4",
@@ -103,7 +104,7 @@
103104
"axios-mock-adapter": "^1.17.0",
104105
"babel-jest": "^27.2.0",
105106
"clean-webpack-plugin": "^4.0.0",
106-
"concurrently": "^6.2.1",
107+
"concurrently": "^7.0.0",
107108
"cross-env": "^7.0.0",
108109
"css-loader": "^3.4.2",
109110
"electron": "8.0.1",
@@ -142,6 +143,8 @@
142143
"dependencies": {
143144
"@emotion/react": "^11.5.0",
144145
"@hapi/joi": "^17.1.0",
146+
"@radix-ui/react-dropdown-menu": "^0.1.4",
147+
"@radix-ui/react-tabs": "^0.1.4",
145148
"axios": "^0.19.2",
146149
"clean-stack": "^2.2.0",
147150
"dotenv": "^8.2.0",
@@ -163,14 +166,15 @@
163166
"overmind-react": "^29.0.1",
164167
"prop-types": "^15.7.2",
165168
"react": "^17.0.2",
166-
"react-confirm-alert": "^2.5.0",
167169
"react-cool-inview": "^2.0.8",
168-
"react-day-picker": "^7.4.0",
170+
"react-day-picker": "^7.4.10",
169171
"react-dom": "^17.0.2",
170172
"react-focus-lock": "^2.6.0",
173+
"react-query": "^3.34.12",
171174
"react-redux": "^6.0.1",
172175
"react-router-dom": "^6.0.2",
173176
"react-select": "^2.4.1",
177+
"react-simple-timefield": "^3.2.5",
174178
"react-tabs": "^3.1.0",
175179
"react-toastify": "^5.5.0",
176180
"redux": "^4.0.5",

render/App.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { ipcRenderer } from "electron";
1010

1111
import { AppView } from './views/AppView';
1212
import LoginView from './views/LoginView';
13-
import Notification from './components/Notification';
13+
import { Notification } from './components/Notification';
1414
import { useOvermindActions } from './store';
1515
import { getStoredToken } from './helpers/utils';
1616
import { LoadingOverlay } from './components/LoadingOverlay';

0 commit comments

Comments
 (0)