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

fix: issue #72 #75

Merged
merged 2 commits into from
Jul 21, 2021
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions src/constants/workPeriods.js
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,11 @@ export const API_REQUIRED_FIELDS = [
"endDate",
"memberRate",
"status",
"billingAccountId",
"workPeriods.id",
"workPeriods.projectId",
"workPeriods.isLastWeek",
"workPeriods.isFirstWeek",
"workPeriods.userHandle",
"workPeriods.startDate",
"workPeriods.endDate",
Expand Down Expand Up @@ -128,6 +131,7 @@ export const API_CHALLENGE_PAYMENT_STATUS_MAP = {
export const URL_QUERY_PARAM_MAP = new Map([
["startDate", "startDate"],
["paymentStatuses", "status"],
["alertOptions", "alert"],
["onlyFailedPayments", "onlyFailed"],
["userHandle", "user"],
["criteria", "by"],
Expand Down
1 change: 1 addition & 0 deletions src/constants/workPeriods/alerts.js
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
export const BA_NOT_ASSIGNED = "BA_NOT_ASSIGNED";
export const ONBOARDING_WEEK = "ONBOARDING_WEEK";
export const LAST_BOOKING_WEEK = "LAST_BOOKING_WEEK";
27 changes: 25 additions & 2 deletions src/routes/WorkPeriods/components/PeriodFilters/index.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,12 @@ import CheckboxList from "components/CheckboxList";
import SearchHandleField from "components/SearchHandleField";
import SidebarSection from "components/SidebarSection";
import Toggle from "components/Toggle";
import { PAYMENT_STATUS } from "constants/workPeriods";
import { PAYMENT_STATUS, ALERT } from "constants/workPeriods";
import { getWorkPeriodsFilters } from "store/selectors/workPeriods";
import {
resetWorkPeriodsFilters,
setWorkPeriodsPaymentStatuses,
setAlertOption,
setWorkPeriodsUserHandle,
toggleShowFailedPaymentsOnly,
} from "store/actions/workPeriods";
Expand All @@ -35,7 +36,7 @@ import styles from "./styles.module.scss";
const PeriodFilters = ({ className }) => {
const dispatch = useDispatch();
const filters = useSelector(getWorkPeriodsFilters);
const { onlyFailedPayments, paymentStatuses, userHandle } = filters;
const { onlyFailedPayments, paymentStatuses, alertOptions, userHandle } = filters;

const onToggleFailedPayments = useCallback(
(on) => {
Expand All @@ -61,6 +62,14 @@ const PeriodFilters = ({ className }) => {
[dispatch]
);

const onAlertOptionsChange = useCallback(
(option) => {
dispatch(setAlertOption(option));
dispatch(updateQueryFromState());
},
[dispatch]
);

const onClearFilter = useCallback(() => {
dispatch(resetWorkPeriodsFilters());
dispatch(updateQueryFromState());
Expand Down Expand Up @@ -113,6 +122,14 @@ const PeriodFilters = ({ className }) => {
onChange={onToggleFailedPayments}
/>
</div>
<SidebarSection label="Alerts">
<CheckboxList
name="alert_option[]"
onChange={onAlertOptionsChange}
options={ALERT_OPTIONS}
value={alertOptions}
/>
</SidebarSection>
<div className={styles.buttons}>
<Button className={styles.button} size="small" onClick={onClearFilter}>
Clear Filter
Expand All @@ -134,4 +151,10 @@ const PAYMENT_STATUS_OPTIONS = [
{ value: PAYMENT_STATUS.NO_DAYS, label: "No Days" },
];

const ALERT_OPTIONS = [
{ value: ALERT.BA_NOT_ASSIGNED, label: "No BA Assigned" },
{ value: ALERT.ONBOARDING_WEEK, label: "Onboarding Week" },
{ value: ALERT.LAST_BOOKING_WEEK, label: "Last Booking Week" },
];

export default memo(PeriodFilters);
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
justify-content: space-between;
align-items: center;
margin-top: 6px;
margin-bottom: 6px;
}

.buttons {
Expand Down
1 change: 1 addition & 0 deletions src/store/actionTypes/workPeriods.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ export const WP_SET_PAGE_SIZE = "WP_SET_PAGE_SIZE";
export const WP_SET_DATE_RANGE = "WP_SET_DATE_RANGE";
export const WP_SET_PAYMENT_DATA = "WP_SET_PAYMENT_DATA";
export const WP_SET_PAYMENT_STATUSES = "WP_SET_PAYMENT_STATUSES";
export const WP_SET_ALERT_OPTION = "WP_SET_ALERT_OPTION";
export const WP_SET_PERIOD_DATA_PENDING = "WP_SET_PERIOD_DATA_PENDING";
export const WP_SET_PERIOD_DATA_SUCCESS = "WP_SET_PERIOD_DATA_SUCCESS";
export const WP_SET_PERIOD_DATA_ERROR = "WP_SET_PERIOD_DATA_ERROR";
Expand Down
11 changes: 11 additions & 0 deletions src/store/actions/workPeriods.js
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,17 @@ export const setWorkPeriodsPaymentStatuses = (paymentStatuses) => ({
payload: paymentStatuses,
});

/**
* Creates an action denoting the changing of alert option
*
* @param {Object} paymentStatuses object with working periods' payment statuses
* @returns {Object}
*/
export const setAlertOption = (option) => ({
type: ACTION_TYPE.WP_SET_ALERT_OPTION,
payload: option,
});

/**
* Creates an action denoting the changing of working periods' topcoder handle.
*
Expand Down
40 changes: 40 additions & 0 deletions src/store/reducers/workPeriods.js
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ const initFilters = () => ({
dateRange: getWeekByDate(moment()),
onlyFailedPayments: false,
paymentStatuses: {}, // all disabled by default
alertOptions: {},
userHandle: "",
});

Expand Down Expand Up @@ -556,6 +557,17 @@ const actionHandlers = {
pageNumber: 1,
},
}),
[ACTION_TYPE.WP_SET_ALERT_OPTION]: (state, alertOptions) => ({
...state,
filters: {
...state.filters,
alertOptions: updateOptionMap(state.filters.alertOptions, alertOptions),
},
pagination: {
...state.pagination,
pageNumber: 1,
},
}),
[ACTION_TYPE.WP_SET_USER_HANDLE]: (state, userHandle) => {
if (userHandle === state.filters.userHandle) {
return state;
Expand Down Expand Up @@ -944,6 +956,34 @@ function updateStateFromQuery(queryStr, state) {
filters.paymentStatuses = queryPaymentStatuses;
updateFilters = true;
}

// checking alert option
let hasSameOption = true;
const filtersAlertOptions = filters.alertOptions;
const queryAlertOptions = {};
const alertOptionsStr = params.alertOptions;
if (alertOptionsStr) {
for (let option of alertOptionsStr.split(",")) {
option = option.toUpperCase();
if (option in ALERT) {
queryAlertOptions[option] = true;
if (!filtersAlertOptions[option]) {
hasSameOption = false;
}
}
}
}
for (let option in filtersAlertOptions) {
if (!filtersAlertOptions[option]) {
hasSameOption = false;
break;
}
}
if (!hasSameOption) {
filters.alertOptions = queryAlertOptions;
updateFilters = true;
}

// chacking only failed payments flag
const onlyFailedFlag = params.onlyFailedPayments?.slice(0, 1);
const onlyFailedPayments = onlyFailedFlag === "y";
Expand Down
3 changes: 3 additions & 0 deletions src/store/thunks/workPeriods.js
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,9 @@ export const loadWorkPeriodsPage = async (dispatch, getState) => {
["workPeriods.userHandle"]: userHandle,
["workPeriods.startDate"]: startDate.format(DATE_FORMAT_API),
["workPeriods.paymentStatus"]: paymentStatuses,
["billingAccountId"]: filters.alertOptions.BA_NOT_ASSIGNED ? 0: null,
["workPeriods.isFirstWeek"]: filters.alertOptions.ONBOARDING_WEEK ? true : null,
["workPeriods.isLastWeek"]: filters.alertOptions.LAST_BOOKING_WEEK ? true : null,
["workPeriods.payments.status"]: onlyFailedPayments
? API_CHALLENGE_PAYMENT_STATUS.FAILED
: null,
Expand Down
10 changes: 8 additions & 2 deletions src/utils/workPeriods.js
Original file line number Diff line number Diff line change
Expand Up @@ -111,13 +111,19 @@ export function removeValueImmutable(items, value) {
*/
export function makeUrlQuery(state) {
const { filters, pagination, sorting } = state;
const { dateRange, onlyFailedPayments, paymentStatuses, userHandle } =
filters;
const {
dateRange,
onlyFailedPayments,
paymentStatuses,
alertOptions,
userHandle,
} = filters;
const { pageNumber, pageSize } = pagination;
const { criteria, order } = sorting;
const params = {
startDate: dateRange[0].format(DATE_FORMAT_API),
paymentStatuses: Object.keys(paymentStatuses).join(",").toLowerCase(),
alertOptions: Object.keys(alertOptions).join(",").toLowerCase(),
onlyFailedPayments: onlyFailedPayments ? "y" : "",
userHandle: encodeURIComponent(userHandle),
criteria: criteria.toLowerCase(),
Expand Down