refactor: remove legacy code and move redesign code to src

VAN-670
This commit is contained in:
Waheed Ahmed
2021-07-28 14:27:04 +05:00
parent 0cc2191658
commit 32300db8dd
254 changed files with 28 additions and 16186 deletions

View File

@@ -0,0 +1,97 @@
import React from 'react';
import classNames from 'classnames';
import PropTypes from 'prop-types';
import { getConfig } from '@edx/frontend-platform';
import { injectIntl, intlShape } from '@edx/frontend-platform/i18n';
import {
Col, Hyperlink, Image, Row,
} from '@edx/paragon';
import messages from './messages';
const AuthExtraLargeLayout = (props) => {
const { intl, username, variant } = props;
return (
<div className="container row p-0 m-0 large-screen-container">
<div className="col-md-9 p-0 screen-header-light">
<Hyperlink destination={getConfig().MARKETING_SITE_BASE_URL}>
<Image alt="edx" className="logo position-absolute" src={getConfig().LOGO_WHITE_URL} />
</Hyperlink>
<div className="min-vh-100 d-flex align-items-center">
<div>
<Row>
<Col xs={3}>
<svg className={classNames(
'ml-5 mt-5',
{
'extra-large-svg-line': variant === 'xl',
'extra-extra-large-svg-line': variant === 'xxl',
},
)}
>
<line x1="60" y1="0" x2="5" y2="220" />
</svg>
</Col>
<Col xs={9}>
<div className={classNames(
'data-hj-suppress',
{
h3: variant === 'xl',
h2: variant === 'xxl',
},
)}
>
{intl.formatMessage(
messages['welcome.to.platform'], { siteName: getConfig().SITE_NAME, username },
)}
</div>
<div
className={classNames(
'text-primary',
{
'display-1': variant === 'xl',
'display-2': variant === 'xxl',
},
)}
>
{intl.formatMessage(messages['complete.your.profile.1'])}
<span className="text-accent-a">
<br />
{intl.formatMessage(messages['complete.your.profile.2'])}
</span>
</div>
</Col>
</Row>
</div>
</div>
</div>
<div className="col-md-3 p-0 screen-polygon">
<svg
width="100%"
height="100%"
className="m1-n1 large-screen-svg-light"
preserveAspectRatio="xMaxYMin meet"
>
<g transform="skewX(171.6)">
<rect x="0" y="0" height="100%" width="100%" />
</g>
</svg>
</div>
</div>
);
};
AuthExtraLargeLayout.defaultProps = {
variant: 'xl',
};
AuthExtraLargeLayout.propTypes = {
intl: intlShape.isRequired,
username: PropTypes.string.isRequired,
variant: PropTypes.oneOf(['xl', 'xxl']),
};
export default injectIntl(AuthExtraLargeLayout);

View File

@@ -0,0 +1,69 @@
import React from 'react';
import PropTypes from 'prop-types';
import { injectIntl, intlShape } from '@edx/frontend-platform/i18n';
import { getConfig } from '@edx/frontend-platform';
import {
Col, Hyperlink, Image, Row,
} from '@edx/paragon';
import messages from './messages';
const AuthMediumLayout = (props) => {
const { intl, username } = props;
return (
<div className="container row p-0 mb-3 medium-container">
<div className="col-md-10 p-0 screen-header-light">
<Hyperlink destination={getConfig().MARKETING_SITE_BASE_URL}>
<Image alt="edx" className="logo" src={getConfig().LOGO_WHITE_URL} />
</Hyperlink>
<div className="d-flex align-items-center justify-content-center ml-6">
<div>
<Row>
<Col xs={3}>
<svg className="medium-svg-line ml-5 mt-5">
<line x1="60" y1="0" x2="5" y2="220" />
</svg>
</Col>
<Col xs={9}>
<h3 className="data-hj-suppress">
{intl.formatMessage(
messages['welcome.to.platform'], { siteName: getConfig().SITE_NAME, username },
)}
</h3>
<div className="display-1 text-primary">
{intl.formatMessage(messages['complete.your.profile.1'])}
<span className="text-accent-a">
<br />
{intl.formatMessage(messages['complete.your.profile.2'])}
</span>
</div>
</Col>
</Row>
</div>
</div>
</div>
<div className="col-md-2 p-0 screen-polygon">
<svg
width="100%"
height="100%"
className="medium-screen-svg-light"
preserveAspectRatio="xMaxYMin meet"
>
<g transform="skewX(168)">
<rect x="0" y="0" height="100%" width="100%" />
</g>
</svg>
</div>
</div>
);
};
AuthMediumLayout.propTypes = {
intl: intlShape.isRequired,
username: PropTypes.string.isRequired,
};
export default injectIntl(AuthMediumLayout);

View File

@@ -0,0 +1,68 @@
import React from 'react';
import classNames from 'classnames';
import PropTypes from 'prop-types';
import { getConfig } from '@edx/frontend-platform';
import { injectIntl, intlShape } from '@edx/frontend-platform/i18n';
import {
Col, Hyperlink, Image, Row,
} from '@edx/paragon';
import messages from './messages';
const AuthSmallLayout = (props) => {
const { intl, username, variant } = props;
return (
<div className="small-screen-header-light">
<Hyperlink destination={getConfig().MARKETING_SITE_BASE_URL}>
<Image alt="edx" className="logo" src={getConfig().LOGO_WHITE_URL} />
</Hyperlink>
<div className={classNames('d-flex mt-3', { 'pl-6': variant === 'sm' })}>
<div>
<Row>
<Col xs={3}>
<svg className={classNames(
'mt-4\.5', // eslint-disable-line no-useless-escape
{
'extra-small-svg-line': variant === 'xs',
'small-svg-line': variant === 'sm',
},
)}
>
<line x1="60" y1="0" x2="5" y2="220" />
</svg>
</Col>
<Col xs={9}>
<h5 className="data-hj-suppress">
{intl.formatMessage(
messages['welcome.to.platform'], { siteName: getConfig().SITE_NAME, username },
)}
</h5>
<h1>
{intl.formatMessage(messages['complete.your.profile.1'])}
<br />
<span className="text-accent-a">
{intl.formatMessage(messages['complete.your.profile.2'])}
</span>
</h1>
</Col>
</Row>
</div>
</div>
</div>
);
};
AuthSmallLayout.defaultProps = {
variant: 'sm',
};
AuthSmallLayout.propTypes = {
intl: intlShape.isRequired,
username: PropTypes.string.isRequired,
variant: PropTypes.oneOf(['sm', 'xs']),
};
export default injectIntl(AuthSmallLayout);

View File

@@ -0,0 +1,66 @@
import React from 'react';
import classNames from 'classnames';
import PropTypes from 'prop-types';
import { getAuthenticatedUser } from '@edx/frontend-platform/auth';
import {
ExtraSmall, Small, Medium, Large, ExtraLarge, ExtraExtraLarge,
} from '@edx/paragon';
import LargeLayout from './LargeLayout';
import MediumLayout from './MediumLayout';
import SmallLayout from './SmallLayout';
import AuthExtraLargeLayout from './AuthExtraLargeLayout';
import AuthMediumLayout from './AuthMediumLayout';
import AuthSmallLayout from './AuthSmallLayout';
const BaseComponent = ({ children }) => {
const authenticatedUser = getAuthenticatedUser();
return (
<>
<ExtraLarge>
<div className="col-md-12 extra-large-screen-top-stripe" />
</ExtraLarge>
<ExtraExtraLarge>
<div className="col-md-12 extra-large-screen-top-stripe" />
</ExtraExtraLarge>
<div className={classNames('layout', { authenticated: authenticatedUser })}>
<ExtraSmall>
<div className="col-md-12 small-screen-top-stripe" />
{authenticatedUser ? <AuthSmallLayout variant="xs" username={authenticatedUser.username} /> : <SmallLayout />}
</ExtraSmall>
<Small>
<div className="col-md-12 small-screen-top-stripe" />
{authenticatedUser ? <AuthSmallLayout username={authenticatedUser.username} /> : <SmallLayout />}
</Small>
<Medium>
<div className="w-100 medium-screen-top-stripe" />
{authenticatedUser ? <AuthMediumLayout username={authenticatedUser.username} /> : <MediumLayout />}
</Medium>
<Large>
<div className="w-100 large-screen-top-stripe" />
{authenticatedUser ? <AuthMediumLayout username={authenticatedUser.username} /> : <MediumLayout />}
</Large>
<ExtraLarge>
{authenticatedUser ? <AuthExtraLargeLayout username={authenticatedUser.username} /> : <LargeLayout />}
</ExtraLarge>
<ExtraExtraLarge>
{authenticatedUser ? <AuthExtraLargeLayout variant="xxl" username={authenticatedUser.username} /> : <LargeLayout />}
</ExtraExtraLarge>
<div className={classNames('content', { 'align-items-center mt-0': authenticatedUser })}>
{children}
</div>
</div>
</>
);
};
BaseComponent.propTypes = {
children: PropTypes.node.isRequired,
};
export default BaseComponent;

View File

@@ -0,0 +1,31 @@
import React from 'react';
import { getConfig } from '@edx/frontend-platform';
import { Hyperlink, Image } from '@edx/paragon';
import LargeScreenLeftLayout from './LargeLeftLayout';
const LargeLayout = () => (
<div className="container row p-0 m-0 large-screen-container">
<div className="col-md-9 p-0 screen-header-primary">
<Hyperlink destination={getConfig().MARKETING_SITE_BASE_URL}>
<Image alt="edx" className="logo position-absolute" src={getConfig().LOGO_WHITE_URL} />
</Hyperlink>
<LargeScreenLeftLayout />
</div>
<div className="col-md-3 p-0 screen-polygon">
<svg
width="100%"
height="100%"
className="ml-n1 large-screen-svg-primary"
preserveAspectRatio="xMaxYMin meet"
>
<g transform="skewX(171.6)">
<rect x="0" y="0" height="100%" width="100%" />
</g>
</svg>
</div>
</div>
);
export default LargeLayout;

View File

@@ -0,0 +1,30 @@
import React from 'react';
import { injectIntl, intlShape } from '@edx/frontend-platform/i18n';
import { getConfig } from '@edx/frontend-platform';
import messages from './messages';
const LargeLeftLayout = (props) => {
const { intl } = props;
return (
<div className="min-vh-100 pr-0 mt-lg-n2 d-flex align-items-center">
<svg className="large-screen-svg-line ml-5">
<line x1="50" y1="0" x2="10" y2="215" />
</svg>
<h1 className="large-heading">
{intl.formatMessage(messages['start.learning'])}
<span className="text-accent-a"><br />
{intl.formatMessage(messages['with.site.name'], { siteName: getConfig().SITE_NAME })}
</span>
</h1>
</div>
);
};
LargeLeftLayout.propTypes = {
intl: intlShape.isRequired,
};
export default injectIntl(LargeLeftLayout);

View File

@@ -0,0 +1,45 @@
import React from 'react';
import { injectIntl, intlShape } from '@edx/frontend-platform/i18n';
import { getConfig } from '@edx/frontend-platform';
import { Hyperlink, Image } from '@edx/paragon';
import messages from './messages';
const MediumLayout = (props) => {
const { intl } = props;
return (
<div className="container row p-0 mb-3 medium-screen-container">
<div className="col-md-10 p-0 screen-header-primary">
<Hyperlink destination={getConfig().MARKETING_SITE_BASE_URL}>
<Image alt="edx" className="logo" src={getConfig().LOGO_WHITE_URL} />
</Hyperlink>
<div className="row mt-4 justify-content-center">
<svg className="medium-screen-svg-line pl-5">
<line x1="50" y1="0" x2="10" y2="215" />
</svg>
<h1 className="medium-heading pb-4">
{intl.formatMessage(messages['start.learning'])}
<span className="text-accent-a"><br />
{intl.formatMessage(messages['with.site.name'], { siteName: getConfig().SITE_NAME })}
</span>
</h1>
</div>
</div>
<div className="col-md-2 p-0 screen-polygon">
<svg width="100%" height="100%" className="medium-screen-svg-primary" preserveAspectRatio="xMaxYMin meet">
<g transform="skewX(168)">
<rect x="0" y="0" height="100%" width="100%" />
</g>
</svg>
</div>
</div>
);
};
MediumLayout.propTypes = {
intl: intlShape.isRequired,
};
export default injectIntl(MediumLayout);

View File

@@ -0,0 +1,39 @@
import React from 'react';
import { injectIntl, intlShape } from '@edx/frontend-platform/i18n';
import { getConfig } from '@edx/frontend-platform';
import { Hyperlink, Image } from '@edx/paragon';
import messages from './messages';
const SmallLayout = (props) => {
const { intl } = props;
return (
<>
<div className="small-screen-header-primary">
<Hyperlink destination={getConfig().MARKETING_SITE_BASE_URL}>
<Image alt="edx" className="logo" src={getConfig().LOGO_WHITE_URL} />
</Hyperlink>
<div className="d-flex mt-3">
<svg className="small-screen-svg-line">
<line x1="55" y1="0" x2="40" y2="65" />
</svg>
<h1 className="small-heading pb-3">
{intl.formatMessage(messages['start.learning'])}
<br />
<span className="text-accent-a">
{intl.formatMessage(messages['with.site.name'], { siteName: getConfig().SITE_NAME })}
</span>
</h1>
</div>
</div>
</>
);
};
SmallLayout.propTypes = {
intl: intlShape.isRequired,
};
export default injectIntl(SmallLayout);

View File

@@ -0,0 +1 @@
export { default } from './BaseComponent';

View File

@@ -0,0 +1,32 @@
import { defineMessages } from '@edx/frontend-platform/i18n';
const messages = defineMessages({
'start.learning': {
id: 'start.learning',
defaultMessage: 'Start learning',
description: 'Header text for logistration MFE pages',
},
'with.site.name': {
id: 'with.site.name',
defaultMessage: 'with {siteName}',
description: 'Header text with site name for logistration MFE pages',
},
// authenticated user base component text
'complete.your.profile.1': {
id: 'complete.your.profile.1',
defaultMessage: 'Complete',
description: 'part of text "complete your profile"',
},
'complete.your.profile.2': {
id: 'complete.your.profile.2',
defaultMessage: 'your profile',
description: 'part of text "complete your profile"',
},
'welcome.to.platform': {
id: 'welcome.to.platform',
defaultMessage: 'Welcome to {siteName}, {username}!',
description: 'Welcome message that appears on progressive profile page',
},
});
export default messages;

View File

@@ -0,0 +1,51 @@
import React from 'react';
import { mount } from 'enzyme';
import { IntlProvider } from '@edx/frontend-platform/i18n';
import LargeLayout from '../LargeLayout';
import MediumLayout from '../MediumLayout';
import SmallLayout from '../SmallLayout';
describe('ScreenLayout', () => {
it('should display the form, pass as a child in SmallScreenLayout', () => {
const smallScreen = mount(
<IntlProvider locale="en">
<div>
<SmallLayout />
<form>
<input type="text" />
</form>
</div>
</IntlProvider>,
);
expect(smallScreen.find('form').exists()).toEqual(true);
});
it('should display the form, pass as a child in MediumScreenLayout', () => {
const mediumScreen = mount(
<IntlProvider locale="en">
<div>
<MediumLayout />
<form>
<input type="text" />
</form>
</div>
</IntlProvider>,
);
expect(mediumScreen.find('form').exists()).toEqual(true);
});
it('should display the form, pass as a child in LargeScreenLayout', () => {
const largeScreen = mount(
<IntlProvider locale="en">
<div>
<LargeLayout />
<form>
<input type="text" />
</form>
</div>
</IntlProvider>,
);
expect(largeScreen.find('form').exists()).toEqual(true);
});
});