diff --git a/.circleci/config.yml b/.circleci/config.yml index 832d6f80cd..a2e1c3acba 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -248,7 +248,7 @@ jobs: source buildenvvar ./automated-smoke-test/smoketest.sh automation-config-staging.json prod - store_artifacts: - path: /automated-smoke-test/test-results + path: ./automated-smoke-test/test-results # Automated Smoke Testing against Production Smoke-Testing-On-Production: @@ -273,6 +273,8 @@ jobs: source awsenvconf source buildenvvar ./automated-smoke-test/smoketest.sh automation-config-prod.json prod + - store_artifacts: + path: ./automated-smoke-test/test-results # Test job for the cases when we do not need deployment. It just rapidly # installs (updates) app dependencies, and runs tests (ESLint, Stylelint, @@ -362,14 +364,15 @@ workflows: filters: branches: only: - - free + - new-tabs-theme # This is stage env for production QA releases - "build-prod-staging": context : org-global filters: &filters-staging branches: only: - - develop + - develop + - ast-member-profile # Production builds are exectuted # when PR is merged to the master # Don't change anything in this configuration diff --git a/automated-smoke-test/conf.ts b/automated-smoke-test/conf.ts index c283b6375b..cef10377c4 100644 --- a/automated-smoke-test/conf.ts +++ b/automated-smoke-test/conf.ts @@ -34,7 +34,7 @@ exports.config = { framework: 'jasmine2', specs: [ - // '../temp/test-suites/tc-login.spec.js' + '../temp/test-suites/tc-login.spec.js', // '../temp/test-suites/tc-tools.spec.js', // '../temp/test-suites/tc-account.spec.js', // '../temp/test-suites/tc-profile.spec.js', @@ -44,7 +44,7 @@ exports.config = { '../temp/test-suites/tc-challenge-listing.spec.js', '../temp/test-suites/tc-challenge-detail.spec.js', // '../temp/test-suites/tc-my-dashboard.spec.js', - // '../temp/test-suites/tc-member-profile.spec.js', + '../temp/test-suites/tc-member-profile.spec.js', ], // Options to be passed to Jasmine. diff --git a/automated-smoke-test/config/automation-config-beta.json b/automated-smoke-test/config/automation-config-beta.json index 9ba4ecc18b..a5d3762c17 100644 --- a/automated-smoke-test/config/automation-config-beta.json +++ b/automated-smoke-test/config/automation-config-beta.json @@ -152,7 +152,7 @@ "numberOfSubtracks": 11, "winInfo": { "name": "WEB DESIGNS", - "info": "258", + "info": "268", "infoTitle": "WINS", "link": "https://beta-community-app.topcoder.com/members/iamtong/details/?track=DESIGN&subTrack=WEB_DESIGNS" } @@ -160,10 +160,10 @@ "developmentProfile": { "handle": "iamtong", "trackName": "DEVELOP", - "numberOfSubtracks": 8, + "numberOfSubtracks": 7, "winInfo": { "name": "FIRST2FINISH", - "info": "56", + "info": "61", "infoTitle": "WINS", "link": "https://beta-community-app.topcoder.com/members/iamtong/details/?track=DEVELOP&subTrack=FIRST_2_FINISH" } diff --git a/automated-smoke-test/config/automation-config-prod.json b/automated-smoke-test/config/automation-config-prod.json index f0fb447d58..6c1f60df05 100644 --- a/automated-smoke-test/config/automation-config-prod.json +++ b/automated-smoke-test/config/automation-config-prod.json @@ -148,7 +148,7 @@ "numberOfSubtracks": 11, "winInfo": { "name": "WEB DESIGNS", - "info": "258", + "info": "268", "infoTitle": "WINS", "link": "https://www.topcoder.com/members/iamtong/details/?track=DESIGN&subTrack=WEB_DESIGNS" } @@ -156,10 +156,10 @@ "developmentProfile": { "handle": "iamtong", "trackName": "DEVELOP", - "numberOfSubtracks": 8, + "numberOfSubtracks": 7, "winInfo": { "name": "FIRST2FINISH", - "info": "56", + "info": "61", "infoTitle": "WINS", "link": "https://www.topcoder.com/members/iamtong/details/?track=DEVELOP&subTrack=FIRST_2_FINISH" } diff --git a/automated-smoke-test/config/automation-config-staging.json b/automated-smoke-test/config/automation-config-staging.json index 693a4ba44e..e75c937db5 100644 --- a/automated-smoke-test/config/automation-config-staging.json +++ b/automated-smoke-test/config/automation-config-staging.json @@ -153,7 +153,7 @@ "numberOfSubtracks": 11, "winInfo": { "name": "WEB DESIGNS", - "info": "258", + "info": "268", "infoTitle": "WINS", "link": "https://staging-community-app.topcoder.com/members/iamtong/details/?track=DESIGN&subTrack=WEB_DESIGNS" } @@ -161,10 +161,10 @@ "developmentProfile": { "handle": "iamtong", "trackName": "DEVELOP", - "numberOfSubtracks": 8, + "numberOfSubtracks": 7, "winInfo": { "name": "FIRST2FINISH", - "info": "56", + "info": "61", "infoTitle": "WINS", "link": "https://staging-community-app.topcoder.com/members/iamtong/details/?track=DEVELOP&subTrack=FIRST_2_FINISH" } diff --git a/automated-smoke-test/page-objects/pages/topcoder/login/login.constants.ts b/automated-smoke-test/page-objects/pages/topcoder/login/login.constants.ts index d32e496d7d..6f1b184993 100644 --- a/automated-smoke-test/page-objects/pages/topcoder/login/login.constants.ts +++ b/automated-smoke-test/page-objects/pages/topcoder/login/login.constants.ts @@ -5,9 +5,9 @@ export class LoginPageConstants { static get errors() { return { InvalidPassword: - 'That password is incorrect. Please check that you entered the right one.', + 'WRONG USERNAME OR PASSWORD.', MemberNotPresent: - "We couldn't find a member with that username. Please check that you entered it correctly.", + "WRONG USERNAME OR PASSWORD.", }; } } diff --git a/automated-smoke-test/page-objects/pages/topcoder/login/login.helper.ts b/automated-smoke-test/page-objects/pages/topcoder/login/login.helper.ts index f8ca773ee8..1f3dca2921 100644 --- a/automated-smoke-test/page-objects/pages/topcoder/login/login.helper.ts +++ b/automated-smoke-test/page-objects/pages/topcoder/login/login.helper.ts @@ -48,7 +48,7 @@ export class LoginPageHelper { * @param {String} password */ public static async verifyLogin(username: string, password: string) { - await CommonHelper.verifyCurrentUrl(ConfigHelper.getLoginUrl()); + await CommonHelper.verifyCurrentUrlToContain(ConfigHelper.getLoginUrl()); await this.loginPageObject.waitForLoginForm(); await this.loginPageObject.fillLoginForm(username, password); const homePage = await this.loginPageObject.waitForHomePage(); diff --git a/automated-smoke-test/page-objects/pages/topcoder/login/login.po.ts b/automated-smoke-test/page-objects/pages/topcoder/login/login.po.ts index 39ca7685a9..89fa24f91d 100644 --- a/automated-smoke-test/page-objects/pages/topcoder/login/login.po.ts +++ b/automated-smoke-test/page-objects/pages/topcoder/login/login.po.ts @@ -48,7 +48,7 @@ export class LoginPage { * Get Error message */ public get errorMessage() { - return ElementHelper.getElementByClassName('form-error'); + return ElementHelper.getElementByCss('.auth0-global-message.auth0-global-message-error .animated.fadeInUp span'); } /** diff --git a/automated-smoke-test/test-suites/tc-login.spec.ts b/automated-smoke-test/test-suites/tc-login.spec.ts index 30c3c941ae..001c2b43b2 100644 --- a/automated-smoke-test/test-suites/tc-login.spec.ts +++ b/automated-smoke-test/test-suites/tc-login.spec.ts @@ -32,11 +32,11 @@ describe('Topcoder Login Page Tests: ', () => { * Verifies User cannot login using invalid username */ it('[TC_002] should Verify User cannot login using invalid username', async () => { - const invalidUsername = testData.login.invalidUsername; + const { invalidUsername } = testData.login; const password = ConfigHelper.getPassword(); await LoginPageHelper.verifyLoginWithInvalidUserName( invalidUsername, - password + password, ); }); @@ -45,10 +45,10 @@ describe('Topcoder Login Page Tests: ', () => { */ it('[TC_003] should Verify User cannot login using invalid password', async () => { const username = ConfigHelper.getUserName(); - const inavlidPassword = testData.login.invalidPassword; + const { invalidPassword } = testData.login; await LoginPageHelper.verifyLoginWithInvalidPassword( username, - inavlidPassword + invalidPassword, ); }); diff --git a/src/shared/components/Contentful/Tabs/Tabs.jsx b/src/shared/components/Contentful/Tabs/Tabs.jsx index 12dc1fcef0..c823afdc73 100644 --- a/src/shared/components/Contentful/Tabs/Tabs.jsx +++ b/src/shared/components/Contentful/Tabs/Tabs.jsx @@ -26,6 +26,7 @@ import underlineTheme from './themes/underline.scss'; import underlineDarkTheme from './themes/underline-dark.scss'; import verticalTheme from './themes/vertical.scss'; import pillsTheme from './themes/pills.scss'; +import underlineBoxTheme from './themes/underline-box.scss'; export const TAB_THEMES = { Default: defaultTheme, @@ -36,6 +37,7 @@ export const TAB_THEMES = { 'Underline dark': underlineDarkTheme, Vertical: verticalTheme, Pills: pillsTheme, + 'Underline box': underlineBoxTheme, }; export default class TabsItemsLoader extends Component { @@ -43,6 +45,7 @@ export default class TabsItemsLoader extends Component { super(props); this.state = { tabIndex: props.selected || 0, + mobileTabsShow: false, }; this.updatePageUrl.bind(this); @@ -83,8 +86,9 @@ export default class TabsItemsLoader extends Component { environment, theme, tabId, + themeName, } = this.props; - const { tabIndex } = this.state; + const { tabIndex, mobileTabsShow } = this.state; return ( this.setState({ tabIndex: tIndx })} + onSelect={tIndx => this.setState({ tabIndex: tIndx, mobileTabsShow: false })} forceRenderTabPanel >
- + { + themeName === 'Underline box' ? ( + + ) : null + } + { _.map(data.entries.items, tabItem => ( ); }} diff --git a/src/shared/components/Contentful/Tabs/themes/underline-box.scss b/src/shared/components/Contentful/Tabs/themes/underline-box.scss new file mode 100644 index 0000000000..589de02776 --- /dev/null +++ b/src/shared/components/Contentful/Tabs/themes/underline-box.scss @@ -0,0 +1,168 @@ +@import "~styles/mixins"; + +$container-background-gray: #ebebeb; +$text-color-black: #262628; +$text-color-gray: #888894; +$text-color-pannel: #4a4a4a; + +.container { + margin: auto; + + @include xs-to-sm { + margin-top: 65px; + } +} + +.tabListWrap { + display: flex; + justify-content: center; + position: relative; + + .tablist { + @include roboto-regular; + + display: flex; + flex-direction: row; + justify-content: center; + list-style-type: none; + box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.06); + margin: auto; + min-height: 60px; + border-radius: 30px; + align-items: center; + background-color: white; + padding: 0 25px; + border: 1px solid #e4e4e4; + + @include xs-to-sm { + white-space: nowrap; + flex-direction: column; + padding: 28px 15px 0; + align-items: flex-start; + border-radius: 8px; + min-width: 85vw; + overflow: visible; + position: absolute; + z-index: 999; + display: none; // by default + + &.visible { + display: flex; + } + } + } + + .tabListMobileTrigger { + display: none; + justify-content: center; + align-items: center; + background-color: white; + position: absolute; + top: -65px; + width: 85vw; + left: calc(50% - 42.5vw); + outline: none; + border: navajowhite; + min-height: 60px; + font-family: Barlow, sans-serif; + font-size: 16px; + font-weight: 600; + text-transform: uppercase; + border-radius: 30px; + box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.06); + color: #2a2a2a; + + @media (max-width: 768px) { + display: flex; + } + + .tabListMobileTriggerSVG, + .tabListMobileTriggerSVGOpen { + margin-left: 9px; + } + + .tabListMobileTriggerSVGOpen { + transform: scaleY(-1); + } + } +} + +.tab { + text-align: center; + margin: 0 25px; + color: #555; + font-family: Barlow, sans-serif; + font-size: 16px; + font-weight: 600; + line-height: 20px; + padding-bottom: 5px; + cursor: pointer; + margin-bottom: -5px; + position: relative; + + @include xs-to-sm { + margin: 0; + margin-bottom: 23px; + padding: 0; + padding-left: 5px; + + &::after { + display: none; + } + + &:hover, + &.selected { + border-left: 3px solid #43d7b0; + margin-left: -3px; + } + } + + &:hover, + &.selected { + color: #2a2a2a; + + &::after { + content: ''; + border-radius: 1000vw; + background: #43d7b0; + height: 3px; + width: 15px; + position: absolute; + bottom: 0; + left: calc(50% - 7px); + border-left: 1px solid #fff; + border-right: 1px solid #fff; + + @include xs-to-sm { + width: calc(100% - 36px); + bottom: -5px; + } + } + } + + p { + small { + color: #888894; + font-size: 13px; + font-weight: 400; + line-height: 25px; + text-align: left; + } + + strong { + font-weight: bold; + } + } +} + +.tabpannel { + display: none; +} + +.selectedTabPanel { + display: block; + + @include xs-to-sm { + padding: 0 15px; + } +} diff --git a/src/shared/components/Gigs/GigApply/style.scss b/src/shared/components/Gigs/GigApply/style.scss index abcea04f97..2c1a1e603e 100644 --- a/src/shared/components/Gigs/GigApply/style.scss +++ b/src/shared/components/Gigs/GigApply/style.scss @@ -313,6 +313,7 @@ margin-left: 20px; } } + .gig-list-btn { margin-right: 12px; }