From 988cdcfa53d6944801198bf167f2321aea3b1cbf Mon Sep 17 00:00:00 2001 From: tspuller <tspuller@umich.edu> Date: Sat, 5 Dec 2020 14:16:31 -0500 Subject: [PATCH] removed sub menus --- src/containers/Dashboard/DashboardRoutes.js | 64 +---- src/containers/Facebook/Analytics.js | 46 ---- src/containers/Facebook/Data.js | 32 --- src/containers/Facebook/Data.styles.js | 0 .../Facebook/{Import.js => Facebook.js} | 10 +- ...Analytics.styles.js => Facebook.styles.js} | 0 src/containers/Facebook/config.js | 50 ---- src/containers/Instagram/Analytics.js | 36 --- src/containers/Instagram/Data.js | 40 ---- src/containers/Instagram/Data.styles.js | 0 .../Instagram/{Import.js => Instagram.js} | 8 +- .../Instagram.styles.js} | 0 src/containers/Instagram/config.js | 50 ---- src/containers/LinkedIn/Analytics.js | 108 --------- src/containers/LinkedIn/Analytics.styles.js | 222 ------------------ src/containers/LinkedIn/Data.js | 0 src/containers/LinkedIn/Data.styles.js | 0 src/containers/LinkedIn/Import.styles.js | 222 ------------------ .../LinkedIn/{Import.js => LinkedIn.js} | 9 +- .../LinkedIn.styles.js} | 0 src/containers/LinkedIn/config.js | 50 ---- src/containers/Sidebar/options.js | 64 +---- src/containers/Spotify/Analytics.js | 62 ----- src/containers/Spotify/Analytics.styles.js | 222 ------------------ src/containers/Spotify/Data.js | 39 --- src/containers/Spotify/Data.styles.js | 0 src/containers/Spotify/Import.styles.js | 222 ------------------ .../Spotify/{Import.js => Spotify.js} | 9 +- .../Spotify.styles.js} | 0 src/containers/Spotify/config.js | 50 ---- 30 files changed, 12 insertions(+), 1603 deletions(-) delete mode 100644 src/containers/Facebook/Analytics.js delete mode 100644 src/containers/Facebook/Data.js delete mode 100644 src/containers/Facebook/Data.styles.js rename src/containers/Facebook/{Import.js => Facebook.js} (96%) rename src/containers/Facebook/{Analytics.styles.js => Facebook.styles.js} (100%) delete mode 100644 src/containers/Facebook/config.js delete mode 100644 src/containers/Instagram/Analytics.js delete mode 100644 src/containers/Instagram/Data.js delete mode 100644 src/containers/Instagram/Data.styles.js rename src/containers/Instagram/{Import.js => Instagram.js} (93%) rename src/containers/{Facebook/Import.styles.js => Instagram/Instagram.styles.js} (100%) delete mode 100644 src/containers/Instagram/config.js delete mode 100644 src/containers/LinkedIn/Analytics.js delete mode 100644 src/containers/LinkedIn/Analytics.styles.js delete mode 100644 src/containers/LinkedIn/Data.js delete mode 100644 src/containers/LinkedIn/Data.styles.js delete mode 100644 src/containers/LinkedIn/Import.styles.js rename src/containers/LinkedIn/{Import.js => LinkedIn.js} (89%) rename src/containers/{Instagram/Analytics.styles.js => LinkedIn/LinkedIn.styles.js} (100%) delete mode 100644 src/containers/LinkedIn/config.js delete mode 100644 src/containers/Spotify/Analytics.js delete mode 100644 src/containers/Spotify/Analytics.styles.js delete mode 100644 src/containers/Spotify/Data.js delete mode 100644 src/containers/Spotify/Data.styles.js delete mode 100644 src/containers/Spotify/Import.styles.js rename src/containers/Spotify/{Import.js => Spotify.js} (94%) rename src/containers/{Instagram/Import.styles.js => Spotify/Spotify.styles.js} (100%) delete mode 100644 src/containers/Spotify/config.js diff --git a/src/containers/Dashboard/DashboardRoutes.js b/src/containers/Dashboard/DashboardRoutes.js index 3d85759..23dbcca 100644 --- a/src/containers/Dashboard/DashboardRoutes.js +++ b/src/containers/Dashboard/DashboardRoutes.js @@ -8,84 +8,28 @@ const routes = [ component: lazy(() => import('@imd/containers/Widgets/Widgets')), exact: true, }, - { - path: 'affix', - component: lazy(() => import('@imd/containers/Navigation/Affix')), - }, - { - path: 'menu', - component: lazy(() => import('@imd/containers/Navigation/NavigationMenu')), - }, { path: 'spotify', component: lazy(() => - import('@imd/containers/Spotify/Import') - ), - }, - { - path: 'spotify-data', - component: lazy(() => - import('@imd/containers/Spotify/Data') - ), - }, - { - path: 'spotify-analytics', - component: lazy(() => - import('@imd/containers/Spotify/Analytics') + import('@imd/containers/Spotify/Spotify') ), }, { path: 'facebook', component: lazy(() => - import('@imd/containers/Facebook/Import') - ), - }, - { - path: 'facebook-data', - component: lazy(() => - import('@imd/containers/Facebook/Data') - ), - }, - { - path: 'facebook-analytics', - component: lazy(() => - import('@imd/containers/Facebook/Analytics') + import('@imd/containers/Facebook/Facebook') ), }, { path: 'linkedin', component: lazy(() => - import('@imd/containers/LinkedIn/Import') - ), - }, - { - path: 'linkedin-data', - component: lazy(() => - import('@imd/containers/LinkedIn/Data') - ), - }, - { - path: 'linkedin-analytics', - component: lazy(() => - import('@imd/containers/LinkedIn/Analytics') + import('@imd/containers/LinkedIn/LinkedIn') ), }, { path: 'instagram', component: lazy(() => - import('@imd/containers/Instagram/Import') - ), - }, - { - path: 'instagram-data', - component: lazy(() => - import('@imd/containers/Instagram/Data') - ), - }, - { - path: 'instagram-analytics', - component: lazy(() => - import('@imd/containers/Instagram/Analytics') + import('@imd/containers/Instagram/Instagram') ), }, { diff --git a/src/containers/Facebook/Analytics.js b/src/containers/Facebook/Analytics.js deleted file mode 100644 index 1debb38..0000000 --- a/src/containers/Facebook/Analytics.js +++ /dev/null @@ -1,46 +0,0 @@ -import React, { Component, lazy } from 'react'; -import { Row, Col } from 'antd'; - -import PageHeader from '@imd/components/utility/pageHeader'; -import Box from '@imd/components/utility/box'; -import LayoutWrapper from '@imd/components/utility/layoutWrapper'; -import ContentHolder from '@imd/components/utility/contentHolder'; - -import basicStyle from '@imd/assets/styles/constants'; -import IsoWidgetsWrapper from '@imd/containers/Widgets/WidgetsWrapper'; -import TotalFriendsByDayLine from './Components/TotalFriendsByDayLine/TotalFriendsByDayLine'; -const SentReceivedPie = lazy(() => import('./Components/SentReceivedPie/SentReceivedPie')); - -export default class extends Component { - - render() { - - const { rowStyle, colStyle, gutter } = basicStyle; - - return ( - <LayoutWrapper> - <PageHeader>Analytics</PageHeader> - <Row style={rowStyle} gutter={0} justify="start"> - <Col lg={24} md={12} sm={12} xs={24} style={colStyle}> - <IsoWidgetsWrapper> - <Box title="Total Friends By Day"> - <ContentHolder> - <TotalFriendsByDayLine /> - </ContentHolder> - </Box> - </IsoWidgetsWrapper> - </Col> - </Row> - <Row style={rowStyle} gutter={0} justify="start"> - <Col lg={8} md={12} sm={12} xs={24} style={colStyle}> - <IsoWidgetsWrapper> - <Box height={450} title="Friend Statuses"> - <SentReceivedPie /> - </Box> - </IsoWidgetsWrapper> - </Col> - </Row> - </LayoutWrapper> - ); - }; -} \ No newline at end of file diff --git a/src/containers/Facebook/Data.js b/src/containers/Facebook/Data.js deleted file mode 100644 index d7394eb..0000000 --- a/src/containers/Facebook/Data.js +++ /dev/null @@ -1,32 +0,0 @@ -import moment from 'moment' -import React, { Component } from 'react'; -import { Row, Col } from 'antd'; - -import PageHeader from '@imd/components/utility/pageHeader'; -import Box from '@imd/components/utility/box'; -import LayoutWrapper from '@imd/components/utility/layoutWrapper'; - -import basicStyle from '@imd/assets/styles/constants'; -import FriendData from './Data/friends/friends.json'; - -export default class extends Component { - - render() { - const { rowStyle, colStyle, gutter } = basicStyle; - - return ( - <LayoutWrapper> - <PageHeader>Data</PageHeader> - - {FriendData.friends.map((friend, idx) => ( - <Col lg={6} md={12} sm={12} xs={24} style={colStyle}> - <Box> - <h1>{friend.name}</h1> - <div>{moment.unix(friend.timestamp).format('YYYY-MM-DD')}</div> - </Box> - </Col> - ))} - </LayoutWrapper> - ); - }; -} diff --git a/src/containers/Facebook/Data.styles.js b/src/containers/Facebook/Data.styles.js deleted file mode 100644 index e69de29..0000000 diff --git a/src/containers/Facebook/Import.js b/src/containers/Facebook/Facebook.js similarity index 96% rename from src/containers/Facebook/Import.js rename to src/containers/Facebook/Facebook.js index 336c875..d8aff33 100644 --- a/src/containers/Facebook/Import.js +++ b/src/containers/Facebook/Facebook.js @@ -7,11 +7,10 @@ import PageHeader from '@imd/components/utility/pageHeader'; import Box from '@imd/components/utility/box'; import LayoutWrapper from '@imd/components/utility/layoutWrapper'; import ContentHolder from '@imd/components/utility/contentHolder'; -import DropzoneWrapper from './Import.styles'; +import DropzoneWrapper from './Facebook.styles'; import basicStyle from '@imd/assets/styles/constants'; import FrappeChart from 'frappe-charts/dist/frappe-charts.min.esm'; -import * as configs from './config'; import 'frappe-charts/dist/frappe-charts.min.css'; import Tabs, { TabPane } from '@imd/components/uielements/tabs'; import IsoWidgetsWrapper from '@imd/containers/Widgets/WidgetsWrapper'; @@ -33,13 +32,6 @@ export default class extends Component { // this.handleClick = this.handleClick.bind(this); } - - componentDidMount() { - new FrappeChart(configs.impressionsLineChart); - console.log("jsondata: ", this.state.jsonData) - // console.log("jsondata parsed: ", JSON.parse(this.state.jsonData)) - } - hasKey(key) { if (this.state.jsonData === "") { return false diff --git a/src/containers/Facebook/Analytics.styles.js b/src/containers/Facebook/Facebook.styles.js similarity index 100% rename from src/containers/Facebook/Analytics.styles.js rename to src/containers/Facebook/Facebook.styles.js diff --git a/src/containers/Facebook/config.js b/src/containers/Facebook/config.js deleted file mode 100644 index 5beefd0..0000000 --- a/src/containers/Facebook/config.js +++ /dev/null @@ -1,50 +0,0 @@ -const basicData = { - labels: [ - '12am-3am', - '3am-6am', - '6am-9am', - '9am-12pm', - '12pm-3pm', - '3pm-6pm', - '6pm-9pm', - '9pm-12am', - ], - - datasets: [ - { - title: 'Some Data', - color: 'light-blue', - values: [25, 40, 30, 35, 8, 52, 17, -4], - }, - { - title: 'Another Set', - color: 'violet', - values: [25, 50, -10, 15, 18, 32, 27, 14], - }, - { - title: 'Yet Another', - color: 'blue', - values: [15, 20, -3, -15, 58, 12, -17, 37], - }, - ], - }; - - const basicConfig = { - height: 250, - format_tooltip_x: d => (d + '').toUpperCase(), - format_tooltip_y: d => d + ' pts', - }; - const impressionsLineChart = { - header: 'App Impressions', - title: '', - parent: '#impressionsLineChart', - parentId: 'impressionsLineChart', - type: 'line', - data: basicData, - ...basicConfig, - }; - - export { - impressionsLineChart - }; - \ No newline at end of file diff --git a/src/containers/Instagram/Analytics.js b/src/containers/Instagram/Analytics.js deleted file mode 100644 index 7138148..0000000 --- a/src/containers/Instagram/Analytics.js +++ /dev/null @@ -1,36 +0,0 @@ -import React, { Component, lazy } from 'react'; -import { Row, Col } from 'antd'; - -import PageHeader from '@imd/components/utility/pageHeader'; -import Box from '@imd/components/utility/box'; -import LayoutWrapper from '@imd/components/utility/layoutWrapper'; -import ContentHolder from '@imd/components/utility/contentHolder'; - -import basicStyle from '@imd/assets/styles/constants'; -import IsoWidgetsWrapper from '@imd/containers/Widgets/WidgetsWrapper'; -import ConnectionsByDayLine from './Components/ConnectionsByDayLine/ConnectionsByDayLine'; - -export default class extends Component { - - render() { - - const { rowStyle, colStyle, gutter } = basicStyle; - - return ( - <LayoutWrapper> - <PageHeader>Analytics</PageHeader> - <Row style={rowStyle} gutter={0} justify="start"> - <Col lg={24} md={12} sm={12} xs={24} style={colStyle}> - <IsoWidgetsWrapper> - <Box title="Connections By Day"> - <ContentHolder> - <ConnectionsByDayLine /> - </ContentHolder> - </Box> - </IsoWidgetsWrapper> - </Col> - </Row> - </LayoutWrapper> - ); - }; -} \ No newline at end of file diff --git a/src/containers/Instagram/Data.js b/src/containers/Instagram/Data.js deleted file mode 100644 index 4dd049e..0000000 --- a/src/containers/Instagram/Data.js +++ /dev/null @@ -1,40 +0,0 @@ -import moment from 'moment' -import React, { Component } from 'react'; -import { Row, Col } from 'antd'; - -import PageHeader from '@imd/components/utility/pageHeader'; -import Box from '@imd/components/utility/box'; -import LayoutWrapper from '@imd/components/utility/layoutWrapper'; - -import basicStyle from '@imd/assets/styles/constants'; -import UserData from './Data/connections.json'; - -export default class extends Component { - - render() { - const { rowStyle, colStyle, gutter } = basicStyle; - - return ( - <LayoutWrapper> - <PageHeader>Followers</PageHeader> - {Object.entries(UserData.followers).map(([name, date]) => ( - <Col lg={6} md={12} sm={12} xs={24} style={colStyle}> - <Box> - <h1>{name}</h1> - <div>{moment(date).format('YYYY-MM-DD')}</div> - </Box> - </Col> - ))} - <PageHeader>Following</PageHeader> - {Object.entries(UserData.following).map(([name, date]) => ( - <Col lg={6} md={12} sm={12} xs={24} style={colStyle}> - <Box> - <h1>{name}</h1> - <div>{moment(date).format('YYYY-MM-DD')}</div> - </Box> - </Col> - ))} - </LayoutWrapper> - ); - }; -} \ No newline at end of file diff --git a/src/containers/Instagram/Data.styles.js b/src/containers/Instagram/Data.styles.js deleted file mode 100644 index e69de29..0000000 diff --git a/src/containers/Instagram/Import.js b/src/containers/Instagram/Instagram.js similarity index 93% rename from src/containers/Instagram/Import.js rename to src/containers/Instagram/Instagram.js index 733c250..8f4dced 100644 --- a/src/containers/Instagram/Import.js +++ b/src/containers/Instagram/Instagram.js @@ -8,17 +8,12 @@ import PageHeader from '@imd/components/utility/pageHeader'; import Box from '@imd/components/utility/box'; import LayoutWrapper from '@imd/components/utility/layoutWrapper'; import ContentHolder from '@imd/components/utility/contentHolder'; -import DropzoneWrapper from './Import.styles'; +import DropzoneWrapper from './Instagram.styles'; import basicStyle from '@imd/assets/styles/constants'; -import FrappeChart from 'frappe-charts/dist/frappe-charts.min.esm'; -import * as configs from './config'; import 'frappe-charts/dist/frappe-charts.min.css'; import Tabs, { TabPane } from '@imd/components/uielements/tabs'; import IsoWidgetsWrapper from '@imd/containers/Widgets/WidgetsWrapper'; - -import CardWidget from '@imd/containers/Widgets/Card/CardWidget'; -import IntlMessages from '@imd/components/utility/intlMessages'; import UserData from './Data/connections.json'; import ConnectionsByDayLine from './Components/ConnectionsByDayLine/ConnectionsByDayLine'; @@ -27,7 +22,6 @@ function callback(key) {} export default class extends Component { componentDidMount() { - new FrappeChart(configs.impressionsLineChart); } render() { diff --git a/src/containers/Facebook/Import.styles.js b/src/containers/Instagram/Instagram.styles.js similarity index 100% rename from src/containers/Facebook/Import.styles.js rename to src/containers/Instagram/Instagram.styles.js diff --git a/src/containers/Instagram/config.js b/src/containers/Instagram/config.js deleted file mode 100644 index 5beefd0..0000000 --- a/src/containers/Instagram/config.js +++ /dev/null @@ -1,50 +0,0 @@ -const basicData = { - labels: [ - '12am-3am', - '3am-6am', - '6am-9am', - '9am-12pm', - '12pm-3pm', - '3pm-6pm', - '6pm-9pm', - '9pm-12am', - ], - - datasets: [ - { - title: 'Some Data', - color: 'light-blue', - values: [25, 40, 30, 35, 8, 52, 17, -4], - }, - { - title: 'Another Set', - color: 'violet', - values: [25, 50, -10, 15, 18, 32, 27, 14], - }, - { - title: 'Yet Another', - color: 'blue', - values: [15, 20, -3, -15, 58, 12, -17, 37], - }, - ], - }; - - const basicConfig = { - height: 250, - format_tooltip_x: d => (d + '').toUpperCase(), - format_tooltip_y: d => d + ' pts', - }; - const impressionsLineChart = { - header: 'App Impressions', - title: '', - parent: '#impressionsLineChart', - parentId: 'impressionsLineChart', - type: 'line', - data: basicData, - ...basicConfig, - }; - - export { - impressionsLineChart - }; - \ No newline at end of file diff --git a/src/containers/LinkedIn/Analytics.js b/src/containers/LinkedIn/Analytics.js deleted file mode 100644 index 7d092fb..0000000 --- a/src/containers/LinkedIn/Analytics.js +++ /dev/null @@ -1,108 +0,0 @@ -import React, { Component } from 'react'; -import { Row, Col } from 'antd'; - -import Dropzone from '@imd/components/uielements/dropzone'; -import { notification } from '@imd/components'; -import PageHeader from '@imd/components/utility/pageHeader'; -import Box from '@imd/components/utility/box'; -import LayoutWrapper from '@imd/components/utility/layoutWrapper'; -import ContentHolder from '@imd/components/utility/contentHolder'; - -import basicStyle from '@imd/assets/styles/constants'; -import FrappeChart from 'frappe-charts/dist/frappe-charts.min.esm'; -import * as configs from './config'; -import 'frappe-charts/dist/frappe-charts.min.css'; -import IsoWidgetsWrapper from '@imd/containers/Widgets/WidgetsWrapper'; - -import CardWidget from '@imd/containers/Widgets/Card/CardWidget'; -import IntlMessages from '@imd/components/utility/intlMessages'; - -export default class extends Component { - - componentDidMount() { - new FrappeChart(configs.impressionsLineChart); - } - - render() { - - const CARD_WIDGET = [ - { - icon: 'ion-ios-people', - iconcolor: '#42A5F5', - number: '210', - text: 'widget.tinder.matches.text', - }, - { - icon: 'ion-chatbox', - iconcolor: '#F75D81', - number: '540', - text: 'widget.tinder.messages.text', - }, - { - icon: 'ion-trophy', - iconcolor: '#FEAC01', - number: 'widget.cardwidget3.number', - text: 'widget.cardwidget3.text', - }, - ]; - - //########## - //Dropzone - //########## - const componentConfig = { - iconFiletypes: ['.json'], - method: true, - showFiletypeIcon: false, - uploadMultiple: false, - maxFilesize: 2, // MB - maxFiles: 1, - dictRemoveFile: 'Delete', - dictCancelUploadConfirmation: 'Are you sure to cancel upload?', - postUrl: '/upload', - }; - const djsConfig = { - acceptedFiles: '.json', - params: { - account: "tinder" - } - }; - const eventHandlers = { - addedfile: file => notification('success', `${file.name} added`), - success: file => - notification('success', `${file.name} successfully uploaded`), - error: error => notification('error', 'Server is not set in the demo'), - }; - - const { rowStyle, colStyle, gutter } = basicStyle; - - return ( - <LayoutWrapper> - <PageHeader>Import</PageHeader> - <Row style={rowStyle} gutter={0} justify="start"> - <Col lg={6} md={12} sm={12} xs={24} style={colStyle}> - {CARD_WIDGET.map((widget, idx) => ( - <IsoWidgetsWrapper key={idx} gutterBottom={20}> - {/* Card Widget */} - <CardWidget - icon={widget.icon} - iconcolor={widget.iconcolor} - number={<IntlMessages id={widget.number} />} - text={<IntlMessages id={widget.text} />} - /> - </IsoWidgetsWrapper> - ))} - </Col> - <Col lg={18} md={12} sm={12} xs={24} style={colStyle}> - <IsoWidgetsWrapper> - <Box style={{height: 448}} title={configs.impressionsLineChart.header}> - <ContentHolder> - <div id={configs.impressionsLineChart.parentId} /> - </ContentHolder> - </Box> - </IsoWidgetsWrapper> - </Col> - </Row> - </LayoutWrapper> - ); - }; -} diff --git a/src/containers/LinkedIn/Analytics.styles.js b/src/containers/LinkedIn/Analytics.styles.js deleted file mode 100644 index 72aac47..0000000 --- a/src/containers/LinkedIn/Analytics.styles.js +++ /dev/null @@ -1,222 +0,0 @@ -import styled from 'styled-components'; -import { palette } from 'styled-theme'; -import { - borderRadius, - boxShadow, - transition, -} from '@imd/lib/helpers/style_utils'; - -const DropzoneWrapper = styled.div` - .filepicker { - width: 100%; - min-height: 320px; - padding: 35px 0px; - display: flex; - flex-wrap: wrap; - align-items: center; - justify-content: center; - background-color: #ffffff; - border: 1px dashed ${palette('border', 0)}; - position: relative; - overflow: hidden; - cursor: pointer; - text-align: center; - ${borderRadius('0')}; - - .closeBtn { - width: 30px; - height: 30px; - display: flex; - align-items: center; - justify-content: center; - flex-shrink: 0; - padding: 0; - margin-right: 0; - background-color: transparent; - outline: 0; - border: 0; - position: absolute; - top: 0; - right: 0; - ${borderRadius('50%')}; - ${boxShadow('none')}; - ${transition()}; - - &:before { - content: '\f2d7'; - font-family: 'ionicons'; - font-size: 14px; - color: ${palette('text', 3)}; - line-height: 1; - ${transition()}; - } - - &:hover { - &:before { - color: ${palette('text', 0)}; - } - } - } - - .dz-message { - width: 100%; - position: relative; - display: flex; - flex-direction: column; - margin: 0; - - span { - font-size: 14px; - color: ${palette('text', 3)}; - font-weight: 700; - margin-top: 6px; - } - - &:before { - content: '\f255'; - font-family: 'ionicons'; - font-size: 53.4px; - line-height: 32px; - color: ${palette('primary', 0)}; - } - } - - .dz-progress { - width: 100%; - height: 100px; - display: flex; - align-items: center; - justify-content: center; - flex-shrink: 0; - position: absolute; - top: 0; - left: 0; - background: none; - background-color: rgba(255, 255, 255, 0.8); - ${borderRadius('0')}; - } - - .dz-preview { - width: 100px; - height: 127px; - display: flex; - flex-direction: column; - flex-shrink: 0; - overflow: hidden; - float: left; - position: relative; - margin: 0; - margin-left: 2px; - margin-bottom: 2px; - - .dz-progress { - display: none; - } - - .dz-image { - width: 100%; - height: 100px; - margin-bottom: 2px; - display: block; - flex-shrink: 0; - overflow-y: hidden; - position: relative; - background: none; - background-color: ${palette('secondary', 6)}; - ${borderRadius('0')}; - - img { - max-width: 100%; - position: absolute; - left: 0; - right: 0; - top: 0; - bottom: 0; - margin: auto; - } - } - - .dz-details { - width: 100%; - height: 25px; - padding: 0 8px; - flex-shrink: 0; - opacity: 1; - display: flex; - align-items: center; - justify-content: center; - overflow: hidden; - position: relative; - cursor: default; - background-color: ${palette('secondary', 1)}; - - .dz-size { - display: none; - } - .dz-filename { - width: 100%; - overflow: hidden; - text-overflow: ellipsis; - - span { - font-size: 14px; - color: ${palette('text', 4)}; - white-space: nowrap; - background-color: transparent; - } - - &:not(:hover) { - span { - border: 0; - } - } - - &:hover { - span { - border: 0; - background-color: transparent; - } - } - } - } - - .dz-success-mark { - display: none; - } - - .dz-remove { - font-size: 14px; - font-weight: 400; - background-color: ${palette('error', 0)}; - width: 100%; - height: 25px; - color: #fff; - line-height: 25px; - display: inline-block; - text-align: center; - position: absolute; - bottom: -25px; - left: 0px; - cursor: pointer; - border: 0; - outline: 0; - padding: 0; - ${transition()}; - } - - &:hover { - .dz-remove { - bottom: 0; - } - } - } - - &.dz-started { - .dz-message { - display: none; - } - } - } -`; - -export default DropzoneWrapper; diff --git a/src/containers/LinkedIn/Data.js b/src/containers/LinkedIn/Data.js deleted file mode 100644 index e69de29..0000000 diff --git a/src/containers/LinkedIn/Data.styles.js b/src/containers/LinkedIn/Data.styles.js deleted file mode 100644 index e69de29..0000000 diff --git a/src/containers/LinkedIn/Import.styles.js b/src/containers/LinkedIn/Import.styles.js deleted file mode 100644 index 72aac47..0000000 --- a/src/containers/LinkedIn/Import.styles.js +++ /dev/null @@ -1,222 +0,0 @@ -import styled from 'styled-components'; -import { palette } from 'styled-theme'; -import { - borderRadius, - boxShadow, - transition, -} from '@imd/lib/helpers/style_utils'; - -const DropzoneWrapper = styled.div` - .filepicker { - width: 100%; - min-height: 320px; - padding: 35px 0px; - display: flex; - flex-wrap: wrap; - align-items: center; - justify-content: center; - background-color: #ffffff; - border: 1px dashed ${palette('border', 0)}; - position: relative; - overflow: hidden; - cursor: pointer; - text-align: center; - ${borderRadius('0')}; - - .closeBtn { - width: 30px; - height: 30px; - display: flex; - align-items: center; - justify-content: center; - flex-shrink: 0; - padding: 0; - margin-right: 0; - background-color: transparent; - outline: 0; - border: 0; - position: absolute; - top: 0; - right: 0; - ${borderRadius('50%')}; - ${boxShadow('none')}; - ${transition()}; - - &:before { - content: '\f2d7'; - font-family: 'ionicons'; - font-size: 14px; - color: ${palette('text', 3)}; - line-height: 1; - ${transition()}; - } - - &:hover { - &:before { - color: ${palette('text', 0)}; - } - } - } - - .dz-message { - width: 100%; - position: relative; - display: flex; - flex-direction: column; - margin: 0; - - span { - font-size: 14px; - color: ${palette('text', 3)}; - font-weight: 700; - margin-top: 6px; - } - - &:before { - content: '\f255'; - font-family: 'ionicons'; - font-size: 53.4px; - line-height: 32px; - color: ${palette('primary', 0)}; - } - } - - .dz-progress { - width: 100%; - height: 100px; - display: flex; - align-items: center; - justify-content: center; - flex-shrink: 0; - position: absolute; - top: 0; - left: 0; - background: none; - background-color: rgba(255, 255, 255, 0.8); - ${borderRadius('0')}; - } - - .dz-preview { - width: 100px; - height: 127px; - display: flex; - flex-direction: column; - flex-shrink: 0; - overflow: hidden; - float: left; - position: relative; - margin: 0; - margin-left: 2px; - margin-bottom: 2px; - - .dz-progress { - display: none; - } - - .dz-image { - width: 100%; - height: 100px; - margin-bottom: 2px; - display: block; - flex-shrink: 0; - overflow-y: hidden; - position: relative; - background: none; - background-color: ${palette('secondary', 6)}; - ${borderRadius('0')}; - - img { - max-width: 100%; - position: absolute; - left: 0; - right: 0; - top: 0; - bottom: 0; - margin: auto; - } - } - - .dz-details { - width: 100%; - height: 25px; - padding: 0 8px; - flex-shrink: 0; - opacity: 1; - display: flex; - align-items: center; - justify-content: center; - overflow: hidden; - position: relative; - cursor: default; - background-color: ${palette('secondary', 1)}; - - .dz-size { - display: none; - } - .dz-filename { - width: 100%; - overflow: hidden; - text-overflow: ellipsis; - - span { - font-size: 14px; - color: ${palette('text', 4)}; - white-space: nowrap; - background-color: transparent; - } - - &:not(:hover) { - span { - border: 0; - } - } - - &:hover { - span { - border: 0; - background-color: transparent; - } - } - } - } - - .dz-success-mark { - display: none; - } - - .dz-remove { - font-size: 14px; - font-weight: 400; - background-color: ${palette('error', 0)}; - width: 100%; - height: 25px; - color: #fff; - line-height: 25px; - display: inline-block; - text-align: center; - position: absolute; - bottom: -25px; - left: 0px; - cursor: pointer; - border: 0; - outline: 0; - padding: 0; - ${transition()}; - } - - &:hover { - .dz-remove { - bottom: 0; - } - } - } - - &.dz-started { - .dz-message { - display: none; - } - } - } -`; - -export default DropzoneWrapper; diff --git a/src/containers/LinkedIn/Import.js b/src/containers/LinkedIn/LinkedIn.js similarity index 89% rename from src/containers/LinkedIn/Import.js rename to src/containers/LinkedIn/LinkedIn.js index 23549ce..99a3dde 100644 --- a/src/containers/LinkedIn/Import.js +++ b/src/containers/LinkedIn/LinkedIn.js @@ -7,24 +7,17 @@ import PageHeader from '@imd/components/utility/pageHeader'; import Box from '@imd/components/utility/box'; import LayoutWrapper from '@imd/components/utility/layoutWrapper'; import ContentHolder from '@imd/components/utility/contentHolder'; -import DropzoneWrapper from './Import.styles'; +import DropzoneWrapper from './LinkedIn.styles'; import basicStyle from '@imd/assets/styles/constants'; -import FrappeChart from 'frappe-charts/dist/frappe-charts.min.esm'; -import * as configs from './config'; import 'frappe-charts/dist/frappe-charts.min.css'; import Tabs, { TabPane } from '@imd/components/uielements/tabs'; -import IsoWidgetsWrapper from '@imd/containers/Widgets/WidgetsWrapper'; - -import CardWidget from '@imd/containers/Widgets/Card/CardWidget'; -import IntlMessages from '@imd/components/utility/intlMessages'; function callback(key) {} export default class extends Component { componentDidMount() { - new FrappeChart(configs.impressionsLineChart); } render() { diff --git a/src/containers/Instagram/Analytics.styles.js b/src/containers/LinkedIn/LinkedIn.styles.js similarity index 100% rename from src/containers/Instagram/Analytics.styles.js rename to src/containers/LinkedIn/LinkedIn.styles.js diff --git a/src/containers/LinkedIn/config.js b/src/containers/LinkedIn/config.js deleted file mode 100644 index 5beefd0..0000000 --- a/src/containers/LinkedIn/config.js +++ /dev/null @@ -1,50 +0,0 @@ -const basicData = { - labels: [ - '12am-3am', - '3am-6am', - '6am-9am', - '9am-12pm', - '12pm-3pm', - '3pm-6pm', - '6pm-9pm', - '9pm-12am', - ], - - datasets: [ - { - title: 'Some Data', - color: 'light-blue', - values: [25, 40, 30, 35, 8, 52, 17, -4], - }, - { - title: 'Another Set', - color: 'violet', - values: [25, 50, -10, 15, 18, 32, 27, 14], - }, - { - title: 'Yet Another', - color: 'blue', - values: [15, 20, -3, -15, 58, 12, -17, 37], - }, - ], - }; - - const basicConfig = { - height: 250, - format_tooltip_x: d => (d + '').toUpperCase(), - format_tooltip_y: d => d + ' pts', - }; - const impressionsLineChart = { - header: 'App Impressions', - title: '', - parent: '#impressionsLineChart', - parentId: 'impressionsLineChart', - type: 'line', - data: basicData, - ...basicConfig, - }; - - export { - impressionsLineChart - }; - \ No newline at end of file diff --git a/src/containers/Sidebar/options.js b/src/containers/Sidebar/options.js index b7ded1e..904cdab 100644 --- a/src/containers/Sidebar/options.js +++ b/src/containers/Sidebar/options.js @@ -1,79 +1,23 @@ const options = [ { key: 'facebook', - label: 'sidebar.facebook', + label: 'Facebook', leftIcon: 'ion-social-facebook', - children: [ - { - key: 'facebook', - label: 'sidebar.import' - }, - { - key: 'facebook-data', - label: 'sidebar.data', - }, - { - key: 'facebook-analytics', - label: 'sidebar.analytics', - }, - ] }, { key: 'instagram', - label: 'sidebar.instagram', + label: 'Instagram', leftIcon: 'ion-social-instagram', - children: [ - { - key: 'instagram', - label: 'sidebar.import' - }, - { - key: 'instagram-data', - label: 'sidebar.data', - }, - { - key: 'instagram-analytics', - label: 'sidebar.analytics', - }, - ] }, { key: 'spotify', - label: 'sidebar.spotify', + label: 'Spotify', leftIcon: 'ion-music-note', - children: [ - { - key: 'spotify', - label: 'sidebar.import' - }, - { - key: 'spotify-data', - label: 'sidebar.data', - }, - { - key: 'spotify-analytics', - label: 'sidebar.analytics', - }, - ] }, { key: 'linkedin', - label: 'sidebar.linkedin', + label: 'LinkedIn', leftIcon: 'ion-social-linkedin', - children: [ - { - key: 'linkedin', - label: 'sidebar.import' - }, - { - key: 'linkedin-data', - label: 'sidebar.data', - }, - { - key: 'linkedin-analytics', - label: 'sidebar.analytics', - }, - ] }, ]; export default options; diff --git a/src/containers/Spotify/Analytics.js b/src/containers/Spotify/Analytics.js deleted file mode 100644 index 77bbc10..0000000 --- a/src/containers/Spotify/Analytics.js +++ /dev/null @@ -1,62 +0,0 @@ -import React, { Component } from 'react'; -import { Row, Col } from 'antd'; - -import PageHeader from '@imd/components/utility/pageHeader'; -import Box from '@imd/components/utility/box'; -import LayoutWrapper from '@imd/components/utility/layoutWrapper'; -import ContentHolder from '@imd/components/utility/contentHolder'; - -import basicStyle from '@imd/assets/styles/constants'; -import IsoWidgetsWrapper from '@imd/containers/Widgets/WidgetsWrapper'; -import TotalSongsByDayLine from './Components/TotalSongsByDayLine/TotalSongsByDayLine'; -import CardWidget from '@imd/containers/Widgets/Card/CardWidget'; -import UserData from './Data/StreamingHistory0.json'; - -export default class extends Component { - - render() { - - let totalSongs = UserData.length; - - const CARD_WIDGET = [ - { - icon: 'ion-music-note', - iconcolor: '#000000', - number: totalSongs.toString(), - text: 'Total Listens', - }, - ]; - - const { rowStyle, colStyle, gutter } = basicStyle; - - return ( - <LayoutWrapper> - <PageHeader>Analytics</PageHeader> - <Row style={rowStyle} gutter={0} justify="start"> - <Col lg={6} md={12} sm={12} xs={24} style={colStyle}> - {CARD_WIDGET.map((widget, idx) => ( - <IsoWidgetsWrapper key={idx} gutterBottom={20}> - {/* Card Widget */} - <CardWidget - icon={widget.icon} - iconcolor={widget.iconcolor} - number={widget.number} - text={widget.text} - /> - </IsoWidgetsWrapper> - ))} - </Col> - <Col lg={18} md={12} sm={12} xs={24} style={colStyle}> - <IsoWidgetsWrapper> - <Box title="Total Songs By Day"> - <ContentHolder> - <TotalSongsByDayLine /> - </ContentHolder> - </Box> - </IsoWidgetsWrapper> - </Col> - </Row> - </LayoutWrapper> - ); - }; -} diff --git a/src/containers/Spotify/Analytics.styles.js b/src/containers/Spotify/Analytics.styles.js deleted file mode 100644 index 72aac47..0000000 --- a/src/containers/Spotify/Analytics.styles.js +++ /dev/null @@ -1,222 +0,0 @@ -import styled from 'styled-components'; -import { palette } from 'styled-theme'; -import { - borderRadius, - boxShadow, - transition, -} from '@imd/lib/helpers/style_utils'; - -const DropzoneWrapper = styled.div` - .filepicker { - width: 100%; - min-height: 320px; - padding: 35px 0px; - display: flex; - flex-wrap: wrap; - align-items: center; - justify-content: center; - background-color: #ffffff; - border: 1px dashed ${palette('border', 0)}; - position: relative; - overflow: hidden; - cursor: pointer; - text-align: center; - ${borderRadius('0')}; - - .closeBtn { - width: 30px; - height: 30px; - display: flex; - align-items: center; - justify-content: center; - flex-shrink: 0; - padding: 0; - margin-right: 0; - background-color: transparent; - outline: 0; - border: 0; - position: absolute; - top: 0; - right: 0; - ${borderRadius('50%')}; - ${boxShadow('none')}; - ${transition()}; - - &:before { - content: '\f2d7'; - font-family: 'ionicons'; - font-size: 14px; - color: ${palette('text', 3)}; - line-height: 1; - ${transition()}; - } - - &:hover { - &:before { - color: ${palette('text', 0)}; - } - } - } - - .dz-message { - width: 100%; - position: relative; - display: flex; - flex-direction: column; - margin: 0; - - span { - font-size: 14px; - color: ${palette('text', 3)}; - font-weight: 700; - margin-top: 6px; - } - - &:before { - content: '\f255'; - font-family: 'ionicons'; - font-size: 53.4px; - line-height: 32px; - color: ${palette('primary', 0)}; - } - } - - .dz-progress { - width: 100%; - height: 100px; - display: flex; - align-items: center; - justify-content: center; - flex-shrink: 0; - position: absolute; - top: 0; - left: 0; - background: none; - background-color: rgba(255, 255, 255, 0.8); - ${borderRadius('0')}; - } - - .dz-preview { - width: 100px; - height: 127px; - display: flex; - flex-direction: column; - flex-shrink: 0; - overflow: hidden; - float: left; - position: relative; - margin: 0; - margin-left: 2px; - margin-bottom: 2px; - - .dz-progress { - display: none; - } - - .dz-image { - width: 100%; - height: 100px; - margin-bottom: 2px; - display: block; - flex-shrink: 0; - overflow-y: hidden; - position: relative; - background: none; - background-color: ${palette('secondary', 6)}; - ${borderRadius('0')}; - - img { - max-width: 100%; - position: absolute; - left: 0; - right: 0; - top: 0; - bottom: 0; - margin: auto; - } - } - - .dz-details { - width: 100%; - height: 25px; - padding: 0 8px; - flex-shrink: 0; - opacity: 1; - display: flex; - align-items: center; - justify-content: center; - overflow: hidden; - position: relative; - cursor: default; - background-color: ${palette('secondary', 1)}; - - .dz-size { - display: none; - } - .dz-filename { - width: 100%; - overflow: hidden; - text-overflow: ellipsis; - - span { - font-size: 14px; - color: ${palette('text', 4)}; - white-space: nowrap; - background-color: transparent; - } - - &:not(:hover) { - span { - border: 0; - } - } - - &:hover { - span { - border: 0; - background-color: transparent; - } - } - } - } - - .dz-success-mark { - display: none; - } - - .dz-remove { - font-size: 14px; - font-weight: 400; - background-color: ${palette('error', 0)}; - width: 100%; - height: 25px; - color: #fff; - line-height: 25px; - display: inline-block; - text-align: center; - position: absolute; - bottom: -25px; - left: 0px; - cursor: pointer; - border: 0; - outline: 0; - padding: 0; - ${transition()}; - } - - &:hover { - .dz-remove { - bottom: 0; - } - } - } - - &.dz-started { - .dz-message { - display: none; - } - } - } -`; - -export default DropzoneWrapper; diff --git a/src/containers/Spotify/Data.js b/src/containers/Spotify/Data.js deleted file mode 100644 index d0e07ea..0000000 --- a/src/containers/Spotify/Data.js +++ /dev/null @@ -1,39 +0,0 @@ -import React, { Component } from 'react'; -import { Row, Col } from 'antd'; - -import PageHeader from '@imd/components/utility/pageHeader'; -import Box from '@imd/components/utility/box'; -import LayoutWrapper from '@imd/components/utility/layoutWrapper'; -import ContentHolder from '@imd/components/utility/contentHolder'; - -import basicStyle from '@imd/assets/styles/constants'; -import IsoWidgetsWrapper from '@imd/containers/Widgets/WidgetsWrapper'; -import TotalSongsByDayLine from './Components/TotalSongsByDayLine/TotalSongsByDayLine'; -import CardWidget from '@imd/containers/Widgets/Card/CardWidget'; -import UserData from './Data/StreamingHistory0.json'; - -export default class extends Component { - - render() { - - let songs = UserData; - - const { rowStyle, colStyle, gutter } = basicStyle; - - return ( - <LayoutWrapper> - <PageHeader>Data</PageHeader> - - {UserData.map((song, idx) => ( - <Col lg={6} md={12} sm={12} xs={24} style={colStyle}> - <Box> - <h1>{song.trackName}</h1> - <div>Artist: {song.artistName}</div> - <div>{song.endTime}</div> - </Box> - </Col> - ))} - </LayoutWrapper> - ); - }; -} diff --git a/src/containers/Spotify/Data.styles.js b/src/containers/Spotify/Data.styles.js deleted file mode 100644 index e69de29..0000000 diff --git a/src/containers/Spotify/Import.styles.js b/src/containers/Spotify/Import.styles.js deleted file mode 100644 index 72aac47..0000000 --- a/src/containers/Spotify/Import.styles.js +++ /dev/null @@ -1,222 +0,0 @@ -import styled from 'styled-components'; -import { palette } from 'styled-theme'; -import { - borderRadius, - boxShadow, - transition, -} from '@imd/lib/helpers/style_utils'; - -const DropzoneWrapper = styled.div` - .filepicker { - width: 100%; - min-height: 320px; - padding: 35px 0px; - display: flex; - flex-wrap: wrap; - align-items: center; - justify-content: center; - background-color: #ffffff; - border: 1px dashed ${palette('border', 0)}; - position: relative; - overflow: hidden; - cursor: pointer; - text-align: center; - ${borderRadius('0')}; - - .closeBtn { - width: 30px; - height: 30px; - display: flex; - align-items: center; - justify-content: center; - flex-shrink: 0; - padding: 0; - margin-right: 0; - background-color: transparent; - outline: 0; - border: 0; - position: absolute; - top: 0; - right: 0; - ${borderRadius('50%')}; - ${boxShadow('none')}; - ${transition()}; - - &:before { - content: '\f2d7'; - font-family: 'ionicons'; - font-size: 14px; - color: ${palette('text', 3)}; - line-height: 1; - ${transition()}; - } - - &:hover { - &:before { - color: ${palette('text', 0)}; - } - } - } - - .dz-message { - width: 100%; - position: relative; - display: flex; - flex-direction: column; - margin: 0; - - span { - font-size: 14px; - color: ${palette('text', 3)}; - font-weight: 700; - margin-top: 6px; - } - - &:before { - content: '\f255'; - font-family: 'ionicons'; - font-size: 53.4px; - line-height: 32px; - color: ${palette('primary', 0)}; - } - } - - .dz-progress { - width: 100%; - height: 100px; - display: flex; - align-items: center; - justify-content: center; - flex-shrink: 0; - position: absolute; - top: 0; - left: 0; - background: none; - background-color: rgba(255, 255, 255, 0.8); - ${borderRadius('0')}; - } - - .dz-preview { - width: 100px; - height: 127px; - display: flex; - flex-direction: column; - flex-shrink: 0; - overflow: hidden; - float: left; - position: relative; - margin: 0; - margin-left: 2px; - margin-bottom: 2px; - - .dz-progress { - display: none; - } - - .dz-image { - width: 100%; - height: 100px; - margin-bottom: 2px; - display: block; - flex-shrink: 0; - overflow-y: hidden; - position: relative; - background: none; - background-color: ${palette('secondary', 6)}; - ${borderRadius('0')}; - - img { - max-width: 100%; - position: absolute; - left: 0; - right: 0; - top: 0; - bottom: 0; - margin: auto; - } - } - - .dz-details { - width: 100%; - height: 25px; - padding: 0 8px; - flex-shrink: 0; - opacity: 1; - display: flex; - align-items: center; - justify-content: center; - overflow: hidden; - position: relative; - cursor: default; - background-color: ${palette('secondary', 1)}; - - .dz-size { - display: none; - } - .dz-filename { - width: 100%; - overflow: hidden; - text-overflow: ellipsis; - - span { - font-size: 14px; - color: ${palette('text', 4)}; - white-space: nowrap; - background-color: transparent; - } - - &:not(:hover) { - span { - border: 0; - } - } - - &:hover { - span { - border: 0; - background-color: transparent; - } - } - } - } - - .dz-success-mark { - display: none; - } - - .dz-remove { - font-size: 14px; - font-weight: 400; - background-color: ${palette('error', 0)}; - width: 100%; - height: 25px; - color: #fff; - line-height: 25px; - display: inline-block; - text-align: center; - position: absolute; - bottom: -25px; - left: 0px; - cursor: pointer; - border: 0; - outline: 0; - padding: 0; - ${transition()}; - } - - &:hover { - .dz-remove { - bottom: 0; - } - } - } - - &.dz-started { - .dz-message { - display: none; - } - } - } -`; - -export default DropzoneWrapper; diff --git a/src/containers/Spotify/Import.js b/src/containers/Spotify/Spotify.js similarity index 94% rename from src/containers/Spotify/Import.js rename to src/containers/Spotify/Spotify.js index 417b052..52e63dd 100644 --- a/src/containers/Spotify/Import.js +++ b/src/containers/Spotify/Spotify.js @@ -7,17 +7,14 @@ import PageHeader from '@imd/components/utility/pageHeader'; import Box from '@imd/components/utility/box'; import LayoutWrapper from '@imd/components/utility/layoutWrapper'; import ContentHolder from '@imd/components/utility/contentHolder'; -import DropzoneWrapper from './Import.styles'; +import DropzoneWrapper from './Spotify.styles'; import basicStyle from '@imd/assets/styles/constants'; -import FrappeChart from 'frappe-charts/dist/frappe-charts.min.esm'; -import * as configs from './config'; import 'frappe-charts/dist/frappe-charts.min.css'; import Tabs, { TabPane } from '@imd/components/uielements/tabs'; import IsoWidgetsWrapper from '@imd/containers/Widgets/WidgetsWrapper'; import CardWidget from '@imd/containers/Widgets/Card/CardWidget'; -import IntlMessages from '@imd/components/utility/intlMessages'; import TotalSongsByDayLine from './Components/TotalSongsByDayLine/TotalSongsByDayLine'; import UserData from './Data/StreamingHistory0.json'; @@ -25,10 +22,6 @@ function callback(key) {} export default class extends Component { - componentDidMount() { - new FrappeChart(configs.impressionsLineChart); - } - render() { let totalSongs = UserData.length; diff --git a/src/containers/Instagram/Import.styles.js b/src/containers/Spotify/Spotify.styles.js similarity index 100% rename from src/containers/Instagram/Import.styles.js rename to src/containers/Spotify/Spotify.styles.js diff --git a/src/containers/Spotify/config.js b/src/containers/Spotify/config.js deleted file mode 100644 index 5beefd0..0000000 --- a/src/containers/Spotify/config.js +++ /dev/null @@ -1,50 +0,0 @@ -const basicData = { - labels: [ - '12am-3am', - '3am-6am', - '6am-9am', - '9am-12pm', - '12pm-3pm', - '3pm-6pm', - '6pm-9pm', - '9pm-12am', - ], - - datasets: [ - { - title: 'Some Data', - color: 'light-blue', - values: [25, 40, 30, 35, 8, 52, 17, -4], - }, - { - title: 'Another Set', - color: 'violet', - values: [25, 50, -10, 15, 18, 32, 27, 14], - }, - { - title: 'Yet Another', - color: 'blue', - values: [15, 20, -3, -15, 58, 12, -17, 37], - }, - ], - }; - - const basicConfig = { - height: 250, - format_tooltip_x: d => (d + '').toUpperCase(), - format_tooltip_y: d => d + ' pts', - }; - const impressionsLineChart = { - header: 'App Impressions', - title: '', - parent: '#impressionsLineChart', - parentId: 'impressionsLineChart', - type: 'line', - data: basicData, - ...basicConfig, - }; - - export { - impressionsLineChart - }; - \ No newline at end of file -- GitLab