diff --git a/.circleci/config.yml b/.circleci/config.yml index 00fe48889e..6180803b84 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -230,6 +230,7 @@ workflows: filters: branches: only: + - milestone-20200917 - develop # This is alternate dev env for parallel testing - "build-test": @@ -238,14 +239,13 @@ workflows: branches: only: - feature-contentful - - hot-fix # This is alternate dev env for parallel testing - "build-qa": context : org-global filters: branches: only: - - hot-fix + - community-app-tests-poc # This is beta env for production soft releases - "build-prod-beta": context : org-global @@ -260,8 +260,6 @@ workflows: filters: branches: only: - - milestone-v1.3 - - milestone-20200910 - develop # Production builds are exectuted # when PR is merged to the master diff --git a/config/default.js b/config/default.js index e9c1df07aa..7b9001cd62 100644 --- a/config/default.js +++ b/config/default.js @@ -409,4 +409,5 @@ module.exports = { TC_EDU_SEARCH_BAR_MAX_RESULTS_EACH_GROUP: 3, POLICY_PAGES_PATH: '/policy', GIGS_PAGES_PATH: '/gigs', + START_PAGE_PATH: '/start', }; diff --git a/package-lock.json b/package-lock.json index b4b54b597b..9835410199 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33204,9 +33204,9 @@ "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" }, "topcoder-react-lib": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/topcoder-react-lib/-/topcoder-react-lib-1.0.0.tgz", - "integrity": "sha512-JomJKRPAEKPTgcSiCapQe/o2f4jUuW2K5X61FT47OSDVQj7HbKoXZ1cM814Nn/x80wwniFQ71czdFiSz0aYGMQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/topcoder-react-lib/-/topcoder-react-lib-1.0.3.tgz", + "integrity": "sha512-cb4QLW2m3CqzJHWkfbx5TM/rV1bpJXk3FqetNIyKETipebkXtbL83mxtkaV3IEDYrpeKmfzDwjmbxwBh8Gopkw==", "requires": { "auth0-js": "^6.8.4", "config": "^3.2.0", diff --git a/src/assets/images/gig-blob.svg b/src/assets/images/gig-blob.svg new file mode 100644 index 0000000000..4b086d2cc5 --- /dev/null +++ b/src/assets/images/gig-blob.svg @@ -0,0 +1,23 @@ + + + + EA5B2FA5-2439-489A-B86C-B537FC455656 + Created with sketchtool. + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/images/img-gig-work.png b/src/assets/images/img-gig-work.png new file mode 100644 index 0000000000..0b10ff6612 Binary files /dev/null and b/src/assets/images/img-gig-work.png differ diff --git a/src/shared/components/Contentful/Modal/index.jsx b/src/shared/components/Contentful/Modal/index.jsx index 5eb619f24a..196dc72074 100644 --- a/src/shared/components/Contentful/Modal/index.jsx +++ b/src/shared/components/Contentful/Modal/index.jsx @@ -14,6 +14,7 @@ import { errors } from 'topcoder-react-lib'; import { themr } from 'react-css-super-themr'; import classnames from 'classnames'; +import defaultModalTheme from 'components/Leaderboard/ChallengeHistoryModal/styles.scss'; import defaultStyle from './style.scss'; const { fireErrorMessage } = errors; @@ -102,7 +103,10 @@ class ContentfulModal extends React.Component { className: classnames(theme.modalTrigger, child.props.className), }))} {isOpen && ( - +
  • label 2 -
    Subscribe to our Gig notifications email.. We’ll send you a weekly update on gigs available so you don’t miss a beat.
    +
    Subscribe to our Gig notifications email. We’ll send you a weekly update on gigs available so you don’t miss a beat.
  • label 3 diff --git a/src/shared/components/Gigs/style.scss b/src/shared/components/Gigs/style.scss index 840e6508a2..9859cdc418 100644 --- a/src/shared/components/Gigs/style.scss +++ b/src/shared/components/Gigs/style.scss @@ -142,6 +142,7 @@ img { margin-right: 16px; + min-width: 40px; } &:last-child { @@ -163,6 +164,7 @@ font-weight: 600; font-family: Barlow, sans-serif; margin-top: 20px; + line-height: 20px; } } @@ -189,6 +191,7 @@ .skills { display: flex; align-items: center; + line-height: 21px; /* stylelint-disable */ img { margin-right: 8px; diff --git a/src/shared/containers/EDU/Home.jsx b/src/shared/containers/EDU/Home.jsx index e68904544d..275efaab6c 100644 --- a/src/shared/containers/EDU/Home.jsx +++ b/src/shared/containers/EDU/Home.jsx @@ -13,6 +13,7 @@ import DesignTrackIcon from 'assets/images/track-design.svg'; import MMTrackIcon from 'assets/images/track-MM.svg'; import AlgoTrackIcon from 'assets/images/track-ALGO.svg'; import TCTrackIcon from 'assets/images/tc-logo-icon.svg'; +import GigWorkTrackIcon from 'assets/images/gig-blob.svg'; // CSS import homeTheme from './styles/home.scss'; @@ -95,6 +96,13 @@ export default class EDUHome extends React.Component {
  • +
    +
    +
    + +
    + +
    diff --git a/src/shared/containers/EDU/Tracks.jsx b/src/shared/containers/EDU/Tracks.jsx index 21de200219..0a1b4c8398 100644 --- a/src/shared/containers/EDU/Tracks.jsx +++ b/src/shared/containers/EDU/Tracks.jsx @@ -21,6 +21,7 @@ import DS from 'assets/images/img-data-science.png'; import Algo from 'assets/images/img-algorithm.png'; import QA from 'assets/images/img-QA.png'; import Topcoder from 'assets/images/img-Topcoder.png'; +import GigWork from 'assets/images/img-gig-work.png'; // Partials import ResultTabs from './partials/ResultTabs'; // CSS @@ -33,6 +34,7 @@ const TRACK_BANNER_BACK_COLORS = { 'Competitive Programming': '#FFA45D', QA: '#8AFB8A', Topcoder: '#2A2A2A', + 'Gig Work': '#ef476f', }; const TRACK_IMAGES = { Development: Dev, @@ -41,6 +43,7 @@ const TRACK_IMAGES = { 'Competitive Programming': Algo, QA, Topcoder, + 'Gig Work': GigWork, }; export default class EDUTracks extends React.Component { diff --git a/src/shared/containers/EDU/styles/home.scss b/src/shared/containers/EDU/styles/home.scss index 4efb6e3808..2b1222816d 100644 --- a/src/shared/containers/EDU/styles/home.scss +++ b/src/shared/containers/EDU/styles/home.scss @@ -181,6 +181,14 @@ height: 71px; } + .trackIconGigs { + display: flex; + justify-content: center; + align-items: center; + width: 74px; + height: 75px; + } + .trackIconTC { background-repeat: no-repeat; background-size: cover; diff --git a/src/shared/containers/Gigs/RecruitCRMJobs.jsx b/src/shared/containers/Gigs/RecruitCRMJobs.jsx index e9ffd09d65..d09ba71afc 100644 --- a/src/shared/containers/Gigs/RecruitCRMJobs.jsx +++ b/src/shared/containers/Gigs/RecruitCRMJobs.jsx @@ -22,7 +22,7 @@ class RecruitCRMJobsContainer extends React.Component { this.state = { term: '', page: 0, - sortBy: 'updated_on', + sortBy: 'created_on', }; this.onSearch = this.onSearch.bind(this); diff --git a/src/shared/routes/StartPage.jsx b/src/shared/routes/StartPage.jsx new file mode 100644 index 0000000000..dca924c079 --- /dev/null +++ b/src/shared/routes/StartPage.jsx @@ -0,0 +1,21 @@ +/** + * The loader of Gigs page webpack chunks. + */ +import React from 'react'; + +import LoadingPagePlaceholder from 'components/LoadingPagePlaceholder'; +import { AppChunk } from 'topcoder-react-utils'; + +export default function GigsPagesRoute(props) { + return ( + import(/* webpackChunkName: "gigsPages/chunk" */ 'containers/GigsPages') + .then(({ default: GigsPagesContainer }) => ( + + )) + } + renderPlaceholder={() => } + /> + ); +} diff --git a/src/shared/routes/index.jsx b/src/shared/routes/index.jsx index 9c8eb25569..be51690503 100644 --- a/src/shared/routes/index.jsx +++ b/src/shared/routes/index.jsx @@ -3,7 +3,9 @@ */ import CommunityLoader from 'containers/tc-communities/Loader'; +import ContentfulRoute from 'components/Contentful/Route'; import Content from 'components/Content'; +import Footer from 'components/TopcoderFooter'; import React from 'react'; import { @@ -103,6 +105,19 @@ function Routes({ communityId }) { exact path={`${config.GIGS_PAGES_PATH}/:id?`} /> + ( + + +
    diff --git a/src/shared/services/contentful.js b/src/shared/services/contentful.js index afe482c83d..4508f76d6d 100644 --- a/src/shared/services/contentful.js +++ b/src/shared/services/contentful.js @@ -21,13 +21,11 @@ if (isomorphy.isServerSide()) { /* eslint-enable global-require */ } -const LOCAL_MODE = Boolean(config.CONTENTFUL.LOCAL_MODE); - // Education Center Taxonomy const EDU_TAXONOMY_ID = '15caxocitaxyK65K9oSd91'; // The keys for subcategory lists/references // If need to add new track add its fieldID here to be autopickuped -const EDU_TRACK_KEYS = ['dataScience', 'competitiveProgramming', 'design', 'development', 'qualityAssurance', 'topcoder']; +const EDU_TRACK_KEYS = ['dataScience', 'competitiveProgramming', 'design', 'development', 'qualityAssurance', 'topcoder', 'gigWork']; const EDU_ARTICLE_TYPES = ['Article', 'Video', 'Forum post']; @@ -37,7 +35,7 @@ const EDU_ARTICLE_TYPES = ['Article', 'Video', 'Forum post']; /* Holds the base URL of Community App endpoints that proxy HTTP request to * Contentful APIs. */ -const PROXY_ENDPOINT = `${LOCAL_MODE ? '' : config.URL.APP}/api/cdn/public/contentful`; +const PROXY_ENDPOINT = '/api/cdn/public/contentful'; /* At the client-side only, it holds the cached index of published Contentful * assets and content. Do not use it directly, use getIndex() function below * instead (it takes care about updating this when necessary). */ diff --git a/src/shared/utils/contentful.js b/src/shared/utils/contentful.js index a7b4880310..76f1614077 100644 --- a/src/shared/utils/contentful.js +++ b/src/shared/utils/contentful.js @@ -122,17 +122,22 @@ export function menuItemBuilder(baseUrl, item) { export function tracksTreeBuilder(EDUTaxonomy, query) { const tax = _.isArray(query.tax) ? query.tax : [query.tax]; let id = 0; - return _.sortBy( + const res = _.sortBy( _.map(EDUTaxonomy, (categories, track) => ({ title: track, id: id++, items: _.sortBy(_.map(categories, cat => ({ - title: cat.name, id: id++, items: [], track, selected: _.indexOf(tax, cat.name) !== -1, + title: cat.name, + id: id++, + items: [], + track, + selected: _.indexOf(tax, cat.name) !== -1 && track === query.track, })), ['title']), selected: query.track === track, })), ['title'], ); + return res; } export default undefined;