@@ -74,11 +72,9 @@ exports[`Matches shallow shapshot 2 shapshot 2 1`] = `
id="challengeFilterContainer"
>
@@ -134,7 +123,7 @@ exports[`Matches shallow shapshot 2 shapshot 2 1`] = `
top={20}
>
diff --git a/__tests__/shared/containers/challenge-listing/FilterPanel.jsx b/__tests__/shared/containers/challenge-listing/FilterPanel.jsx
index 2abd66ddf0..399355d7a7 100644
--- a/__tests__/shared/containers/challenge-listing/FilterPanel.jsx
+++ b/__tests__/shared/containers/challenge-listing/FilterPanel.jsx
@@ -1,10 +1,13 @@
-import { shallow, mount } from 'enzyme';
+// import { shallow, mount } from 'enzyme';
+import { shallow } from 'enzyme';
import React from 'react';
import configureStore from 'redux-mock-store';
-import Select from 'components/Select';
-import cActions from 'actions/challenge-listing';
-import sActions from 'actions/challenge-listing/sidebar';
-import ConnectedFilterPanel, { Container as FilterPanel } from 'containers/challenge-listing/FilterPanel';
+// import Select from 'components/Select';
+// import cActions from 'actions/challenge-listing';
+// import sActions from 'actions/challenge-listing/sidebar';
+// import ConnectedFilterPanel, { Container as FilterPanel }
+// from 'containers/challenge-listing/FilterPanel';
+import ConnectedFilterPanel from 'containers/challenge-listing/FilterPanel';
describe('shallow render connnected component', () => {
const initialState = {
@@ -15,8 +18,8 @@ describe('shallow render connnected component', () => {
trackModalShown: false,
},
sidebar: {
- activeBucket: 'ALL',
- savedFilters: [],
+ activeBucket: 'all',
+ // savedFilters: [],
},
communityFilters: [],
filter: {},
@@ -57,207 +60,206 @@ describe('shallow render connnected component', () => {
expect(instance).toBeDefined();
});
});
+// describe('full render pure component', () => {
+// const initialProps = {
+// expanded: false,
+// searchText: '',
+// trackModalShown: false,
+// activeBucket: 'all',
+// communityFilters: [],
+// filterState: {},
+// getAvailableFilterName: jest.fn(),
+// loadingKeywords: false,
+// loadingTypes: false,
+// validKeywords: [],
+// validTypes: [],
+// selectedCommunityId: '1',
+// tokenV2: 'tokenV2',
+// getTypes: jest.fn(),
+// getKeywords: jest.fn(),
+// saveFilter: jest.fn(),
+// selectBucket: jest.fn(),
+// selectCommunity: jest.fn(),
+// setFilterState: jest.fn(),
+// setExpanded: jest.fn(),
+// setSearchText: jest.fn(),
+// showTrackModal: jest.fn(),
+// setQuery: jest.fn(),
+// onSwitch: jest.fn(),
+// tcCommunities: {
+// list: {
+// data: [
+// {
+// communityId: '',
+// communityName: 'name',
+// },
+// {
+// communityId: '',
+// communityName: 'name',
+// },
+// ],
+// },
+// },
+// };
-describe('full render pure component', () => {
- const initialProps = {
- expanded: false,
- searchText: '',
- trackModalShown: false,
- activeBucket: 'ALL',
- communityFilters: [],
- filterState: {},
- getAvailableFilterName: jest.fn(),
- loadingKeywords: false,
- loadingTypes: false,
- validKeywords: [],
- validTypes: [],
- selectedCommunityId: '1',
- tokenV2: 'tokenV2',
- getTypes: jest.fn(),
- getKeywords: jest.fn(),
- saveFilter: jest.fn(),
- selectBucket: jest.fn(),
- selectCommunity: jest.fn(),
- setFilterState: jest.fn(),
- setExpanded: jest.fn(),
- setSearchText: jest.fn(),
- showTrackModal: jest.fn(),
- setQuery: jest.fn(),
- onSwitch: jest.fn(),
- tcCommunities: {
- list: {
- data: [
- {
- communityId: '',
- communityName: 'name',
- },
- {
- communityId: '',
- communityName: 'name',
- },
- ],
- },
- },
- };
+// let instance;
- let instance;
+// beforeEach(() => {
+// instance = mount(
);
+// jest.resetAllMocks();
+// });
- beforeEach(() => {
- instance = mount(
);
- jest.resetAllMocks();
- });
+// test('load data if not loading', () => {
+// instance = mount(
);
+// expect(initialProps.getTypes).toHaveBeenCalledTimes(1);
+// expect(initialProps.getKeywords).toHaveBeenCalledTimes(1);
+// });
- test('load data if not loading', () => {
- instance = mount(
);
- expect(initialProps.getTypes).toHaveBeenCalledTimes(1);
- expect(initialProps.getKeywords).toHaveBeenCalledTimes(1);
- });
+// test('do not load data if loading', () => {
+// instance = mount(
);
- test('do not load data if loading', () => {
- instance = mount(
);
+// expect(initialProps.getTypes).toHaveBeenCalledTimes(0);
+// expect(initialProps.getKeywords).toHaveBeenCalledTimes(0);
+// });
- expect(initialProps.getTypes).toHaveBeenCalledTimes(0);
- expect(initialProps.getKeywords).toHaveBeenCalledTimes(0);
- });
+// test.skip('saveFilter', () => {
+// const button = instance.find('button.tc-blue-btn');
+// expect(initialProps.saveFilter).toHaveBeenCalledTimes(0);
+// button.simulate('click');
+// expect(initialProps.saveFilter).toHaveBeenCalledTimes(0);
+// });
- test.skip('saveFilter', () => {
- const button = instance.find('button.tc-blue-btn');
- expect(initialProps.saveFilter).toHaveBeenCalledTimes(0);
- button.simulate('click');
- expect(initialProps.saveFilter).toHaveBeenCalledTimes(0);
- });
+// test('setFilterState and selectBucket', () => {
+// const select = instance.find(Select)
+// .filterWhere(wrapper => wrapper.prop('id') === 'keyword-select');
+// expect(select).toHaveLength(1);
+// expect(initialProps.setFilterState).toHaveBeenCalledTimes(0);
+// select.prop('onChange')('1');
+// expect(initialProps.setFilterState).toHaveBeenCalledTimes(1);
+// });
+// test('selectBucket', () => {
+// instance = mount(
);
- test('setFilterState and selectBucket', () => {
- const select = instance.find(Select)
- .filterWhere(wrapper => wrapper.prop('id') === 'keyword-select');
- expect(select).toHaveLength(1);
- expect(initialProps.setFilterState).toHaveBeenCalledTimes(0);
- select.prop('onChange')('1');
- expect(initialProps.setFilterState).toHaveBeenCalledTimes(1);
- });
- test('selectBucket', () => {
- instance = mount(
);
+// const select = instance.find(Select)
+// .filterWhere(wrapper => wrapper.prop('id') === 'keyword-select');
+// expect(select).toHaveLength(1);
+// expect(initialProps.selectBucket).toHaveBeenCalledTimes(0);
+// select.prop('onChange')('1');
+// expect(initialProps.selectBucket).toHaveBeenCalledTimes(1);
+// });
+// });
- const select = instance.find(Select)
- .filterWhere(wrapper => wrapper.prop('id') === 'keyword-select');
- expect(select).toHaveLength(1);
- expect(initialProps.selectBucket).toHaveBeenCalledTimes(0);
- select.prop('onChange')('1');
- expect(initialProps.selectBucket).toHaveBeenCalledTimes(1);
- });
-});
+// describe('full render connnected component and dispatch actions', () => {
+// let originalFetch;
-describe('full render connnected component and dispatch actions', () => {
- let originalFetch;
+// beforeAll(() => {
+// originalFetch = global.fetch;
+// });
- beforeAll(() => {
- originalFetch = global.fetch;
- });
+// afterAll(() => {
+// global.fetch = originalFetch;
+// });
- afterAll(() => {
- global.fetch = originalFetch;
- });
+// const initialState = {
+// challengeListing: {
+// filterPanel: {
+// expanded: false,
+// searchText: '',
+// trackModalShown: false,
+// },
+// sidebar: {
+// activeBucket: 'all',
+// // savedFilters: [{ name: 'My Filter' }],
+// },
+// communityFilters: [],
+// filter: {},
+// loadingChallengeTags: true,
+// loadingChallengeTypes: true,
+// challengeTags: [],
+// challengeTypes: [],
+// selectedCommunityId: '1',
+// },
+// auth: {
+// tokenV2: 'tokenV2',
+// },
+// tcCommunities: {
+// list: {
+// data: [
+// {
+// communityId: '',
+// communityName: 'name',
+// },
+// {
+// communityId: '',
+// communityName: 'name',
+// },
+// ],
+// },
+// },
+// };
+// const mockStore = configureStore();
+// let store;
+// let instance;
+// let filterPanel;
- const initialState = {
- challengeListing: {
- filterPanel: {
- expanded: false,
- searchText: '',
- trackModalShown: false,
- },
- sidebar: {
- activeBucket: 'ALL',
- savedFilters: [{ name: 'My Filter' }],
- },
- communityFilters: [],
- filter: {},
- loadingChallengeTags: true,
- loadingChallengeTypes: true,
- challengeTags: [],
- challengeTypes: [],
- selectedCommunityId: '1',
- },
- auth: {
- tokenV2: 'tokenV2',
- },
- tcCommunities: {
- list: {
- data: [
- {
- communityId: '',
- communityName: 'name',
- },
- {
- communityId: '',
- communityName: 'name',
- },
- ],
- },
- },
- };
- const mockStore = configureStore();
- let store;
- let instance;
- let filterPanel;
-
- beforeEach(() => {
- global.fetch = () => Promise.resolve({
- ok: true,
- json: () => ({ result: { status: 200, metadata: {}, content: [] } }),
- });
- store = mockStore(initialState);
- instance = mount(
);
- filterPanel = instance.find(FilterPanel);
- });
+// beforeEach(() => {
+// global.fetch = () => Promise.resolve({
+// ok: true,
+// json: () => ({ result: { status: 200, metadata: {}, content: [] } }),
+// });
+// store = mockStore(initialState);
+// instance = mount(
);
+// filterPanel = instance.find(FilterPanel);
+// });
- test('getTypes', () => {
- global.fetch = () => Promise.resolve({
- ok: true,
- json: () => ([]),
- });
- filterPanel.prop('getTypes')();
- const actions = store.getActions();
- expect(actions[0].type).toEqual(cActions.challengeListing.getChallengeTypesInit.toString());
- expect(actions[1].type).toEqual(cActions.challengeListing.getChallengeTypesDone.toString());
- });
+// test('getTypes', () => {
+// global.fetch = () => Promise.resolve({
+// ok: true,
+// json: () => ([]),
+// });
+// filterPanel.prop('getTypes')();
+// const actions = store.getActions();
+// expect(actions[0].type).toEqual(cActions.challengeListing.getChallengeTypesInit.toString());
+// expect(actions[1].type).toEqual(cActions.challengeListing.getChallengeTypesDone.toString());
+// });
- test('getKeywords', () => {
- filterPanel.prop('getKeywords')();
- const actions = store.getActions();
- expect(actions[0].type).toEqual(cActions.challengeListing.getChallengeTagsInit.toString());
- expect(actions[1].type).toEqual(cActions.challengeListing.getChallengeTagsDone.toString());
- });
+// test('getKeywords', () => {
+// filterPanel.prop('getKeywords')();
+// const actions = store.getActions();
+// expect(actions[0].type).toEqual(cActions.challengeListing.getChallengeTagsInit.toString());
+// expect(actions[1].type).toEqual(cActions.challengeListing.getChallengeTagsDone.toString());
+// });
- test.skip('saveFilter', () => {
- filterPanel.prop('saveFilter')();
- const actions = store.getActions();
- expect(actions[0].type).toEqual(sActions.challengeListing.sidebar.saveFilterInit.toString());
- });
+// test.skip('saveFilter', () => {
+// filterPanel.prop('saveFilter')();
+// const actions = store.getActions();
+// expect(actions[0].type).toEqual(sActions.challengeListing.sidebar.saveFilterInit.toString());
+// });
- test('selectBucket', () => {
- filterPanel.prop('selectBucket')();
- const actions = store.getActions();
- expect(actions[0].type).toEqual(sActions.challengeListing.sidebar.selectBucket.toString());
- });
+// test('selectBucket', () => {
+// filterPanel.prop('selectBucket')();
+// const actions = store.getActions();
+// expect(actions[0].type).toEqual(sActions.challengeListing.sidebar.selectBucket.toString());
+// });
- test('selectCommunity', () => {
- filterPanel.prop('selectCommunity')();
- const actions = store.getActions();
- expect(actions[0].type).toEqual(cActions.challengeListing.selectCommunity.toString());
- });
+// test('selectCommunity', () => {
+// filterPanel.prop('selectCommunity')();
+// const actions = store.getActions();
+// expect(actions[0].type).toEqual(cActions.challengeListing.selectCommunity.toString());
+// });
- test('setFilterState', () => {
- filterPanel.prop('setFilterState')();
- const actions = store.getActions();
- expect(actions[0].type).toEqual(cActions.challengeListing.setFilter.toString());
- });
-});
+// test('setFilterState', () => {
+// filterPanel.prop('setFilterState')();
+// const actions = store.getActions();
+// expect(actions[0].type).toEqual(cActions.challengeListing.setFilter.toString());
+// });
+// });
diff --git a/__tests__/shared/reducers/challenge-listing/sidebar.js b/__tests__/shared/reducers/challenge-listing/sidebar.js
index 970d241b6a..8c304e5c1a 100644
--- a/__tests__/shared/reducers/challenge-listing/sidebar.js
+++ b/__tests__/shared/reducers/challenge-listing/sidebar.js
@@ -1,222 +1,12 @@
-import { mock } from 'topcoder-react-lib';
-
-const { mockAction } = mock;
-
-jest.mock('utils/url', () => ({
- updateQuery: () => {},
-}));
const defaultReducer = require('reducers/challenge-listing/sidebar').default;
-const mockActions = {
- changeFilterName: (payload, error) => mockAction(
- 'CHALLENGE_LISTING/SIDEBAR/CHANGE_FILTER_NAME',
- payload,
- error,
- ),
- deleteSavedFilter: (payload, error) => mockAction(
- 'CHALLENGE_LISTING/SIDEBAR/DELETE_SAVED_FILTER',
- payload,
- error,
- ),
- dragSavedFilterMove: (payload, error) => mockAction(
- 'CHALLENGE_LISTING/SIDEBAR/DRAG_SAVED_FILTER_MOVE',
- payload,
- error,
- ),
- dragSavedFilterStart: (payload, error) => mockAction(
- 'CHALLENGE_LISTING/SIDEBAR/DRAG_SAVED_FILTER_START',
- payload,
- error,
- ),
- getSavedFilters: (payload, error) => mockAction(
- 'CHALLENGE_LISTING/SIDEBAR/GET_SAVED_FILTERS',
- payload,
- error,
- ),
- resetFilterName: (payload, error) => mockAction(
- 'CHALLENGE_LISTING/SIDEBAR/RESET_FILTER_NAME',
- payload,
- error,
- ),
- saveFilterDone: (payload, error) => mockAction(
- 'CHALLENGE_LISTING/SIDEBAR/SAVE_FILTER_DONE',
- payload,
- error,
- ),
- selectBucket: (payload, error) => mockAction(
- 'CHALLENGE_LISTING/SIDEBAR/SELECT_BUCKET',
- payload,
- error,
- ),
- selectSavedFilter: (payload, error) => mockAction(
- 'CHALLENGE_LISTING/SIDEBAR/SELECT_SAVED_FILTER',
- payload,
- error,
- ),
- setEditSavedFiltersMode: (payload, error) => mockAction(
- 'CHALLENGE_LISTING/SIDEBAR/SET_EDIT_SAVED_FILTERS_MODE',
- payload,
- error,
- ),
- updateSavedFilter: (payload, error) => mockAction(
- 'CHALLENGE_LISTING/SIDEBAR/UPDATE_SAVED_FILTER',
- payload,
- error,
- ),
-};
-
-let expectedState = {
- activeBucket: 'all',
- activeSavedFilter: 0,
- editSavedFiltersMode: false,
- isSavingFilter: false,
- savedFilters: [],
+const expectedState = {
+ activeBucket: 'openForRegistration',
};
function testReducer(reducer) {
- let state;
-
test('creates expected initial state', () => {
- state = reducer(undefined, {});
- expect(state).toEqual(expectedState);
- });
-
- test('properly handles saveFilter', () => {
- state = reducer(state, mockActions.saveFilterDone({ name: 'name', filter: '"filter"' })());
- expectedState = {
- ...expectedState,
- activeBucket: 'saved-filter',
- activeSavedFilter: 0,
- savedFilters: [{ name: 'name', filter: 'filter' }],
- };
- expect(state).toEqual(expectedState);
- });
-
- test('properly handles changeFilterName', () => {
- state = reducer(state, mockActions.changeFilterName({ index: 0, name: 'other' })());
- expectedState = {
- ...expectedState,
- savedFilters: [{
- error: '',
- name: 'other',
- savedName: 'name',
- filter: 'filter',
- }],
- };
- expect(state).toEqual(expectedState);
- });
-
- test('properly handles deleteSavedFilter', () => {
- state = reducer(state, mockActions.deleteSavedFilter('id')());
- expect(state).toEqual(expectedState);
- });
-
- test('properly handles dragSavedFilterStart', () => {
- state = reducer(state, mockActions.dragSavedFilterStart('payload')());
- expectedState = {
- ...expectedState,
- dragState: 'payload',
- };
- expect(state).toEqual(expectedState);
- });
-
- test('properly handles dragSavedFilterMove', () => {
- state = reducer(state, mockActions.dragSavedFilterMove({ currentIndex: -1 })());
- expectedState = {
- ...expectedState,
- dragState: { currentIndex: 0 },
- };
- expect(state).toEqual(expectedState);
-
- state = reducer(state, mockActions.dragSavedFilterMove({ currentIndex: 2 })());
- expect(state).toEqual(expectedState);
-
- state = reducer(state, mockActions.dragSavedFilterMove({ currentIndex: 0 })());
- expect(state).toEqual(expectedState);
- });
-
- test('properly handles getSavedFilters', () => {
- const savedFilters = [{
- name: 'name', filter: 'filter', savedName: 'savedName', id: '1',
- }, { name: 'name2', filter: 'filter2' }];
- state = reducer(state, mockActions.getSavedFilters(savedFilters)());
- expectedState = {
- ...expectedState,
- savedFilters,
- };
- expect(state).toEqual(expectedState);
- });
-
- test('properly handles resetFilterName', () => {
- state = reducer(state, mockActions.resetFilterName(1)());
- expect(state).toEqual(expectedState);
-
- state = reducer(state, mockActions.resetFilterName(0)());
- expectedState = {
- ...expectedState,
- savedFilters: [{
- error: '',
- filter: 'filter',
- name: 'savedName',
- id: '1',
- }, { name: 'name2', filter: 'filter2' }],
- };
- expect(state).toEqual(expectedState);
- });
-
- test('properly handles selectBucket', () => {
- state = reducer(state, mockActions.selectBucket('all')());
- expectedState = {
- ...expectedState,
- activeBucket: 'all',
- isBucketSwitching: true,
- };
- expect(state).toEqual(expectedState);
-
- state = reducer(state, mockActions.selectBucket('saved-filter')());
- expectedState = {
- ...expectedState,
- activeBucket: 'saved-filter',
- isBucketSwitching: true,
- };
- expect(state).toEqual(expectedState);
-
- state = reducer(state, mockActions.selectBucket('upcoming')());
- expectedState = {
- ...expectedState,
- activeBucket: 'upcoming',
- isBucketSwitching: true,
- };
- expect(state).toEqual(expectedState);
- });
-
- test('properly handles selectSavedFilter', () => {
- state = reducer(state, mockActions.selectSavedFilter(1)());
- expectedState = {
- ...expectedState,
- activeBucket: 'saved-filter',
- activeSavedFilter: 1,
- isBucketSwitching: true,
- };
- expect(state).toEqual(expectedState);
- });
-
- test('properly handles setEditSavedFiltersMode', () => {
- state = reducer(state, mockActions.setEditSavedFiltersMode(true)());
- expectedState = {
- ...expectedState,
- editSavedFiltersMode: true,
- };
- expect(state).toEqual(expectedState);
- });
-
- test('properly handles updateSavedFilter', () => {
- state = reducer(state, mockActions.updateSavedFilter({ id: '1', filter: '"another filter"' })());
- expectedState = {
- ...expectedState,
- editSavedFiltersMode: true,
- savedFilters: [{ filter: 'another filter', id: '1' }, { name: 'name2', filter: 'filter2' }],
- };
+ const state = reducer(undefined, {});
expect(state).toEqual(expectedState);
});
}
diff --git a/config/default.js b/config/default.js
index a61cab9f2c..ccf981f212 100644
--- a/config/default.js
+++ b/config/default.js
@@ -412,4 +412,7 @@ module.exports = {
POLICY_PAGES_PATH: '/policy',
GIGS_PAGES_PATH: '/gigs',
START_PAGE_PATH: '/start',
+ GUIKIT: {
+ DEBOUNCE_ON_CHANGE_TIME: 150,
+ },
};
diff --git a/config/jest/default.js b/config/jest/default.js
index bcf9b8d5af..8af45e1d4c 100644
--- a/config/jest/default.js
+++ b/config/jest/default.js
@@ -2,6 +2,7 @@ const config = require('topcoder-react-utils/config/jest/default');
const nodeConfig = require('config');
config.transformIgnorePatterns[0] = '/node_modules/(?!appirio-tech|topcoder|tc-)';
+// config.testMatch[0] = '**/__tests__/shared/containers/challenge-listing/FilterPanel.jsx';
// Include the directories whose tests has been written to minimize coverage time
config.collectCoverageFrom = ['src/client/*.{js,jsx}', 'src/server/*.{js,jsx}', 'src/shared/*.{js,jsx}'];
diff --git a/package-lock.json b/package-lock.json
index 9835410199..7582e19cfd 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1934,6 +1934,11 @@
"lodash.throttle": "^4.0.1"
}
},
+ "append-field": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz",
+ "integrity": "sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY="
+ },
"append-transform": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz",
@@ -2235,12 +2240,9 @@
"integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg=="
},
"attr-accept": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-1.1.3.tgz",
- "integrity": "sha512-iT40nudw8zmCweivz6j58g+RT33I4KbaIvRUhjNmDwO2WmsQUxFEZZYZ5w3vXe5x5MX9D7mfvA/XaLOZYFR9EQ==",
- "requires": {
- "core-js": "^2.5.0"
- }
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.2.tgz",
+ "integrity": "sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg=="
},
"auth0-js": {
"version": "9.13.2",
@@ -3654,6 +3656,16 @@
"integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=",
"dev": true
},
+ "bourbon": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/bourbon/-/bourbon-4.3.4.tgz",
+ "integrity": "sha1-TaOAAp6SwMj5dkx3lFGhNLEefMM="
+ },
+ "bourbon-neat": {
+ "version": "1.7.2",
+ "resolved": "https://registry.npmjs.org/bourbon-neat/-/bourbon-neat-1.7.2.tgz",
+ "integrity": "sha1-oiixJ0R53iR20yszFTEHylBTzz0="
+ },
"bowser": {
"version": "2.9.0",
"resolved": "https://registry.npmjs.org/bowser/-/bowser-2.9.0.tgz",
@@ -3911,6 +3923,38 @@
"safe-json-stringify": "~1"
}
},
+ "busboy": {
+ "version": "0.2.14",
+ "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz",
+ "integrity": "sha1-bCpiLvz0fFe7vh4qnDetNseSVFM=",
+ "requires": {
+ "dicer": "0.2.5",
+ "readable-stream": "1.1.x"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
+ },
+ "readable-stream": {
+ "version": "1.1.14",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+ "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
+ }
+ }
+ },
"bytes": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
@@ -4750,7 +4794,6 @@
"version": "1.6.2",
"resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
"integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
- "dev": true,
"requires": {
"buffer-from": "^1.0.0",
"inherits": "^2.0.3",
@@ -6716,6 +6759,38 @@
"defined": "^1.0.0"
}
},
+ "dicer": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz",
+ "integrity": "sha1-WZbAhrszIYyBLAkL3cCc0S+stw8=",
+ "requires": {
+ "readable-stream": "1.1.x",
+ "streamsearch": "0.1.2"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
+ },
+ "readable-stream": {
+ "version": "1.1.14",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+ "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
+ }
+ }
+ },
"diff": {
"version": "3.5.0",
"resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
@@ -8312,6 +8387,11 @@
"resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
"integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
},
+ "fast-safe-stringify": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz",
+ "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA=="
+ },
"fastparse": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz",
@@ -8396,6 +8476,21 @@
"schema-utils": "^0.4.5"
}
},
+ "file-selector": {
+ "version": "0.1.13",
+ "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-0.1.13.tgz",
+ "integrity": "sha512-T2efCBY6Ps+jLIWdNQsmzt/UnAjKOEAlsZVdnQztg/BtAZGNL4uX1Jet9cMM8gify/x4CSudreji2HssGBNVIQ==",
+ "requires": {
+ "tslib": "^2.0.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz",
+ "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ=="
+ }
+ }
+ },
"file-set": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/file-set/-/file-set-2.0.1.tgz",
@@ -8999,12 +9094,12 @@
"integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
},
"form-data": {
- "version": "2.5.1",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz",
- "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz",
+ "integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==",
"requires": {
"asynckit": "^0.4.0",
- "combined-stream": "^1.0.6",
+ "combined-stream": "^1.0.8",
"mime-types": "^2.1.12"
}
},
@@ -14482,6 +14577,21 @@
"isarray": "^1.0.0"
}
},
+ "multer": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.2.tgz",
+ "integrity": "sha512-xY8pX7V+ybyUpbYMxtjM9KAiD9ixtg5/JkeKUTD6xilfDv0vzzOFcCp4Ljb1UU3tSOM3VTZtKo63OmzOrGi3Cg==",
+ "requires": {
+ "append-field": "^1.0.0",
+ "busboy": "^0.2.11",
+ "concat-stream": "^1.5.2",
+ "mkdirp": "^0.5.1",
+ "object-assign": "^4.1.1",
+ "on-finished": "^2.3.0",
+ "type-is": "^1.6.4",
+ "xtend": "^4.0.0"
+ }
+ },
"mute-stream": {
"version": "0.0.7",
"resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
@@ -14573,7 +14683,7 @@
"dev": true
},
"navigation-component": {
- "version": "github:topcoder-platform/navigation-component#4938269d5610f3f8bff65f23459a37d01121e6f6",
+ "version": "github:topcoder-platform/navigation-component#0843a97144494ff06b21b7dc0ab2cb8412ef05eb",
"from": "github:topcoder-platform/navigation-component#develop",
"requires": {
"classnames": "^2.2.6",
@@ -14581,9 +14691,39 @@
"moment": "^2.24.0",
"prop-types": "^15.7.2",
"react-resize-detector": "^4.1.3",
+ "topcoder-react-lib": "v0.17.0",
"topcoder-react-utils": "^0.7.9"
},
"dependencies": {
+ "auth0-js": {
+ "version": "6.8.4",
+ "resolved": "https://registry.npmjs.org/auth0-js/-/auth0-js-6.8.4.tgz",
+ "integrity": "sha1-Qw3Uystk2NFdabHmIRhPmipkCmE=",
+ "requires": {
+ "Base64": "~0.1.3",
+ "json-fallback": "0.0.1",
+ "jsonp": "~0.0.4",
+ "qs": "git+https://github.com/jfromaniello/node-querystring.git#5d96513991635e3e22d7aa54a8584d6ce97cace8",
+ "reqwest": "^1.1.4",
+ "trim": "~0.0.1",
+ "winchan": "^0.1.1",
+ "xtend": "~2.1.1"
+ },
+ "dependencies": {
+ "qs": {
+ "version": "git+https://github.com/jfromaniello/node-querystring.git#5d96513991635e3e22d7aa54a8584d6ce97cace8",
+ "from": "git+https://github.com/jfromaniello/node-querystring.git#fix_ie7_bug_with_arrays"
+ }
+ }
+ },
+ "axios": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-0.12.0.tgz",
+ "integrity": "sha1-uQewIhzDTsHJ+sGOx/B935V4W6Q=",
+ "requires": {
+ "follow-redirects": "0.0.7"
+ }
+ },
"config": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/config/-/config-3.3.1.tgz",
@@ -14592,6 +14732,15 @@
"json5": "^2.1.1"
}
},
+ "follow-redirects": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-0.0.7.tgz",
+ "integrity": "sha1-NLkLqyqRGqNHVx2pDyK9NuzYqRk=",
+ "requires": {
+ "debug": "^2.2.0",
+ "stream-consume": "^0.1.0"
+ }
+ },
"hoist-non-react-statics": {
"version": "3.3.2",
"resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
@@ -14608,6 +14757,11 @@
"minimist": "^1.2.5"
}
},
+ "object-keys": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz",
+ "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY="
+ },
"react-redux": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/react-redux/-/react-redux-6.0.1.tgz",
@@ -14635,6 +14789,152 @@
"resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.9.1.tgz",
"integrity": "sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A=="
},
+ "tc-core-library-js": {
+ "version": "github:appirio-tech/tc-core-library-js#d16413db30b1eed21c0cf426e185bedb2329ddab",
+ "from": "github:appirio-tech/tc-core-library-js#v2.6",
+ "requires": {
+ "auth0-js": "^9.4.2",
+ "axios": "^0.12.0",
+ "bunyan": "^1.8.12",
+ "jsonwebtoken": "^8.3.0",
+ "jwks-rsa": "^1.3.0",
+ "le_node": "^1.3.1",
+ "lodash": "^4.17.10",
+ "millisecond": "^0.1.2",
+ "request": "^2.88.0"
+ },
+ "dependencies": {
+ "auth0-js": {
+ "version": "9.13.4",
+ "resolved": "https://registry.npmjs.org/auth0-js/-/auth0-js-9.13.4.tgz",
+ "integrity": "sha512-G7wXTtEUe8OG5UMdcFPoS47odorEZ3WerNyWLLhoGlLqYcPgv0t+B0ECHv/rVLULbpctbSBrRFFYa43/bJV4+Q==",
+ "requires": {
+ "base64-js": "^1.3.0",
+ "idtoken-verifier": "^2.0.3",
+ "js-cookie": "^2.2.0",
+ "qs": "^6.7.0",
+ "superagent": "^3.8.3",
+ "url-join": "^4.0.1",
+ "winchan": "^0.2.2"
+ }
+ },
+ "winchan": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/winchan/-/winchan-0.2.2.tgz",
+ "integrity": "sha512-pvN+IFAbRP74n/6mc6phNyCH8oVkzXsto4KCHPJ2AScniAnA1AmeLI03I2BzjePpaClGSI4GUMowzsD3qz5PRQ=="
+ }
+ }
+ },
+ "topcoder-react-lib": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/topcoder-react-lib/-/topcoder-react-lib-0.17.0.tgz",
+ "integrity": "sha512-XxLAMdEHPCmKqIIKTPKajbKzkz0lWW+tQJ6leG33d0xF5Quo1eiefd8SpQ+pBbQ8yEJ8aA2z2SQuZVruJzKDzQ==",
+ "requires": {
+ "auth0-js": "^6.8.4",
+ "config": "^3.2.0",
+ "isomorphic-fetch": "^2.2.1",
+ "le_node": "^1.7.0",
+ "lodash": "^4.17.10",
+ "moment": "^2.22.2",
+ "moment-duration-format": "^2.2.2",
+ "moment-timezone": "^0.5.21",
+ "qs": "^6.5.2",
+ "react": "^16.4.1",
+ "react-dom": "^16.4.1",
+ "react-ga": "^2.7.0",
+ "react-redux": "^6.0.1",
+ "redux": "^3.7.2",
+ "redux-actions": "^2.4.0",
+ "tc-accounts": "git+https://github.com/appirio-tech/accounts-app.git#9d0daa189dbf5127ad6ca470ed1683eeb2495ac7",
+ "tc-core-library-js": "github:appirio-tech/tc-core-library-js#d16413db30b1eed21c0cf426e185bedb2329ddab",
+ "to-capital-case": "^1.0.0",
+ "topcoder-react-utils": "0.7.5"
+ },
+ "dependencies": {
+ "json5": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
+ "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+ "requires": {
+ "minimist": "^1.2.0"
+ }
+ },
+ "redux": {
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/redux/-/redux-3.7.2.tgz",
+ "integrity": "sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A==",
+ "requires": {
+ "lodash": "^4.2.1",
+ "lodash-es": "^4.2.1",
+ "loose-envify": "^1.1.0",
+ "symbol-observable": "^1.0.3"
+ }
+ },
+ "topcoder-react-utils": {
+ "version": "0.7.5",
+ "resolved": "https://registry.npmjs.org/topcoder-react-utils/-/topcoder-react-utils-0.7.5.tgz",
+ "integrity": "sha512-/jolO/UUCC/FL/MniBMFi9d7Wc1KbzwvgT5STGs4T+7u7R26bQugGPpGVISEPuglsmW0Xybh6iRi+pT/muOkbg==",
+ "requires": {
+ "babel-runtime": "^6.26.0",
+ "body-parser": "^1.18.3",
+ "command-line-args": "^5.0.2",
+ "command-line-usage": "^5.0.5",
+ "compression": "^1.7.2",
+ "config": "^1.30.0",
+ "cookie-parser": "^1.4.3",
+ "express": "^4.16.3",
+ "helmet": "^3.12.1",
+ "lodash": "^4.17.10",
+ "moment": "^2.22.2",
+ "morgan": "^1.9.0",
+ "node-forge": "^0.7.5",
+ "prop-types": "^15.6.2",
+ "raf": "^3.4.0",
+ "react": "^16.4.1",
+ "react-css-super-themr": "^2.2.0",
+ "react-dom": "^16.4.1",
+ "react-helmet": "^5.2.0",
+ "react-redux": "^5.0.7",
+ "react-router-dom": "^4.3.1",
+ "redux": "^3.7.2",
+ "redux-actions": "^2.4.0",
+ "redux-devtools": "^3.4.1",
+ "redux-devtools-dock-monitor": "^1.1.3",
+ "redux-devtools-log-monitor": "^1.4.0",
+ "redux-promise": "^0.6.0",
+ "request-ip": "^2.0.2",
+ "serialize-javascript": "^1.5.0",
+ "serve-favicon": "^2.5.0",
+ "shortid": "^2.2.8",
+ "url-parse": "^1.4.1"
+ },
+ "dependencies": {
+ "config": {
+ "version": "1.31.0",
+ "resolved": "https://registry.npmjs.org/config/-/config-1.31.0.tgz",
+ "integrity": "sha512-Ep/l9Rd1J9IPueztJfpbOqVzuKHQh4ZODMNt9xqTYdBBNRXbV4oTu34kCkkfdRVcDq0ohtpaeXGgb+c0LQxFRA==",
+ "requires": {
+ "json5": "^1.0.1"
+ }
+ },
+ "react-redux": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-5.1.2.tgz",
+ "integrity": "sha512-Ns1G0XXc8hDyH/OcBHOxNgQx9ayH3SPxBnFCOidGKSle8pKihysQw2rG/PmciUQRoclhVBO8HMhiRmGXnDja9Q==",
+ "requires": {
+ "@babel/runtime": "^7.1.2",
+ "hoist-non-react-statics": "^3.3.0",
+ "invariant": "^2.2.4",
+ "loose-envify": "^1.1.0",
+ "prop-types": "^15.6.1",
+ "react-is": "^16.6.0",
+ "react-lifecycles-compat": "^3.0.0"
+ }
+ }
+ }
+ }
+ }
+ },
"topcoder-react-utils": {
"version": "0.7.9",
"resolved": "https://registry.npmjs.org/topcoder-react-utils/-/topcoder-react-utils-0.7.9.tgz",
@@ -14675,6 +14975,19 @@
"shortid": "^2.2.14",
"url-parse": "^1.4.4"
}
+ },
+ "winchan": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/winchan/-/winchan-0.1.4.tgz",
+ "integrity": "sha1-iPoSQRzVQutiYBjDihlry7F5k7s="
+ },
+ "xtend": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz",
+ "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=",
+ "requires": {
+ "object-keys": "~0.4.0"
+ }
}
}
},
@@ -14726,6 +15039,14 @@
"semver": "^5.4.1"
}
},
+ "node-bourbon": {
+ "version": "4.2.8",
+ "resolved": "https://registry.npmjs.org/node-bourbon/-/node-bourbon-4.2.8.tgz",
+ "integrity": "sha1-5ETx8JQ0q3ZQ6jGMKOLhA9P5Qs0=",
+ "requires": {
+ "bourbon": "^4.2.6"
+ }
+ },
"node-dir": {
"version": "0.1.17",
"resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz",
@@ -14864,6 +15185,15 @@
"resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz",
"integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA="
},
+ "node-neat": {
+ "version": "1.7.2",
+ "resolved": "https://registry.npmjs.org/node-neat/-/node-neat-1.7.2.tgz",
+ "integrity": "sha1-OEcpELgV4mG4sbmbpRmZRGWhXCE=",
+ "requires": {
+ "bourbon-neat": "1.7.2",
+ "node-bourbon": "^4.2.3"
+ }
+ },
"node-notifier": {
"version": "5.4.3",
"resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz",
@@ -15750,8 +16080,7 @@
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
"integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
- "dev": true,
- "optional": true
+ "dev": true
},
"pify": {
"version": "3.0.0",
@@ -18088,12 +18417,13 @@
}
},
"react-dropzone": {
- "version": "3.13.4",
- "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-3.13.4.tgz",
- "integrity": "sha1-hNomgVxAM5aRxJtFRMLvehaRLMw=",
+ "version": "11.2.0",
+ "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-11.2.0.tgz",
+ "integrity": "sha512-S/qaXQHCCg7MVlcrhqd05MLC6DupITLUB0CFn3iCLs6OTjzxdGDF1WTktTe5Jyq8jZdxYfMHNUZOHL0mg+K0Dw==",
"requires": {
- "attr-accept": "^1.0.3",
- "prop-types": "^15.5.7"
+ "attr-accept": "^2.0.0",
+ "file-selector": "^0.1.12",
+ "prop-types": "^15.7.2"
}
},
"react-fast-compare": {
@@ -18727,8 +19057,7 @@
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
"integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
- "dev": true,
- "optional": true
+ "dev": true
},
"braces": {
"version": "2.3.2",
@@ -20392,7 +20721,8 @@
"semver-compare": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz",
- "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w="
+ "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=",
+ "dev": true
},
"semver-regex": {
"version": "2.0.0",
@@ -21145,6 +21475,11 @@
"integrity": "sha512-DBp0lSvX5G9KGRDTkR/R+a29H+Wk2xItOF+MpZLLNDWbEV9tGPnqLPxHEYjmiz8xGtJHRIqmI+hCjmNzqoA4nQ==",
"dev": true
},
+ "streamsearch": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz",
+ "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo="
+ },
"strict-uri-encode": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz",
@@ -22099,6 +22434,16 @@
"ms": "^2.1.1"
}
},
+ "form-data": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz",
+ "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==",
+ "requires": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.6",
+ "mime-types": "^2.1.12"
+ }
+ },
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
@@ -22383,15 +22728,12 @@
"@uirouter/angularjs": "^1.0.0",
"angucomplete-alt": "^2.1.0",
"angular": "^1.4.8",
- "angular-animate": "^1.7.9",
- "angular-aria": "^1.7.9",
"angular-auth0": "^3.0.0",
"angular-cookies": "^1.5.1",
- "angular-material": "^1.1.21",
"angular-messages": "^1.5.2",
- "appirio-tech-ng-iso-constants": "github:appirio-tech/ng-iso-constants#v1.0.7",
+ "appirio-tech-ng-iso-constants": "github:appirio-tech/ng-iso-constants#d8466ab76828208ccdaaeb10816a3f35cd59c39b",
"appirio-tech-ng-ui-components": "^2.2.4",
- "appirio-tech-react-components": "github:appirio-tech/react-components#feature/connectv2",
+ "appirio-tech-react-components": "github:appirio-tech/react-components#a471d4f9d1a4cd5a1a2f53aea3d1cc5dd6d78aea",
"auth0-js": "^9.6.1",
"babel-polyfill": "^6.7.4",
"filestack-js": "^1.13.2",
@@ -22569,16 +22911,6 @@
"resolved": "https://registry.npmjs.org/angular/-/angular-1.7.2.tgz",
"integrity": "sha512-JcKKJbBdybUsmQ6x1M3xWyTYQ/ioVKJhSByEAjqrhmlOfvMFdhfMqAx5KIo8rLGk4DFolYPcCSgssjgTVjCtRQ=="
},
- "angular-animate": {
- "version": "1.7.9",
- "resolved": "https://registry.npmjs.org/angular-animate/-/angular-animate-1.7.9.tgz",
- "integrity": "sha512-fV+AISy/HTzurQH2ngsJg+lLIvfu0ahc1h4AYKauaXVw97rZc2k4iUA1bMstiEyClsdayQX568kjQc1NK+oYhw=="
- },
- "angular-aria": {
- "version": "1.7.9",
- "resolved": "https://registry.npmjs.org/angular-aria/-/angular-aria-1.7.9.tgz",
- "integrity": "sha512-luI3Jemd1AbOQW0krdzfEG3fM0IFtLY0bSSqIDEx3POE0XjKIC1MkrO8Csyq9PPgueLphyAPofzUwZ8YeZ88SA=="
- },
"angular-auth0": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/angular-auth0/-/angular-auth0-3.0.0.tgz",
@@ -22593,11 +22925,6 @@
"resolved": "https://registry.npmjs.org/angular-cookies/-/angular-cookies-1.7.2.tgz",
"integrity": "sha512-5+B6ypV51aRPbQaqC2R5pr96q946C662dQC8QC1UL+cAlLkgkKZXXXzFRhiaEnhntkSnURWVCPasLVHQdZ3YgA=="
},
- "angular-material": {
- "version": "1.1.21",
- "resolved": "https://registry.npmjs.org/angular-material/-/angular-material-1.1.21.tgz",
- "integrity": "sha512-BiqvEu82dqQ4Sb4OjJHdVp/YJvFEMrtr7K2eS+6qlWPWUiF9K2K6IkX2H3p0wD7QlscjTz8n9W8uKL46PQjlCQ=="
- },
"angular-messages": {
"version": "1.7.2",
"resolved": "https://registry.npmjs.org/angular-messages/-/angular-messages-1.7.2.tgz",
@@ -22896,12 +23223,10 @@
"filestack-js": "^1.13.2",
"formsy-react": "^0.19.5",
"isomorphic-fetch": "^2.2.1",
- "libphonenumber-js": "1.4.6",
"lodash": "^4.0.0",
"material-ui": "^0.20.2",
"moment": "^2.11.2",
"prop-types": "^15.7.2",
- "rc-slider": "8.6.4",
"react": "^15.3.1",
"react-addons-pure-render-mixin": "^15.3.1",
"react-addons-update": "^15.3.1",
@@ -22918,7 +23243,7 @@
"react-textarea-autosize": "^5.2.1",
"react-transition-group": "^2.2.1",
"redux-thunk": "^2.1.0",
- "tc-ui": "git+https://github.com/appirio-tech/tc-ui.git#feature/connectv2",
+ "tc-ui": "git+https://github.com/appirio-tech/tc-ui.git#e577a0e704136f1e9ecce92ce4c0626aab932691",
"uncontrollable": "^4.0.1"
},
"dependencies": {
@@ -22927,44 +23252,6 @@
"resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-1.12.7.tgz",
"integrity": "sha512-pLXHFxQMPklVoEekowk8b3erNynC+DVJzChxS/LCBBgR6/8AJkHivkm//zbowcfc7BTCAjryuhx6gPqPRfsFoA=="
},
- "fbjs": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.6.1.tgz",
- "integrity": "sha1-lja3cF9bqWhNRLcveDISVK/IYPc=",
- "requires": {
- "core-js": "^1.0.0",
- "loose-envify": "^1.0.0",
- "promise": "^7.0.3",
- "ua-parser-js": "^0.7.9",
- "whatwg-fetch": "^0.9.0"
- }
- },
- "history": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/history/-/history-2.1.2.tgz",
- "integrity": "sha1-SqLeiXoOSGfkU5hDvm7Nsphr/ew=",
- "requires": {
- "deep-equal": "^1.0.0",
- "invariant": "^2.0.0",
- "query-string": "^3.0.0",
- "warning": "^2.0.0"
- },
- "dependencies": {
- "warning": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/warning/-/warning-2.1.0.tgz",
- "integrity": "sha1-ISINnGOvx3qMkhEeARr3Bc4MaQE=",
- "requires": {
- "loose-envify": "^1.0.0"
- }
- }
- }
- },
- "hoist-non-react-statics": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-1.2.0.tgz",
- "integrity": "sha1-qkSM8JhtVcxAdzsXF0t90GbLfPs="
- },
"libphonenumber-js": {
"version": "1.4.6",
"resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.4.6.tgz",
@@ -22983,11 +23270,6 @@
"js-tokens": "^3.0.0 || ^4.0.0"
}
},
- "minimist": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
- "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
- },
"moment": {
"version": "2.24.0",
"resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz",
@@ -23008,14 +23290,6 @@
"react-is": "^16.8.1"
}
},
- "query-string": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/query-string/-/query-string-3.0.3.tgz",
- "integrity": "sha1-ri4UtNBQcdTpuetIc8NbDc1C5jg=",
- "requires": {
- "strict-uri-encode": "^1.0.0"
- }
- },
"rc-slider": {
"version": "8.6.4",
"resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-8.6.4.tgz",
@@ -23030,18 +23304,6 @@
"warning": "^3.0.0"
}
},
- "react-router": {
- "version": "2.8.1",
- "resolved": "https://registry.npmjs.org/react-router/-/react-router-2.8.1.tgz",
- "integrity": "sha1-c+lJH2zrMW0Pd5gpCBhj43juTtc=",
- "requires": {
- "history": "^2.1.2",
- "hoist-non-react-statics": "^1.2.0",
- "invariant": "^2.2.1",
- "loose-envify": "^1.2.0",
- "warning": "^3.0.0"
- }
- },
"warning": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz",
@@ -23049,20 +23311,6 @@
"requires": {
"loose-envify": "^1.0.0"
}
- },
- "xml2js": {
- "version": "0.4.23",
- "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz",
- "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==",
- "requires": {
- "sax": ">=0.6.0",
- "xmlbuilder": "~11.0.0"
- }
- },
- "xmlbuilder": {
- "version": "11.0.1",
- "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
- "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA=="
}
}
},
@@ -24282,16 +24530,6 @@
"hoek": "2.x.x"
}
},
- "bourbon": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/bourbon/-/bourbon-4.3.4.tgz",
- "integrity": "sha1-TaOAAp6SwMj5dkx3lFGhNLEefMM="
- },
- "bourbon-neat": {
- "version": "1.7.2",
- "resolved": "https://registry.npmjs.org/bourbon-neat/-/bourbon-neat-1.7.2.tgz",
- "integrity": "sha1-oiixJ0R53iR20yszFTEHylBTzz0="
- },
"bowser": {
"version": "1.9.4",
"resolved": "https://registry.npmjs.org/bowser/-/bowser-1.9.4.tgz",
@@ -26310,8 +26548,7 @@
"ansi-regex": {
"version": "2.1.1",
"resolved": false,
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
- "optional": true
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
},
"aproba": {
"version": "1.2.0",
@@ -26332,14 +26569,12 @@
"balanced-match": {
"version": "1.0.0",
"resolved": false,
- "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
- "optional": true
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
},
"brace-expansion": {
"version": "1.1.11",
"resolved": false,
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "optional": true,
"requires": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
@@ -26354,20 +26589,17 @@
"code-point-at": {
"version": "1.1.0",
"resolved": false,
- "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
- "optional": true
+ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c="
},
"concat-map": {
"version": "0.0.1",
"resolved": false,
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
- "optional": true
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
},
"console-control-strings": {
"version": "1.1.0",
"resolved": false,
- "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=",
- "optional": true
+ "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4="
},
"core-util-is": {
"version": "1.0.2",
@@ -26484,8 +26716,7 @@
"inherits": {
"version": "2.0.3",
"resolved": false,
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
- "optional": true
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
},
"ini": {
"version": "1.3.5",
@@ -26497,7 +26728,6 @@
"version": "1.0.0",
"resolved": false,
"integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
- "optional": true,
"requires": {
"number-is-nan": "^1.0.0"
}
@@ -26512,7 +26742,6 @@
"version": "3.0.4",
"resolved": false,
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
- "optional": true,
"requires": {
"brace-expansion": "^1.1.7"
}
@@ -26520,14 +26749,12 @@
"minimist": {
"version": "0.0.8",
"resolved": false,
- "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
- "optional": true
+ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
},
"minipass": {
"version": "2.3.5",
"resolved": false,
"integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==",
- "optional": true,
"requires": {
"safe-buffer": "^5.1.2",
"yallist": "^3.0.0"
@@ -26546,7 +26773,6 @@
"version": "0.5.1",
"resolved": false,
"integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
- "optional": true,
"requires": {
"minimist": "0.0.8"
}
@@ -26633,8 +26859,7 @@
"number-is-nan": {
"version": "1.0.1",
"resolved": false,
- "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
- "optional": true
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
},
"object-assign": {
"version": "4.1.1",
@@ -26646,7 +26871,6 @@
"version": "1.4.0",
"resolved": false,
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
- "optional": true,
"requires": {
"wrappy": "1"
}
@@ -26732,8 +26956,7 @@
"safe-buffer": {
"version": "5.1.2",
"resolved": false,
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
- "optional": true
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
},
"safer-buffer": {
"version": "2.1.2",
@@ -26769,7 +26992,6 @@
"version": "1.0.2",
"resolved": false,
"integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
- "optional": true,
"requires": {
"code-point-at": "^1.0.0",
"is-fullwidth-code-point": "^1.0.0",
@@ -26789,7 +27011,6 @@
"version": "3.0.1",
"resolved": false,
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
- "optional": true,
"requires": {
"ansi-regex": "^2.0.0"
}
@@ -26833,14 +27054,12 @@
"wrappy": {
"version": "1.0.2",
"resolved": false,
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
- "optional": true
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
},
"yallist": {
"version": "3.0.3",
"resolved": false,
- "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==",
- "optional": true
+ "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A=="
}
}
},
@@ -28476,14 +28695,6 @@
"lower-case": "^1.1.1"
}
},
- "node-bourbon": {
- "version": "4.2.8",
- "resolved": "https://registry.npmjs.org/node-bourbon/-/node-bourbon-4.2.8.tgz",
- "integrity": "sha1-5ETx8JQ0q3ZQ6jGMKOLhA9P5Qs0=",
- "requires": {
- "bourbon": "^4.2.6"
- }
- },
"node-fetch": {
"version": "1.7.3",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz",
@@ -28621,15 +28832,6 @@
}
}
},
- "node-neat": {
- "version": "1.7.2",
- "resolved": "https://registry.npmjs.org/node-neat/-/node-neat-1.7.2.tgz",
- "integrity": "sha1-OEcpELgV4mG4sbmbpRmZRGWhXCE=",
- "requires": {
- "bourbon-neat": "1.7.2",
- "node-bourbon": "^4.2.3"
- }
- },
"node-sass": {
"version": "3.13.1",
"resolved": "https://registry.npmjs.org/node-sass/-/node-sass-3.13.1.tgz",
@@ -31660,9 +31862,9 @@
"integrity": "sha1-qkSM8JhtVcxAdzsXF0t90GbLfPs="
},
"moment": {
- "version": "2.27.0",
- "resolved": "https://registry.npmjs.org/moment/-/moment-2.27.0.tgz",
- "integrity": "sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ=="
+ "version": "2.26.0",
+ "resolved": "https://registry.npmjs.org/moment/-/moment-2.26.0.tgz",
+ "integrity": "sha512-oIixUO+OamkUkwjhAVE18rAMfRJNsNe/Stid/gwHSOfHrOtw9EhAY2AHvdKZ/k/MggcYELFCJz/Sn2pL8b8JMw=="
},
"query-string": {
"version": "3.0.3",
@@ -32553,6 +32755,21 @@
"redux": "^3.3.1"
},
"dependencies": {
+ "attr-accept": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-1.1.3.tgz",
+ "integrity": "sha512-iT40nudw8zmCweivz6j58g+RT33I4KbaIvRUhjNmDwO2WmsQUxFEZZYZ5w3vXe5x5MX9D7mfvA/XaLOZYFR9EQ==",
+ "requires": {
+ "core-js": "^2.5.0"
+ },
+ "dependencies": {
+ "core-js": {
+ "version": "2.6.11",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz",
+ "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg=="
+ }
+ }
+ },
"core-js": {
"version": "1.2.7",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz",
@@ -32621,6 +32838,15 @@
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-0.14.9.tgz",
"integrity": "sha1-BQZKPc8PsYgKOyv8nVjFXY2fYpM="
},
+ "react-dropzone": {
+ "version": "3.13.4",
+ "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-3.13.4.tgz",
+ "integrity": "sha1-hNomgVxAM5aRxJtFRMLvehaRLMw=",
+ "requires": {
+ "attr-accept": "^1.0.3",
+ "prop-types": "^15.5.7"
+ }
+ },
"react-input-autosize": {
"version": "0.6.13",
"resolved": "https://registry.npmjs.org/react-input-autosize/-/react-input-autosize-0.6.13.tgz",
@@ -33204,9 +33430,9 @@
"integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
},
"topcoder-react-lib": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/topcoder-react-lib/-/topcoder-react-lib-1.0.3.tgz",
- "integrity": "sha512-cb4QLW2m3CqzJHWkfbx5TM/rV1bpJXk3FqetNIyKETipebkXtbL83mxtkaV3IEDYrpeKmfzDwjmbxwBh8Gopkw==",
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/topcoder-react-lib/-/topcoder-react-lib-1.0.5.tgz",
+ "integrity": "sha512-vit+BVaU5SbjwTzLDAqFxE2P539+huV6QspsV3Ud5fL12HQqu3cpJg8iZLmEcCPSXonocVyhtvqdrSgqF1oB4Q==",
"requires": {
"auth0-js": "^6.8.4",
"config": "^3.2.0",
@@ -33222,8 +33448,8 @@
"react-redux": "^6.0.1",
"redux": "^3.7.2",
"redux-actions": "^2.4.0",
- "tc-accounts": "git+https://github.com/appirio-tech/accounts-app.git#dev",
- "tc-core-library-js": "github:appirio-tech/tc-core-library-js#v2.6",
+ "tc-accounts": "git+https://github.com/appirio-tech/accounts-app.git#9d0daa189dbf5127ad6ca470ed1683eeb2495ac7",
+ "tc-core-library-js": "github:appirio-tech/tc-core-library-js#d16413db30b1eed21c0cf426e185bedb2329ddab",
"to-capital-case": "^1.0.0",
"topcoder-react-utils": "0.7.5"
},
@@ -33236,7 +33462,7 @@
"Base64": "~0.1.3",
"json-fallback": "0.0.1",
"jsonp": "~0.0.4",
- "qs": "git+https://github.com/jfromaniello/node-querystring.git#fix_ie7_bug_with_arrays",
+ "qs": "git+https://github.com/jfromaniello/node-querystring.git#5d96513991635e3e22d7aa54a8584d6ce97cace8",
"reqwest": "^1.1.4",
"trim": "~0.0.1",
"winchan": "^0.1.1",
@@ -33265,6 +33491,14 @@
"json5": "^2.1.1"
}
},
+ "debug": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz",
+ "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==",
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
"follow-redirects": {
"version": "0.0.7",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-0.0.7.tgz",
@@ -33272,6 +33506,31 @@
"requires": {
"debug": "^2.2.0",
"stream-consume": "^0.1.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ }
+ }
+ },
+ "form-data": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz",
+ "integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==",
+ "requires": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
}
},
"hoist-non-react-statics": {
@@ -33290,6 +33549,16 @@
"minimist": "^1.2.5"
}
},
+ "mime": {
+ "version": "2.4.6",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz",
+ "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA=="
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ },
"object-keys": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz",
@@ -33308,11 +33577,44 @@
"react-is": "^16.8.2"
}
},
+ "readable-stream": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+ "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+ "requires": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ }
+ },
+ "semver": {
+ "version": "7.3.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
+ "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ=="
+ },
"serialize-javascript": {
"version": "1.9.1",
"resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.9.1.tgz",
"integrity": "sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A=="
},
+ "superagent": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/superagent/-/superagent-5.3.1.tgz",
+ "integrity": "sha512-wjJ/MoTid2/RuGCOFtlacyGNxN9QLMgcpYLDQlWFIhhdJ93kNscFonGvrpAHSCVjRVj++DGCglocF7Aej1KHvQ==",
+ "requires": {
+ "component-emitter": "^1.3.0",
+ "cookiejar": "^2.1.2",
+ "debug": "^4.1.1",
+ "fast-safe-stringify": "^2.0.7",
+ "form-data": "^3.0.0",
+ "formidable": "^1.2.2",
+ "methods": "^1.1.2",
+ "mime": "^2.4.6",
+ "qs": "^6.9.4",
+ "readable-stream": "^3.6.0",
+ "semver": "^7.3.2"
+ }
+ },
"tc-core-library-js": {
"version": "github:appirio-tech/tc-core-library-js#d16413db30b1eed21c0cf426e185bedb2329ddab",
"from": "github:appirio-tech/tc-core-library-js#v2.6",
@@ -33329,15 +33631,15 @@
},
"dependencies": {
"auth0-js": {
- "version": "9.13.4",
- "resolved": "https://registry.npmjs.org/auth0-js/-/auth0-js-9.13.4.tgz",
- "integrity": "sha512-G7wXTtEUe8OG5UMdcFPoS47odorEZ3WerNyWLLhoGlLqYcPgv0t+B0ECHv/rVLULbpctbSBrRFFYa43/bJV4+Q==",
+ "version": "9.14.0",
+ "resolved": "https://registry.npmjs.org/auth0-js/-/auth0-js-9.14.0.tgz",
+ "integrity": "sha512-40gIBUejmYAYse06ck6sxdNO0KU0pX+KDIQsWAkcyFtI0HU6dY5aeHxZfVYkYjtbArKr5s13LuZFdKrUiGyCqQ==",
"requires": {
"base64-js": "^1.3.0",
"idtoken-verifier": "^2.0.3",
"js-cookie": "^2.2.0",
"qs": "^6.7.0",
- "superagent": "^3.8.3",
+ "superagent": "^5.3.1",
"url-join": "^4.0.1",
"winchan": "^0.2.2"
}
@@ -33436,9 +33738,9 @@
}
},
"topcoder-react-ui-kit": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/topcoder-react-ui-kit/-/topcoder-react-ui-kit-2.0.0.tgz",
- "integrity": "sha512-9Ph8fRzRjVVB0VH13s8/N4+/ZWPLflrnW7D0fmS+oeDwnQe6k5wMknyFcBCI/pqWHr/11nhclXX7np3LdyWSwA==",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/topcoder-react-ui-kit/-/topcoder-react-ui-kit-2.0.1.tgz",
+ "integrity": "sha512-pl8tysSZYHDSbWn8srLZxV+8lK9f32ya8N+yt5C2XF2PKak30Qnqb3PCDhBO1fKmFF90p4ohJRsCi0IxLRyH/A==",
"requires": {
"prop-types": "^15.6.2",
"react": "^16.4.1",
@@ -33624,8 +33926,7 @@
"typedarray": {
"version": "0.0.6",
"resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
- "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
- "dev": true
+ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
},
"typical": {
"version": "4.0.0",
@@ -34237,15 +34538,13 @@
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
"integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
- "dev": true,
- "optional": true
+ "dev": true
},
"is-glob": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
"integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
"dev": true,
- "optional": true,
"requires": {
"is-extglob": "^2.1.1"
}
@@ -34261,8 +34560,7 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
"integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
- "dev": true,
- "optional": true
+ "dev": true
},
"readdirp": {
"version": "3.4.0",
@@ -34330,15 +34628,13 @@
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
"integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
- "dev": true,
- "optional": true
+ "dev": true
},
"braces": {
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
"integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
"dev": true,
- "optional": true,
"requires": {
"arr-flatten": "^1.1.0",
"array-unique": "^0.3.2",
@@ -34357,7 +34653,6 @@
"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
"dev": true,
- "optional": true,
"requires": {
"is-extendable": "^0.1.0"
}
@@ -34530,7 +34825,6 @@
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
"integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
"dev": true,
- "optional": true,
"requires": {
"extend-shallow": "^2.0.1",
"is-number": "^3.0.0",
@@ -34543,7 +34837,6 @@
"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
"dev": true,
- "optional": true,
"requires": {
"is-extendable": "^0.1.0"
}
@@ -34609,8 +34902,7 @@
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
"integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
- "dev": true,
- "optional": true
+ "dev": true
},
"is-glob": {
"version": "4.0.1",
@@ -34627,7 +34919,6 @@
"resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
"integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
"dev": true,
- "optional": true,
"requires": {
"kind-of": "^3.0.2"
},
@@ -34637,7 +34928,6 @@
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
"dev": true,
- "optional": true,
"requires": {
"is-buffer": "^1.1.5"
}
diff --git a/package.json b/package.json
index 17d01d001b..34428acf96 100644
--- a/package.json
+++ b/package.json
@@ -62,6 +62,7 @@
"filestack-react": "^2.0.0",
"flag-icon-css": "^3.3.0",
"focus-trap-react": "^6.0.0",
+ "form-data": "^3.0.0",
"helmet": "^3.12.1",
"highlight.js": "^9.18.1",
"html-to-text": "^5.1.1",
@@ -81,6 +82,7 @@
"moment-timezone": "^0.5.21",
"money": "^0.2.0",
"morgan": "^1.9.0",
+ "multer": "^1.4.2",
"navigation-component": "topcoder-platform/navigation-component#develop",
"node-forge": "^0.7.5",
"nuka-carousel": "^4.5.3",
@@ -99,6 +101,7 @@
"react-dates": "^18.2.2",
"react-dom": "^16.4.1",
"react-dotdotdot": "^1.3.1",
+ "react-dropzone": "^11.2.0",
"react-ga": "^2.7.0",
"react-helmet": "^5.2.0",
"react-html-parser": "^2.0.2",
@@ -137,7 +140,7 @@
"tc-accounts": "git+https://github.com/appirio-tech/accounts-app.git#dev",
"tc-core-library-js": "github:appirio-tech/tc-core-library-js#v2.6.3",
"tc-ui": "^1.0.12",
- "topcoder-react-lib": "1.0.5",
+ "topcoder-react-lib": "1000.24.6",
"topcoder-react-ui-kit": "2.0.1",
"topcoder-react-utils": "0.7.8",
"turndown": "^4.0.2",
diff --git a/src/assets/images/back-arrow-gig-apply.svg b/src/assets/images/back-arrow-gig-apply.svg
new file mode 100644
index 0000000000..ab3b9f0bbb
--- /dev/null
+++ b/src/assets/images/back-arrow-gig-apply.svg
@@ -0,0 +1,17 @@
+
+
+
diff --git a/src/assets/images/big-checkmark.png b/src/assets/images/big-checkmark.png
new file mode 100644
index 0000000000..8bd83bc41e
Binary files /dev/null and b/src/assets/images/big-checkmark.png differ
diff --git a/src/assets/images/check-mark.svg b/src/assets/images/check-mark.svg
new file mode 100644
index 0000000000..b4e1f7b3a6
--- /dev/null
+++ b/src/assets/images/check-mark.svg
@@ -0,0 +1,24 @@
+
+
\ No newline at end of file
diff --git a/src/assets/images/dropdown-arrow.png b/src/assets/images/dropdown-arrow.png
new file mode 100644
index 0000000000..40edda6752
Binary files /dev/null and b/src/assets/images/dropdown-arrow.png differ
diff --git a/src/assets/images/l4.png b/src/assets/images/l4.png
deleted file mode 100644
index 2e066b7f5d..0000000000
Binary files a/src/assets/images/l4.png and /dev/null differ
diff --git a/src/assets/images/sad-face-icon.svg b/src/assets/images/sad-face-icon.svg
new file mode 100644
index 0000000000..b9b685c036
--- /dev/null
+++ b/src/assets/images/sad-face-icon.svg
@@ -0,0 +1,20 @@
+
+
\ No newline at end of file
diff --git a/src/server/index.js b/src/server/index.js
index ed9afd3008..b4892eb12f 100644
--- a/src/server/index.js
+++ b/src/server/index.js
@@ -27,6 +27,7 @@ import cdnRouter from './routes/cdn';
import mailChimpRouter from './routes/mailchimp';
import mockDocuSignFactory from './__mocks__/docu-sign-mock';
import recruitCRMRouter from './routes/recruitCRM';
+import mmLeaderboardRouter from './routes/mmLeaderboard';
/* Dome API for topcoder communities */
import tcCommunitiesDemoApi from './tc-communities';
@@ -135,6 +136,7 @@ async function onExpressJsSetup(server) {
server.use('/api/cdn', cdnRouter);
server.use('/api/mailchimp', mailChimpRouter);
server.use('/api/recruit', recruitCRMRouter);
+ server.use('/api/mml', mmLeaderboardRouter);
// serve demo api
server.use(
diff --git a/src/server/routes/mmLeaderboard.js b/src/server/routes/mmLeaderboard.js
new file mode 100644
index 0000000000..a9498e5818
--- /dev/null
+++ b/src/server/routes/mmLeaderboard.js
@@ -0,0 +1,19 @@
+/**
+ * The routes related to MMLeaderboard integration
+ */
+
+import express from 'express';
+import MMLService from '../services/mmLeaderboard';
+
+const cors = require('cors');
+
+const routes = express.Router();
+
+// Enables CORS on those routes according config above
+// ToDo configure CORS for set of our trusted domains
+routes.use(cors());
+routes.options('*', cors());
+
+routes.get('/:id', (req, res, next) => new MMLService().getLeaderboard(req, res, next));
+
+export default routes;
diff --git a/src/server/routes/recruitCRM.js b/src/server/routes/recruitCRM.js
index 5047dcdb0d..34c1831539 100644
--- a/src/server/routes/recruitCRM.js
+++ b/src/server/routes/recruitCRM.js
@@ -6,7 +6,15 @@ import express from 'express';
import RecruitCRMService from '../services/recruitCRM';
const cors = require('cors');
-
+const multer = require('multer');
+
+const storage = multer.memoryStorage();
+const upload = multer({
+ storage,
+ limits: {
+ fileSize: 8000000,
+ },
+});
const routes = express.Router();
// Enables CORS on those routes according config above
@@ -15,9 +23,9 @@ routes.use(cors());
routes.options('*', cors());
routes.get('/jobs', (req, res, next) => new RecruitCRMService().getAllJobs(req, res, next));
-
routes.get('/jobs/search', (req, res, next) => new RecruitCRMService().getJobs(req, res, next));
-
routes.get('/jobs/:id', (req, res, next) => new RecruitCRMService().getJob(req, res, next));
+routes.post('/jobs/:id/apply', upload.single('resume'), (req, res, next) => new RecruitCRMService().applyForJob(req, res, next));
+routes.get('/candidates/search', (req, res, next) => new RecruitCRMService().searchCandidates(req, res, next));
export default routes;
diff --git a/src/server/services/communities.js b/src/server/services/communities.js
index a889a7625b..54c797eee3 100644
--- a/src/server/services/communities.js
+++ b/src/server/services/communities.js
@@ -142,6 +142,7 @@ export function getList(userGroupIds) {
description: data.description,
groupIds: data.groupIds,
hidden: data.hidden || false,
+ hideFilter: data.hideFilter || false,
image: data.image,
mainSubdomain: _.get(data, 'subdomains[0]', ''),
});
diff --git a/src/server/services/mmLeaderboard.js b/src/server/services/mmLeaderboard.js
new file mode 100644
index 0000000000..c6c7118ace
--- /dev/null
+++ b/src/server/services/mmLeaderboard.js
@@ -0,0 +1,31 @@
+/* eslint-disable class-methods-use-this */
+/**
+ * Server-side functions necessary for effective integration with MMLeaderboard
+ */
+import { services } from 'topcoder-react-lib';
+
+const { api } = services;
+
+/**
+ * Auxiliary class that handles communication with MMLeaderboard
+ */
+export default class MMLService {
+ /**
+ * getLeaderboard endpoint.
+ * @return {Promise}
+ * @param {Object} the request.
+ */
+ async getLeaderboard(req, res, next) {
+ try {
+ const m2mToken = await api.getTcM2mToken();
+ const v5api = api.getApiV5(m2mToken);
+ const subs = await v5api.get(`/submissions?challengeId=${req.params.id}&page=1&perPage=500`);
+ return res.send({
+ id: req.params.id,
+ subs: await subs.json(),
+ });
+ } catch (err) {
+ return next(err);
+ }
+ }
+}
diff --git a/src/server/services/recruitCRM.js b/src/server/services/recruitCRM.js
index b8659ae824..6c1b712773 100644
--- a/src/server/services/recruitCRM.js
+++ b/src/server/services/recruitCRM.js
@@ -6,6 +6,8 @@ import config from 'config';
import qs from 'qs';
import _ from 'lodash';
+const FormData = require('form-data');
+
/**
* Auxiliary class that handles communication with recruitCRM
*/
@@ -141,4 +143,178 @@ export default class RecruitCRMService {
return next(err);
}
}
+
+ /**
+ * Search for candidate by email endpoint.
+ * @return {Promise}
+ * @param {Object} the request.
+ */
+ async searchCandidates(req, res, next) {
+ try {
+ const response = await fetch(`${this.private.baseUrl}/v1/candidates/search?${qs.stringify(req.query)}`, {
+ method: 'GET',
+ headers: {
+ 'Content-Type': req.headers['content-type'],
+ Authorization: this.private.authorization,
+ },
+ });
+ if (response.status === 429) {
+ await new Promise(resolve => setTimeout(resolve, 30000)); // wait 30sec
+ return this.searchCandidates(req, res, next);
+ }
+ if (response.status >= 400) {
+ return res.send({
+ error: true,
+ status: response.status,
+ url: `${this.private.baseUrl}/v1/candidates/search?${qs.stringify(req.query)}`,
+ });
+ }
+ const data = await response.json();
+ return res.send(data);
+ } catch (err) {
+ return next(err);
+ }
+ }
+
+ /**
+ * Apply for candidate for job endpoint.
+ * @return {Promise}
+ * @param {Object} the request.
+ */
+ async applyForJob(req, res, next) {
+ const { id } = req.params;
+ const { body, file } = req;
+ const form = JSON.parse(body.form);
+ const fileData = new FormData();
+ fileData.append('resume', file.buffer, file.originalname);
+ let candidateSlug;
+ try {
+ // Check if candidate exsits in the system?
+ const candidateResponse = await fetch(`${this.private.baseUrl}/v1/candidates/search?email=${form.email}`, {
+ method: 'GET',
+ headers: {
+ 'Content-Type': req.headers['content-type'],
+ Authorization: this.private.authorization,
+ },
+ });
+ if (candidateResponse.status >= 400) {
+ return res.send({
+ error: true,
+ status: candidateResponse.status,
+ url: `${this.private.baseUrl}/v1/candidates/search?email=${form.email}`,
+ errObj: await candidateResponse.json(),
+ });
+ }
+ let candidateData = await candidateResponse.json();
+ if (candidateData.data) {
+ // Candidate exists we will update profile fields
+ // otherwise we create it
+ candidateSlug = candidateData.data[0].slug;
+ const fieldIndexProfile = _.findIndex(
+ candidateData.data[0].custom_fields, { field_id: 14 },
+ );
+ const fieldIndexForm = _.findIndex(form.custom_fields, { field_id: 14 });
+ if (fieldIndexProfile !== -1 && fieldIndexForm !== -1) {
+ form.custom_fields[fieldIndexForm].value += `;${candidateData.data[0].custom_fields[fieldIndexProfile].value}`;
+ if (form.custom_fields[fieldIndexForm].value.length > 2000) {
+ form.custom_fields[fieldIndexForm].value = form.custom_fields[
+ fieldIndexForm].value.slice(0, 2000);
+ }
+ }
+ }
+ // Create/update candidate profile
+ const workCandidateResponse = await fetch(`${this.private.baseUrl}/v1/candidates${candidateSlug ? `/${candidateSlug}` : ''}`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ Authorization: this.private.authorization,
+ },
+ body: JSON.stringify(form),
+ });
+ if (workCandidateResponse.status >= 400) {
+ return res.send({
+ error: true,
+ status: workCandidateResponse.status,
+ url: `${this.private.baseUrl}/v1/candidates${candidateSlug ? `/${candidateSlug}` : ''}`,
+ form,
+ errObj: await workCandidateResponse.json(),
+ });
+ }
+ candidateData = await workCandidateResponse.json();
+ // Attach resume to candidate
+ const formHeaders = fileData.getHeaders();
+ const fileCandidateResponse = await fetch(`${this.private.baseUrl}/v1/candidates/${candidateData.slug}`, {
+ method: 'POST',
+ headers: {
+ Authorization: this.private.authorization,
+ ...formHeaders,
+ },
+ body: fileData,
+ });
+ if (fileCandidateResponse.status >= 400) {
+ return res.send({
+ error: true,
+ status: fileCandidateResponse.status,
+ url: `${this.private.baseUrl}/v1/candidates/${candidateData.slug}`,
+ form,
+ fileData,
+ file,
+ formHeaders,
+ errObj: await fileCandidateResponse.json(),
+ });
+ }
+ candidateData = await fileCandidateResponse.json();
+ // Candidate ready to apply for job
+ const applyResponse = await fetch(`${this.private.baseUrl}/v1/candidates/${candidateData.slug}/assign?job_slug=${id}`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': req.headers['content-type'],
+ Authorization: this.private.authorization,
+ },
+ });
+ if (applyResponse.status >= 400) {
+ const errObj = await applyResponse.json();
+ if (errObj.errorCode === 422 && errObj.errorMessage === 'Candidate is already assigned to this job') {
+ return res.send({
+ success: true,
+ });
+ }
+ return res.send({
+ error: true,
+ status: applyResponse.status,
+ url: `${this.private.baseUrl}/v1/candidates/${candidateData.slug}/assign?job_slug=${id}`,
+ form,
+ candidateData,
+ errObj,
+ });
+ }
+ // Set hired-stage
+ const hireStageResponse = await fetch(`${this.private.baseUrl}/v1/candidates/${candidateData.slug}/hiring-stages/${id}`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ Authorization: this.private.authorization,
+ },
+ body: JSON.stringify({
+ candidate_slug: candidateData.slug,
+ job_slug: id,
+ status_id: '10',
+ }),
+ });
+ if (hireStageResponse.status >= 400) {
+ return res.send({
+ error: true,
+ status: hireStageResponse.status,
+ url: `$${this.private.baseUrl}/v1/candidates/${candidateData.slug}/hiring-stages/${id}`,
+ form,
+ errObj: await hireStageResponse.json(),
+ });
+ }
+ // respond to API call
+ const data = await applyResponse.json();
+ return res.send(data);
+ } catch (err) {
+ return next(err);
+ }
+ }
}
diff --git a/src/server/tc-communities/blockchain/metadata.json b/src/server/tc-communities/blockchain/metadata.json
index 122170f340..82298c32ea 100644
--- a/src/server/tc-communities/blockchain/metadata.json
+++ b/src/server/tc-communities/blockchain/metadata.json
@@ -5,10 +5,14 @@
"tags": ["Blockchain", "Ethereum"]
}]
},
+ "challengeListing": {
+ "ignoreCommunityFilterByDefault": true
+ },
"communityId": "blockchain",
"communityName": "Blockchain Community",
"groupIds": ["20000010"],
"hideSearch": true,
+ "hideFilter": true,
"logos": [{
"img": "/community-app-assets/themes/blockchain/logo_topcoder_with_name.svg",
"url": "https://www.topcoder.com"
diff --git a/src/server/tc-communities/cognitive/metadata.json b/src/server/tc-communities/cognitive/metadata.json
index 0015366d56..9c0e23333d 100644
--- a/src/server/tc-communities/cognitive/metadata.json
+++ b/src/server/tc-communities/cognitive/metadata.json
@@ -6,6 +6,7 @@
}]
},
"challengeListing": {
+ "ignoreCommunityFilterByDefault": true,
"openChallengesInNewTabs": false
},
"communityId": "cognitive",
@@ -16,6 +17,7 @@
"url": "https://www.topcoder.com"
}],
"hideSearch": true,
+ "hideFilter": true,
"menuItems": [
{
"title": "Home",
diff --git a/src/server/tc-communities/tco19/metadata.json b/src/server/tc-communities/tco19/metadata.json
index d3e84c70ea..77db47c198 100644
--- a/src/server/tc-communities/tco19/metadata.json
+++ b/src/server/tc-communities/tco19/metadata.json
@@ -2,6 +2,7 @@
"challengeFilter": {
"events": ["tco19"]
},
+ "hidden": true,
"communityId": "tco19",
"communityName": "TCO19",
"groupIds": ["20000078"],
diff --git a/src/shared/actions/challenge-listing/index.js b/src/shared/actions/challenge-listing/index.js
index a33623e9b7..62d5db8c49 100644
--- a/src/shared/actions/challenge-listing/index.js
+++ b/src/shared/actions/challenge-listing/index.js
@@ -8,6 +8,8 @@ import { decodeToken } from 'tc-accounts';
import 'isomorphic-fetch';
import { processSRM } from 'utils/tc';
import { errors, services } from 'topcoder-react-lib';
+import { BUCKETS } from 'utils/challenge-listing/buckets';
+import SORT from 'utils/challenge-listing/sort';
const { fireErrorMessage } = errors;
const { getService } = services.challenge;
@@ -16,7 +18,7 @@ const { getReviewOpportunitiesService } = services.reviewOpportunities;
/**
* The maximum number of challenges to fetch in a single API call.
*/
-const PAGE_SIZE = 99;
+const PAGE_SIZE = 10;
/**
* The maximum number of review opportunities to fetch in a single API call.
@@ -31,19 +33,19 @@ const REVIEW_OPPORTUNITY_PAGE_SIZE = 1000;
* @param {Number} page Optional. Next page of challenges to load.
* @param {Array} prev Optional. Challenges loaded so far.
*/
-function getAll(getter, page = 0, prev) {
- /* Amount of challenges to fetch in one API call. 50 is the current maximum
- * amount of challenges the backend returns, event when the larger limit is
- * explicitely required. */
-
- return getter({
- perPage: PAGE_SIZE,
- page: page + 1,
- }).then(({ challenges: chunk }) => {
- if (!chunk.length) return prev || [];
- return getAll(getter, 1 + page, prev ? prev.concat(chunk) : chunk);
- });
-}
+// function getAll(getter, page = 0, prev) {
+// /* Amount of challenges to fetch in one API call. 50 is the current maximum
+// * amount of challenges the backend returns, event when the larger limit is
+// * explicitely required. */
+
+// return getter({
+// perPage: PAGE_SIZE,
+// page: page + 1,
+// }).then(({ challenges: chunk }) => {
+// if (!chunk.length) return prev || [];
+// return getAll(getter, 1 + page, prev ? prev.concat(chunk) : chunk);
+// });
+// }
/**
* Gets possible challenge types.
@@ -77,6 +79,18 @@ function getActiveChallengesInit(uuid, page, frontFilter) {
return { uuid, page, frontFilter };
}
+function getOpenForRegistrationChallengesInit(uuid, page, frontFilter) {
+ return { uuid, page, frontFilter };
+}
+
+function getMyChallengesInit(uuid, page, frontFilter) {
+ return { uuid, page, frontFilter };
+}
+
+function getAllChallengesInit(uuid, page, frontFilter) {
+ return { uuid, page, frontFilter };
+}
+
/**
* Get all challenges and match with user challenges
* @param {String} uuid progress id
@@ -84,70 +98,70 @@ function getActiveChallengesInit(uuid, page, frontFilter) {
* @param {Object} filter filter object
* @param {number} page start page
*/
-function getAllActiveChallengesWithUsersDone(uuid, tokenV3, filter, page = 0) {
- const service = getService(tokenV3);
- const calls = [
- getAll(params => service.getChallenges(filter, params), page),
- ];
- let user;
- if (tokenV3) {
- user = decodeToken(tokenV3).userId;
-
- const newFilter = _.mapKeys(filter, (value, key) => {
- if (key === 'tag') return 'technologies';
-
- return key;
- });
-
- // Handle any errors on this endpoint so that the non-user specific challenges
- // will still be loaded.
- calls.push(getAll(params => service.getUserChallenges(user, newFilter, params)
- .catch(() => ({ challenges: [] }))), page);
- }
- return Promise.all(calls).then(([ch, uch]) => {
- /* uch array contains challenges where the user is participating in
-@@ -111,8 +124,8 @@ function getAllActiveChallengesDone(uuid, tokenV3) {
- * challenges in an efficient way. */
- if (uch) {
- const map = {};
- uch.forEach((item) => { map[item.id] = item; });
- ch.forEach((item) => {
- if (map[item.id]) {
- /* It is fine to reassing, as the array we modifying is created just
- * above within the same function. */
- /* eslint-disable no-param-reassign */
- item.users[user] = true;
- item.userDetails = map[item.id].userDetails;
- /* eslint-enable no-param-reassign */
- }
- });
- }
-
- return { uuid, challenges: ch, ...filter };
- });
-}
+// function getAllActiveChallengesWithUsersDone(uuid, tokenV3, filter, page = 0) {
+// const service = getService(tokenV3);
+// const calls = [
+// getAll(params => service.getChallenges(filter, params), page),
+// ];
+// let user;
+// if (tokenV3) {
+// user = decodeToken(tokenV3).userId;
+
+// const newFilter = _.mapKeys(filter, (value, key) => {
+// if (key === 'tag') return 'technologies';
+
+// return key;
+// });
+
+// // Handle any errors on this endpoint so that the non-user specific challenges
+// // will still be loaded.
+// calls.push(getAll(params => service.getUserChallenges(user, newFilter, params)
+// .catch(() => ({ challenges: [] }))), page);
+// }
+// return Promise.all(calls).then(([ch, uch]) => {
+// /* uch array contains challenges where the user is participating in
+// @@ -111,8 +124,8 @@ function getAllActiveChallengesDone(uuid, tokenV3) {
+// * challenges in an efficient way. */
+// if (uch) {
+// const map = {};
+// uch.forEach((item) => { map[item.id] = item; });
+// ch.forEach((item) => {
+// if (map[item.id]) {
+// /* It is fine to reassing, as the array we modifying is created just
+// * above within the same function. */
+// /* eslint-disable no-param-reassign */
+// item.users[user] = true;
+// item.userDetails = map[item.id].userDetails;
+// /* eslint-enable no-param-reassign */
+// }
+// });
+// }
+
+// return { uuid, challenges: ch, ...filter };
+// });
+// }
/** TODO: Inspect if the 2 actions bellow can be removed?
* They do duplicate what is done in `getActiveChallengesDone` but fetch all challenges
* which was refactored in listing-improve
*/
-function getAllActiveChallengesInit(uuid) {
- return uuid;
-}
-function getAllActiveChallengesDone(uuid, tokenV3) {
- const filter = { status: 'Active' };
- return getAllActiveChallengesWithUsersDone(uuid, tokenV3, filter);
-}
-
-function getAllUserChallengesInit(uuid) {
- return uuid;
-}
-
-function getAllUserChallengesDone(uuid, tokenV3) {
- const memberId = decodeToken(tokenV3).userId;
- const filter = { status: 'Active', memberId };
- return getAllActiveChallengesWithUsersDone(uuid, tokenV3, filter);
-}
+// function getAllActiveChallengesInit(uuid) {
+// return uuid;
+// }
+// function getAllActiveChallengesDone(uuid, tokenV3) {
+// const filter = { status: 'Active' };
+// return getAllActiveChallengesWithUsersDone(uuid, tokenV3, filter);
+// }
+
+// function getAllUserChallengesInit(uuid) {
+// return uuid;
+// }
+
+// function getAllUserChallengesDone(uuid, tokenV3) {
+// const memberId = decodeToken(tokenV3).userId;
+// const filter = { status: 'Active', memberId };
+// return getAllActiveChallengesWithUsersDone(uuid, tokenV3, filter);
+// }
/**
* Gets 1 page of active challenges (including marathon matches) from the backend.
@@ -165,75 +179,189 @@ function getAllUserChallengesDone(uuid, tokenV3) {
* @return {Promise}
*/
function getActiveChallengesDone(uuid, page, backendFilter, tokenV3, frontFilter = {}) {
+ const { sorts } = frontFilter;
+ const filter = {
+ backendFilter,
+ frontFilter: {
+ ...frontFilter,
+ status: 'Active',
+ currentPhaseName: 'Submission',
+ registrationEndDateEnd: new Date().toISOString(),
+ perPage: PAGE_SIZE,
+ page: page + 1,
+ sortBy: sorts[BUCKETS.ONGOING],
+ sortOrder: SORT[sorts[BUCKETS.ONGOING]].order,
+ },
+ };
+ delete filter.frontFilter.sorts;
+ const service = getService(tokenV3);
+ return service.getChallenges(filter).then(ch => ({
+ uuid,
+ challenges: ch.challenges,
+ meta: ch.meta,
+ frontFilter,
+ }));
+ // const calls = [
+ // service.getChallenges(filter, {
+ // perPage: PAGE_SIZE,
+ // page: page + 1,
+ // }),
+ // ];
+ // let user;
+ // if (tokenV3) {
+ // user = decodeToken(tokenV3).userId;
+
+ // // Handle any errors on this endpoint so that the non-user specific challenges
+ // // will still be loaded.
+ // calls.push(service.getUserChallenges(user, filter, {})
+ // .catch(() => ({ challenges: [] })));
+ // }
+ // return Promise.all(calls).then(([ch]) => ({
+ // uuid,
+ // challenges: ch.challenges,
+ // meta: ch.meta,
+ // frontFilter,
+ // }));
+}
+
+function getOpenForRegistrationChallengesDone(uuid, page, backendFilter,
+ tokenV3, frontFilter = {}) {
+ const { sorts } = frontFilter;
const filter = {
- ...backendFilter,
- status: 'Active',
+ backendFilter,
+ frontFilter: {
+ ...frontFilter,
+ status: 'Active',
+ currentPhaseName: 'Registration',
+ perPage: PAGE_SIZE,
+ page: page + 1,
+ sortBy: sorts[BUCKETS.OPEN_FOR_REGISTRATION],
+ sortOrder: SORT[sorts[BUCKETS.OPEN_FOR_REGISTRATION]].order,
+ },
};
+ delete filter.frontFilter.sorts;
const service = getService(tokenV3);
- const calls = [
- service.getChallenges(filter, {
+ return service.getChallenges(filter).then(ch => ({
+ uuid,
+ openForRegistrationChallenges: ch.challenges,
+ meta: ch.meta,
+ frontFilter,
+ }));
+}
+
+function getMyChallengesDone(uuid, page, backendFilter, tokenV3, frontFilter = {}) {
+ const userId = decodeToken(tokenV3).userId.toString();
+ const { sorts } = frontFilter;
+ const filter = {
+ backendFilter,
+ frontFilter: {
+ ...frontFilter,
+ status: 'Active',
+ memberId: userId,
perPage: PAGE_SIZE,
page: page + 1,
- }),
- ];
- let user;
- if (tokenV3) {
- user = decodeToken(tokenV3).userId;
-
- // Handle any errors on this endpoint so that the non-user specific challenges
- // will still be loaded.
- calls.push(service.getUserChallenges(user, filter, {})
- .catch(() => ({ challenges: [] })));
+ sortBy: sorts[BUCKETS.MY],
+ sortOrder: SORT[sorts[BUCKETS.MY]].order,
+ },
+ };
+ delete filter.frontFilter.sorts;
+ const service = getService(tokenV3);
+ return service.getChallenges(filter).then(ch => ({
+ uuid,
+ myChallenges: ch.challenges,
+ meta: ch.meta,
+ frontFilter,
+ }));
+}
+
+function getAllChallengesDone(uuid, page, backendFilter, tokenV3, frontFilter = {}) {
+ const { sorts, status } = frontFilter;
+ const filter = {
+ backendFilter,
+ frontFilter: {
+ ...frontFilter,
+ perPage: PAGE_SIZE,
+ page: page + 1,
+ sortBy: sorts[BUCKETS.ALL],
+ sortOrder: SORT[sorts[BUCKETS.ALL]].order,
+ },
+ };
+ delete filter.frontFilter.sorts;
+ if (status === 'All') {
+ delete filter.frontFilter.status;
}
- return Promise.all(calls).then(([ch]) => ({
+ const service = getService(tokenV3);
+ return service.getChallenges(filter).then(ch => ({
uuid,
- challenges: ch.challenges,
+ allChallenges: ch.challenges,
meta: ch.meta,
frontFilter,
}));
}
+function getTotalChallengesCountInit(uuid) {
+ return { uuid };
+}
+
+function getTotalChallengesCountDone(uuid, tokenV3, frontFilter = {}) {
+ const filter = {
+ backendFilter: {},
+ frontFilter: {
+ ...frontFilter,
+ status: 'Active',
+ isLightweight: true,
+ perPage: 1,
+ },
+ };
+ delete filter.frontFilter.sorts;
+ const service = getService(tokenV3);
+ return service.getChallenges(filter).then(ch => ({
+ uuid,
+ meta: ch.meta,
+ }));
+}
+
/**
* Init loading of all challenges
* @param {String} uuid
*/
-function getRestActiveChallengesInit(uuid) {
- return { uuid };
-}
+// function getRestActiveChallengesInit(uuid) {
+// return { uuid };
+// }
/**
* Loading all challenges
* @param {String} uuid progress id
* @param {String} tokenV3 token v3
*/
-function getRestActiveChallengesDone(uuid, tokenV3, filter) {
- const mergedFilter = {
- ...filter,
- status: 'Active',
- };
- return getAllActiveChallengesWithUsersDone(uuid, tokenV3, mergedFilter, 1);
-}
+// function getRestActiveChallengesDone(uuid, tokenV3, filter) {
+// const mergedFilter = {
+// ...filter,
+// status: 'Active',
+// };
+// return getAllActiveChallengesWithUsersDone(uuid, tokenV3, mergedFilter, 1);
+// }
/**
* Prepare for getting all recommended challenges
* @param {String} uuid progress id
*/
-function getAllRecommendedChallengesInit(uuid) {
- return uuid;
-}
+// function getAllRecommendedChallengesInit(uuid) {
+// return uuid;
+// }
/**
* Get all recommended challenges
* @param {String} uuid progress id
* @param {String} tokenV3 token v3
* @param {*} recommendedTags recommended tags
*/
-function getAllRecommendedChallengesDone(uuid, tokenV3, recommendedTags) {
- const filter = {
- status: 'Active',
- ...(!_.isEmpty(recommendedTags) && { tag: recommendedTags }),
- };
- return getAllActiveChallengesWithUsersDone(uuid, tokenV3, filter);
-}
+// function getAllRecommendedChallengesDone(uuid, tokenV3, recommendedTags) {
+// const filter = {
+// status: 'Active',
+// ...(!_.isEmpty(recommendedTags) && { tag: recommendedTags }),
+// };
+// return getAllActiveChallengesWithUsersDone(uuid, tokenV3, filter);
+// }
/**
* Notifies the state that we are about to load the specified page of past
@@ -243,9 +371,9 @@ function getAllRecommendedChallengesDone(uuid, tokenV3, recommendedTags) {
* @param {Object} frontFilter
* @return {Object}
*/
-function getPastChallengesInit(uuid, page, frontFilter) {
- return { uuid, page, frontFilter };
-}
+// function getPastChallengesInit(uuid, page, frontFilter) {
+// return { uuid, page, frontFilter };
+// }
/**
* Gets the specified page of past challenges (including MMs).
@@ -255,16 +383,27 @@ function getPastChallengesInit(uuid, page, frontFilter) {
* @param {Object} frontFilter Optional. Original frontend filter.
* @param {Object}
*/
-function getPastChallengesDone(uuid, page, filter, tokenV3, frontFilter = {}) {
- const service = getService(tokenV3);
- return service.getChallenges({
- ...filter,
- status: 'Completed',
- }, {
- perPage: PAGE_SIZE,
- page: page + 1,
- }).then(({ challenges }) => ({ uuid, challenges, frontFilter }));
-}
+// function getPastChallengesDone(uuid, page, backendFilter, tokenV3, frontFilter = {}) {
+// const { sorts } = frontFilter;
+// const filter = {
+// backendFilter,
+// frontFilter: {
+// ...frontFilter,
+// status: 'Completed',
+// perPage: PAGE_SIZE,
+// page: page + 1,
+// sortBy: sorts[BUCKETS.PAST],
+// sortOrder: SORT[sorts[BUCKETS.PAST]].order,
+// },
+// };
+// delete filter.frontFilter.sorts;
+// const service = getService(tokenV3);
+// return service.getChallenges(filter).then(({ challenges }) => ({
+// uuid,
+// pastChallenges: challenges,
+// frontFilter,
+// }));
+// }
/**
* Action to get a list of currently open Review Opportunities using V3 API
@@ -326,54 +465,71 @@ function getSrmsDone(uuid, handle, params, tokenV3) {
* Payload creator for the action that initialize user registered challenges.
* @param {String} uuid
* @return {String}
- */
-function getUserChallengesInit(uuid) {
- return { uuid };
-}
-
-/**
- * Payload creator for the action that loads user registered challenges.
- * @param {String} userId
- * @return {String}
- */
-function getUserChallengesDone(userId, tokenV3) {
- const service = getService(tokenV3);
-
- return service.getUserResources(userId, 1, 10000)
- .then(item => item)
- .catch((error) => {
- fireErrorMessage('Error Getting User Challenges', error.content || error);
- return Promise.reject(error);
- });
-}
+// */
+// function getUserChallengesInit(uuid) {
+// return { uuid };
+// }
+
+// /**
+// * Payload creator for the action that loads user registered challenges.
+// * @param {String} userId
+// * @return {String}
+// */
+// function getUserChallengesDone(userId, tokenV3) {
+// const service = getService(tokenV3);
+
+// return service.getUserResources(userId)
+// .then(item => item)
+// .catch((error) => {
+// fireErrorMessage('Error Getting User Challenges', error.content || error);
+// return Promise.reject(error);
+// });
+// }
export default createActions({
CHALLENGE_LISTING: {
DROP_CHALLENGES: _.noop,
+ DROP_ACTIVE_CHALLENGES: _.noop,
+ DROP_OPEN_FOR_REGISTRATION_CHALLENGES: _.noop,
+ DROP_MY_CHALLENGES: _.noop,
+ DROP_ALL_CHALLENGES: _.noop,
+ DROP_PAST_CHALLENGES: _.noop,
+
+ // GET_ALL_ACTIVE_CHALLENGES_INIT: getAllActiveChallengesInit,
+ // GET_ALL_ACTIVE_CHALLENGES_DONE: getAllActiveChallengesDone,
- GET_ALL_ACTIVE_CHALLENGES_INIT: getAllActiveChallengesInit,
- GET_ALL_ACTIVE_CHALLENGES_DONE: getAllActiveChallengesDone,
+ // GET_ALL_USER_CHALLENGES_INIT: getAllUserChallengesInit,
+ // GET_ALL_USER_CHALLENGES_DONE: getAllUserChallengesDone,
- GET_ALL_USER_CHALLENGES_INIT: getAllUserChallengesInit,
- GET_ALL_USER_CHALLENGES_DONE: getAllUserChallengesDone,
+ // GET_ALL_RECOMMENDED_CHALLENGES_INIT: getAllRecommendedChallengesInit,
+ // GET_ALL_RECOMMENDED_CHALLENGES_DONE: getAllRecommendedChallengesDone,
- GET_ALL_RECOMMENDED_CHALLENGES_INIT: getAllRecommendedChallengesInit,
- GET_ALL_RECOMMENDED_CHALLENGES_DONE: getAllRecommendedChallengesDone,
+ GET_ALL_CHALLENGES_INIT: getAllChallengesInit,
+ GET_ALL_CHALLENGES_DONE: getAllChallengesDone,
GET_ACTIVE_CHALLENGES_INIT: getActiveChallengesInit,
GET_ACTIVE_CHALLENGES_DONE: getActiveChallengesDone,
- GET_REST_ACTIVE_CHALLENGES_INIT: getRestActiveChallengesInit,
- GET_REST_ACTIVE_CHALLENGES_DONE: getRestActiveChallengesDone,
+ GET_OPEN_FOR_REGISTRATION_CHALLENGES_INIT: getOpenForRegistrationChallengesInit,
+ GET_OPEN_FOR_REGISTRATION_CHALLENGES_DONE: getOpenForRegistrationChallengesDone,
+
+ GET_MY_CHALLENGES_INIT: getMyChallengesInit,
+ GET_MY_CHALLENGES_DONE: getMyChallengesDone,
+
+ // GET_REST_ACTIVE_CHALLENGES_INIT: getRestActiveChallengesInit,
+ // GET_REST_ACTIVE_CHALLENGES_DONE: getRestActiveChallengesDone,
GET_CHALLENGE_TYPES_INIT: _.noop,
GET_CHALLENGE_TYPES_DONE: getChallengeTypesDone,
+ GET_TOTAL_CHALLENGES_COUNT_INIT: getTotalChallengesCountInit,
+ GET_TOTAL_CHALLENGES_COUNT_DONE: getTotalChallengesCountDone,
+
GET_CHALLENGE_TAGS_INIT: _.noop,
GET_CHALLENGE_TAGS_DONE: getChallengeTagsDone,
- GET_PAST_CHALLENGES_INIT: getPastChallengesInit,
- GET_PAST_CHALLENGES_DONE: getPastChallengesDone,
+ // GET_PAST_CHALLENGES_INIT: getPastChallengesInit,
+ // GET_PAST_CHALLENGES_DONE: getPastChallengesDone,
GET_REVIEW_OPPORTUNITIES_INIT: (uuid, page) => ({ uuid, page }),
GET_REVIEW_OPPORTUNITIES_DONE: getReviewOpportunitiesDone,
@@ -381,8 +537,8 @@ export default createActions({
GET_SRMS_INIT: getSrmsInit,
GET_SRMS_DONE: getSrmsDone,
- GET_USER_CHALLENGES_INIT: getUserChallengesInit,
- GET_USER_CHALLENGES_DONE: getUserChallengesDone,
+ // GET_USER_CHALLENGES_INIT: getUserChallengesInit,
+ // GET_USER_CHALLENGES_DONE: getUserChallengesDone,
EXPAND_TAG: id => id,
diff --git a/src/shared/actions/challenge-listing/sidebar.js b/src/shared/actions/challenge-listing/sidebar.js
index 98fb81ce5e..d126b08bc2 100644
--- a/src/shared/actions/challenge-listing/sidebar.js
+++ b/src/shared/actions/challenge-listing/sidebar.js
@@ -4,18 +4,18 @@
import _ from 'lodash';
import { createActions } from 'redux-actions';
-import { services } from 'topcoder-react-lib';
+// import { services } from 'topcoder-react-lib';
-const { getUserSettingsService } = services.userSetting;
+// const { getUserSettingsService } = services.userSetting;
/**
* Changes name of the specified filter (but does not save it to the backend).
* @param {String} index
* @param {String} name
*/
-function changeFilterName(index, name) {
- return { index, name };
-}
+// function changeFilterName(index, name) {
+// return { index, name };
+// }
/**
* Deletes saved filter.
@@ -23,10 +23,10 @@ function changeFilterName(index, name) {
* @param {Object} tokenV2
* @return {Promise}
*/
-function deleteSavedFilter(id, tokenV2) {
- return getUserSettingsService(tokenV2)
- .deleteFilter(id).then(() => id);
-}
+// function deleteSavedFilter(id, tokenV2) {
+// return getUserSettingsService(tokenV2)
+// .deleteFilter(id).then(() => id);
+// }
/**
* Handles drag move event.
@@ -44,22 +44,22 @@ function deleteSavedFilter(id, tokenV2) {
* with DOM, and, most probably, it is just easier to adopt some 3-rd party
* Drag-n-Drop library, then to find out a work-around.
*/
-function dragSavedFilterMove(dragEvent, dragState) {
- /* For a reason not clear to me, shortly after starting to drag a filter,
- * and also when the user releases the mouse button, thus ending the drag,
- * this handler gets an event with 'screenY' position equal 0. This breaks
- * the dragging handling, which works just fine otherwise. Hence, this simple
- * fix of the issue, until the real problem is figured out.
- */
- if (!dragEvent.screenY) return dragState;
-
- /* Calculation of the target position of the dragged item inside the filters
- * array. */
- const shift = (dragEvent.screenY - dragState.y) / dragEvent.target.offsetHeight;
- const index = Math.round(dragState.startIndex + shift);
- if (index === dragState.index) return dragState;
- return { ...dragState, currentIndex: index };
-}
+// function dragSavedFilterMove(dragEvent, dragState) {
+/* For a reason not clear to me, shortly after starting to drag a filter,
+ * and also when the user releases the mouse button, thus ending the drag,
+ * this handler gets an event with 'screenY' position equal 0. This breaks
+ * the dragging handling, which works just fine otherwise. Hence, this simple
+ * fix of the issue, until the real problem is figured out.
+ */
+// if (!dragEvent.screenY) return dragState;
+
+// /* Calculation of the target position of the dragged item inside the filters
+// * array. */
+// const shift = (dragEvent.screenY - dragState.y) / dragEvent.target.offsetHeight;
+// const index = Math.round(dragState.startIndex + shift);
+// if (index === dragState.index) return dragState;
+// return { ...dragState, currentIndex: index };
+// }
/**
* Initializes drag of a filter item.
@@ -67,17 +67,17 @@ function dragSavedFilterMove(dragEvent, dragState) {
* @param {Object} dragEvent
* @return {Object}
*/
-function dragSavedFilterStart(index, dragEvent) {
- return {
- currentIndex: index,
- startIndex: index,
- y: dragEvent.screenY,
- };
-}
-
-function getSavedFilters(tokenV2) {
- return getUserSettingsService(tokenV2).getFilters();
-}
+// function dragSavedFilterStart(index, dragEvent) {
+// return {
+// currentIndex: index,
+// startIndex: index,
+// y: dragEvent.screenY,
+// };
+// }
+
+// function getSavedFilters(tokenV2) {
+// return getUserSettingsService(tokenV2).getFilters();
+// }
/**
* After changing filter name with changeFilterName(..) this action can be used
@@ -85,9 +85,9 @@ function getSavedFilters(tokenV2) {
* as the last saved name is kept inside the state.
* @param {String} index
*/
-function resetFilterName(index) {
- return index;
-}
+// function resetFilterName(index) {
+// return index;
+// }
/**
* Saves filter to the backend.
@@ -96,10 +96,10 @@ function resetFilterName(index) {
* @param {String} tokenV2
* @return {Promise}
*/
-function saveFilter(name, filter, tokenV2) {
- return getUserSettingsService(tokenV2)
- .saveFilter(name, filter);
-}
+// function saveFilter(name, filter, tokenV2) {
+// return getUserSettingsService(tokenV2)
+// .saveFilter(name, filter);
+// }
/**
* Updates all saved filters (basically to update their ordering in the
@@ -107,10 +107,10 @@ function saveFilter(name, filter, tokenV2) {
* @param {Array} savedFilters
* @param {String} tokenV2
*/
-function updateAllSavedFilters(savedFilters, tokenV2) {
- const service = getUserSettingsService(tokenV2);
- savedFilters.forEach(filter => service.updateFilter(filter.id, filter.name, filter.filter));
-}
+// function updateAllSavedFilters(savedFilters, tokenV2) {
+// const service = getUserSettingsService(tokenV2);
+// savedFilters.forEach(filter => service.updateFilter(filter.id, filter.name, filter.filter));
+// }
/**
* Saves updated fitler to the backend.
@@ -118,41 +118,41 @@ function updateAllSavedFilters(savedFilters, tokenV2) {
* @param {String} tokenV2
* @return {Promise}
*/
-function updateSavedFilter(filter, tokenV2) {
- return getUserSettingsService(tokenV2)
- .updateFilter(filter.id, filter.name, filter.filter);
-}
+// function updateSavedFilter(filter, tokenV2) {
+// return getUserSettingsService(tokenV2)
+// .updateFilter(filter.id, filter.name, filter.filter);
+// }
export default createActions({
CHALLENGE_LISTING: {
SIDEBAR: {
- CHANGE_FILTER_NAME: changeFilterName,
+ // CHANGE_FILTER_NAME: changeFilterName,
- DELETE_SAVED_FILTER: deleteSavedFilter,
+ // DELETE_SAVED_FILTER: deleteSavedFilter,
- DRAG_SAVED_FILTER_MOVE: dragSavedFilterMove,
- DRAG_SAVED_FILTER_START: dragSavedFilterStart,
+ // DRAG_SAVED_FILTER_MOVE: dragSavedFilterMove,
+ // DRAG_SAVED_FILTER_START: dragSavedFilterStart,
- GET_SAVED_FILTERS: getSavedFilters,
+ // GET_SAVED_FILTERS: getSavedFilters,
- RESET_FILTER_NAME: resetFilterName,
+ // RESET_FILTER_NAME: resetFilterName,
- SAVE_FILTER_DONE: saveFilter,
+ // SAVE_FILTER_DONE: saveFilter,
- SAVE_FILTER_INIT: _.noop,
+ // SAVE_FILTER_INIT: _.noop,
/* Pass in the bucket type. */
- SELECT_BUCKET: _.identity,
+ SELECT_BUCKET: (bucket, expanding = false) => ({ bucket, expanding }),
SELECT_BUCKET_DONE: _.noop,
/* Pass in the index of filter inside savedFilters array. */
- SELECT_SAVED_FILTER: _.identity,
+ // SELECT_SAVED_FILTER: _.identity,
/* Pass in true/false to enable/disable. */
- SET_EDIT_SAVED_FILTERS_MODE: _.identity,
+ // SET_EDIT_SAVED_FILTERS_MODE: _.identity,
- UPDATE_ALL_SAVED_FILTERS: updateAllSavedFilters,
- UPDATE_SAVED_FILTER: updateSavedFilter,
+ // UPDATE_ALL_SAVED_FILTERS: updateAllSavedFilters,
+ // UPDATE_SAVED_FILTER: updateSavedFilter,
},
},
});
diff --git a/src/shared/actions/mmLeaderboard.js b/src/shared/actions/mmLeaderboard.js
new file mode 100644
index 0000000000..59159a589a
--- /dev/null
+++ b/src/shared/actions/mmLeaderboard.js
@@ -0,0 +1,48 @@
+import { redux } from 'topcoder-react-utils';
+import Service from 'services/mmLeaderboard';
+import _ from 'lodash';
+
+/**
+ * Fetch init
+ */
+function getMMLeaderboardInit(id) {
+ return { id };
+}
+
+/**
+ * Fetch done
+ */
+async function getMMLeaderboardDone(id) {
+ const ss = new Service();
+ const res = await ss.getMMLeaderboard(id);
+ let data = [];
+ if (res) {
+ const groupedData = _.groupBy(res.subs, 'createdBy');
+ _.each(groupedData, (subs, handle) => {
+ const sortedSubs = _.orderBy(subs, ['updated'], ['desc']);
+ const scores = _.orderBy(_.compact(sortedSubs[0].review), ['updated'], ['desc']);
+ data.push({
+ createdBy: handle,
+ updated: sortedSubs[0].submittedDate,
+ id: sortedSubs[0].id,
+ score: scores && scores.length ? scores[0].score : '...',
+ });
+ });
+ data = _.orderBy(data, ['score', 'updated'], ['desc']).map((r, i) => ({
+ ...r,
+ rank: i + 1,
+ score: r.score % 1 ? Number(r.score).toFixed(5) : r.score,
+ }));
+ }
+ return {
+ id,
+ data,
+ };
+}
+
+export default redux.createActions({
+ MMLEADERBOARD: {
+ GET_MML_INIT: getMMLeaderboardInit,
+ GET_MML_DONE: getMMLeaderboardDone,
+ },
+});
diff --git a/src/shared/actions/recruitCRM.js b/src/shared/actions/recruitCRM.js
index 670b71878a..544f9deb76 100644
--- a/src/shared/actions/recruitCRM.js
+++ b/src/shared/actions/recruitCRM.js
@@ -1,5 +1,6 @@
import { redux } from 'topcoder-react-utils';
import Service from 'services/recruitCRM';
+import _ from 'lodash';
/**
* Jobs page fetch init
@@ -40,11 +41,96 @@ async function getJobDone(id) {
};
}
+/**
+ * Apply for Job init
+ */
+function applyForJobInit(job, payload) {
+ return { id: job.slug, payload };
+}
+
+/**
+ * Helper utitlity
+ * @param {object} joib The job object
+ * @param {object} payload The apply form payload
+ */
+function normalizeRecruitPayload(job, payload) {
+ const perJob = [
+ `${job.name} ->`,
+ `Pay Expectation: ${payload.payExpectation}`,
+ `Date Available: ${new Date(payload.availFrom).toDateString()}`,
+ `Heard About Gig: ${payload.reffereal}`,
+ `Why fit: ${payload.whyFit}`,
+ `Availability Per Week: ${payload.timeAvailability.filter(s => s.checked).map(s => s.label).join(',')}`,
+ `Able to work during timezone? ${payload.timezoneConfirm.filter(s => s.value).map(s => s.label).join(',')}`,
+ `Am I ok to work the duration? ${payload.durationConfirm.filter(s => s.value).map(s => s.label).join(',')}`,
+ `Notes: ${payload.notes}`,
+ ];
+ return {
+ last_name: payload.lname,
+ first_name: payload.fname,
+ email: payload.email,
+ contact_number: payload.phone,
+ city: payload.city,
+ locality: _.find(payload.country, { selected: true }).label,
+ available_from: payload.availFrom,
+ salary_expectation: payload.payExpectation,
+ skill: payload.skills.filter(s => s.selected).map(s => s.label).join(','),
+ custom_fields: [
+ {
+ field_id: 13,
+ value: payload.reffereal || '',
+ },
+ {
+ field_id: 1,
+ value: payload.tcProfileLink || (payload.handle ? `topcoder.com/members/${payload.handle}` : ''),
+ },
+ {
+ field_id: 2,
+ value: payload.handle || '',
+ },
+ {
+ field_id: 3,
+ value: payload.whyFit || '',
+ },
+ {
+ field_id: 14,
+ value: perJob.join(','),
+ },
+ ],
+ resume: payload.fileCV,
+ };
+}
+
+/**
+ * Apply for Job done
+ */
+async function applyForJobDone(job, payload) {
+ const ss = new Service();
+ try {
+ const res = await ss.applyForJob(job.slug, normalizeRecruitPayload(job, payload));
+
+ return {
+ id: job.slug,
+ data: res,
+ };
+ } catch (error) {
+ return {
+ id: job.slug,
+ data: {
+ error: true,
+ errorObj: error,
+ },
+ };
+ }
+}
+
export default redux.createActions({
RECRUIT: {
GET_JOBS_INIT: getJobsInit,
GET_JOBS_DONE: getJobsDone,
GET_JOB_INIT: getJobInit,
GET_JOB_DONE: getJobDone,
+ APPLY_FOR_JOB_INIT: applyForJobInit,
+ APPLY_FOR_JOB_DONE: applyForJobDone,
},
});
diff --git a/src/shared/components/ChallengeTile/index.jsx b/src/shared/components/ChallengeTile/index.jsx
index 87f935e7fe..c1611df3dd 100644
--- a/src/shared/components/ChallengeTile/index.jsx
+++ b/src/shared/components/ChallengeTile/index.jsx
@@ -82,8 +82,8 @@ class ChallengeTile extends React.Component {
margin: '10px 5px',
};
- const isDevelopment = track === COMPETITION_TRACKS.DEVELOP;
- const isDesign = track === COMPETITION_TRACKS.DESIGN;
+ const isDevelopment = track === COMPETITION_TRACKS.DEV;
+ const isDesign = track === COMPETITION_TRACKS.DES;
return (
@@ -108,7 +108,7 @@ class ChallengeTile extends React.Component {
{underscoreReplace(type)}
- {formatDate(challenge.submissionEndDate)}
+ {challenge.submissionEndDate && formatDate(challenge.submissionEndDate)}
{ challenge.wonFirst && !challenge.isPrivate
&& (
@@ -308,7 +308,7 @@ class ChallengeTile extends React.Component {
- { track !== COMPETITION_TRACKS.DATA_SCIENCE
+ { track !== COMPETITION_TRACKS.DS
&& (
diff --git a/src/shared/components/Contentful/AppComponent/index.jsx b/src/shared/components/Contentful/AppComponent/index.jsx
index 5238ae7638..47251bfcfc 100644
--- a/src/shared/components/Contentful/AppComponent/index.jsx
+++ b/src/shared/components/Contentful/AppComponent/index.jsx
@@ -10,6 +10,8 @@ import React from 'react';
import { errors } from 'topcoder-react-lib';
import Leaderboard from 'containers/tco/Leaderboard';
import RecruitCRMJobs from 'containers/Gigs/RecruitCRMJobs';
+import EmailSubscribeForm from 'containers/EmailSubscribeForm';
+
const { fireErrorMessage } = errors;
@@ -32,7 +34,10 @@ export function AppComponentSwitch(appComponent) {
);
}
if (appComponent.fields.type === 'RecruitCRM-Jobs') {
- return ;
+ return ;
+ }
+ if (appComponent.fields.type === 'EmailSubscribeForm') {
+ return ;
}
fireErrorMessage('Unsupported app component type from contentful', '');
return null;
diff --git a/src/shared/components/Contentful/ChallengesBlock/Card/index.jsx b/src/shared/components/Contentful/ChallengesBlock/Card/index.jsx
index 3c51580da6..565036305b 100644
--- a/src/shared/components/Contentful/ChallengesBlock/Card/index.jsx
+++ b/src/shared/components/Contentful/ChallengesBlock/Card/index.jsx
@@ -30,13 +30,13 @@ export default function Card({
let TrackTag;
switch (track.toLowerCase()) {
- case COMPETITION_TRACKS.DATA_SCIENCE:
+ case COMPETITION_TRACKS.DS:
TrackTag = DataScienceTrackTag;
break;
- case COMPETITION_TRACKS.DESIGN:
+ case COMPETITION_TRACKS.DES:
TrackTag = DesignTrackTag;
break;
- case COMPETITION_TRACKS.DEVELOP:
+ case COMPETITION_TRACKS.DEV:
TrackTag = DevelopmentTrackTag;
break;
case COMPETITION_TRACKS.QA:
diff --git a/src/shared/components/Contentful/Modal/index.jsx b/src/shared/components/Contentful/Modal/index.jsx
index 196dc72074..55fcd996c2 100644
--- a/src/shared/components/Contentful/Modal/index.jsx
+++ b/src/shared/components/Contentful/Modal/index.jsx
@@ -9,12 +9,14 @@ import LoadingIndicator from 'components/LoadingIndicator';
import Banner from 'components/Contentful/Banner';
import ContentBlock from 'components/Contentful/ContentBlock';
import Viewport from 'components/Contentful/Viewport';
-import { Modal } from 'topcoder-react-ui-kit';
+import { Modal, PrimaryButton } from 'topcoder-react-ui-kit';
import { errors } from 'topcoder-react-lib';
import { themr } from 'react-css-super-themr';
import classnames from 'classnames';
+import tc from 'components/buttons/themed/tc.scss';
+import { fixStyle } from 'utils/contentful';
-import defaultModalTheme from 'components/Leaderboard/ChallengeHistoryModal/styles.scss';
+import defaultModalTheme from './modal-styles.scss';
import defaultStyle from './style.scss';
const { fireErrorMessage } = errors;
@@ -89,6 +91,9 @@ class ContentfulModal extends React.Component {
renderPlaceholder={LoadingIndicator}
render={(data) => {
const contentId = _.get(data, `entries.items.${id}.fields.content.sys.id`);
+ const hideDismissIcon = _.get(data, `entries.items.${id}.fields.hideDismissIcon`);
+ const hideCloseButton = _.get(data, `entries.items.${id}.fields.hideCloseButton`);
+ const extraStylesForContainer = _.get(data, `entries.items.${id}.fields.extraStylesForContainer`);
if (!contentId) return null;
return (
@@ -107,16 +112,20 @@ class ContentfulModal extends React.Component {
onCancel={this.onCloseModal}
theme={defaultModalTheme}
>
- { this.dismissButtonRef = node; }}
- >
- ×
-
+ {
+ !hideDismissIcon && (
+ { this.dismissButtonRef = node; }}
+ >
+ ×
+
+ )
+ }
+ {
+ !hideCloseButton && (
+
+ )
+ }
)}
@@ -160,6 +185,7 @@ ContentfulModal.propTypes = {
theme: PT.shape({
modalTrigger: PT.string,
dismissButton: PT.any,
+ closeButton: PT.any,
}),
preview: PT.bool,
spaceName: PT.string,
diff --git a/src/shared/components/Contentful/Modal/modal-styles.scss b/src/shared/components/Contentful/Modal/modal-styles.scss
new file mode 100644
index 0000000000..8e3bf60873
--- /dev/null
+++ b/src/shared/components/Contentful/Modal/modal-styles.scss
@@ -0,0 +1,188 @@
+@import "~styles/mixins";
+
+$light-gray: #d4d4d4;
+
+.container {
+ @include roboto-regular;
+
+ color: $tc-gray-50;
+ background: $tc-white;
+ border-radius: 10px;
+ top: 50%;
+ width: auto;
+ max-height: 90%;
+ overflow-y: auto;
+
+ @media (max-width: 768px) {
+ width: 80%;
+ }
+
+ h3 {
+ color: #1e94a3;
+ font-family: BarlowCondensed, sans-serif;
+ font-size: 34px;
+ font-weight: 500;
+ line-height: 38px;
+ text-align: center;
+ margin-bottom: 60px;
+ text-transform: uppercase;
+
+ @media (max-width: 768px) {
+ font-size: 31px !important;
+ font-weight: 500 !important;
+ line-height: 33px !important;
+ margin-bottom: 30px;
+ }
+ }
+}
+
+.overlay {
+ background-color: #2a2a2a;
+ opacity: 0.95;
+ border: none;
+ height: 100%;
+ left: 0;
+ outline: none;
+ position: fixed;
+ top: 0;
+ width: 100%;
+ z-index: 998;
+}
+
+.podium-spot-wrapper {
+ text-align: center;
+ display: flex;
+ justify-content: center;
+ margin-bottom: 50px;
+
+ > div > span {
+ height: 128px;
+ width: 128px;
+
+ img,
+ svg {
+ border-radius: 50%;
+ border-style: solid;
+ border-width: 3px;
+ height: 100%;
+ width: 100%;
+ }
+ }
+}
+
+.history-table {
+ width: 100%;
+ margin-bottom: 62px;
+
+ thead {
+ th {
+ color: #2a2a2a;
+ font-family: Roboto, sans-serif;
+ font-size: 14px;
+ font-weight: 500;
+ letter-spacing: 0.5px;
+ line-height: 18px;
+ text-align: left;
+ text-transform: uppercase;
+ border-bottom: 1px solid #d4d4d4;
+ padding-bottom: 15px;
+ }
+ }
+
+ .row {
+ border-bottom: 1px solid #d4d4d4;
+
+ .name {
+ .link {
+ color: #0d61bf;
+ font-size: 14px;
+ font-weight: 400;
+ line-height: 51px;
+ text-decoration: underline;
+
+ &:hover {
+ text-decoration: none;
+ }
+ }
+ }
+
+ .placement {
+ color: #2a2a2a;
+ font-size: 14px;
+ font-weight: 500;
+ line-height: 51px;
+ }
+
+ .points {
+ color: #2a2a2a;
+ font-size: 14px;
+ font-weight: 400;
+ line-height: 51px;
+ }
+ }
+}
+
+.buttons {
+ margin-top: 10px;
+ display: flex;
+ flex-direction: row;
+ justify-content: center;
+
+ .close-btn {
+ color: #fafafb;
+ font-family: Roboto, sans-serif;
+ font-size: 14px;
+ font-weight: 700;
+ letter-spacing: 0.8px;
+ line-height: 40px;
+ background-color: #137d60;
+ border-radius: 20px;
+ border: none;
+ text-transform: uppercase;
+ padding: 0 20px;
+
+ &:hover {
+ background-color: #0ab88a !important;
+ box-shadow: 0 1px 5px 0 rgba(0, 0, 0, 0.2);
+ }
+ }
+}
+
+.header-table-content {
+ display: flex;
+ align-items: center;
+}
+
+.sort-container {
+ display: flex;
+ flex-direction: column;
+ margin-left: 5px;
+ padding: 0;
+ border: none;
+ outline: none;
+ background: transparent;
+}
+
+.sort-container > div {
+ width: 0;
+ height: 0;
+ border-left: 4px solid transparent;
+ border-right: 4px solid transparent;
+}
+
+.sort-up {
+ border-bottom: 4px solid $light-gray;
+ margin-bottom: 2px;
+
+ &.active {
+ border-bottom: 4px solid $tc-black;
+ }
+}
+
+.sort-down {
+ border-top: 4px solid $light-gray;
+
+ &.active {
+ border-top: 4px solid $tc-black;
+ }
+}
diff --git a/src/shared/components/Contentful/Modal/style.scss b/src/shared/components/Contentful/Modal/style.scss
index c94207a613..4e5dea9b8b 100644
--- a/src/shared/components/Contentful/Modal/style.scss
+++ b/src/shared/components/Contentful/Modal/style.scss
@@ -25,3 +25,9 @@
opacity: 1;
}
}
+
+.closeButton {
+ display: flex;
+ justify-content: center;
+ margin: 40px 0 80px 0;
+}
diff --git a/src/shared/components/Dashboard/CurrentActivity/Challenges/ChallengeCard/index.jsx b/src/shared/components/Dashboard/CurrentActivity/Challenges/ChallengeCard/index.jsx
index dbd735b2c5..98d1699988 100644
--- a/src/shared/components/Dashboard/CurrentActivity/Challenges/ChallengeCard/index.jsx
+++ b/src/shared/components/Dashboard/CurrentActivity/Challenges/ChallengeCard/index.jsx
@@ -47,13 +47,13 @@ export default function ChallengeCard({
let EventTag;
switch (track) {
- case COMPETITION_TRACKS.DATA_SCIENCE:
+ case COMPETITION_TRACKS.DS:
EventTag = DataScienceTrackEventTag;
break;
- case COMPETITION_TRACKS.DESIGN:
+ case COMPETITION_TRACKS.DES:
EventTag = DesignTrackEventTag;
break;
- case COMPETITION_TRACKS.DEVELOP:
+ case COMPETITION_TRACKS.DEV:
EventTag = DevelopmentTrackEventTag;
break;
case COMPETITION_TRACKS.QA:
@@ -66,7 +66,7 @@ export default function ChallengeCard({
const STALLED_MSG = 'Stalled';
const DRAFT_MSG = 'In Draft';
- const forumEndpoint = track === COMPETITION_TRACKS.DESIGN
+ const forumEndpoint = track === COMPETITION_TRACKS.DES
? `/?module=ThreadList&forumID=${legacy.forumId}`
: `/?module=Category&categoryID=${legacy.forumId}`;
diff --git a/src/shared/components/Dashboard/CurrentActivity/Header/index.jsx b/src/shared/components/Dashboard/CurrentActivity/Header/index.jsx
index e0615cfead..3b42ee67a5 100644
--- a/src/shared/components/Dashboard/CurrentActivity/Header/index.jsx
+++ b/src/shared/components/Dashboard/CurrentActivity/Header/index.jsx
@@ -9,13 +9,18 @@ import Option from './Option';
import './style.scss';
export default function Header({
- numChallenges,
+ // numChallenges,
numCommunities,
switchTab,
tab,
}) {
+ /**
+ * Temporary hide My Active Challenges - community-app#5004
+ */
+ /*
let myChallengesTitle = 'My Active Challenges';
if (numChallenges) myChallengesTitle += ` (${numChallenges})`;
+ */
let myCommunitiesTitle = 'My Communities';
if (numCommunities) myCommunitiesTitle += ` (${numCommunities})`;
@@ -25,11 +30,13 @@ export default function Header({
+ {/* {/* Temporary hide My Active Challenges - community-app#5004