diff --git a/client/.babelrc b/client/.babelrc
index 31e765c..1ad0898 100644
--- a/client/.babelrc
+++ b/client/.babelrc
@@ -47,6 +47,7 @@
"#redux": "./src/redux",
"#resources": "./src/resources",
"#rest": "./src/rest",
+ "#request": "./src/request",
"#schema": "./src/schema",
"#utils": "./src/utils",
"#notify": "./src/notify",
diff --git a/client/package.json b/client/package.json
index 7c2ea12..6ce73f3 100644
--- a/client/package.json
+++ b/client/package.json
@@ -87,7 +87,7 @@
"identity-obj-proxy": "^3.0.0",
"jest": "^22.4.3",
"mini-css-extract-plugin": "^0.4.0",
- "node-sass": "4.12.0",
+ "node-sass": "^4.14.1",
"optimize-css-assets-webpack-plugin": "^4.0.1",
"react-test-renderer": "^16.3.2",
"sass-loader": "^7.3.1",
@@ -105,7 +105,9 @@
"webpack-pwa-manifest": "^3.6.2"
},
"dependencies": {
+ "@togglecorp/fujs": "^1.9.0",
"@togglecorp/ravl": "^1.0.2",
+ "@togglecorp/react-rest-request": "^2.4.5",
"body-parser": "^1.18.3",
"d3-area-label": "^1.4.0",
"d3-array": "^1.2.1",
@@ -146,6 +148,7 @@
"react-focus-trap": "^2.5.0",
"react-ga": "^2.5.0",
"react-helmet": "^5.2.0",
+ "react-markdown": "^4.3.1",
"react-redux": "^5.0.7",
"react-resize-detector": "^2.3.0",
"react-router-dom": "^4.2.2",
diff --git a/client/src/constants/routes.js b/client/src/constants/routes.js
index fe1d2be..6ff756b 100644
--- a/client/src/constants/routes.js
+++ b/client/src/constants/routes.js
@@ -18,6 +18,12 @@ export const routes = {
path: '/',
loader: () => import('../views/Home'),
},
+ career: {
+ order: 2,
+ type: ROUTE.public,
+ path: '/career/',
+ loader: () => import('../views/Career'),
+ },
};
export const pathNames = mapObjectToObject(routes, route => route.path);
diff --git a/client/src/rest/index.js b/client/src/rest/index.js
deleted file mode 100644
index 7bc3926..0000000
--- a/client/src/rest/index.js
+++ /dev/null
@@ -1,6 +0,0 @@
-import { wsEndpoint } from '#config/rest';
-
-export const urlForMembers = `${wsEndpoint}/members/`;
-export const urlForClients = `${wsEndpoint}/clients/`;
-export const urlForServices = `${wsEndpoint}/services/`;
-export const urlForTechnologySection = `${wsEndpoint}/technology-sections/`;
diff --git a/client/src/schema/index.js b/client/src/schema/index.js
index 415f591..36805ee 100644
--- a/client/src/schema/index.js
+++ b/client/src/schema/index.js
@@ -62,6 +62,7 @@ const userDefinedSchemas = [];
name: { type: 'string', required: true },
image: { type: 'string', required: true },
designation: { type: 'string', required: true },
+ hidden: { type: 'boolean' },
membersUrls: { type: 'array.memberUrl', required: true },
},
};
diff --git a/client/src/stylesheets/_base.scss b/client/src/stylesheets/_base.scss
index 8fe7471..57d49fe 100644
--- a/client/src/stylesheets/_base.scss
+++ b/client/src/stylesheets/_base.scss
@@ -42,21 +42,12 @@ body {
font-size: $font-size-default;
font-weight: $font-weight-default;
- a {
- outline: none;
- text-transform: uppercase;
- text-decoration: none;
- color: inherit;
- }
-
h1,
h2,
h3,
h4,
h5 {
margin: 0;
- text-transform: uppercase;
- font-weight: $font-weight-light;
}
}
diff --git a/client/src/utils/Request.js b/client/src/utils/Request.js
index b00e8bc..ea89cb1 100644
--- a/client/src/utils/Request.js
+++ b/client/src/utils/Request.js
@@ -1,97 +1,159 @@
-import { RestRequest } from '#rsu/rest';
+import { compose } from 'redux';
+import {
+ createRequestCoordinator,
+ createRequestClient,
+ methods,
+} from '@togglecorp/react-rest-request';
+
+import { sanitizeResponse } from '#utils/common';
+import { wsEndpoint } from '#config/rest';
import schema from '#schema';
-import { alterResponseErrorToFaramError } from '#rest';
-const requestNotCreatedForStartMessage = 'REQUEST: start() called before init()';
-// const requestNotCreatedForStopMessage = 'REQUEST: stop() called before init()';
-const validationNotDefinedMessage = 'REQUEST: Validation is not defined';
-
-export default class Request {
- constructor(parent, { delay = 50, retryTime = 1000, maxRetryAttempts = 5 } = {}) {
- this.parent = parent;
-
- this.delay = delay;
-
- this.retryTime = retryTime;
- this.maxRetryAttempts = maxRetryAttempts;
-
- this.schemaName = undefined;
- }
-
- handleFatal = () => {
- // console.warn(error);
+export { methods, RequestHandler } from '@togglecorp/react-rest-request';
+
+const getFormData = (jsonData) => {
+ const formData = new FormData();
+ Object.keys(jsonData || {}).forEach(
+ (key) => {
+ const value = jsonData[key] || {};
+ if (value.prop && value.prop.constructor === Array) {
+ value.forEach(v => formData.append(key, v));
+ } else {
+ formData.append(key, value);
+ }
+ },
+ );
+ return formData;
+};
+
+export function getVersionedUrl(endpoint, url) {
+ const oldVersionString = '/v1';
+ const versionString = '/v2';
+ if (!url.startsWith(versionString)) {
+ return `${endpoint}${url}`;
}
+ const startIndex = 0;
+ const endIndex = endpoint.search(oldVersionString);
+ const newEndpoint = endpoint.slice(startIndex, endIndex);
+ return `${newEndpoint}${url}`;
+}
- start = () => {
- if (this.request) {
- this.request.start();
- } else {
- console.error(requestNotCreatedForStartMessage);
+const coordinatorOptions = {
+ transformParams: (data) => {
+ const {
+ body,
+ method,
+ extras = {},
+ } = data;
+
+ const newBody = extras.hasFile
+ ? getFormData(body)
+ : JSON.stringify(body);
+
+ const newHeaders = extras.hasFile
+ ? {
+ Accept: 'application/json',
+ }
+ : {
+ Accept: 'application/json',
+ 'Content-Type': 'application/json; charset=utf-8',
+ };
+
+ const params = {
+ method: method || methods.GET,
+ body: newBody,
+ headers: newHeaders,
+ };
+
+ // NOTE: This is a hack to bypass auth for S3 requests
+ // Need to fix this through use of new react-rest-request@2
+ // FIXME: react-rest-request@2 has been used
+ // need to fix this using extras
+
+ return params;
+ },
+
+ transformProps: (props) => {
+ const {
+ myToken, // eslint-disable-line no-unused-vars
+ ...otherProps
+ } = props;
+ return otherProps;
+ },
+
+ transformUrl: (url) => {
+ if (/^https?:\/\//i.test(url)) {
+ return url;
}
- }
+ return getVersionedUrl(wsEndpoint, url);
+ },
- stop = () => {
- if (this.request) {
- this.request.stop();
- }
- /*
- else {
- console.error(requestNotCreatedForStopMessage);
- }
- */
- }
+ transformResponse: (body, request) => {
+ const {
+ url,
+ method,
+ extras = {},
+ } = request;
+
+ // TODO: add null sanitization here
- successInterceptor = (response) => {
- if (this.schemaName !== undefined) {
+ if (extras.schemaName === undefined) {
+ // NOTE: usually there is no response body for DELETE
+ if (method !== methods.DELETE) {
+ console.error(`Schema is not defined for ${url} ${method}`);
+ }
+ } else {
try {
- schema.validate(response, this.schemaName);
+ schema.validate(body, extras.schemaName);
} catch (e) {
- console.error('NETWORK ERROR:', e);
- this.handleFatal({ errorMessage: e, errroCode: null });
- return;
+ console.error(url, method, body, e.message);
+ throw (e);
}
- } else {
- console.warn(validationNotDefinedMessage);
}
+ return sanitizeResponse(body);
+ },
- this.handleSuccess(response);
- }
+ transformErrors: response => ({ response }),
+};
- failureInterceptor = (response) => {
- const newResponse = alterResponseErrorToFaramError(response.errors);
- this.handleFailure(newResponse);
- }
+export const RequestCoordinator = compose(
+ createRequestCoordinator(coordinatorOptions),
+);
- createDefault = (createOptions) => {
- this.stop();
+export const RequestClient = createRequestClient;
- this.createOptions = createOptions;
+export const getResponse = (requests, key, defaultValue = {}) => {
+ const { response = defaultValue } = (requests || {})[key];
+ return response;
+};
- const {
- url,
- params,
- } = createOptions;
+export const getResults = (requests, key, defaultValue = []) => {
+ const {
+ response: {
+ results = defaultValue,
+ } = {},
+ } = (requests || {})[key];
- const request = new RestRequest(
- url,
- params,
- this.handleSuccess ? this.successInterceptor : undefined,
- this.handleFailure ? this.failureInterceptor : undefined,
- this.handleFatal,
- this.handleAbort,
- this.handlePreLoad,
- this.handlePostLoad,
- this.handleAfterLoad,
- this.retryTime,
- this.maxRetryTime,
- this.decayVal,
- this.maxRetryAttempts,
- this.pollTime,
- this.maxPollAttempts,
- this.shouldPoll,
- this.delay,
- );
-
- this.request = request;
+ return results;
+};
+
+export const getPending = (requests, key) => {
+ const {
+ pending,
+ } = (requests || {})[key];
+
+ return pending;
+};
+
+export const isAnyRequestPending = (requests) => {
+ if (!requests) {
+ return undefined;
}
-}
+
+ const requestKeys = Object.keys(requests);
+ const pending = requestKeys.some(
+ requestKey => requests[requestKey].pending,
+ );
+
+ return pending;
+};
diff --git a/client/src/utils/common.js b/client/src/utils/common.js
index bdb48df..1b413c3 100644
--- a/client/src/utils/common.js
+++ b/client/src/utils/common.js
@@ -1,3 +1,9 @@
+import {
+ isDefined,
+ isObject,
+ isList,
+} from '@togglecorp/fujs';
+
export const mapObjectToObject = (obj, fn) => {
const newObj = {};
Object.keys(obj).forEach((key) => {
@@ -20,3 +26,33 @@ export const pick = (obj, keys) => keys.reduce(
(acc, key) => ({ ...acc, [key]: obj[key] }),
{},
);
+
+export const forEach = (obj, func) => {
+ Object.keys(obj).forEach((key) => {
+ const val = obj[key];
+ func(key, val);
+ });
+};
+
+export const sanitizeResponse = (data) => {
+ if (data === null || data === undefined) {
+ return undefined;
+ }
+ if (isList(data)) {
+ return data.map(sanitizeResponse).filter(isDefined);
+ }
+ if (isObject(data)) {
+ let newData = {};
+ forEach(data, (k, val) => {
+ const newEntry = sanitizeResponse(val);
+ if (isDefined(newEntry)) {
+ newData = {
+ ...newData,
+ [k]: newEntry,
+ };
+ }
+ });
+ return newData;
+ }
+ return data;
+};
diff --git a/client/src/views/Career/CareerItem/index.js b/client/src/views/Career/CareerItem/index.js
new file mode 100644
index 0000000..3cb5c9d
--- /dev/null
+++ b/client/src/views/Career/CareerItem/index.js
@@ -0,0 +1,61 @@
+import React, { useCallback } from 'react';
+import PropTypes from 'prop-types';
+import ReactMarkdown from 'react-markdown';
+
+import Button from '#rsca/Button';
+
+import styles from './styles.scss';
+
+const CareerItem = ({
+ title,
+ description,
+ isActive,
+ setActive,
+ dataKey,
+}) => {
+ const handleExpandClick = useCallback(() => {
+ setActive(!isActive && dataKey);
+ }, [isActive, setActive, dataKey]);
+
+ return (
+
+
+ {isActive && (
+
+
+
+
+ )}
+
+ );
+};
+
+CareerItem.propTypes = {
+ title: PropTypes.string.isRequired,
+ description: PropTypes.string.isRequired,
+ isActive: PropTypes.bool.isRequired,
+ setActive: PropTypes.func.isRequired,
+ dataKey: PropTypes.number.isRequired,
+};
+
+export default CareerItem;
diff --git a/client/src/views/Career/CareerItem/styles.scss b/client/src/views/Career/CareerItem/styles.scss
new file mode 100644
index 0000000..f12d73d
--- /dev/null
+++ b/client/src/views/Career/CareerItem/styles.scss
@@ -0,0 +1,49 @@
+@import '~base-scss/base';
+
+.career-item {
+ .career-header {
+ display: flex;
+ align-items: center;
+ padding: $spacing-large;
+
+ &:last-child {
+ border-bottom: $width-separator-thin solid $color-separator;
+ }
+
+ .career-heading {
+ flex-grow: 1;
+ text-align: left;
+ text-transform: unset;
+ color: $color-accent;
+ font-size: 1.5em;
+ font-weight: $font-weight-bold;
+ }
+
+ .button {
+ flex-shrink: 0;
+ }
+ }
+
+ .description {
+ padding: $spacing-small $spacing-large;
+ }
+
+ .footer {
+ display: flex;
+ justify-content: flex-end;
+ padding: $spacing-small $spacing-large $spacing-medium;
+
+ .apply-link {
+ @extend %button-like-link;
+ background-color: $color-accent;
+ text-decoration: none;
+ color: #fff;
+ }
+ }
+
+ &:not(:last-child) {
+ .footer {
+ border-bottom: $width-separator-thin solid $color-separator;
+ }
+ }
+}
diff --git a/client/src/views/Career/index.js b/client/src/views/Career/index.js
new file mode 100644
index 0000000..bd487db
--- /dev/null
+++ b/client/src/views/Career/index.js
@@ -0,0 +1,115 @@
+import React, { useCallback, useState } from 'react';
+import PropTypes from 'prop-types';
+import { Link } from 'react-router-dom';
+
+import ListView from '#rscv/List/ListView';
+
+import {
+ RequestCoordinator,
+ RequestClient,
+ methods,
+} from '#utils/Request';
+
+import CareerItem from './CareerItem';
+import styles from './styles.scss';
+
+const EmptyComponent = () => (
+
+
+ We do not have any openings right now, but please send your resume and your interest at
+
+ hr@togglecorp.com
+
+ .
+
+
+);
+
+const propTypes = {
+ requests: PropTypes.object.isRequired, // eslint-disable-line react/forbid-prop-types
+};
+
+const careerKeySelector = d => d.id;
+
+const requestOptions = {
+ careerGet: {
+ url: '/careers/',
+ method: methods.GET,
+ onMount: true,
+ },
+};
+
+function Career(props) {
+ const {
+ requests: {
+ careerGet: {
+ response = [],
+ },
+ },
+ } = props;
+
+ const [active, setActive] = useState();
+
+ const careerItemsRendererParams = useCallback((key, data) => ({
+ dataKey: data.id,
+ title: data.title,
+ isActive: data.id === active,
+ setActive,
+ description: data.description,
+ }), [active, setActive]);
+
+ return (
+
+
+
+
+
+ Toggle corp
+
+
+
+
+ Work with us
+
+
+ Togglecorp is changing the way softwares are built.
+ We are looking to hire smart people to be a part of our team.
+ If you are passionate about quality softwares and love the minimalist
+ approach to problem solving,
+ please apply to one of the following open positions.
+
+
+
+
+
+
+
+ );
+}
+
+Career.propTypes = propTypes;
+
+export default RequestCoordinator(RequestClient(requestOptions)(Career));
diff --git a/client/src/views/Career/styles.scss b/client/src/views/Career/styles.scss
new file mode 100644
index 0000000..8fc45c5
--- /dev/null
+++ b/client/src/views/Career/styles.scss
@@ -0,0 +1,135 @@
+@import '~base-scss/base';
+
+.career-page {
+ display: flex;
+ align-items: center;
+ flex-direction: column;
+ background-color: #fff;
+ width: 100vw;
+ height: 100vh;
+ overflow-x: hidden;
+ overflow-y: auto;
+
+ .header {
+ display: flex;
+ flex-direction: column;
+ flex-shrink: 0;
+ border-bottom: $width-separator-thin solid $color-separator;
+ /*
+ background-color: #fc5296;
+ background-image: linear-gradient(315deg, #fc5296 0%, #f67062 74%);
+ */
+ background-color: #0cbaba;
+ background-image: linear-gradient(315deg, #0cbaba 0%, #380036 74%);
+
+ padding: 0 $spacing-super-large $spacing-super-large;
+ width: 100%;
+ text-align: center;
+ color: #fff;
+
+ .navigation {
+ margin: auto;
+ padding: $spacing-large 0;
+ width: 80vw;
+ max-width: 720px;
+ text-align: left;
+
+ .nav-link {
+ text-decoration: none;
+ color: #fff;
+ }
+
+ h1 {
+ margin: 0;
+ padding: 0;
+ text-transform: lowercase;
+ line-height: 1;
+
+ span:last-child {
+ color: $color-accent;
+ }
+ }
+ }
+
+ .heading {
+ padding: $spacing-large;
+ text-transform: unset;
+ font-size: 36px;
+ font-weight: bold;
+ }
+
+ .description {
+ margin: $spacing-medium auto;
+ max-width: 720px;
+ text-align: center;
+ font-size: 20px;
+ }
+ }
+
+ .content {
+ display: flex;
+ flex-direction: column;
+ flex-grow: 1;
+ width: 100vw;
+
+ .career {
+ display: flex;
+ flex-direction: column;
+ flex-grow: 1;
+ margin: auto;
+ padding: $spacing-large;
+ width: 80vw;
+ max-width: 720px;
+
+ .empty-component {
+ display: inline-flex;
+ align-items: center;
+ flex-direction: column;
+ flex-grow: 1;
+ justify-content: center;
+ opacity: 0.8;
+ text-align: center;
+ font-size: $font-size-large;
+ }
+ }
+ }
+
+ .footer {
+ border-top: $width-separator-thin solid $color-separator;
+ padding: $spacing-small;
+ width: 100vw;
+
+ .inner-child {
+ margin: auto;
+ width: 80vw;
+ max-width: 720px;
+ text-align: center;
+ }
+ }
+
+ .link {
+ margin: 0 3px;
+ text-transform: unset;
+ color: #1261a0;
+ }
+
+ @media screen and (max-width: 720px) {
+ .header {
+ padding: 0 $spacing-large $spacing-large;
+
+ .heading {
+ font-size: 24px;
+ }
+
+ .description {
+ font-size: 16px;
+ }
+ }
+
+ .content {
+ .career {
+ width: 96vw;
+ }
+ }
+ }
+}
diff --git a/client/src/views/Home/Team/Member/styles.scss b/client/src/views/Home/Team/Member/styles.scss
index 2fc8a07..d6c57f1 100644
--- a/client/src/views/Home/Team/Member/styles.scss
+++ b/client/src/views/Home/Team/Member/styles.scss
@@ -41,8 +41,8 @@
overflow: hidden;
.image {
- border-radius: 0;
transition: 10s transform ease-in-out;
+ border-radius: 0;
width: 160px;
height: 100%;
object-fit: cover;
diff --git a/client/src/views/Home/index.js b/client/src/views/Home/index.js
index c304d5a..722e1d1 100644
--- a/client/src/views/Home/index.js
+++ b/client/src/views/Home/index.js
@@ -1,9 +1,14 @@
import React from 'react';
import PropTypes from 'prop-types';
import { connect } from 'react-redux';
+import { Link } from 'react-router-dom';
import AnchorLink from '#components/AnchorLink';
-import LoadingAnimation from '#rscv/LoadingAnimation';
+import {
+ RequestCoordinator,
+ RequestClient,
+ methods,
+} from '#utils/Request';
import {
setMembersAction,
@@ -17,11 +22,6 @@ import Expertise from './Expertise';
import Clients from './Clients';
import Team from './Team';
-import MembersGetRequest from './requests/MembersGetRequest';
-import ClientsGetRequest from './requests/ClientsGetRequest';
-import ServicesGetRequest from './requests/ServicesGetRequest';
-import TechnologySectionsGetRequest from './requests/TechnologySectionsGetRequest';
-
import styles from './styles.scss';
const linkList = [
@@ -58,9 +58,10 @@ const linkList = [
];
const propTypes = {
- setMembers: PropTypes.func.isRequired,
- setClients: PropTypes.func.isRequired,
- setServices: PropTypes.func.isRequired,
+ setMembers: PropTypes.func.isRequired, // eslint-disable-line react/no-unused-prop-types
+ setClients: PropTypes.func.isRequired, // eslint-disable-line react/no-unused-prop-types
+ setServices: PropTypes.func.isRequired, // eslint-disable-line react/no-unused-prop-types
+ // eslint-disable-next-line react/no-unused-prop-types
setTechnologySections: PropTypes.func.isRequired,
};
@@ -71,54 +72,72 @@ const mapDispatchToProps = dispatch => ({
setTechnologySections: params => dispatch(setTechnologySectionsAction(params)),
});
+const requestOptions = {
+ membersGet: {
+ url: '/members/',
+ method: methods.GET,
+ onMount: true,
+ onSuccess: ({
+ props: { setMembers },
+ response,
+ }) => {
+ setMembers(response);
+ },
+ extras: {
+ schemaName: 'array.member',
+ },
+ },
+ clientsGet: {
+ url: '/clients/',
+ method: methods.GET,
+ onMount: true,
+ onSuccess: ({
+ props: { setClients },
+ response,
+ }) => {
+ setClients(response);
+ },
+ extras: {
+ schemaName: 'array.client',
+ },
+ },
+ servicesGet: {
+ url: '/services/',
+ method: methods.GET,
+ onMount: true,
+ onSuccess: ({
+ props: { setServices },
+ response,
+ }) => {
+ setServices(response);
+ },
+ extras: {
+ schemaName: 'array.service',
+ },
+ },
+ technologiesGet: {
+ url: '/technology-sections/',
+ method: methods.GET,
+ onMount: true,
+ onSuccess: ({
+ props: { setTechnologySections },
+ response,
+ }) => {
+ setTechnologySections(response);
+ },
+ extras: {
+ schemaName: 'array.technologySection',
+ },
+ },
+};
+
@connect(undefined, mapDispatchToProps)
+@RequestCoordinator
+@RequestClient(requestOptions)
export default class Home extends React.PureComponent {
static propTypes = propTypes;
- constructor(props) {
- super(props);
-
- this.state = {
- serviceLoading: true,
- clientLoading: true,
- technologySectionLoading: true,
- memberLoading: true,
- };
-
- // Requests
- this.membersGetRequest = new MembersGetRequest({
- setState: v => this.setState(v),
- setMembers: this.props.setMembers,
- });
- this.clientsGetRequest = new ClientsGetRequest({
- setState: v => this.setState(v),
- setClients: this.props.setClients,
- });
- this.servicesGetRequest = new ServicesGetRequest({
- setState: v => this.setState(v),
- setServices: this.props.setServices,
- });
- this.technologySectionsGetRequest = new TechnologySectionsGetRequest({
- setState: v => this.setState(v),
- setTechnologySections: this.props.setTechnologySections,
- });
- }
-
- componentDidMount() {
- this.membersGetRequest.init().start();
- this.clientsGetRequest.init().start();
- this.servicesGetRequest.init().start();
- this.technologySectionsGetRequest.init().start();
- }
-
- componentWillUnmount() {
- this.membersGetRequest.stop();
- this.clientsGetRequest.stop();
- this.servicesGetRequest.stop();
- this.technologySectionsGetRequest.stop();
- }
-
handleDownButtonClick = (section) => {
const servicesContainer = document.getElementsByClassName(styles[section])[0];
@@ -161,6 +180,13 @@ export default class Home extends React.PureComponent {
))}
+
+
+ Career
+
+
{this.renderHeader()}
diff --git a/client/src/views/Home/requests/ClientsGetRequest.js b/client/src/views/Home/requests/ClientsGetRequest.js
deleted file mode 100644
index 407e46f..0000000
--- a/client/src/views/Home/requests/ClientsGetRequest.js
+++ /dev/null
@@ -1,32 +0,0 @@
-import {
- urlForClients,
- createParamsForGet,
-} from '#rest';
-
-import Request from '#utils/Request';
-
-export default class ClientsGetRequest extends Request {
- schemaName = 'array.client'
-
- handlePreLoad = () => {
- this.parent.setState({ clientLoading: true });
- }
-
- handlePostLoad = () => {
- this.parent.setState({ clientLoading: false });
- }
-
- handleSuccess = (response) => {
- this.parent.setClients(response);
- }
-
- // TODO: Handle Fatal and Failure
-
- init = () => {
- this.createDefault({
- url: urlForClients,
- params: createParamsForGet,
- });
- return this;
- }
-}
diff --git a/client/src/views/Home/requests/MembersGetRequest.js b/client/src/views/Home/requests/MembersGetRequest.js
deleted file mode 100644
index a98d8d7..0000000
--- a/client/src/views/Home/requests/MembersGetRequest.js
+++ /dev/null
@@ -1,32 +0,0 @@
-import {
- urlForMembers,
- createParamsForGet,
-} from '#rest';
-
-import Request from '#utils/Request';
-
-export default class MembersGetRequest extends Request {
- schemaName = 'array.member'
-
- handlePreLoad = () => {
- this.parent.setState({ memberLoading: true });
- }
-
- handlePostLoad = () => {
- this.parent.setState({ memberLoading: false });
- }
-
- handleSuccess = (response) => {
- this.parent.setMembers(response);
- }
-
- // TODO: Handle Fatal and Failure
-
- init = () => {
- this.createDefault({
- url: urlForMembers,
- params: createParamsForGet,
- });
- return this;
- }
-}
diff --git a/client/src/views/Home/requests/ServicesGetRequest.js b/client/src/views/Home/requests/ServicesGetRequest.js
deleted file mode 100644
index c89f942..0000000
--- a/client/src/views/Home/requests/ServicesGetRequest.js
+++ /dev/null
@@ -1,32 +0,0 @@
-import {
- urlForServices,
- createParamsForGet,
-} from '#rest';
-
-import Request from '#utils/Request';
-
-export default class ServicesGetRequest extends Request {
- schemaName = 'array.service'
-
- handlePreLoad = () => {
- this.parent.setState({ serviceLoading: true });
- }
-
- handlePostLoad = () => {
- this.parent.setState({ serviceLoading: false });
- }
-
- handleSuccess = (response) => {
- this.parent.setServices(response);
- }
-
- // TODO: Handle Fatal and Failure
-
- init = () => {
- this.createDefault({
- url: urlForServices,
- params: createParamsForGet,
- });
- return this;
- }
-}
diff --git a/client/src/views/Home/requests/TechnologySectionsGetRequest.js b/client/src/views/Home/requests/TechnologySectionsGetRequest.js
deleted file mode 100644
index a0140e7..0000000
--- a/client/src/views/Home/requests/TechnologySectionsGetRequest.js
+++ /dev/null
@@ -1,32 +0,0 @@
-import {
- urlForTechnologySection,
- createParamsForGet,
-} from '#rest';
-
-import Request from '#utils/Request';
-
-export default class TechnologySectionsGetRequest extends Request {
- schemaName = 'array.technologySection'
-
- handlePreLoad = () => {
- this.parent.setState({ technologySectionLoading: true });
- }
-
- handlePostLoad = () => {
- this.parent.setState({ technologySectionLoading: false });
- }
-
- handleSuccess = (response) => {
- this.parent.setTechnologySections(response);
- }
-
- // TODO: Handle Fatal and Failure
-
- init = () => {
- this.createDefault({
- url: urlForTechnologySection,
- params: createParamsForGet,
- });
- return this;
- }
-}
diff --git a/client/src/views/Home/styles.scss b/client/src/views/Home/styles.scss
index dcd3f28..1b9450c 100644
--- a/client/src/views/Home/styles.scss
+++ b/client/src/views/Home/styles.scss
@@ -7,6 +7,22 @@
width: 100%;
overflow: hidden;
+ a {
+ outline: none;
+ text-transform: uppercase;
+ text-decoration: none;
+ color: inherit;
+ }
+
+ h1,
+ h2,
+ h3,
+ h4,
+ h5 {
+ text-transform: uppercase;
+ font-weight: $font-weight-light;
+ }
+
nav {
ul {
display: flex;
diff --git a/client/yarn.lock b/client/yarn.lock
index 59b6d1a..f22bc89 100644
--- a/client/yarn.lock
+++ b/client/yarn.lock
@@ -838,6 +838,13 @@
dependencies:
regenerator-runtime "^0.12.0"
+"@babel/runtime@^7.7.7":
+ version "7.9.6"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.9.6.tgz#a9102eb5cadedf3f31d08a9ecf294af7827ea29f"
+ integrity sha512-64AF1xY3OAkFHqOb9s4jpgk1Mm5vDZ4L3acHvAml+53nO1XbXLuDodsVpO4OIUsmemlUHMxNdYMNJmsvOwLrvQ==
+ dependencies:
+ regenerator-runtime "^0.13.4"
+
"@babel/template@7.0.0-beta.44":
version "7.0.0-beta.44"
resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0-beta.44.tgz#f8832f4fdcee5d59bf515e595fc5106c529b394f"
@@ -1044,10 +1051,25 @@
version "0.7.0"
resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.7.0.tgz#9a06f4f137ee84d7df0460c1fdb1135ffa6c50fd"
+"@togglecorp/fujs@^1.8.0", "@togglecorp/fujs@^1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@togglecorp/fujs/-/fujs-1.9.0.tgz#4eaa76021a150c651c580562ff8cf09aed89b558"
+ integrity sha512-4DmIMMK+W/rxzAm+IQvdo2MGKQsj/8ViaT9K6UIpkHdullu5EINZuDkttLMvopeV6YyDj1YseOz8BLw/3Nte2A==
+ dependencies:
+ "@babel/runtime" "^7.7.7"
+
"@togglecorp/ravl@^1.0.2":
version "1.0.2"
resolved "https://registry.yarnpkg.com/@togglecorp/ravl/-/ravl-1.0.2.tgz#d1c6536369d0393c4db899bd9ec804c20d3ca7aa"
+"@togglecorp/react-rest-request@^2.4.5":
+ version "2.4.5"
+ resolved "https://registry.yarnpkg.com/@togglecorp/react-rest-request/-/react-rest-request-2.4.5.tgz#ace182d53a259cf539b9db5b4d3256f252f66bcb"
+ integrity sha512-/VA+itpWYesjN/0YNJhGV1c2EZc5SyiaWtJOzamTouPat+B7usKU1cjFWS9qHbEP75AEY1tzzfaxXOcam+Hgcg==
+ dependencies:
+ "@togglecorp/fujs" "^1.8.0"
+ hoist-non-react-statics "^3.3.0"
+
"@types/events@*":
version "3.0.0"
resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7"
@@ -1492,6 +1514,7 @@ arrify@^1.0.0, arrify@^1.0.1:
asap@~2.0.3:
version "2.0.6"
resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46"
+ integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=
asn1.js@^4.0.0:
version "4.10.1"
@@ -2755,14 +2778,15 @@ camelcase@^2.0.0:
version "2.1.1"
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f"
-camelcase@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a"
-
camelcase@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
+camelcase@^5.0.0:
+ version "5.3.1"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
+ integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
+
caniuse-api@^1.5.2:
version "1.6.1"
resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-1.6.1.tgz#b534e7c734c4f81ec5fbe8aca2ad24354b962c6c"
@@ -2999,14 +3023,6 @@ cliui@^2.1.0:
right-align "^0.1.1"
wordwrap "0.0.2"
-cliui@^3.2.0:
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
- dependencies:
- string-width "^1.0.1"
- strip-ansi "^3.0.1"
- wrap-ansi "^2.0.0"
-
cliui@^4.0.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49"
@@ -3015,6 +3031,15 @@ cliui@^4.0.0:
strip-ansi "^4.0.0"
wrap-ansi "^2.0.0"
+cliui@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5"
+ integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==
+ dependencies:
+ string-width "^3.1.0"
+ strip-ansi "^5.2.0"
+ wrap-ansi "^5.1.0"
+
clone-buffer@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58"
@@ -3266,6 +3291,7 @@ copy-descriptor@^0.1.0:
core-js@^1.0.0:
version "1.2.7"
resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636"
+ integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=
core-js@^2.4.0, core-js@^2.4.1, core-js@^2.5.0:
version "2.5.7"
@@ -3705,7 +3731,7 @@ decamelize-keys@^1.0.0:
decamelize "^1.1.0"
map-obj "^1.0.0"
-decamelize@^1.0.0, decamelize@^1.1.0, decamelize@^1.1.1, decamelize@^1.1.2:
+decamelize@^1.0.0, decamelize@^1.1.0, decamelize@^1.1.1, decamelize@^1.1.2, decamelize@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
@@ -3917,6 +3943,14 @@ dom-serializer@0, dom-serializer@~0.1.0:
domelementtype "~1.1.1"
entities "~1.1.1"
+dom-serializer@^0.2.1:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51"
+ integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==
+ dependencies:
+ domelementtype "^2.0.1"
+ entities "^2.0.0"
+
dom-walk@^0.1.0:
version "0.1.1"
resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018"
@@ -3934,6 +3968,11 @@ domelementtype@^1.3.1:
resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f"
integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==
+domelementtype@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d"
+ integrity sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==
+
domelementtype@~1.1.1:
version "1.1.3"
resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b"
@@ -3956,6 +3995,13 @@ domhandler@^2.3.0:
dependencies:
domelementtype "1"
+domhandler@^3.0, domhandler@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-3.0.0.tgz#51cd13efca31da95bbb0c5bee3a48300e333b3e9"
+ integrity sha512-eKLdI5v9m67kbXQbJSNn1zjh0SDzvzWVWtX+qEI3eMjZw8daH9k8rlj1FZY9memPwjiskQFbe7vHVVJIAqoEhw==
+ dependencies:
+ domelementtype "^2.0.1"
+
domutils@1.1:
version "1.1.6"
resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.1.6.tgz#bddc3de099b9a2efacc51c623f28f416ecc57485"
@@ -3976,6 +4022,15 @@ domutils@^1.5.1:
dom-serializer "0"
domelementtype "1"
+domutils@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.1.0.tgz#7ade3201af43703fde154952e3a868eb4b635f16"
+ integrity sha512-CD9M0Dm1iaHfQ1R/TI+z3/JWp/pgub0j4jIQKH89ARR4ATAV2nbaOQS5XxU9maJP5jHaPdDDQSEHuE2UmpUTKg==
+ dependencies:
+ dom-serializer "^0.2.1"
+ domelementtype "^2.0.1"
+ domhandler "^3.0.0"
+
dot-prop@^4.1.1:
version "4.2.0"
resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57"
@@ -4074,6 +4129,7 @@ encodeurl@~1.0.2:
encoding@^0.1.11:
version "0.1.12"
resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb"
+ integrity sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=
dependencies:
iconv-lite "~0.4.13"
@@ -4095,6 +4151,11 @@ entities@^1.1.1, entities@~1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0"
+entities@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.2.tgz#ac74db0bba8d33808bbf36809c3a5c3683531436"
+ integrity sha512-dmD3AvJQBUjKpcNkoqr+x+IF0SdRtPz9Vk0uTy4yWqga9ibB6s4v++QFWNohjiUGoMlF552ZvNyXDxz5iW0qmw==
+
envinfo@^5.7.0:
version "5.10.0"
resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-5.10.0.tgz#503a9774ae15b93ea68bdfae2ccd6306624ea6df"
@@ -4721,6 +4782,7 @@ fb-watchman@^2.0.0:
fbjs@^0.8.16:
version "0.8.17"
resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd"
+ integrity sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=
dependencies:
core-js "^1.0.0"
isomorphic-fetch "^2.1.1"
@@ -5057,6 +5119,11 @@ get-caller-file@^1.0.1:
version "1.0.3"
resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a"
+get-caller-file@^2.0.1:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
+ integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
+
get-stdin@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe"
@@ -5489,6 +5556,13 @@ hoist-non-react-statics@^2.5.0:
version "2.5.5"
resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz#c5903cf409c0dfd908f388e619d86b9c1174cb47"
+hoist-non-react-statics@^3.3.0:
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45"
+ integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==
+ dependencies:
+ react-is "^16.7.0"
+
home-or-tmp@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8"
@@ -5550,6 +5624,16 @@ html-tags@^3.0.0:
resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.1.0.tgz#7b5e6f7e665e9fb41f30007ed9e0d41e97fb2140"
integrity sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==
+html-to-react@^1.3.4:
+ version "1.4.2"
+ resolved "https://registry.yarnpkg.com/html-to-react/-/html-to-react-1.4.2.tgz#7b628ab56cd63a52f2d0b79d0fa838a51f088a57"
+ integrity sha512-TdTfxd95sRCo6QL8admCkE7mvNNrXtGoVr1dyS+7uvc8XCqAymnf/6ckclvnVbQNUo2Nh21VPwtfEHd0khiV7g==
+ dependencies:
+ domhandler "^3.0"
+ htmlparser2 "^4.0"
+ lodash.camelcase "^4.3.0"
+ ramda "^0.26"
+
html-webpack-plugin@^3.2.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz#b01abbd723acaaa7b37b6af4492ebda03d9dd37b"
@@ -5585,6 +5669,16 @@ htmlparser2@^3.9.1, htmlparser2@^3.9.2:
inherits "^2.0.1"
readable-stream "^2.0.2"
+htmlparser2@^4.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-4.1.0.tgz#9a4ef161f2e4625ebf7dfbe6c0a2f52d18a59e78"
+ integrity sha512-4zDq1a1zhE4gQso/c5LP1OtrhYTncXNSpvJYtWJBtXAETPlMfi3IFNjGuQbYLuVY4ZR0QMqRVvo4Pdy9KLyP8Q==
+ dependencies:
+ domelementtype "^2.0.1"
+ domhandler "^3.0.0"
+ domutils "^2.0.0"
+ entities "^2.0.0"
+
htmlparser2@~3.3.0:
version "3.3.0"
resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.3.0.tgz#cc70d05a59f6542e43f0e685c982e14c924a9efe"
@@ -5666,6 +5760,7 @@ iconv-lite@0.4.23:
iconv-lite@^0.4.17, iconv-lite@^0.4.22, iconv-lite@^0.4.4, iconv-lite@~0.4.13:
version "0.4.24"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
+ integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
dependencies:
safer-buffer ">= 2.1.2 < 3"
@@ -6180,6 +6275,7 @@ is-scoped@^1.0.0:
is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
+ integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ=
is-string@^1.0.4:
version "1.0.4"
@@ -6258,6 +6354,7 @@ isobject@^3.0.0, isobject@^3.0.1:
isomorphic-fetch@^2.1.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9"
+ integrity sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=
dependencies:
node-fetch "^1.0.1"
whatwg-fetch ">=0.10.0"
@@ -6660,6 +6757,7 @@ js-tokens@^3.0.0, js-tokens@^3.0.2:
"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
+ integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
js-yaml@^3.10.0, js-yaml@^3.7.0, js-yaml@^3.9.0, js-yaml@^3.9.1:
version "3.12.0"
@@ -7169,9 +7267,10 @@ longest@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097"
-loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1:
+loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
+ integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
dependencies:
js-tokens "^3.0.0 || ^4.0.0"
@@ -7308,6 +7407,13 @@ md5.js@^1.3.4:
hash-base "^3.0.0"
inherits "^2.0.1"
+mdast-add-list-metadata@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/mdast-add-list-metadata/-/mdast-add-list-metadata-1.0.1.tgz#95e73640ce2fc1fa2dcb7ec443d09e2bfe7db4cf"
+ integrity sha512-fB/VP4MJ0LaRsog7hGPxgOrSL3gE/2uEdZyDuSEnKCv/8IkYHiDkIQSbChiJoHyxZZXZ9bzckyRk+vNxFzh8rA==
+ dependencies:
+ unist-util-visit-parents "1.1.2"
+
mdast-util-compact@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/mdast-util-compact/-/mdast-util-compact-1.0.2.tgz#c12ebe16fffc84573d3e19767726de226e95f649"
@@ -7740,6 +7846,7 @@ node-dir@0.1.8:
node-fetch@^1.0.1:
version "1.7.3"
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef"
+ integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==
dependencies:
encoding "^0.1.11"
is-stream "^1.0.1"
@@ -7829,10 +7936,10 @@ node-releases@^1.1.38:
dependencies:
semver "^6.3.0"
-node-sass@4.12.0:
- version "4.12.0"
- resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.12.0.tgz#0914f531932380114a30cc5fa4fa63233a25f017"
- integrity sha512-A1Iv4oN+Iel6EPv77/HddXErL2a+gZ4uBeZUy+a8O35CFYTXhgA8MgLCWBtwpGZdCvTvQ9d+bQxX/QC36GDPpQ==
+node-sass@^4.14.1:
+ version "4.14.1"
+ resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.14.1.tgz#99c87ec2efb7047ed638fb4c9db7f3a42e2217b5"
+ integrity sha512-sjCuOlvGyCJS40R8BscF5vhVlQjNN069NtQ1gSxyK1u9iqvn6tf7O1R4GNowVZfiZUCRt5MmMs1xd+4V/7Yr0g==
dependencies:
async-foreach "^0.1.3"
chalk "^1.1.1"
@@ -7841,14 +7948,14 @@ node-sass@4.12.0:
get-stdin "^4.0.1"
glob "^7.0.3"
in-publish "^2.0.0"
- lodash "^4.17.11"
+ lodash "^4.17.15"
meow "^3.7.0"
mkdirp "^0.5.1"
nan "^2.13.2"
node-gyp "^3.8.0"
npmlog "^4.0.0"
request "^2.88.0"
- sass-graph "^2.2.4"
+ sass-graph "2.2.5"
stdout-stream "^1.4.0"
"true-case-path" "^1.0.2"
@@ -7970,6 +8077,7 @@ oauth-sign@~0.9.0:
object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+ integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
object-copy@^0.1.0:
version "0.1.0"
@@ -8137,12 +8245,6 @@ os-homedir@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
-os-locale@^1.4.0:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9"
- dependencies:
- lcid "^1.0.0"
-
os-locale@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2"
@@ -8996,16 +9098,26 @@ promise-inflight@^1.0.1:
promise@^7.1.1:
version "7.3.1"
resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf"
+ integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==
dependencies:
asap "~2.0.3"
-prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.7, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2:
+prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.7, prop-types@^15.6.1, prop-types@^15.6.2:
version "15.6.2"
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.2.tgz#05d5ca77b4453e985d60fc7ff8c859094a497102"
dependencies:
loose-envify "^1.3.1"
object-assign "^4.1.1"
+prop-types@^15.6.0, prop-types@^15.7.2:
+ version "15.7.2"
+ resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5"
+ integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==
+ dependencies:
+ loose-envify "^1.4.0"
+ object-assign "^4.1.1"
+ react-is "^16.8.1"
+
protocol-buffers-schema@^3.3.1:
version "3.3.2"
resolved "https://registry.yarnpkg.com/protocol-buffers-schema/-/protocol-buffers-schema-3.3.2.tgz#00434f608b4e8df54c59e070efeefc37fb4bb859"
@@ -9131,6 +9243,11 @@ railroad-diagrams@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz#eb7e6267548ddedfb899c1b90e57374559cddb7e"
+ramda@^0.26:
+ version "0.26.1"
+ resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.26.1.tgz#8d41351eb8111c55353617fc3bbffad8e4d35d06"
+ integrity sha512-hLWjpy7EnsDBb0p+Z3B7rPi3GDeRG5ZtiI33kJhTt+ORCd38AbAIjB/9zRIUoeTbE/AVX5ZkU7m6bznsvrf8eQ==
+
randexp@0.4.6:
version "0.4.6"
resolved "https://registry.yarnpkg.com/randexp/-/randexp-0.4.6.tgz#e986ad5e5e31dae13ddd6f7b3019aa7c87f60ca3"
@@ -9209,13 +9326,14 @@ react-color@^2.14.1:
tinycolor2 "^1.4.1"
react-dom@^16.3.2:
- version "16.4.2"
- resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.4.2.tgz#4afed569689f2c561d2b8da0b819669c38a0bda4"
+ version "16.13.1"
+ resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.13.1.tgz#c1bd37331a0486c078ee54c4740720993b2e0e7f"
+ integrity sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag==
dependencies:
- fbjs "^0.8.16"
loose-envify "^1.1.0"
object-assign "^4.1.1"
- prop-types "^15.6.0"
+ prop-types "^15.6.2"
+ scheduler "^0.19.1"
react-focus-trap@^2.5.0:
version "2.6.0"
@@ -9243,6 +9361,25 @@ react-is@^16.4.2:
version "16.4.2"
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.4.2.tgz#84891b56c2b6d9efdee577cc83501dfc5ecead88"
+react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.6:
+ version "16.13.1"
+ resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
+ integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
+
+react-markdown@^4.3.1:
+ version "4.3.1"
+ resolved "https://registry.yarnpkg.com/react-markdown/-/react-markdown-4.3.1.tgz#39f0633b94a027445b86c9811142d05381300f2f"
+ integrity sha512-HQlWFTbDxTtNY6bjgp3C3uv1h2xcjCSi1zAEzfBW9OwJJvENSYiLXWNXN5hHLsoqai7RnZiiHzcnWdXk2Splzw==
+ dependencies:
+ html-to-react "^1.3.4"
+ mdast-add-list-metadata "1.0.1"
+ prop-types "^15.7.2"
+ react-is "^16.8.6"
+ remark-parse "^5.0.0"
+ unified "^6.1.5"
+ unist-util-visit "^1.3.0"
+ xtend "^4.0.1"
+
react-redux@^5.0.7:
version "5.0.7"
resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-5.0.7.tgz#0dc1076d9afb4670f993ffaef44b8f8c1155a4c8"
@@ -9317,7 +9454,7 @@ react-test-renderer@^16.0.0-0, react-test-renderer@^16.3.2:
prop-types "^15.6.0"
react-is "^16.4.2"
-"react@^15.6.2 || ^16.0", react@^16.3.2:
+"react@^15.6.2 || ^16.0":
version "16.4.2"
resolved "https://registry.yarnpkg.com/react/-/react-16.4.2.tgz#2cd90154e3a9d9dd8da2991149fdca3c260e129f"
dependencies:
@@ -9326,6 +9463,15 @@ react-test-renderer@^16.0.0-0, react-test-renderer@^16.3.2:
object-assign "^4.1.1"
prop-types "^15.6.0"
+react@^16.3.2:
+ version "16.13.1"
+ resolved "https://registry.yarnpkg.com/react/-/react-16.13.1.tgz#2e818822f1a9743122c063d6410d85c1e3afe48e"
+ integrity sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w==
+ dependencies:
+ loose-envify "^1.1.0"
+ object-assign "^4.1.1"
+ prop-types "^15.6.2"
+
reactcss@^1.2.0:
version "1.2.3"
resolved "https://registry.yarnpkg.com/reactcss/-/reactcss-1.2.3.tgz#c00013875e557b1cf0dfd9a368a1c3dab3b548dd"
@@ -9540,6 +9686,11 @@ regenerator-runtime@^0.12.0:
version "0.12.1"
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de"
+regenerator-runtime@^0.13.4:
+ version "0.13.5"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697"
+ integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==
+
regenerator-transform@^0.10.0:
version "0.10.1"
resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd"
@@ -9642,6 +9793,27 @@ remark-parse@^4.0.0:
vfile-location "^2.0.0"
xtend "^4.0.1"
+remark-parse@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-5.0.0.tgz#4c077f9e499044d1d5c13f80d7a98cf7b9285d95"
+ integrity sha512-b3iXszZLH1TLoyUzrATcTQUZrwNl1rE70rVdSruJFlDaJ9z5aMkhrG43Pp68OgfHndL/ADz6V69Zow8cTQu+JA==
+ dependencies:
+ collapse-white-space "^1.0.2"
+ is-alphabetical "^1.0.0"
+ is-decimal "^1.0.0"
+ is-whitespace-character "^1.0.0"
+ is-word-character "^1.0.0"
+ markdown-escapes "^1.0.0"
+ parse-entities "^1.1.0"
+ repeat-string "^1.5.4"
+ state-toggle "^1.0.0"
+ trim "0.0.1"
+ trim-trailing-lines "^1.0.0"
+ unherit "^1.0.4"
+ unist-util-remove-position "^1.0.0"
+ vfile-location "^2.0.0"
+ xtend "^4.0.1"
+
remark-parse@^6.0.0:
version "6.0.3"
resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-6.0.3.tgz#c99131052809da482108413f87b0ee7f52180a3a"
@@ -9806,6 +9978,11 @@ require-main-filename@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
+require-main-filename@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b"
+ integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==
+
require-uncached@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3"
@@ -10004,6 +10181,7 @@ safe-regex@^1.1.0:
"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
version "2.1.2"
resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+ integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
sane@^2.0.0:
version "2.5.2"
@@ -10020,14 +10198,15 @@ sane@^2.0.0:
optionalDependencies:
fsevents "^1.2.3"
-sass-graph@^2.2.4:
- version "2.2.4"
- resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49"
+sass-graph@2.2.5:
+ version "2.2.5"
+ resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.5.tgz#a981c87446b8319d96dce0671e487879bd24c2e8"
+ integrity sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag==
dependencies:
glob "^7.0.0"
lodash "^4.0.0"
scss-tokenizer "^0.2.3"
- yargs "^7.0.0"
+ yargs "^13.3.2"
sass-loader@^7.3.1:
version "7.3.1"
@@ -10044,6 +10223,14 @@ sax@>=0.6.0, sax@^1.2.4, sax@~1.2.1:
version "1.2.4"
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
+scheduler@^0.19.1:
+ version "0.19.1"
+ resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.1.tgz#4f3e2ed2c1a7d65681f4c854fa8c5a1ccb40f196"
+ integrity sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==
+ dependencies:
+ loose-envify "^1.1.0"
+ object-assign "^4.1.1"
+
schema-utils@^0.4.4, schema-utils@^0.4.5:
version "0.4.7"
resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.7.tgz#ba74f597d2be2ea880131746ee17d0a093c68187"
@@ -10169,6 +10356,7 @@ set-value@^2.0.0:
setimmediate@^1.0.4, setimmediate@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
+ integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=
setprototypeof@1.0.3:
version "1.0.3"
@@ -10605,7 +10793,7 @@ string-template@~0.2.1:
version "0.2.1"
resolved "https://registry.yarnpkg.com/string-template/-/string-template-0.2.1.tgz#42932e598a352d01fc22ec3367d9d84eec6c9add"
-string-width@^1.0.1, string-width@^1.0.2:
+string-width@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
dependencies:
@@ -10620,7 +10808,7 @@ string-width@^1.0.1, string-width@^1.0.2:
is-fullwidth-code-point "^2.0.0"
strip-ansi "^4.0.0"
-string-width@^3.0.0:
+string-width@^3.0.0, string-width@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961"
integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==
@@ -10676,7 +10864,7 @@ strip-ansi@^4.0.0:
dependencies:
ansi-regex "^3.0.0"
-strip-ansi@^5.1.0, strip-ansi@^5.2.0:
+strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae"
integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==
@@ -11214,8 +11402,9 @@ typedarray@^0.0.6:
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
ua-parser-js@^0.7.18:
- version "0.7.18"
- resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.18.tgz#a7bfd92f56edfb117083b69e31d2aa8882d4b1ed"
+ version "0.7.21"
+ resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.21.tgz#853cf9ce93f642f67174273cc34565ae6f308777"
+ integrity sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ==
uglify-es@^3.3.4:
version "3.3.9"
@@ -11291,7 +11480,7 @@ unicode-property-aliases-ecmascript@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.4.tgz#5a533f31b4317ea76f17d807fa0d116546111dd0"
-unified@^6.0.0:
+unified@^6.0.0, unified@^6.1.5:
version "6.2.0"
resolved "https://registry.yarnpkg.com/unified/-/unified-6.2.0.tgz#7fbd630f719126d67d40c644b7e3f617035f6dba"
dependencies:
@@ -11365,6 +11554,11 @@ unist-util-stringify-position@^1.0.0, unist-util-stringify-position@^1.1.1:
version "1.1.2"
resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz#3f37fcf351279dcbca7480ab5889bb8a832ee1c6"
+unist-util-visit-parents@1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-1.1.2.tgz#f6e3afee8bdbf961c0e6f028ea3c0480028c3d06"
+ integrity sha512-yvo+MMLjEwdc3RhhPYSximset7rwjMrdt9E41Smmvg25UQIenzrN83cRnF1JMzoMi9zZOQeYXHSDf7p+IQkW3Q==
+
unist-util-visit-parents@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-2.0.1.tgz#63fffc8929027bee04bfef7d2cce474f71cb6217"
@@ -11377,6 +11571,13 @@ unist-util-visit@^1.1.0:
dependencies:
unist-util-visit-parents "^2.0.0"
+unist-util-visit@^1.3.0:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-1.4.1.tgz#4724aaa8486e6ee6e26d7ff3c8685960d560b1e3"
+ integrity sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==
+ dependencies:
+ unist-util-visit-parents "^2.0.0"
+
unpipe@1.0.0, unpipe@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
@@ -11811,8 +12012,9 @@ whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3:
iconv-lite "0.4.23"
whatwg-fetch@>=0.10.0:
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f"
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb"
+ integrity sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==
whatwg-mimetype@^2.1.0:
version "2.1.0"
@@ -11838,10 +12040,6 @@ whet.extend@~0.9.9:
version "0.9.9"
resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1"
-which-module@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f"
-
which-module@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
@@ -11887,6 +12085,15 @@ wrap-ansi@^2.0.0:
string-width "^1.0.1"
strip-ansi "^3.0.1"
+wrap-ansi@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09"
+ integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==
+ dependencies:
+ ansi-styles "^3.2.0"
+ string-width "^3.0.0"
+ strip-ansi "^5.0.0"
+
wrappy@1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
@@ -11988,11 +12195,13 @@ yargs-parser@^10.0.0, yargs-parser@^10.1.0:
dependencies:
camelcase "^4.1.0"
-yargs-parser@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a"
+yargs-parser@^13.1.2:
+ version "13.1.2"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38"
+ integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==
dependencies:
- camelcase "^3.0.0"
+ camelcase "^5.0.0"
+ decamelize "^1.2.0"
yargs-parser@^8.1.0:
version "8.1.0"
@@ -12057,23 +12266,21 @@ yargs@^11.1.0:
y18n "^3.2.1"
yargs-parser "^9.0.2"
-yargs@^7.0.0:
- version "7.1.0"
- resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8"
+yargs@^13.3.2:
+ version "13.3.2"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd"
+ integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==
dependencies:
- camelcase "^3.0.0"
- cliui "^3.2.0"
- decamelize "^1.1.1"
- get-caller-file "^1.0.1"
- os-locale "^1.4.0"
- read-pkg-up "^1.0.1"
+ cliui "^5.0.0"
+ find-up "^3.0.0"
+ get-caller-file "^2.0.1"
require-directory "^2.1.1"
- require-main-filename "^1.0.1"
+ require-main-filename "^2.0.0"
set-blocking "^2.0.0"
- string-width "^1.0.2"
- which-module "^1.0.0"
- y18n "^3.2.1"
- yargs-parser "^5.0.0"
+ string-width "^3.0.0"
+ which-module "^2.0.0"
+ y18n "^4.0.0"
+ yargs-parser "^13.1.2"
yargs@~1.2.6:
version "1.2.6"
diff --git a/docker-compose.yml b/docker-compose.yml
index f2bc460..5fec1c0 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -5,7 +5,7 @@ services:
image: postgres:9.6
environment:
# IMPORTANT: Remove this on production
- - POSTGRES_HOST_AUTH_METHOD=trust
+ POSTGRES_HOST_AUTH_METHOD: trust
volumes:
- postgres-data:/var/lib/postgresql/data
diff --git a/server/apps/career/__init__.py b/server/apps/career/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/server/apps/career/admin.py b/server/apps/career/admin.py
new file mode 100644
index 0000000..8b09eaf
--- /dev/null
+++ b/server/apps/career/admin.py
@@ -0,0 +1,18 @@
+from django.contrib import admin
+from django.utils.safestring import mark_safe
+
+from .models import Career
+
+
+@admin.register(Career)
+class CareerAdmin(admin.ModelAdmin):
+ fields = ('title', 'description', 'url', 'image', 'image_tag',)
+ readonly_fields = ('image_tag',)
+
+ def image_tag(self, instance):
+ return mark_safe(
+ ' '
+ .format(instance.image.url)
+ )
+ image_tag.short_description = 'Image Preview'
+ image_tag.allow_tags = True
diff --git a/server/apps/career/apps.py b/server/apps/career/apps.py
new file mode 100644
index 0000000..298ef4f
--- /dev/null
+++ b/server/apps/career/apps.py
@@ -0,0 +1,5 @@
+from django.apps import AppConfig
+
+
+class CareerConfig(AppConfig):
+ name = 'career'
diff --git a/server/apps/career/migrations/0001_initial.py b/server/apps/career/migrations/0001_initial.py
new file mode 100644
index 0000000..423d42d
--- /dev/null
+++ b/server/apps/career/migrations/0001_initial.py
@@ -0,0 +1,27 @@
+# Generated by Django 2.2.6 on 2020-05-13 11:10
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='Career',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('name', models.CharField(max_length=255)),
+ ('description', models.TextField(max_length=255)),
+ ('url', models.URLField(blank=True, max_length=255, null=True)),
+ ('image', models.FileField(blank=True, null=True, upload_to='client/image/')),
+ ],
+ options={
+ 'ordering': ('id',),
+ },
+ ),
+ ]
diff --git a/server/apps/career/migrations/0002_auto_20200513_1245.py b/server/apps/career/migrations/0002_auto_20200513_1245.py
new file mode 100644
index 0000000..2e69478
--- /dev/null
+++ b/server/apps/career/migrations/0002_auto_20200513_1245.py
@@ -0,0 +1,18 @@
+# Generated by Django 2.2.6 on 2020-05-13 12:45
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('career', '0001_initial'),
+ ]
+
+ operations = [
+ migrations.RenameField(
+ model_name='career',
+ old_name='name',
+ new_name='title',
+ ),
+ ]
diff --git a/server/apps/career/migrations/0003_auto_20200517_0428.py b/server/apps/career/migrations/0003_auto_20200517_0428.py
new file mode 100644
index 0000000..afb04f7
--- /dev/null
+++ b/server/apps/career/migrations/0003_auto_20200517_0428.py
@@ -0,0 +1,18 @@
+# Generated by Django 2.2.6 on 2020-05-17 04:28
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('career', '0002_auto_20200513_1245'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='career',
+ name='description',
+ field=models.TextField(blank=True),
+ ),
+ ]
diff --git a/server/apps/career/migrations/__init__.py b/server/apps/career/migrations/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/server/apps/career/models.py b/server/apps/career/models.py
new file mode 100644
index 0000000..2240404
--- /dev/null
+++ b/server/apps/career/models.py
@@ -0,0 +1,14 @@
+from django.db import models
+
+
+class Career(models.Model):
+ title = models.CharField(max_length=255)
+ description = models.TextField(blank=True)
+ url = models.URLField(max_length=255, blank=True, null=True)
+ image = models.FileField(upload_to='client/image/', blank=True, null=True)
+
+ class Meta:
+ ordering = ('id',)
+
+ def __str__(self):
+ return self.title
diff --git a/server/apps/career/serializers.py b/server/apps/career/serializers.py
new file mode 100644
index 0000000..ef7c221
--- /dev/null
+++ b/server/apps/career/serializers.py
@@ -0,0 +1,9 @@
+from rest_framework import serializers
+
+from .models import Career
+
+
+class CareerSerializer(serializers.ModelSerializer):
+ class Meta:
+ model = Career
+ fields = '__all__'
diff --git a/server/apps/career/tests.py b/server/apps/career/tests.py
new file mode 100644
index 0000000..7ce503c
--- /dev/null
+++ b/server/apps/career/tests.py
@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.
diff --git a/server/apps/career/views.py b/server/apps/career/views.py
new file mode 100644
index 0000000..29b65d8
--- /dev/null
+++ b/server/apps/career/views.py
@@ -0,0 +1,10 @@
+from rest_framework import viewsets
+
+from togglecorp.views import CacheListMixin
+from .models import Career
+from .serializers import CareerSerializer
+
+
+class CareerViewSet(CacheListMixin, viewsets.ReadOnlyModelViewSet):
+ queryset = Career.objects.all()
+ serializer_class = CareerSerializer
diff --git a/server/apps/client/views.py b/server/apps/client/views.py
index ad05b18..919fb09 100644
--- a/server/apps/client/views.py
+++ b/server/apps/client/views.py
@@ -5,6 +5,6 @@
from .serializers import ClientSerializer
-class ClientViewSet(CacheListMixin, viewsets.ModelViewSet):
+class ClientViewSet(CacheListMixin, viewsets.ReadOnlyModelViewSet):
queryset = Client.objects.all()
serializer_class = ClientSerializer
diff --git a/server/apps/member/views.py b/server/apps/member/views.py
index cfcd144..cdb0a93 100644
--- a/server/apps/member/views.py
+++ b/server/apps/member/views.py
@@ -5,7 +5,7 @@
from .serializers import MemberSerializer
-class MemberViewSet(CacheListMixin, viewsets.ModelViewSet):
+class MemberViewSet(CacheListMixin, viewsets.ReadOnlyModelViewSet):
serializer_class = MemberSerializer
def get_queryset(self):
diff --git a/server/apps/service/views.py b/server/apps/service/views.py
index 0c5c149..c4aa4a9 100644
--- a/server/apps/service/views.py
+++ b/server/apps/service/views.py
@@ -5,6 +5,6 @@
from .serializers import ServiceSerializer
-class ServiceViewSet(CacheListMixin, viewsets.ModelViewSet):
+class ServiceViewSet(CacheListMixin, viewsets.ReadOnlyModelViewSet):
queryset = Service.objects.all()
serializer_class = ServiceSerializer
diff --git a/server/apps/technology/views.py b/server/apps/technology/views.py
index e0edf0d..8006121 100644
--- a/server/apps/technology/views.py
+++ b/server/apps/technology/views.py
@@ -5,7 +5,7 @@
from .serializers import TechnologySectionSerializer
-class TechnologySectionViewSet(CacheListMixin, viewsets.ModelViewSet):
+class TechnologySectionViewSet(CacheListMixin, viewsets.ReadOnlyModelViewSet):
serializer_class = TechnologySectionSerializer
def get_queryset(self):
diff --git a/server/togglecorp/settings.py b/server/togglecorp/settings.py
index c690ac1..7dc8fb1 100644
--- a/server/togglecorp/settings.py
+++ b/server/togglecorp/settings.py
@@ -29,6 +29,7 @@
'member',
'technology',
'service',
+ 'career',
]
INSTALLED_APPS = [
diff --git a/server/togglecorp/urls.py b/server/togglecorp/urls.py
index d8da530..f17e0d9 100644
--- a/server/togglecorp/urls.py
+++ b/server/togglecorp/urls.py
@@ -10,6 +10,7 @@
from togglecorp import admin as tg_admin # noqa: F401
from member.views import MemberViewSet
from client.views import ClientViewSet
+from career.views import CareerViewSet
from service.views import ServiceViewSet
from technology.views import TechnologySectionViewSet
@@ -18,6 +19,7 @@
router.register(r'members', MemberViewSet, base_name='member')
router.register(r'clients', ClientViewSet, base_name='client')
+router.register(r'careers', CareerViewSet, base_name='career')
router.register(r'services', ServiceViewSet, base_name='service')
router.register(
r'technology-sections',