Skip to content
This repository was archived by the owner on Mar 13, 2025. It is now read-only.

Commit 6c50177

Browse files
authored
Merge pull request #75 from yoution/issue-72
fix: issue #72
2 parents 3e89773 + 32d5814 commit 6c50177

File tree

11 files changed

+95
-9
lines changed

11 files changed

+95
-9
lines changed

src/constants/workPeriods.js

+2
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ export const API_REQUIRED_FIELDS = [
4242
"endDate",
4343
"memberRate",
4444
"status",
45+
"billingAccountId",
4546
"workPeriods.id",
4647
"workPeriods.projectId",
4748
"workPeriods.userHandle",
@@ -128,6 +129,7 @@ export const API_CHALLENGE_PAYMENT_STATUS_MAP = {
128129
export const URL_QUERY_PARAM_MAP = new Map([
129130
["startDate", "startDate"],
130131
["paymentStatuses", "status"],
132+
["alertOptions", "alert"],
131133
["onlyFailedPayments", "onlyFailed"],
132134
["userHandle", "user"],
133135
["criteria", "by"],

src/constants/workPeriods/alerts.js

+1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
export const BA_NOT_ASSIGNED = "BA_NOT_ASSIGNED";
2+
export const ONBOARDING_WEEK = "ONBOARDING_WEEK";
23
export const LAST_BOOKING_WEEK = "LAST_BOOKING_WEEK";

src/routes/WorkPeriods/components/PeriodFilters/index.jsx

+25-2
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,12 @@ import CheckboxList from "components/CheckboxList";
88
import SearchHandleField from "components/SearchHandleField";
99
import SidebarSection from "components/SidebarSection";
1010
import Toggle from "components/Toggle";
11-
import { PAYMENT_STATUS } from "constants/workPeriods";
11+
import { PAYMENT_STATUS, ALERT } from "constants/workPeriods";
1212
import { getWorkPeriodsFilters } from "store/selectors/workPeriods";
1313
import {
1414
resetWorkPeriodsFilters,
1515
setWorkPeriodsPaymentStatuses,
16+
setAlertOption,
1617
setWorkPeriodsUserHandle,
1718
toggleShowFailedPaymentsOnly,
1819
} from "store/actions/workPeriods";
@@ -35,7 +36,7 @@ import styles from "./styles.module.scss";
3536
const PeriodFilters = ({ className }) => {
3637
const dispatch = useDispatch();
3738
const filters = useSelector(getWorkPeriodsFilters);
38-
const { onlyFailedPayments, paymentStatuses, userHandle } = filters;
39+
const { onlyFailedPayments, paymentStatuses, alertOptions, userHandle } = filters;
3940

4041
const onToggleFailedPayments = useCallback(
4142
(on) => {
@@ -61,6 +62,14 @@ const PeriodFilters = ({ className }) => {
6162
[dispatch]
6263
);
6364

65+
const onAlertOptionsChange = useCallback(
66+
(option) => {
67+
dispatch(setAlertOption(option));
68+
dispatch(updateQueryFromState());
69+
},
70+
[dispatch]
71+
);
72+
6473
const onClearFilter = useCallback(() => {
6574
dispatch(resetWorkPeriodsFilters());
6675
dispatch(updateQueryFromState());
@@ -113,6 +122,14 @@ const PeriodFilters = ({ className }) => {
113122
onChange={onToggleFailedPayments}
114123
/>
115124
</div>
125+
<SidebarSection label="Alerts">
126+
<CheckboxList
127+
name="alert_option[]"
128+
onChange={onAlertOptionsChange}
129+
options={ALERT_OPTIONS}
130+
value={alertOptions}
131+
/>
132+
</SidebarSection>
116133
<div className={styles.buttons}>
117134
<Button className={styles.button} size="small" onClick={onClearFilter}>
118135
Clear Filter
@@ -134,4 +151,10 @@ const PAYMENT_STATUS_OPTIONS = [
134151
{ value: PAYMENT_STATUS.NO_DAYS, label: "No Days" },
135152
];
136153

154+
const ALERT_OPTIONS = [
155+
{ value: ALERT.BA_NOT_ASSIGNED, label: "No BA Assigned" },
156+
{ value: ALERT.ONBOARDING_WEEK, label: "Onboarding Week" },
157+
{ value: ALERT.LAST_BOOKING_WEEK, label: "Last Booking Week" },
158+
];
159+
137160
export default memo(PeriodFilters);

src/routes/WorkPeriods/components/PeriodFilters/styles.module.scss

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
justify-content: space-between;
1010
align-items: center;
1111
margin-top: 6px;
12+
margin-bottom: 6px;
1213
}
1314

1415
.buttons {

src/services/workPeriods.js

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import axios, { CancelToken } from "./axios";
22
import {
33
API_CHALLENGE_PAYMENT_STATUS,
4-
API_QUERY_PARAM_NAMES,
54
JOBS_API_URL,
65
PAYMENTS_API_URL,
76
PROJECTS_API_URL,
@@ -101,7 +100,7 @@ export const fetchResourceBookings = (params) => {
101100
const source = CancelToken.source();
102101
return [
103102
axios.get(
104-
`${RB_API_URL}?${buildRequestQuery(params, API_QUERY_PARAM_NAMES)}`,
103+
`${RB_API_URL}?${buildRequestQuery(params)}`,
105104
{ cancelToken: source.token }
106105
),
107106
source,

src/store/actionTypes/workPeriods.js

+1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ export const WP_SET_PAGE_SIZE = "WP_SET_PAGE_SIZE";
2020
export const WP_SET_DATE_RANGE = "WP_SET_DATE_RANGE";
2121
export const WP_SET_PAYMENT_DATA = "WP_SET_PAYMENT_DATA";
2222
export const WP_SET_PAYMENT_STATUSES = "WP_SET_PAYMENT_STATUSES";
23+
export const WP_SET_ALERT_OPTION = "WP_SET_ALERT_OPTION";
2324
export const WP_SET_PERIOD_DATA_PENDING = "WP_SET_PERIOD_DATA_PENDING";
2425
export const WP_SET_PERIOD_DATA_SUCCESS = "WP_SET_PERIOD_DATA_SUCCESS";
2526
export const WP_SET_PERIOD_DATA_ERROR = "WP_SET_PERIOD_DATA_ERROR";

src/store/actions/workPeriods.js

+11
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,17 @@ export const setWorkPeriodsPaymentStatuses = (paymentStatuses) => ({
265265
payload: paymentStatuses,
266266
});
267267

268+
/**
269+
* Creates an action denoting the changing of alert option
270+
*
271+
* @param {Object} paymentStatuses object with working periods' payment statuses
272+
* @returns {Object}
273+
*/
274+
export const setAlertOption = (option) => ({
275+
type: ACTION_TYPE.WP_SET_ALERT_OPTION,
276+
payload: option,
277+
});
278+
268279
/**
269280
* Creates an action denoting the changing of working periods' topcoder handle.
270281
*

src/store/reducers/workPeriods.js

+40
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ const initFilters = () => ({
4242
dateRange: getWeekByDate(moment()),
4343
onlyFailedPayments: false,
4444
paymentStatuses: {}, // all disabled by default
45+
alertOptions: {},
4546
userHandle: "",
4647
});
4748

@@ -556,6 +557,17 @@ const actionHandlers = {
556557
pageNumber: 1,
557558
},
558559
}),
560+
[ACTION_TYPE.WP_SET_ALERT_OPTION]: (state, alertOptions) => ({
561+
...state,
562+
filters: {
563+
...state.filters,
564+
alertOptions: updateOptionMap(state.filters.alertOptions, alertOptions),
565+
},
566+
pagination: {
567+
...state.pagination,
568+
pageNumber: 1,
569+
},
570+
}),
559571
[ACTION_TYPE.WP_SET_USER_HANDLE]: (state, userHandle) => {
560572
if (userHandle === state.filters.userHandle) {
561573
return state;
@@ -944,6 +956,34 @@ function updateStateFromQuery(queryStr, state) {
944956
filters.paymentStatuses = queryPaymentStatuses;
945957
updateFilters = true;
946958
}
959+
960+
// checking alert option
961+
let hasSameOption = true;
962+
const filtersAlertOptions = filters.alertOptions;
963+
const queryAlertOptions = {};
964+
const alertOptionsStr = params.alertOptions;
965+
if (alertOptionsStr) {
966+
for (let option of alertOptionsStr.split(",")) {
967+
option = option.toUpperCase();
968+
if (option in ALERT) {
969+
queryAlertOptions[option] = true;
970+
if (!filtersAlertOptions[option]) {
971+
hasSameOption = false;
972+
}
973+
}
974+
}
975+
}
976+
for (let option in filtersAlertOptions) {
977+
if (!filtersAlertOptions[option]) {
978+
hasSameOption = false;
979+
break;
980+
}
981+
}
982+
if (!hasSameOption) {
983+
filters.alertOptions = queryAlertOptions;
984+
updateFilters = true;
985+
}
986+
947987
// chacking only failed payments flag
948988
const onlyFailedFlag = params.onlyFailedPayments?.slice(0, 1);
949989
const onlyFailedPayments = onlyFailedFlag === "y";

src/store/thunks/workPeriods.js

+3
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,9 @@ export const loadWorkPeriodsPage = async (dispatch, getState) => {
113113
["workPeriods.userHandle"]: userHandle,
114114
["workPeriods.startDate"]: startDate.format(DATE_FORMAT_API),
115115
["workPeriods.paymentStatus"]: paymentStatuses,
116+
["billingAccountId"]: filters.alertOptions.BA_NOT_ASSIGNED ? 0: null,
117+
["workPeriods.isFirstWeek"]: filters.alertOptions.ONBOARDING_WEEK ? true : null,
118+
["workPeriods.isLastWeek"]: filters.alertOptions.LAST_BOOKING_WEEK ? true : null,
116119
["workPeriods.payments.status"]: onlyFailedPayments
117120
? API_CHALLENGE_PAYMENT_STATUS.FAILED
118121
: null,

src/utils/misc.js

+2-3
Original file line numberDiff line numberDiff line change
@@ -116,12 +116,11 @@ export function updateOptionMap(oldOptions, newOptions) {
116116
* that are not numbers and are falsy are ignored.
117117
*
118118
* @param {Object} params query parameters object
119-
* @param {string[]} paramNames array of valid query parameter names
120119
* @returns {string} query string
121120
*/
122-
export const buildRequestQuery = (params, paramNames) => {
121+
export const buildRequestQuery = (params) => {
123122
const queryParams = [];
124-
for (const paramName of paramNames) {
123+
for (const paramName in params) {
125124
const paramValue = params[paramName];
126125
if (
127126
!(paramName in params) ||

src/utils/workPeriods.js

+8-2
Original file line numberDiff line numberDiff line change
@@ -117,13 +117,19 @@ export function removeValueImmutable(items, value) {
117117
*/
118118
export function makeUrlQuery(state) {
119119
const { filters, pagination, sorting } = state;
120-
const { dateRange, onlyFailedPayments, paymentStatuses, userHandle } =
121-
filters;
120+
const {
121+
dateRange,
122+
onlyFailedPayments,
123+
paymentStatuses,
124+
alertOptions,
125+
userHandle,
126+
} = filters;
122127
const { pageNumber, pageSize } = pagination;
123128
const { criteria, order } = sorting;
124129
const params = {
125130
startDate: dateRange[0].format(DATE_FORMAT_API),
126131
paymentStatuses: Object.keys(paymentStatuses).join(",").toLowerCase(),
132+
alertOptions: Object.keys(alertOptions).join(",").toLowerCase(),
127133
onlyFailedPayments: onlyFailedPayments ? "y" : "",
128134
userHandle: encodeURIComponent(userHandle),
129135
criteria: criteria.toLowerCase(),

0 commit comments

Comments
 (0)