upgraded Web UI template to 2.9.0

pull/42/MERGE
13621160019@163.com 2021-06-25 08:16:14 +08:00
parent b2c18260a9
commit c2edc9a805
34 changed files with 21298 additions and 20950 deletions

8
web/README.md vendored
View File

@ -15,14 +15,16 @@ This project is scaffolded using Create React App.
* Install Node.js (https://nodejs.org/) if you do not already have it installed on your machine.
* Open the “myems-web” directory with your cmd or terminal
* Run 'npm i'
* Run 'sudo npm i --unsafe-perm=true --allow-root'
This command will download all the necessary dependencies for falcon in the node_modules directory.
* Run 'npm start'
* If you modified any scss files, then you need to compile SCSS
Run 'sudo npm run scss' command in your project directory to compile scss.
* Run 'sudo npm start'
A local web server will start at http://localhost:3000.
We are using webpack and webpack-serve to automatically detect file changes. So, if you edit and save a file, your browser will automatically refresh and preview the change.
## Creating a Production Build
* Run 'npm run build' command in your project directory to make the Production build.
* Run 'sudo npm run build' command in your project directory to make the Production build.
This will create an optimized production build by compililing, merging and minifying all the source files as necessary and put them in the build/ folder.

11056
web/package-lock.json generated vendored

File diff suppressed because it is too large Load Diff

13
web/package.json vendored
View File

@ -3,14 +3,22 @@
"version": "1.1.3",
"private": true,
"dependencies": {
"@fortawesome/fontawesome-free": "^5.15.1",
"@fortawesome/fontawesome-svg-core": "^1.2.30",
"@fortawesome/free-brands-svg-icons": "^5.14.0",
"@fortawesome/free-regular-svg-icons": "^5.14.0",
"@fortawesome/free-solid-svg-icons": "^5.14.0",
"@fortawesome/free-solid-svg-icons": "^5.15.1",
"@fortawesome/react-fontawesome": "^0.1.11",
"@fullcalendar/bootstrap": "^5.3.1",
"@fullcalendar/core": "^5.3.1",
"@fullcalendar/daygrid": "^5.3.2",
"@fullcalendar/interaction": "^5.3.1",
"@fullcalendar/list": "^5.3.1",
"@fullcalendar/react": "^5.3.1",
"@fullcalendar/timegrid": "^5.3.1",
"@loadable/component": "^5.13.2",
"attr-accept": "^2.2.2",
"bootstrap": "^4.5.2",
"bootstrap": "^4.5.3",
"chart.js": "^2.9.3",
"classnames": "^2.2.6",
"echarts": "^4.9.0",
@ -42,6 +50,7 @@
"react-dom": "^16.13.1",
"react-dropzone": "^10.2.2",
"react-es6-progressbar.js": "^1.1.0",
"react-flatpickr": "^3.10.6",
"react-hook-form": "^4.10.2",
"react-i18next": "^11.7.0",
"react-image-lightbox": "^5.1.1",

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,5 +1,5 @@
/*-----------------------------------------------
| Calender
| Calendar
-----------------------------------------------*/
.calendar {
width: 50px;

View File

@ -9,4 +9,24 @@
}
@return $raised;
}
@function toRem($px) { @return ($px / 16); }
@function toRem($px) {
@return ($px / 16);
}
@mixin chrome-scrollbar {
overflow: auto;
&::-webkit-scrollbar {
-webkit-appearance: none;
width: 7px;
height: 7px;
background-color: transparent;
}
&::-webkit-scrollbar-thumb {
border-radius: 4px;
background-color: rgba($gray-600, 0.3);
}
}
@mixin firefox-scrollbar {
scrollbar-color: rgba($gray-600, 0.3) transparent;
scrollbar-width: thin;
}

View File

@ -1,11 +1,13 @@
/*-----------------------------------------------
| Icons group
-----------------------------------------------*/
.icon-group{
.icon-group {
display: flex;
.icon-item:not(:last-child){ margin-right: map_get($spacers, 2); }
.icon-item:not(:last-child) {
margin-right: map_get($spacers, 2);
}
}
.icon-item{
.icon-item {
border-radius: 50%;
display: flex;
justify-content: center;
@ -17,9 +19,21 @@
border: 0;
font-size: $font-size-sm;
box-shadow: $box-shadow-sm;
@include hover-focus{ background-color: $light; }
&.icon-item-lg{
@include hover-focus {
background-color: $light;
}
&.icon-item-sm {
height: 1.875rem;
width: 1.875rem;
}
&.icon-item-lg {
height: 2.75rem;
width: 2.75rem;
}
&.icon-item-hover {
transition: $transition-base;
@include hover-focus {
background-color: $gray-200;
}
}
}

View File

@ -47,7 +47,7 @@
.card-notification {
min-width: 20rem;
@include media-breakpoint-only(xs) {
min-width: 16rem;
min-width: 17rem;
}
}
.settings-popover {

View File

@ -1,15 +1,10 @@
/*-----------------------------------------------
| Navbar
| Navbar vertical
-----------------------------------------------*/
.shadow-bottom {
box-shadow: 0 0.5rem 0.5rem -0.5rem rgba($black, 0.2) !important;
}
/*-----------------------------------------------
| Navbar vertical
-----------------------------------------------*/
$navbar-vertical-width: 12.625rem;
$vartical-navbar-padding: 1.5rem;
.navbar-top {
top: 0;
z-index: 1020;
@ -67,8 +62,8 @@ $vartical-navbar-padding: 1.5rem;
}
}
.nav-link-icon {
width: $vartical-navbar-padding;
min-width: $vartical-navbar-padding;
width: $vertical-navbar-padding;
min-width: $vertical-navbar-padding;
font-size: map_get($font-sizes, 0);
}
.nav {
@ -76,7 +71,7 @@ $vartical-navbar-padding: 1.5rem;
font-size: 0.8125rem;
.nav-item {
.nav-link {
padding: 0.2rem $vartical-navbar-padding;
padding: 0.2rem $vertical-navbar-padding;
}
&:last-child {
margin-bottom: 0.35rem;
@ -85,13 +80,13 @@ $vartical-navbar-padding: 1.5rem;
.nav {
.nav-item {
.nav-link {
padding-left: $vartical-navbar-padding * 1.75;
padding-left: $vertical-navbar-padding * 1.75;
}
}
.nav {
.nav-item {
.nav-link {
padding-left: $vartical-navbar-padding * 2.75;
padding-left: $vertical-navbar-padding * 2.75;
}
}
}
@ -265,11 +260,6 @@ $vartical-navbar-padding: 1.5rem;
| Break
-----------------------------------------------*/
$breaks: ('xxl', 'xl', 'lg', 'md', 'sm', 'xs');
// $navbar-collapsed-width: 3.4375rem;
$navbar-collapsed-width: 3.125rem;
$navbar-vertical-max-width: 12.625rem;
@for $i from 1 through length($breaks) {
$item: nth($breaks, $i);
$j: '';

View File

@ -8,3 +8,4 @@
@import 'plugins/react-datetime';
@import 'plugins/leaflet';
@import 'plugins/emoji';
@import 'plugins/full-calendar';

View File

@ -453,6 +453,16 @@ $avatars-dimension: (
$tooltip-padding-y: 0.5rem !default;
$tooltip-font-size: map_get($font-sizes, '-1') !default;
/*-----------------------------------------------
| Navbar vertical
-----------------------------------------------*/
$navbar-vertical-width: 12.5rem !default;
$vertical-navbar-padding: 1.5rem !default;
$breaks: ('xxl', 'xl', 'lg', 'md', 'sm', 'xs') !default;
$navbar-collapsed-width: 3.125rem !default;
$navbar-vertical-max-width: 12.625rem !default;
//*-----------------------------------------------
//| Navbar Inverted
//-----------------------------------------------*/

View File

@ -0,0 +1,318 @@
#appCalendar {
min-height: calc(100vh - #{$top-nav-height});
}
.fc {
.fc-col-header {
background-color: $gray-100;
th {
border-bottom-width: 1px;
}
}
.fc-col-header-cell-cushion {
text-decoration: none !important;
}
.fc-daygrid-day-frame {
border: 2px solid transparent;
padding: 2px !important;
transition: $transition-base;
&:active {
background-color: rgba($primary, 0.1) !important;
}
}
.fc-daygrid-day-top {
justify-content: center;
margin-bottom: 0.25rem;
}
.fc-daygrid-day-number {
width: 30px;
height: 30px;
background-color: $gray-100;
text-align: center;
text-decoration: none !important;
border-radius: 50%;
line-height: 30px;
padding: 0 !important;
font-size: map-get($font-sizes, '-1');
transition: $transition-base;
@include hover-focus {
background-color: $gray-200;
}
}
// Events
.fc-daygrid-event {
border-radius: $border-radius !important;
margin-top: 0;
margin-bottom: 0.25rem !important;
padding: 0.25rem 0.5rem !important;
border: 0 !important;
font-size: map-get($font-sizes, '-2');
}
.fc-h-event {
background-color: rgb(230, 239, 252);
.fc-event-main {
color: darken($primary, 10%);
}
.fc-event-time,
.fc-event-title {
font-weight: $font-weight-semi-bold !important;
}
}
.fc-event-title {
font-weight: normal !important;
}
.fc-daygrid-event-dot {
border-color: $gray-300 !important;
}
.fc-day-today:not(.fc-popover) {
background-color: transparent !important;
.fc-daygrid-day-frame {
border: 2px solid rgba($primary, 0.5);
}
.fc-daygrid-day-number {
background-color: $primary !important;
color: #fff;
@include hover-focus {
background-color: darken($primary, 10%) !important;
}
}
}
&.fc-direction-rtl,
&.fc-direction-ltr {
.fc-daygrid-event {
&.fc-event-start,
&.fc-event-end {
margin-left: 0;
margin-right: 0;
}
}
}
.fc-popover {
border-color: $border-color;
box-shadow: $box-shadow;
.fc-popover-title {
font-family: $font-family-sans-serif;
}
.fc-daygrid-event {
margin-left: 0 !important;
margin-right: 0 !important;
margin-bottom: 2px !important;
}
}
.fc-popover-header {
padding-left: 10px;
padding-right: 10px;
font-size: 14px;
font-weight: $font-weight-semi-bold;
border-top-left-radius: $border-radius-soft;
border-top-right-radius: $border-radius-soft;
}
.fc-daygrid-more-link {
display: block;
text-align: center;
color: $gray-500 !important;
font-size: map-get($font-sizes, '-2');
@include hover-focus {
text-decoration: none;
color: $gray-600 !important;
}
}
.fc-daygrid-dot-event {
color: $gray-500 !important;
@include hover-focus {
background-color: $gray-200 !important;
}
}
.fc-day:not(.fc-popover) .fc-daygrid-dot-event {
display: flex;
justify-content: center;
.fc-event-time,
.fc-event-title {
display: none;
}
}
// Event List View
.fc-list-event {
&:hover td {
background-color: unset;
}
}
.fc-dayGridMonth-view {
.fc-event-time {
display: none;
}
}
.fc-timeGridDay-view .fc-scrollgrid-sync-inner {
text-align: left;
}
.fc-timeGridDay-view,
.fc-timeGridWeek-view {
.fc-daygrid-day-events {
margin-bottom: 0;
}
.fc-v-event .fc-event-main {
padding-left: 1rem;
color: $gray-500;
&:after {
content: '';
position: absolute;
height: 10px;
width: 10px;
border-radius: 50%;
background-color: $gray-400;
top: 5px;
left: 0;
}
}
.fc-timegrid-event {
padding: 0.5rem;
background-color: transparent;
border: 0;
border-radius: $border-radius-soft;
@include hover-focus {
background-color: $gray-200;
}
}
.fc-timegrid-slot {
height: 2rem;
}
.fc-timegrid-col {
padding: 6px !important;
}
}
.fc-list {
.fc-list-day-cushion {
padding: 0.5rem 1.25rem;
background-color: $white;
}
.fc-list-day:not(:first-child) {
.fc-list-day-cushion {
margin-top: map-get($spacers, 4);
}
}
.fc-list-event-time {
padding-left: 1.25rem;
}
.fc-list-event-title {
padding-right: 1.25rem;
}
}
.fc-list-empty {
background-color: $gray-100 !important;
}
.fc-list-event-dot {
border-color: $gray-300;
}
}
@each $color, $value in $theme-colors {
.fc-timegrid {
.event-bg-soft-#{$color} {
border: 0 !important;
@extend .bg-soft-#{$color};
.fc-event-main:after {
background-color: $value !important;
}
}
}
.bg-soft-#{$color} {
.fc-event-main {
color: darken($value, 10%) !important;
&:after {
background-color: darken($value, 10%) !important;
}
}
.fc-list-event-time,
.fc-list-event-title {
color: darken($value, 10%) !important;
font-weight: $font-weight-semi-bold !important;
}
.fc-list-event-dot {
border-color: darken($value, 10%);
}
}
}
[data-fc-view]:not(.active) span {
opacity: 0;
}
.timeline {
li {
position: relative;
padding-left: 1.5rem;
&:after {
position: absolute;
content: '';
height: 10px;
width: 10px;
border-radius: 50%;
background: $gray-200;
left: 0;
top: 50%;
transform: translateY(-50%);
}
&:not(:last-child):before {
position: absolute;
content: '';
height: 100%;
width: 1px;
background-color: $gray-200;
top: 50%;
left: 5px;
}
}
}
.windows {
&.chrome {
.fc-scroller {
overflow: hidden auto !important;
@include chrome-scrollbar;
}
}
&.firefox {
.fc-scroller {
overflow: hidden auto !important;
@include firefox-scrollbar;
}
}
}
@include media-breakpoint-up(md) {
.fc {
.fc-daygrid-day-frame {
padding: 6px !important;
}
.fc-day:not(.fc-popover) .fc-daygrid-dot-event {
.fc-event-time,
.fc-event-title {
display: block;
}
}
.fc-daygrid-more-link {
margin-left: 10px;
text-align: left;
font-size: map-get($font-sizes, '-1');
}
.fc-daygrid-event {
font-size: map-get($font-sizes, '-1');
}
}
}
.ie {
.fc-daygrid-event {
overflow: hidden;
}
}
.safari {
.fc-dayGridMonth-view {
.fc-daygrid-day {
position: relative;
.fc-daygrid-day-frame {
position: absolute;
left: 0;
top: 0;
right: 0;
bottom: 0;
}
}
}
}

View File

@ -0,0 +1,164 @@
import React, { useState, useEffect } from 'react';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import {
Button,
Modal,
ModalHeader,
ModalBody,
ModalFooter,
Form,
FormGroup,
Label,
Input,
CustomInput
} from 'reactstrap';
import Datetime from 'react-datetime';
import { v4 as uuid } from 'uuid';
import Flex from '../common/Flex';
const AddScheduleModal = ({
setIsOpenScheduleModal,
isOpenScheduleModal,
setInitialEvents,
initialEvents,
addScheduleStartDate,
setAddScheduleStartDate
}) => {
const toggle = () => setIsOpenScheduleModal(!isOpenScheduleModal);
const [formObj, setFormObj] = useState({ id: uuid() });
const [endDate, setEndDate] = useState();
const [startDate, setStartDate] = useState();
const closeBtn = (
<button className="close font-weight-normal" onClick={toggle}>
&times;
</button>
);
const handleChange = target => {
let name = target.name;
let value = name === 'allDay' ? target.checked : target.value;
setFormObj({ ...formObj, [name]: value });
};
useEffect(() => {
!isOpenScheduleModal && setAddScheduleStartDate(null);
!isOpenScheduleModal && setEndDate(null);
!isOpenScheduleModal && setStartDate(null);
setFormObj({ ...formObj, start: addScheduleStartDate });
// eslint-disable-next-line
}, [isOpenScheduleModal, addScheduleStartDate]);
return (
<Modal isOpen={isOpenScheduleModal} toggle={toggle} modalClassName="theme-modal" contentClassName="border">
<Form
onSubmit={e => {
e.preventDefault();
setIsOpenScheduleModal(false);
setInitialEvents([...initialEvents, formObj]);
}}
>
<ModalHeader toggle={toggle} className="bg-light d-flex flex-between-center border-bottom-0" close={closeBtn}>
Create Schedule
</ModalHeader>
<ModalBody>
<FormGroup>
<Label className="fs-0" for="eventTitle">
Title
</Label>
<Input name="title" id="eventTitle" required onChange={({ target }) => handleChange(target)} />
</FormGroup>
<FormGroup>
<Label className="fs-0" for="eventStart">
Start Date
</Label>
<Datetime
timeFormat={true}
value={startDate || addScheduleStartDate}
onChange={dateTime => {
if (dateTime._isValid) {
setStartDate(dateTime);
let date = {};
date.value = dateTime.format();
date.name = 'start';
handleChange(date);
}
}}
dateFormat="MM-DD-YYYY"
inputProps={{ placeholder: 'MM-DD-YYYY H:M', id: 'eventStart' }}
/>
</FormGroup>
<FormGroup>
<Label className="fs-0" for="eventEnd">
End Date
</Label>
<Datetime
value={endDate}
timeFormat={true}
onChange={dateTime => {
if (dateTime._isValid) {
setEndDate(dateTime);
let date = {};
date.value = dateTime.format();
date.name = 'end';
handleChange(date);
}
}}
dateFormat="MM-DD-YYYY"
inputProps={{ placeholder: 'MM-DD-YYYY H:M', id: 'eventEnd' }}
/>
</FormGroup>
<FormGroup>
<CustomInput
name="allDay"
type="checkbox"
id="allDay"
label="All Day"
onChange={({ target }) => handleChange(target)}
/>
</FormGroup>
<FormGroup>
<Label className="fs-0">Schedule Meeting</Label>
<div>
<Button color="" type="button" className="text-left bg-soft-info text-info">
<FontAwesomeIcon icon="video" className="mr-2" />
<span>Add video conference link</span>
</Button>
</div>
</FormGroup>
<FormGroup>
<Label className="fs-0" for="eventDescription">
Description
</Label>
<Input
type="textarea"
name="description"
id="eventDescription"
onChange={({ target }) => handleChange(target)}
/>
</FormGroup>
<FormGroup>
<Label for="eventLabel">Label</Label>
<CustomInput type="select" id="eventLabel" name="className" onChange={({ target }) => handleChange(target)}>
<option>None</option>
<option value="bg-soft-info">Business</option>
<option value="bg-soft-danger">Important</option>
<option value="bg-soft-warning">Personal</option>
<option value="bg-soft-success">Must Attend</option>
</CustomInput>
</FormGroup>
</ModalBody>
<ModalFooter tag={Flex} justify="end" align="center" className="bg-light border-top-0">
<Button color="link" tag="a" href="pages/event-create" className="text-600">
More Option
</Button>
<Button color="primary" type="submit" className="px-4">
Save
</Button>
</ModalFooter>
</Form>
</Modal>
);
};
export default AddScheduleModal;

View File

@ -0,0 +1,213 @@
import React, { useEffect, useRef, useState } from 'react';
import { Button, Card, CardBody, CardHeader, Col, Row, UncontrolledTooltip } from 'reactstrap';
import FullCalendar from '@fullcalendar/react';
import dayGridPlugin from '@fullcalendar/daygrid';
import bootstrapPlugin from '@fullcalendar/bootstrap';
import timeGridPlugin from '@fullcalendar/timegrid';
import listPlugin from '@fullcalendar/list';
import interactionPlugin from '@fullcalendar/interaction';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import DropdownFilter from '../email/inbox/DropdownFilter';
import CalendarEventModal from './CalendarEventModal';
import AddScheduleModal from './AddScheduleModal';
import Flex from '../common/Flex';
import events from '../../data/calendar/events';
const Calendar = () => {
const calendarRef = useRef();
const [calendarApi, setCalendarApi] = useState({});
const [title, setTitle] = useState('');
const [currentFilter, setCurrentFilter] = useState('Month View');
const [isOpenModal, setIsOpenModal] = useState(false);
const [isOpenScheduleModal, setIsOpenScheduleModal] = useState(false);
const [modalEventContent, setModalEventContent] = useState(false);
const [addScheduleStartDate, setAddScheduleStartDate] = useState();
const buttonText = {
today: 'Today',
month: 'Month view',
week: 'week',
day: 'day',
listWeek: 'list view',
listYear: 'year'
};
const eventTimeFormat = {
hour: 'numeric',
minute: '2-digit',
omitZeroMinute: true,
meridiem: true
};
const viewName = ['Month View', 'Week View', 'Day View', 'List View', 'Year View'];
const views = {
week: {
eventLimit: 3
}
};
const eventList = events.reduce(
(acc, event) => (event.schedules ? acc.concat(event.schedules.concat(event)) : acc.concat(event)),
[]
);
const [initialEvents, setInitialEvents] = useState(eventList);
useEffect(() => {
setCalendarApi(calendarRef.current.getApi());
}, []);
const handleFilter = filter => {
setCurrentFilter(filter);
switch (filter) {
case 'Month View':
calendarApi.changeView('dayGridMonth');
setTitle(calendarApi.getCurrentData().viewTitle);
break;
case 'Week View':
calendarApi.changeView('timeGridWeek');
setTitle(calendarApi.getCurrentData().viewTitle);
break;
case 'Day View':
calendarApi.changeView('timeGridDay');
setTitle(calendarApi.getCurrentData().viewTitle);
break;
case 'List View':
calendarApi.changeView('listWeek');
setTitle(calendarApi.getCurrentData().viewTitle);
break;
default:
calendarApi.changeView('listYear');
setTitle(calendarApi.getCurrentData().viewTitle);
}
};
const handleEventClick = info => {
if (info.event.url) {
window.open(info.event.url);
info.jsEvent.preventDefault();
} else {
setModalEventContent(info);
setIsOpenModal(true);
}
};
return (
<>
<Card className="mb-3">
<CardHeader>
<Row noGutters className="align-items-center">
<Col xs="auto" className="d-flex justify-content-end order-md-1">
<UncontrolledTooltip placement="bottom" target="previous">
Previous
</UncontrolledTooltip>
<UncontrolledTooltip placement="bottom" target="next">
Next
</UncontrolledTooltip>
<Button
onClick={() => {
calendarApi.prev();
setTitle(calendarApi.getCurrentData().viewTitle);
}}
color="link"
className="icon-item icon-item-sm icon-item-hover shadow-none p-0 mr-1 ml-md-2"
id="previous"
>
<FontAwesomeIcon icon="arrow-left" />
</Button>
<Button
onClick={() => {
calendarApi.next();
setTitle(calendarApi.getCurrentData().viewTitle);
}}
color="link"
className="icon-item icon-item-sm icon-item-hover shadow-none p-0 mr-1"
id="next"
>
<FontAwesomeIcon icon="arrow-right" />
</Button>
</Col>
<Col xs="auto" md="auto" className="order-md-2">
<h4 className="mb-0 fs-0 fs-sm-1 fs-lg-2 calendar-title">
{title || `${calendarApi.currentDataManager?.data?.viewTitle}`}
</h4>
</Col>
<Col xs md="auto" tag={Flex} justify="end" className="order-md-3">
<Button
size="sm"
color="falcon-primary"
onClick={() => {
calendarApi.today();
setTitle(calendarApi.getCurrentData().viewTitle);
}}
>
Today
</Button>
</Col>
<Col md="auto" className="d-md-none">
<hr />
</Col>
<Col xs="auto" className="d-flex order-md-0">
<Button color="primary" size="sm" onClick={() => setIsOpenScheduleModal(true)}>
<FontAwesomeIcon icon="plus" className="mr-1" /> Add Schedule
</Button>
</Col>
<Col className="d-flex justify-content-end order-md-2">
<DropdownFilter
className="mr-2"
filters={viewName}
currentFilter={currentFilter}
handleFilter={handleFilter}
icon="sort"
right
/>
</Col>
</Row>
</CardHeader>
<CardBody className="p-0">
<FullCalendar
ref={calendarRef}
headerToolbar={false}
plugins={[dayGridPlugin, bootstrapPlugin, timeGridPlugin, interactionPlugin, listPlugin]}
initialView="dayGridMonth"
themeSystem="bootstrap"
dayMaxEvents={2}
height={800}
stickyHeaderDates={false}
editable
selectable
selectMirror
select={info => {
setIsOpenScheduleModal(true);
setAddScheduleStartDate(info.start);
}}
views={views}
eventTimeFormat={eventTimeFormat}
eventClick={handleEventClick}
events={initialEvents}
buttonText={buttonText}
/>
</CardBody>
</Card>
<AddScheduleModal
isOpenScheduleModal={isOpenScheduleModal}
setIsOpenScheduleModal={setIsOpenScheduleModal}
initialEvents={initialEvents}
setInitialEvents={setInitialEvents}
addScheduleStartDate={addScheduleStartDate}
setAddScheduleStartDate={setAddScheduleStartDate}
/>
<CalendarEventModal
isOpenModal={isOpenModal}
setIsOpenModal={setIsOpenModal}
modalEventContent={modalEventContent}
/>
</>
);
};
export default Calendar;

View File

@ -0,0 +1,90 @@
import React from 'react';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { Button, Media, Modal, ModalBody, ModalFooter, ModalHeader } from 'reactstrap';
import Flex from '../common/Flex';
import moment from 'moment';
const getCircleStackIcon = (icon, transform) => (
<span className="fa-stack ml-n1 mr-3">
<FontAwesomeIcon icon="circle" className="text-200 fa-stack-2x" />
<FontAwesomeIcon icon={icon} transform={transform ?? ''} className="text-primary fa-stack-1x" inverse />
</span>
);
const EventModalMediaContent = ({ icon, heading, content, children }) => (
<Media className="mt-3">
{getCircleStackIcon(icon)}
<Media body>
<>
<h6>{heading}</h6>
{children || <p className="mb-0 text-justify">{content}</p>}
</>
</Media>
</Media>
);
const CalendarEventModal = ({ isOpenModal, setIsOpenModal, modalEventContent }) => {
const toggle = () => setIsOpenModal(!isOpenModal);
const { title, end, start } = isOpenModal && modalEventContent.event;
const { description, location, organizer, schedules } = isOpenModal && modalEventContent.event.extendedProps;
const closeBtn = (
<button className="close font-weight-normal" onClick={toggle}>
&times;
</button>
);
return (
<Modal isOpen={isOpenModal} toggle={toggle} modalClassName="theme-modal" contentClassName="border" centered>
<ModalHeader toggle={toggle} tag="div" className="px-card bg-light border-0 flex-between-center" close={closeBtn}>
<h5 className="mb-0">{title}</h5>
{organizer && (
<p className="mb-0 fs--1 mt-1">
by <a href="#!">{organizer}</a>
</p>
)}
</ModalHeader>
<ModalBody className="px-card pb-card pt-1 fs--1">
{description && <EventModalMediaContent icon="align-left" heading="Description" content={description} />}
{(end || start) && (
<EventModalMediaContent icon="calendar-check" heading="Time and Date">
<span>{moment(start).format('LLLL')}</span>
{end && (
<>
{' '}
<br /> <span>{moment(end).format('LLLL')}</span>
</>
)}
</EventModalMediaContent>
)}
{location && (
<EventModalMediaContent icon="map-marker-alt" heading="Location">
<div className="mb-1" dangerouslySetInnerHTML={{ __html: location }} />
</EventModalMediaContent>
)}
{schedules && (
<EventModalMediaContent icon="clock" heading="Schedule">
<ul className="list-unstyled timeline mb-0">
{schedules.map((schedule, index) => (
<li key={index}>{schedule.title}</li>
))}
</ul>
</EventModalMediaContent>
)}
</ModalBody>
<ModalFooter tag={Flex} justify="end" className="bg-light px-card border-top-0">
<Button tag="a" href="pages/event-create" color="falcon-default" size="sm">
<FontAwesomeIcon icon="pencil-alt" className="fs--2 mr-2" />
<span>Edit</span>
</Button>
<Button tag="a" href="pages/event-detail" color="falcon-primary" size="sm">
<span>See more details</span>
<FontAwesomeIcon icon="angle-right" className="fs--2 ml-1" />
</Button>
</ModalFooter>
</Modal>
);
};
export default CalendarEventModal;

View File

@ -1,7 +1,25 @@
export default [
{
title: `2.9.0 - Banded kestrel`,
publish: '02 September, 2020',
logs: {
New: [
'<strong>Page</strong> :Calender',
'<strong>DOC</strong> : Full Calendar',
'<strong>Plugin</strong> : <code>FullCalendar</code>'
],
Migration: {
Add: [
'<code>src/components/calendar/*.*</code>',
'<code>src/components/plugins/CalenderExample.js</code>',
'<code>src/assets/scss/theme/_full-calender.scss</code>'
]
}
}
},
{
title: `2.8.0 - Dickinson's kestrel`,
publish: '29 September, 2020',
publish: '28 September, 2020',
logs: {
New: ['Navbar combo layout', '<strong>DOC</strong> : Navbar combo Doc'],
Update: ['<strong>DOC</strong>: Documentation'],

View File

@ -1,12 +1,13 @@
import React, { Fragment, useContext, useState } from 'react';
import PropTypes from 'prop-types';
import { Col, Row } from 'reactstrap';
import { Button, Col, Row } from 'reactstrap';
import StarCount from '../product/StarCount';
import classNames from 'classnames';
import { calculateSale, isIterableArray } from '../../../helpers/utils';
import QuantityController from '../../common/QuantityController';
import ButtonIcon from '../../common/ButtonIcon';
import AppContext, { ProductContext } from '../../../context/Context';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
const ProductDetailsMain = ({
id,
@ -103,7 +104,7 @@ const ProductDetailsMain = ({
<Col xs="auto" className="pr-0">
<QuantityController quantity={quantity} setQuantity={setQuantity} />
</Col>
<div className="col-auto">
<div className="col-auto pr-0">
{cartLoading ? (
<ButtonIcon
color="primary"
@ -116,16 +117,17 @@ const ProductDetailsMain = ({
Processing
</ButtonIcon>
) : (
<ButtonIcon color="primary" size="sm" icon="cart-plus" onClick={handleAddToCart}>
Add to Cart
</ButtonIcon>
<Button color="primary" size="sm" onClick={handleAddToCart}>
<FontAwesomeIcon icon="cart-plus" className="mr-sm-2" />
<span className="d-md-inline-block d-none">Add to Cart</span>
</Button>
)}
</div>
<div className="col-sm-auto pl-3 pl-sm-0">
<div className="col-auto">
<ButtonIcon
color="outline-danger"
size="sm"
className="border-300 mr-2 mt-2 mt-sm-0"
className="border-300 mr-2 "
icon={[isInFavouriteItems(id) ? 'fas' : 'far', 'heart']}
onClick={() =>
isInFavouriteItems(id)

View File

@ -1,25 +1,23 @@
import React, { useContext } from 'react';
import React from 'react';
import { DropdownMenu, DropdownToggle, UncontrolledDropdown } from 'reactstrap';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome/index';
import { isIterableArray } from '../../../helpers/utils';
import DropdownItemFilter from './DropdownItemFilter';
import { EmailContext } from '../../../context/Context';
const DropdownFilter = props => {
// Context
const { filters, handleFilter, currentFilter } = useContext(EmailContext);
return (
const DropdownFilter = ({ filters, handleFilter, currentFilter, icon, right, ...rest }) => (
<UncontrolledDropdown>
<DropdownToggle size="sm" color="falcon-default" {...props}>
<FontAwesomeIcon icon="sliders-h" />
<DropdownToggle size="sm" color="falcon-default" {...rest}>
{currentFilter && <span className="mr-2">{currentFilter}</span>}
<FontAwesomeIcon icon={icon} />
</DropdownToggle>
<DropdownMenu className="border py-2">
<DropdownMenu className="border py-2" right={right}>
{isIterableArray(filters) &&
filters.map((filter, index) => (
<DropdownItemFilter
currentFilter={currentFilter}
onClick={() => handleFilter(filter)}
onClick={() => {
handleFilter(filter);
}}
filter={filter}
className="text-capitalize"
key={index}
@ -29,7 +27,6 @@ const DropdownFilter = props => {
))}
</DropdownMenu>
</UncontrolledDropdown>
);
};
);
export default DropdownFilter;

View File

@ -10,7 +10,7 @@ import { EmailContext } from '../../../context/Context';
const InboxHeader = ({ isAllSelected, toggleIsAllSelected, selectedItems, isIndeterminate }) => {
// Context
const { handleFilter } = useContext(EmailContext);
const { filters, handleFilter, currentFilter } = useContext(EmailContext);
return (
<CardHeader>
@ -31,7 +31,13 @@ const InboxHeader = ({ isAllSelected, toggleIsAllSelected, selectedItems, isInde
<Button color="falcon-default" className="btn-sm ml-sm-1" onClick={() => handleFilter('all')}>
<FontAwesomeIcon icon="redo" />
</Button>
<DropdownFilter className="ml-2" />
<DropdownFilter
className="ml-2"
filters={filters}
handleFilter={handleFilter}
currentFilter={currentFilter}
icon="sliders-h"
/>
</Fragment>
)}
</Col>

View File

@ -1,4 +1,4 @@
import React from 'react';
import React, { useContext } from 'react';
import PropTypes from 'prop-types';
import NavbarDropdown from './NavbarDropdown';
import NavbarDropdownComponents from './NavbarDropdownComponents';
@ -30,19 +30,22 @@ import {
} from '../../routes';
import { NavItem } from 'reactstrap';
import { NavLink } from 'react-router-dom';
import { breakpoints } from '../../helpers/utils';
import { topNavbarBreakpoint } from '../../config';
import { breakpoints, getPageName } from '../../helpers/utils';
import { navbarBreakPoint, topNavbarBreakpoint } from '../../config';
import AppContext from '../../context/Context';
import { withTranslation } from 'react-i18next';
const NavbarTopDropDownMenus = ({ setNavbarCollapsed, t }) => {
const NavbarTopDropDownMenus = ({ setNavbarCollapsed, setShowBurgerMenu, t }) => {
const { isCombo, isTopNav } = useContext(AppContext);
// const components = [componentRoutes, pluginRoutes, utilityRoutes];
// const pages = [pageRoutes, kanbanRoutes, widgetsRoutes, chatRoutes, emailRoutes, ECommerceRoutes];
const handleSetNavbarCollapsed = () => {
const windowWidth = window.innerWidth;
windowWidth < breakpoints[topNavbarBreakpoint] && setNavbarCollapsed(false);
isTopNav && !isCombo && windowWidth < breakpoints[topNavbarBreakpoint] && setNavbarCollapsed(false);
isCombo && windowWidth < breakpoints[navbarBreakPoint] && setShowBurgerMenu(false);
};
const isLanding = getPageName('landing');
return (
<>
{/*<NavbarDropdown

View File

@ -1,18 +1,17 @@
import React, { useContext, useEffect, useRef } from 'react';
import PropTypes from 'prop-types';
import { Button, Collapse, Nav, Navbar } from 'reactstrap';
import is from 'is_js';
import classNames from 'classnames';
import is from 'is_js';
import PropTypes from 'prop-types';
import React, { useContext, useEffect, useRef } from 'react';
import { Button, Collapse, Nav, Navbar } from 'reactstrap';
import bgNavbarImg from '../../assets/img/generic/bg-navbar.png';
import { navbarBreakPoint, topNavbarBreakpoint } from '../../config';
import AppContext from '../../context/Context';
import routes from '../../routes';
import Flex from '../common/Flex';
import Logo from './Logo';
import NavbarTopDropDownMenus from './NavbarTopDropDownMenus';
import NavbarVerticalMenu from './NavbarVerticalMenu';
import ToggleButton from './ToggleButton';
import AppContext from '../../context/Context';
import Flex from '../common/Flex';
import routes from '../../routes';
import { navbarBreakPoint, topNavbarBreakpoint } from '../../config';
import bgNavbarImg from '../../assets/img/generic/bg-navbar.png';
import NavbarTopDropDownMenus from './NavbarTopDropDownMenus';
const NavbarVertical = ({ navbarStyle }) => {
const navBarRef = useRef(null);

View File

@ -1,5 +1,5 @@
import PropTypes from 'prop-types';
import React, { useContext, useEffect, useState } from 'react';
import React, { Fragment, useContext, useEffect, useState } from 'react';
import { NavLink, withRouter } from 'react-router-dom';
import { Collapse, Nav, NavItem, NavLink as BootstrapNavLink } from 'reactstrap';
import AppContext from '../../context/Context';
@ -8,6 +8,7 @@ import NavbarVerticalMenuItem from './NavbarVerticalMenuItem';
const NavbarVerticalMenu = ({ routes, location }) => {
const [openedIndex, setOpenedIndex] = useState(null);
const { setShowBurgerMenu } = useContext(AppContext);
useEffect(() => {
let openedDropdown = null;
routes.forEach((route, index) => {
@ -23,19 +24,33 @@ const NavbarVerticalMenu = ({ routes, location }) => {
return setOpenedIndex(openedIndex === index ? null : index);
};
const getHr = name => {
if (name === 'Widgets' || name === 'Documentation') {
return (
<div className="navbar-vertical-divider">
<hr className="navbar-vertical-hr my-2" />
</div>
);
}
};
return routes.map((route, index) => {
if (!route.children) {
return (
<NavItem key={index}>
<Fragment key={index}>
{getHr(route.name)}
<NavItem>
<NavLink className="nav-link" {...route} onClick={() => setShowBurgerMenu(false)}>
<NavbarVerticalMenuItem route={route} />
</NavLink>
</NavItem>
</Fragment>
);
}
return (
<NavItem key={index}>
<Fragment key={index}>
{getHr(route.name)}
<NavItem>
<BootstrapNavLink
onClick={e => toggleOpened(e, index)}
className="dropdown-indicator cursor-pointer"
@ -49,6 +64,7 @@ const NavbarVerticalMenu = ({ routes, location }) => {
</Nav>
</Collapse>
</NavItem>
</Fragment>
);
});
};

View File

@ -7,16 +7,18 @@ import CartNotification from './CartNotification';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { Link } from 'react-router-dom';
import AppContext from '../../context/Context';
import classNames from 'classnames';
import { navbarBreakPoint } from '../../config';
const TopNavRightSideNavItem = () => {
const { isTopNav } = useContext(AppContext);
const { isTopNav, isCombo } = useContext(AppContext);
return (
<Nav navbar className="navbar-nav-icons ml-auto flex-row align-items-center">
<NavItem>
<SettingsAnimatedIcon />
</NavItem>
{isTopNav && (
<NavItem className={`p-2 px-lg-0 cursor-pointer d-none d-sm-block`}>
{/* {(isCombo || isTopNav) && (
<NavItem className={classNames(`p-2 px-lg-0 cursor-pointer`, { [`d-${navbarBreakPoint}-none`]: isCombo })}>
<NavLink tag={Link} to="/changelog" id="changelog">
<FontAwesomeIcon icon="code-branch" transform="right-6 grow-4" />
</NavLink>
@ -24,8 +26,8 @@ const TopNavRightSideNavItem = () => {
Changelog
</UncontrolledTooltip>
</NavItem>
)}
<CartNotification />
)} */}
{/* <CartNotification /> */}
<NotificationDropdown />
<ProfileDropdown />
</Nav>

View File

@ -0,0 +1,57 @@
import React from 'react';
import FullCalendar from '@fullcalendar/react';
import dayGridPlugin from '@fullcalendar/daygrid';
import timeGridPlugin from '@fullcalendar/timegrid';
import PageHeader from '../common/PageHeader';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { Button, Card, CardBody, Row, Col } from 'reactstrap';
import FalconCardHeader from '../common/FalconCardHeader';
import FalconEditor from '../common/FalconEditor';
const calenderCode = `function fullCalendarExample() {
return (
<FullCalendar
plugins={[ dayGridPlugin,timeGridPlugin ]}
initialView="dayGridMonth"
headerToolbar={ {
left: 'prev,next today',
center: 'title',
right: 'dayGridMonth,timeGridWeek,timeGridDay'
}}
events= 'https://fullcalendar.io/demo-events.json'
/>
);
}`;
const CalendarExample = () => {
return (
<>
<PageHeader
title="Full Calendar"
description="FullCalendar seamlessly integrates with the React JavaScript framework. It provides a component that exactly matches the functionality of FullCalendars standard API."
className="mb-3"
>
<Button tag="a" href="https://fullcalendar.io/" target="_blank" color="link" size="sm" className="pl-0">
FullCalendar Documentation
<FontAwesomeIcon icon="chevron-right" className="ml-1 fs--2" />
</Button>
</PageHeader>
<Row>
<Col>
<Card>
<FalconCardHeader title="FullCalendar example" />
<CardBody>
<FalconEditor
code={calenderCode}
scope={{ FullCalendar, dayGridPlugin, timeGridPlugin }}
language="jsx"
/>
</CardBody>
</Card>
</Col>
</Row>
</>
);
};
export default CalendarExample;

View File

@ -0,0 +1,130 @@
// let todayStr = new Date().toISOString().replace(/T.*$/, '');
// var options = { month: 'long' };
// let currentMonthName = new Intl.DateTimeFormat('en-US', options).format(todayStr);
import * as uuid from 'uuid/v4';
const today = new Date()
.getDate()
.toString()
.padStart(2, '0');
let currentMonth = (new Date().getMonth() + 1).toString().padStart(2, '0');
const nextMonth = (currentMonth + 1).toString().padStart(2, '0');
const prevMonth = (currentMonth - 1).toString().padStart(2, '0');
const currentYear = new Date().getUTCFullYear();
const events = [
{
id: uuid(),
title: 'Boot Camp',
start: `${currentYear}-${currentMonth}-01 10:00:00`,
end: `${currentYear}-${currentMonth}-03 16:00:00`,
description:
"Boston Harbor Now in partnership with the Friends of Christopher Columbus Park, the Wharf District Council and the City of Boston is proud to announce the New Year's Eve Midnight Harbor Fireworks! This beloved nearly 40-year old tradition is made possible by the generous support of local waterfront organizations and businesses and the support of the City of Boston and the Office of Mayor Marty Walsh.",
className: 'bg-soft-success',
location: 'Boston Harborage, Christopher Columbus Park, </br> Boston, MA 02109, United States',
organizer: 'Boston Harbor Now'
},
{
id: uuid(),
title: `Crain's New York Business `,
start: `${currentYear}-${currentMonth}-11`,
description: `Crain's 2020 Hall of Fame. Sponsored Content By Crain's Content Studio. Crain's Content Studio Presents: New Jersey: Perfect for Business. Crain's Business Forum: Letitia James, New York State Attorney General. Crain's NYC Summit: Examining racial disparities during the pandemic`,
className: 'bg-soft-primary'
},
{
id: uuid(),
title: 'Conference',
start: `${currentYear}-${currentMonth}-${today}`,
description:
'The Milken Institute Global Conference gathered the best minds in the world to tackle some of its most stubborn challenges. It was a unique experience in which individuals with the power to enact change connected with experts who are reinventing health, technology, philanthropy, industry, and media.',
className: 'bg-soft-success',
allDay: true,
schedules: [
{
id: uuid(),
title: 'Reporting',
start: `${currentYear}-${currentMonth}-${today} 11:00:00`,
description: 'Time to start the conference and will briefly describe all information about the event.',
className: 'event-bg-soft-success'
},
{
id: uuid(),
title: 'Lunch',
start: `${currentYear}-${currentMonth}-${today} 14:00:00`,
description: 'Lunch facility for all the attendance in the conference.',
className: 'event-bg-soft-success'
},
{
id: uuid(),
title: 'Contest',
start: `${currentYear}-${currentMonth}-${today} 16:00:00`,
description: 'The starting of the programming contest',
className: 'event-bg-soft-success'
},
{
id: uuid(),
title: 'Dinner',
start: `${currentYear}-${currentMonth}-${today} 22:00:00`,
description: 'Dinner facility for all the attendance in the conference',
className: 'event-bg-soft-success'
}
]
},
{
id: uuid(),
title: `ICT Expo ${currentYear} - Product Release`,
start: `${currentYear}-${currentMonth}-16 10:00:00`,
description: `ICT Expo ${currentYear} is the largest private-sector exposition aimed at showcasing IT and ITES products and services in Switzerland.`,
end: `${currentYear}-${currentMonth}-18 16:00:00`,
className: 'bg-soft-warning'
},
{
id: uuid(),
title: 'Meeting',
start: `${currentYear}-${currentMonth}-07 10:00:00`,
description: 'Discuss about the upcoming projects in current year and assign all tasks to the individuals'
},
{
id: uuid(),
title: 'Meeting',
start: `${currentYear}-${currentMonth}-14 10:00:00`,
description:
'PeaceX is an international peace and amity organisation that aims at casting a pall at the striking issues surmounting the development of peoples and is committed to impacting the lives of young people all over the world.'
},
{
id: uuid(),
title: 'Event With Url',
start: `${currentYear}-${currentMonth}-23`,
description: 'Will celebrate birthday party with my friends and family',
className: 'bg-soft-success',
url: 'http://google.com'
},
{
id: uuid(),
title: 'Meeting',
start: `${currentYear}-${currentMonth}-26`,
description: 'Sample example of a event with url. Click the event, will redirect to the given link.',
className: 'bg-soft-danger'
},
{
id: uuid(),
title: 'Birthday Party',
start: `${currentYear}-${nextMonth}-05`,
description:
'The Future of Zambia Top 30 Under 30 is an annual award, ranking scheme, and recognition platform for young Zambian achievers under the age of 30, who are building brands, creating jobs, changing the game, and transforming the country.',
className: 'bg-soft-primary'
},
{
id: uuid(),
title: 'Click for Google',
url: 'http://google.com/',
start: `${currentYear}-${prevMonth}-10`,
description:
'Applications are open for the New Media Writing Prize 2020. The New Media Writing Prize (NMWP) showcases exciting and inventive stories and poetry that integrate a variety of formats, platforms, and digital media.',
className: 'bg-soft-primary'
}
];
export default events;

View File

@ -1,158 +1,160 @@
import { library } from '@fortawesome/fontawesome-svg-core';
import {
faChartPie,
faCopy,
faSearch,
faHome,
faBell,
faPlay,
faChevronRight,
faChevronLeft,
faChevronUp,
faChevronDown,
faExchangeAlt,
faAngleRight,
faEllipsisH,
faCrown,
faListAlt,
faCheck,
faBan,
faStream,
faArrowsAltV,
faSort,
faSortAlphaDown,
faSortAlphaUp,
faSortNumericDown,
faSortNumericUp,
faSortAmountDown,
faSortAmountUp,
faCheckCircle,
faUserCircle,
faQuestionCircle,
faLock,
faCircle,
faHeart,
faShareAlt,
faCaretRight,
faArrowDown,
faArrowUp,
faPrint,
faDollarSign,
faLink,
faPlus,
faMinus,
faUser,
faPencilAlt,
faCamera,
faTimesCircle,
faSignInAlt,
faBook,
faPuzzlePiece,
faTrash,
faAlignLeft,
faAlignRight,
faPlug,
faTimes,
faFilter,
faExternalLinkAlt,
faCartPlus,
faShoppingCart,
faStar,
faStarHalfAlt,
faArrowLeft,
faArrowRight,
faArchive,
faEnvelope,
faClock,
faReply,
faLocationArrow,
faCog,
faPaperclip,
faImage,
faEllipsisV,
faEnvelopeOpen,
faRedo,
faSlidersH,
faTrashAlt,
faFileArchive,
faFilePdf,
faFileAlt,
faEye,
faCaretUp,
faCaretDown,
faCodeBranch,
faExclamationTriangle,
faListUl,
faTh,
faGift,
faUsers,
faGlobeAmericas,
faPlusSquare,
faUserPlus,
faCircleNotch,
faExclamation,
faThumbsUp,
faComments,
faPhone,
faInfo,
faVideo,
faPalette,
faEdit,
faShare,
faCheckSquare,
faTools,
faCheckDouble,
faSmileBeam,
faPoll,
faPercentage,
faIcons,
faList,
faUserFriends,
faExclamationCircle,
faFolderPlus,
faTag,
faAt
} from '@fortawesome/free-solid-svg-icons';
import {
faFacebook,
faFacebookSquare,
faGulp,
faNodeJs,
faSass,
faFacebookF,
faTwitter,
faFacebookSquare,
faGooglePlusG,
faGulp,
faHotjar,
faLinkedinIn,
faMediumM,
faHotjar,
faYoutube,
faTrello
faNodeJs,
faSass,
faTrello,
faTwitter,
faYoutube
} from '@fortawesome/free-brands-svg-icons';
import {
faCircle as farCircle,
faClock as farClock,
faComment as farComment,
faCopy as farCopy,
faDizzy as farDizzy,
faFile as farFile,
faFileArchive as farFileArchive,
faFileAudio as farFileAudio,
faFileCode as farFileCode,
faFileImage as farFileImage,
faFilePdf as farFilePdf,
faFileVideo as farFileVideo,
faHeart as farHeart,
faImage as farImage,
faLaughBeam as farLaughBeam,
faLightbulb as farLightbulb,
faObjectUngroup as farObjectUngroup,
faPaperPlane as farPaperPlane,
faStar as farStar,
faImage as farImage,
faFileArchive as farFileArchive,
faFilePdf as farFilePdf,
faFile as farFile,
faFileVideo as farFileVideo,
faFileAudio as farFileAudio,
faFileImage as farFileImage,
faFileCode as farFileCode,
faClock as farClock,
faQuestionCircle as farQuestionCircle,
faDizzy as farDizzy,
faLaughBeam as farLaughBeam,
faSmileBeam as farSmileBeam,
faCircle as farCircle,
faCopy as farCopy,
faComment as farComment
faStar as farStar
} from '@fortawesome/free-regular-svg-icons';
import {
faAlignLeft,
faAlignRight,
faAngleRight,
faArchive,
faArrowDown,
faArrowLeft,
faArrowRight,
faArrowsAltV,
faArrowUp,
faAt,
faBan,
faBell,
faBook,
faCalendarAlt,
faCalendarCheck,
faCamera,
faCaretDown,
faCaretRight,
faCaretUp,
faCartPlus,
faChartPie,
faCheck,
faCheckCircle,
faCheckDouble,
faCheckSquare,
faChevronDown,
faChevronLeft,
faChevronRight,
faChevronUp,
faCircle,
faCircleNotch,
faClock,
faCodeBranch,
faCog,
faComments,
faCopy,
faCrown,
faDollarSign,
faEdit,
faEllipsisH,
faEllipsisV,
faEnvelope,
faEnvelopeOpen,
faExchangeAlt,
faExclamation,
faExclamationCircle,
faExclamationTriangle,
faExternalLinkAlt,
faEye,
faFileAlt,
faFileArchive,
faFilePdf,
faFilter,
faFolderPlus,
faGift,
faGlobeAmericas,
faHeart,
faHome,
faIcons,
faImage,
faInfo,
faLink,
faList,
faListAlt,
faListUl,
faLocationArrow,
faLock,
faMinus,
faMapMarkerAlt,
faPalette,
faPaperclip,
faPencilAlt,
faPercentage,
faPhone,
faPlay,
faPlug,
faPlus,
faPlusSquare,
faPoll,
faPrint,
faPuzzlePiece,
faQuestionCircle,
faRedo,
faReply,
faSearch,
faShare,
faShareAlt,
faShoppingCart,
faSignInAlt,
faSlidersH,
faSmileBeam,
faSort,
faSortAlphaDown,
faSortAlphaUp,
faSortAmountDown,
faSortAmountUp,
faSortNumericDown,
faSortNumericUp,
faStar,
faStarHalfAlt,
faStream,
faTag,
faTh,
faThumbsUp,
faTimes,
faTimesCircle,
faTools,
faTrash,
faTrashAlt,
faUser,
faUserCircle,
faUserFriends,
faUserPlus,
faUsers,
faVideo,
faCross
} from '@fortawesome/free-solid-svg-icons';
library.add(
// Solid
@ -267,6 +269,10 @@ library.add(
faFolderPlus,
faTag,
faAt,
faCalendarAlt,
faCalendarCheck,
faMapMarkerAlt,
faCross,
// Brand
faFacebook,

View File

@ -1,51 +1,94 @@
import React from 'react';
import { Redirect, Route, Switch } from 'react-router-dom';
import Activity from '../components/page/Activity';
import Associations from '../components/page/Associations';
import Billing from '../components/page/Billing';
import CustomerDetails from '../components/page/CustomerDetails';
import EventDetail from '../components/page/EventDetail';
import EventCreate from '../components/page/EventCreate';
import Events from '../components/page/Events';
import Faq from '../components/page/Faq';
import Invoice from '../components/page/Invoice';
import InvitePeople from '../components/page/InvitePeople';
import Notifications from '../components/page/Notifications';
import People from '../components/page/People';
import Pricing from '../components/pricing/Pricing';
import PricingAlt from '../components/pricing/PricingAlt';
import Profile from '../components/profile/Profile';
import Settings from '../components/page/Settings';
import Starter from '../components/extra/Starter';
import GettingStarted from '../components/documentation/GettingStarted';
import Alerts from '../components/bootstrap-components/Alerts';
import FalconAccordions from '../components/bootstrap-components/FalconAccordions';
import Spinners from '../components/bootstrap-components/Spinners';
import Carousel from '../components/bootstrap-components/Carousel';
import Avatar from '../components/bootstrap-components/Avatar';
import Badges from '../components/bootstrap-components/Badges';
import Backgrounds from '../components/bootstrap-components/Backgrounds';
import Badges from '../components/bootstrap-components/Badges';
import Breadcrumbs from '../components/bootstrap-components/Breadcrumb';
import Buttons from '../components/bootstrap-components/Buttons';
import Cards from '../components/bootstrap-components/Cards';
import Carousel from '../components/bootstrap-components/Carousel';
import Collapses from '../components/bootstrap-components/Collapses';
import Combo from '../components/bootstrap-components/Combo';
import CookieNotice from '../components/bootstrap-components/CookieNotice';
import Dropdowns from '../components/bootstrap-components/Dropdowns';
import FalconAccordions from '../components/bootstrap-components/FalconAccordions';
import Forms from '../components/bootstrap-components/Forms';
import ListGroups from '../components/bootstrap-components/ListGroups';
import Modals from '../components/bootstrap-components/Modals';
import Navs from '../components/bootstrap-components/Navs';
import Navbars from '../components/bootstrap-components/Navbars';
import NavBarTop from '../components/bootstrap-components/NavBarTop';
import Navs from '../components/bootstrap-components/Navs';
import PageHeaders from '../components/bootstrap-components/PageHeaders';
import Paginations from '../components/bootstrap-components/Paginations';
import Popovers from '../components/bootstrap-components/Popovers';
import ProgressBar from '../components/bootstrap-components/ProgressBar';
import Sidepanel from '../components/bootstrap-components/Sidepanel';
import Spinners from '../components/bootstrap-components/Spinners';
import Tables from '../components/bootstrap-components/Tables';
import Tooltips from '../components/bootstrap-components/Tooltips';
import NavBarTop from '../components/bootstrap-components/NavBarTop';
import Combo from '../components/bootstrap-components/Combo';
import VerticalNavbar from '../components/bootstrap-components/VerticalNavbar';
import Sidepanel from '../components/bootstrap-components/Sidepanel';
import CookieNotice from '../components/bootstrap-components/CookieNotice';
import Calendar from '../components/calendar/Calendar';
import ChangeLog from '../components/changelog/ChangeLog';
import Chat from '../components/chat/Chat';
import GettingStarted from '../components/documentation/GettingStarted';
import Checkout from '../components/e-commerce/Checkout';
import Customers from '../components/e-commerce/Customers';
import FavouriteItems from '../components/e-commerce/FavouriteItems';
import OrderDetails from '../components/e-commerce/OrderDetails';
import Orders from '../components/e-commerce/Orders';
import ProductDetails from '../components/e-commerce/ProductDetails';
import Products from '../components/e-commerce/Products';
import ShoppingCart from '../components/e-commerce/ShoppingCart';
import Compose from '../components/email/Compose';
import EmailDetail from '../components/email/EmailDetail';
import Inbox from '../components/email/Inbox';
import InboxProvider from '../components/email/inbox/InboxProvider';
import Starter from '../components/extra/Starter';
import Feed from '../components/feed/Feed';
import Kanban from '../components/kanban/Kanban';
import Activity from '../components/page/Activity';
import Associations from '../components/page/Associations';
import Billing from '../components/page/Billing';
import CustomerDetails from '../components/page/CustomerDetails';
import EventCreate from '../components/page/EventCreate';
import EventDetail from '../components/page/EventDetail';
import Events from '../components/page/Events';
import Faq from '../components/page/Faq';
import InvitePeople from '../components/page/InvitePeople';
import Invoice from '../components/page/Invoice';
import Notifications from '../components/page/Notifications';
import People from '../components/page/People';
import Settings from '../components/page/Settings';
import BulkSelect from '../components/plugins/BulkSelect';
import CalendarExample from '../components/plugins/CalendarExample';
import Chart from '../components/plugins/Chart';
import CodeHighlightDoc from '../components/plugins/CodeHighlightDoc';
import CountUpExample from '../components/plugins/Countup';
import DatetimeExample from '../components/plugins/Datetime';
import Dropzone from '../components/plugins/Dropzone';
import EchartMap from '../components/plugins/EchartMap';
import Echarts from '../components/plugins/Echarts';
import EmojiMart from '../components/plugins/EmojiMart';
import FontAwesome from '../components/plugins/FontAwesome';
import GoogleMapExample from '../components/plugins/GoogleMap';
import ImageLightbox from '../components/plugins/ImageLightbox';
import Leaflet from '../components/plugins/Leaflet';
import Lottie from '../components/plugins/Lottie';
import Plyr from '../components/plugins/Plyr';
import ProgressBarJs from '../components/plugins/ProgressBarJs';
import QuillEditorExample from '../components/plugins/Quill';
import ReactBeautifulDnD from '../components/plugins/ReactBeautifulDnD';
import ReactBootstrapTable2 from '../components/plugins/ReactBootstrapTable2';
import ReactHookFrom from '../components/plugins/ReactHookFrom';
import Scrollbar from '../components/plugins/Scrollbar';
import Select from '../components/plugins/Select';
import SlickCarousel from '../components/plugins/SlickCarousel';
import Toastify from '../components/plugins/Toastify';
import Typed from '../components/plugins/Typed';
import Pricing from '../components/pricing/Pricing';
import PricingAlt from '../components/pricing/PricingAlt';
import Profile from '../components/profile/Profile';
import Borders from '../components/utilities/Borders';
import Clearfix from '../components/utilities/Clearfix';
import CloseIcon from '../components/utilities/CloseIcon';
@ -61,48 +104,7 @@ import StretchedLink from '../components/utilities/StretchedLink';
import Typography from '../components/utilities/Typography';
import VerticalAlign from '../components/utilities/VerticalAlign';
import Visibility from '../components/utilities/Visibility';
import Typed from '../components/plugins/Typed';
import ImageLightbox from '../components/plugins/ImageLightbox';
import GoogleMapExample from '../components/plugins/GoogleMap';
import Chart from '../components/plugins/Chart';
import CountUpExample from '../components/plugins/Countup';
import DatetimeExample from '../components/plugins/Datetime';
import FontAwesome from '../components/plugins/FontAwesome';
import Echarts from '../components/plugins/Echarts';
import Toastify from '../components/plugins/Toastify';
import Select from '../components/plugins/Select';
import SlickCarousel from '../components/plugins/SlickCarousel';
import ReactBootstrapTable2 from '../components/plugins/ReactBootstrapTable2';
import ReactBeautifulDnD from '../components/plugins/ReactBeautifulDnD';
import EmailDetail from '../components/email/EmailDetail';
import Inbox from '../components/email/Inbox';
import Compose from '../components/email/Compose';
import QuillEditorExample from '../components/plugins/Quill';
import BulkSelect from '../components/plugins/BulkSelect';
import ChangeLog from '../components/changelog/ChangeLog';
import ProgressBarJs from '../components/plugins/ProgressBarJs';
import Products from '../components/e-commerce/Products';
import ProductDetails from '../components/e-commerce/ProductDetails';
import ShoppingCart from '../components/e-commerce/ShoppingCart';
import FavouriteItems from '../components/e-commerce/FavouriteItems';
import Orders from '../components/e-commerce/Orders';
import OrderDetails from '../components/e-commerce/OrderDetails';
import Customers from '../components/e-commerce/Customers';
import Checkout from '../components/e-commerce/Checkout';
import Feed from '../components/feed/Feed';
import Plyr from '../components/plugins/Plyr';
import Scrollbar from '../components/plugins/Scrollbar';
import Leaflet from '../components/plugins/Leaflet';
import EchartMap from '../components/plugins/EchartMap';
import InboxProvider from '../components/email/inbox/InboxProvider';
import ReactHookFrom from '../components/plugins/ReactHookFrom';
import Lottie from '../components/plugins/Lottie';
import Dropzone from '../components/plugins/Dropzone';
import CodeHighlightDoc from '../components/plugins/CodeHighlightDoc';
import EmojiMart from '../components/plugins/EmojiMart';
import Chat from '../components/chat/Chat';
import Widgets from '../components/widgets/Widgets';
import Kanban from '../components/kanban/Kanban';
const InboxRoutes = ({ match: { url } }) => (
<InboxProvider>
@ -157,6 +159,8 @@ const DashboardRoutes = () => (
<Route path="/pages/starter" exact component={Starter} />
{/*chat*/}
<Route path="/chat" exact component={Chat} />
{/*calendar*/}
<Route path="/calendar" exact component={Calendar} />
{/*kanban*/}
<Route path="/kanban" exact component={Kanban} />
{/*E commerce*/}
@ -222,6 +226,7 @@ const DashboardRoutes = () => (
<Route path="/utilities/visibility" exact component={Visibility} />
{/*Plugins*/}
<Route path="/plugins/calendar-example" exact component={CalendarExample} />
<Route path="/plugins/bulk-select" exact component={BulkSelect} />
<Route path="/plugins/typed" exact component={Typed} />
<Route path="/plugins/image-lightbox" exact component={ImageLightbox} />