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

Commit cf03d81

Browse files
committed
Added filtering by failed payments.
1 parent 53c8093 commit cf03d81

File tree

9 files changed

+77
-12
lines changed

9 files changed

+77
-12
lines changed

src/components/Popup/styles.module.scss

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
@import "styles/variables";
22

33
.container {
4-
z-index: 1;
4+
z-index: 10;
55
border-radius: 8px;
66
padding: $popover-padding;
77
background: #fff;

src/constants/workPeriods.js

+1
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ export const API_CHALLENGE_PAYMENT_STATUS_MAP = {
120120
export const URL_QUERY_PARAM_MAP = new Map([
121121
["startDate", "startDate"],
122122
["paymentStatuses", "status"],
123+
["onlyFailedPayments", "onlyFailed"],
123124
["userHandle", "user"],
124125
["criteria", "by"],
125126
["order", "order"],

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

+23-3
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,18 @@ import { useDispatch, useSelector } from "react-redux";
33
import debounce from "lodash/debounce";
44
import PT from "prop-types";
55
import cn from "classnames";
6-
import SidebarSection from "components/SidebarSection";
76
import Button from "components/Button";
8-
import SearchHandleField from "components/SearchHandleField";
97
import CheckboxList from "components/CheckboxList";
8+
import SearchHandleField from "components/SearchHandleField";
9+
import SidebarSection from "components/SidebarSection";
10+
import Toggle from "components/Toggle";
1011
import { PAYMENT_STATUS } from "constants/workPeriods";
1112
import { getWorkPeriodsFilters } from "store/selectors/workPeriods";
1213
import {
1314
resetWorkPeriodsFilters,
1415
setWorkPeriodsPaymentStatuses,
1516
setWorkPeriodsUserHandle,
17+
toggleShowFailedPaymentsOnly,
1618
} from "store/actions/workPeriods";
1719
import {
1820
loadWorkPeriodsPage,
@@ -33,7 +35,15 @@ import styles from "./styles.module.scss";
3335
const PeriodFilters = ({ className }) => {
3436
const dispatch = useDispatch();
3537
const filters = useSelector(getWorkPeriodsFilters);
36-
const { paymentStatuses, userHandle } = filters;
38+
const { onlyFailedPayments, paymentStatuses, userHandle } = filters;
39+
40+
const onToggleFailedPayments = useCallback(
41+
(on) => {
42+
dispatch(toggleShowFailedPaymentsOnly(on));
43+
dispatch(updateQueryFromState());
44+
},
45+
[dispatch]
46+
);
3747

3848
const onUserHandleChange = useCallback(
3949
(value) => {
@@ -93,6 +103,16 @@ const PeriodFilters = ({ className }) => {
93103
value={paymentStatuses}
94104
/>
95105
</SidebarSection>
106+
<div className={styles.onlyFailedPayments}>
107+
<label htmlFor="only-failed-payments">With Failed Payments</label>
108+
<Toggle
109+
id="only-failed-payments"
110+
name="tgl_only_failed_payments"
111+
size="small"
112+
isOn={onlyFailedPayments}
113+
onChange={onToggleFailedPayments}
114+
/>
115+
</div>
96116
<div className={styles.buttons}>
97117
<Button className={styles.button} size="small" onClick={onClearFilter}>
98118
Clear Filter

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

+7
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,13 @@
44
margin: 0 0 26px;
55
}
66

7+
.onlyFailedPayments {
8+
display: flex;
9+
justify-content: space-between;
10+
align-items: center;
11+
margin-top: 6px;
12+
}
13+
714
.buttons {
815
display: flex;
916
justify-content: space-between;

src/store/actionTypes/workPeriods.js

+1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ export const WP_SET_SORT_ORDER = "WP_SET_SORT_ORDER";
2929
export const WP_SET_SORTING = "WP_SET_SORTING";
3030
export const WP_SET_USER_HANDLE = "WP_SET_USER_HANDLE";
3131
export const WP_SET_WORKING_DAYS = "WP_SET_WORKING_DAYS";
32+
export const WP_TOGGLE_ONLY_FAILED_PAYMENTS = "WP_TOGGLE_ONLY_FAILED_PAYMENTS";
3233
export const WP_TOGGLE_PERIOD = "WP_TOGGLE_PERIOD";
3334
export const WP_TOGGLE_PERIODS_ALL = "WP_TOGGLE_PERIODS_ALL";
3435
export const WP_TOGGLE_PERIODS_VISIBLE = "WP_TOGGLE_PERIODS_VISIBLE";

src/store/actions/workPeriods.js

+5
Original file line numberDiff line numberDiff line change
@@ -339,6 +339,11 @@ export const setWorkPeriodDataError = (periodId, message) => ({
339339
payload: { periodId, message },
340340
});
341341

342+
export const toggleShowFailedPaymentsOnly = (on = null) => ({
343+
type: ACTION_TYPE.WP_TOGGLE_ONLY_FAILED_PAYMENTS,
344+
payload: on,
345+
});
346+
342347
/**
343348
* Creates an action to toggle certain working period by its id.
344349
*

src/store/reducers/workPeriods.js

+27-4
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ const initPagination = () => ({
3333

3434
const initFilters = () => ({
3535
dateRange: getWeekByDate(moment()),
36+
onlyFailedPayments: false,
3637
paymentStatuses: {}, // all disabled by default
3738
userHandle: "",
3839
});
@@ -597,6 +598,20 @@ const actionHandlers = {
597598
periodsData: [periodsData],
598599
};
599600
},
601+
[ACTION_TYPE.WP_TOGGLE_ONLY_FAILED_PAYMENTS]: (state, on) => {
602+
const filters = state.filters;
603+
on = on === null ? !filters.onlyFailedPayments : on;
604+
if (on === filters.onlyFailedPayments) {
605+
return state;
606+
}
607+
return {
608+
...state,
609+
filters: {
610+
...filters,
611+
onlyFailedPayments: on,
612+
},
613+
};
614+
},
600615
[ACTION_TYPE.WP_TOGGLE_PERIOD]: (state, periodId) => {
601616
let isSelectedPeriodsAll = state.isSelectedPeriodsAll;
602617
let isSelectedPeriodsVisible = state.isSelectedPeriodsVisible;
@@ -697,13 +712,14 @@ function updateStateFromQuery(queryStr, state) {
697712
let updatePagination = false;
698713
let updateSorting = false;
699714
const { filters, pagination, sorting } = state;
700-
// checking payment statuses
701715
const { dateRange } = filters;
716+
// checking start date
702717
let range = getWeekByDate(moment(params.startDate));
703718
if (!range[0].isSame(dateRange[0])) {
704719
filters.dateRange = range;
705720
updateFilters = true;
706721
}
722+
// checking payment statuses
707723
let hasSameStatuses = true;
708724
const filtersPaymentStatuses = filters.paymentStatuses;
709725
const queryPaymentStatuses = {};
@@ -729,10 +745,17 @@ function updateStateFromQuery(queryStr, state) {
729745
filters.paymentStatuses = queryPaymentStatuses;
730746
updateFilters = true;
731747
}
748+
// chacking only failed payments flag
749+
const onlyFailedFlag = params.onlyFailedPayments?.slice(0, 1);
750+
const onlyFailedPayments = onlyFailedFlag === "y";
751+
if (onlyFailedPayments !== filters.onlyFailedPayments) {
752+
filters.onlyFailedPayments = onlyFailedPayments;
753+
updateFilters = true;
754+
}
732755
// checking user handle
733-
params.userHandle = params.userHandle || "";
734-
if (params.userHandle !== filters.userHandle) {
735-
filters.userHandle = params.userHandle.slice(0, 256);
756+
const userHandle = params.userHandle?.slice(0, 256) || "";
757+
if (userHandle !== filters.userHandle) {
758+
filters.userHandle = userHandle;
736759
updateFilters = true;
737760
}
738761
// checking sorting criteria

src/store/thunks/workPeriods.js

+9-3
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
PAYMENT_STATUS_MAP,
1111
API_FIELDS_QUERY,
1212
JOB_NAME_NONE,
13+
API_CHALLENGE_PAYMENT_STATUS,
1314
} from "constants/workPeriods";
1415
import {
1516
extractJobName,
@@ -54,6 +55,7 @@ export const loadWorkPeriodsPage = async (dispatch, getState) => {
5455
const sortOrder = sorting.order;
5556
const sortBy = SORT_BY_MAP[sorting.criteria] || API_SORT_BY.USER_HANDLE;
5657

58+
const { onlyFailedPayments, userHandle } = filters;
5759
const [startDate] = filters.dateRange;
5860
const paymentStatuses = replaceItems(
5961
Object.keys(filters.paymentStatuses),
@@ -62,18 +64,22 @@ export const loadWorkPeriodsPage = async (dispatch, getState) => {
6264

6365
// For parameter description see:
6466
// https://topcoder-platform.github.io/taas-apis/#/ResourceBookings/get_resourceBookings
65-
const [promise, cancelSource] = services.fetchResourceBookings({
67+
const params = {
6668
fields: API_FIELDS_QUERY,
6769
page: pagination.pageNumber,
6870
perPage: pagination.pageSize,
6971
sortBy,
7072
sortOrder,
7173
// we only want to show Resource Bookings with status "placed"
7274
status: RESOURCE_BOOKING_STATUS.PLACED,
73-
["workPeriods.userHandle"]: filters.userHandle,
75+
["workPeriods.userHandle"]: userHandle,
7476
["workPeriods.startDate"]: startDate.format(DATE_FORMAT_API),
7577
["workPeriods.paymentStatus"]: paymentStatuses,
76-
});
78+
};
79+
if (onlyFailedPayments) {
80+
params["workPeriods.payments.status"] = API_CHALLENGE_PAYMENT_STATUS.FAILED;
81+
}
82+
const [promise, cancelSource] = services.fetchResourceBookings(params);
7783
dispatch(actions.loadWorkPeriodsPagePending(cancelSource));
7884
let totalCount, periods, pageCount;
7985
try {

src/utils/workPeriods.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,14 @@ import {
1616
*/
1717
export function makeUrlQuery(state) {
1818
const { filters, pagination, sorting } = state;
19-
const { dateRange, paymentStatuses, userHandle } = filters;
19+
const { dateRange, onlyFailedPayments, paymentStatuses, userHandle } =
20+
filters;
2021
const { pageNumber, pageSize } = pagination;
2122
const { criteria, order } = sorting;
2223
const params = {
2324
startDate: dateRange[0].format(DATE_FORMAT_API),
2425
paymentStatuses: Object.keys(paymentStatuses).join(",").toLowerCase(),
26+
onlyFailedPayments: onlyFailedPayments ? "y" : "",
2527
userHandle: encodeURIComponent(userHandle),
2628
criteria: criteria.toLowerCase(),
2729
order,

0 commit comments

Comments
 (0)