From e13e630cd6e4fc0b1ff92098a28a770794c7bb9a Mon Sep 17 00:00:00 2001
From: gabrhr <73925454+gabrhr@users.noreply.github.com>
Date: Wed, 20 Apr 2022 10:19:29 -0500
Subject: =?UTF-8?q?A=C3=B1adir=20plantilla?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Base para front
---
front/odiparpack/app/containers/.DS_Store | Bin 0 -> 10244 bytes
front/odiparpack/app/containers/App/Application.js | 131 +++++++
front/odiparpack/app/containers/App/Auth.js | 28 ++
.../odiparpack/app/containers/App/ThemeWrapper.js | 111 ++++++
front/odiparpack/app/containers/App/index.js | 23 ++
.../odiparpack/app/containers/Charts/AreaCharts.js | 63 ++++
.../odiparpack/app/containers/Charts/BarCharts.js | 77 ++++
.../app/containers/Charts/CompossedCharts.js | 56 +++
.../odiparpack/app/containers/Charts/LineCharts.js | 70 ++++
.../odiparpack/app/containers/Charts/PieCharts.js | 49 +++
.../app/containers/Charts/RadarCharts.js | 42 +++
.../app/containers/Charts/ResponsiveCharts.js | 63 ++++
.../app/containers/Charts/ScatterCharts.js | 63 ++++
.../Charts/demos/AreaNegativePositive.js | 62 +++
.../app/containers/Charts/demos/AreaPercent.js | 79 ++++
.../app/containers/Charts/demos/AreaResponsive.js | 67 ++++
.../app/containers/Charts/demos/AreaSimple.js | 42 +++
.../app/containers/Charts/demos/AreaStacked.js | 49 +++
.../app/containers/Charts/demos/BarCustom.js | 80 ++++
.../app/containers/Charts/demos/BarCustomLabel.js | 84 +++++
.../app/containers/Charts/demos/BarMix.js | 48 +++
.../containers/Charts/demos/BarPositiveNegative.js | 47 +++
.../app/containers/Charts/demos/BarResponsive.js | 64 ++++
.../app/containers/Charts/demos/BarSimple.js | 45 +++
.../app/containers/Charts/demos/BarStacked.js | 45 +++
.../Charts/demos/CompossedLineBarArea.js | 51 +++
.../containers/Charts/demos/CompossedResponsive.js | 69 ++++
.../containers/Charts/demos/CompossedSameData.js | 46 +++
.../containers/Charts/demos/CompossedVertical.js | 52 +++
.../app/containers/Charts/demos/DoubleRadar.js | 35 ++
.../app/containers/Charts/demos/LineCustomDot.js | 78 ++++
.../app/containers/Charts/demos/LineCustomLabel.js | 74 ++++
.../app/containers/Charts/demos/LineResponsive.js | 56 +++
.../app/containers/Charts/demos/LineSimple.js | 37 ++
.../app/containers/Charts/demos/LineVertical.js | 46 +++
.../app/containers/Charts/demos/PieCustomLabel.js | 83 ++++
.../app/containers/Charts/demos/PieCustomShape.js | 143 +++++++
.../app/containers/Charts/demos/PieSimple.js | 36 ++
.../app/containers/Charts/demos/RadarSimple.js | 30 ++
.../app/containers/Charts/demos/ScatterCustom.js | 46 +++
.../app/containers/Charts/demos/ScatterJoinLine.js | 46 +++
.../app/containers/Charts/demos/ScatterMultiple.js | 46 +++
.../containers/Charts/demos/ScatterResponsive.js | 64 ++++
.../app/containers/Charts/demos/ScatterSimple.js | 40 ++
.../app/containers/Charts/demos/index.js | 31 ++
.../app/containers/Charts/demos/sampleData.js | 262 +++++++++++++
.../app/containers/Dashboard/Dashboard.js | 99 +++++
.../app/containers/Dashboard/DashboardV2.js | 79 ++++
.../app/containers/Dashboard/dashboard-jss.js | 30 ++
.../app/containers/Forms/Autocomplete.js | 91 +++++
front/odiparpack/app/containers/Forms/Buttons.js | 58 +++
.../app/containers/Forms/CheckboxRadio.js | 46 +++
.../app/containers/Forms/DateTimePicker.js | 52 +++
front/odiparpack/app/containers/Forms/Rating.js | 46 +++
front/odiparpack/app/containers/Forms/ReduxForm.js | 51 +++
front/odiparpack/app/containers/Forms/Selectbox.js | 58 +++
.../odiparpack/app/containers/Forms/SliderRange.js | 46 +++
front/odiparpack/app/containers/Forms/Switches.js | 40 ++
.../odiparpack/app/containers/Forms/TextEditor.js | 40 ++
front/odiparpack/app/containers/Forms/Textbox.js | 58 +++
front/odiparpack/app/containers/Forms/Upload.js | 52 +++
.../app/containers/Forms/demos/AutoSuggest.js | 184 +++++++++
.../app/containers/Forms/demos/Checkboxes.js | 242 ++++++++++++
.../app/containers/Forms/demos/ComplexButtons.js | 154 ++++++++
.../containers/Forms/demos/ControlledSelectbox.js | 200 ++++++++++
.../app/containers/Forms/demos/CustomButtons.js | 257 +++++++++++++
.../app/containers/Forms/demos/DateInput.js | 193 ++++++++++
.../app/containers/Forms/demos/DateTimeInput.js | 123 ++++++
.../app/containers/Forms/demos/FloatingButtons.js | 185 +++++++++
.../app/containers/Forms/demos/FormattedInputs.js | 109 ++++++
.../app/containers/Forms/demos/HighlightSuggest.js | 198 ++++++++++
.../app/containers/Forms/demos/InputAdornments.js | 221 +++++++++++
.../containers/Forms/demos/MultipleSelectbox.js | 165 ++++++++
.../app/containers/Forms/demos/NativeSelectbox.js | 153 ++++++++
.../app/containers/Forms/demos/RadioButton.js | 212 +++++++++++
.../app/containers/Forms/demos/RangeInput.js | 92 +++++
.../app/containers/Forms/demos/RatingCustom.js | 176 +++++++++
.../app/containers/Forms/demos/RatingNormal.js | 92 +++++
.../app/containers/Forms/demos/ReduxFormDemo.js | 229 +++++++++++
.../containers/Forms/demos/SelectSuggestionTags.js | 379 +++++++++++++++++++
.../containers/Forms/demos/SelectSuggestions.js | 378 +++++++++++++++++++
.../app/containers/Forms/demos/SimpleSelectbox.js | 180 +++++++++
.../app/containers/Forms/demos/SliderInput.js | 104 +++++
.../app/containers/Forms/demos/StandardButtons.js | 223 +++++++++++
.../app/containers/Forms/demos/SwitchesInput.js | 210 +++++++++++
.../app/containers/Forms/demos/TagSuggestions.js | 249 ++++++++++++
.../app/containers/Forms/demos/TextFields.js | 124 ++++++
.../app/containers/Forms/demos/TextFieldsLayout.js | 174 +++++++++
.../app/containers/Forms/demos/TimeInput.js | 124 ++++++
.../app/containers/Forms/demos/UploadInputAll.js | 31 ++
.../app/containers/Forms/demos/UploadInputBtn.js | 32 ++
.../app/containers/Forms/demos/UploadInputImg.js | 32 ++
.../app/containers/Forms/demos/Wysiwyg.js | 91 +++++
.../odiparpack/app/containers/Forms/demos/index.js | 44 +++
.../app/containers/LanguageProvider/actions.js | 14 +
.../app/containers/LanguageProvider/constants.js | 8 +
.../app/containers/LanguageProvider/index.js | 51 +++
.../app/containers/LanguageProvider/reducer.js | 25 ++
.../app/containers/LanguageProvider/selectors.js | 16 +
.../odiparpack/app/containers/Layouts/AppLayout.js | 45 +++
front/odiparpack/app/containers/Layouts/Grid.js | 96 +++++
.../app/containers/Layouts/Responsive.js | 54 +++
.../app/containers/Layouts/demos/AutoLayout.js | 85 +++++
.../app/containers/Layouts/demos/Breakpoint.js | 115 ++++++
.../app/containers/Layouts/demos/BreakpointGrid.js | 60 +++
.../app/containers/Layouts/demos/Centered.js | 54 +++
.../app/containers/Layouts/demos/FullHeader.js | 153 ++++++++
.../app/containers/Layouts/demos/FullWidth.js | 54 +++
.../app/containers/Layouts/demos/GridLayout.js | 78 ++++
.../app/containers/Layouts/demos/Interactive.js | 138 +++++++
.../app/containers/Layouts/demos/Limitation.js | 68 ++++
.../app/containers/Layouts/demos/MediaQueries.js | 41 ++
.../app/containers/Layouts/demos/SidebarLayout.js | 169 +++++++++
.../containers/Layouts/demos/SidebarLayoutRight.js | 175 +++++++++
.../app/containers/Layouts/demos/WIthWIdth.js | 26 ++
.../app/containers/Layouts/demos/breakpoint.md | 6 +
.../app/containers/Layouts/demos/index.js | 13 +
.../app/containers/Layouts/demos/menuData.js | 64 ++++
front/odiparpack/app/containers/Maps/Info.js | 18 +
.../odiparpack/app/containers/Maps/MapDirection.js | 33 ++
front/odiparpack/app/containers/Maps/MapMarker.js | 38 ++
front/odiparpack/app/containers/Maps/SearchMap.js | 33 ++
.../app/containers/Maps/StreetViewMap.js | 33 ++
.../app/containers/Maps/TrafficIndicator.js | 33 ++
.../app/containers/Maps/demos/BasicMarker.js | 38 ++
.../app/containers/Maps/demos/Direction.js | 56 +++
.../app/containers/Maps/demos/PopoverMarker.js | 55 +++
.../app/containers/Maps/demos/SearchLocation.js | 116 ++++++
.../app/containers/Maps/demos/StreetView.js | 62 +++
.../app/containers/Maps/demos/Traffic.js | 37 ++
.../odiparpack/app/containers/Maps/demos/index.js | 6 +
.../odiparpack/app/containers/NotFound/NotFound.js | 33 ++
front/odiparpack/app/containers/Pages/.DS_Store | Bin 0 -> 6148 bytes
.../app/containers/Pages/BlankPage/index.js | 28 ++
.../app/containers/Pages/Calendar/index.js | 137 +++++++
.../odiparpack/app/containers/Pages/Chat/index.js | 123 ++++++
.../app/containers/Pages/Contact/index.js | 166 ++++++++
.../app/containers/Pages/Ecommerce/index.js | 117 ++++++
.../odiparpack/app/containers/Pages/Email/index.js | 210 +++++++++++
.../odiparpack/app/containers/Pages/Error/index.js | 33 ++
.../containers/Pages/HelpSupport/ContactForm.js | 115 ++++++
.../app/containers/Pages/HelpSupport/Qna.js | 141 +++++++
.../Pages/HelpSupport/helpSupport-jss.js | 49 +++
.../app/containers/Pages/HelpSupport/index.js | 58 +++
.../app/containers/Pages/Maintenance/index.js | 88 +++++
.../app/containers/Pages/Photos/index.js | 27 ++
.../containers/Pages/Settings/DetailSettings.js | 203 ++++++++++
.../app/containers/Pages/Settings/index.js | 117 ++++++
.../app/containers/Pages/Settings/settings-jss.js | 87 +++++
.../app/containers/Pages/SocialMedia/index.js | 110 ++++++
.../containers/Pages/Standalone/LoginDedicated.js | 33 ++
.../Pages/Standalone/NotFoundDedicated.js | 24 ++
.../app/containers/Pages/UserProfile/index.js | 131 +++++++
.../app/containers/Pages/Users/LockScreen.js | 55 +++
.../odiparpack/app/containers/Pages/Users/Login.js | 85 +++++
.../app/containers/Pages/Users/Register.js | 78 ++++
.../app/containers/Pages/Users/ResetPassword.js | 54 +++
front/odiparpack/app/containers/Parent/index.js | 72 ++++
.../app/containers/Tables/AdvancedTable.js | 46 +++
.../odiparpack/app/containers/Tables/BasicTable.js | 110 ++++++
.../odiparpack/app/containers/Tables/CrudTable.js | 57 +++
.../app/containers/Tables/TablePlayground.js | 419 +++++++++++++++++++++
.../odiparpack/app/containers/Tables/TreeTable.js | 60 +++
.../app/containers/Tables/demos/AdvFilter.js | 64 ++++
.../app/containers/Tables/demos/AdvTableDemo.js | 101 +++++
.../app/containers/Tables/demos/BorderedTable.js | 91 +++++
.../app/containers/Tables/demos/CrudTableDemo.js | 220 +++++++++++
.../app/containers/Tables/demos/CrudTbFormDemo.js | 230 +++++++++++
.../app/containers/Tables/demos/EmptyTable.js | 48 +++
.../app/containers/Tables/demos/HoverTable.js | 91 +++++
.../app/containers/Tables/demos/SimpleTable.js | 88 +++++
.../app/containers/Tables/demos/StatusColorRow.js | 121 ++++++
.../app/containers/Tables/demos/StatusLabel.js | 112 ++++++
.../app/containers/Tables/demos/StrippedTable.js | 91 +++++
.../app/containers/Tables/demos/TrackingTable.js | 124 ++++++
.../app/containers/Tables/demos/TreeTableDemo.js | 68 ++++
.../containers/Tables/demos/TreeTableDemoIcon.js | 68 ++++
.../app/containers/Tables/demos/dataTreeTable.js | 128 +++++++
.../app/containers/Tables/demos/index.js | 14 +
.../app/containers/Tables/demos/sampleData.js | 124 ++++++
.../app/containers/Templates/Dashboard.js | 114 ++++++
front/odiparpack/app/containers/Templates/Outer.js | 34 ++
.../app/containers/Templates/appStyles-jss.js | 144 +++++++
.../app/containers/UiElements/Accordion.js | 45 +++
.../app/containers/UiElements/Avatars.js | 39 ++
.../odiparpack/app/containers/UiElements/Badges.js | 39 ++
.../app/containers/UiElements/Breadcrumbs.js | 39 ++
.../odiparpack/app/containers/UiElements/Cards.js | 63 ++++
.../app/containers/UiElements/DialogModal.js | 97 +++++
.../app/containers/UiElements/Dividers.js | 39 ++
.../app/containers/UiElements/DrawerMenu.js | 104 +++++
.../UiElements/IconGallery/DetailIcon.js | 149 ++++++++
.../UiElements/IconGallery/SearchIcons.js | 54 +++
.../odiparpack/app/containers/UiElements/Icons.js | 158 ++++++++
.../app/containers/UiElements/ImageGrid.js | 51 +++
front/odiparpack/app/containers/UiElements/List.js | 63 ++++
.../app/containers/UiElements/Notification.js | 56 +++
.../app/containers/UiElements/Paginations.js | 45 +++
.../app/containers/UiElements/PopoverTooltip.js | 95 +++++
.../app/containers/UiElements/Progress.js | 126 +++++++
.../app/containers/UiElements/SliderCarousel.js | 77 ++++
.../app/containers/UiElements/Steppers.js | 70 ++++
front/odiparpack/app/containers/UiElements/Tabs.js | 120 ++++++
front/odiparpack/app/containers/UiElements/Tags.js | 39 ++
.../app/containers/UiElements/Typography.js | 92 +++++
.../demos/Accordion/AdvancedAccordion.js | 97 +++++
.../demos/Accordion/ControlledAccordion.js | 100 +++++
.../UiElements/demos/Accordion/SimpleAccordion.js | 57 +++
.../UiElements/demos/Avatars/AvatarsDemo.js | 112 ++++++
.../UiElements/demos/Avatars/AvatarsPractice.js | 212 +++++++++++
.../UiElements/demos/Badges/CommonBadges.js | 121 ++++++
.../UiElements/demos/Badges/VariantBadges.js | 117 ++++++
.../demos/Breadcrumbs/ClassicBreadcrumbs.js | 83 ++++
.../demos/Breadcrumbs/PaperBreadcrumbs.js | 97 +++++
.../UiElements/demos/Cards/ControlCards.js | 204 ++++++++++
.../UiElements/demos/Cards/EcommerceCards.js | 92 +++++
.../UiElements/demos/Cards/PaperSheet.js | 34 ++
.../UiElements/demos/Cards/SocialCards.js | 75 ++++
.../UiElements/demos/Cards/StandardCards.js | 120 ++++++
.../UiElements/demos/DialogModal/AlertDialog.js | 127 +++++++
.../demos/DialogModal/ConfirmationDialog.js | 111 ++++++
.../UiElements/demos/DialogModal/FormDialog.js | 65 ++++
.../demos/DialogModal/FullScreenDialog.js | 134 +++++++
.../UiElements/demos/DialogModal/ImagePopup.js | 51 +++
.../UiElements/demos/DialogModal/ModalDemo.js | 73 ++++
.../UiElements/demos/DialogModal/ScrollDialog.js | 93 +++++
.../UiElements/demos/DialogModal/SelectDialog.js | 120 ++++++
.../demos/DialogModal/SelectRadioDialog.js | 68 ++++
.../UiElements/demos/Dividers/CommonDividers.js | 29 ++
.../UiElements/demos/Dividers/SpecialDividers.js | 23 ++
.../UiElements/demos/DrawerMenu/BasicMenu.js | 74 ++++
.../UiElements/demos/DrawerMenu/DropdownMenu.js | 148 ++++++++
.../UiElements/demos/DrawerMenu/MenuTransition.js | 108 ++++++
.../UiElements/demos/DrawerMenu/MiniDrawer.js | 235 ++++++++++++
.../UiElements/demos/DrawerMenu/PermanentDrawer.js | 126 +++++++
.../demos/DrawerMenu/PersistentDrawer.js | 228 +++++++++++
.../UiElements/demos/DrawerMenu/StyledMenu.js | 60 +++
.../UiElements/demos/DrawerMenu/SwipeDrawer.js | 124 ++++++
.../UiElements/demos/DrawerMenu/TemporaryDrawer.js | 109 ++++++
.../UiElements/demos/DrawerMenu/menuData.js | 64 ++++
.../UiElements/demos/ImageGrid/AdvancedGridList.js | 85 +++++
.../UiElements/demos/ImageGrid/ImageGridList.js | 66 ++++
.../demos/ImageGrid/SingleLineGridList.js | 83 ++++
.../UiElements/demos/ImageGrid/TitlebarGridList.js | 89 +++++
.../containers/UiElements/demos/List/ListBasic.js | 116 ++++++
.../UiElements/demos/List/ListControl.js | 159 ++++++++
.../UiElements/demos/List/ListInteractive.js | 183 +++++++++
.../containers/UiElements/demos/List/ListMenu.js | 204 ++++++++++
.../containers/UiElements/demos/List/PinnedList.js | 62 +++
.../UiElements/demos/Notification/MobileNotif.js | 116 ++++++
.../UiElements/demos/Notification/SimpleNotif.js | 132 +++++++
.../UiElements/demos/Notification/StyledNotif.js | 198 ++++++++++
.../demos/Notification/TransitionNotif.js | 203 ++++++++++
.../demos/Pagination/GeneralPagination.js | 136 +++++++
.../UiElements/demos/Pagination/TbPagination.js | 110 ++++++
.../demos/Pagination/TbPaginationActions.js | 93 +++++
.../demos/Pagination/TbPaginationCustom.js | 115 ++++++
.../demos/PopoverTooltip/CustomizedTooltips.js | 125 ++++++
.../demos/PopoverTooltip/DelayTooltips.js | 12 +
.../demos/PopoverTooltip/PopoverPlayground.js | 340 +++++++++++++++++
.../demos/PopoverTooltip/PositionedTooltips.js | 83 ++++
.../demos/PopoverTooltip/SimplePopover.js | 79 ++++
.../demos/PopoverTooltip/SimpleTooltips.js | 116 ++++++
.../demos/PopoverTooltip/TransitionsTooltips.js | 20 +
.../demos/PopoverTooltip/TriggersTooltips.js | 61 +++
.../demos/Progress/CircularDeterminate.js | 69 ++++
.../demos/Progress/CircularIndeterminate.js | 29 ++
.../demos/Progress/CircularIntegration.js | 114 ++++++
.../UiElements/demos/Progress/CircularStatic.js | 29 ++
.../UiElements/demos/Progress/LinearBuffer.js | 56 +++
.../UiElements/demos/Progress/LinearDeterminate.js | 53 +++
.../demos/Progress/LinearIndeterminate.js | 27 ++
.../UiElements/demos/Progress/LinearQuery.js | 27 ++
.../UiElements/demos/Progress/LinearStatic.js | 27 ++
.../UiElements/demos/Progress/ProgressDelay.js | 105 ++++++
.../demos/SliderCaraousel/AnimatedSlider.js | 72 ++++
.../demos/SliderCaraousel/AutoplayCarousel.js | 52 +++
.../demos/SliderCaraousel/CustomCarousel.js | 93 +++++
.../demos/SliderCaraousel/MultipleCarousel.js | 48 +++
.../demos/SliderCaraousel/SingleCarousel.js | 80 ++++
.../demos/SliderCaraousel/ThumbnailCarousel.js | 90 +++++
.../demos/SliderCaraousel/VerticalCarousel.js | 48 +++
.../UiElements/demos/Steppers/HorizontalLinear.js | 196 ++++++++++
.../demos/Steppers/HorizontalNonLinear.js | 213 +++++++++++
.../UiElements/demos/Steppers/MobileSteppers.js | 116 ++++++
.../UiElements/demos/Steppers/StepperCarousel.js | 187 +++++++++
.../UiElements/demos/Steppers/StepperError.js | 178 +++++++++
.../UiElements/demos/Steppers/VerticalStepper.js | 120 ++++++
.../containers/UiElements/demos/Tabs/BottomNav.js | 82 ++++
.../UiElements/demos/Tabs/CenteredTabs.js | 46 +++
.../containers/UiElements/demos/Tabs/CustomTabs.js | 101 +++++
.../UiElements/demos/Tabs/DisabledTab.js | 31 ++
.../containers/UiElements/demos/Tabs/FixedTabs.js | 80 ++++
.../containers/UiElements/demos/Tabs/IconTabs.js | 61 +++
.../UiElements/demos/Tabs/LongTextTabs.js | 59 +++
.../UiElements/demos/Tabs/ScrollIconTabs.js | 82 ++++
.../containers/UiElements/demos/Tabs/ScrollTabs.js | 75 ++++
.../containers/UiElements/demos/Tabs/SimpleTabs.js | 59 +++
.../containers/UiElements/demos/Tags/ArrayTags.js | 78 ++++
.../containers/UiElements/demos/Tags/BasicTags.js | 72 ++++
.../UiElements/demos/Typography/AlignTypo.js | 46 +++
.../UiElements/demos/Typography/ColouredTypo.js | 35 ++
.../UiElements/demos/Typography/GeneralTypo.js | 139 +++++++
.../UiElements/demos/Typography/Heading.js | 56 +++
.../UiElements/demos/Typography/ListTypo.js | 71 ++++
.../UiElements/demos/Typography/QuotesDemo.js | 33 ++
.../app/containers/UiElements/demos/index.js | 117 ++++++
front/odiparpack/app/containers/pageListAsync.js | 324 ++++++++++++++++
308 files changed, 28585 insertions(+)
create mode 100644 front/odiparpack/app/containers/.DS_Store
create mode 100644 front/odiparpack/app/containers/App/Application.js
create mode 100644 front/odiparpack/app/containers/App/Auth.js
create mode 100644 front/odiparpack/app/containers/App/ThemeWrapper.js
create mode 100644 front/odiparpack/app/containers/App/index.js
create mode 100644 front/odiparpack/app/containers/Charts/AreaCharts.js
create mode 100644 front/odiparpack/app/containers/Charts/BarCharts.js
create mode 100644 front/odiparpack/app/containers/Charts/CompossedCharts.js
create mode 100644 front/odiparpack/app/containers/Charts/LineCharts.js
create mode 100644 front/odiparpack/app/containers/Charts/PieCharts.js
create mode 100644 front/odiparpack/app/containers/Charts/RadarCharts.js
create mode 100644 front/odiparpack/app/containers/Charts/ResponsiveCharts.js
create mode 100644 front/odiparpack/app/containers/Charts/ScatterCharts.js
create mode 100644 front/odiparpack/app/containers/Charts/demos/AreaNegativePositive.js
create mode 100644 front/odiparpack/app/containers/Charts/demos/AreaPercent.js
create mode 100644 front/odiparpack/app/containers/Charts/demos/AreaResponsive.js
create mode 100644 front/odiparpack/app/containers/Charts/demos/AreaSimple.js
create mode 100644 front/odiparpack/app/containers/Charts/demos/AreaStacked.js
create mode 100644 front/odiparpack/app/containers/Charts/demos/BarCustom.js
create mode 100644 front/odiparpack/app/containers/Charts/demos/BarCustomLabel.js
create mode 100644 front/odiparpack/app/containers/Charts/demos/BarMix.js
create mode 100644 front/odiparpack/app/containers/Charts/demos/BarPositiveNegative.js
create mode 100644 front/odiparpack/app/containers/Charts/demos/BarResponsive.js
create mode 100644 front/odiparpack/app/containers/Charts/demos/BarSimple.js
create mode 100644 front/odiparpack/app/containers/Charts/demos/BarStacked.js
create mode 100644 front/odiparpack/app/containers/Charts/demos/CompossedLineBarArea.js
create mode 100644 front/odiparpack/app/containers/Charts/demos/CompossedResponsive.js
create mode 100644 front/odiparpack/app/containers/Charts/demos/CompossedSameData.js
create mode 100644 front/odiparpack/app/containers/Charts/demos/CompossedVertical.js
create mode 100644 front/odiparpack/app/containers/Charts/demos/DoubleRadar.js
create mode 100644 front/odiparpack/app/containers/Charts/demos/LineCustomDot.js
create mode 100644 front/odiparpack/app/containers/Charts/demos/LineCustomLabel.js
create mode 100644 front/odiparpack/app/containers/Charts/demos/LineResponsive.js
create mode 100644 front/odiparpack/app/containers/Charts/demos/LineSimple.js
create mode 100644 front/odiparpack/app/containers/Charts/demos/LineVertical.js
create mode 100644 front/odiparpack/app/containers/Charts/demos/PieCustomLabel.js
create mode 100644 front/odiparpack/app/containers/Charts/demos/PieCustomShape.js
create mode 100644 front/odiparpack/app/containers/Charts/demos/PieSimple.js
create mode 100644 front/odiparpack/app/containers/Charts/demos/RadarSimple.js
create mode 100644 front/odiparpack/app/containers/Charts/demos/ScatterCustom.js
create mode 100644 front/odiparpack/app/containers/Charts/demos/ScatterJoinLine.js
create mode 100644 front/odiparpack/app/containers/Charts/demos/ScatterMultiple.js
create mode 100644 front/odiparpack/app/containers/Charts/demos/ScatterResponsive.js
create mode 100644 front/odiparpack/app/containers/Charts/demos/ScatterSimple.js
create mode 100644 front/odiparpack/app/containers/Charts/demos/index.js
create mode 100644 front/odiparpack/app/containers/Charts/demos/sampleData.js
create mode 100644 front/odiparpack/app/containers/Dashboard/Dashboard.js
create mode 100644 front/odiparpack/app/containers/Dashboard/DashboardV2.js
create mode 100644 front/odiparpack/app/containers/Dashboard/dashboard-jss.js
create mode 100644 front/odiparpack/app/containers/Forms/Autocomplete.js
create mode 100644 front/odiparpack/app/containers/Forms/Buttons.js
create mode 100644 front/odiparpack/app/containers/Forms/CheckboxRadio.js
create mode 100644 front/odiparpack/app/containers/Forms/DateTimePicker.js
create mode 100644 front/odiparpack/app/containers/Forms/Rating.js
create mode 100644 front/odiparpack/app/containers/Forms/ReduxForm.js
create mode 100644 front/odiparpack/app/containers/Forms/Selectbox.js
create mode 100644 front/odiparpack/app/containers/Forms/SliderRange.js
create mode 100644 front/odiparpack/app/containers/Forms/Switches.js
create mode 100644 front/odiparpack/app/containers/Forms/TextEditor.js
create mode 100644 front/odiparpack/app/containers/Forms/Textbox.js
create mode 100644 front/odiparpack/app/containers/Forms/Upload.js
create mode 100644 front/odiparpack/app/containers/Forms/demos/AutoSuggest.js
create mode 100644 front/odiparpack/app/containers/Forms/demos/Checkboxes.js
create mode 100644 front/odiparpack/app/containers/Forms/demos/ComplexButtons.js
create mode 100644 front/odiparpack/app/containers/Forms/demos/ControlledSelectbox.js
create mode 100644 front/odiparpack/app/containers/Forms/demos/CustomButtons.js
create mode 100644 front/odiparpack/app/containers/Forms/demos/DateInput.js
create mode 100644 front/odiparpack/app/containers/Forms/demos/DateTimeInput.js
create mode 100644 front/odiparpack/app/containers/Forms/demos/FloatingButtons.js
create mode 100644 front/odiparpack/app/containers/Forms/demos/FormattedInputs.js
create mode 100644 front/odiparpack/app/containers/Forms/demos/HighlightSuggest.js
create mode 100644 front/odiparpack/app/containers/Forms/demos/InputAdornments.js
create mode 100644 front/odiparpack/app/containers/Forms/demos/MultipleSelectbox.js
create mode 100644 front/odiparpack/app/containers/Forms/demos/NativeSelectbox.js
create mode 100644 front/odiparpack/app/containers/Forms/demos/RadioButton.js
create mode 100644 front/odiparpack/app/containers/Forms/demos/RangeInput.js
create mode 100644 front/odiparpack/app/containers/Forms/demos/RatingCustom.js
create mode 100644 front/odiparpack/app/containers/Forms/demos/RatingNormal.js
create mode 100644 front/odiparpack/app/containers/Forms/demos/ReduxFormDemo.js
create mode 100644 front/odiparpack/app/containers/Forms/demos/SelectSuggestionTags.js
create mode 100644 front/odiparpack/app/containers/Forms/demos/SelectSuggestions.js
create mode 100644 front/odiparpack/app/containers/Forms/demos/SimpleSelectbox.js
create mode 100644 front/odiparpack/app/containers/Forms/demos/SliderInput.js
create mode 100644 front/odiparpack/app/containers/Forms/demos/StandardButtons.js
create mode 100644 front/odiparpack/app/containers/Forms/demos/SwitchesInput.js
create mode 100644 front/odiparpack/app/containers/Forms/demos/TagSuggestions.js
create mode 100644 front/odiparpack/app/containers/Forms/demos/TextFields.js
create mode 100644 front/odiparpack/app/containers/Forms/demos/TextFieldsLayout.js
create mode 100644 front/odiparpack/app/containers/Forms/demos/TimeInput.js
create mode 100644 front/odiparpack/app/containers/Forms/demos/UploadInputAll.js
create mode 100644 front/odiparpack/app/containers/Forms/demos/UploadInputBtn.js
create mode 100644 front/odiparpack/app/containers/Forms/demos/UploadInputImg.js
create mode 100644 front/odiparpack/app/containers/Forms/demos/Wysiwyg.js
create mode 100644 front/odiparpack/app/containers/Forms/demos/index.js
create mode 100644 front/odiparpack/app/containers/LanguageProvider/actions.js
create mode 100644 front/odiparpack/app/containers/LanguageProvider/constants.js
create mode 100644 front/odiparpack/app/containers/LanguageProvider/index.js
create mode 100644 front/odiparpack/app/containers/LanguageProvider/reducer.js
create mode 100644 front/odiparpack/app/containers/LanguageProvider/selectors.js
create mode 100644 front/odiparpack/app/containers/Layouts/AppLayout.js
create mode 100644 front/odiparpack/app/containers/Layouts/Grid.js
create mode 100644 front/odiparpack/app/containers/Layouts/Responsive.js
create mode 100644 front/odiparpack/app/containers/Layouts/demos/AutoLayout.js
create mode 100644 front/odiparpack/app/containers/Layouts/demos/Breakpoint.js
create mode 100644 front/odiparpack/app/containers/Layouts/demos/BreakpointGrid.js
create mode 100644 front/odiparpack/app/containers/Layouts/demos/Centered.js
create mode 100644 front/odiparpack/app/containers/Layouts/demos/FullHeader.js
create mode 100644 front/odiparpack/app/containers/Layouts/demos/FullWidth.js
create mode 100644 front/odiparpack/app/containers/Layouts/demos/GridLayout.js
create mode 100644 front/odiparpack/app/containers/Layouts/demos/Interactive.js
create mode 100644 front/odiparpack/app/containers/Layouts/demos/Limitation.js
create mode 100644 front/odiparpack/app/containers/Layouts/demos/MediaQueries.js
create mode 100644 front/odiparpack/app/containers/Layouts/demos/SidebarLayout.js
create mode 100644 front/odiparpack/app/containers/Layouts/demos/SidebarLayoutRight.js
create mode 100644 front/odiparpack/app/containers/Layouts/demos/WIthWIdth.js
create mode 100644 front/odiparpack/app/containers/Layouts/demos/breakpoint.md
create mode 100644 front/odiparpack/app/containers/Layouts/demos/index.js
create mode 100644 front/odiparpack/app/containers/Layouts/demos/menuData.js
create mode 100644 front/odiparpack/app/containers/Maps/Info.js
create mode 100644 front/odiparpack/app/containers/Maps/MapDirection.js
create mode 100644 front/odiparpack/app/containers/Maps/MapMarker.js
create mode 100644 front/odiparpack/app/containers/Maps/SearchMap.js
create mode 100644 front/odiparpack/app/containers/Maps/StreetViewMap.js
create mode 100644 front/odiparpack/app/containers/Maps/TrafficIndicator.js
create mode 100644 front/odiparpack/app/containers/Maps/demos/BasicMarker.js
create mode 100644 front/odiparpack/app/containers/Maps/demos/Direction.js
create mode 100644 front/odiparpack/app/containers/Maps/demos/PopoverMarker.js
create mode 100644 front/odiparpack/app/containers/Maps/demos/SearchLocation.js
create mode 100644 front/odiparpack/app/containers/Maps/demos/StreetView.js
create mode 100644 front/odiparpack/app/containers/Maps/demos/Traffic.js
create mode 100644 front/odiparpack/app/containers/Maps/demos/index.js
create mode 100644 front/odiparpack/app/containers/NotFound/NotFound.js
create mode 100644 front/odiparpack/app/containers/Pages/.DS_Store
create mode 100644 front/odiparpack/app/containers/Pages/BlankPage/index.js
create mode 100644 front/odiparpack/app/containers/Pages/Calendar/index.js
create mode 100644 front/odiparpack/app/containers/Pages/Chat/index.js
create mode 100644 front/odiparpack/app/containers/Pages/Contact/index.js
create mode 100644 front/odiparpack/app/containers/Pages/Ecommerce/index.js
create mode 100644 front/odiparpack/app/containers/Pages/Email/index.js
create mode 100644 front/odiparpack/app/containers/Pages/Error/index.js
create mode 100644 front/odiparpack/app/containers/Pages/HelpSupport/ContactForm.js
create mode 100644 front/odiparpack/app/containers/Pages/HelpSupport/Qna.js
create mode 100644 front/odiparpack/app/containers/Pages/HelpSupport/helpSupport-jss.js
create mode 100644 front/odiparpack/app/containers/Pages/HelpSupport/index.js
create mode 100644 front/odiparpack/app/containers/Pages/Maintenance/index.js
create mode 100644 front/odiparpack/app/containers/Pages/Photos/index.js
create mode 100644 front/odiparpack/app/containers/Pages/Settings/DetailSettings.js
create mode 100644 front/odiparpack/app/containers/Pages/Settings/index.js
create mode 100644 front/odiparpack/app/containers/Pages/Settings/settings-jss.js
create mode 100644 front/odiparpack/app/containers/Pages/SocialMedia/index.js
create mode 100644 front/odiparpack/app/containers/Pages/Standalone/LoginDedicated.js
create mode 100644 front/odiparpack/app/containers/Pages/Standalone/NotFoundDedicated.js
create mode 100644 front/odiparpack/app/containers/Pages/UserProfile/index.js
create mode 100644 front/odiparpack/app/containers/Pages/Users/LockScreen.js
create mode 100644 front/odiparpack/app/containers/Pages/Users/Login.js
create mode 100644 front/odiparpack/app/containers/Pages/Users/Register.js
create mode 100644 front/odiparpack/app/containers/Pages/Users/ResetPassword.js
create mode 100644 front/odiparpack/app/containers/Parent/index.js
create mode 100644 front/odiparpack/app/containers/Tables/AdvancedTable.js
create mode 100644 front/odiparpack/app/containers/Tables/BasicTable.js
create mode 100644 front/odiparpack/app/containers/Tables/CrudTable.js
create mode 100644 front/odiparpack/app/containers/Tables/TablePlayground.js
create mode 100644 front/odiparpack/app/containers/Tables/TreeTable.js
create mode 100644 front/odiparpack/app/containers/Tables/demos/AdvFilter.js
create mode 100644 front/odiparpack/app/containers/Tables/demos/AdvTableDemo.js
create mode 100644 front/odiparpack/app/containers/Tables/demos/BorderedTable.js
create mode 100644 front/odiparpack/app/containers/Tables/demos/CrudTableDemo.js
create mode 100644 front/odiparpack/app/containers/Tables/demos/CrudTbFormDemo.js
create mode 100644 front/odiparpack/app/containers/Tables/demos/EmptyTable.js
create mode 100644 front/odiparpack/app/containers/Tables/demos/HoverTable.js
create mode 100644 front/odiparpack/app/containers/Tables/demos/SimpleTable.js
create mode 100644 front/odiparpack/app/containers/Tables/demos/StatusColorRow.js
create mode 100644 front/odiparpack/app/containers/Tables/demos/StatusLabel.js
create mode 100644 front/odiparpack/app/containers/Tables/demos/StrippedTable.js
create mode 100644 front/odiparpack/app/containers/Tables/demos/TrackingTable.js
create mode 100644 front/odiparpack/app/containers/Tables/demos/TreeTableDemo.js
create mode 100644 front/odiparpack/app/containers/Tables/demos/TreeTableDemoIcon.js
create mode 100644 front/odiparpack/app/containers/Tables/demos/dataTreeTable.js
create mode 100644 front/odiparpack/app/containers/Tables/demos/index.js
create mode 100644 front/odiparpack/app/containers/Tables/demos/sampleData.js
create mode 100644 front/odiparpack/app/containers/Templates/Dashboard.js
create mode 100644 front/odiparpack/app/containers/Templates/Outer.js
create mode 100644 front/odiparpack/app/containers/Templates/appStyles-jss.js
create mode 100644 front/odiparpack/app/containers/UiElements/Accordion.js
create mode 100644 front/odiparpack/app/containers/UiElements/Avatars.js
create mode 100644 front/odiparpack/app/containers/UiElements/Badges.js
create mode 100644 front/odiparpack/app/containers/UiElements/Breadcrumbs.js
create mode 100644 front/odiparpack/app/containers/UiElements/Cards.js
create mode 100644 front/odiparpack/app/containers/UiElements/DialogModal.js
create mode 100644 front/odiparpack/app/containers/UiElements/Dividers.js
create mode 100644 front/odiparpack/app/containers/UiElements/DrawerMenu.js
create mode 100644 front/odiparpack/app/containers/UiElements/IconGallery/DetailIcon.js
create mode 100644 front/odiparpack/app/containers/UiElements/IconGallery/SearchIcons.js
create mode 100644 front/odiparpack/app/containers/UiElements/Icons.js
create mode 100644 front/odiparpack/app/containers/UiElements/ImageGrid.js
create mode 100644 front/odiparpack/app/containers/UiElements/List.js
create mode 100644 front/odiparpack/app/containers/UiElements/Notification.js
create mode 100644 front/odiparpack/app/containers/UiElements/Paginations.js
create mode 100644 front/odiparpack/app/containers/UiElements/PopoverTooltip.js
create mode 100644 front/odiparpack/app/containers/UiElements/Progress.js
create mode 100644 front/odiparpack/app/containers/UiElements/SliderCarousel.js
create mode 100644 front/odiparpack/app/containers/UiElements/Steppers.js
create mode 100644 front/odiparpack/app/containers/UiElements/Tabs.js
create mode 100644 front/odiparpack/app/containers/UiElements/Tags.js
create mode 100644 front/odiparpack/app/containers/UiElements/Typography.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/Accordion/AdvancedAccordion.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/Accordion/ControlledAccordion.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/Accordion/SimpleAccordion.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/Avatars/AvatarsDemo.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/Avatars/AvatarsPractice.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/Badges/CommonBadges.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/Badges/VariantBadges.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/Breadcrumbs/ClassicBreadcrumbs.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/Breadcrumbs/PaperBreadcrumbs.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/Cards/ControlCards.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/Cards/EcommerceCards.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/Cards/PaperSheet.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/Cards/SocialCards.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/Cards/StandardCards.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/DialogModal/AlertDialog.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/DialogModal/ConfirmationDialog.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/DialogModal/FormDialog.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/DialogModal/FullScreenDialog.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/DialogModal/ImagePopup.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/DialogModal/ModalDemo.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/DialogModal/ScrollDialog.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/DialogModal/SelectDialog.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/DialogModal/SelectRadioDialog.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/Dividers/CommonDividers.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/Dividers/SpecialDividers.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/DrawerMenu/BasicMenu.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/DrawerMenu/DropdownMenu.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/DrawerMenu/MenuTransition.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/DrawerMenu/MiniDrawer.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/DrawerMenu/PermanentDrawer.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/DrawerMenu/PersistentDrawer.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/DrawerMenu/StyledMenu.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/DrawerMenu/SwipeDrawer.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/DrawerMenu/TemporaryDrawer.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/DrawerMenu/menuData.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/ImageGrid/AdvancedGridList.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/ImageGrid/ImageGridList.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/ImageGrid/SingleLineGridList.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/ImageGrid/TitlebarGridList.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/List/ListBasic.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/List/ListControl.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/List/ListInteractive.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/List/ListMenu.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/List/PinnedList.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/Notification/MobileNotif.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/Notification/SimpleNotif.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/Notification/StyledNotif.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/Notification/TransitionNotif.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/Pagination/GeneralPagination.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/Pagination/TbPagination.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/Pagination/TbPaginationActions.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/Pagination/TbPaginationCustom.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/PopoverTooltip/CustomizedTooltips.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/PopoverTooltip/DelayTooltips.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/PopoverTooltip/PopoverPlayground.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/PopoverTooltip/PositionedTooltips.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/PopoverTooltip/SimplePopover.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/PopoverTooltip/SimpleTooltips.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/PopoverTooltip/TransitionsTooltips.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/PopoverTooltip/TriggersTooltips.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/Progress/CircularDeterminate.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/Progress/CircularIndeterminate.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/Progress/CircularIntegration.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/Progress/CircularStatic.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/Progress/LinearBuffer.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/Progress/LinearDeterminate.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/Progress/LinearIndeterminate.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/Progress/LinearQuery.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/Progress/LinearStatic.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/Progress/ProgressDelay.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/SliderCaraousel/AnimatedSlider.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/SliderCaraousel/AutoplayCarousel.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/SliderCaraousel/CustomCarousel.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/SliderCaraousel/MultipleCarousel.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/SliderCaraousel/SingleCarousel.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/SliderCaraousel/ThumbnailCarousel.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/SliderCaraousel/VerticalCarousel.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/Steppers/HorizontalLinear.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/Steppers/HorizontalNonLinear.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/Steppers/MobileSteppers.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/Steppers/StepperCarousel.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/Steppers/StepperError.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/Steppers/VerticalStepper.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/Tabs/BottomNav.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/Tabs/CenteredTabs.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/Tabs/CustomTabs.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/Tabs/DisabledTab.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/Tabs/FixedTabs.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/Tabs/IconTabs.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/Tabs/LongTextTabs.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/Tabs/ScrollIconTabs.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/Tabs/ScrollTabs.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/Tabs/SimpleTabs.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/Tags/ArrayTags.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/Tags/BasicTags.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/Typography/AlignTypo.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/Typography/ColouredTypo.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/Typography/GeneralTypo.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/Typography/Heading.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/Typography/ListTypo.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/Typography/QuotesDemo.js
create mode 100644 front/odiparpack/app/containers/UiElements/demos/index.js
create mode 100644 front/odiparpack/app/containers/pageListAsync.js
(limited to 'front/odiparpack/app/containers')
diff --git a/front/odiparpack/app/containers/.DS_Store b/front/odiparpack/app/containers/.DS_Store
new file mode 100644
index 0000000..71c8885
Binary files /dev/null and b/front/odiparpack/app/containers/.DS_Store differ
diff --git a/front/odiparpack/app/containers/App/Application.js b/front/odiparpack/app/containers/App/Application.js
new file mode 100644
index 0000000..0a3ffc2
--- /dev/null
+++ b/front/odiparpack/app/containers/App/Application.js
@@ -0,0 +1,131 @@
+import React from 'react';
+import { PropTypes } from 'prop-types';
+import { Switch, Route } from 'react-router-dom';
+import Dashboard from '../Templates/Dashboard';
+import {
+ DashboardV1, DashboardV2,
+ Parent, AppLayout, Responsive, Grid,
+ SimpleTable, AdvancedTable, TablePlayground,
+ TreeTable, CrudTable,
+ ReduxForm, DateTimePicker, CheckboxRadio,
+ Switches, Selectbox, Rating,
+ SliderRange, Buttons, Textbox,
+ Autocomplete, Upload, TextEditor,
+ Avatars, Accordion, Badges,
+ List, PopoverTooltip, Notification,
+ Typography, Tabs, Cards,
+ ImageGrid, Progress, DialogModal,
+ Steppers, Paginations, DrawerMenu,
+ Breadcrumbs, Icons,
+ SliderCarousel, Tags, Dividers,
+ LineCharts, BarCharts, AreaCharts, PieCharts,
+ RadarCharts, ScatterCharts, CompossedCharts, ResponsiveCharts,
+ Contact, Chat, Email,
+ Ecommerce, SocialMedia, Calendar,
+ Profile, BlankPage,
+ Photos, Error, Settings,
+ HelpSupport, MapMarker, MapDirection, SearchMap,
+ TrafficIndicator, StreetViewMap, NotFound
+} from '../pageListAsync';
+
+function Application(props) {
+ const { history } = props;
+
+ return (
+
+
+
+
+ { /* Layout */ }
+
+
+
+
+ { /* Table */ }
+
+
+
+
+
+
+ { /* Form & Button */ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+ { /* Ui Components */}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ { /* Chart */ }
+
+
+
+
+
+
+
+
+
+ { /* Sample Apps */ }
+
+
+
+
+
+
+ { /* Pages */ }
+
+
+
+
+
+
+
+
+ { /* Map */ }
+
+
+
+
+
+
+ { /* Default */ }
+
+
+
+ );
+}
+
+Application.propTypes = {
+ history: PropTypes.object.isRequired,
+};
+
+export default Application;
diff --git a/front/odiparpack/app/containers/App/Auth.js b/front/odiparpack/app/containers/App/Auth.js
new file mode 100644
index 0000000..740f7f3
--- /dev/null
+++ b/front/odiparpack/app/containers/App/Auth.js
@@ -0,0 +1,28 @@
+import React from 'react';
+import { Switch, Route } from 'react-router-dom';
+import Outer from '../Templates/Outer';
+import {
+ Login,
+ Register,
+ ResetPassword,
+ NotFound,
+ Maintenance,
+ LockScreen
+} from '../pageListAsync';
+
+function Auth() {
+ return (
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+export default Auth;
diff --git a/front/odiparpack/app/containers/App/ThemeWrapper.js b/front/odiparpack/app/containers/App/ThemeWrapper.js
new file mode 100644
index 0000000..f39945f
--- /dev/null
+++ b/front/odiparpack/app/containers/App/ThemeWrapper.js
@@ -0,0 +1,111 @@
+import React, { useState, useEffect } from 'react';
+import { PropTypes } from 'prop-types';
+import { connect } from 'react-redux';
+import Loading from 'react-loading-bar';
+import { bindActionCreators } from 'redux';
+import {
+ withStyles,
+ createMuiTheme,
+ MuiThemeProvider
+} from '@material-ui/core/styles';
+import 'ba-styles/vendors/react-loading-bar/index.css';
+import { changeThemeAction } from 'ba-actions/UiActions';
+import themePallete from 'ba-api/themePalette';
+import TemplateSettings from 'ba-components/TemplateSettings';
+//import { Button, Icon } from '@material-ui/core';
+import styles from '../Templates/appStyles-jss';
+import { esES } from '@material-ui/core/locale';
+
+function ThemeWrapper(props) {
+ const {
+ classes,
+ children,
+ palette,
+ color,
+ changeTheme
+ } = props;
+
+ const [pageLoaded, setPageLoaded] = useState(true);
+ const [open, setOpen] = useState(false);
+ const [newPalette, setNewPalette] = useState(undefined);
+ const [theme, setTheme] = useState(
+ createMuiTheme(themePallete(color),esES)
+ );
+
+ useEffect(() => {
+ setNewPalette(palette);
+ setPageLoaded(true);
+ setTimeout(() => {
+ setPageLoaded(false);
+ }, 500);
+ return () => {
+ setPageLoaded(true);
+ };
+ }, []);
+
+ const handleOpenPallete = () => {
+ setOpen(true);
+ };
+
+ const handleClose = () => {
+ setOpen(false);
+ };
+
+ const handleChangeTheme = event => {
+ setTheme(createMuiTheme(themePallete(event.target.value),esES));
+ changeTheme(event.target.value);
+ };
+
+ return (
+
+
+
+
+ {/*
+
+ palette
+ Theme
+
+ */}
+
+ {children}
+
+
+ );
+}
+
+ThemeWrapper.propTypes = {
+ classes: PropTypes.object.isRequired,
+ children: PropTypes.node.isRequired,
+ color: PropTypes.string.isRequired,
+ changeTheme: PropTypes.func.isRequired,
+ palette: PropTypes.object.isRequired,
+};
+
+const reducer = 'ui';
+const mapStateToProps = state => ({
+ ...state,
+ color: state.getIn([reducer, 'theme']),
+ palette: state.getIn([reducer, 'palette']),
+});
+
+const dispatchToProps = dispatch => ({
+ changeTheme: bindActionCreators(changeThemeAction, dispatch),
+});
+
+const ThemeWrapperMapped = connect(
+ mapStateToProps,
+ dispatchToProps
+)(ThemeWrapper);
+
+export default withStyles(styles)(ThemeWrapperMapped);
diff --git a/front/odiparpack/app/containers/App/index.js b/front/odiparpack/app/containers/App/index.js
new file mode 100644
index 0000000..a7313fe
--- /dev/null
+++ b/front/odiparpack/app/containers/App/index.js
@@ -0,0 +1,23 @@
+import React from 'react';
+import { Switch, Route } from 'react-router-dom';
+import NotFound from 'containers/Pages/Standalone/NotFoundDedicated';
+import Auth from './Auth';
+import Application from './Application';
+import LoginDedicated from '../Pages/Standalone/LoginDedicated';
+import ThemeWrapper from './ThemeWrapper';
+window.__MUI_USE_NEXT_TYPOGRAPHY_VARIANTS__ = true;
+
+function App() {
+ return (
+
+
+
+
+
+
+
+
+ );
+}
+
+export default App;
diff --git a/front/odiparpack/app/containers/Charts/AreaCharts.js b/front/odiparpack/app/containers/Charts/AreaCharts.js
new file mode 100644
index 0000000..0468c22
--- /dev/null
+++ b/front/odiparpack/app/containers/Charts/AreaCharts.js
@@ -0,0 +1,63 @@
+import React from 'react';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import { SourceReader, PapperBlock } from 'ba-components';
+import {
+ AreaSimple,
+ AreaStacked,
+ AreaPercent,
+ AreaNegativePositive,
+ AreaResponsive
+} from './demos';
+
+class AreaCharts extends React.Component {
+ render() {
+ const title = brand.name + ' - Chart';
+ const description = brand.desc;
+ const docSrc = 'containers/Charts/demos/';
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+export default AreaCharts;
diff --git a/front/odiparpack/app/containers/Charts/BarCharts.js b/front/odiparpack/app/containers/Charts/BarCharts.js
new file mode 100644
index 0000000..4d24f78
--- /dev/null
+++ b/front/odiparpack/app/containers/Charts/BarCharts.js
@@ -0,0 +1,77 @@
+import React from 'react';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import { SourceReader, PapperBlock } from 'ba-components';
+import {
+ BarSimple,
+ BarStacked,
+ BarMix,
+ BarCustom,
+ BarPositiveNegative,
+ BarCustomLabel,
+ BarResponsive
+} from './demos';
+
+class BarCharts extends React.Component {
+ render() {
+ const title = brand.name + ' - Chart';
+ const description = brand.desc;
+ const docSrc = 'containers/Charts/demos/';
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+export default BarCharts;
diff --git a/front/odiparpack/app/containers/Charts/CompossedCharts.js b/front/odiparpack/app/containers/Charts/CompossedCharts.js
new file mode 100644
index 0000000..08937c7
--- /dev/null
+++ b/front/odiparpack/app/containers/Charts/CompossedCharts.js
@@ -0,0 +1,56 @@
+import React from 'react';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import { SourceReader, PapperBlock } from 'ba-components';
+import {
+ CompossedLineBarArea,
+ CompossedSameData,
+ CompossedVertical,
+ CompossedResponsive
+} from './demos';
+
+class CompossedCharts extends React.Component {
+ render() {
+ const title = brand.name + ' - Chart';
+ const description = brand.desc;
+ const docSrc = 'containers/Charts/demos/';
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+export default CompossedCharts;
diff --git a/front/odiparpack/app/containers/Charts/LineCharts.js b/front/odiparpack/app/containers/Charts/LineCharts.js
new file mode 100644
index 0000000..9f34f91
--- /dev/null
+++ b/front/odiparpack/app/containers/Charts/LineCharts.js
@@ -0,0 +1,70 @@
+import React from 'react';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import { withStyles } from '@material-ui/core/styles';
+import { SourceReader, PapperBlock } from 'ba-components';
+import {
+ LineSimple,
+ LineVertical,
+ LineCustomDot,
+ LineCustomLabel,
+ LineResponsive
+} from './demos';
+
+const styles = ({
+ root: {
+ flexGrow: 1,
+ }
+});
+
+class DateTime extends React.Component {
+ render() {
+ const title = brand.name + ' - Chart';
+ const description = brand.desc;
+ const docSrc = 'containers/Charts/demos/';
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+export default withStyles(styles)(DateTime);
diff --git a/front/odiparpack/app/containers/Charts/PieCharts.js b/front/odiparpack/app/containers/Charts/PieCharts.js
new file mode 100644
index 0000000..b5609e2
--- /dev/null
+++ b/front/odiparpack/app/containers/Charts/PieCharts.js
@@ -0,0 +1,49 @@
+import React from 'react';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import { SourceReader, PapperBlock } from 'ba-components';
+import {
+ PieSimple,
+ PieCustomShape,
+ PieCustomLabel,
+} from './demos';
+
+class PieCharts extends React.Component {
+ render() {
+ const title = brand.name + ' - Chart';
+ const description = brand.desc;
+ const docSrc = 'containers/Charts/demos/';
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+export default PieCharts;
diff --git a/front/odiparpack/app/containers/Charts/RadarCharts.js b/front/odiparpack/app/containers/Charts/RadarCharts.js
new file mode 100644
index 0000000..23fff3e
--- /dev/null
+++ b/front/odiparpack/app/containers/Charts/RadarCharts.js
@@ -0,0 +1,42 @@
+import React from 'react';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import { SourceReader, PapperBlock } from 'ba-components';
+import {
+ RadarSimple,
+ DoubleRadar
+} from './demos';
+
+class RadarCharts extends React.Component {
+ render() {
+ const title = brand.name + ' - Chart';
+ const description = brand.desc;
+ const docSrc = 'containers/Charts/demos/';
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+export default RadarCharts;
diff --git a/front/odiparpack/app/containers/Charts/ResponsiveCharts.js b/front/odiparpack/app/containers/Charts/ResponsiveCharts.js
new file mode 100644
index 0000000..ab8bb17
--- /dev/null
+++ b/front/odiparpack/app/containers/Charts/ResponsiveCharts.js
@@ -0,0 +1,63 @@
+import React from 'react';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import { SourceReader, PapperBlock } from 'ba-components';
+import {
+ AreaResponsive,
+ BarResponsive,
+ LineResponsive,
+ ScatterResponsive,
+ CompossedResponsive
+} from './demos';
+
+class ScatterCharts extends React.Component {
+ render() {
+ const title = brand.name + ' - Chart';
+ const description = brand.desc;
+ const docSrc = 'containers/Charts/demos/';
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+export default ScatterCharts;
diff --git a/front/odiparpack/app/containers/Charts/ScatterCharts.js b/front/odiparpack/app/containers/Charts/ScatterCharts.js
new file mode 100644
index 0000000..b680738
--- /dev/null
+++ b/front/odiparpack/app/containers/Charts/ScatterCharts.js
@@ -0,0 +1,63 @@
+import React from 'react';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import { SourceReader, PapperBlock } from 'ba-components';
+import {
+ ScatterSimple,
+ ScatterJoinLine,
+ ScatterMultiple,
+ ScatterCustom,
+ ScatterResponsive
+} from './demos';
+
+class ScatterCharts extends React.Component {
+ render() {
+ const title = brand.name + ' - Chart';
+ const description = brand.desc;
+ const docSrc = 'containers/Charts/demos/';
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+export default ScatterCharts;
diff --git a/front/odiparpack/app/containers/Charts/demos/AreaNegativePositive.js b/front/odiparpack/app/containers/Charts/demos/AreaNegativePositive.js
new file mode 100644
index 0000000..dd5793a
--- /dev/null
+++ b/front/odiparpack/app/containers/Charts/demos/AreaNegativePositive.js
@@ -0,0 +1,62 @@
+import React from 'react';
+import { createMuiTheme } from '@material-ui/core/styles';
+import ThemePallete from 'ba-api/themePalette';
+import {
+ AreaChart,
+ Area,
+ XAxis,
+ YAxis,
+ CartesianGrid,
+ Tooltip
+} from 'recharts';
+import { data3 } from './sampleData';
+
+const theme = createMuiTheme(ThemePallete.redTheme);
+const color = ({
+ primary: theme.palette.primary.main,
+ secondary: theme.palette.secondary.main,
+});
+
+const gradientOffset = () => {
+ const dataMax = Math.max(...data3.map((i) => i.uv));
+ const dataMin = Math.min(...data3.map((i) => i.uv));
+
+ if (dataMax <= 0) {
+ return 0;
+ } else if (dataMin >= 0) {
+ return 1;
+ }
+ return dataMax / (dataMax - dataMin);
+};
+
+const off = gradientOffset();
+
+function AreaNegativePositive() {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+export default AreaNegativePositive;
diff --git a/front/odiparpack/app/containers/Charts/demos/AreaPercent.js b/front/odiparpack/app/containers/Charts/demos/AreaPercent.js
new file mode 100644
index 0000000..32902e1
--- /dev/null
+++ b/front/odiparpack/app/containers/Charts/demos/AreaPercent.js
@@ -0,0 +1,79 @@
+import React from 'react';
+import { createMuiTheme } from '@material-ui/core/styles';
+import ThemePallete from 'ba-api/themePalette';
+import {
+ AreaChart,
+ Area,
+ XAxis,
+ YAxis,
+ CartesianGrid,
+ Tooltip
+} from 'recharts';
+import { red } from '@material-ui/core/colors';
+import { data1 } from './sampleData';
+
+const theme = createMuiTheme(ThemePallete.greenNatureTheme);
+const color = ({
+ primary: theme.palette.primary.main,
+ primarydark: theme.palette.primary.dark,
+ secondary: theme.palette.secondary.main,
+ secondarydark: theme.palette.secondary.dark,
+ third: red[500],
+ thirddark: red[900],
+});
+
+const toPercent = (decimal, fixed = 0) => (
+ `${(decimal * 100).toFixed(fixed)}%`
+);
+
+const getPercent = (value, total) => {
+ const ratio = total > 0 ? value / total : 0;
+ return toPercent(ratio, 2);
+};
+
+const renderTooltipContent = (o) => {
+ const { payload, label } = o;
+ const total = payload.reduce((result, entry) => (result + entry.value), 0);
+
+ return (
+
+
{`${label} (Total: ${total})`}
+
+ {
+ payload.map((entry, index) => (
+
+ {`${entry.name}: ${entry.value}(${getPercent(entry.value, total)})`}
+
+ ))
+ }
+
+
+ );
+};
+
+function AreaPercent() {
+ return (
+
+
+
+
+
+
+
+
+
+ );
+}
+
+export default AreaPercent;
diff --git a/front/odiparpack/app/containers/Charts/demos/AreaResponsive.js b/front/odiparpack/app/containers/Charts/demos/AreaResponsive.js
new file mode 100644
index 0000000..a1bc4c0
--- /dev/null
+++ b/front/odiparpack/app/containers/Charts/demos/AreaResponsive.js
@@ -0,0 +1,67 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { createMuiTheme, withStyles } from '@material-ui/core/styles';
+import ThemePallete from 'ba-api/themePalette';
+import {
+ AreaChart,
+ Area,
+ XAxis,
+ YAxis,
+ CartesianGrid,
+ Tooltip,
+ ResponsiveContainer
+} from 'recharts';
+import { green } from '@material-ui/core/colors';
+import { data1 } from './sampleData';
+
+const theme = createMuiTheme(ThemePallete.purpleTheme);
+const color = ({
+ primary: theme.palette.primary.main,
+ primarydark: theme.palette.primary.dark,
+ secondary: theme.palette.secondary.main,
+ secondarydark: theme.palette.secondary.dark,
+ third: green[500],
+ thirddark: green[900],
+});
+
+const styles = {
+ chartFluid: {
+ width: '100%',
+ height: 450
+ }
+};
+
+function AreaResponsive(props) {
+ const { classes } = props;
+ return (
+
+ );
+}
+
+AreaResponsive.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(AreaResponsive);
diff --git a/front/odiparpack/app/containers/Charts/demos/AreaSimple.js b/front/odiparpack/app/containers/Charts/demos/AreaSimple.js
new file mode 100644
index 0000000..590d19c
--- /dev/null
+++ b/front/odiparpack/app/containers/Charts/demos/AreaSimple.js
@@ -0,0 +1,42 @@
+import React from 'react';
+import { createMuiTheme } from '@material-ui/core/styles';
+import ThemePallete from 'ba-api/themePalette';
+import {
+ AreaChart,
+ Area,
+ XAxis,
+ YAxis,
+ CartesianGrid,
+ Tooltip
+} from 'recharts';
+import { data2 } from './sampleData';
+
+const theme = createMuiTheme(ThemePallete.greenTheme);
+const color = ({
+ main: theme.palette.primary.main,
+ dark: theme.palette.primary.dark,
+});
+
+function AreaSimple() {
+ return (
+
+
+
+
+
+
+
+ );
+}
+
+export default AreaSimple;
diff --git a/front/odiparpack/app/containers/Charts/demos/AreaStacked.js b/front/odiparpack/app/containers/Charts/demos/AreaStacked.js
new file mode 100644
index 0000000..82abd40
--- /dev/null
+++ b/front/odiparpack/app/containers/Charts/demos/AreaStacked.js
@@ -0,0 +1,49 @@
+import React from 'react';
+import { createMuiTheme } from '@material-ui/core/styles';
+import ThemePallete from 'ba-api/themePalette';
+import {
+ AreaChart,
+ Area,
+ XAxis,
+ YAxis,
+ CartesianGrid,
+ Tooltip
+} from 'recharts';
+import { green } from '@material-ui/core/colors';
+import { data1 } from './sampleData';
+
+const theme = createMuiTheme(ThemePallete.blueTheme);
+const color = ({
+ primary: theme.palette.primary.main,
+ primarydark: theme.palette.primary.dark,
+ secondary: theme.palette.secondary.main,
+ secondarydark: theme.palette.secondary.dark,
+ third: green[500],
+ thirddark: green[900],
+});
+
+function AreaStacked() {
+ return (
+
+
+
+
+
+
+
+
+
+ );
+}
+
+export default AreaStacked;
diff --git a/front/odiparpack/app/containers/Charts/demos/BarCustom.js b/front/odiparpack/app/containers/Charts/demos/BarCustom.js
new file mode 100644
index 0000000..d9a572d
--- /dev/null
+++ b/front/odiparpack/app/containers/Charts/demos/BarCustom.js
@@ -0,0 +1,80 @@
+import React from 'react';
+import {
+ BarChart,
+ Bar,
+ XAxis,
+ YAxis,
+ CartesianGrid,
+ Tooltip,
+ Cell
+} from 'recharts';
+import PropTypes from 'prop-types';
+import { purple, red, pink, indigo, blue, cyan, teal } from '@material-ui/core/colors';
+import { data2 } from './sampleData';
+
+
+const colors = [red[500], pink[500], purple[500], indigo[500], blue[500], cyan[500], teal[500]];
+
+const getPath = (x, y, width, height) => (
+ `M${x},${y + height}
+ C${x + (width / 3)},${y + height} ${x + (width / 2)},${y + (height / 3)} ${x + (width / 2)}, ${y}
+ C${x + (width / 2)},${y + (height / 3)} ${x + (2 * (width / 3))},${y + height} ${x + width}, ${y + height}
+ Z`
+);
+
+const TriangleBar = props => {
+ const {
+ fill,
+ x,
+ y,
+ width,
+ height
+ } = props;
+ return ;
+};
+
+TriangleBar.propTypes = {
+ x: PropTypes.number,
+ y: PropTypes.number,
+ fill: PropTypes.string,
+ width: PropTypes.number,
+ height: PropTypes.number,
+};
+
+TriangleBar.defaultProps = {
+ x: 0,
+ y: 0,
+ fill: '#9f9f9f',
+ width: 0,
+ height: 0,
+};
+
+function BarCustom() {
+ return (
+
+
+
+
+
+ } label={{ position: 'top' }}>
+ {
+ data2.map((entry, index) => (
+ |
+ ))
+ }
+
+
+ );
+}
+
+export default BarCustom;
diff --git a/front/odiparpack/app/containers/Charts/demos/BarCustomLabel.js b/front/odiparpack/app/containers/Charts/demos/BarCustomLabel.js
new file mode 100644
index 0000000..79968d5
--- /dev/null
+++ b/front/odiparpack/app/containers/Charts/demos/BarCustomLabel.js
@@ -0,0 +1,84 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { createMuiTheme } from '@material-ui/core/styles';
+import ThemePallete from 'ba-api/themePalette';
+import {
+ BarChart,
+ Bar,
+ XAxis,
+ YAxis,
+ CartesianGrid,
+ Tooltip,
+ Legend,
+ LabelList
+} from 'recharts';
+import { data1 } from './sampleData';
+
+const theme = createMuiTheme(ThemePallete.purpleTheme);
+const color = ({
+ primary: theme.palette.primary.main,
+ secondary: theme.palette.secondary.main,
+});
+
+const renderCustomizedLabel = props => {
+ const {
+ x,
+ y,
+ width,
+ value,
+ } = props;
+ const radius = 10;
+
+ return (
+
+
+
+ {value.split(' ')[1]}
+
+
+ );
+};
+
+renderCustomizedLabel.propTypes = {
+ x: PropTypes.number,
+ y: PropTypes.number,
+ width: PropTypes.number,
+ value: PropTypes.number,
+};
+
+renderCustomizedLabel.defaultProps = {
+ x: 0,
+ y: 0,
+ width: 0,
+ value: 0,
+};
+
+function BarCustomLabel() {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+export default BarCustomLabel;
diff --git a/front/odiparpack/app/containers/Charts/demos/BarMix.js b/front/odiparpack/app/containers/Charts/demos/BarMix.js
new file mode 100644
index 0000000..e2e0e4e
--- /dev/null
+++ b/front/odiparpack/app/containers/Charts/demos/BarMix.js
@@ -0,0 +1,48 @@
+import React from 'react';
+import { createMuiTheme } from '@material-ui/core/styles';
+import ThemePallete from 'ba-api/themePalette';
+import {
+ BarChart,
+ Bar,
+ XAxis,
+ YAxis,
+ CartesianGrid,
+ Tooltip,
+ Legend
+} from 'recharts';
+import { green } from '@material-ui/core/colors';
+import { data2 } from './sampleData';
+
+const theme = createMuiTheme(ThemePallete.blueTheme);
+const color = ({
+ primary: theme.palette.primary.main,
+ secondary: theme.palette.secondary.main,
+ third: green[500]
+});
+
+function BarMix() {
+ return (
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+export default BarMix;
diff --git a/front/odiparpack/app/containers/Charts/demos/BarPositiveNegative.js b/front/odiparpack/app/containers/Charts/demos/BarPositiveNegative.js
new file mode 100644
index 0000000..c3d6fcf
--- /dev/null
+++ b/front/odiparpack/app/containers/Charts/demos/BarPositiveNegative.js
@@ -0,0 +1,47 @@
+import React from 'react';
+import { createMuiTheme } from '@material-ui/core/styles';
+import ThemePallete from 'ba-api/themePalette';
+import {
+ BarChart,
+ Bar,
+ XAxis,
+ YAxis,
+ CartesianGrid,
+ Tooltip,
+ Legend,
+ ReferenceLine
+} from 'recharts';
+import { data3 } from './sampleData';
+
+const theme = createMuiTheme(ThemePallete.greenTheme);
+const color = ({
+ primary: theme.palette.primary.main,
+ secondary: theme.palette.secondary.main,
+});
+
+function BarPositiveNegative() {
+ return (
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+export default BarPositiveNegative;
diff --git a/front/odiparpack/app/containers/Charts/demos/BarResponsive.js b/front/odiparpack/app/containers/Charts/demos/BarResponsive.js
new file mode 100644
index 0000000..a2d3a48
--- /dev/null
+++ b/front/odiparpack/app/containers/Charts/demos/BarResponsive.js
@@ -0,0 +1,64 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { createMuiTheme, withStyles } from '@material-ui/core/styles';
+import ThemePallete from 'ba-api/themePalette';
+import {
+ BarChart,
+ Bar,
+ XAxis,
+ YAxis,
+ CartesianGrid,
+ Tooltip,
+ Legend,
+ ResponsiveContainer
+} from 'recharts';
+import { data1 } from './sampleData';
+
+const theme = createMuiTheme(ThemePallete.greenNatureTheme);
+const color = ({
+ primary: theme.palette.primary.main,
+ secondary: theme.palette.secondary.main,
+});
+
+const styles = {
+ chartFluid: {
+ width: '100%',
+ height: 450
+ }
+};
+
+function BarResponsive(props) {
+ const { classes } = props;
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+BarResponsive.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(BarResponsive);
+
diff --git a/front/odiparpack/app/containers/Charts/demos/BarSimple.js b/front/odiparpack/app/containers/Charts/demos/BarSimple.js
new file mode 100644
index 0000000..eb06ee6
--- /dev/null
+++ b/front/odiparpack/app/containers/Charts/demos/BarSimple.js
@@ -0,0 +1,45 @@
+import React from 'react';
+import { createMuiTheme } from '@material-ui/core/styles';
+import ThemePallete from 'ba-api/themePalette';
+import {
+ BarChart,
+ Bar,
+ XAxis,
+ YAxis,
+ CartesianGrid,
+ Tooltip,
+ Legend
+} from 'recharts';
+import { data1 } from './sampleData';
+
+const theme = createMuiTheme(ThemePallete.redTheme);
+const color = ({
+ primary: theme.palette.primary.main,
+ secondary: theme.palette.secondary.main,
+});
+
+function BarSimple() {
+ return (
+
+
+
+
+
+
+
+
+
+ );
+}
+
+export default BarSimple;
diff --git a/front/odiparpack/app/containers/Charts/demos/BarStacked.js b/front/odiparpack/app/containers/Charts/demos/BarStacked.js
new file mode 100644
index 0000000..e5dfb0a
--- /dev/null
+++ b/front/odiparpack/app/containers/Charts/demos/BarStacked.js
@@ -0,0 +1,45 @@
+import React from 'react';
+import { createMuiTheme } from '@material-ui/core/styles';
+import ThemePallete from 'ba-api/themePalette';
+import {
+ BarChart,
+ Bar,
+ XAxis,
+ YAxis,
+ CartesianGrid,
+ Tooltip,
+ Legend
+} from 'recharts';
+import { data1 } from './sampleData';
+
+const theme = createMuiTheme(ThemePallete.orangeTheme);
+const color = ({
+ primary: theme.palette.primary.main,
+ secondary: theme.palette.secondary.main,
+});
+
+function BarStacked() {
+ return (
+
+
+
+
+
+
+
+
+
+ );
+}
+
+export default BarStacked;
diff --git a/front/odiparpack/app/containers/Charts/demos/CompossedLineBarArea.js b/front/odiparpack/app/containers/Charts/demos/CompossedLineBarArea.js
new file mode 100644
index 0000000..9063062
--- /dev/null
+++ b/front/odiparpack/app/containers/Charts/demos/CompossedLineBarArea.js
@@ -0,0 +1,51 @@
+import React from 'react';
+import { createMuiTheme } from '@material-ui/core/styles';
+import ThemePallete from 'ba-api/themePalette';
+import {
+ ComposedChart,
+ Line,
+ Area,
+ Bar,
+ XAxis,
+ YAxis,
+ CartesianGrid,
+ Tooltip,
+ Legend
+} from 'recharts';
+import { green } from '@material-ui/core/colors';
+import { data1 } from './sampleData';
+
+const theme = createMuiTheme(ThemePallete.orangeTheme);
+const color = ({
+ main: theme.palette.primary.main,
+ maindark: theme.palette.primary.dark,
+ secondary: theme.palette.secondary.main,
+ third: green[500],
+});
+
+function CompossedLineBarArea() {
+ return (
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+export default CompossedLineBarArea;
diff --git a/front/odiparpack/app/containers/Charts/demos/CompossedResponsive.js b/front/odiparpack/app/containers/Charts/demos/CompossedResponsive.js
new file mode 100644
index 0000000..ff06fb4
--- /dev/null
+++ b/front/odiparpack/app/containers/Charts/demos/CompossedResponsive.js
@@ -0,0 +1,69 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { createMuiTheme, withStyles } from '@material-ui/core/styles';
+import ThemePallete from 'ba-api/themePalette';
+import {
+ ComposedChart,
+ Line,
+ Area,
+ Bar,
+ XAxis,
+ YAxis,
+ CartesianGrid,
+ Tooltip,
+ Legend,
+ ResponsiveContainer
+} from 'recharts';
+import { green } from '@material-ui/core/colors';
+import { data1 } from './sampleData';
+
+const theme = createMuiTheme(ThemePallete.magentaTheme);
+const color = ({
+ main: theme.palette.primary.main,
+ maindark: theme.palette.primary.dark,
+ secondary: theme.palette.secondary.main,
+ third: green[500],
+});
+
+const styles = {
+ chartFluid: {
+ width: '100%',
+ height: 450
+ }
+};
+
+function CompossedResponsive(props) {
+ const { classes } = props;
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+CompossedResponsive.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(CompossedResponsive);
diff --git a/front/odiparpack/app/containers/Charts/demos/CompossedSameData.js b/front/odiparpack/app/containers/Charts/demos/CompossedSameData.js
new file mode 100644
index 0000000..ca81de1
--- /dev/null
+++ b/front/odiparpack/app/containers/Charts/demos/CompossedSameData.js
@@ -0,0 +1,46 @@
+import React from 'react';
+import { createMuiTheme } from '@material-ui/core/styles';
+import ThemePallete from 'ba-api/themePalette';
+import {
+ ComposedChart,
+ Line,
+ Bar,
+ XAxis,
+ YAxis,
+ CartesianGrid,
+ Tooltip,
+ Legend
+} from 'recharts';
+import { data1 } from './sampleData';
+
+const theme = createMuiTheme(ThemePallete.blueTheme);
+const color = ({
+ main: theme.palette.primary.main,
+ secondary: theme.palette.secondary.main,
+});
+
+function CompossedSameData() {
+ return (
+
+
+
+
+
+
+
+
+
+ );
+}
+
+export default CompossedSameData;
diff --git a/front/odiparpack/app/containers/Charts/demos/CompossedVertical.js b/front/odiparpack/app/containers/Charts/demos/CompossedVertical.js
new file mode 100644
index 0000000..8e6d382
--- /dev/null
+++ b/front/odiparpack/app/containers/Charts/demos/CompossedVertical.js
@@ -0,0 +1,52 @@
+import React from 'react';
+import { createMuiTheme } from '@material-ui/core/styles';
+import ThemePallete from 'ba-api/themePalette';
+import {
+ ComposedChart,
+ Line,
+ Area,
+ Bar,
+ XAxis,
+ YAxis,
+ CartesianGrid,
+ Tooltip,
+ Legend
+} from 'recharts';
+import { green } from '@material-ui/core/colors';
+import { data1 } from './sampleData';
+
+const theme = createMuiTheme(ThemePallete.blueTheme);
+const color = ({
+ main: theme.palette.primary.main,
+ maindark: theme.palette.primary.dark,
+ secondary: theme.palette.secondary.main,
+ third: green[500],
+});
+
+function CompossedVertical() {
+ return (
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+export default CompossedVertical;
diff --git a/front/odiparpack/app/containers/Charts/demos/DoubleRadar.js b/front/odiparpack/app/containers/Charts/demos/DoubleRadar.js
new file mode 100644
index 0000000..ba6774c
--- /dev/null
+++ b/front/odiparpack/app/containers/Charts/demos/DoubleRadar.js
@@ -0,0 +1,35 @@
+import React from 'react';
+import { createMuiTheme } from '@material-ui/core/styles';
+import ThemePallete from 'ba-api/themePalette';
+import {
+ Radar,
+ RadarChart,
+ PolarGrid,
+ PolarAngleAxis,
+ PolarRadiusAxis,
+ Legend
+} from 'recharts';
+import { data7 } from './sampleData';
+
+const theme = createMuiTheme(ThemePallete.redTheme);
+const color = ({
+ main: theme.palette.primary.main,
+ maindark: theme.palette.primary.dark,
+ secondary: theme.palette.secondary.main,
+ secondarydark: theme.palette.secondary.dark,
+});
+
+function DoubleRadar() {
+ return (
+
+
+
+
+
+
+
+
+ );
+}
+
+export default DoubleRadar;
diff --git a/front/odiparpack/app/containers/Charts/demos/LineCustomDot.js b/front/odiparpack/app/containers/Charts/demos/LineCustomDot.js
new file mode 100644
index 0000000..0b36702
--- /dev/null
+++ b/front/odiparpack/app/containers/Charts/demos/LineCustomDot.js
@@ -0,0 +1,78 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { createMuiTheme } from '@material-ui/core/styles';
+import ThemePallete from 'ba-api/themePalette';
+import {
+ LineChart,
+ Line,
+ XAxis,
+ YAxis,
+ CartesianGrid,
+ Tooltip,
+ Legend
+} from 'recharts';
+import { data1 } from './sampleData';
+
+const theme = createMuiTheme(ThemePallete.orangeTheme);
+const color = ({
+ primary: theme.palette.primary.main,
+ secondary: theme.palette.secondary.main,
+});
+
+const CustomizedDot = props => {
+ const {
+ cx,
+ cy,
+ value
+ } = props;
+ if (value > 2500) {
+ return (
+
+
+
+ );
+ }
+ return (
+
+
+
+ );
+};
+
+CustomizedDot.propTypes = {
+ cx: PropTypes.number,
+ cy: PropTypes.number,
+ value: PropTypes.number,
+};
+
+CustomizedDot.defaultProps = {
+ cx: 0,
+ cy: 0,
+ value: 0,
+};
+
+function LineCustomDot() {
+ return (
+
+
+
+
+
+
+ } />
+
+
+ );
+}
+
+export default LineCustomDot;
diff --git a/front/odiparpack/app/containers/Charts/demos/LineCustomLabel.js b/front/odiparpack/app/containers/Charts/demos/LineCustomLabel.js
new file mode 100644
index 0000000..32f4288
--- /dev/null
+++ b/front/odiparpack/app/containers/Charts/demos/LineCustomLabel.js
@@ -0,0 +1,74 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { createMuiTheme } from '@material-ui/core/styles';
+import ThemePallete from 'ba-api/themePalette';
+import {
+ LineChart,
+ Line,
+ XAxis,
+ YAxis,
+ CartesianGrid,
+ Tooltip,
+ Legend
+} from 'recharts';
+import { data1 } from './sampleData';
+
+const theme = createMuiTheme(ThemePallete.redTheme);
+const color = ({
+ primary: theme.palette.primary.main,
+ secondary: theme.palette.secondary.main,
+});
+
+const CustomizedLabel = props => {
+ const {
+ x,
+ y,
+ stroke,
+ value
+ } = props;
+ return (
+
+ { value }
+
+ );
+};
+
+CustomizedLabel.propTypes = {
+ x: PropTypes.number,
+ y: PropTypes.number,
+ value: PropTypes.number,
+ stroke: PropTypes.string,
+};
+
+CustomizedLabel.defaultProps = {
+ x: 0,
+ y: 0,
+ value: 0,
+ stroke: '#000'
+};
+
+function LineCustomLabel() {
+ return (
+
+
+
+
+
+
+ } />
+ } />
+
+ );
+}
+
+export default LineCustomLabel;
diff --git a/front/odiparpack/app/containers/Charts/demos/LineResponsive.js b/front/odiparpack/app/containers/Charts/demos/LineResponsive.js
new file mode 100644
index 0000000..b27223f
--- /dev/null
+++ b/front/odiparpack/app/containers/Charts/demos/LineResponsive.js
@@ -0,0 +1,56 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import {
+ LineChart,
+ Line,
+ XAxis,
+ YAxis,
+ CartesianGrid,
+ Tooltip,
+ Legend,
+ ResponsiveContainer
+} from 'recharts';
+import { data1 } from './sampleData';
+
+const styles = {
+ chartFluid: {
+ width: '100%',
+ height: 450
+ }
+};
+
+function LineResponsive(props) {
+ const { classes } = props;
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+LineResponsive.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(LineResponsive);
diff --git a/front/odiparpack/app/containers/Charts/demos/LineSimple.js b/front/odiparpack/app/containers/Charts/demos/LineSimple.js
new file mode 100644
index 0000000..54c1be5
--- /dev/null
+++ b/front/odiparpack/app/containers/Charts/demos/LineSimple.js
@@ -0,0 +1,37 @@
+import React from 'react';
+import {
+ LineChart,
+ Line,
+ XAxis,
+ YAxis,
+ CartesianGrid,
+ Tooltip,
+ Legend
+} from 'recharts';
+import { data1 } from './sampleData';
+
+function LineSimple() {
+ return (
+
+
+
+
+
+
+
+
+
+ );
+}
+
+export default LineSimple;
diff --git a/front/odiparpack/app/containers/Charts/demos/LineVertical.js b/front/odiparpack/app/containers/Charts/demos/LineVertical.js
new file mode 100644
index 0000000..28ffc07
--- /dev/null
+++ b/front/odiparpack/app/containers/Charts/demos/LineVertical.js
@@ -0,0 +1,46 @@
+import React from 'react';
+import { createMuiTheme } from '@material-ui/core/styles';
+import ThemePallete from 'ba-api/themePalette';
+import {
+ LineChart,
+ Line,
+ XAxis,
+ YAxis,
+ CartesianGrid,
+ Tooltip,
+ Legend
+} from 'recharts';
+import { data1 } from './sampleData';
+
+const theme = createMuiTheme(ThemePallete.cyanTheme);
+const color = ({
+ primary: theme.palette.primary.main,
+ secondary: theme.palette.secondary.main,
+});
+
+function LineVertical() {
+ return (
+
+
+
+
+
+
+
+
+
+ );
+}
+
+export default LineVertical;
diff --git a/front/odiparpack/app/containers/Charts/demos/PieCustomLabel.js b/front/odiparpack/app/containers/Charts/demos/PieCustomLabel.js
new file mode 100644
index 0000000..1787ef3
--- /dev/null
+++ b/front/odiparpack/app/containers/Charts/demos/PieCustomLabel.js
@@ -0,0 +1,83 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import {
+ PieChart,
+ Pie,
+ Cell
+} from 'recharts';
+
+import { purple, red, pink, indigo, blue, cyan, teal } from '@material-ui/core/colors';
+import { data6 } from './sampleData';
+const colors = [red[500], pink[500], purple[500], indigo[500], blue[500], cyan[500], teal[500]];
+
+const RADIAN = Math.PI / 180;
+const renderCustomizedLabel = ({
+ cx,
+ cy,
+ midAngle,
+ innerRadius,
+ outerRadius,
+ percent,
+}) => {
+ const radius = innerRadius + ((outerRadius - innerRadius) * 0.5);
+ const x = cx + (radius * Math.cos(-midAngle * RADIAN));
+ const y = cy + (radius * Math.sin(-midAngle * RADIAN));
+
+ return (
+ cx ? 'start' : 'end'} dominantBaseline="central">
+ {`${(percent * 100).toFixed(0)}%`}
+
+ );
+};
+
+renderCustomizedLabel.propTypes = {
+ cx: PropTypes.number,
+ cy: PropTypes.number,
+ midAngle: PropTypes.number,
+ innerRadius: PropTypes.number,
+ outerRadius: PropTypes.number,
+ percent: PropTypes.number,
+};
+
+renderCustomizedLabel.defaultProps = {
+ cx: 0,
+ cy: 0,
+ midAngle: 0,
+ innerRadius: 0,
+ outerRadius: 0,
+ percent: 0,
+};
+
+class PieCustomLabel extends React.Component {
+ render() {
+ return (
+
+
+ {
+ data6.map((entry, index) => | )
+ }
+
+
+ );
+ }
+}
+
+export default PieCustomLabel;
diff --git a/front/odiparpack/app/containers/Charts/demos/PieCustomShape.js b/front/odiparpack/app/containers/Charts/demos/PieCustomShape.js
new file mode 100644
index 0000000..ae58dba
--- /dev/null
+++ b/front/odiparpack/app/containers/Charts/demos/PieCustomShape.js
@@ -0,0 +1,143 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { createMuiTheme } from '@material-ui/core/styles';
+import ThemePallete from 'ba-api/themePalette';
+import {
+ PieChart,
+ Pie,
+ Sector
+} from 'recharts';
+import { data6 } from './sampleData';
+
+const theme = createMuiTheme(ThemePallete.greenTheme);
+const color = ({
+ primary: theme.palette.primary.main,
+ secondary: theme.palette.secondary.main,
+});
+
+const renderActiveShape = props => {
+ const RADIAN = Math.PI / 180;
+ const {
+ cx,
+ cy,
+ midAngle,
+ innerRadius,
+ outerRadius,
+ startAngle,
+ endAngle,
+ fill,
+ payload,
+ percent,
+ value
+ } = props;
+ const sin = Math.sin(-RADIAN * midAngle);
+ const cos = Math.cos(-RADIAN * midAngle);
+ const sx = cx + ((outerRadius + 10) * cos);
+ const sy = cy + ((outerRadius + 10) * sin);
+ const mx = cx + ((outerRadius + 30) * cos);
+ const my = cy + ((outerRadius + 30) * sin);
+ const ex = mx + ((cos >= 0 ? 1 : -1) * 22);
+ const ey = my;
+ const textAnchor = cos >= 0 ? 'start' : 'end';
+ return (
+
+ {payload.name}
+
+
+
+
+ = 0 ? 1 : -1) * 12)} y={ey} textAnchor={textAnchor} fill="#333">{`PV ${value}`}
+ = 0 ? 1 : -1) * 12)} y={ey} dy={18} textAnchor={textAnchor} fill="#999">
+ {`(Rate ${(percent * 100).toFixed(2)}%)`}
+
+
+ );
+};
+
+renderActiveShape.propTypes = {
+ cx: PropTypes.number,
+ cy: PropTypes.number,
+ midAngle: PropTypes.number,
+ innerRadius: PropTypes.number,
+ outerRadius: PropTypes.number,
+ startAngle: PropTypes.number,
+ endAngle: PropTypes.number,
+ fill: PropTypes.string,
+ payload: PropTypes.string,
+ percent: PropTypes.number,
+ value: PropTypes.number,
+};
+
+renderActiveShape.defaultProps = {
+ cx: 0,
+ cy: 0,
+ midAngle: 0,
+ innerRadius: 0,
+ outerRadius: 0,
+ startAngle: 0,
+ endAngle: 0,
+ fill: '#eee',
+ payload: '',
+ percent: 0,
+ value: 0,
+};
+
+class PieCustomShape extends React.Component {
+ state = {
+ activeIndex: 0
+ };
+
+ onPieEnter(evt) {
+ const index = data6.findIndex(p => p.name === evt.name);
+ this.setState({
+ activeIndex: index,
+ });
+ }
+
+ render() {
+ return (
+
+ this.onPieEnter(event)}
+ />
+
+ );
+ }
+}
+
+export default PieCustomShape;
diff --git a/front/odiparpack/app/containers/Charts/demos/PieSimple.js b/front/odiparpack/app/containers/Charts/demos/PieSimple.js
new file mode 100644
index 0000000..f0a4f6e
--- /dev/null
+++ b/front/odiparpack/app/containers/Charts/demos/PieSimple.js
@@ -0,0 +1,36 @@
+import React from 'react';
+import { createMuiTheme } from '@material-ui/core/styles';
+import ThemePallete from 'ba-api/themePalette';
+import {
+ PieChart,
+ Pie,
+ Tooltip
+} from 'recharts';
+import { data4, data5 } from './sampleData';
+
+const theme = createMuiTheme(ThemePallete.purpleTheme);
+const color = ({
+ primary: theme.palette.primary.main,
+ secondary: theme.palette.secondary.main,
+});
+
+function PieSimple() {
+ return (
+
+
+
+
+
+ );
+}
+
+export default PieSimple;
diff --git a/front/odiparpack/app/containers/Charts/demos/RadarSimple.js b/front/odiparpack/app/containers/Charts/demos/RadarSimple.js
new file mode 100644
index 0000000..f0e86cd
--- /dev/null
+++ b/front/odiparpack/app/containers/Charts/demos/RadarSimple.js
@@ -0,0 +1,30 @@
+import React from 'react';
+import { createMuiTheme } from '@material-ui/core/styles';
+import ThemePallete from 'ba-api/themePalette';
+import {
+ Radar,
+ RadarChart,
+ PolarGrid,
+ PolarAngleAxis,
+ PolarRadiusAxis
+} from 'recharts';
+import { data7 } from './sampleData';
+
+const theme = createMuiTheme(ThemePallete.purpleTheme);
+const color = ({
+ main: theme.palette.primary.main,
+ dark: theme.palette.primary.dark,
+});
+
+function RadarSimple() {
+ return (
+
+
+
+
+
+
+ );
+}
+
+export default RadarSimple;
diff --git a/front/odiparpack/app/containers/Charts/demos/ScatterCustom.js b/front/odiparpack/app/containers/Charts/demos/ScatterCustom.js
new file mode 100644
index 0000000..9e61b27
--- /dev/null
+++ b/front/odiparpack/app/containers/Charts/demos/ScatterCustom.js
@@ -0,0 +1,46 @@
+import React from 'react';
+import { createMuiTheme } from '@material-ui/core/styles';
+import ThemePallete from 'ba-api/themePalette';
+import {
+ ScatterChart,
+ Scatter,
+ XAxis,
+ YAxis,
+ ZAxis,
+ CartesianGrid,
+ Tooltip,
+ Legend
+} from 'recharts';
+import { data8, data9 } from './sampleData';
+
+const theme = createMuiTheme(ThemePallete.orangeTheme);
+const color = ({
+ primary: theme.palette.primary.main,
+ secondary: theme.palette.secondary.main,
+});
+
+function ScatterCustom() {
+ return (
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+export default ScatterCustom;
diff --git a/front/odiparpack/app/containers/Charts/demos/ScatterJoinLine.js b/front/odiparpack/app/containers/Charts/demos/ScatterJoinLine.js
new file mode 100644
index 0000000..74c238e
--- /dev/null
+++ b/front/odiparpack/app/containers/Charts/demos/ScatterJoinLine.js
@@ -0,0 +1,46 @@
+import React from 'react';
+import { createMuiTheme } from '@material-ui/core/styles';
+import ThemePallete from 'ba-api/themePalette';
+import {
+ ScatterChart,
+ Scatter,
+ XAxis,
+ YAxis,
+ ZAxis,
+ CartesianGrid,
+ Tooltip,
+ Legend
+} from 'recharts';
+import { data8, data9 } from './sampleData';
+
+const theme = createMuiTheme(ThemePallete.blueTheme);
+const color = ({
+ primary: theme.palette.primary.main,
+ secondary: theme.palette.secondary.main,
+});
+
+function ScatterJoinLine() {
+ return (
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+export default ScatterJoinLine;
diff --git a/front/odiparpack/app/containers/Charts/demos/ScatterMultiple.js b/front/odiparpack/app/containers/Charts/demos/ScatterMultiple.js
new file mode 100644
index 0000000..a870692
--- /dev/null
+++ b/front/odiparpack/app/containers/Charts/demos/ScatterMultiple.js
@@ -0,0 +1,46 @@
+import React from 'react';
+import { createMuiTheme } from '@material-ui/core/styles';
+import ThemePallete from 'ba-api/themePalette';
+import {
+ ScatterChart,
+ Scatter,
+ XAxis,
+ YAxis,
+ ZAxis,
+ CartesianGrid,
+ Tooltip,
+ Legend
+} from 'recharts';
+import { data8, data9 } from './sampleData';
+
+const theme = createMuiTheme(ThemePallete.greenTheme);
+const color = ({
+ primary: theme.palette.primary.main,
+ secondary: theme.palette.secondary.main,
+});
+
+function ScatterMultiple() {
+ return (
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+export default ScatterMultiple;
diff --git a/front/odiparpack/app/containers/Charts/demos/ScatterResponsive.js b/front/odiparpack/app/containers/Charts/demos/ScatterResponsive.js
new file mode 100644
index 0000000..791117d
--- /dev/null
+++ b/front/odiparpack/app/containers/Charts/demos/ScatterResponsive.js
@@ -0,0 +1,64 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { createMuiTheme, withStyles } from '@material-ui/core/styles';
+import ThemePallete from 'ba-api/themePalette';
+import {
+ ScatterChart,
+ Scatter,
+ XAxis,
+ YAxis,
+ ZAxis,
+ CartesianGrid,
+ Tooltip,
+ Legend,
+ ResponsiveContainer
+} from 'recharts';
+import { data8, data9 } from './sampleData';
+
+const theme = createMuiTheme(ThemePallete.skyBlueTheme);
+const color = ({
+ primary: theme.palette.primary.main,
+ secondary: theme.palette.secondary.main,
+});
+
+const styles = {
+ chartFluid: {
+ width: '100%',
+ height: 450
+ }
+};
+
+function ScatterResponsive(props) {
+ const { classes } = props;
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+ScatterResponsive.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(ScatterResponsive);
diff --git a/front/odiparpack/app/containers/Charts/demos/ScatterSimple.js b/front/odiparpack/app/containers/Charts/demos/ScatterSimple.js
new file mode 100644
index 0000000..4b8717a
--- /dev/null
+++ b/front/odiparpack/app/containers/Charts/demos/ScatterSimple.js
@@ -0,0 +1,40 @@
+import React from 'react';
+import { createMuiTheme } from '@material-ui/core/styles';
+import ThemePallete from 'ba-api/themePalette';
+import {
+ ScatterChart,
+ Scatter,
+ XAxis,
+ YAxis,
+ CartesianGrid,
+ Tooltip,
+} from 'recharts';
+import { data8 } from './sampleData';
+
+const theme = createMuiTheme(ThemePallete.cyanTheme);
+const color = ({
+ primary: theme.palette.primary.main,
+});
+
+function ScatterSimple() {
+ return (
+
+
+
+
+
+
+
+ );
+}
+
+export default ScatterSimple;
diff --git a/front/odiparpack/app/containers/Charts/demos/index.js b/front/odiparpack/app/containers/Charts/demos/index.js
new file mode 100644
index 0000000..da6ac01
--- /dev/null
+++ b/front/odiparpack/app/containers/Charts/demos/index.js
@@ -0,0 +1,31 @@
+export LineSimple from './LineSimple';
+export LineVertical from './LineVertical';
+export LineCustomDot from './LineCustomDot';
+export LineCustomLabel from './LineCustomLabel';
+export LineResponsive from './LineResponsive';
+export BarSimple from './BarSimple';
+export BarMix from './BarMix';
+export BarStacked from './BarStacked';
+export BarCustom from './BarCustom';
+export BarPositiveNegative from './BarPositiveNegative';
+export BarCustomLabel from './BarCustomLabel';
+export BarResponsive from './BarResponsive';
+export AreaSimple from './AreaSimple';
+export AreaStacked from './AreaStacked';
+export AreaPercent from './AreaPercent';
+export AreaNegativePositive from './AreaNegativePositive';
+export AreaResponsive from './AreaResponsive';
+export PieSimple from './PieSimple';
+export PieCustomShape from './PieCustomShape';
+export PieCustomLabel from './PieCustomLabel';
+export RadarSimple from './RadarSimple';
+export DoubleRadar from './DoubleRadar';
+export ScatterSimple from './ScatterSimple';
+export ScatterJoinLine from './ScatterJoinLine';
+export ScatterMultiple from './ScatterMultiple';
+export ScatterCustom from './ScatterCustom';
+export ScatterResponsive from './ScatterResponsive';
+export CompossedLineBarArea from './CompossedLineBarArea';
+export CompossedSameData from './CompossedSameData';
+export CompossedVertical from './CompossedVertical';
+export CompossedResponsive from './CompossedResponsive';
diff --git a/front/odiparpack/app/containers/Charts/demos/sampleData.js b/front/odiparpack/app/containers/Charts/demos/sampleData.js
new file mode 100644
index 0000000..4c6e524
--- /dev/null
+++ b/front/odiparpack/app/containers/Charts/demos/sampleData.js
@@ -0,0 +1,262 @@
+export const data1 = [
+ {
+ name: 'Page A',
+ uv: 4000,
+ pv: 2400,
+ amt: 2400
+ },
+ {
+ name: 'Page B',
+ uv: 3000,
+ pv: 1398,
+ amt: 2210
+ },
+ {
+ name: 'Page C',
+ uv: 2000,
+ pv: 9800,
+ amt: 2290
+ },
+ {
+ name: 'Page D',
+ uv: 2780,
+ pv: 3908,
+ amt: 2000
+ },
+ {
+ name: 'Page E',
+ uv: 1890,
+ pv: 4800,
+ amt: 2181
+ },
+ {
+ name: 'Page F',
+ uv: 2390,
+ pv: 3800,
+ amt: 2500
+ },
+ {
+ name: 'Page G',
+ uv: 3490,
+ pv: 4300,
+ amt: 2100
+ },
+];
+
+export const data2 = [
+ {
+ name: 'Page A',
+ uv: 4000,
+ female: 2400,
+ male: 2400
+ }, {
+ name: 'Page B',
+ uv: 3000,
+ female: 1398,
+ male: 2210
+ }, {
+ name: 'Page C',
+ uv: 2000,
+ female: 9800,
+ male: 2290
+ }, {
+ name: 'Page D',
+ uv: 2780,
+ female: 3908,
+ male: 2000
+ }, {
+ name: 'Page E',
+ uv: 1890,
+ female: 4800,
+ male: 2181
+ }, {
+ name: 'Page F',
+ uv: 2390,
+ female: 3800,
+ male: 2500
+ }, {
+ name: 'Page G',
+ uv: 3490,
+ female: 4300,
+ male: 2100
+ },
+];
+
+export const data3 = [
+ {
+ name: 'Page A',
+ uv: 4000,
+ pv: 2400,
+ amt: 2400
+ }, {
+ name: 'Page B',
+ uv: -3000,
+ pv: 1398,
+ amt: 2210
+ }, {
+ name: 'Page C',
+ uv: -2000,
+ pv: -9800,
+ amt: 2290
+ }, {
+ name: 'Page D',
+ uv: 2780,
+ pv: 3908,
+ amt: 2000
+ }, {
+ name: 'Page E',
+ uv: -1890,
+ pv: 4800,
+ amt: 2181
+ }, {
+ name: 'Page F',
+ uv: 2390,
+ pv: -3800,
+ amt: 2500
+ }, {
+ name: 'Page G',
+ uv: 3490,
+ pv: 4300,
+ amt: 2100
+ },
+];
+
+export const data4 = [
+ {
+ name: 'Group A',
+ value: 400
+ }, {
+ name: 'Group B',
+ value: 300
+ },
+ {
+ name: 'Group C',
+ value: 300
+ }, {
+ name: 'Group D',
+ value: 200
+ },
+ {
+ name: 'Group E',
+ value: 278
+ }, {
+ name: 'Group F',
+ value: 189
+ }
+];
+
+export const data5 = [
+ {
+ name: 'Group A',
+ value: 2400
+ }, {
+ name: 'Group B',
+ value: 4567
+ },
+ {
+ name: 'Group C',
+ value: 1398
+ }, {
+ name: 'Group D',
+ value: 9800
+ },
+ {
+ name: 'Group E',
+ value: 3908
+ }, {
+ name: 'Group F',
+ value: 4800
+ }
+];
+
+export const data6 = [
+ {
+ name: 'Group A',
+ value: 400
+ }, {
+ name: 'Group B',
+ value: 300
+ },
+ {
+ name: 'Group C',
+ value: 300
+ }, {
+ name: 'Group D',
+ value: 200
+ }
+];
+
+export const data7 = [
+ {
+ subject: 'Math',
+ A: 120,
+ B: 110,
+ fullMark: 150
+ }, {
+ subject: 'Chinese',
+ A: 98,
+ B: 130,
+ fullMark: 150
+ }, {
+ subject: 'English',
+ A: 86,
+ B: 130,
+ fullMark: 150
+ }, {
+ subject: 'Geography',
+ A: 99,
+ B: 100,
+ fullMark: 150
+ }, {
+ subject: 'Physics',
+ A: 85,
+ B: 90,
+ fullMark: 150
+ }, {
+ subject: 'History',
+ A: 65,
+ B: 85,
+ fullMark: 150
+ },
+];
+
+export const data8 = [
+ {
+ x: 10,
+ y: 30
+ }, {
+ x: 30,
+ y: 200
+ }, {
+ x: 45,
+ y: 100
+ }, {
+ x: 50,
+ y: 400
+ }, {
+ x: 70,
+ y: 150
+ }, {
+ x: 100,
+ y: 250
+ }
+];
+
+export const data9 = [
+ {
+ x: 30,
+ y: 20
+ }, {
+ x: 50,
+ y: 180
+ }, {
+ x: 75,
+ y: 240
+ }, {
+ x: 100,
+ y: 100
+ }, {
+ x: 120,
+ y: 190
+ }
+];
diff --git a/front/odiparpack/app/containers/Dashboard/Dashboard.js b/front/odiparpack/app/containers/Dashboard/Dashboard.js
new file mode 100644
index 0000000..94d3eb4
--- /dev/null
+++ b/front/odiparpack/app/containers/Dashboard/Dashboard.js
@@ -0,0 +1,99 @@
+import React, { PureComponent } from 'react';
+import PropTypes from 'prop-types';
+import brand from 'ba-api/brand';
+import { Helmet } from 'react-helmet';
+import { withStyles } from '@material-ui/core/styles';
+import imgApi from 'ba-api/images';
+import avatarApi from 'ba-api/avatars';
+import {
+ SliderWidget,
+ CounterGroupWidget,
+ BigChartWidget,
+ TableWidget,
+ TaskWidget,
+ ProfileCard,
+ ProfileWidget,
+ ProgressWidget,
+ GeneralCard,
+ Quote,
+ PlayerCard
+} from 'ba-components';
+import { Grid, Divider } from '@material-ui/core';
+import styles from './dashboard-jss';
+
+
+class Dashboard extends PureComponent {
+ render() {
+ const title = brand.name + ' - Dashboard';
+ const description = brand.desc;
+ const { classes } = this.props;
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+Dashboard.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(Dashboard);
diff --git a/front/odiparpack/app/containers/Dashboard/DashboardV2.js b/front/odiparpack/app/containers/Dashboard/DashboardV2.js
new file mode 100644
index 0000000..027dad8
--- /dev/null
+++ b/front/odiparpack/app/containers/Dashboard/DashboardV2.js
@@ -0,0 +1,79 @@
+import React, { PureComponent } from 'react';
+import PropTypes from 'prop-types';
+import brand from 'ba-api/brand';
+import { Helmet } from 'react-helmet';
+import { withStyles } from '@material-ui/core/styles';
+import imgApi from 'ba-api/images';
+import avatarApi from 'ba-api/avatars';
+import {
+ CounterIconsWidget,
+ AreaChartWidget,
+ CarouselWidget,
+ PostCard,
+ AlbumWidget,
+ MapWidget
+} from 'ba-components';
+import { Grid, Divider } from '@material-ui/core';
+import styles from './dashboard-jss';
+
+
+class DashboardV2 extends PureComponent {
+ render() {
+ const title = brand.name + ' - Dashboard Version 2';
+ const description = brand.desc;
+ const { classes } = this.props;
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+DashboardV2.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(DashboardV2);
diff --git a/front/odiparpack/app/containers/Dashboard/dashboard-jss.js b/front/odiparpack/app/containers/Dashboard/dashboard-jss.js
new file mode 100644
index 0000000..adb9bc0
--- /dev/null
+++ b/front/odiparpack/app/containers/Dashboard/dashboard-jss.js
@@ -0,0 +1,30 @@
+const styles = theme => ({
+ root: {
+ flexGrow: 1,
+ },
+ divider: {
+ display: 'block',
+ margin: `${theme.spacing(2)}px 0`,
+ background: 'none'
+ },
+ sliderWrap: {
+ position: 'relative',
+ display: 'block',
+ boxShadow: theme.shadows[1],
+ width: '100%',
+ borderRadius: 4
+ },
+ dividerMini: {
+ margin: `${theme.spacing(1.5)}px 0`,
+ background: 'none'
+ },
+ noPadding: {
+ paddingTop: '0 !important',
+ paddingBottom: '0 !important',
+ [theme.breakpoints.up('sm')]: {
+ padding: '0 !important'
+ }
+ }
+});
+
+export default styles;
diff --git a/front/odiparpack/app/containers/Forms/Autocomplete.js b/front/odiparpack/app/containers/Forms/Autocomplete.js
new file mode 100644
index 0000000..23c6a13
--- /dev/null
+++ b/front/odiparpack/app/containers/Forms/Autocomplete.js
@@ -0,0 +1,91 @@
+import React from 'react';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import { SourceReader, PapperBlock } from 'ba-components';
+import { Grid } from '@material-ui/core';
+import {
+ AutoSuggest,
+ TagSuggestions,
+ SelectSuggestions,
+ SelectSuggestionTags,
+ HighlightSuggest
+} from './demos';
+
+const styles = ({
+ root: {
+ flexGrow: 1,
+ }
+});
+
+class Textbox extends React.Component {
+ render() {
+ const { classes } = this.props;
+ const title = brand.name + ' - Form';
+ const description = brand.desc;
+ const docSrc = 'containers/Forms/demos/';
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+Textbox.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(Textbox);
diff --git a/front/odiparpack/app/containers/Forms/Buttons.js b/front/odiparpack/app/containers/Forms/Buttons.js
new file mode 100644
index 0000000..0935ac2
--- /dev/null
+++ b/front/odiparpack/app/containers/Forms/Buttons.js
@@ -0,0 +1,58 @@
+import React from 'react';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import { withStyles } from '@material-ui/core/styles';
+import { SourceReader, PapperBlock } from 'ba-components';
+import { StandardButtons, FloatingButtons, CustomButtons, ComplexButtons } from './demos';
+
+const styles = ({
+ root: {
+ flexGrow: 1,
+ }
+});
+
+class Buttons extends React.Component {
+ render() {
+ const title = brand.name + ' - Form';
+ const description = brand.desc;
+ const docSrc = 'containers/Forms/demos/';
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+export default withStyles(styles)(Buttons);
diff --git a/front/odiparpack/app/containers/Forms/CheckboxRadio.js b/front/odiparpack/app/containers/Forms/CheckboxRadio.js
new file mode 100644
index 0000000..9833964
--- /dev/null
+++ b/front/odiparpack/app/containers/Forms/CheckboxRadio.js
@@ -0,0 +1,46 @@
+import React from 'react';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import { withStyles } from '@material-ui/core/styles';
+import { SourceReader, PapperBlock } from 'ba-components';
+import { Checkboxes, RadioButton } from './demos';
+
+const styles = ({
+ root: {
+ flexGrow: 1,
+ }
+});
+
+class DateTime extends React.Component {
+ render() {
+ const title = brand.name + ' - Form';
+ const description = brand.desc;
+ const docSrc = 'containers/Forms/demos/';
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+export default withStyles(styles)(DateTime);
diff --git a/front/odiparpack/app/containers/Forms/DateTimePicker.js b/front/odiparpack/app/containers/Forms/DateTimePicker.js
new file mode 100644
index 0000000..b079d2e
--- /dev/null
+++ b/front/odiparpack/app/containers/Forms/DateTimePicker.js
@@ -0,0 +1,52 @@
+import React from 'react';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import { withStyles } from '@material-ui/core/styles';
+import { SourceReader, PapperBlock } from 'ba-components';
+import { DateInput, TimeInput, DateTimeInput } from './demos';
+
+const styles = ({
+ root: {
+ flexGrow: 1,
+ }
+});
+
+class DateTime extends React.Component {
+ render() {
+ const title = brand.name + ' - Form';
+ const description = brand.desc;
+ const docSrc = 'containers/Forms/demos/';
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+export default withStyles(styles)(DateTime);
diff --git a/front/odiparpack/app/containers/Forms/Rating.js b/front/odiparpack/app/containers/Forms/Rating.js
new file mode 100644
index 0000000..5d28bca
--- /dev/null
+++ b/front/odiparpack/app/containers/Forms/Rating.js
@@ -0,0 +1,46 @@
+import React from 'react';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import { withStyles } from '@material-ui/core/styles';
+import { SourceReader, PapperBlock } from 'ba-components';
+import { RatingNormal, RatingCustom } from './demos';
+
+const styles = ({
+ root: {
+ flexGrow: 1,
+ }
+});
+
+class DateTime extends React.Component {
+ render() {
+ const title = brand.name + ' - Form';
+ const description = brand.desc;
+ const docSrc = 'containers/Forms/demos/';
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+export default withStyles(styles)(DateTime);
diff --git a/front/odiparpack/app/containers/Forms/ReduxForm.js b/front/odiparpack/app/containers/Forms/ReduxForm.js
new file mode 100644
index 0000000..d8ef3a7
--- /dev/null
+++ b/front/odiparpack/app/containers/Forms/ReduxForm.js
@@ -0,0 +1,51 @@
+import React from 'react';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import { withStyles } from '@material-ui/core/styles';
+import { SourceReader, PapperBlock } from 'ba-components';
+import { ReduxFormDemo } from './demos';
+
+const styles = ({
+ root: {
+ flexGrow: 1,
+ }
+});
+
+class ReduxForm extends React.Component {
+ state = {
+ valueForm: []
+ }
+
+ showResult(values) {
+ setTimeout(() => {
+ this.setState({ valueForm: values });
+ window.alert(`You submitted:\n\n${this.state.valueForm}`);
+ }, 500); // simulate server latency
+ }
+
+ render() {
+ const title = brand.name + ' - Form';
+ const description = brand.desc;
+ const docSrc = 'containers/Forms/demos/';
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+ this.showResult(values)} />
+
+
+
+
+ );
+ }
+}
+
+export default withStyles(styles)(ReduxForm);
diff --git a/front/odiparpack/app/containers/Forms/Selectbox.js b/front/odiparpack/app/containers/Forms/Selectbox.js
new file mode 100644
index 0000000..4f0c090
--- /dev/null
+++ b/front/odiparpack/app/containers/Forms/Selectbox.js
@@ -0,0 +1,58 @@
+import React from 'react';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import { withStyles } from '@material-ui/core/styles';
+import { SourceReader, PapperBlock } from 'ba-components';
+import { SimpleSelectbox, NativeSelectbox, MultipleSelectbox, ControlledSelectbox } from './demos';
+
+const styles = ({
+ root: {
+ flexGrow: 1,
+ }
+});
+
+class Selectbox extends React.Component {
+ render() {
+ const title = brand.name + ' - Form';
+ const description = brand.desc;
+ const docSrc = 'containers/Forms/demos/';
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+export default withStyles(styles)(Selectbox);
diff --git a/front/odiparpack/app/containers/Forms/SliderRange.js b/front/odiparpack/app/containers/Forms/SliderRange.js
new file mode 100644
index 0000000..779e251
--- /dev/null
+++ b/front/odiparpack/app/containers/Forms/SliderRange.js
@@ -0,0 +1,46 @@
+import React from 'react';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import { withStyles } from '@material-ui/core/styles';
+import { SourceReader, PapperBlock } from 'ba-components';
+import { SliderInput, RangeInput } from './demos';
+
+const styles = ({
+ root: {
+ flexGrow: 1,
+ }
+});
+
+class DateTime extends React.Component {
+ render() {
+ const title = brand.name + ' - Form';
+ const description = brand.desc;
+ const docSrc = 'containers/Forms/demos/';
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+export default withStyles(styles)(DateTime);
diff --git a/front/odiparpack/app/containers/Forms/Switches.js b/front/odiparpack/app/containers/Forms/Switches.js
new file mode 100644
index 0000000..988e0a3
--- /dev/null
+++ b/front/odiparpack/app/containers/Forms/Switches.js
@@ -0,0 +1,40 @@
+import React from 'react';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import { withStyles } from '@material-ui/core/styles';
+import { SourceReader, PapperBlock } from 'ba-components';
+import { SwitchesInput } from './demos';
+
+const styles = ({
+ root: {
+ flexGrow: 1,
+ }
+});
+
+class DateTime extends React.Component {
+ render() {
+ const title = brand.name + ' - Form';
+ const description = brand.desc;
+ const docSrc = 'containers/Forms/demos/';
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+export default withStyles(styles)(DateTime);
diff --git a/front/odiparpack/app/containers/Forms/TextEditor.js b/front/odiparpack/app/containers/Forms/TextEditor.js
new file mode 100644
index 0000000..84a1a82
--- /dev/null
+++ b/front/odiparpack/app/containers/Forms/TextEditor.js
@@ -0,0 +1,40 @@
+import React from 'react';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import { withStyles } from '@material-ui/core/styles';
+import { SourceReader, PapperBlock } from 'ba-components';
+import { Wysiwyg } from './demos';
+
+const styles = ({
+ root: {
+ flexGrow: 1,
+ }
+});
+
+class DateTime extends React.Component {
+ render() {
+ const title = brand.name + ' - Form';
+ const description = brand.desc;
+ const docSrc = 'containers/Forms/demos/';
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+export default withStyles(styles)(DateTime);
diff --git a/front/odiparpack/app/containers/Forms/Textbox.js b/front/odiparpack/app/containers/Forms/Textbox.js
new file mode 100644
index 0000000..3eff0ba
--- /dev/null
+++ b/front/odiparpack/app/containers/Forms/Textbox.js
@@ -0,0 +1,58 @@
+import React from 'react';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import { withStyles } from '@material-ui/core/styles';
+import { SourceReader, PapperBlock } from 'ba-components';
+import { TextFields, TextFieldsLayout, InputAdornments, FormattedInputs } from './demos';
+
+const styles = ({
+ root: {
+ flexGrow: 1,
+ }
+});
+
+class Textbox extends React.Component {
+ render() {
+ const title = brand.name + ' - Form';
+ const description = brand.desc;
+ const docSrc = 'containers/Forms/demos/';
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+export default withStyles(styles)(Textbox);
diff --git a/front/odiparpack/app/containers/Forms/Upload.js b/front/odiparpack/app/containers/Forms/Upload.js
new file mode 100644
index 0000000..99ef3bf
--- /dev/null
+++ b/front/odiparpack/app/containers/Forms/Upload.js
@@ -0,0 +1,52 @@
+import React from 'react';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import { withStyles } from '@material-ui/core/styles';
+import { SourceReader, PapperBlock } from 'ba-components';
+import { UploadInputAll, UploadInputImg, UploadInputBtn } from './demos';
+
+const styles = ({
+ root: {
+ flexGrow: 1,
+ }
+});
+
+class DateTime extends React.Component {
+ render() {
+ const title = brand.name + ' - Form';
+ const description = brand.desc;
+ const docSrc = 'containers/Forms/demos/';
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+export default withStyles(styles)(DateTime);
diff --git a/front/odiparpack/app/containers/Forms/demos/AutoSuggest.js b/front/odiparpack/app/containers/Forms/demos/AutoSuggest.js
new file mode 100644
index 0000000..6d90ed3
--- /dev/null
+++ b/front/odiparpack/app/containers/Forms/demos/AutoSuggest.js
@@ -0,0 +1,184 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import Downshift from 'downshift';
+import { withStyles } from '@material-ui/core/styles';
+import { TextField, Paper, MenuItem } from '@material-ui/core';
+
+const suggestions = [
+ { label: 'Afghanistan' },
+ { label: 'Aland Islands' },
+ { label: 'Albania' },
+ { label: 'Algeria' },
+ { label: 'American Samoa' },
+ { label: 'Andorra' },
+ { label: 'Angola' },
+ { label: 'Anguilla' },
+ { label: 'Antarctica' },
+ { label: 'Antigua and Barbuda' },
+ { label: 'Argentina' },
+ { label: 'Armenia' },
+ { label: 'Aruba' },
+ { label: 'Australia' },
+ { label: 'Austria' },
+ { label: 'Azerbaijan' },
+ { label: 'Bahamas' },
+ { label: 'Bahrain' },
+ { label: 'Bangladesh' },
+ { label: 'Barbados' },
+ { label: 'Belarus' },
+ { label: 'Belgium' },
+ { label: 'Belize' },
+ { label: 'Benin' },
+ { label: 'Bermuda' },
+ { label: 'Bhutan' },
+ { label: 'Bolivia, Plurinational State of' },
+ { label: 'Bonaire, Sint Eustatius and Saba' },
+ { label: 'Bosnia and Herzegovina' },
+ { label: 'Botswana' },
+ { label: 'Bouvet Island' },
+ { label: 'Brazil' },
+ { label: 'British Indian Ocean Territory' },
+ { label: 'Brunei Darussalam' },
+];
+
+function renderInput(inputProps) {
+ const {
+ InputProps,
+ classes,
+ ref,
+ ...other
+ } = inputProps;
+
+ return (
+
+ );
+}
+
+function renderSuggestion({
+ suggestion,
+ index,
+ itemProps,
+ highlightedIndex,
+ selectedItem
+}) {
+ const isHighlighted = highlightedIndex === index;
+ const isSelected = (selectedItem || '').indexOf(suggestion.label) > -1;
+
+ return (
+
+ {suggestion.label}
+
+ );
+}
+
+renderSuggestion.propTypes = {
+ highlightedIndex: PropTypes.number.isRequired,
+ index: PropTypes.number.isRequired,
+ itemProps: PropTypes.object.isRequired,
+ selectedItem: PropTypes.string.isRequired,
+ suggestion: PropTypes.shape({ label: PropTypes.string }).isRequired,
+};
+
+function getSuggestions(inputValue) {
+ let count = 0;
+
+ return suggestions.filter(suggestion => {
+ const keep = (!inputValue || suggestion.label.toLowerCase().indexOf(inputValue.toLowerCase()) !== -1)
+ && count < 5;
+
+ if (keep) {
+ count += 1;
+ }
+
+ return keep;
+ });
+}
+
+const styles = theme => ({
+ root: {
+ flexGrow: 1,
+ height: 100,
+ },
+ container: {
+ flexGrow: 1,
+ position: 'relative',
+ },
+ paper: {
+ position: 'absolute',
+ zIndex: 1,
+ marginTop: theme.spacing(1),
+ left: 0,
+ right: 0,
+ },
+ chip: {
+ margin: `${theme.spacing(0.5)}px ${theme.spacing(0.25)}px`,
+ },
+ inputRoot: {
+ flexWrap: 'wrap',
+ },
+});
+
+function AutoSuggest(props) {
+ const { classes } = props;
+
+ return (
+
+
+ {({
+ getInputProps,
+ getItemProps,
+ isOpen,
+ inputValue,
+ selectedItem,
+ highlightedIndex
+ }) => (
+
+ {renderInput({
+ fullWidth: true,
+ classes,
+ InputProps: getInputProps({
+ placeholder: 'Search a country (start with a)',
+ id: 'integration-downshift-simple',
+ }),
+ })}
+ {isOpen ? (
+
+ {getSuggestions(inputValue).map((suggestion, index) => renderSuggestion({
+ suggestion,
+ index,
+ itemProps: getItemProps({ item: suggestion.label }),
+ highlightedIndex,
+ selectedItem,
+ }),
+ )}
+
+ ) : null}
+
+ )}
+
+
+ );
+}
+
+AutoSuggest.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(AutoSuggest);
diff --git a/front/odiparpack/app/containers/Forms/demos/Checkboxes.js b/front/odiparpack/app/containers/Forms/demos/Checkboxes.js
new file mode 100644
index 0000000..4979e60
--- /dev/null
+++ b/front/odiparpack/app/containers/Forms/demos/Checkboxes.js
@@ -0,0 +1,242 @@
+import React, { Fragment, PureComponent } from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import CheckBoxOutlineBlankIcon from '@material-ui/icons/CheckBoxOutlineBlank';
+import CheckBoxIcon from '@material-ui/icons/CheckBox';
+import Favorite from '@material-ui/icons/Favorite';
+import FavoriteBorder from '@material-ui/icons/FavoriteBorder';
+import { green } from '@material-ui/core/colors';
+
+import {
+ Checkbox,
+ Typography,
+ Grid,
+ FormControl,
+ FormLabel,
+ FormControlLabel,
+ FormHelperText,
+ FormGroup,
+} from '@material-ui/core';
+
+const styles = theme => ({
+ demo: {
+ height: 'auto',
+ },
+ divider: {
+ display: 'block',
+ margin: `${theme.spacing(3)}px 0`,
+ },
+ field: {
+ margin: `${theme.spacing(3)}px 5px`,
+ },
+ root: {
+ color: green[600],
+ '&$checked': {
+ color: green[500],
+ },
+ },
+ checked: {},
+ size: {
+ width: 40,
+ height: 40,
+ },
+ sizeIcon: {
+ fontSize: 20,
+ },
+});
+
+class Checkboxes extends PureComponent {
+ state = {
+ checkedA: true,
+ checkedB: true,
+ checkedF: true,
+ checkedG: true,
+ gilad: true,
+ jason: false,
+ antoine: true,
+ };
+
+ handleChange = name => event => {
+ this.setState({ [name]: event.target.checked });
+ };
+
+ render() {
+ const { classes } = this.props;
+ return (
+
+
+
+ Basic usage
+
+
+
+
+
+
+
+
+
+
+
+ Checkbox with label
+ Checkbox can also be used with a label description thanks to the FormControlLabel component.
+
+
+
+ )}
+ label="Secondary"
+ />
+
+ )}
+ label="Primary"
+ />
+ } label="Uncontrolled" />
+ } label="Disabled" />
+ }
+ label="Disabled"
+ />
+
+ )}
+ label="Indeterminate"
+ />
+
+ )}
+ label="Custom color"
+ />
+ } checkedIcon={ } value="checkedH" />
+ }
+ label="Custom icon"
+ />
+ }
+ checkedIcon={ }
+ value="checkedI"
+ />
+ )}
+ label="Custom size"
+ />
+
+
+
+
+ Checkbox in Form Group
+ FormGroup is a helpful wrapper used to group selection controls components that provides an easier API.
+
+
+ Assign responsibility
+
+
+ )}
+ label="Gilad Gray"
+ />
+
+ )}
+ label="Jason Killian"
+ />
+
+ )}
+ label="Antoine Llorca"
+ />
+
+ Be careful
+
+
+
+
+
+ );
+ }
+}
+
+Checkboxes.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(Checkboxes);
diff --git a/front/odiparpack/app/containers/Forms/demos/ComplexButtons.js b/front/odiparpack/app/containers/Forms/demos/ComplexButtons.js
new file mode 100644
index 0000000..dbeab99
--- /dev/null
+++ b/front/odiparpack/app/containers/Forms/demos/ComplexButtons.js
@@ -0,0 +1,154 @@
+import React, { Fragment, PureComponent } from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import imgApi from 'ba-api/images';
+
+import { Typography, ButtonBase } from '@material-ui/core';
+
+const styles = theme => ({
+ demo: {
+ height: 'auto',
+ },
+ divider: {
+ margin: `${theme.spacing(3)}px 0`,
+ },
+ root: {
+ display: 'flex',
+ flexWrap: 'wrap',
+ minWidth: 300,
+ width: '100%',
+ },
+ image: {
+ position: 'relative',
+ height: 200,
+ [theme.breakpoints.down('xs')]: {
+ width: '100% !important', // Overrides inline-style
+ height: 100,
+ },
+ '&:hover, &$focusVisible': {
+ zIndex: 1,
+ '& $imageBackdrop': {
+ opacity: 0.15,
+ },
+ '& $imageMarked': {
+ opacity: 0,
+ },
+ '& $imageTitle': {
+ border: '4px solid currentColor',
+ },
+ },
+ },
+ focusVisible: {},
+ imageButton: {
+ position: 'absolute',
+ left: 0,
+ right: 0,
+ top: 0,
+ bottom: 0,
+ display: 'flex',
+ alignItems: 'center',
+ justifyContent: 'center',
+ color: theme.palette.common.white,
+ },
+ imageSrc: {
+ position: 'absolute',
+ left: 0,
+ right: 0,
+ top: 0,
+ bottom: 0,
+ backgroundSize: 'cover',
+ backgroundPosition: 'center 40%',
+ },
+ imageBackdrop: {
+ position: 'absolute',
+ left: 0,
+ right: 0,
+ top: 0,
+ bottom: 0,
+ backgroundColor: theme.palette.common.black,
+ opacity: 0.4,
+ transition: theme.transitions.create('opacity'),
+ },
+ imageTitle: {
+ position: 'relative',
+ padding: `${theme.spacing(2)}px ${theme.spacing(4)}px ${theme.spacing(1) + 6}px`,
+ },
+ imageMarked: {
+ height: 3,
+ width: 18,
+ backgroundColor: theme.palette.common.white,
+ position: 'absolute',
+ bottom: -2,
+ left: 'calc(50% - 9px)',
+ transition: theme.transitions.create('opacity'),
+ },
+});
+
+const images = [
+ {
+ url: imgApi[0],
+ title: '330x200',
+ width: '40%',
+ id: '0'
+ },
+ {
+ url: imgApi[3],
+ title: '250x200',
+ width: '30%',
+ id: '1'
+ },
+ {
+ url: imgApi[5],
+ title: '250x200',
+ width: '30%',
+ id: '2'
+ },
+];
+
+class ComplexButtons extends PureComponent {
+ render() {
+ const { classes } = this.props;
+ return (
+
+
+ {images.map(image => (
+
+
+
+
+
+ {image.title}
+
+
+
+
+ ))}
+
+
+ );
+ }
+}
+
+ComplexButtons.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(ComplexButtons);
diff --git a/front/odiparpack/app/containers/Forms/demos/ControlledSelectbox.js b/front/odiparpack/app/containers/Forms/demos/ControlledSelectbox.js
new file mode 100644
index 0000000..8ba1163
--- /dev/null
+++ b/front/odiparpack/app/containers/Forms/demos/ControlledSelectbox.js
@@ -0,0 +1,200 @@
+import React, { Fragment, PureComponent } from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+
+import {
+ Button,
+ Typography,
+ Dialog,
+ DialogActions,
+ DialogContent,
+ DialogTitle,
+ Input,
+ InputLabel,
+ MenuItem,
+ FormControl,
+ Select,
+ Grid,
+} from '@material-ui/core';
+
+const styles = theme => ({
+ demo: {
+ height: 'auto',
+ },
+ divider: {
+ display: 'block',
+ margin: `${theme.spacing(3)}px 0`,
+ },
+ field: {
+ margin: `${theme.spacing(3)}px 5px`,
+ },
+ container: {
+ display: 'flex',
+ flexWrap: 'wrap',
+ },
+ formControl: {
+ margin: theme.spacing(1),
+ minWidth: 120,
+ },
+ button: {
+ display: 'block',
+ marginTop: theme.spacing(2),
+ },
+});
+
+class ControlledSelectbox extends PureComponent {
+ state = {
+ open: false,
+ openRemotely: false,
+ age: '',
+ };
+
+ handleChange = name => event => {
+ this.setState({ [name]: Number(event.target.value) });
+ };
+
+ handleChangeControll = event => {
+ this.setState({ [event.target.name]: event.target.value });
+ };
+
+ handleClickOpen = () => {
+ this.setState({ open: true });
+ };
+
+ handleClickOpenRemot = () => {
+ this.setState({ openRemotely: true });
+ };
+
+ handleClose = () => {
+ this.setState({ open: false });
+ };
+
+ handleOpen = () => {
+ this.setState({ open: true });
+ };
+
+ handleCloseRemot = () => {
+ this.setState({ openRemotely: false });
+ };
+
+ handleOpenRemot = () => {
+ this.setState({ openRemotely: true });
+ };
+
+ render() {
+ const { classes } = this.props;
+ return (
+
+
+
+ With a Dialog
+ While its not encouraged by the Material Design specification, you can use a select inside a dialog.
+
+ Open select dialog
+
+ Fill the form
+
+
+
+
+
+ Cancel
+
+
+ Ok
+
+
+
+
+
+
+ Controlled open Select
+
+
+
+
+
+
+ );
+ }
+}
+
+ControlledSelectbox.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(ControlledSelectbox);
diff --git a/front/odiparpack/app/containers/Forms/demos/CustomButtons.js b/front/odiparpack/app/containers/Forms/demos/CustomButtons.js
new file mode 100644
index 0000000..f1600a0
--- /dev/null
+++ b/front/odiparpack/app/containers/Forms/demos/CustomButtons.js
@@ -0,0 +1,257 @@
+import React, { Fragment, PureComponent } from 'react';
+import PropTypes from 'prop-types';
+import classNames from 'classnames';
+import { withStyles, MuiThemeProvider, createMuiTheme } from '@material-ui/core/styles';
+import AddIcon from '@material-ui/icons/Add';
+import FileUpload from '@material-ui/icons/CloudUpload';
+import { Link } from 'react-router-dom';
+
+import { purple, green } from '@material-ui/core/colors';
+
+import { Typography, Grid, Button, Fab, IconButton } from '@material-ui/core';
+
+const styles = theme => ({
+ demo: {
+ height: 'auto',
+ },
+ divider: {
+ margin: `${theme.spacing(3)}px 0`,
+ },
+ field: {
+ margin: `${theme.spacing(3)}px 0`,
+ },
+ button: {
+ margin: theme.spacing(1),
+ },
+ container: {
+ display: 'flex',
+ flexWrap: 'wrap',
+ },
+ margin: {
+ margin: theme.spacing(1),
+ },
+ cssRoot: {
+ color: theme.palette.getContrastText(purple[500]),
+ backgroundColor: purple[500],
+ '&:hover': {
+ backgroundColor: purple[700],
+ },
+ },
+ bootstrapRoot: {
+ boxShadow: 'none',
+ textTransform: 'none',
+ borderRadius: 4,
+ fontSize: 16,
+ padding: '6px 12px',
+ border: '1px solid',
+ backgroundColor: '#007bff',
+ borderColor: '#007bff',
+ '&:hover': {
+ backgroundColor: '#0069d9',
+ borderColor: '#0062cc',
+ },
+ '&:active': {
+ boxShadow: 'none',
+ backgroundColor: '#0062cc',
+ borderColor: '#005cbf',
+ },
+ '&:focus': {
+ boxShadow: '0 0 0 0.2rem rgba(0,123,255,.5)',
+ },
+ },
+ gradientBtn: {
+ background: 'linear-gradient(45deg, #FE6B8B 30%, #FF8E53 90%)',
+ borderRadius: 3,
+ border: 0,
+ color: 'white',
+ height: 48,
+ padding: '0 30px',
+ boxShadow: '0 3px 5px 2px rgba(255, 105, 135, .30)',
+ },
+ label: {
+ textTransform: 'capitalize',
+ },
+ inputUpload: {
+ display: 'none',
+ },
+});
+
+const theme = createMuiTheme({
+ palette: {
+ primary: green,
+ },
+});
+
+const LinkBtn = React.forwardRef(function LinkBtn(props, ref) { // eslint-disable-line
+ return ; // eslint-disable-line
+});
+
+class CustomButtons extends PureComponent {
+ render() {
+ const { classes } = this.props;
+ const MyLink = React.forwardRef((props, ref) => ); // eslint-disable-line
+ return (
+
+
+
+ Sizes
+
+ Fancy larger or smaller buttons? Use the size or the mini property.
+
+
+
+
+ Small
+
+
+ Medium
+
+
+ Large
+
+
+
+
+ Small
+
+
+ Medium
+
+
+ Large
+
+
+
+
+ Small
+
+
+ Medium
+
+
+ Large
+
+
+
+
+
+
+ Style
+
+ Here is an example of how you can change the main color of a Button.
+
+
+
+ Custom CSS
+
+
+
+ MuiThemeProvider
+
+
+
+ Bootstrap
+
+
+ Gradient Style
+
+
+
+
+ Linked Button
+
+ One common use case is to use the button to trigger a navigation to a new page.
+
+
+
+ Go To Date Time Picker
+
+ Go To Redux Form
+
+
+
+ Upload Button
+
+ This a sample to trigger input files from button
+
+
+
+
+
+ Upload
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+CustomButtons.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(CustomButtons);
diff --git a/front/odiparpack/app/containers/Forms/demos/DateInput.js b/front/odiparpack/app/containers/Forms/demos/DateInput.js
new file mode 100644
index 0000000..fc3397c
--- /dev/null
+++ b/front/odiparpack/app/containers/Forms/demos/DateInput.js
@@ -0,0 +1,193 @@
+import React, { Fragment, PureComponent } from 'react';
+import PropTypes from 'prop-types';
+import { DatePicker, KeyboardDatePicker, MuiPickersUtilsProvider } from '@material-ui/pickers';
+import MomentUtils from '@date-io/moment';
+import DateFnsUtils from '@date-io/date-fns';
+import { withStyles } from '@material-ui/core/styles';
+
+import frLocale from 'date-fns/locale/fr';
+import ruLocale from 'date-fns/locale/ru';
+import enLocale from 'date-fns/locale/en-US';
+
+import { MenuItem, Menu, Icon, IconButton, Typography, Grid } from '@material-ui/core';
+
+const localeMap = {
+ en: enLocale,
+ fr: frLocale,
+ ru: ruLocale,
+};
+
+const styles = theme => ({
+ demo: {
+ height: 240,
+ },
+ divider: {
+ display: 'block',
+ margin: `${theme.spacing(3)}px 0`,
+ },
+ picker: {
+ margin: `${theme.spacing(3)}px 5px`,
+ }
+});
+
+class DateInput extends PureComponent {
+ state = {
+ selectedDate: new Date(),
+ anchorEl: null,
+ currentLocale: 'fr',
+ }
+
+ handleDateChange = (date) => {
+ this.setState({ selectedDate: date });
+ }
+
+ handleMenuOpen = (event) => {
+ event.stopPropagation();
+ this.setState({ anchorEl: event.currentTarget });
+ }
+
+ handleMenuClose = () => {
+ this.setState({ anchorEl: null });
+ };
+
+ selectLocale = (selectedLocale) => {
+ this.setState({
+ currentLocale: selectedLocale,
+ anchorEl: null,
+ });
+ }
+
+ render() {
+ const { selectedDate, currentLocale, anchorEl } = this.state;
+ const { classes } = this.props;
+ const locale = localeMap[currentLocale];
+ return (
+
+
+
+ Basic usage
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Keyboard Input
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Localization
+
+
+
+
+ more_vert
+
+ ),
+ }}
+ />
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+
+DateInput.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(DateInput);
diff --git a/front/odiparpack/app/containers/Forms/demos/DateTimeInput.js b/front/odiparpack/app/containers/Forms/demos/DateTimeInput.js
new file mode 100644
index 0000000..e594013
--- /dev/null
+++ b/front/odiparpack/app/containers/Forms/demos/DateTimeInput.js
@@ -0,0 +1,123 @@
+import React, { Fragment, PureComponent } from 'react';
+import { DateTimePicker, KeyboardDateTimePicker, MuiPickersUtilsProvider } from '@material-ui/pickers';
+import MomentUtils from '@date-io/moment';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import { IconButton, Icon, InputAdornment, Typography, Grid } from '@material-ui/core';
+
+const styles = theme => ({
+ demo: {
+ height: 'auto',
+ },
+ divider: {
+ margin: `${theme.spacing(3)}px 0`,
+ },
+ picker: {
+ margin: `${theme.spacing(3)}px 5px`,
+ }
+});
+
+class DateTimeInput extends PureComponent {
+ state = {
+ selectedDate: new Date(),
+ }
+
+ handleDateChange = (date) => {
+ this.setState({ selectedDate: date });
+ }
+
+ render() {
+ const { selectedDate } = this.state;
+ const { classes } = this.props;
+ return (
+
+
+
+ Basic usage
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Customization
+
+
+ add_alarm }
+ rightArrowIcon={ snooze }
+ InputProps={{
+ endAdornment: (
+
+
+ add_alarm
+
+
+ ),
+ }}
+ />
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+DateTimeInput.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(DateTimeInput);
diff --git a/front/odiparpack/app/containers/Forms/demos/FloatingButtons.js b/front/odiparpack/app/containers/Forms/demos/FloatingButtons.js
new file mode 100644
index 0000000..5fbfa1c
--- /dev/null
+++ b/front/odiparpack/app/containers/Forms/demos/FloatingButtons.js
@@ -0,0 +1,185 @@
+import React, { Fragment, PureComponent } from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import classNames from 'classnames';
+import SwipeableViews from 'react-swipeable-views';
+import AddIcon from '@material-ui/icons/Add';
+import EditIcon from '@material-ui/icons/Create';
+import NavigationIcon from '@material-ui/icons/Navigation';
+import UpIcon from '@material-ui/icons/KeyboardArrowUp';
+import DeleteIcon from '@material-ui/icons/Delete';
+import { green } from '@material-ui/core/colors';
+
+import { Typography, Grid, Fab, AppBar, Tabs, Tab, Zoom, Icon } from '@material-ui/core';
+
+const styles = theme => ({
+ demo: {
+ height: 'auto',
+ },
+ divider: {
+ display: 'block',
+ margin: `${theme.spacing(3)}px 0`,
+ },
+ button: {
+ margin: theme.spacing(1),
+ },
+ root: {
+ backgroundColor: theme.palette.background.paper,
+ [theme.breakpoints.up('sm')]: {
+ width: 500,
+ },
+ margin: '0 auto',
+ position: 'relative',
+ minHeight: 200,
+ },
+ fab: {
+ position: 'absolute',
+ bottom: theme.spacing(2),
+ right: theme.spacing(2),
+ },
+ fabGreen: {
+ color: theme.palette.common.white,
+ backgroundColor: green[500],
+ },
+ extendedIcon: {
+ marginRight: theme.spacing(1),
+ },
+});
+
+function TabContainer(props) {
+ const { children, dir } = props;
+
+ return (
+
+ {children}
+
+ );
+}
+
+TabContainer.propTypes = {
+ children: PropTypes.node.isRequired,
+ dir: PropTypes.string.isRequired,
+};
+
+class FloatingButtons extends PureComponent {
+ state = {
+ value: 0,
+ };
+
+ handleChange = (event, value) => {
+ this.setState({ value });
+ };
+
+ handleChangeIndex = index => {
+ this.setState({ value: index });
+ };
+
+ render() {
+ const { classes, theme } = this.props;
+ const transitionDuration = {
+ enter: theme.transitions.duration.enteringScreen,
+ exit: theme.transitions.duration.leavingScreen,
+ };
+ const fabs = [
+ {
+ color: 'primary',
+ className: classes.fab,
+ icon: ,
+ },
+ {
+ color: 'secondary',
+ className: classes.fab,
+ icon: ,
+ },
+ {
+ color: 'inherit',
+ className: classNames(classes.fab, classes.fabGreen),
+ icon: ,
+ },
+ ];
+
+ return (
+
+
+
+ Floating Action Buttons
+
+ A floating action button represents the primary action in an application.
+
+
+
+
+
+ edit_icon
+
+
+
+ Extended
+
+
+
+
+
+
+ Floating BUtton in Tab
+
+ A floating action button that spans multiple lateral screens (such as tabbed screens) should briefly disappear, then reappear if its action changes.
+
+
+
+
+
+
+
+
+
+
+ Item One
+ Item Two
+ Item Three
+
+ {fabs.map((fab, index) => (
+
+
+ {fab.icon}
+
+
+ ))}
+
+
+
+
+ );
+ }
+}
+
+FloatingButtons.propTypes = {
+ classes: PropTypes.object.isRequired,
+ theme: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles, { withTheme: true })(FloatingButtons);
diff --git a/front/odiparpack/app/containers/Forms/demos/FormattedInputs.js b/front/odiparpack/app/containers/Forms/demos/FormattedInputs.js
new file mode 100644
index 0000000..9fbe9cd
--- /dev/null
+++ b/front/odiparpack/app/containers/Forms/demos/FormattedInputs.js
@@ -0,0 +1,109 @@
+import React from 'react';
+import MaskedInput from 'react-text-mask';
+import NumberFormat from 'react-number-format';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import { Input, InputLabel, TextField, FormControl } from '@material-ui/core';
+
+const styles = theme => ({
+ container: {
+ display: 'flex',
+ flexWrap: 'wrap',
+ },
+ formControl: {
+ margin: theme.spacing(3),
+ },
+});
+
+function TextMaskCustom(props) {
+ const { inputRef, ...other } = props;
+
+ return (
+ {
+ inputRef(ref ? ref.inputElement : null);
+ }}
+ mask={['(', /[1-9]/, /\d/, /\d/, ')', ' ', /\d/, /\d/, /\d/, '-', /\d/, /\d/, /\d/, /\d/]}
+ placeholderChar={'\u2000'}
+ showMask
+ />
+ );
+}
+
+TextMaskCustom.propTypes = {
+ inputRef: PropTypes.func.isRequired,
+};
+
+function NumberFormatCustom(props) {
+ const { inputRef, onChange, ...other } = props;
+
+ return (
+ {
+ onChange({
+ target: {
+ value: values.value,
+ },
+ });
+ }}
+ thousandSeparator
+ prefix="$"
+ />
+ );
+}
+
+NumberFormatCustom.propTypes = {
+ inputRef: PropTypes.func.isRequired,
+ onChange: PropTypes.func.isRequired,
+};
+
+class FormattedInputs extends React.Component {
+ state = {
+ textmask: '(1 ) - ',
+ numberformat: '1320',
+ };
+
+ handleChange = name => event => {
+ this.setState({
+ [name]: event.target.value,
+ });
+ };
+
+ render() {
+ const { classes } = this.props;
+ const { textmask, numberformat } = this.state;
+
+ return (
+
+
+ react-text-mask
+
+
+
+
+ );
+ }
+}
+
+FormattedInputs.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(FormattedInputs);
diff --git a/front/odiparpack/app/containers/Forms/demos/HighlightSuggest.js b/front/odiparpack/app/containers/Forms/demos/HighlightSuggest.js
new file mode 100644
index 0000000..ee13fd7
--- /dev/null
+++ b/front/odiparpack/app/containers/Forms/demos/HighlightSuggest.js
@@ -0,0 +1,198 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import Autosuggest from 'react-autosuggest';
+import match from 'autosuggest-highlight/match';
+import parse from 'autosuggest-highlight/parse';
+import { withStyles } from '@material-ui/core/styles';
+
+import { TextField, Paper, MenuItem } from '@material-ui/core';
+
+const suggestions = [
+ { label: 'Afghanistan' },
+ { label: 'Aland Islands' },
+ { label: 'Albania' },
+ { label: 'Algeria' },
+ { label: 'American Samoa' },
+ { label: 'Andorra' },
+ { label: 'Angola' },
+ { label: 'Anguilla' },
+ { label: 'Antarctica' },
+ { label: 'Antigua and Barbuda' },
+ { label: 'Argentina' },
+ { label: 'Armenia' },
+ { label: 'Aruba' },
+ { label: 'Australia' },
+ { label: 'Austria' },
+ { label: 'Azerbaijan' },
+ { label: 'Bahamas' },
+ { label: 'Bahrain' },
+ { label: 'Bangladesh' },
+ { label: 'Barbados' },
+ { label: 'Belarus' },
+ { label: 'Belgium' },
+ { label: 'Belize' },
+ { label: 'Benin' },
+ { label: 'Bermuda' },
+ { label: 'Bhutan' },
+ { label: 'Bolivia, Plurinational State of' },
+ { label: 'Bonaire, Sint Eustatius and Saba' },
+ { label: 'Bosnia and Herzegovina' },
+ { label: 'Botswana' },
+ { label: 'Bouvet Island' },
+ { label: 'Brazil' },
+ { label: 'British Indian Ocean Territory' },
+ { label: 'Brunei Darussalam' },
+];
+
+function renderInput(inputProps) {
+ const { classes, ref, ...other } = inputProps;
+
+ return (
+
+ );
+}
+
+function renderSuggestion(suggestion, { query, isHighlighted }) {
+ const matches = match(suggestion.label, query);
+ const parts = parse(suggestion.label, matches);
+
+ return (
+
+
+ {parts.map((part, index) => (
+ part.highlight ? (
+
+ {part.text}
+
+ ) : (
+
+ {part.text}
+
+ )
+ ))}
+
+
+ );
+}
+
+function renderSuggestionsContainer(options) {
+ const { containerProps, children } = options;
+
+ return (
+
+ {children}
+
+ );
+}
+
+function getSuggestionValue(suggestion) {
+ return suggestion.label;
+}
+
+function getSuggestions(value) {
+ const inputValue = value.trim().toLowerCase();
+ const inputLength = inputValue.length;
+ let count = 0;
+
+ return inputLength === 0
+ ? [] : suggestions.filter(suggestion => {
+ const keep = count < 5 && suggestion.label.toLowerCase().slice(0, inputLength) === inputValue;
+
+ if (keep) {
+ count += 1;
+ }
+
+ return keep;
+ });
+}
+
+const styles = theme => ({
+ container: {
+ flexGrow: 1,
+ position: 'relative',
+ height: 250,
+ },
+ suggestionsContainerOpen: {
+ position: 'absolute',
+ zIndex: 1,
+ marginTop: theme.spacing(1),
+ left: 0,
+ right: 0,
+ },
+ suggestion: {
+ display: 'block',
+ },
+ suggestionsList: {
+ margin: 0,
+ padding: 0,
+ listStyleType: 'none',
+ },
+});
+
+class HighlightSuggest extends React.Component {
+ state = {
+ value: '',
+ suggestions: [],
+ };
+
+ handleSuggestionsFetchRequested = ({ value }) => {
+ this.setState({
+ suggestions: getSuggestions(value),
+ });
+ };
+
+ handleSuggestionsClearRequested = () => {
+ this.setState({
+ suggestions: [],
+ });
+ };
+
+ handleChange = (event, { newValue }) => {
+ this.setState({
+ value: newValue,
+ });
+ };
+
+ render() {
+ const { classes } = this.props;
+
+ return (
+
+ );
+ }
+}
+
+HighlightSuggest.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(HighlightSuggest);
diff --git a/front/odiparpack/app/containers/Forms/demos/InputAdornments.js b/front/odiparpack/app/containers/Forms/demos/InputAdornments.js
new file mode 100644
index 0000000..1d6307e
--- /dev/null
+++ b/front/odiparpack/app/containers/Forms/demos/InputAdornments.js
@@ -0,0 +1,221 @@
+import React, { Fragment, PureComponent } from 'react';
+import PropTypes from 'prop-types';
+import classNames from 'classnames';
+import { withStyles } from '@material-ui/core/styles';
+import Visibility from '@material-ui/icons/Visibility';
+import VisibilityOff from '@material-ui/icons/VisibilityOff';
+import AccountCircle from '@material-ui/icons/AccountCircle';
+
+import {
+ Typography,
+ Grid,
+ IconButton,
+ Input,
+ InputLabel,
+ InputAdornment,
+ FormControl,
+ FormHelperText,
+ TextField,
+ MenuItem,
+} from '@material-ui/core';
+
+const styles = theme => ({
+ demo: {
+ height: 'auto',
+ },
+ divider: {
+ display: 'block',
+ margin: `${theme.spacing(3)}px 0`,
+ },
+ root: {
+ display: 'flex',
+ flexWrap: 'wrap',
+ },
+ margin: {
+ margin: theme.spacing(3),
+ },
+ withoutLabel: {
+ marginTop: theme.spacing(3),
+ },
+ textField: {
+ flexBasis: 200,
+ },
+});
+
+const ranges = [
+ {
+ value: '0-20',
+ label: '0 to 20',
+ },
+ {
+ value: '21-50',
+ label: '21 to 50',
+ },
+ {
+ value: '51-100',
+ label: '51 to 100',
+ },
+];
+
+class InputAdornments extends PureComponent {
+ state = {
+ amount: '',
+ password: '',
+ weight: '',
+ weightRange: '',
+ showPassword: false,
+ };
+
+ handleChange = prop => event => {
+ this.setState({ [prop]: event.target.value });
+ };
+
+ handleMouseDownPassword = event => {
+ event.preventDefault();
+ };
+
+ handleClickShowPassword = () => {
+ this.setState({ showPassword: !this.state.showPassword });
+ };
+
+ render() {
+ const { classes } = this.props;
+ return (
+
+
+
+ Input Adornments
+ TextField is composed of smaller components that you can leverage directly to significantly customize your form inputs.
+
+ Kg,
+ }}
+ />
+ Kg,
+ }}
+ >
+ {ranges.map(option => (
+
+ {option.label}
+
+ ))}
+
+
+ Amount
+ $}
+ />
+
+
+ Kg}
+ inputProps={{
+ 'aria-label': 'Weight',
+ }}
+ />
+ Weight
+
+
+ Password
+
+
+ {this.state.showPassword ? : }
+
+
+ )}
+ />
+
+
+
+
+ With icon
+ Icons can be specified as prepended or appended.
+
+ With a start adornment
+
+
+
+ )}
+ />
+
+
+
+
+ ),
+ }}
+ />
+
+
+
+
+ );
+ }
+}
+
+InputAdornments.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(InputAdornments);
diff --git a/front/odiparpack/app/containers/Forms/demos/MultipleSelectbox.js b/front/odiparpack/app/containers/Forms/demos/MultipleSelectbox.js
new file mode 100644
index 0000000..6609147
--- /dev/null
+++ b/front/odiparpack/app/containers/Forms/demos/MultipleSelectbox.js
@@ -0,0 +1,165 @@
+import React, { Fragment, PureComponent } from 'react';
+import PropTypes from 'prop-types';
+
+import { withStyles } from '@material-ui/core/styles';
+
+import {
+ Input,
+ InputLabel,
+ MenuItem,
+ FormControl,
+ ListItemText,
+ Select,
+ Checkbox,
+ Chip,
+} from '@material-ui/core';
+
+const styles = theme => ({
+ demo: {
+ height: 'auto',
+ },
+ divider: {
+ margin: `${theme.spacing(3)}px 0`,
+ },
+ field: {
+ margin: `${theme.spacing(3)}px 0`,
+ },
+ root: {
+ display: 'flex',
+ flexWrap: 'wrap',
+ },
+ formControl: {
+ margin: theme.spacing(1),
+ minWidth: 120,
+ maxWidth: 300,
+ },
+ chips: {
+ display: 'flex',
+ flexWrap: 'wrap',
+ },
+ chip: {
+ margin: theme.spacing(0.25),
+ },
+});
+
+const ITEM_HEIGHT = 48;
+const ITEM_PADDING_TOP = 8;
+const MenuProps = {
+ PaperProps: {
+ style: {
+ maxHeight: (ITEM_HEIGHT * 4.5) + ITEM_PADDING_TOP,
+ width: 250,
+ },
+ },
+};
+
+const names = [
+ 'Oliver Hansen',
+ 'Van Henry',
+ 'April Tucker',
+ 'Ralph Hubbard',
+ 'Omar Alexander',
+ 'Carlos Abbott',
+ 'Miriam Wagner',
+ 'Bradley Wilkerson',
+ 'Virginia Andrews',
+ 'Kelly Snyder',
+];
+
+class MultipleSelectbox extends PureComponent {
+ state = {
+ name: [],
+ };
+
+ handleChange = event => {
+ this.setState({ name: event.target.value });
+ };
+
+ render() {
+ const { classes, theme } = this.props;
+ return (
+
+
+ Name
+ }
+ MenuProps={MenuProps}
+ >
+ {names.map(name => (
+
+ {name}
+
+ ))}
+
+
+
+ Tag
+ }
+ renderValue={selected => selected.join(', ')}
+ MenuProps={MenuProps}
+ >
+ {names.map(name => (
+
+ -1} />
+
+
+ ))}
+
+
+
+ Chip
+ }
+ renderValue={selected => (
+
+ {selected.map(value => )}
+
+ )}
+ MenuProps={MenuProps}
+ >
+ {names.map(name => (
+
+ {name}
+
+ ))}
+
+
+
+ );
+ }
+}
+
+MultipleSelectbox.propTypes = {
+ classes: PropTypes.object.isRequired,
+ theme: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles, { withTheme: true })(MultipleSelectbox);
diff --git a/front/odiparpack/app/containers/Forms/demos/NativeSelectbox.js b/front/odiparpack/app/containers/Forms/demos/NativeSelectbox.js
new file mode 100644
index 0000000..a0e3c4d
--- /dev/null
+++ b/front/odiparpack/app/containers/Forms/demos/NativeSelectbox.js
@@ -0,0 +1,153 @@
+import React, { Fragment, PureComponent } from 'react';
+import PropTypes from 'prop-types';
+
+import { withStyles } from '@material-ui/core/styles';
+
+import { Input, InputLabel, FormControl, FormHelperText, Select } from '@material-ui/core';
+
+const styles = theme => ({
+ demo: {
+ height: 'auto',
+ },
+ divider: {
+ display: 'block',
+ margin: `${theme.spacing(3)}px 0`,
+ },
+ field: {
+ margin: `${theme.spacing(3)}px 5px`,
+ },
+ root: {
+ display: 'flex',
+ flexWrap: 'wrap',
+ },
+ formControl: {
+ margin: theme.spacing(1),
+ minWidth: 120,
+ },
+ selectEmpty: {
+ marginTop: theme.spacing(2),
+ },
+});
+
+class NativeSelectbox extends PureComponent {
+ state = {
+ age: '',
+ name: 'hai',
+ };
+
+ handleChange = name => event => {
+ this.setState({ [name]: event.target.value });
+ };
+
+ render() {
+ const { classes } = this.props;
+ return (
+
+
+ Age
+
+
+ Ten
+ Twenty
+ Thirty
+
+
+
+ Age
+ }
+ >
+
+ Ten
+ Twenty
+ Thirty
+
+ Some important helper text
+
+
+
+ None
+ Ten
+ Twenty
+ Thirty
+
+ Without label
+
+
+ Name
+ }
+ >
+
+
+ Hai
+
+
+ Olivier
+ Kevin
+
+
+ Disabled
+
+
+ Name
+ }
+ >
+
+
+ Hai
+
+
+ Olivier
+ Kevin
+
+
+ Error
+
+
+ Name
+
+ Alignment with an input
+
+
+ Name
+ }>
+
+ Ten
+ Twenty
+ Thirty
+
+ Uncontrolled
+
+
+ );
+ }
+}
+
+NativeSelectbox.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(NativeSelectbox);
diff --git a/front/odiparpack/app/containers/Forms/demos/RadioButton.js b/front/odiparpack/app/containers/Forms/demos/RadioButton.js
new file mode 100644
index 0000000..c378d96
--- /dev/null
+++ b/front/odiparpack/app/containers/Forms/demos/RadioButton.js
@@ -0,0 +1,212 @@
+import React, { Fragment, PureComponent } from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import RadioButtonUncheckedIcon from '@material-ui/icons/RadioButtonUnchecked';
+import RadioButtonCheckedIcon from '@material-ui/icons/RadioButtonChecked';
+import { green } from '@material-ui/core/colors';
+
+import {
+ Radio,
+ RadioGroup,
+ Typography,
+ Grid,
+ FormControl,
+ FormLabel,
+ FormControlLabel,
+ FormHelperText,
+} from '@material-ui/core';
+
+const styles = theme => ({
+ demo: {
+ height: 'auto',
+ },
+ divider: {
+ display: 'block',
+ margin: `${theme.spacing(3)}px 0`,
+ },
+ field: {
+ margin: `${theme.spacing(3)}px 5px`,
+ },
+ root: {
+ color: green[600],
+ '&$checked': {
+ color: green[500],
+ },
+ },
+ formControl: {
+ margin: theme.spacing(3),
+ },
+ group: {
+ margin: `${theme.spacing(1)}px 0`,
+ },
+ checked: {},
+ size: {
+ width: 40,
+ height: 40,
+ },
+ sizeIcon: {
+ fontSize: 20,
+ },
+});
+
+class RadioButton extends PureComponent {
+ state = {
+ value: 'female',
+ selectedValue: 'a',
+ };
+
+ handleChange = event => {
+ this.setState({ value: event.target.value });
+ };
+
+ handleChangeOther = event => {
+ this.setState({ selectedValue: event.target.value });
+ };
+
+ render() {
+ const { classes } = this.props;
+ return (
+
+
+
+ Basic usage
+ Radio buttons should have the most commonly used option selected by default.
+
+
+
+
+ Gender
+
+ } label="Female" />
+ } label="Male" />
+ } label="Other" />
+ }
+ label="(Disabled option)"
+ />
+
+
+
+
+
+ Gender
+
+ } label="Male" />
+ } label="Female" />
+ } label="Other" />
+ }
+ label="(Disabled option)"
+ />
+
+ You can display an error
+
+
+
+
+
+
+
+ Radio without label
+ Radio can also be used standalone, without the wrapper.
+
+
+
+
+ }
+ checkedIcon={ }
+ />
+
+
+
+
+ );
+ }
+}
+
+RadioButton.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(RadioButton);
diff --git a/front/odiparpack/app/containers/Forms/demos/RangeInput.js b/front/odiparpack/app/containers/Forms/demos/RangeInput.js
new file mode 100644
index 0000000..247050e
--- /dev/null
+++ b/front/odiparpack/app/containers/Forms/demos/RangeInput.js
@@ -0,0 +1,92 @@
+import React, { Fragment, PureComponent } from 'react';
+import PropTypes from 'prop-types';
+import InputRange from 'react-input-range';
+import { withStyles } from '@material-ui/core/styles';
+import 'ba-styles/vendors/react-input-range/react-input-range.css';
+
+import { FormControl, Typography, Grid } from '@material-ui/core';
+
+const styles = theme => ({
+ demo: {
+ height: 'auto',
+ },
+ divider: {
+ display: 'block',
+ margin: `${theme.spacing(3)}px 0`,
+ },
+ inputRange: {
+ width: 300,
+ margin: `${theme.spacing(3)}px 5px`,
+ }
+});
+
+class RangeInput extends PureComponent {
+ state = {
+ valueRange: {
+ min: 3,
+ max: 7,
+ },
+ valueRangeLabel: {
+ min: 5,
+ max: 10,
+ },
+ }
+
+ render() {
+ const { classes } = this.props;
+ return (
+
+
+
+ Range Input Basic
+
+
+ this.setState({ valueRange: value })}
+ value={this.state.valueRange}
+ />
+
+
+
+
+ Range with Label
+
+
+ `${value} kg`}
+ value={this.state.valueRangeLabel}
+ onChange={value => this.setState({ valueRangeLabel: value })}
+ />
+
+
+
+
+
+ );
+ }
+}
+
+RangeInput.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(RangeInput);
diff --git a/front/odiparpack/app/containers/Forms/demos/RatingCustom.js b/front/odiparpack/app/containers/Forms/demos/RatingCustom.js
new file mode 100644
index 0000000..002548b
--- /dev/null
+++ b/front/odiparpack/app/containers/Forms/demos/RatingCustom.js
@@ -0,0 +1,176 @@
+import React, { Fragment, PureComponent } from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import { AddCircle, AddCircleOutline, Remove, ThumbUp } from '@material-ui/icons';
+import { Rating } from 'ba-components';
+
+import { green, red, indigo as blue } from '@material-ui/core/colors';
+
+import { FormControl, Typography, Grid, Chip } from '@material-ui/core';
+
+const styles = theme => ({
+ demo: {
+ height: 'auto',
+ },
+ divider: {
+ display: 'block',
+ margin: `${theme.spacing(3)}px 0`,
+ },
+ field: {
+ margin: `${theme.spacing(3)}px 0`,
+ },
+ chip: {
+ margin: theme.spacing(1),
+ fontWeight: 'bold',
+ color: '#FFF',
+ background: red[300]
+ },
+ blue: {
+ color: blue[300]
+ },
+ green: {
+ color: green[500]
+ },
+ red: {
+ color: red[300]
+ },
+ small: {
+ '& button': {
+ width: 72,
+ height: 72,
+ padding: 16
+ },
+ '& svg': {
+ width: 36,
+ height: 36
+ }
+ },
+ medium: {
+ '& button': {
+ width: 96,
+ height: 96,
+ padding: 24
+ },
+ '& svg': {
+ width: 48,
+ height: 48
+ }
+ },
+ large: {
+ '& button': {
+ width: 120,
+ height: 120,
+ padding: 30
+ },
+ '& svg': {
+ width: 60,
+ height: 60
+ }
+ }
+});
+
+class RatingCustom extends PureComponent {
+ state = {
+ rating: 3
+ }
+
+ handleChange = value => {
+ this.setState({ rating: value });
+ }
+
+ render() {
+ const { classes } = this.props;
+ return (
+
+
+
+ Ratting Custom Icon
+
+ this.handleChange(value)}
+ iconFilled={ }
+ iconHovered={ }
+ iconNormal={ }
+ />
+
+
+
+ Show Counter
+
+
+ this.handleChange(value)}
+ iconFilled={ }
+ iconHovered={ }
+ iconNormal={ }
+ tooltipRenderer={(index) => { index } }
+ tooltipPosition="bottom-center"
+ />
+
+
+
+
+
+ Ratting Custom Size
+
+
+ this.handleChange(value)}
+ />
+
+
+ this.handleChange(value)}
+ />
+
+
+ this.handleChange(value)}
+ />
+
+
+
+
+
+ );
+ }
+}
+
+RatingCustom.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(RatingCustom);
diff --git a/front/odiparpack/app/containers/Forms/demos/RatingNormal.js b/front/odiparpack/app/containers/Forms/demos/RatingNormal.js
new file mode 100644
index 0000000..acfb50d
--- /dev/null
+++ b/front/odiparpack/app/containers/Forms/demos/RatingNormal.js
@@ -0,0 +1,92 @@
+import React, { Fragment, PureComponent } from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import { Rating } from 'ba-components';
+
+import { FormControl, Typography, Grid } from '@material-ui/core';
+
+const styles = theme => ({
+ demo: {
+ height: 'auto',
+ },
+ divider: {
+ margin: `${theme.spacing(3)}px 0`,
+ },
+ field: {
+ margin: `${theme.spacing(3)}px 5px`,
+ },
+});
+
+class RatingCustom extends PureComponent {
+ state = {
+ rating: 3
+ }
+
+ handleChange = value => {
+ this.setState({ rating: value });
+ }
+
+ render() {
+ const { classes } = this.props;
+ return (
+
+
+
+ Ratting Normal
+
+ this.handleChange(value)}
+ />
+
+
+
+ Read Only
+
+
+
+
+
+ Disabled
+
+
+
+
+
+
+ );
+ }
+}
+
+RatingCustom.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(RatingCustom);
diff --git a/front/odiparpack/app/containers/Forms/demos/ReduxFormDemo.js b/front/odiparpack/app/containers/Forms/demos/ReduxFormDemo.js
new file mode 100644
index 0000000..32b5d3d
--- /dev/null
+++ b/front/odiparpack/app/containers/Forms/demos/ReduxFormDemo.js
@@ -0,0 +1,229 @@
+import React, { Component } from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import { Field, reduxForm } from 'redux-form/immutable';
+import { bindActionCreators } from 'redux';
+import { connect } from 'react-redux';
+import {
+ CheckboxRedux,
+ SelectRedux,
+ TextFieldRedux,
+ SwitchRedux
+} from 'ba-components/Forms/ReduxFormMUI';
+import { initAction, clearAction } from 'ba-actions/ReduxFormActions';
+
+import {
+ Paper,
+ MenuItem,
+ InputLabel,
+ Grid,
+ Radio,
+ RadioGroup,
+ FormControl,
+ FormLabel,
+ FormControlLabel,
+ Typography,
+ Button,
+} from '@material-ui/core';
+
+const renderRadioGroup = ({ input, ...rest }) => (
+ input.onChange(value)}
+ />
+);
+
+// validation functions
+const required = value => (value == null ? 'Required' : undefined);
+const email = value => (
+ value && !/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i.test(value)
+ ? 'Invalid email'
+ : undefined
+);
+
+const styles = theme => ({
+ root: {
+ flexGrow: 1,
+ padding: 30
+ },
+ field: {
+ width: '100%',
+ marginBottom: 20
+ },
+ fieldBasic: {
+ width: '100%',
+ marginBottom: 20,
+ marginTop: 10
+ },
+ inlineWrap: {
+ display: 'flex',
+ flexDirection: 'row'
+ },
+ buttonInit: {
+ margin: theme.spacing(4),
+ textAlign: 'center'
+ },
+});
+
+const initData = {
+ text: 'Sample Text',
+ email: 'sample@mail.com',
+ radio: 'option1',
+ selection: 'option1',
+ onof: true,
+ checkbox: true,
+ textarea: 'This is default text'
+};
+
+class ReduxFormDemo extends Component {
+ render() {
+ const trueBool = true;
+ const {
+ classes,
+ handleSubmit,
+ pristine,
+ reset,
+ submitting,
+ init,
+ clear
+ } = this.props;
+ return (
+
+
+
+
+
+ Simple Form Example
+
+
+ The delay between when you click (Submit) and when the alert dialog pops up is intentional, to simulate server latency.
+
+
+ init(initData)} color="secondary" type="button">
+ Load Sample Data
+
+ clear()} type="button">
+ Clear Data
+
+
+
+
+
+
+
+ );
+ }
+}
+
+renderRadioGroup.propTypes = {
+ input: PropTypes.object.isRequired,
+};
+
+ReduxFormDemo.propTypes = {
+ classes: PropTypes.object.isRequired,
+ handleSubmit: PropTypes.func.isRequired,
+ reset: PropTypes.func.isRequired,
+ pristine: PropTypes.bool.isRequired,
+ submitting: PropTypes.bool.isRequired,
+ init: PropTypes.func.isRequired,
+ clear: PropTypes.func.isRequired,
+};
+
+const mapDispatchToProps = dispatch => ({
+ init: bindActionCreators(initAction, dispatch),
+ clear: () => dispatch(clearAction),
+});
+
+const ReduxFormMapped = reduxForm({
+ form: 'immutableExample',
+ enableReinitialize: true,
+})(ReduxFormDemo);
+
+const reducer = 'initval';
+const FormInit = connect(
+ state => ({
+ force: state,
+ initialValues: state.getIn([reducer, 'formValues'])
+ }),
+ mapDispatchToProps,
+)(ReduxFormMapped);
+
+export default withStyles(styles)(FormInit);
diff --git a/front/odiparpack/app/containers/Forms/demos/SelectSuggestionTags.js b/front/odiparpack/app/containers/Forms/demos/SelectSuggestionTags.js
new file mode 100644
index 0000000..125fd23
--- /dev/null
+++ b/front/odiparpack/app/containers/Forms/demos/SelectSuggestionTags.js
@@ -0,0 +1,379 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import classNames from 'classnames';
+import Select from 'react-select';
+import { emphasize, makeStyles, useTheme } from '@material-ui/core/styles';
+import Typography from '@material-ui/core/Typography';
+import NoSsr from '@material-ui/core/NoSsr';
+import TextField from '@material-ui/core/TextField';
+import Paper from '@material-ui/core/Paper';
+import Chip from '@material-ui/core/Chip';
+import MenuItem from '@material-ui/core/MenuItem';
+import CancelIcon from '@material-ui/icons/Cancel';
+
+const suggestions = [
+ { label: 'Afghanistan' },
+ { label: 'Aland Islands' },
+ { label: 'Albania' },
+ { label: 'Algeria' },
+ { label: 'American Samoa' },
+ { label: 'Andorra' },
+ { label: 'Angola' },
+ { label: 'Anguilla' },
+ { label: 'Antarctica' },
+ { label: 'Antigua and Barbuda' },
+ { label: 'Argentina' },
+ { label: 'Armenia' },
+ { label: 'Aruba' },
+ { label: 'Australia' },
+ { label: 'Austria' },
+ { label: 'Azerbaijan' },
+ { label: 'Bahamas' },
+ { label: 'Bahrain' },
+ { label: 'Bangladesh' },
+ { label: 'Barbados' },
+ { label: 'Belarus' },
+ { label: 'Belgium' },
+ { label: 'Belize' },
+ { label: 'Benin' },
+ { label: 'Bermuda' },
+ { label: 'Bhutan' },
+ { label: 'Bolivia, Plurinational State of' },
+ { label: 'Bonaire, Sint Eustatius and Saba' },
+ { label: 'Bosnia and Herzegovina' },
+ { label: 'Botswana' },
+ { label: 'Bouvet Island' },
+ { label: 'Brazil' },
+ { label: 'British Indian Ocean Territory' },
+ { label: 'Brunei Darussalam' },
+].map(suggestion => ({
+ value: suggestion.label,
+ label: suggestion.label,
+}));
+
+const useStyles = makeStyles(theme => ({
+ root: {
+ flexGrow: 1,
+ height: 250,
+ },
+ input: {
+ display: 'flex',
+ padding: 0,
+ height: 'auto',
+ },
+ valueContainer: {
+ display: 'flex',
+ flexWrap: 'wrap',
+ flex: 1,
+ alignItems: 'center',
+ overflow: 'hidden',
+ },
+ chip: {
+ margin: theme.spacing(0.5, 0.25),
+ },
+ chipFocused: {
+ backgroundColor: emphasize(
+ theme.palette.type === 'light' ? theme.palette.grey[300] : theme.palette.grey[700],
+ 0.08,
+ ),
+ },
+ noOptionsMessage: {
+ padding: theme.spacing(1, 2),
+ },
+ singleValue: {
+ fontSize: 16,
+ },
+ placeholder: {
+ position: 'absolute',
+ left: 8,
+ bottom: 6,
+ fontSize: 16,
+ },
+ paper: {
+ position: 'absolute',
+ zIndex: 1,
+ marginTop: theme.spacing(1),
+ left: 0,
+ right: 0,
+ },
+}));
+
+function NoOptionsMessage(props) {
+ const { selectProps, innerProps, children } = props;
+ return (
+
+ {children}
+
+ );
+}
+
+NoOptionsMessage.propTypes = {
+ children: PropTypes.node,
+ innerProps: PropTypes.object,
+ selectProps: PropTypes.object.isRequired,
+};
+
+NoOptionsMessage.defaultProps = {
+ children: null,
+ innerProps: null
+};
+
+function inputComponent({ inputRef, ...props }) {
+ return
;
+}
+
+inputComponent.propTypes = {
+ inputRef: PropTypes.oneOfType([PropTypes.func, PropTypes.object]),
+};
+
+inputComponent.defaultProps = {
+ inputRef: undefined
+};
+
+function Control(props) {
+ const {
+ children,
+ innerProps,
+ innerRef,
+ selectProps: { classes, TextFieldProps },
+ } = props;
+
+ return (
+
+ );
+}
+
+Control.propTypes = {
+ children: PropTypes.node,
+ innerProps: PropTypes.object,
+ innerRef: PropTypes.oneOfType([PropTypes.func, PropTypes.object]),
+ selectProps: PropTypes.object.isRequired,
+};
+
+Control.defaultProps = {
+ children: null,
+ innerProps: null,
+ innerRef: undefined
+};
+
+function Option(props) {
+ const {
+ innerRef,
+ isFocused,
+ isSelected,
+ innerProps,
+ children
+ } = props;
+ return (
+
+ {children}
+
+ );
+}
+
+Option.propTypes = {
+ children: PropTypes.node,
+ innerProps: PropTypes.object,
+ innerRef: PropTypes.oneOfType([PropTypes.func, PropTypes.object]),
+ isFocused: PropTypes.bool,
+ isSelected: PropTypes.bool,
+};
+
+Option.defaultProps = {
+ children: null,
+ innerProps: null,
+ innerRef: undefined,
+ isFocused: false,
+ isSelected: false
+};
+
+function Placeholder(props) {
+ const { selectProps, innerProps, children } = props;
+ return (
+
+ {children}
+
+ );
+}
+
+Placeholder.propTypes = {
+ children: PropTypes.node,
+ innerProps: PropTypes.object,
+ selectProps: PropTypes.object.isRequired,
+};
+
+Placeholder.defaultProps = {
+ children: null,
+ innerProps: null,
+};
+
+function SingleValue(props) {
+ const { selectProps, children, innerProps } = props;
+ return (
+
+ {children}
+
+ );
+}
+
+SingleValue.propTypes = {
+ children: PropTypes.node,
+ innerProps: PropTypes.object,
+ selectProps: PropTypes.object.isRequired,
+};
+
+SingleValue.defaultProps = {
+ children: null,
+ innerProps: null,
+};
+
+function ValueContainer(props) {
+ const { selectProps, children } = props;
+ return {children}
;
+}
+
+ValueContainer.propTypes = {
+ children: PropTypes.node,
+ selectProps: PropTypes.object.isRequired,
+};
+
+ValueContainer.defaultProps = {
+ children: null,
+};
+
+function MultiValue(props) {
+ const {
+ children,
+ selectProps,
+ removeProps,
+ isFocused
+ } = props;
+ return (
+ }
+ />
+ );
+}
+
+MultiValue.propTypes = {
+ children: PropTypes.node,
+ isFocused: PropTypes.bool,
+ removeProps: PropTypes.object.isRequired,
+ selectProps: PropTypes.object.isRequired,
+};
+
+MultiValue.defaultProps = {
+ children: null,
+ isFocused: false,
+};
+
+function Menu(props) {
+ const { selectProps, innerProps, children } = props;
+ return (
+
+ {children}
+
+ );
+}
+
+Menu.propTypes = {
+ children: PropTypes.node,
+ innerProps: PropTypes.object,
+ selectProps: PropTypes.object,
+};
+
+Menu.defaultProps = {
+ children: null,
+ innerProps: null,
+ selectProps: null,
+};
+
+const components = {
+ Control,
+ Menu,
+ MultiValue,
+ NoOptionsMessage,
+ Option,
+ Placeholder,
+ SingleValue,
+ ValueContainer,
+};
+
+export default function SelectSuggestions() {
+ const classes = useStyles();
+ const theme = useTheme();
+ const [multi, setMulti] = React.useState(null);
+
+ function handleChangeMulti(value) {
+ setMulti(value);
+ }
+
+ const selectStyles = {
+ input: base => ({
+ ...base,
+ color: theme.palette.text.primary,
+ '& input': {
+ font: 'inherit',
+ },
+ }),
+ };
+
+ return (
+
+
+
+
+
+ );
+}
diff --git a/front/odiparpack/app/containers/Forms/demos/SelectSuggestions.js b/front/odiparpack/app/containers/Forms/demos/SelectSuggestions.js
new file mode 100644
index 0000000..2986aff
--- /dev/null
+++ b/front/odiparpack/app/containers/Forms/demos/SelectSuggestions.js
@@ -0,0 +1,378 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import classNames from 'classnames';
+import Select from 'react-select';
+import { emphasize, makeStyles, useTheme } from '@material-ui/core/styles';
+import Typography from '@material-ui/core/Typography';
+import NoSsr from '@material-ui/core/NoSsr';
+import TextField from '@material-ui/core/TextField';
+import Paper from '@material-ui/core/Paper';
+import Chip from '@material-ui/core/Chip';
+import MenuItem from '@material-ui/core/MenuItem';
+import CancelIcon from '@material-ui/icons/Cancel';
+
+const suggestions = [
+ { label: 'Afghanistan' },
+ { label: 'Aland Islands' },
+ { label: 'Albania' },
+ { label: 'Algeria' },
+ { label: 'American Samoa' },
+ { label: 'Andorra' },
+ { label: 'Angola' },
+ { label: 'Anguilla' },
+ { label: 'Antarctica' },
+ { label: 'Antigua and Barbuda' },
+ { label: 'Argentina' },
+ { label: 'Armenia' },
+ { label: 'Aruba' },
+ { label: 'Australia' },
+ { label: 'Austria' },
+ { label: 'Azerbaijan' },
+ { label: 'Bahamas' },
+ { label: 'Bahrain' },
+ { label: 'Bangladesh' },
+ { label: 'Barbados' },
+ { label: 'Belarus' },
+ { label: 'Belgium' },
+ { label: 'Belize' },
+ { label: 'Benin' },
+ { label: 'Bermuda' },
+ { label: 'Bhutan' },
+ { label: 'Bolivia, Plurinational State of' },
+ { label: 'Bonaire, Sint Eustatius and Saba' },
+ { label: 'Bosnia and Herzegovina' },
+ { label: 'Botswana' },
+ { label: 'Bouvet Island' },
+ { label: 'Brazil' },
+ { label: 'British Indian Ocean Territory' },
+ { label: 'Brunei Darussalam' },
+].map(suggestion => ({
+ value: suggestion.label,
+ label: suggestion.label,
+}));
+
+const useStyles = makeStyles(theme => ({
+ root: {
+ flexGrow: 1,
+ height: 250,
+ },
+ input: {
+ display: 'flex',
+ padding: 0,
+ height: 'auto',
+ },
+ valueContainer: {
+ display: 'flex',
+ flexWrap: 'wrap',
+ flex: 1,
+ alignItems: 'center',
+ overflow: 'hidden',
+ },
+ chip: {
+ margin: theme.spacing(0.5, 0.25),
+ },
+ chipFocused: {
+ backgroundColor: emphasize(
+ theme.palette.type === 'light' ? theme.palette.grey[300] : theme.palette.grey[700],
+ 0.08,
+ ),
+ },
+ noOptionsMessage: {
+ padding: theme.spacing(1, 2),
+ },
+ singleValue: {
+ fontSize: 16,
+ },
+ placeholder: {
+ position: 'absolute',
+ left: 8,
+ bottom: 6,
+ fontSize: 16,
+ },
+ paper: {
+ position: 'absolute',
+ zIndex: 1,
+ marginTop: theme.spacing(1),
+ left: 0,
+ right: 0,
+ },
+}));
+
+function NoOptionsMessage(props) {
+ const { selectProps, innerProps, children } = props;
+ return (
+
+ {children}
+
+ );
+}
+
+NoOptionsMessage.propTypes = {
+ children: PropTypes.node,
+ innerProps: PropTypes.object,
+ selectProps: PropTypes.object.isRequired,
+};
+
+NoOptionsMessage.defaultProps = {
+ children: null,
+ innerProps: null
+};
+
+function inputComponent({ inputRef, ...props }) {
+ return
;
+}
+
+inputComponent.propTypes = {
+ inputRef: PropTypes.oneOfType([PropTypes.func, PropTypes.object]),
+};
+
+inputComponent.defaultProps = {
+ inputRef: undefined
+};
+
+function Control(props) {
+ const {
+ children,
+ innerProps,
+ innerRef,
+ selectProps: { classes, TextFieldProps },
+ } = props;
+
+ return (
+
+ );
+}
+
+Control.propTypes = {
+ children: PropTypes.node,
+ innerProps: PropTypes.object,
+ innerRef: PropTypes.oneOfType([PropTypes.func, PropTypes.object]),
+ selectProps: PropTypes.object.isRequired,
+};
+
+Control.defaultProps = {
+ children: null,
+ innerProps: null,
+ innerRef: undefined
+};
+
+function Option(props) {
+ const {
+ innerRef,
+ isFocused,
+ isSelected,
+ innerProps,
+ children
+ } = props;
+ return (
+
+ {children}
+
+ );
+}
+
+Option.propTypes = {
+ children: PropTypes.node,
+ innerProps: PropTypes.object,
+ innerRef: PropTypes.oneOfType([PropTypes.func, PropTypes.object]),
+ isFocused: PropTypes.bool,
+ isSelected: PropTypes.bool,
+};
+
+Option.defaultProps = {
+ children: null,
+ innerProps: null,
+ innerRef: undefined,
+ isFocused: false,
+ isSelected: false
+};
+
+function Placeholder(props) {
+ const { selectProps, innerProps, children } = props;
+ return (
+
+ {children}
+
+ );
+}
+
+Placeholder.propTypes = {
+ children: PropTypes.node,
+ innerProps: PropTypes.object,
+ selectProps: PropTypes.object.isRequired,
+};
+
+Placeholder.defaultProps = {
+ children: null,
+ innerProps: null,
+};
+
+function SingleValue(props) {
+ const { selectProps, children, innerProps } = props;
+ return (
+
+ {children}
+
+ );
+}
+
+SingleValue.propTypes = {
+ children: PropTypes.node,
+ innerProps: PropTypes.object,
+ selectProps: PropTypes.object.isRequired,
+};
+
+SingleValue.defaultProps = {
+ children: null,
+ innerProps: null,
+};
+
+function ValueContainer(props) {
+ const { selectProps, children } = props;
+ return {children}
;
+}
+
+ValueContainer.propTypes = {
+ children: PropTypes.node,
+ selectProps: PropTypes.object.isRequired,
+};
+
+ValueContainer.defaultProps = {
+ children: null,
+};
+
+function MultiValue(props) {
+ const {
+ children,
+ selectProps,
+ removeProps,
+ isFocused
+ } = props;
+ return (
+ }
+ />
+ );
+}
+
+MultiValue.propTypes = {
+ children: PropTypes.node,
+ isFocused: PropTypes.bool,
+ removeProps: PropTypes.object.isRequired,
+ selectProps: PropTypes.object.isRequired,
+};
+
+MultiValue.defaultProps = {
+ children: null,
+ isFocused: false,
+};
+
+function Menu(props) {
+ const { selectProps, innerProps, children } = props;
+ return (
+
+ {children}
+
+ );
+}
+
+Menu.propTypes = {
+ children: PropTypes.node,
+ innerProps: PropTypes.object,
+ selectProps: PropTypes.object,
+};
+
+Menu.defaultProps = {
+ children: null,
+ innerProps: null,
+ selectProps: null,
+};
+
+const components = {
+ Control,
+ Menu,
+ MultiValue,
+ NoOptionsMessage,
+ Option,
+ Placeholder,
+ SingleValue,
+ ValueContainer,
+};
+
+export default function SelectSuggestions() {
+ const classes = useStyles();
+ const theme = useTheme();
+ const [single, setSingle] = React.useState(null);
+
+ function handleChangeSingle(value) {
+ setSingle(value);
+ }
+
+ const selectStyles = {
+ input: base => ({
+ ...base,
+ color: theme.palette.text.primary,
+ '& input': {
+ font: 'inherit',
+ },
+ }),
+ };
+
+ return (
+
+
+
+
+
+ );
+}
diff --git a/front/odiparpack/app/containers/Forms/demos/SimpleSelectbox.js b/front/odiparpack/app/containers/Forms/demos/SimpleSelectbox.js
new file mode 100644
index 0000000..eb7bd0a
--- /dev/null
+++ b/front/odiparpack/app/containers/Forms/demos/SimpleSelectbox.js
@@ -0,0 +1,180 @@
+import React, { Fragment, PureComponent } from 'react';
+import PropTypes from 'prop-types';
+
+import { withStyles } from '@material-ui/core/styles';
+
+import { Input, InputLabel, MenuItem, FormControl, FormHelperText, Select } from '@material-ui/core';
+
+const styles = theme => ({
+ demo: {
+ height: 'auto',
+ },
+ divider: {
+ display: 'block',
+ margin: `${theme.spacing(3)}px 0`,
+ },
+ field: {
+ margin: `${theme.spacing(3)}px 5px`,
+ },
+ root: {
+ display: 'flex',
+ flexWrap: 'wrap',
+ },
+ formControl: {
+ margin: theme.spacing(1),
+ minWidth: 120,
+ },
+ selectEmpty: {
+ marginTop: theme.spacing(2),
+ },
+});
+
+class SimpleSelectbox extends PureComponent {
+ state = {
+ age: '',
+ name: 'hai',
+ };
+
+ handleChange = event => {
+ this.setState({ [event.target.name]: event.target.value });
+ };
+
+ render() {
+ const { classes } = this.props;
+ return (
+
+
+
+ );
+ }
+}
+
+SimpleSelectbox.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(SimpleSelectbox);
diff --git a/front/odiparpack/app/containers/Forms/demos/SliderInput.js b/front/odiparpack/app/containers/Forms/demos/SliderInput.js
new file mode 100644
index 0000000..d0513ed
--- /dev/null
+++ b/front/odiparpack/app/containers/Forms/demos/SliderInput.js
@@ -0,0 +1,104 @@
+import React, { Fragment, PureComponent } from 'react';
+import PropTypes from 'prop-types';
+import InputRange from 'react-input-range';
+import { withStyles } from '@material-ui/core/styles';
+import 'ba-styles/vendors/react-input-range/react-input-range.css';
+
+import { FormControl, Typography, Grid } from '@material-ui/core';
+
+const styles = theme => ({
+ demo: {
+ height: 'auto',
+ },
+ divider: {
+ display: 'block',
+ margin: `${theme.spacing(3)}px 0`,
+ },
+ inputRange: {
+ width: 200,
+ margin: `${theme.spacing(3)}px 5px`,
+ }
+});
+
+class SliderInput extends PureComponent {
+ state = {
+ value: 10,
+ valueDisabled: 5,
+ valueDecimal: 16,
+ }
+
+ render() {
+ const { classes } = this.props;
+ return (
+
+
+
+ Slider Input Basic
+
+
+ this.setState({ value })}
+ />
+
+
+
+
+ Slider Input Disabled
+
+
+ this.setState({ valueDisabled: value })}
+ />
+
+
+
+
+ Formated Value
+
+
+ value.toFixed(2)}
+ value={this.state.valueDecimal}
+ onChange={value => this.setState({ valueDecimal: value })}
+ />
+
+
+
+
+
+ );
+ }
+}
+
+SliderInput.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(SliderInput);
diff --git a/front/odiparpack/app/containers/Forms/demos/StandardButtons.js b/front/odiparpack/app/containers/Forms/demos/StandardButtons.js
new file mode 100644
index 0000000..d88c004
--- /dev/null
+++ b/front/odiparpack/app/containers/Forms/demos/StandardButtons.js
@@ -0,0 +1,223 @@
+import React, { Fragment, PureComponent } from 'react';
+import PropTypes from 'prop-types';
+import classNames from 'classnames';
+import { withStyles } from '@material-ui/core/styles';
+import DeleteIcon from '@material-ui/icons/Delete';
+import AddShoppingCartIcon from '@material-ui/icons/AddShoppingCart';
+import PhotoCamera from '@material-ui/icons/PhotoCamera';
+import FileUpload from '@material-ui/icons/CloudUpload';
+import KeyboardVoice from '@material-ui/icons/KeyboardVoice';
+import Save from '@material-ui/icons/Save';
+
+import { Button, Typography, Grid, Icon, IconButton } from '@material-ui/core';
+
+const styles = theme => ({
+ demo: {
+ height: 'auto',
+ },
+ divider: {
+ display: 'block',
+ margin: `${theme.spacing(3)}px 0`,
+ },
+ field: {
+ margin: `${theme.spacing(3)}px 5px`,
+ },
+ button: {
+ margin: theme.spacing(1),
+ },
+ inputUpload: {
+ display: 'none',
+ },
+ leftIcon: {
+ marginRight: theme.spacing(1),
+ },
+ rightIcon: {
+ marginLeft: theme.spacing(1),
+ },
+ iconSmall: {
+ fontSize: 20,
+ },
+});
+
+function doSomething(event) {
+ alert(event.currentTarget.getAttribute('data-something'));
+}
+
+class StandardButtons extends PureComponent {
+ render() {
+ const { classes } = this.props;
+ return (
+
+
+
+ Flat Button
+
+ Flat buttons are text-only buttons. They may be used in dialogs, toolbars, or inline. They do not lift, but fill with color on press.
+
+ Default
+
+ Primary
+
+
+ Secondary
+
+
+ Disabled
+
+
+ Link
+
+
+ Link disabled
+
+
+ Does something
+
+
+
+ Raised Button
+
+ Raised buttons are rectangular-shaped buttons. They may be used inline. They lift and display ink reactions on press.
+
+
+ Default
+
+
+ Primary
+
+
+ Secondary
+
+
+ Disabled
+
+
+
+
+ Upload
+
+
+
+
+ Outline Button
+
+ Default
+
+
+ Primary
+
+
+ Secondary
+
+
+ Disabled
+
+
+ Link
+
+
+
+
+ Upload
+
+
+
+
+ Icon Button
+
+ Icon buttons are commonly found in app bars and toolbars.
+
+
+
+
+
+
+
+
+ alarm
+
+
+
+
+
+
+
+
+
+
+
+
+ Icon Raised Button
+
+ Icon buttons are commonly found in app bars and toolbars.
+
+
+ Delete
+
+
+
+ Send
+ send
+
+
+ Upload
+
+
+
+
+ Talk
+
+
+
+ Save
+
+
+
+
+ );
+ }
+}
+
+StandardButtons.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(StandardButtons);
diff --git a/front/odiparpack/app/containers/Forms/demos/SwitchesInput.js b/front/odiparpack/app/containers/Forms/demos/SwitchesInput.js
new file mode 100644
index 0000000..3c10803
--- /dev/null
+++ b/front/odiparpack/app/containers/Forms/demos/SwitchesInput.js
@@ -0,0 +1,210 @@
+import React, { Fragment, PureComponent } from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import { green } from '@material-ui/core/colors';
+
+import {
+ Switch,
+ Typography,
+ Grid,
+ FormControl,
+ FormLabel,
+ FormControlLabel,
+ FormGroup,
+ FormHelperText,
+} from '@material-ui/core';
+
+const styles = theme => ({
+ demo: {
+ height: 'auto',
+ },
+ divider: {
+ display: 'block',
+ margin: `${theme.spacing(3)}px 0`,
+ },
+ field: {
+ margin: `${theme.spacing(3)}px 5px`,
+ },
+ formControl: {
+ margin: theme.spacing(3),
+ },
+ group: {
+ margin: `${theme.spacing(1)}px 0`,
+ },
+ switchBase: {
+ color: green[50],
+ '&$checked': {
+ color: green[500],
+ '& + $bar': {
+ backgroundColor: green[500],
+ },
+ },
+ },
+ bar: {},
+ checked: {},
+ size: {
+ width: 40,
+ height: 40,
+ },
+ sizeIcon: {
+ fontSize: 20,
+ },
+});
+
+class RadioButton extends PureComponent {
+ state = {
+ checkedA: true,
+ checkedB: true,
+ checkedF: true,
+ gilad: true,
+ jason: false,
+ antoine: true,
+ };
+
+ handleChange = name => event => {
+ this.setState({ [name]: event.target.checked });
+ };
+
+ render() {
+ const { classes } = this.props;
+ return (
+
+
+
+ Basic usage
+
+
+
+
+
+
+
+
+
+
+ Switch with label
+ Switch can also be used with a label description thanks to the FormControlLabel component.
+
+
+
+ )}
+ label="Secondary"
+ />
+
+ )}
+ label="Primary"
+ />
+ } label="Uncontrolled" />
+ } label="Disabled" />
+ } label="Disabled" />
+
+ )}
+ label="Custom color"
+ />
+
+
+
+
+ Switch in Form Group
+ FormGroup is a helpful wrapper used to group selection controls components that provides an easier API. However, we encourage you to use a Checkbox instead.
+
+
+ Assign responsibility
+
+
+ )}
+ label="Gilad Gray"
+ />
+
+ )}
+ label="Jason Killian"
+ />
+
+ )}
+ label="Antoine Llorca"
+ />
+
+ Be careful
+
+
+
+
+
+ );
+ }
+}
+
+RadioButton.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(RadioButton);
diff --git a/front/odiparpack/app/containers/Forms/demos/TagSuggestions.js b/front/odiparpack/app/containers/Forms/demos/TagSuggestions.js
new file mode 100644
index 0000000..1648fc3
--- /dev/null
+++ b/front/odiparpack/app/containers/Forms/demos/TagSuggestions.js
@@ -0,0 +1,249 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import keycode from 'keycode';
+import Downshift from 'downshift';
+import { withStyles } from '@material-ui/core/styles';
+import { TextField, Paper, MenuItem, Chip } from '@material-ui/core';
+
+const suggestions = [
+ { label: 'Afghanistan' },
+ { label: 'Aland Islands' },
+ { label: 'Albania' },
+ { label: 'Algeria' },
+ { label: 'American Samoa' },
+ { label: 'Andorra' },
+ { label: 'Angola' },
+ { label: 'Anguilla' },
+ { label: 'Antarctica' },
+ { label: 'Antigua and Barbuda' },
+ { label: 'Argentina' },
+ { label: 'Armenia' },
+ { label: 'Aruba' },
+ { label: 'Australia' },
+ { label: 'Austria' },
+ { label: 'Azerbaijan' },
+ { label: 'Bahamas' },
+ { label: 'Bahrain' },
+ { label: 'Bangladesh' },
+ { label: 'Barbados' },
+ { label: 'Belarus' },
+ { label: 'Belgium' },
+ { label: 'Belize' },
+ { label: 'Benin' },
+ { label: 'Bermuda' },
+ { label: 'Bhutan' },
+ { label: 'Bolivia, Plurinational State of' },
+ { label: 'Bonaire, Sint Eustatius and Saba' },
+ { label: 'Bosnia and Herzegovina' },
+ { label: 'Botswana' },
+ { label: 'Bouvet Island' },
+ { label: 'Brazil' },
+ { label: 'British Indian Ocean Territory' },
+ { label: 'Brunei Darussalam' },
+];
+
+function renderInput(inputProps) {
+ const {
+ InputProps,
+ classes,
+ ref,
+ ...other
+ } = inputProps;
+
+ return (
+
+ );
+}
+
+function renderSuggestion({
+ suggestion,
+ index,
+ itemProps,
+ highlightedIndex,
+ selectedItem
+}) {
+ const isHighlighted = highlightedIndex === index;
+ const isSelected = (selectedItem || '').indexOf(suggestion.label) > -1;
+
+ return (
+
+ {suggestion.label}
+
+ );
+}
+
+renderSuggestion.propTypes = {
+ highlightedIndex: PropTypes.number.isRequired,
+ index: PropTypes.number.isRequired,
+ itemProps: PropTypes.object.isRequired,
+ selectedItem: PropTypes.string.isRequired,
+ suggestion: PropTypes.shape({ label: PropTypes.string }).isRequired,
+};
+
+function getSuggestions(inputValue) {
+ let count = 0;
+
+ return suggestions.filter(suggestion => {
+ const keep = (!inputValue || suggestion.label.toLowerCase().indexOf(inputValue.toLowerCase()) !== -1)
+ && count < 5;
+
+ if (keep) {
+ count += 1;
+ }
+
+ return keep;
+ });
+}
+
+class DownshiftMultiple extends React.Component {
+ state = {
+ inputValue: '',
+ selectedItem: [],
+ };
+
+ handleKeyDown = event => {
+ const { inputValue, selectedItem } = this.state;
+ if (selectedItem.length && !inputValue.length && keycode(event) === 'backspace') {
+ this.setState({
+ selectedItem: selectedItem.slice(0, selectedItem.length - 1),
+ });
+ }
+ };
+
+ handleInputChange = event => {
+ this.setState({ inputValue: event.target.value });
+ };
+
+ handleChange = item => {
+ let { selectedItem } = this.state;
+
+ if (selectedItem.indexOf(item) === -1) {
+ selectedItem = [...selectedItem, item];
+ }
+
+ this.setState({
+ inputValue: '',
+ selectedItem,
+ });
+ };
+
+ handleDelete = item => () => {
+ const selectedItem = [...this.state.selectedItem];
+ selectedItem.splice(selectedItem.indexOf(item), 1);
+
+ this.setState({ selectedItem });
+ };
+
+ render() {
+ const { classes } = this.props;
+ const { inputValue, selectedItem } = this.state;
+
+ return (
+
+ {({
+ getInputProps,
+ getItemProps,
+ isOpen,
+ inputValue: inputValue2,
+ selectedItem: selectedItem2,
+ highlightedIndex,
+ }) => (
+
+ {renderInput({
+ fullWidth: true,
+ classes,
+ InputProps: getInputProps({
+ startAdornment: selectedItem.map(item => (
+
+ )),
+ onChange: this.handleInputChange,
+ onKeyDown: this.handleKeyDown,
+ placeholder: 'Select multiple countries',
+ id: 'integration-downshift-multiple',
+ }),
+ })}
+ {isOpen ? (
+
+ {getSuggestions(inputValue2).map((suggestion, index) => renderSuggestion({
+ suggestion,
+ index,
+ itemProps: getItemProps({ item: suggestion.label }),
+ highlightedIndex,
+ selectedItem: selectedItem2,
+ }),
+ )}
+
+ ) : null}
+
+ )}
+
+ );
+ }
+}
+
+DownshiftMultiple.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+const styles = theme => ({
+ root: {
+ flexGrow: 1,
+ height: 100,
+ },
+ container: {
+ flexGrow: 1,
+ position: 'relative',
+ },
+ paper: {
+ position: 'absolute',
+ zIndex: 1,
+ marginTop: theme.spacing(1),
+ left: 0,
+ right: 0,
+ },
+ chip: {
+ margin: `${theme.spacing(0.5)}px ${theme.spacing(0.25)}px`,
+ },
+ inputRoot: {
+ flexWrap: 'wrap',
+ },
+});
+
+function TagSuggestions(props) {
+ const { classes } = props;
+
+ return (
+
+
+
+ );
+}
+
+TagSuggestions.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(TagSuggestions);
diff --git a/front/odiparpack/app/containers/Forms/demos/TextFields.js b/front/odiparpack/app/containers/Forms/demos/TextFields.js
new file mode 100644
index 0000000..b408284
--- /dev/null
+++ b/front/odiparpack/app/containers/Forms/demos/TextFields.js
@@ -0,0 +1,124 @@
+import React, { Fragment, PureComponent } from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import { Typography, Grid, Input, InputLabel, FormControl, FormHelperText } from '@material-ui/core';
+
+const styles = theme => ({
+ demo: {
+ height: 'auto',
+ },
+ divider: {
+ display: 'block',
+ margin: `${theme.spacing(3)}px 0`,
+ },
+ input: {
+ margin: theme.spacing(3),
+ },
+ container: {
+ display: 'flex',
+ flexWrap: 'wrap',
+ },
+ formControl: {
+ margin: theme.spacing(3),
+ },
+});
+
+class TextFields extends PureComponent {
+ state = {
+ name: 'Composed TextField',
+ };
+
+ handleChange = event => {
+ this.setState({ name: event.target.value });
+ };
+
+ render() {
+ const { classes } = this.props;
+ return (
+
+
+
+ Textfield Components
+ TextField is composed of smaller components that you can leverage directly to significantly customize your form inputs.
+
+
+ Name
+
+
+
+ Name
+
+ Some important helper text
+
+
+ Name
+
+ Disabled
+
+
+ Name
+
+ Error
+
+
+
+
+ Input State
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+TextFields.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(TextFields);
diff --git a/front/odiparpack/app/containers/Forms/demos/TextFieldsLayout.js b/front/odiparpack/app/containers/Forms/demos/TextFieldsLayout.js
new file mode 100644
index 0000000..27809f4
--- /dev/null
+++ b/front/odiparpack/app/containers/Forms/demos/TextFieldsLayout.js
@@ -0,0 +1,174 @@
+import React, { Fragment, PureComponent } from 'react';
+import PropTypes from 'prop-types';
+import { withStyles, MuiThemeProvider, createMuiTheme } from '@material-ui/core/styles';
+import { purple, green } from '@material-ui/core/colors';
+
+import { Typography, Grid, Input, InputLabel, TextField, FormControl } from '@material-ui/core';
+
+const styles = theme => ({
+ demo: {
+ height: 'auto',
+ },
+ divider: {
+ display: 'block',
+ margin: `${theme.spacing(3)}px 0`,
+ lineHeight: '24px'
+ },
+ input: {
+ margin: theme.spacing(3),
+ },
+ margin: {
+ margin: theme.spacing(1),
+ },
+ container: {
+ display: 'flex',
+ flexWrap: 'wrap',
+ },
+ textField: {
+ margin: `${theme.spacing(2)}px ${theme.spacing(1)}px`,
+ width: 200,
+ },
+ cssLabel: {
+ '&$cssFocused': {
+ color: purple[500],
+ },
+ },
+ cssFocused: {},
+ cssUnderline: {
+ '&:after': {
+ backgroundColor: purple[500],
+ },
+ },
+ bootstrapRoot: {
+ padding: 0,
+ 'label + &': {
+ marginTop: theme.spacing(3),
+ },
+ },
+ bootstrapInput: {
+ borderRadius: 4,
+ backgroundColor: theme.palette.common.white,
+ border: '1px solid #ced4da',
+ fontSize: 16,
+ padding: '10px 12px',
+ width: 'calc(100% - 24px)',
+ transition: theme.transitions.create(['border-color', 'box-shadow']),
+ '&:focus': {
+ borderColor: '#80bdff',
+ boxShadow: '0 0 0 0.2rem rgba(0,123,255,.25)',
+ },
+ },
+ bootstrapFormLabel: {
+ fontSize: 18,
+ },
+});
+
+const theme = createMuiTheme({
+ palette: {
+ primary: green,
+ },
+});
+
+class TextFields extends PureComponent {
+ render() {
+ const { classes } = this.props;
+ return (
+
+
+
+ Layout
+ TextField, FormControl allow the specification of margin to alter the vertical spacing of inputs. Using none (default) will not apply margins to the FormControl, whereas dense and normal will as well as alter other styles to meet the specification.
+
+
+
+
+
+
+
+ Customized Designs
+ Here is an example of how you can change the main color of an Input.
+
+
+
+ Custom CSS
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+TextFields.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(TextFields);
diff --git a/front/odiparpack/app/containers/Forms/demos/TimeInput.js b/front/odiparpack/app/containers/Forms/demos/TimeInput.js
new file mode 100644
index 0000000..d8ed35b
--- /dev/null
+++ b/front/odiparpack/app/containers/Forms/demos/TimeInput.js
@@ -0,0 +1,124 @@
+import React, { Fragment, PureComponent } from 'react';
+import { TimePicker, KeyboardDatePicker, MuiPickersUtilsProvider } from '@material-ui/pickers';
+import MomentUtils from '@date-io/moment';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import { Typography, Grid, InputAdornment, Icon, IconButton } from '@material-ui/core';
+
+const styles = theme => ({
+ demo: {
+ height: 'auto',
+ },
+ divider: {
+ display: 'block',
+ margin: `${theme.spacing(3)}px 0`,
+ },
+ picker: {
+ margin: `${theme.spacing(3)}px 5px`,
+ }
+});
+
+class TimeInput extends PureComponent {
+ state = {
+ selectedDate: new Date(),
+ }
+
+ handleDateChange = (date) => {
+ this.setState({ selectedDate: date });
+ }
+
+ render() {
+ const { selectedDate } = this.state;
+ const { classes } = this.props;
+ return (
+
+
+
+ Basic usage
+
+ A time picker should adjusts to a user’s preferred time setting, i.e. the 12-hour or 24-hour format.
+
+
+
+
+
+
+
+
+
+
+ Keyboard Input
+
+
+
+
+
+ Custom Icon
+
+
+
+
+ access_time
+
+
+ ),
+ }}
+ />
+
+
+
+
+
+ );
+ }
+}
+
+TimeInput.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(TimeInput);
diff --git a/front/odiparpack/app/containers/Forms/demos/UploadInputAll.js b/front/odiparpack/app/containers/Forms/demos/UploadInputAll.js
new file mode 100644
index 0000000..22ae742
--- /dev/null
+++ b/front/odiparpack/app/containers/Forms/demos/UploadInputAll.js
@@ -0,0 +1,31 @@
+import React, { Fragment } from 'react';
+import { MaterialDropZone } from 'ba-components';
+
+class UploadInputAll extends React.Component {
+ constructor(props) {
+ super(props);
+
+ this.state = {
+ files: [],
+ };
+ }
+
+ render() {
+ const { files } = this.state;
+ return (
+
+
+
+
+
+ );
+ }
+}
+
+export default UploadInputAll;
diff --git a/front/odiparpack/app/containers/Forms/demos/UploadInputBtn.js b/front/odiparpack/app/containers/Forms/demos/UploadInputBtn.js
new file mode 100644
index 0000000..959ee85
--- /dev/null
+++ b/front/odiparpack/app/containers/Forms/demos/UploadInputBtn.js
@@ -0,0 +1,32 @@
+import React, { Fragment } from 'react';
+import { MaterialDropZone } from 'ba-components';
+
+class UploadInputBtn extends React.Component {
+ constructor(props) {
+ super(props);
+
+ this.state = {
+ files: [],
+ };
+ }
+
+ render() {
+ const { files } = this.state;
+ return (
+
+
+
+
+
+ );
+ }
+}
+
+export default UploadInputBtn;
diff --git a/front/odiparpack/app/containers/Forms/demos/UploadInputImg.js b/front/odiparpack/app/containers/Forms/demos/UploadInputImg.js
new file mode 100644
index 0000000..3600f37
--- /dev/null
+++ b/front/odiparpack/app/containers/Forms/demos/UploadInputImg.js
@@ -0,0 +1,32 @@
+import React, { Fragment } from 'react';
+import { MaterialDropZone } from 'ba-components';
+
+class UploadInputImg extends React.Component {
+ constructor(props) {
+ super(props);
+
+ this.state = {
+ files: [],
+ };
+ }
+
+ render() {
+ const { files } = this.state;
+ return (
+
+
+
+
+
+ );
+ }
+}
+
+export default UploadInputImg;
diff --git a/front/odiparpack/app/containers/Forms/demos/Wysiwyg.js b/front/odiparpack/app/containers/Forms/demos/Wysiwyg.js
new file mode 100644
index 0000000..61c64a8
--- /dev/null
+++ b/front/odiparpack/app/containers/Forms/demos/Wysiwyg.js
@@ -0,0 +1,91 @@
+import React, { Fragment, PureComponent } from 'react';
+import { convertFromRaw, EditorState, convertToRaw } from 'draft-js';
+import { Editor } from 'react-draft-wysiwyg';
+import draftToHtml from 'draftjs-to-html';
+import draftToMarkdown from 'draftjs-to-markdown';
+import EditorStyle from 'ba-styles/TextEditor.scss';
+import 'ba-styles/vendors/react-draft-wysiwyg/react-draft-wysiwyg.css';
+
+import { Grid, Typography } from '@material-ui/core';
+
+const content = {
+ blocks: [{
+ key: '637gr',
+ text: 'Lorem ipsum dolor sit amet 😀',
+ type: 'unstyled',
+ depth: 0,
+ inlineStyleRanges: [],
+ entityRanges: [],
+ data: {}
+ }],
+ entityMap: {}
+};
+
+class Wysiwyg extends PureComponent {
+ constructor(props) {
+ super(props);
+ const contentBlock = convertFromRaw(content);
+ if (contentBlock) {
+ const editorState = EditorState.createWithContent(contentBlock);
+ this.state = {
+ editorState,
+ };
+ }
+ }
+
+ onEditorStateChange = editorState => {
+ this.setState({
+ editorState,
+ });
+ };
+
+ render() {
+ const { editorState } = this.state;
+ return (
+
+
+
+
+
+
+ JSON Result :
+
+
+
+ HTML Result :
+
+
+
+ Markdown Result :
+
+
+
+
+ );
+ }
+}
+
+export default Wysiwyg;
diff --git a/front/odiparpack/app/containers/Forms/demos/index.js b/front/odiparpack/app/containers/Forms/demos/index.js
new file mode 100644
index 0000000..8ae709e
--- /dev/null
+++ b/front/odiparpack/app/containers/Forms/demos/index.js
@@ -0,0 +1,44 @@
+// Redux Form
+export ReduxFormDemo from './ReduxFormDemo';
+// Date Time Picker
+export DateInput from './DateInput';
+export TimeInput from './TimeInput';
+export DateTimeInput from './DateTimeInput';
+// Checkbox and Radio
+export Checkboxes from './Checkboxes';
+export RadioButton from './RadioButton';
+// Switches
+export SwitchesInput from './SwitchesInput';
+// Selectbox
+export SimpleSelectbox from './SimpleSelectbox';
+export NativeSelectbox from './NativeSelectbox';
+export MultipleSelectbox from './MultipleSelectbox';
+export ControlledSelectbox from './ControlledSelectbox';
+// Ratting
+export RatingNormal from './RatingNormal';
+export RatingCustom from './RatingCustom';
+// Slide Range
+export SliderInput from './SliderInput';
+export RangeInput from './RangeInput';
+// Buttons
+export StandardButtons from './StandardButtons';
+export FloatingButtons from './FloatingButtons';
+export CustomButtons from './CustomButtons';
+export ComplexButtons from './ComplexButtons';
+// Textfield
+export TextFields from './TextFields';
+export TextFieldsLayout from './TextFieldsLayout';
+export InputAdornments from './InputAdornments';
+export FormattedInputs from './FormattedInputs';
+// Autocomplete
+export AutoSuggest from './AutoSuggest';
+export TagSuggestions from './TagSuggestions';
+export SelectSuggestions from './SelectSuggestions';
+export SelectSuggestionTags from './SelectSuggestionTags';
+export HighlightSuggest from './HighlightSuggest';
+// Text Editor
+export Wysiwyg from './Wysiwyg';
+// Uploader
+export UploadInputAll from './UploadInputAll';
+export UploadInputImg from './UploadInputImg';
+export UploadInputBtn from './UploadInputBtn';
diff --git a/front/odiparpack/app/containers/LanguageProvider/actions.js b/front/odiparpack/app/containers/LanguageProvider/actions.js
new file mode 100644
index 0000000..129dda4
--- /dev/null
+++ b/front/odiparpack/app/containers/LanguageProvider/actions.js
@@ -0,0 +1,14 @@
+/*
+ *
+ * LanguageProvider actions
+ *
+ */
+
+import { CHANGE_LOCALE } from './constants';
+
+export default function changeLocale(languageLocale) {
+ return {
+ type: CHANGE_LOCALE,
+ locale: languageLocale,
+ };
+}
diff --git a/front/odiparpack/app/containers/LanguageProvider/constants.js b/front/odiparpack/app/containers/LanguageProvider/constants.js
new file mode 100644
index 0000000..365ac6d
--- /dev/null
+++ b/front/odiparpack/app/containers/LanguageProvider/constants.js
@@ -0,0 +1,8 @@
+/*
+ *
+ * LanguageProvider constants
+ *
+ */
+
+const CHANGE_LOCALE = 'CHANGE_LOCALE';
+export default CHANGE_LOCALE;
diff --git a/front/odiparpack/app/containers/LanguageProvider/index.js b/front/odiparpack/app/containers/LanguageProvider/index.js
new file mode 100644
index 0000000..666240d
--- /dev/null
+++ b/front/odiparpack/app/containers/LanguageProvider/index.js
@@ -0,0 +1,51 @@
+/*
+ *
+ * LanguageProvider
+ *
+ * this component connects the redux state language locale to the
+ * IntlProvider component and i18n messages (loaded from `app/translations`)
+ */
+
+import React from 'react';
+import PropTypes from 'prop-types';
+import { connect } from 'react-redux';
+import { createSelector } from 'reselect';
+import { IntlProvider } from 'react-intl';
+
+import { makeSelectLocale } from './selectors';
+
+export class LanguageProvider extends React.PureComponent {
+ // eslint-disable-line react/prefer-stateless-function
+ render() {
+ return (
+
+ {React.Children.only(this.props.children)}
+
+ );
+ }
+}
+
+LanguageProvider.propTypes = {
+ locale: PropTypes.string.isRequired,
+ messages: PropTypes.object.isRequired,
+ children: PropTypes.element.isRequired,
+};
+
+const mapStateToProps = createSelector(makeSelectLocale(), locale => ({
+ locale,
+}));
+
+function mapDispatchToProps(dispatch) {
+ return {
+ dispatch,
+ };
+}
+
+export default connect(
+ mapStateToProps,
+ mapDispatchToProps,
+)(LanguageProvider);
diff --git a/front/odiparpack/app/containers/LanguageProvider/reducer.js b/front/odiparpack/app/containers/LanguageProvider/reducer.js
new file mode 100644
index 0000000..089c426
--- /dev/null
+++ b/front/odiparpack/app/containers/LanguageProvider/reducer.js
@@ -0,0 +1,25 @@
+/*
+ *
+ * LanguageProvider reducer
+ *
+ */
+
+import { fromJS } from 'immutable';
+
+import CHANGE_LOCALE from './constants';
+import { DEFAULT_LOCALE } from '../../i18n'; // eslint-disable-line
+
+export const initialState = fromJS({
+ locale: DEFAULT_LOCALE,
+});
+
+function languageProviderReducer(state = initialState, action) {
+ switch (action.type) {
+ case CHANGE_LOCALE:
+ return state.set('locale', action.locale);
+ default:
+ return state;
+ }
+}
+
+export default languageProviderReducer;
diff --git a/front/odiparpack/app/containers/LanguageProvider/selectors.js b/front/odiparpack/app/containers/LanguageProvider/selectors.js
new file mode 100644
index 0000000..3ef15a2
--- /dev/null
+++ b/front/odiparpack/app/containers/LanguageProvider/selectors.js
@@ -0,0 +1,16 @@
+import { createSelector } from 'reselect';
+import { initialState } from './reducer';
+
+/**
+ * Direct selector to the languageToggle state domain
+ */
+const selectLanguage = state => state.get('language', initialState);
+
+/**
+ * Select the language locale
+ */
+
+const makeSelectLocale = () =>
+ createSelector(selectLanguage, languageState => languageState.get('locale'));
+
+export { selectLanguage, makeSelectLocale };
diff --git a/front/odiparpack/app/containers/Layouts/AppLayout.js b/front/odiparpack/app/containers/Layouts/AppLayout.js
new file mode 100644
index 0000000..c0e96d0
--- /dev/null
+++ b/front/odiparpack/app/containers/Layouts/AppLayout.js
@@ -0,0 +1,45 @@
+import React, { Component } from 'react';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import { SourceReader, PapperBlock } from 'ba-components';
+import { SidebarLayout, SidebarLayoutRight, FullHeader } from './demos';
+
+class AppLayout extends Component {
+ render() {
+ const title = brand.name + ' - Layout';
+ const description = brand.desc;
+ const docSrc = 'containers/Layouts/demos/';
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+export default AppLayout;
diff --git a/front/odiparpack/app/containers/Layouts/Grid.js b/front/odiparpack/app/containers/Layouts/Grid.js
new file mode 100644
index 0000000..6a1057d
--- /dev/null
+++ b/front/odiparpack/app/containers/Layouts/Grid.js
@@ -0,0 +1,96 @@
+import React, { Component } from 'react';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import { SourceReader, PapperBlock } from 'ba-components';
+import { Grid } from '@material-ui/core';
+import {
+ GridLayout,
+ FullWidth,
+ Centered,
+ Interactive,
+ AutoLayout,
+ Limitation
+} from './demos';
+
+const styles = ({
+ root: {
+ flexGrow: 1,
+ }
+});
+
+class GridPage extends Component {
+ render() {
+ const { classes } = this.props;
+ const title = brand.name + ' - Layout';
+ const description = brand.desc;
+ const docSrc = 'containers/Layouts/demos/';
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+GridPage.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(GridPage);
diff --git a/front/odiparpack/app/containers/Layouts/Responsive.js b/front/odiparpack/app/containers/Layouts/Responsive.js
new file mode 100644
index 0000000..b5d6db2
--- /dev/null
+++ b/front/odiparpack/app/containers/Layouts/Responsive.js
@@ -0,0 +1,54 @@
+import React, { Component } from 'react';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import Markdown from 'react-markdown';
+import { SourceReader, PapperBlock } from 'ba-components';
+import { Breakpoint, BreakpointGrid, MediaQueries, WIthWIdth } from './demos';
+import breakpointsTable from './demos/breakpoint.md';
+
+class Responsive extends Component {
+ render() {
+ const title = brand.name + ' - Layout';
+ const description = brand.desc;
+ const docSrc = 'containers/Layouts/demos/';
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+export default Responsive;
diff --git a/front/odiparpack/app/containers/Layouts/demos/AutoLayout.js b/front/odiparpack/app/containers/Layouts/demos/AutoLayout.js
new file mode 100644
index 0000000..864d17e
--- /dev/null
+++ b/front/odiparpack/app/containers/Layouts/demos/AutoLayout.js
@@ -0,0 +1,85 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import { Typography, Paper, Divider, Grid } from '@material-ui/core';
+
+const styles = theme => ({
+ container: {
+ display: 'grid',
+ gridTemplateColumns: 'repeat(12, 1fr)',
+ gridGap: `${theme.spacing(3)}px`,
+ },
+ paper: {
+ padding: theme.spacing(1),
+ textAlign: 'center',
+ color: theme.palette.text.secondary,
+ whiteSpace: 'nowrap',
+ marginBottom: theme.spacing(1),
+ backgroundColor: theme.palette.secondary.light,
+ },
+ divider: {
+ margin: `${theme.spacing(2)}px 0`,
+ },
+});
+
+function CSSGrid(props) {
+ const { classes } = props;
+
+ return (
+
+
+ Material-UI Grid:
+
+
+
+ xs=3
+
+
+ xs=3
+
+
+ xs=3
+
+
+ xs=3
+
+
+ xs=8
+
+
+ xs=4
+
+
+
+
+ CSS Grid Layout:
+
+
+
+ );
+}
+
+CSSGrid.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(CSSGrid);
diff --git a/front/odiparpack/app/containers/Layouts/demos/Breakpoint.js b/front/odiparpack/app/containers/Layouts/demos/Breakpoint.js
new file mode 100644
index 0000000..be557b4
--- /dev/null
+++ b/front/odiparpack/app/containers/Layouts/demos/Breakpoint.js
@@ -0,0 +1,115 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import compose from 'recompose/compose';
+import { withStyles } from '@material-ui/core/styles';
+import { Paper, Hidden, Divider, withWidth, Typography } from '@material-ui/core';
+
+const styles = theme => ({
+ root: {
+ flexGrow: 1,
+ },
+ container: {
+ display: 'flex',
+ },
+ paper: {
+ padding: theme.spacing(2),
+ textAlign: 'center',
+ color: theme.palette.text.secondary,
+ flex: '1 0 auto',
+ margin: theme.spacing(1),
+ },
+ divider: {
+ display: 'block',
+ margin: `${theme.spacing(3)}px 0`,
+ }
+});
+
+function Breakpoint(props) {
+ const { classes } = props;
+
+ return (
+
+ {/* Breakpoin up block */}
+
Breakpoint up
+
+ Using any breakpoint up property, the given children will be hidden at or above the breakpoint.
+
+
+
+ xsUp
+
+
+ smUp
+
+
+ mdUp
+
+
+ lgUp
+
+
+ xlUp
+
+
+
+Current width:
+ {props.width}
+
+
+ {/* Breakpoin down block */}
+
Breakpoint down
+
+ Using any breakpoint down property, the given children will be hidden at or below the breakpoint.
+
+
+
+ xsDown
+
+
+ smDown
+
+
+ mdDown
+
+
+ lgDown
+
+
+ xlDown
+
+
+
+Current width:
+ {props.width}
+
+
+ {/* Breakpoin only block */}
+
Breakpoint only
+
+ Using the breakpoint only property, the given children will be hidden at the specified breakpoint(s).
+
+
+
+ Hidden on lg
+
+
+ Hidden on sm
+
+
+ Hidden on sm and lg
+
+
+
+Current width:
+ {props.width}
+
+
+ );
+}
+
+Breakpoint.propTypes = {
+ classes: PropTypes.object.isRequired,
+ width: PropTypes.string.isRequired,
+};
+
+export default compose(withStyles(styles), withWidth())(Breakpoint);
diff --git a/front/odiparpack/app/containers/Layouts/demos/BreakpointGrid.js b/front/odiparpack/app/containers/Layouts/demos/BreakpointGrid.js
new file mode 100644
index 0000000..cd94ef9
--- /dev/null
+++ b/front/odiparpack/app/containers/Layouts/demos/BreakpointGrid.js
@@ -0,0 +1,60 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import compose from 'recompose/compose';
+import { withStyles } from '@material-ui/core/styles';
+import { Paper, Grid, withWidth, Typography } from '@material-ui/core';
+
+const styles = theme => ({
+ root: {
+ flexGrow: 1,
+ },
+ container: {
+ display: 'flex',
+ },
+ paper: {
+ padding: theme.spacing(2),
+ textAlign: 'center',
+ color: theme.palette.text.secondary,
+ flex: '1 0 auto',
+ margin: theme.spacing(1),
+ },
+});
+
+function GridIntegration(props) {
+ const { classes } = props;
+
+ return (
+
+
+
+
+ xsUp
+
+
+ smUp
+
+
+ mdUp
+
+
+ lgUp
+
+
+ xlUp
+
+
+
+
+Current width:
+ {props.width}
+
+
+ );
+}
+
+GridIntegration.propTypes = {
+ classes: PropTypes.object.isRequired,
+ width: PropTypes.string.isRequired,
+};
+
+export default compose(withStyles(styles), withWidth())(GridIntegration);
diff --git a/front/odiparpack/app/containers/Layouts/demos/Centered.js b/front/odiparpack/app/containers/Layouts/demos/Centered.js
new file mode 100644
index 0000000..cdd1c10
--- /dev/null
+++ b/front/odiparpack/app/containers/Layouts/demos/Centered.js
@@ -0,0 +1,54 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import { Paper, Grid } from '@material-ui/core';
+
+const styles = theme => ({
+ root: {
+ flexGrow: 1,
+ },
+ paper: {
+ padding: theme.spacing(2),
+ textAlign: 'center',
+ color: theme.palette.text.secondary,
+ backgroundColor: theme.palette.secondary.light,
+ },
+});
+
+function CenteredGrid(props) {
+ const { classes } = props;
+
+ return (
+
+
+
+ xs=12
+
+
+ xs=6
+
+
+ xs=6
+
+
+ xs=3
+
+
+ xs=3
+
+
+ xs=3
+
+
+ xs=3
+
+
+
+ );
+}
+
+CenteredGrid.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(CenteredGrid);
diff --git a/front/odiparpack/app/containers/Layouts/demos/FullHeader.js b/front/odiparpack/app/containers/Layouts/demos/FullHeader.js
new file mode 100644
index 0000000..d5ef402
--- /dev/null
+++ b/front/odiparpack/app/containers/Layouts/demos/FullHeader.js
@@ -0,0 +1,153 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import classNames from 'classnames';
+import MenuIcon from '@material-ui/icons/Menu';
+import { Drawer, AppBar, Toolbar, List, Typography, Divider, IconButton, Hidden } from '@material-ui/core';
+import { mailFolderListItems, otherMailFolderListItems } from './menuData';
+
+
+const drawerWidth = 240;
+
+const styles = theme => ({
+ root: {
+ flexGrow: 1,
+ height: 430,
+ zIndex: 1,
+ overflow: 'hidden',
+ position: 'relative',
+ display: 'flex',
+ },
+ appBar: {
+ zIndex: theme.zIndex.drawer + 1,
+ },
+ menuButton: {
+ marginLeft: 0,
+ marginRight: 36,
+ },
+ drawerPaper: {
+ width: drawerWidth,
+ transition: theme.transitions.create('width', {
+ easing: theme.transitions.easing.sharp,
+ duration: theme.transitions.duration.enteringScreen,
+ }),
+ [theme.breakpoints.up('md')]: {
+ position: 'relative',
+ },
+ },
+ drawerPaperClose: {
+ overflowX: 'hidden',
+ transition: theme.transitions.create('width', {
+ easing: theme.transitions.easing.sharp,
+ duration: theme.transitions.duration.leavingScreen,
+ }),
+ width: 70,
+ [theme.breakpoints.up('sm')]: {
+ width: 70,
+ },
+ },
+ toolbar: {
+ display: 'flex',
+ alignItems: 'center',
+ justifyContent: 'flex-end',
+ padding: '0 8px',
+ ...theme.mixins.toolbar,
+ },
+ content: {
+ flexGrow: 1,
+ backgroundColor: theme.palette.background.default,
+ padding: theme.spacing(3),
+ },
+});
+
+class FullHeader extends React.Component {
+ state = {
+ open: true,
+ };
+
+ componentDidMount() {
+ window.addEventListener('resize', this.resize.bind(this));
+ this.resize();
+ }
+
+ resize() {
+ this.setState({ open: window.innerWidth >= 760 });
+ }
+
+ handleDrawerToggle = () => {
+ this.setState({ open: !this.state.open });
+ };
+
+ render() {
+ const { classes } = this.props;
+ const { open } = this.state;
+ const drawer = (
+
+
+
+
{mailFolderListItems}
+
+
{otherMailFolderListItems}
+
+ );
+ return (
+
+
+
+
+
+
+
+ Clipped under the app bar
+
+
+
+
+
+ {drawer}
+
+
+
+
+ {drawer}
+
+
+
+
+ Your App Content
+
+
+ );
+ }
+}
+
+FullHeader.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles, { withTheme: true })(FullHeader);
diff --git a/front/odiparpack/app/containers/Layouts/demos/FullWidth.js b/front/odiparpack/app/containers/Layouts/demos/FullWidth.js
new file mode 100644
index 0000000..fa7dbce
--- /dev/null
+++ b/front/odiparpack/app/containers/Layouts/demos/FullWidth.js
@@ -0,0 +1,54 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import { Paper, Grid } from '@material-ui/core';
+
+const styles = theme => ({
+ root: {
+ flexGrow: 1,
+ },
+ paper: {
+ padding: theme.spacing(2),
+ textAlign: 'center',
+ color: theme.palette.text.secondary,
+ backgroundColor: theme.palette.secondary.light
+ },
+});
+
+function FullWidthGrid(props) {
+ const { classes } = props;
+
+ return (
+
+
+
+ xs=12
+
+
+ xs=12 sm=6
+
+
+ xs=12 sm=6
+
+
+ xs=6 sm=3
+
+
+ xs=6 sm=3
+
+
+ xs=6 sm=3
+
+
+ xs=6 sm=3
+
+
+
+ );
+}
+
+FullWidthGrid.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(FullWidthGrid);
diff --git a/front/odiparpack/app/containers/Layouts/demos/GridLayout.js b/front/odiparpack/app/containers/Layouts/demos/GridLayout.js
new file mode 100644
index 0000000..d764c1c
--- /dev/null
+++ b/front/odiparpack/app/containers/Layouts/demos/GridLayout.js
@@ -0,0 +1,78 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import { Grid, FormLabel, FormControlLabel, Radio, RadioGroup, Paper } from '@material-ui/core';
+
+const styles = theme => ({
+ root: {
+ flexGrow: 1,
+ },
+ paper: {
+ height: 140,
+ width: 100,
+ backgroundColor: theme.palette.secondary.light,
+ },
+ control: {
+ marginTop: theme.spacing(2),
+ padding: theme.spacing(2),
+ },
+});
+
+class GuttersGrid extends React.Component {
+ state = {
+ spacing: '2',
+ };
+
+ handleChange = key => (event, value) => {
+ this.setState({
+ [key]: value,
+ });
+ };
+
+ render() {
+ const { classes } = this.props;
+ const { spacing } = this.state;
+
+ return (
+
+
+
+ {[0, 1, 2].map(value => (
+
+
+
+ ))}
+
+
+
+
+
+
+ spacing
+
+ } label="0" />
+ } label="1" />
+ } label="2" />
+ } label="3" />
+ } label="4" />
+
+
+
+
+
+
+ );
+ }
+}
+
+GuttersGrid.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(GuttersGrid);
diff --git a/front/odiparpack/app/containers/Layouts/demos/Interactive.js b/front/odiparpack/app/containers/Layouts/demos/Interactive.js
new file mode 100644
index 0000000..2f46841
--- /dev/null
+++ b/front/odiparpack/app/containers/Layouts/demos/Interactive.js
@@ -0,0 +1,138 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import { Grid, FormControl, FormLabel, FormControlLabel, RadioGroup, Radio, Paper } from '@material-ui/core';
+
+const styles = theme => ({
+ root: {
+ flexGrow: 1,
+ },
+ demo: {
+ height: 240,
+ },
+ paper: {
+ padding: theme.spacing(2),
+ height: '100%',
+ backgroundColor: theme.palette.secondary.light,
+ },
+ control: {
+ padding: theme.spacing(2),
+ },
+});
+
+class InteractiveGrid extends React.Component {
+ state = {
+ direction: 'row',
+ justify: 'center',
+ alignItems: 'center',
+ };
+
+ handleChange = key => (event, value) => {
+ this.setState({
+ [key]: value,
+ });
+ };
+
+ render() {
+ const { classes } = this.props;
+ const { alignItems, direction, justify } = this.state;
+ return (
+
+
+
+ {[0, 1, 2].map(value => (
+
+
+ {`Cell ${value + 1}`}
+
+
+ ))}
+
+
+
+
+
+
+
+ direction
+
+ } label="row" />
+ } label="row-reverse" />
+ } label="column" />
+ }
+ label="column-reverse"
+ />
+
+
+
+
+
+ justify
+
+ } label="flex-start" />
+ } label="center" />
+ } label="flex-end" />
+ }
+ label="space-between"
+ />
+ }
+ label="space-around"
+ />
+
+
+
+
+
+ alignItems
+
+ } label="flex-start" />
+ } label="center" />
+ } label="flex-end" />
+ } label="stretch" />
+ } label="baseline" />
+
+
+
+
+
+
+
+ );
+ }
+}
+
+InteractiveGrid.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(InteractiveGrid);
diff --git a/front/odiparpack/app/containers/Layouts/demos/Limitation.js b/front/odiparpack/app/containers/Layouts/demos/Limitation.js
new file mode 100644
index 0000000..076c85f
--- /dev/null
+++ b/front/odiparpack/app/containers/Layouts/demos/Limitation.js
@@ -0,0 +1,68 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import { Paper, Grid, Avatar, Typography } from '@material-ui/core';
+
+const styles = theme => ({
+ root: {
+ overflow: 'hidden',
+ padding: `0 ${theme.spacing(3)}px`,
+ },
+ wrapper: {
+ maxWidth: 400,
+ },
+ paper: {
+ margin: theme.spacing(1),
+ padding: theme.spacing(2),
+ backgroundColor: theme.palette.secondary.light,
+ },
+});
+
+function AutoGridNoWrap(props) {
+ const { classes } = props;
+ const message = `Truncation should be conditionally applicable on this long line of text
+ as this is a much longer line than what the container can support. `;
+
+ return (
+
+
+
+
+
+ W
+
+
+ {message}
+
+
+
+
+
+
+ W
+
+
+ {message}
+
+
+
+
+
+
+ W
+
+
+ {message}
+
+
+
+
+
+ );
+}
+
+AutoGridNoWrap.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(AutoGridNoWrap);
diff --git a/front/odiparpack/app/containers/Layouts/demos/MediaQueries.js b/front/odiparpack/app/containers/Layouts/demos/MediaQueries.js
new file mode 100644
index 0000000..89de6fc
--- /dev/null
+++ b/front/odiparpack/app/containers/Layouts/demos/MediaQueries.js
@@ -0,0 +1,41 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import { red, green, indigo as blue } from '@material-ui/core/colors';
+import { Typography } from '@material-ui/core';
+
+const styles = theme => ({
+ root: {
+ padding: theme.spacing(1),
+ '& h3': {
+ color: theme.palette.common.white,
+ },
+ [theme.breakpoints.down('sm')]: {
+ backgroundColor: red[500],
+ },
+ [theme.breakpoints.up('md')]: {
+ backgroundColor: blue[500],
+ },
+ [theme.breakpoints.up('lg')]: {
+ backgroundColor: green[500],
+ },
+ },
+});
+
+function MediaQuery(props) {
+ const { classes } = props;
+
+ return (
+
+ down(sm): red
+ up(md): blue
+ up(lg): green
+
+ );
+}
+
+MediaQuery.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(MediaQuery);
diff --git a/front/odiparpack/app/containers/Layouts/demos/SidebarLayout.js b/front/odiparpack/app/containers/Layouts/demos/SidebarLayout.js
new file mode 100644
index 0000000..3f1c10c
--- /dev/null
+++ b/front/odiparpack/app/containers/Layouts/demos/SidebarLayout.js
@@ -0,0 +1,169 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import classNames from 'classnames';
+import MenuIcon from '@material-ui/icons/Menu';
+import { Drawer, AppBar, Toolbar, List, Typography, Divider, IconButton, Hidden } from '@material-ui/core';
+import { mailFolderListItems, otherMailFolderListItems } from './menuData';
+
+
+const drawerWidth = 240;
+
+const styles = theme => ({
+ root: {
+ flexGrow: 1,
+ height: 430,
+ zIndex: 1,
+ overflow: 'hidden',
+ position: 'relative',
+ display: 'flex',
+ },
+ appBar: {
+ zIndex: theme.zIndex.drawer + 1,
+ transition: theme.transitions.create(['width', 'margin'], {
+ easing: theme.transitions.easing.sharp,
+ duration: theme.transitions.duration.leavingScreen,
+ }),
+ },
+ appBarShift: {
+ marginLeft: 0,
+ width: '100%',
+ transition: theme.transitions.create(['width', 'margin'], {
+ easing: theme.transitions.easing.sharp,
+ duration: theme.transitions.duration.enteringScreen,
+ }),
+ [theme.breakpoints.up('md')]: {
+ marginLeft: drawerWidth,
+ width: `calc(100% - ${drawerWidth}px)`,
+ },
+ },
+ menuButton: {
+ marginLeft: 0,
+ marginRight: 36,
+ },
+ drawerPaper: {
+ width: drawerWidth,
+ transition: theme.transitions.create('width', {
+ easing: theme.transitions.easing.sharp,
+ duration: theme.transitions.duration.enteringScreen,
+ }),
+ [theme.breakpoints.up('md')]: {
+ position: 'relative',
+ },
+ },
+ drawerPaperClose: {
+ overflowX: 'hidden',
+ transition: theme.transitions.create('width', {
+ easing: theme.transitions.easing.sharp,
+ duration: theme.transitions.duration.leavingScreen,
+ }),
+ width: 70,
+ [theme.breakpoints.up('sm')]: {
+ width: 70,
+ },
+ },
+ toolbar: {
+ display: 'flex',
+ alignItems: 'center',
+ justifyContent: 'flex-end',
+ padding: '0 8px',
+ ...theme.mixins.toolbar,
+ },
+ content: {
+ flexGrow: 1,
+ backgroundColor: theme.palette.background.default,
+ padding: theme.spacing(3),
+ },
+});
+
+class SidebarLayout extends React.Component {
+ state = {
+ open: true,
+ };
+
+ componentDidMount() {
+ window.addEventListener('resize', this.resize.bind(this));
+ this.resize();
+ }
+
+ resize() {
+ this.setState({ open: window.innerWidth >= 760 });
+ }
+
+ handleDrawerToggle = () => {
+ this.setState({ open: !this.state.open });
+ };
+
+ render() {
+ const { classes } = this.props;
+ const { open } = this.state;
+ const drawer = (
+
+
+
+
{mailFolderListItems}
+
+
{otherMailFolderListItems}
+
+ );
+ return (
+
+
+
+
+
+
+
+ App Layout with Sidebar
+
+
+
+
+
+ {drawer}
+
+
+
+
+ {drawer}
+
+
+
+
+ Your App Content
+
+
+ );
+ }
+}
+
+SidebarLayout.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles, { withTheme: true })(SidebarLayout);
diff --git a/front/odiparpack/app/containers/Layouts/demos/SidebarLayoutRight.js b/front/odiparpack/app/containers/Layouts/demos/SidebarLayoutRight.js
new file mode 100644
index 0000000..85c5229
--- /dev/null
+++ b/front/odiparpack/app/containers/Layouts/demos/SidebarLayoutRight.js
@@ -0,0 +1,175 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import classNames from 'classnames';
+import MenuIcon from '@material-ui/icons/Menu';
+import { Drawer, AppBar, Toolbar, List, Typography, Divider, IconButton, Hidden } from '@material-ui/core';
+import { mailFolderListItems, otherMailFolderListItems } from './menuData';
+
+
+const drawerWidth = 240;
+
+const styles = theme => ({
+ root: {
+ flexGrow: 1,
+ height: 430,
+ zIndex: 1,
+ overflow: 'hidden',
+ position: 'relative',
+ display: 'flex',
+ },
+ flexwrap: {
+ display: 'flex'
+ },
+ flex: {
+ flex: 1
+ },
+ appBar: {
+ zIndex: theme.zIndex.drawer + 1,
+ transition: theme.transitions.create(['width', 'margin'], {
+ easing: theme.transitions.easing.sharp,
+ duration: theme.transitions.duration.leavingScreen,
+ }),
+ },
+ appBarShift: {
+ marginRight: 0,
+ width: '100%',
+ transition: theme.transitions.create(['width', 'margin'], {
+ easing: theme.transitions.easing.sharp,
+ duration: theme.transitions.duration.enteringScreen,
+ }),
+ [theme.breakpoints.up('md')]: {
+ marginRight: drawerWidth,
+ width: `calc(100% - ${drawerWidth}px)`,
+ },
+ },
+ menuButton: {
+ marginRight: 0,
+ marginLeft: 36,
+ },
+ drawerPaper: {
+ width: drawerWidth,
+ transition: theme.transitions.create('width', {
+ easing: theme.transitions.easing.sharp,
+ duration: theme.transitions.duration.enteringScreen,
+ }),
+ [theme.breakpoints.up('md')]: {
+ position: 'relative',
+ },
+ },
+ drawerPaperClose: {
+ overflowX: 'hidden',
+ transition: theme.transitions.create('width', {
+ easing: theme.transitions.easing.sharp,
+ duration: theme.transitions.duration.leavingScreen,
+ }),
+ width: 70,
+ [theme.breakpoints.up('sm')]: {
+ width: 70,
+ },
+ },
+ toolbar: {
+ display: 'flex',
+ alignItems: 'center',
+ justifyContent: 'flex-end',
+ padding: '0 8px',
+ ...theme.mixins.toolbar,
+ },
+ content: {
+ flexGrow: 1,
+ backgroundColor: theme.palette.background.default,
+ padding: theme.spacing(3),
+ },
+});
+
+class SidebarLayoutRight extends React.Component {
+ state = {
+ open: true,
+ };
+
+ componentDidMount() {
+ window.addEventListener('resize', this.resize.bind(this));
+ this.resize();
+ }
+
+ resize() {
+ this.setState({ open: window.innerWidth >= 760 });
+ }
+
+ handleDrawerToggle = () => {
+ this.setState({ open: !this.state.open });
+ };
+
+ render() {
+ const { classes } = this.props;
+ const { open } = this.state;
+ const drawer = (
+
+
+
+
{mailFolderListItems}
+
+
{otherMailFolderListItems}
+
+ );
+ return (
+
+
+
+
+ App Layout with Right Sidebar
+
+
+
+
+
+
+
+
+ Your App Content
+
+
+
+ {drawer}
+
+
+
+
+ {drawer}
+
+
+
+ );
+ }
+}
+
+SidebarLayoutRight.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles, { withTheme: true })(SidebarLayoutRight);
diff --git a/front/odiparpack/app/containers/Layouts/demos/WIthWIdth.js b/front/odiparpack/app/containers/Layouts/demos/WIthWIdth.js
new file mode 100644
index 0000000..2aab0e3
--- /dev/null
+++ b/front/odiparpack/app/containers/Layouts/demos/WIthWIdth.js
@@ -0,0 +1,26 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withWidth, Typography } from '@material-ui/core';
+
+const components = {
+ sm: 'em',
+ md: 'u',
+ lg: 'del',
+};
+
+function WithWidth(props) {
+ const { width } = props;
+ const Component = components[width] || 'span';
+
+ return (
+
+ {`Current width: ${width}`}
+
+ );
+}
+
+WithWidth.propTypes = {
+ width: PropTypes.string.isRequired,
+};
+
+export default withWidth()(WithWidth);
diff --git a/front/odiparpack/app/containers/Layouts/demos/breakpoint.md b/front/odiparpack/app/containers/Layouts/demos/breakpoint.md
new file mode 100644
index 0000000..e5037ec
--- /dev/null
+++ b/front/odiparpack/app/containers/Layouts/demos/breakpoint.md
@@ -0,0 +1,6 @@
+
+ | innerWidth |xs | sm | md | lg | xl |
+ |--------|-----|----|----|----|----|----|
+ | width | xs | sm | md | lg | xl |
+ | smUp | show | hide |
+ | mdDown | | | hide | show |
diff --git a/front/odiparpack/app/containers/Layouts/demos/index.js b/front/odiparpack/app/containers/Layouts/demos/index.js
new file mode 100644
index 0000000..70f3804
--- /dev/null
+++ b/front/odiparpack/app/containers/Layouts/demos/index.js
@@ -0,0 +1,13 @@
+export AutoLayout from './AutoLayout';
+export Centered from './Centered';
+export FullWidth from './FullWidth';
+export GridLayout from './GridLayout';
+export Interactive from './Interactive';
+export Limitation from './Limitation';
+export SidebarLayout from './SidebarLayout';
+export SidebarLayoutRight from './SidebarLayoutRight';
+export FullHeader from './FullHeader';
+export Breakpoint from './Breakpoint';
+export BreakpointGrid from './BreakpointGrid';
+export MediaQueries from './MediaQueries';
+export WIthWIdth from './WIthWIdth';
diff --git a/front/odiparpack/app/containers/Layouts/demos/menuData.js b/front/odiparpack/app/containers/Layouts/demos/menuData.js
new file mode 100644
index 0000000..cd2d653
--- /dev/null
+++ b/front/odiparpack/app/containers/Layouts/demos/menuData.js
@@ -0,0 +1,64 @@
+// This file is shared across the demos.
+
+import React from 'react';
+import InboxIcon from '@material-ui/icons/MoveToInbox';
+import DraftsIcon from '@material-ui/icons/Drafts';
+import StarIcon from '@material-ui/icons/Star';
+import SendIcon from '@material-ui/icons/Send';
+import MailIcon from '@material-ui/icons/Mail';
+import DeleteIcon from '@material-ui/icons/Delete';
+import ReportIcon from '@material-ui/icons/Report';
+
+import { ListItem, ListItemIcon, ListItemText } from '@material-ui/core';
+
+export const mailFolderListItems = (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+);
+
+export const otherMailFolderListItems = (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+);
diff --git a/front/odiparpack/app/containers/Maps/Info.js b/front/odiparpack/app/containers/Maps/Info.js
new file mode 100644
index 0000000..1faea09
--- /dev/null
+++ b/front/odiparpack/app/containers/Maps/Info.js
@@ -0,0 +1,18 @@
+import React from 'react';
+import Type from 'ba-styles/Typography.scss';
+import { Typography } from '@material-ui/core';
+
+class Info extends React.Component {
+ render() {
+ return (
+
+ This demo may not working properly because it has not added Google Map api key. To add Your own Google Map api key please follow this link
+
+ {' '}
+ https://developers.google.com/maps/documentation/javascript/get-api-key
+
+ );
+ }
+}
+
+export default Info;
diff --git a/front/odiparpack/app/containers/Maps/MapDirection.js b/front/odiparpack/app/containers/Maps/MapDirection.js
new file mode 100644
index 0000000..97a463b
--- /dev/null
+++ b/front/odiparpack/app/containers/Maps/MapDirection.js
@@ -0,0 +1,33 @@
+import React from 'react';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import { SourceReader, PapperBlock } from 'ba-components';
+import { Direction } from './demos';
+import Info from './Info';
+
+class MapDirection extends React.Component {
+ render() {
+ const title = brand.name + ' - Map';
+ const description = brand.desc;
+ const docSrc = 'containers/Maps/demos/';
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+export default MapDirection;
diff --git a/front/odiparpack/app/containers/Maps/MapMarker.js b/front/odiparpack/app/containers/Maps/MapMarker.js
new file mode 100644
index 0000000..65f2420
--- /dev/null
+++ b/front/odiparpack/app/containers/Maps/MapMarker.js
@@ -0,0 +1,38 @@
+import React from 'react';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import { SourceReader, PapperBlock } from 'ba-components';
+import { BasicMarker, PopoverMarker } from './demos';
+import Info from './Info';
+
+class MapMarker extends React.Component {
+ render() {
+ const title = brand.name + ' - Map';
+ const description = brand.desc;
+ const docSrc = 'containers/Maps/demos/';
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+export default MapMarker;
diff --git a/front/odiparpack/app/containers/Maps/SearchMap.js b/front/odiparpack/app/containers/Maps/SearchMap.js
new file mode 100644
index 0000000..b3e21d9
--- /dev/null
+++ b/front/odiparpack/app/containers/Maps/SearchMap.js
@@ -0,0 +1,33 @@
+import React from 'react';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import { SourceReader, PapperBlock } from 'ba-components';
+import { SearchLocation } from './demos';
+import Info from './Info';
+
+class SearchMap extends React.Component {
+ render() {
+ const title = brand.name + ' - Map';
+ const description = brand.desc;
+ const docSrc = 'containers/Maps/demos/';
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+export default SearchMap;
diff --git a/front/odiparpack/app/containers/Maps/StreetViewMap.js b/front/odiparpack/app/containers/Maps/StreetViewMap.js
new file mode 100644
index 0000000..e307da8
--- /dev/null
+++ b/front/odiparpack/app/containers/Maps/StreetViewMap.js
@@ -0,0 +1,33 @@
+import React from 'react';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import { SourceReader, PapperBlock } from 'ba-components';
+import { StreetView } from './demos';
+import Info from './Info';
+
+class StreetViewMap extends React.Component {
+ render() {
+ const title = brand.name + ' - Map';
+ const description = brand.desc;
+ const docSrc = 'containers/Maps/demos/';
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+export default StreetViewMap;
diff --git a/front/odiparpack/app/containers/Maps/TrafficIndicator.js b/front/odiparpack/app/containers/Maps/TrafficIndicator.js
new file mode 100644
index 0000000..e1e8a69
--- /dev/null
+++ b/front/odiparpack/app/containers/Maps/TrafficIndicator.js
@@ -0,0 +1,33 @@
+import React from 'react';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import { SourceReader, PapperBlock } from 'ba-components';
+import { Traffic } from './demos';
+import Info from './Info';
+
+class TrafficIndicator extends React.Component {
+ render() {
+ const title = brand.name + ' - Map';
+ const description = brand.desc;
+ const docSrc = 'containers/Maps/demos/';
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+export default TrafficIndicator;
diff --git a/front/odiparpack/app/containers/Maps/demos/BasicMarker.js b/front/odiparpack/app/containers/Maps/demos/BasicMarker.js
new file mode 100644
index 0000000..7577923
--- /dev/null
+++ b/front/odiparpack/app/containers/Maps/demos/BasicMarker.js
@@ -0,0 +1,38 @@
+import React from 'react';
+import { compose } from 'recompose';
+import {
+ withScriptjs,
+ withGoogleMap,
+ GoogleMap,
+ Marker,
+} from 'react-google-maps';
+
+const MapWithAMarker = compose(
+ withScriptjs,
+ withGoogleMap
+)(props => (
+
+
+
+));
+
+class BasicMarker extends React.Component {
+ render() {
+ return (
+ }
+ containerElement={
}
+ mapElement={
}
+ />
+ );
+ }
+}
+
+export default BasicMarker;
diff --git a/front/odiparpack/app/containers/Maps/demos/Direction.js b/front/odiparpack/app/containers/Maps/demos/Direction.js
new file mode 100644
index 0000000..8867466
--- /dev/null
+++ b/front/odiparpack/app/containers/Maps/demos/Direction.js
@@ -0,0 +1,56 @@
+/* eslint-disable no-undef */
+import React from 'react';
+import { compose, withProps, lifecycle } from 'recompose';
+import {
+ withScriptjs,
+ withGoogleMap,
+ GoogleMap,
+ DirectionsRenderer,
+} from 'react-google-maps';
+
+const MapWithADirectionsRenderer = compose(
+ withProps({
+ googleMapURL: 'https://maps.googleapis.com/maps/api/js?v=3.exp&libraries=geometry,drawing,places',
+ loadingElement:
,
+ containerElement:
,
+ mapElement:
,
+ }),
+ withScriptjs,
+ withGoogleMap,
+ lifecycle({
+ componentDidMount() {
+ const DirectionsService = new google.maps.DirectionsService();
+
+ DirectionsService.route({
+ origin: new google.maps.LatLng(41.8507300, -87.6512600),
+ destination: new google.maps.LatLng(41.8525800, -87.6514100),
+ travelMode: google.maps.TravelMode.DRIVING,
+ }, (result, status) => {
+ if (status === google.maps.DirectionsStatus.OK) {
+ this.setState({
+ directions: result,
+ });
+ } else {
+ console.error(`error fetching directions ${result}`);
+ }
+ });
+ }
+ })
+)(props => (
+
+ {props.directions && }
+
+));
+
+class Direction extends React.Component {
+ render() {
+ return (
+
+ );
+ }
+}
+
+export default Direction;
diff --git a/front/odiparpack/app/containers/Maps/demos/PopoverMarker.js b/front/odiparpack/app/containers/Maps/demos/PopoverMarker.js
new file mode 100644
index 0000000..9a07f11
--- /dev/null
+++ b/front/odiparpack/app/containers/Maps/demos/PopoverMarker.js
@@ -0,0 +1,55 @@
+import React from 'react';
+import { compose, withStateHandlers } from 'recompose';
+import LocalDining from '@material-ui/icons/LocalDining';
+import {
+ withScriptjs,
+ withGoogleMap,
+ GoogleMap,
+ Marker,
+ InfoWindow
+} from 'react-google-maps';
+
+const MapWithAMakredInfoWindow = compose(
+ withStateHandlers(() => ({
+ isOpen: false,
+ }), {
+ onToggleOpen: ({ isOpen }) => () => ({
+ isOpen: !isOpen,
+ })
+ }),
+ withScriptjs,
+ withGoogleMap
+)(props => (
+
+
+ {props.isOpen &&
+
+
+ A marked place
+
+
+ }
+
+
+));
+
+class PopoverMarker extends React.Component {
+ render() {
+ return (
+ }
+ containerElement={
}
+ mapElement={
}
+ />
+ );
+ }
+}
+
+export default PopoverMarker;
diff --git a/front/odiparpack/app/containers/Maps/demos/SearchLocation.js b/front/odiparpack/app/containers/Maps/demos/SearchLocation.js
new file mode 100644
index 0000000..16449d0
--- /dev/null
+++ b/front/odiparpack/app/containers/Maps/demos/SearchLocation.js
@@ -0,0 +1,116 @@
+import React from 'react';
+import { compose, withProps, lifecycle } from 'recompose';
+import {
+ withScriptjs,
+ withGoogleMap,
+ GoogleMap,
+ Marker,
+} from 'react-google-maps';
+import { SearchBox } from 'react-google-maps/lib/components/places/SearchBox';
+const _ = require('lodash');
+
+const MapWithASearchBox = compose(
+ withProps({
+ googleMapURL: 'https://maps.googleapis.com/maps/api/js?v=3.exp&libraries=geometry,drawing,places',
+ loadingElement:
,
+ containerElement:
,
+ mapElement:
,
+ }),
+ lifecycle({
+ componentWillMount() {
+ const refs = {};
+
+ this.setState({
+ bounds: null,
+ center: {
+ lat: 41.9, lng: -87.624
+ },
+ markers: [],
+ onMapMounted: ref => {
+ refs.map = ref;
+ },
+ onBoundsChanged: () => {
+ this.setState({
+ bounds: refs.map.getBounds(),
+ center: refs.map.getCenter(),
+ });
+ },
+ onSearchBoxMounted: ref => {
+ refs.searchBox = ref;
+ },
+ onPlacesChanged: () => {
+ const places = refs.searchBox.getPlaces();
+ const bounds = new google.maps.LatLngBounds(); // eslint-disable-line
+
+ places.forEach(place => {
+ if (place.geometry.viewport) {
+ bounds.union(place.geometry.viewport);
+ } else {
+ bounds.extend(place.geometry.location);
+ }
+ });
+ const nextMarkers = places.map(place => ({
+ position: place.geometry.location,
+ }));
+ const nextCenter = _.get(nextMarkers, '0.position', this.state.center);
+
+ this.setState({
+ center: nextCenter,
+ markers: nextMarkers,
+ });
+ // refs.map.fitBounds(bounds);
+ },
+ });
+ },
+ }),
+ withScriptjs,
+ withGoogleMap
+)(props => (
+
+
+
+
+ {props.markers.map((marker, index) =>
+
+ )}
+
+));
+
+class SearchLocation extends React.Component {
+ render() {
+ return (
+
+ );
+ }
+}
+
+export default SearchLocation;
diff --git a/front/odiparpack/app/containers/Maps/demos/StreetView.js b/front/odiparpack/app/containers/Maps/demos/StreetView.js
new file mode 100644
index 0000000..a8d3108
--- /dev/null
+++ b/front/odiparpack/app/containers/Maps/demos/StreetView.js
@@ -0,0 +1,62 @@
+import React from 'react';
+import { compose, withProps } from 'recompose';
+import {
+ withScriptjs,
+ withGoogleMap,
+ GoogleMap,
+ StreetViewPanorama,
+ OverlayView,
+} from 'react-google-maps';
+
+const getPixelPositionOffset = (width, height) => ({
+ x: -(width / 2),
+ y: -(height / 2),
+});
+
+const MapWithAMarker = compose(
+ withProps({
+ googleMapURL: 'https://maps.googleapis.com/maps/api/js?v=3.exp&libraries=geometry,drawing,places',
+ loadingElement:
,
+ containerElement:
,
+ mapElement:
,
+ center: { lat: 49.2853171, lng: -123.1119202 },
+ }),
+ withScriptjs,
+ withGoogleMap
+)(props => (
+
+
+
+
+ OverlayView
+
+
+
+
+));
+
+class StreetView extends React.Component {
+ render() {
+ return (
+ }
+ containerElement={
}
+ mapElement={
}
+ />
+ );
+ }
+}
+
+export default StreetView;
diff --git a/front/odiparpack/app/containers/Maps/demos/Traffic.js b/front/odiparpack/app/containers/Maps/demos/Traffic.js
new file mode 100644
index 0000000..0f5cdfd
--- /dev/null
+++ b/front/odiparpack/app/containers/Maps/demos/Traffic.js
@@ -0,0 +1,37 @@
+import React from 'react';
+import { compose, withProps } from 'recompose';
+import {
+ withScriptjs,
+ withGoogleMap,
+ GoogleMap,
+ TrafficLayer,
+} from 'react-google-maps';
+
+const MapWithATrafficLayer = compose(
+ withProps({
+ googleMapURL: 'https://maps.googleapis.com/maps/api/js?v=3.exp&libraries=geometry,drawing,places',
+ loadingElement:
,
+ containerElement:
,
+ mapElement:
,
+ }),
+ withScriptjs,
+ withGoogleMap
+)(props => (
+
+
+
+));
+
+class Traffic extends React.Component {
+ render() {
+ return (
+
+ );
+ }
+}
+
+export default Traffic;
diff --git a/front/odiparpack/app/containers/Maps/demos/index.js b/front/odiparpack/app/containers/Maps/demos/index.js
new file mode 100644
index 0000000..33e8376
--- /dev/null
+++ b/front/odiparpack/app/containers/Maps/demos/index.js
@@ -0,0 +1,6 @@
+export BasicMarker from './BasicMarker';
+export PopoverMarker from './PopoverMarker';
+export Direction from './Direction';
+export SearchLocation from './SearchLocation';
+export Traffic from './Traffic';
+export StreetView from './StreetView';
diff --git a/front/odiparpack/app/containers/NotFound/NotFound.js b/front/odiparpack/app/containers/NotFound/NotFound.js
new file mode 100644
index 0000000..4662a06
--- /dev/null
+++ b/front/odiparpack/app/containers/NotFound/NotFound.js
@@ -0,0 +1,33 @@
+import React from 'react';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import { Route } from 'react-router-dom';
+import { ErrorWrap } from 'ba-components';
+
+const title = brand.name + ' - Page Not Found';
+const description = brand.desc;
+
+const NotFound = () => (
+ {
+ if (staticContext) {
+ staticContext.status = 404; // eslint-disable-line
+ }
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+ );
+ }}
+ />
+);
+
+export default NotFound;
diff --git a/front/odiparpack/app/containers/Pages/.DS_Store b/front/odiparpack/app/containers/Pages/.DS_Store
new file mode 100644
index 0000000..f59225b
Binary files /dev/null and b/front/odiparpack/app/containers/Pages/.DS_Store differ
diff --git a/front/odiparpack/app/containers/Pages/BlankPage/index.js b/front/odiparpack/app/containers/Pages/BlankPage/index.js
new file mode 100644
index 0000000..640da6e
--- /dev/null
+++ b/front/odiparpack/app/containers/Pages/BlankPage/index.js
@@ -0,0 +1,28 @@
+import React from 'react';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import { PapperBlock } from 'ba-components';
+
+class BlankPage extends React.Component {
+ render() {
+ const title = brand.name + ' - Blank Page';
+ const description = brand.desc;
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+ Content
+
+
+ );
+ }
+}
+
+export default BlankPage;
diff --git a/front/odiparpack/app/containers/Pages/Calendar/index.js b/front/odiparpack/app/containers/Pages/Calendar/index.js
new file mode 100644
index 0000000..fd5f412
--- /dev/null
+++ b/front/odiparpack/app/containers/Pages/Calendar/index.js
@@ -0,0 +1,137 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import events from 'ba-api/eventData';
+import { bindActionCreators } from 'redux';
+import { connect } from 'react-redux';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import 'ba-styles/vendors/react-big-calendar/react-big-calendar.css';
+import { EventCalendar, DetailEvent, AddEvent, Notification } from 'ba-components';
+import {
+ fetchAction,
+ addAction,
+ discardAction,
+ submitAction,
+ deleteAction,
+ closeNotifAction
+} from 'ba-actions/CalendarEventActions';
+
+const styles = {
+ root: {
+ display: 'block'
+ }
+};
+
+class Calendar extends React.Component {
+ state = {
+ anchorEl: false,
+ event: null,
+ anchorPos: { top: 0, left: 0 }
+ };
+
+ componentDidMount() {
+ this.props.fetchEventsData(events);
+ }
+
+ handleClick = event => {
+ setTimeout(() => {
+ const target = document.getElementsByClassName('rbc-selected')[0];
+ const targetBounding = target.getBoundingClientRect();
+ this.setState({
+ event,
+ anchorEl: true,
+ anchorPos: { top: targetBounding.top, left: targetBounding.left }
+ });
+ }, 200);
+ };
+
+ handleClose = () => {
+ this.setState({
+ anchorEl: false,
+ });
+ };
+
+ render() {
+ const title = brand.name + ' - Calendar';
+ const description = brand.desc;
+ const { anchorEl, anchorPos, event } = this.state;
+ const {
+ classes,
+ eventData,
+ openFrm,
+ addEvent,
+ discardEvent,
+ submit,
+ remove,
+ closeNotif,
+ messageNotif
+ } = this.props;
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
closeNotif()} message={messageNotif} />
+
+
+ );
+ }
+}
+
+Calendar.propTypes = {
+ classes: PropTypes.object.isRequired,
+ eventData: PropTypes.object.isRequired,
+ fetchEventsData: PropTypes.func.isRequired,
+ addEvent: PropTypes.func.isRequired,
+ submit: PropTypes.func.isRequired,
+ discardEvent: PropTypes.func.isRequired,
+ remove: PropTypes.func.isRequired,
+ openFrm: PropTypes.bool.isRequired,
+ closeNotif: PropTypes.func.isRequired,
+ messageNotif: PropTypes.string.isRequired,
+};
+
+const reducer = 'calendar';
+const mapStateToProps = state => ({
+ force: state, // force state from reducer
+ eventData: state.getIn([reducer, 'events']),
+ openFrm: state.getIn([reducer, 'openFrm']),
+ messageNotif: state.getIn([reducer, 'notifMsg']),
+});
+
+const constDispatchToProps = dispatch => ({
+ fetchEventsData: bindActionCreators(fetchAction, dispatch),
+ submit: bindActionCreators(submitAction, dispatch),
+ remove: bindActionCreators(deleteAction, dispatch),
+ addEvent: () => dispatch(addAction),
+ discardEvent: () => dispatch(discardAction),
+ closeNotif: () => dispatch(closeNotifAction),
+});
+
+const CalendarMapped = connect(
+ mapStateToProps,
+ constDispatchToProps
+)(Calendar);
+
+export default withStyles(styles)(CalendarMapped);
diff --git a/front/odiparpack/app/containers/Pages/Chat/index.js b/front/odiparpack/app/containers/Pages/Chat/index.js
new file mode 100644
index 0000000..99cf875
--- /dev/null
+++ b/front/odiparpack/app/containers/Pages/Chat/index.js
@@ -0,0 +1,123 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import { bindActionCreators } from 'redux';
+import { connect } from 'react-redux';
+import contactData from 'ba-api/contactData';
+import chatData from 'ba-api/chatData';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import { fetchAction, searchAction } from 'ba-actions/ContactActions';
+import {
+ fetchChatAction,
+ showChatAction,
+ sendAction,
+ hideDetailAction,
+ deleteAction
+} from 'ba-actions/ChatActions';
+import { ContactList, ChatHeader, ChatRoom } from 'ba-components';
+import styles from 'ba-components/Contact/contact-jss';
+
+class Chat extends React.Component {
+ componentDidMount() {
+ this.props.fetchChatData(chatData);
+ this.props.fetchContactData(contactData);
+ }
+
+ render() {
+ const title = brand.name + ' - Chat App';
+ const description = brand.desc;
+ const {
+ classes,
+ dataContact,
+ showDetail,
+ hideDetail,
+ keyword,
+ search,
+ dataChat,
+ chatSelected,
+ sendMessage,
+ remove,
+ showMobileDetail
+ } = this.props;
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+Chat.propTypes = {
+ classes: PropTypes.object.isRequired,
+ fetchContactData: PropTypes.func.isRequired,
+ fetchChatData: PropTypes.func.isRequired,
+ showDetail: PropTypes.func.isRequired,
+ hideDetail: PropTypes.func.isRequired,
+ sendMessage: PropTypes.func.isRequired,
+ search: PropTypes.func.isRequired,
+ remove: PropTypes.func.isRequired,
+ keyword: PropTypes.string.isRequired,
+ dataContact: PropTypes.object.isRequired,
+ dataChat: PropTypes.object.isRequired,
+ chatSelected: PropTypes.number.isRequired,
+ showMobileDetail: PropTypes.bool.isRequired,
+};
+
+const reducerContact = 'contact';
+const reducerChat = 'chat';
+const mapStateToProps = state => ({
+ force: state, // force state from reducer
+ dataContact: state.getIn([reducerContact, 'contactList']),
+ dataChat: state.getIn([reducerChat, 'activeChat']),
+ chatSelected: state.getIn([reducerChat, 'chatSelected']),
+ showMobileDetail: state.getIn([reducerChat, 'showMobileDetail']),
+ keyword: state.getIn([reducerContact, 'keywordValue']),
+});
+
+const dispatchToProps = dispatch => ({
+ fetchContactData: bindActionCreators(fetchAction, dispatch),
+ hideDetail: () => dispatch(hideDetailAction),
+ fetchChatData: bindActionCreators(fetchChatAction, dispatch),
+ showDetail: bindActionCreators(showChatAction, dispatch),
+ search: bindActionCreators(searchAction, dispatch),
+ sendMessage: bindActionCreators(sendAction, dispatch),
+ remove: () => dispatch(deleteAction),
+});
+
+const ChatMapped = connect(
+ mapStateToProps,
+ dispatchToProps
+)(Chat);
+
+export default withStyles(styles)(ChatMapped);
diff --git a/front/odiparpack/app/containers/Pages/Contact/index.js b/front/odiparpack/app/containers/Pages/Contact/index.js
new file mode 100644
index 0000000..8ed34de
--- /dev/null
+++ b/front/odiparpack/app/containers/Pages/Contact/index.js
@@ -0,0 +1,166 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import { bindActionCreators } from 'redux';
+import { connect } from 'react-redux';
+import data from 'ba-api/contactData';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import dummy from 'ba-api/dummyContents';
+import {
+ fetchAction,
+ showDetailAction,
+ hideDetailAction,
+ submitAction,
+ editAction,
+ addAction,
+ closeAction,
+ removeAction,
+ addToFavoriteAction,
+ searchAction,
+ closeNotifAction
+} from 'ba-actions/ContactActions';
+import {
+ ContactHeader,
+ ContactList,
+ ContactDetail,
+ AddContact,
+ Notification
+} from 'ba-components';
+import styles from 'ba-components/Contact/contact-jss';
+
+class Contact extends React.Component {
+ componentDidMount() {
+ this.props.fetchData(data);
+ }
+
+ submitContact = (item, avatar) => {
+ const { submit } = this.props;
+ const avatarBase64 = typeof avatar === 'object' ? URL.createObjectURL(avatar) : avatar;
+ const avatarPreview = avatar !== null ? avatarBase64 : dummy.user.avatar;
+ submit(item, avatarPreview);
+ }
+
+ render() {
+ const title = brand.name + ' - Contact';
+ const description = brand.desc;
+ const {
+ classes,
+ dataContact,
+ itemSelected,
+ showDetail,
+ hideDetail,
+ avatarInit,
+ open,
+ showMobileDetail,
+ add,
+ edit,
+ close,
+ remove,
+ favorite,
+ keyword,
+ search,
+ closeNotif,
+ messageNotif
+ } = this.props;
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
closeNotif()} message={messageNotif} />
+
+
+
+
+
+
+
+ );
+ }
+}
+
+Contact.propTypes = {
+ classes: PropTypes.object.isRequired,
+ avatarInit: PropTypes.string.isRequired,
+ fetchData: PropTypes.func.isRequired,
+ showDetail: PropTypes.func.isRequired,
+ hideDetail: PropTypes.func.isRequired,
+ keyword: PropTypes.string.isRequired,
+ open: PropTypes.bool.isRequired,
+ showMobileDetail: PropTypes.bool.isRequired,
+ add: PropTypes.func.isRequired,
+ close: PropTypes.func.isRequired,
+ submit: PropTypes.func.isRequired,
+ edit: PropTypes.func.isRequired,
+ remove: PropTypes.func.isRequired,
+ favorite: PropTypes.func.isRequired,
+ search: PropTypes.func.isRequired,
+ dataContact: PropTypes.object.isRequired,
+ itemSelected: PropTypes.number.isRequired,
+ closeNotif: PropTypes.func.isRequired,
+ messageNotif: PropTypes.string.isRequired,
+};
+
+const reducer = 'contact';
+const mapStateToProps = state => ({
+ force: state, // force state from reducer
+ avatarInit: state.getIn([reducer, 'avatarInit']),
+ dataContact: state.getIn([reducer, 'contactList']),
+ itemSelected: state.getIn([reducer, 'selectedIndex']),
+ keyword: state.getIn([reducer, 'keywordValue']),
+ open: state.getIn([reducer, 'openFrm']),
+ showMobileDetail: state.getIn([reducer, 'showMobileDetail']),
+ messageNotif: state.getIn([reducer, 'notifMsg']),
+});
+
+const constDispatchToProps = dispatch => ({
+ fetchData: bindActionCreators(fetchAction, dispatch),
+ showDetail: bindActionCreators(showDetailAction, dispatch),
+ hideDetail: () => dispatch(hideDetailAction),
+ submit: bindActionCreators(submitAction, dispatch),
+ edit: bindActionCreators(editAction, dispatch),
+ add: () => dispatch(addAction),
+ close: () => dispatch(closeAction),
+ remove: bindActionCreators(removeAction, dispatch),
+ favorite: bindActionCreators(addToFavoriteAction, dispatch),
+ search: bindActionCreators(searchAction, dispatch),
+ closeNotif: () => dispatch(closeNotifAction),
+});
+
+const ContactMapped = connect(
+ mapStateToProps,
+ constDispatchToProps
+)(Contact);
+
+export default withStyles(styles)(ContactMapped);
diff --git a/front/odiparpack/app/containers/Pages/Ecommerce/index.js b/front/odiparpack/app/containers/Pages/Ecommerce/index.js
new file mode 100644
index 0000000..8eb15a4
--- /dev/null
+++ b/front/odiparpack/app/containers/Pages/Ecommerce/index.js
@@ -0,0 +1,117 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import { bindActionCreators } from 'redux';
+import { connect } from 'react-redux';
+import data from 'ba-api/productData';
+import { SearchProduct, ProductGallery, Notification } from 'ba-components';
+import {
+ fetchAction,
+ addAction,
+ removeAction,
+ checkoutAction,
+ detailAction,
+ searchAction,
+ closeNotifAction
+} from 'ba-actions/EcommerceActions';
+
+class Ecommerce extends React.Component {
+ componentDidMount() {
+ this.props.fetchData(data);
+ }
+
+ render() {
+ const title = brand.name + ' - Ecommerce';
+ const description = brand.desc;
+ const {
+ dataProduct,
+ handleAddToCart,
+ dataCart,
+ removeItem,
+ checkout,
+ showDetail,
+ productIndex,
+ totalItems,
+ totalPrice,
+ search,
+ keyword,
+ closeNotif,
+ messageNotif
+ } = this.props;
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
closeNotif()} message={messageNotif} />
+
+
+
+ );
+ }
+}
+
+Ecommerce.propTypes = {
+ fetchData: PropTypes.func.isRequired,
+ handleAddToCart: PropTypes.func.isRequired,
+ removeItem: PropTypes.func.isRequired,
+ showDetail: PropTypes.func.isRequired,
+ checkout: PropTypes.func.isRequired,
+ search: PropTypes.func.isRequired,
+ keyword: PropTypes.string.isRequired,
+ dataProduct: PropTypes.object.isRequired,
+ dataCart: PropTypes.object.isRequired,
+ productIndex: PropTypes.number.isRequired,
+ totalItems: PropTypes.number.isRequired,
+ totalPrice: PropTypes.number.isRequired,
+ closeNotif: PropTypes.func.isRequired,
+ messageNotif: PropTypes.string.isRequired,
+};
+
+const reducer = 'ecommerce';
+const mapStateToProps = state => ({
+ force: state, // force state from reducer
+ keyword: state.getIn([reducer, 'keywordValue']),
+ dataProduct: state.getIn([reducer, 'productList']),
+ dataCart: state.getIn([reducer, 'cart']),
+ productIndex: state.getIn([reducer, 'productIndex']),
+ totalItems: state.getIn([reducer, 'totalItems']),
+ totalPrice: state.getIn([reducer, 'totalPrice']),
+ messageNotif: state.getIn([reducer, 'notifMsg']),
+});
+
+const constDispatchToProps = dispatch => ({
+ fetchData: bindActionCreators(fetchAction, dispatch),
+ search: bindActionCreators(searchAction, dispatch),
+ handleAddToCart: bindActionCreators(addAction, dispatch),
+ removeItem: bindActionCreators(removeAction, dispatch),
+ showDetail: bindActionCreators(detailAction, dispatch),
+ checkout: () => dispatch(checkoutAction),
+ closeNotif: () => dispatch(closeNotifAction),
+});
+
+const EcommerceMapped = connect(
+ mapStateToProps,
+ constDispatchToProps
+)(Ecommerce);
+
+export default EcommerceMapped;
diff --git a/front/odiparpack/app/containers/Pages/Email/index.js b/front/odiparpack/app/containers/Pages/Email/index.js
new file mode 100644
index 0000000..93285cb
--- /dev/null
+++ b/front/odiparpack/app/containers/Pages/Email/index.js
@@ -0,0 +1,210 @@
+import React from 'react';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import { bindActionCreators } from 'redux';
+import { connect } from 'react-redux';
+import data from 'ba-api/emailData';
+import {
+ EmailHeader,
+ EmailList,
+ EmailSidebar,
+ ComposeEmail,
+ Notification
+} from 'ba-components';
+import {
+ fetchMailAction,
+ openMailAction,
+ filterAction,
+ composeAction,
+ discardAction,
+ searchAction,
+ sendAction,
+ moveAction,
+ deleteAction,
+ toggleStaredAction,
+ closeNotifAction
+} from 'ba-actions/EmailActions';
+
+const styles = theme => ({
+ root: {
+ flexGrow: 1,
+ minHeight: 600,
+ zIndex: 1,
+ background: theme.palette.grey[50],
+ overflow: 'hidden',
+ display: 'flex',
+ boxShadow: theme.shadows[2]
+ }
+});
+
+// validation functions
+const email = value => (
+ value && !/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i.test(value)
+ ? 'Invalid email'
+ : ''
+);
+
+class Email extends React.Component {
+ state = {
+ to: '',
+ subject: '',
+ validMail: '',
+ mobileOpen: false,
+ };
+
+ componentDidMount() {
+ this.props.fetchData(data);
+ }
+
+ handleChange = (event, name) => {
+ if (name === 'to') {
+ this.setState({ validMail: email(event.target.value) });
+ }
+ this.setState({
+ [name]: event.target.value,
+ });
+ };
+
+ handleReply = (mail) => {
+ this.props.compose();
+ this.setState({
+ to: mail.get('name'),
+ subject: 'Reply: ' + mail.get('subject'),
+ });
+ }
+
+ handleCompose = () => {
+ this.props.compose();
+ this.setState({
+ to: ' ',
+ subject: ' ',
+ });
+ }
+
+ handleDrawerToggle = () => {
+ this.setState(state => ({ mobileOpen: !state.mobileOpen }));
+ };
+
+ render() {
+ const {
+ classes,
+ emailData,
+ openMail,
+ goto,
+ currentPage,
+ openFrm,
+ discard,
+ search,
+ keyword,
+ sendEmail,
+ moveTo,
+ remove,
+ toggleStar,
+ closeNotif,
+ messageNotif
+ } = this.props;
+ const {
+ to,
+ subject,
+ validMail,
+ mobileOpen
+ } = this.state;
+ const title = brand.name + ' - Email';
+ const description = brand.desc;
+ return (
+
+
+ {title}
+
+
+
+
+
+
+ closeNotif()} message={messageNotif} />
+
+
+
+
+
+ );
+ }
+}
+
+Email.propTypes = {
+ classes: PropTypes.object.isRequired,
+ emailData: PropTypes.object.isRequired,
+ fetchData: PropTypes.func.isRequired,
+ openMail: PropTypes.func.isRequired,
+ goto: PropTypes.func.isRequired,
+ compose: PropTypes.func.isRequired,
+ discard: PropTypes.func.isRequired,
+ search: PropTypes.func.isRequired,
+ sendEmail: PropTypes.func.isRequired,
+ moveTo: PropTypes.func.isRequired,
+ remove: PropTypes.func.isRequired,
+ toggleStar: PropTypes.func.isRequired,
+ keyword: PropTypes.string.isRequired,
+ currentPage: PropTypes.string.isRequired,
+ openFrm: PropTypes.bool.isRequired,
+ closeNotif: PropTypes.func.isRequired,
+ messageNotif: PropTypes.string.isRequired,
+};
+
+const reducer = 'email';
+const mapStateToProps = state => ({
+ force: state, // force state from reducer
+ keyword: state.getIn([reducer, 'keywordValue']),
+ initValues: state.getIn([reducer, 'formValues']),
+ emailData: state.getIn([reducer, 'inbox']),
+ currentPage: state.getIn([reducer, 'currentPage']),
+ openFrm: state.getIn([reducer, 'openFrm']),
+ messageNotif: state.getIn([reducer, 'notifMsg']),
+});
+
+const constDispatchToProps = dispatch => ({
+ fetchData: bindActionCreators(fetchMailAction, dispatch),
+ openMail: bindActionCreators(openMailAction, dispatch),
+ goto: bindActionCreators(filterAction, dispatch),
+ search: bindActionCreators(searchAction, dispatch),
+ moveTo: bindActionCreators(moveAction, dispatch),
+ remove: bindActionCreators(deleteAction, dispatch),
+ toggleStar: bindActionCreators(toggleStaredAction, dispatch),
+ compose: () => dispatch(composeAction),
+ discard: () => dispatch(discardAction),
+ sendEmail: bindActionCreators(sendAction, dispatch),
+ closeNotif: () => dispatch(closeNotifAction),
+});
+
+const EmailMapped = connect(
+ mapStateToProps,
+ constDispatchToProps
+)(Email);
+
+export default withStyles(styles)(EmailMapped);
diff --git a/front/odiparpack/app/containers/Pages/Error/index.js b/front/odiparpack/app/containers/Pages/Error/index.js
new file mode 100644
index 0000000..b408b53
--- /dev/null
+++ b/front/odiparpack/app/containers/Pages/Error/index.js
@@ -0,0 +1,33 @@
+import React from 'react';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import { Route } from 'react-router-dom';
+import { ErrorWrap } from 'ba-components';
+
+const title = brand.name + ' - Aplication Error';
+const description = brand.desc;
+
+const Error = () => (
+ {
+ if (staticContext) {
+ staticContext.status = 404; // eslint-disable-line
+ }
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+ );
+ }}
+ />
+);
+
+export default Error;
diff --git a/front/odiparpack/app/containers/Pages/HelpSupport/ContactForm.js b/front/odiparpack/app/containers/Pages/HelpSupport/ContactForm.js
new file mode 100644
index 0000000..2568943
--- /dev/null
+++ b/front/odiparpack/app/containers/Pages/HelpSupport/ContactForm.js
@@ -0,0 +1,115 @@
+import React, { Component } from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import { Field, reduxForm } from 'redux-form/immutable';
+import { bindActionCreators } from 'redux';
+import { connect } from 'react-redux';
+import { PapperBlock } from 'ba-components';
+import { initAction, clearAction } from 'ba-actions/ReduxFormActions';
+import { TextFieldRedux } from 'ba-components/Forms/ReduxFormMUI';
+import { Button } from '@material-ui/core';
+import styles from './helpSupport-jss';
+
+// validation functions
+const required = value => (value == null ? 'Required' : undefined);
+const email = value => (
+ value && !/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i.test(value)
+ ? 'Invalid email'
+ : undefined
+);
+
+class ContactForm extends Component {
+ render() {
+ const trueBool = true;
+ const {
+ classes,
+ handleSubmit,
+ pristine,
+ reset,
+ submitting,
+ } = this.props;
+ return (
+
+ );
+ }
+}
+
+ContactForm.propTypes = {
+ classes: PropTypes.object.isRequired,
+ handleSubmit: PropTypes.func.isRequired,
+ reset: PropTypes.func.isRequired,
+ pristine: PropTypes.bool.isRequired,
+ submitting: PropTypes.bool.isRequired,
+};
+
+const mapDispatchToProps = dispatch => ({
+ init: bindActionCreators(initAction, dispatch),
+ clear: () => dispatch(clearAction),
+});
+
+const ContactFormMapped = reduxForm({
+ form: 'immutableExample',
+})(ContactForm);
+
+const reducer = 'initval';
+const FormInit = connect(
+ state => ({
+ force: state,
+ initialValues: state.getIn([reducer, 'formValues'])
+ }),
+ mapDispatchToProps,
+)(ContactFormMapped);
+
+export default withStyles(styles)(FormInit);
diff --git a/front/odiparpack/app/containers/Pages/HelpSupport/Qna.js b/front/odiparpack/app/containers/Pages/HelpSupport/Qna.js
new file mode 100644
index 0000000..bb8a6ae
--- /dev/null
+++ b/front/odiparpack/app/containers/Pages/HelpSupport/Qna.js
@@ -0,0 +1,141 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import ExpandMoreIcon from '@material-ui/icons/ExpandMore';
+import { ExpansionPanel, ExpansionPanelDetails, ExpansionPanelSummary, Typography } from '@material-ui/core';
+import styles from './helpSupport-jss';
+
+
+class Qna extends React.Component {
+ state = {
+ expanded: null,
+ };
+
+ handleChange = panel => (event, expanded) => {
+ this.setState({
+ expanded: expanded ? panel : false,
+ });
+ };
+
+ render() {
+ const { classes } = this.props;
+ const { expanded } = this.state;
+
+ return (
+
+
+ }>
+ Pellentesque ac bibendum tortor?
+
+
+
+ Nulla facilisi. Phasellus sollicitudin nulla et quam mattis feugiat. Aliquam eget
+ maximus est, id dignissim quam.
+
+
+
+
+ }>
+ Vivamus sit amet interdum elit?
+
+
+
+ Donec placerat, lectus sed mattis semper, neque lectus feugiat lectus, varius pulvinar
+ diam eros in elit. Pellentesque convallis laoreet laoreet.
+
+
+
+
+ }>
+ Vestibulum nec mi suscipit?
+
+
+
+ Nunc vitae orci ultricies, auctor nunc in, volutpat nisl. Integer sit amet egestas
+ eros, vitae egestas augue. Duis vel est augue.
+
+
+
+
+ }>
+ Cras convallis lacus orci?
+
+
+
+ Nunc vitae orci ultricies, auctor nunc in, volutpat nisl. Integer sit amet egestas
+ eros, vitae egestas augue. Duis vel est augue.
+
+
+
+
+ }>
+ Quisque ut metus sit amet?
+
+
+
+ enean sit amet magna vel magna fringilla fermentum. Donec sit amet nulla sed arcu pulvinar ultricies commodo id ligula.
+
+
+
+
+ }>
+ Nulla vehicula leo ut augue tincidunt?
+
+
+
+ Curabitur egestas consequat lorem, vel fermentum augue porta id. Aliquam lobortis magna neque, gravida consequat velit venenatis at.
+
+
+
+
+ }>
+ Vivamus sit amet interdum elit?
+
+
+
+ Donec dignissim, odio ac imperdiet luctus, ante nisl accumsan justo, et venenatis ante metus pellentesque sem.
+
+
+
+
+ }>
+ Maecenas nisl libero, tincidunt id odio id?
+
+
+
+ Ut sed eros finibus, placerat orci id, dapibus mauris. Vestibulum consequat hendrerit lacus. In id nisi id neque venenatis molestie.
+
+
+
+
+ }>
+ Vestibulum nec mi suscipit?
+
+
+
+ Nunc vitae orci ultricies, auctor nunc in, volutpat nisl. Integer sit amet egestas
+ eros, vitae egestas augue. Duis vel est augue.
+
+
+
+
+ }>
+ Cras convallis lacus orci?
+
+
+
+ Nunc vitae orci ultricies, auctor nunc in, volutpat nisl. Integer sit amet egestas
+ eros, vitae egestas augue. Duis vel est augue.
+
+
+
+
+ );
+ }
+}
+
+Qna.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(Qna);
diff --git a/front/odiparpack/app/containers/Pages/HelpSupport/helpSupport-jss.js b/front/odiparpack/app/containers/Pages/HelpSupport/helpSupport-jss.js
new file mode 100644
index 0000000..5c954cb
--- /dev/null
+++ b/front/odiparpack/app/containers/Pages/HelpSupport/helpSupport-jss.js
@@ -0,0 +1,49 @@
+const styles = theme => ({
+ title: {
+ display: 'block',
+ margin: `${theme.spacing(3)}px 0`,
+ color: theme.palette.common.white,
+ },
+ iconTitle: {
+ position: 'relative',
+ top: theme.spacing(0.5),
+ marginRight: theme.spacing(0.5),
+ },
+ heading: {
+ fontSize: theme.typography.pxToRem(15),
+ flexBasis: '100%',
+ fontWeight: 700,
+ flexShrink: 0,
+ },
+ secondaryHeading: {
+ fontSize: theme.typography.pxToRem(15),
+ color: theme.palette.text.secondary,
+ },
+ root: {
+ width: '100%',
+ flexGrow: 1,
+ padding: 30
+ },
+ field: {
+ width: '100%',
+ marginBottom: 20
+ },
+ fieldBasic: {
+ width: '100%',
+ marginBottom: 20,
+ marginTop: 10
+ },
+ inlineWrap: {
+ display: 'flex',
+ flexDirection: 'row'
+ },
+ buttonInit: {
+ margin: theme.spacing(4),
+ textAlign: 'center'
+ },
+ frmWrap: {
+ marginTop: theme.spacing(1) * -3
+ }
+});
+
+export default styles;
diff --git a/front/odiparpack/app/containers/Pages/HelpSupport/index.js b/front/odiparpack/app/containers/Pages/HelpSupport/index.js
new file mode 100644
index 0000000..68df97b
--- /dev/null
+++ b/front/odiparpack/app/containers/Pages/HelpSupport/index.js
@@ -0,0 +1,58 @@
+import React from 'react';
+import { PropTypes } from 'prop-types';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import LiveHelp from '@material-ui/icons/LiveHelp';
+import { isWidthUp } from '@material-ui/core/withWidth';
+import { withStyles } from '@material-ui/core/styles';
+import { Typography, withWidth, Grid } from '@material-ui/core';
+import styles from './helpSupport-jss';
+import Qna from './Qna';
+import ContactForm from './ContactForm';
+
+
+class Settings extends React.Component {
+ showResult(values) {
+ setTimeout(() => {
+ this.setState({ valueForm: values });
+ window.alert(`You submitted:\n\n${this.state.valueForm}`);
+ }, 500); // simulate server latency
+ }
+
+ render() {
+ const title = brand.name;
+ const description = brand.desc;
+ const { classes, width } = this.props;
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+ Help & Support
+
+
+
+
+
+
+ this.showResult(values)} />
+
+
+
+ );
+ }
+}
+
+Settings.propTypes = {
+ classes: PropTypes.object.isRequired,
+ width: PropTypes.string.isRequired,
+};
+
+export default withStyles(styles)(withWidth()(Settings));
diff --git a/front/odiparpack/app/containers/Pages/Maintenance/index.js b/front/odiparpack/app/containers/Pages/Maintenance/index.js
new file mode 100644
index 0000000..8771e51
--- /dev/null
+++ b/front/odiparpack/app/containers/Pages/Maintenance/index.js
@@ -0,0 +1,88 @@
+import React from 'react';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import Build from '@material-ui/icons/Build';
+import Settings from '@material-ui/icons/SettingsApplications';
+import Warning from '@material-ui/icons/Warning';
+import { Typography, Avatar, Hidden, Paper } from '@material-ui/core';
+
+const styles = theme => ({
+ root: {
+ display: 'flex',
+ justifyContent: 'center',
+ alignItems: 'center',
+ height: '100%'
+ },
+ paper: {
+ margin: 'auto',
+ padding: 40,
+ width: '90%',
+ [theme.breakpoints.up('sm')]: {
+ width: 600,
+ height: 300,
+ },
+ textAlign: 'center'
+ },
+ artwork: {
+ display: 'flex',
+ justifyContent: 'center',
+ marginBottom: 30
+ },
+ icon: {
+ margin: '10px 20px',
+ background: theme.palette.secondary.main,
+ color: theme.palette.common.white,
+ width: 100,
+ height: 100,
+ '& svg': {
+ fontSize: 64,
+ },
+ },
+});
+
+class Maintenance extends React.Component {
+ render() {
+ const title = brand.name + ' - Maintenance';
+ const description = brand.desc;
+ const { classes } = this.props;
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+ Website under maintenance
+
+Our website is under maintenance. We
+ {"'"}
+ll be back shortly
+
+
+
+
+ );
+ }
+}
+
+Maintenance.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(Maintenance);
diff --git a/front/odiparpack/app/containers/Pages/Photos/index.js b/front/odiparpack/app/containers/Pages/Photos/index.js
new file mode 100644
index 0000000..7068ed5
--- /dev/null
+++ b/front/odiparpack/app/containers/Pages/Photos/index.js
@@ -0,0 +1,27 @@
+import React from 'react';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import imgData from 'ba-api/imgDataMasonry';
+import { PhotoGallery } from 'ba-components';
+
+class Photos extends React.Component {
+ render() {
+ const title = brand.name + ' - Photo Gallery';
+ const description = brand.desc;
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+export default Photos;
diff --git a/front/odiparpack/app/containers/Pages/Settings/DetailSettings.js b/front/odiparpack/app/containers/Pages/Settings/DetailSettings.js
new file mode 100644
index 0000000..25bad64
--- /dev/null
+++ b/front/odiparpack/app/containers/Pages/Settings/DetailSettings.js
@@ -0,0 +1,203 @@
+import React from 'react';
+import { PropTypes } from 'prop-types';
+import classNames from 'classnames';
+import SettingsIcon from '@material-ui/icons/SettingsApplications';
+import CloseIcon from '@material-ui/icons/Close';
+import { withStyles } from '@material-ui/core/styles';
+import {
+ AppBar,
+ Grid,
+ Dialog,
+ Toolbar,
+ ListItemText,
+ ListItem,
+ List,
+ ListItemSecondaryAction,
+ Divider,
+ IconButton,
+ Typography,
+ Button,
+ Switch,
+ Slide,
+ InputLabel,
+ MenuItem,
+ FormControl,
+ Select,
+ Checkbox,
+ TextField,
+} from '@material-ui/core';
+import styles from './settings-jss';
+
+
+const Transition = React.forwardRef(function Transition(props, ref) { // eslint-disable-line
+ return ;
+});
+
+class DetailSettings extends React.Component {
+ state = {
+ checked: ['switch', 'check2'],
+ option: '',
+ };
+
+ handleToggle = value => () => {
+ const { checked } = this.state;
+ const currentIndex = checked.indexOf(value);
+ const newChecked = [...checked];
+
+ if (currentIndex === -1) {
+ newChecked.push(value);
+ } else {
+ newChecked.splice(currentIndex, 1);
+ }
+
+ this.setState({
+ checked: newChecked,
+ });
+ };
+
+ handleChange = name => event => {
+ this.setState({
+ [name]: event.target.value,
+ });
+ };
+
+ handleChangeSelection = event => {
+ this.setState({ [event.target.name]: event.target.value });
+ };
+
+ render() {
+ const { classes, open, handleClose } = this.props;
+ return (
+
+
+
+
+
+
+
+ Setting
+
+
+ done
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Option
+
+
+ None
+
+ Option Ten
+ Option Twenty
+ Option Thirty
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Action Button
+
+
+
+
+
+
+
+
+
+ Action Button Icon
+
+
+
+
+
+
+
+ );
+ }
+}
+
+DetailSettings.propTypes = {
+ classes: PropTypes.object.isRequired,
+ open: PropTypes.bool.isRequired,
+ handleClose: PropTypes.func.isRequired,
+};
+
+export default withStyles(styles)(DetailSettings);
diff --git a/front/odiparpack/app/containers/Pages/Settings/index.js b/front/odiparpack/app/containers/Pages/Settings/index.js
new file mode 100644
index 0000000..2ab94d2
--- /dev/null
+++ b/front/odiparpack/app/containers/Pages/Settings/index.js
@@ -0,0 +1,117 @@
+import React from 'react';
+import { PropTypes } from 'prop-types';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import SearchIcon from '@material-ui/icons/Search';
+import SettingsIcon from '@material-ui/icons/SettingsApplications';
+import { withStyles } from '@material-ui/core/styles';
+import settingList from 'ba-api/settingList';
+import { AppBar, Grid, Toolbar, Typography, Button, Icon } from '@material-ui/core';
+import DetailSettings from './DetailSettings';
+import styles from './settings-jss';
+
+
+class Settings extends React.Component {
+ state = {
+ open: false,
+ checked: ['switch', 'check2'],
+ keyword: ''
+ };
+
+ handleToggle = value => () => {
+ const { checked } = this.state;
+ const currentIndex = checked.indexOf(value);
+ const newChecked = [...checked];
+
+ if (currentIndex === -1) {
+ newChecked.push(value);
+ } else {
+ newChecked.splice(currentIndex, 1);
+ }
+
+ this.setState({
+ checked: newChecked,
+ });
+ };
+
+ handleChange = name => event => {
+ this.setState({
+ [name]: event.target.value,
+ });
+ };
+
+ handleClickOpen = () => {
+ this.setState({ open: true });
+ };
+
+ handleClose = () => {
+ this.setState({ open: false });
+ };
+
+ handleSearch = event => {
+ this.setState({ keyword: event.target.value.toLowerCase() });
+ }
+
+ render() {
+ const title = brand.name;
+ const description = brand.desc;
+ const { classes } = this.props;
+ const { keyword } = this.state;
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+ Appication Settings
+
+
+
+
+
+
+
+
+
this.handleSearch(event)} />
+
+
+
+
+
+
+ {settingList.map(menu => {
+ const rawKey = menu.name + menu.caption;
+ if (rawKey.toLowerCase().indexOf(keyword) === -1) {
+ return false;
+ }
+ return (
+
+
+ {menu.icon}
+ {menu.name}
+
+ {menu.caption}
+
+
+
+ );
+ })}
+
+
+
+
+ );
+ }
+}
+
+Settings.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(Settings);
diff --git a/front/odiparpack/app/containers/Pages/Settings/settings-jss.js b/front/odiparpack/app/containers/Pages/Settings/settings-jss.js
new file mode 100644
index 0000000..5424d4e
--- /dev/null
+++ b/front/odiparpack/app/containers/Pages/Settings/settings-jss.js
@@ -0,0 +1,87 @@
+const styles = theme => ({
+ appBar: {
+ position: 'relative',
+ },
+ flex: {
+ flex: 1,
+ },
+ title: {
+ display: 'block',
+ margin: `${theme.spacing(3)}px 0`,
+ color: theme.palette.common.white,
+ },
+ searchSettings: {
+ marginBottom: theme.spacing(4),
+ },
+ wrapper: {
+ fontFamily: theme.typography.fontFamily,
+ position: 'relative',
+ marginRight: theme.spacing(2),
+ marginLeft: theme.spacing(1),
+ borderRadius: 2,
+ display: 'block',
+ },
+ search: {
+ width: 'auto',
+ height: '100%',
+ position: 'absolute',
+ pointerEvents: 'none',
+ display: 'flex',
+ alignItems: 'center',
+ justifyContent: 'center',
+ },
+ input: {
+ font: 'inherit',
+ padding: `${theme.spacing(1)}px ${theme.spacing(1)}px ${theme.spacing(1)}px ${theme.spacing(4)}px`,
+ border: 0,
+ display: 'block',
+ verticalAlign: 'middle',
+ whiteSpace: 'normal',
+ background: 'none',
+ margin: 0, // Reset for Safari
+ color: 'inherit',
+ width: '100%',
+ '&:focus': {
+ outline: 0,
+ },
+ },
+ iconTitle: {
+ position: 'relative',
+ marginRight: theme.spacing(0.5),
+ },
+ button: {
+ display: 'block',
+ width: '100%',
+ background: theme.palette.grey[50],
+ '&:hover': {
+ background: theme.palette.secondary.light
+ },
+ '& $icon': {
+ margin: '0 auto',
+ display: 'block',
+ fontSize: 64
+ },
+ '& $info': {
+ display: 'block',
+ textTransform: 'none',
+ color: theme.palette.grey[500]
+ }
+ },
+ info: {},
+ icon: {},
+ formControl: {
+ margin: theme.spacing(1),
+ minWidth: 120,
+ },
+ selectEmpty: {
+ marginTop: theme.spacing(2),
+ },
+ iconSmall: {
+ fontSize: 20,
+ },
+ leftIcon: {
+ marginRight: theme.spacing(1),
+ },
+});
+
+export default styles;
diff --git a/front/odiparpack/app/containers/Pages/SocialMedia/index.js b/front/odiparpack/app/containers/Pages/SocialMedia/index.js
new file mode 100644
index 0000000..3a5ae2c
--- /dev/null
+++ b/front/odiparpack/app/containers/Pages/SocialMedia/index.js
@@ -0,0 +1,110 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import { bindActionCreators } from 'redux';
+import { connect } from 'react-redux';
+import data from 'ba-api/timelineData';
+import {
+ fetchAction,
+ postAction,
+ toggleLikeAction,
+ fetchCommentAction,
+ postCommentAction,
+ closeNotifAction
+} from 'ba-actions/SocmedActions';
+import { Timeline, WritePost, SideSection, Notification } from 'ba-components';
+import { Grid } from '@material-ui/core';
+
+class SocialMedia extends React.Component {
+ componentDidMount() {
+ this.props.fetchData(data);
+ }
+
+ render() {
+ const title = brand.name + ' - Social Media';
+ const description = brand.desc;
+ const {
+ dataProps,
+ submitPost,
+ submitLike,
+ submitComment,
+ fetchComment,
+ commentIndex,
+ closeNotif,
+ messageNotif,
+ } = this.props;
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
closeNotif()} message={messageNotif} />
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+SocialMedia.propTypes = {
+ fetchData: PropTypes.func.isRequired,
+ submitPost: PropTypes.func.isRequired,
+ submitLike: PropTypes.func.isRequired,
+ submitComment: PropTypes.func.isRequired,
+ dataProps: PropTypes.object.isRequired,
+ fetchComment: PropTypes.func.isRequired,
+ commentIndex: PropTypes.number.isRequired,
+ closeNotif: PropTypes.func.isRequired,
+ messageNotif: PropTypes.string.isRequired,
+};
+
+const reducer = 'socmed';
+const mapStateToProps = state => ({
+ force: state, // force state from reducer
+ dataProps: state.getIn([reducer, 'dataTimeline']),
+ commentIndex: state.getIn([reducer, 'commentIndex']),
+ messageNotif: state.getIn([reducer, 'notifMsg']),
+});
+
+const constDispatchToProps = dispatch => ({
+ fetchData: bindActionCreators(fetchAction, dispatch),
+ submitPost: bindActionCreators(postAction, dispatch),
+ submitComment: bindActionCreators(postCommentAction, dispatch),
+ submitLike: bindActionCreators(toggleLikeAction, dispatch),
+ fetchComment: bindActionCreators(fetchCommentAction, dispatch),
+ closeNotif: () => dispatch(closeNotifAction),
+});
+
+const SocialMediaMapped = connect(
+ mapStateToProps,
+ constDispatchToProps
+)(SocialMedia);
+
+export default SocialMediaMapped;
diff --git a/front/odiparpack/app/containers/Pages/Standalone/LoginDedicated.js b/front/odiparpack/app/containers/Pages/Standalone/LoginDedicated.js
new file mode 100644
index 0000000..9cba8fb
--- /dev/null
+++ b/front/odiparpack/app/containers/Pages/Standalone/LoginDedicated.js
@@ -0,0 +1,33 @@
+import React from 'react';
+import { PropTypes } from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import brand from 'ba-api/brand';
+import logo from 'ba-images/logo.svg';
+import styles from 'ba-containers/Templates/appStyles-jss';
+import { Hidden } from '@material-ui/core';
+import Login from '../Users/Login';
+
+class LoginDedicated extends React.Component {
+ render() {
+ const { classes } = this.props;
+ return (
+
+
+
+
+
+
{brand.name}
+
+
+
+
+
+ );
+ }
+}
+
+LoginDedicated.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default (withStyles(styles)(LoginDedicated));
diff --git a/front/odiparpack/app/containers/Pages/Standalone/NotFoundDedicated.js b/front/odiparpack/app/containers/Pages/Standalone/NotFoundDedicated.js
new file mode 100644
index 0000000..3d78b32
--- /dev/null
+++ b/front/odiparpack/app/containers/Pages/Standalone/NotFoundDedicated.js
@@ -0,0 +1,24 @@
+import React from 'react';
+import { PropTypes } from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import styles from 'ba-containers/Templates/appStyles-jss';
+import Error from './../Error';
+
+class NotFoundDedicated extends React.Component {
+ render() {
+ const { classes } = this.props;
+ return (
+
+
+
+
+
+ );
+ }
+}
+
+NotFoundDedicated.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default (withStyles(styles)(NotFoundDedicated));
diff --git a/front/odiparpack/app/containers/Pages/UserProfile/index.js b/front/odiparpack/app/containers/Pages/UserProfile/index.js
new file mode 100644
index 0000000..2065f68
--- /dev/null
+++ b/front/odiparpack/app/containers/Pages/UserProfile/index.js
@@ -0,0 +1,131 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import dummy from 'ba-api/dummyContents';
+import AccountCircle from '@material-ui/icons/AccountCircle';
+import SupervisorAccount from '@material-ui/icons/SupervisorAccount';
+import Favorite from '@material-ui/icons/Favorite';
+import PhotoLibrary from '@material-ui/icons/PhotoLibrary';
+import { bindActionCreators } from 'redux';
+import { connect } from 'react-redux';
+import data from 'ba-api/timelineData';
+import { fetchAction } from 'ba-actions/SocmedActions';
+import {
+ Cover,
+ About,
+ Connection,
+ Favorites,
+ Albums
+} from 'ba-components';
+
+import { AppBar, Tabs, Tab, Hidden } from '@material-ui/core';
+
+function TabContainer(props) {
+ return (
+
+ {props.children}
+
+ );
+}
+
+TabContainer.propTypes = {
+ children: PropTypes.node.isRequired,
+};
+
+class UserProfile extends React.Component {
+ state = {
+ value: 0,
+ };
+
+ componentDidMount() {
+ this.props.fetchData(data);
+ }
+
+ handleChange = (event, value) => {
+ this.setState({ value });
+ };
+
+ render() {
+ const title = brand.name + ' - Profile';
+ const description = brand.desc;
+ const { dataProps } = this.props;
+ const { value } = this.state;
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+ } />
+ } />
+ } />
+ } />
+
+
+
+
+ } label="ABOUT" />
+ } label="20 CONNECTIONS" />
+ } label="18 FAVORITES" />
+ } label="4 ALBUMS" />
+
+
+
+ {value === 0 &&
}
+ {value === 1 &&
}
+ {value === 2 &&
}
+ {value === 3 &&
}
+
+ );
+ }
+}
+
+UserProfile.propTypes = {
+ dataProps: PropTypes.object.isRequired,
+ fetchData: PropTypes.func.isRequired,
+};
+
+const reducer = 'socmed';
+const mapStateToProps = state => ({
+ force: state, // force state from reducer
+ dataProps: state.getIn([reducer, 'dataTimeline'])
+});
+
+const constDispatchToProps = dispatch => ({
+ fetchData: bindActionCreators(fetchAction, dispatch)
+});
+
+const UserProfileMapped = connect(
+ mapStateToProps,
+ constDispatchToProps
+)(UserProfile);
+
+export default UserProfileMapped;
diff --git a/front/odiparpack/app/containers/Pages/Users/LockScreen.js b/front/odiparpack/app/containers/Pages/Users/LockScreen.js
new file mode 100644
index 0000000..2752ae6
--- /dev/null
+++ b/front/odiparpack/app/containers/Pages/Users/LockScreen.js
@@ -0,0 +1,55 @@
+import React from 'react';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import { LockForm } from 'ba-components';
+import styles from 'ba-components/Forms/user-jss';
+import { Grid } from '@material-ui/core';
+
+class ResetPassword extends React.Component {
+ state = {
+ valueForm: []
+ }
+
+ submitForm(values) {
+ setTimeout(() => {
+ this.setState({ valueForm: values });
+ console.log(`You submitted:\n\n${this.state.valueForm}`);
+ window.location.href = '/app';
+ }, 500); // simulate server latency
+ }
+
+ render() {
+ const title = brand.name + ' - Lock Screen';
+ const description = brand.desc;
+ const { classes } = this.props;
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+ {/* ----------------------------------------------------------------------*/}
+ {/* Load Login Form */}
+ this.submitForm(values)} />
+
+
+
+
+ );
+ }
+}
+
+ResetPassword.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(ResetPassword);
diff --git a/front/odiparpack/app/containers/Pages/Users/Login.js b/front/odiparpack/app/containers/Pages/Users/Login.js
new file mode 100644
index 0000000..300f7b4
--- /dev/null
+++ b/front/odiparpack/app/containers/Pages/Users/Login.js
@@ -0,0 +1,85 @@
+import React from 'react';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import Type from 'ba-styles/Typography.scss';
+import ArrowForward from '@material-ui/icons/ArrowForward';
+import logo from 'ba-images/logo.svg';
+import { LoginForm } from 'ba-components';
+import styles from 'ba-components/Forms/user-jss';
+
+import { Grid, Hidden, Typography } from '@material-ui/core';
+
+class Login extends React.Component {
+ state = {
+ valueForm: []
+ }
+
+ submitForm(values) {
+ setTimeout(() => {
+ this.setState({ valueForm: values });
+ console.log(`You submitted:\n\n${this.state.valueForm}`);
+ window.location.href = '/app';
+ }, 500); // simulate server latency
+ }
+
+ render() {
+ const title = brand.name + ' - Login';
+ const description = brand.desc;
+ const { classes } = this.props;
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+
+ {/* Welcome Login */}
+
+
+
+
+
{brand.name}
+
+
+ Hello there,
+
+
+
+ welcome to
+ {' '}
+ {brand.name}
+
+
+
+
+
+
+
+
+ {/* ----------------------------------------------------------------------*/}
+ {/* Load Login Form */}
+ this.submitForm(values)} />
+
+
+
+
+
+ );
+ }
+}
+
+Login.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(Login);
diff --git a/front/odiparpack/app/containers/Pages/Users/Register.js b/front/odiparpack/app/containers/Pages/Users/Register.js
new file mode 100644
index 0000000..c139068
--- /dev/null
+++ b/front/odiparpack/app/containers/Pages/Users/Register.js
@@ -0,0 +1,78 @@
+import React from 'react';
+import { Helmet } from 'react-helmet';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import Type from 'ba-styles/Typography.scss';
+import ArrowForward from '@material-ui/icons/ArrowForward';
+import brand from 'ba-api/brand';
+import logo from 'ba-images/logo.svg';
+import { RegisterForm } from 'ba-components';
+import styles from 'ba-components/Forms/user-jss';
+
+import { Grid, Hidden, Typography } from '@material-ui/core';
+
+class Login extends React.Component {
+ state = {
+ valueForm: []
+ }
+
+ submitForm(values) {
+ setTimeout(() => {
+ this.setState({ valueForm: values });
+ console.log(`You submitted:\n\n${this.state.valueForm}`);
+ window.location.href = '/app';
+ }, 500); // simulate server latency
+ }
+
+ render() {
+ const title = brand.name + ' - Register';
+ const description = brand.desc;
+ const { classes } = this.props;
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+
+ {/* Welcome Login */}
+
+
+
+
+
{brand.name}
+
+
+ Nice to meet You :)
+
+
+
+
+
+
+
+ {/* ----------------------------------------------------------------------*/}
+ {/* Load Register Form */}
+ this.submitForm(values)} />
+
+
+
+
+
+ );
+ }
+}
+
+Login.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(Login);
diff --git a/front/odiparpack/app/containers/Pages/Users/ResetPassword.js b/front/odiparpack/app/containers/Pages/Users/ResetPassword.js
new file mode 100644
index 0000000..e80253d
--- /dev/null
+++ b/front/odiparpack/app/containers/Pages/Users/ResetPassword.js
@@ -0,0 +1,54 @@
+import React from 'react';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import { ResetForm } from 'ba-components';
+import styles from 'ba-components/Forms/user-jss';
+import { Grid } from '@material-ui/core';
+
+class ResetPassword extends React.Component {
+ state = {
+ valueForm: []
+ }
+
+ submitForm(values) {
+ setTimeout(() => {
+ this.setState({ valueForm: values });
+ console.log(`You submitted:\n\n${this.state.valueForm}`);
+ }, 500); // simulate server latency
+ }
+
+ render() {
+ const title = brand.name + ' - Reset Password';
+ const description = brand.desc;
+ const { classes } = this.props;
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+ {/* ----------------------------------------------------------------------*/}
+ {/* Load Login Form */}
+ this.submitForm(values)} />
+
+
+
+
+ );
+ }
+}
+
+ResetPassword.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(ResetPassword);
diff --git a/front/odiparpack/app/containers/Parent/index.js b/front/odiparpack/app/containers/Parent/index.js
new file mode 100644
index 0000000..50067c3
--- /dev/null
+++ b/front/odiparpack/app/containers/Parent/index.js
@@ -0,0 +1,72 @@
+import React from 'react';
+import { PropTypes } from 'prop-types';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import { withStyles } from '@material-ui/core/styles';
+import { Link } from 'react-router-dom';
+import MenuContent from 'ba-api/menu';
+import { PapperBlock } from 'ba-components';
+import { Button } from '@material-ui/core';
+
+const styles = {
+ link: {
+ display: 'block',
+ textTransform: 'capitalize'
+ }
+};
+
+function sortByKey(array, key) {
+ return array.sort((a, b) => {
+ const x = a[key]; const y = b[key];
+ return ((x < y) ? -1 : ((x > y) ? 1 : 0));
+ });
+}
+
+class Parent extends React.Component {
+ render() {
+ const title = brand.name;
+ const description = brand.desc;
+ const { classes } = this.props;
+ // Get Path Location
+ let parts = this.props.history.location.pathname.split('/');
+ const place = parts[parts.length - 1];
+ parts = parts.slice(1, parts.length - 1);
+ const menuItems = MenuContent
+ .find(obj => (
+ obj.key === place
+ ));
+ const getMenus = menuArray => menuArray.map((item, index) => (
+
+ {item.name}
+
+ ));
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+ {menuItems !== undefined && getMenus(sortByKey(menuItems.child, 'key'))}
+
+
+ );
+ }
+}
+
+Parent.propTypes = {
+ classes: PropTypes.object.isRequired,
+ history: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(Parent);
diff --git a/front/odiparpack/app/containers/Tables/AdvancedTable.js b/front/odiparpack/app/containers/Tables/AdvancedTable.js
new file mode 100644
index 0000000..4d1b60a
--- /dev/null
+++ b/front/odiparpack/app/containers/Tables/AdvancedTable.js
@@ -0,0 +1,46 @@
+import React, { Component } from 'react';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import { withStyles } from '@material-ui/core/styles';
+import { SourceReader, PapperBlock } from 'ba-components';
+import { AdvTableDemo, AdvFilter } from './demos';
+
+const styles = ({
+ root: {
+ flexGrow: 1,
+ }
+});
+
+class AdvancedTable extends Component {
+ render() {
+ const title = brand.name + ' - Table';
+ const description = brand.desc;
+ const docSrc = 'containers/Tables/demos/';
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+export default withStyles(styles)(AdvancedTable);
diff --git a/front/odiparpack/app/containers/Tables/BasicTable.js b/front/odiparpack/app/containers/Tables/BasicTable.js
new file mode 100644
index 0000000..a6f81e1
--- /dev/null
+++ b/front/odiparpack/app/containers/Tables/BasicTable.js
@@ -0,0 +1,110 @@
+import React, { Component } from 'react';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import Markdown from 'react-markdown';
+import codeStyle from 'ba-styles/Code.scss';
+import { SourceReader, PapperBlock } from 'ba-components';
+import { Grid } from '@material-ui/core';
+import {
+ StrippedTable,
+ HoverTable,
+ BorderedTable,
+ TrackingTable,
+ StatusLabel,
+ StatusColorRow,
+ EmptyTable
+} from './demos';
+
+const styles = ({
+ root: {
+ flexGrow: 1,
+ }
+});
+
+class BasicTable extends Component {
+ render() {
+ const { classes } = this.props;
+ const title = brand.name + ' - Table';
+ const description = brand.desc;
+ const docSrc = 'containers/Tables/demos/';
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+BasicTable.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(BasicTable);
diff --git a/front/odiparpack/app/containers/Tables/CrudTable.js b/front/odiparpack/app/containers/Tables/CrudTable.js
new file mode 100644
index 0000000..7ee18dd
--- /dev/null
+++ b/front/odiparpack/app/containers/Tables/CrudTable.js
@@ -0,0 +1,57 @@
+import React, { Component } from 'react';
+import PropTypes from 'prop-types';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import { withStyles } from '@material-ui/core/styles';
+import { SourceReader, PapperBlock } from 'ba-components';
+import { Paper } from '@material-ui/core';
+import { CrudTableDemo, CrudTbFormDemo } from './demos';
+
+const styles = ({
+ root: {
+ flexGrow: 1,
+ }
+});
+
+class CrudTablePage extends Component {
+ render() {
+ const title = brand.name + ' - Table';
+ const description = brand.desc;
+ const docSrc = 'containers/Tables/demos/';
+ const { classes } = this.props;
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+CrudTablePage.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(CrudTablePage);
diff --git a/front/odiparpack/app/containers/Tables/TablePlayground.js b/front/odiparpack/app/containers/Tables/TablePlayground.js
new file mode 100644
index 0000000..30382bb
--- /dev/null
+++ b/front/odiparpack/app/containers/Tables/TablePlayground.js
@@ -0,0 +1,419 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import classNames from 'classnames';
+import tableStyles from 'ba-styles/Table.scss';
+import EnhancedTableHead from 'ba-components/Tables/tableParts/TableHeader';
+import EnhancedTableToolbar from 'ba-components/Tables/tableParts/TableToolbar';
+import { PapperBlock } from 'ba-components';
+
+import {
+ Grid,
+ FormControl,
+ FormLabel,
+ FormControlLabel,
+ FormGroup,
+ RadioGroup,
+ Radio,
+ Table,
+ TableBody,
+ TableCell,
+ TableRow,
+ TablePagination,
+ Paper,
+ Checkbox,
+} from '@material-ui/core';
+
+const styles = theme => ({
+ root: {
+ width: '100%',
+ marginTop: theme.spacing(3),
+ overflowX: 'auto',
+ },
+ demo: {
+ height: 240,
+ },
+ paper: {
+ padding: theme.spacing(2),
+ height: '100%',
+ backgroundColor: theme.palette.secondary.light,
+ },
+ control: {
+ padding: theme.spacing(2),
+ },
+ settings: {
+ padding: 30
+ },
+});
+
+let counter = 0;
+function createData(name, calories, fat, carbs, protein) {
+ counter += 1;
+ return {
+ id: counter,
+ name,
+ calories,
+ fat,
+ carbs,
+ protein
+ };
+}
+
+class InteractiveGrid extends React.Component {
+ constructor(props, context) {
+ super(props, context);
+
+ this.state = {
+ order: 'asc',
+ orderBy: 'calories',
+ selected: [],
+ columnData: [
+ {
+ id: 'name',
+ numeric: false,
+ disablePadding: false,
+ label: 'Dessert (100g serving)'
+ }, {
+ id: 'calories',
+ numeric: true,
+ disablePadding: false,
+ label: 'Calories'
+ }, {
+ id: 'fat',
+ numeric: true,
+ disablePadding: false,
+ label: 'Fat (g)'
+ }, {
+ id: 'carbs',
+ numeric: true,
+ disablePadding: false,
+ label: 'Carbs (g)'
+ }, {
+ id: 'protein',
+ numeric: true,
+ disablePadding: false,
+ label: 'Protein (g)'
+ },
+ ],
+ data: [
+ createData('Cupcake', 305, 3.7, 67, 4.3),
+ createData('Donut', 452, 25.0, 51, 4.9),
+ createData('Eclair', 262, 16.0, 24, 6.0),
+ createData('Frozen yoghurt', 159, 6.0, 24, 4.0),
+ createData('Gingerbread', 356, 16.0, 49, 3.9),
+ createData('Honeycomb', 408, 3.2, 87, 6.5),
+ createData('Ice cream sandwich', 237, 9.0, 37, 4.3),
+ createData('Jelly Bean', 375, 0.0, 94, 0.0),
+ createData('KitKat', 518, 26.0, 65, 7.0),
+ createData('Lollipop', 392, 0.2, 98, 0.0),
+ createData('Marshmallow', 318, 0, 81, 2.0),
+ createData('Nougat', 360, 19.0, 9, 37.0),
+ createData('Oreo', 437, 18.0, 63, 4.0),
+ ].sort((a, b) => (a.calories < b.calories ? -1 : 1)),
+ page: 0,
+ rowsPerPage: 5,
+ defaultPerPage: 5,
+ filterText: '',
+ size: 'medium',
+ bordered: false,
+ stripped: true,
+ hovered: false,
+ toolbar: true,
+ checkcell: false,
+ pagination: true
+ };
+ }
+
+ handleChangeRadio = key => (event, value) => {
+ this.setState({
+ [key]: value,
+ });
+ };
+
+ handleChangeCheck = name => event => {
+ this.setState({ [name]: event.target.checked });
+ };
+
+ handleRequestSort = (event, property) => {
+ const orderBy = property;
+ let order = 'desc';
+
+ if (this.state.orderBy === property && this.state.order === 'desc') {
+ order = 'asc';
+ }
+
+ const data = order === 'desc'
+ ? this.state.data.sort((a, b) => (b[orderBy] < a[orderBy] ? -1 : 1))
+ : this.state.data.sort((a, b) => (a[orderBy] < b[orderBy] ? -1 : 1));
+
+ this.setState({ data, order, orderBy });
+ };
+
+ handleSelectAllClick = (event, checked) => {
+ if (checked) {
+ this.setState({ selected: this.state.data.map(n => n.id) });
+ return;
+ }
+ this.setState({ selected: [] });
+ };
+
+ handleClick = (event, id) => {
+ if (!this.state.checkcell) {
+ return;
+ }
+ const { selected } = this.state;
+ const selectedIndex = selected.indexOf(id);
+ let newSelected = [];
+
+ if (selectedIndex === -1) {
+ newSelected = newSelected.concat(selected, id);
+ } else if (selectedIndex === 0) {
+ newSelected = newSelected.concat(selected.slice(1));
+ } else if (selectedIndex === selected.length - 1) {
+ newSelected = newSelected.concat(selected.slice(0, -1));
+ } else if (selectedIndex > 0) {
+ newSelected = newSelected.concat(
+ selected.slice(0, selectedIndex),
+ selected.slice(selectedIndex + 1),
+ );
+ }
+
+ this.setState({ selected: newSelected });
+ };
+
+ handleChangePage = (event, page) => {
+ this.setState({ page });
+ };
+
+ handleChangeRowsPerPage = event => {
+ this.setState({ rowsPerPage: event.target.value });
+ };
+
+ isSelected = id => this.state.selected.indexOf(id) !== -1;
+
+ handleUserInput(value) {
+ // Show all item first
+ if (value !== '') {
+ this.setState({ rowsPerPage: this.state.data.length });
+ } else {
+ this.setState({ rowsPerPage: this.state.defaultPerPage });
+ }
+
+ // Show result base on keyword
+ this.setState({ filterText: value.toLowerCase() });
+ }
+
+ render() {
+ const { classes } = this.props;
+ const {
+ data,
+ order,
+ orderBy,
+ selected,
+ rowsPerPage,
+ page,
+ filterText,
+ size,
+ columnData,
+ toolbar, pagination, checkcell,
+ bordered, stripped, hovered
+ } = this.state;
+ const emptyRows = rowsPerPage - Math.min(rowsPerPage, data.length - (page * rowsPerPage));
+ const renderCell = (dataArray, keyArray) => keyArray.map((itemCell, index) => (
+ {dataArray[itemCell.id]}
+ ));
+ return (
+
+
+
+
+
+
+
+ Size
+
+ } label="Small" />
+ } label="Medium" />
+ } label="Big" />
+
+
+
+
+
+ Style
+
+
+ )}
+ label="Bordered"
+ />
+
+ )}
+ label="Strppied"
+ />
+
+ )}
+ label="Hovered"
+ />
+
+
+
+
+
+ Component
+
+
+ )}
+ label="Toolbar"
+ />
+
+ )}
+ label="Checkbox"
+ />
+
+ )}
+ label="Pagination"
+ />
+
+
+
+
+
+
+
+ {toolbar
+ && (
+ this.handleUserInput(event)}
+ />
+ )
+ }
+
+
+
+
+ {data.slice(page * rowsPerPage, (page * rowsPerPage) + rowsPerPage).map(n => {
+ const isSelected = this.isSelected(n.id);
+ if (n.name.toLowerCase().indexOf(filterText) === -1) {
+ return false;
+ }
+ return (
+ this.handleClick(event, n.id)}
+ role="checkbox"
+ aria-checked={isSelected}
+ tabIndex={-1}
+ key={n.id}
+ selected={isSelected}
+ >
+ {checkcell
+ && (
+
+
+
+ )
+ }
+ {renderCell(n, columnData)}
+
+ );
+ })}
+ {emptyRows > 0 && (
+
+
+
+ )}
+
+
+
+ {pagination
+ && (
+
+ )
+ }
+
+
+
+
+
+ );
+ }
+}
+
+InteractiveGrid.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(InteractiveGrid);
diff --git a/front/odiparpack/app/containers/Tables/TreeTable.js b/front/odiparpack/app/containers/Tables/TreeTable.js
new file mode 100644
index 0000000..9b715fb
--- /dev/null
+++ b/front/odiparpack/app/containers/Tables/TreeTable.js
@@ -0,0 +1,60 @@
+import React, { Component } from 'react';
+import PropTypes from 'prop-types';
+import Markdown from 'react-markdown';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import { withStyles } from '@material-ui/core/styles';
+import codeStyle from 'ba-styles/Code.scss';
+import { SourceReader, PapperBlock } from 'ba-components';
+import { Paper } from '@material-ui/core';
+import { TreeTableDemo, TreeTableDemoIcon } from './demos';
+
+const styles = ({
+ root: {
+ flexGrow: 1,
+ }
+});
+
+class TreeTablePage extends Component {
+ render() {
+ const title = brand.name + ' - Table';
+ const description = brand.desc;
+ const docSrc = 'containers/Tables/demos/';
+ const { classes } = this.props;
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+TreeTablePage.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(TreeTablePage);
diff --git a/front/odiparpack/app/containers/Tables/demos/AdvFilter.js b/front/odiparpack/app/containers/Tables/demos/AdvFilter.js
new file mode 100644
index 0000000..091703a
--- /dev/null
+++ b/front/odiparpack/app/containers/Tables/demos/AdvFilter.js
@@ -0,0 +1,64 @@
+import React from 'react';
+import MUIDataTable from 'mui-datatables';
+/*
+ It uses npm mui-datatables. It's easy to use, you just describe columns and data collection.
+ Checkout full documentation here :
+ https://github.com/gregnb/mui-datatables/blob/master/README.md
+*/
+class AdvFilter extends React.Component {
+ state = {
+ columns: ['Name', 'Title', 'Location', 'Age', 'Salary'],
+ data: [
+ ['Gabby George', 'Business Analyst', 'Minneapolis', 30, '$100,000'],
+ ['Aiden Lloyd', 'Business Consultant', 'Dallas', 55, '$200,000'],
+ ['Jaden Collins', 'Attorney', 'Santa Ana', 27, '$500,000'],
+ ['Franky Rees', 'Business Analyst', 'St. Petersburg', 22, '$50,000'],
+ ['Aaren Rose', 'Business Consultant', 'Toledo', 28, '$75,000'],
+ ['Blake Duncan', 'Business Management Analyst', 'San Diego', 65, '$94,000'],
+ ['Frankie Parry', 'Agency Legal Counsel', 'Jacksonville', 71, '$210,000'],
+ ['Lane Wilson', 'Commercial Specialist', 'Omaha', 19, '$65,000'],
+ ['Robin Duncan', 'Business Analyst', 'Los Angeles', 20, '$77,000'],
+ ['Mel Brooks', 'Business Consultant', 'Oklahoma City', 37, '$135,000'],
+ ['Harper White', 'Attorney', 'Pittsburgh', 52, '$420,000'],
+ ['Kris Humphrey', 'Agency Legal Counsel', 'Laredo', 30, '$150,000'],
+ ['Frankie Long', 'Industrial Analyst', 'Austin', 31, '$170,000'],
+ ['Brynn Robbins', 'Business Analyst', 'Norfolk', 22, '$90,000'],
+ ['Justice Mann', 'Business Consultant', 'Chicago', 24, '$133,000'],
+ ['Addison Navarro', 'Business Management Analyst', 'New York', 50, '$295,000'],
+ ['Jesse Welch', 'Agency Legal Counsel', 'Seattle', 28, '$200,000'],
+ ['Eli Mejia', 'Commercial Specialist', 'Long Beach', 65, '$400,000'],
+ ['Gene Leblanc', 'Industrial Analyst', 'Hartford', 34, '$110,000'],
+ ['Danny Leon', 'Computer Scientist', 'Newark', 60, '$220,000'],
+ ['Lane Lee', 'Corporate Counselor', 'Cincinnati', 52, '$180,000'],
+ ['Jesse Hall', 'Business Analyst', 'Baltimore', 44, '$99,000'],
+ ['Danni Hudson', 'Agency Legal Counsel', 'Tampa', 37, '$90,000'],
+ ['Terry Macdonald', 'Commercial Specialist', 'Miami', 39, '$140,000'],
+ ['Justice Mccarthy', 'Attorney', 'Tucson', 26, '$330,000'],
+ ['Silver Carey', 'Computer Scientist', 'Memphis', 47, '$250,000'],
+ ['Franky Miles', 'Industrial Analyst', 'Buffalo', 49, '$190,000'],
+ ['Glen Nixon', 'Corporate Counselor', 'Arlington', 44, '$80,000'],
+ ['Gabby Strickland', 'Business Process Consultant', 'Scottsdale', 26, '$45,000'],
+ ['Mason Ray', 'Computer Scientist', 'San Francisco', 39, '$142,000']
+ ]
+ }
+ render() {
+ const { columns, data } = this.state;
+ const options = {
+ filterType: 'dropdown',
+ responsive: 'stacked',
+ print: true,
+ rowsPerPage: 10,
+ page: 1
+ };
+ return (
+
+ );
+ }
+}
+
+export default AdvFilter;
diff --git a/front/odiparpack/app/containers/Tables/demos/AdvTableDemo.js b/front/odiparpack/app/containers/Tables/demos/AdvTableDemo.js
new file mode 100644
index 0000000..d67990d
--- /dev/null
+++ b/front/odiparpack/app/containers/Tables/demos/AdvTableDemo.js
@@ -0,0 +1,101 @@
+import React from 'react';
+import { AdvTable } from 'ba-components';
+
+let counter = 0;
+function createData(name, calories, fat, carbs, protein) {
+ counter += 1;
+ return {
+ id: counter,
+ name,
+ calories,
+ fat,
+ carbs,
+ protein
+ };
+}
+
+class AdvTableDemo extends React.Component {
+ state = {
+ order: 'asc',
+ orderBy: 'calories',
+ selected: [],
+ columnData: [
+ {
+ id: 'name',
+ numeric: false,
+ disablePadding: true,
+ label: 'Dessert (100g serving)'
+ }, {
+ id: 'calories',
+ numeric: true,
+ disablePadding: false,
+ label: 'Calories'
+ }, {
+ id: 'fat',
+ numeric: true,
+ disablePadding: false,
+ label: 'Fat (g)'
+ }, {
+ id: 'carbs',
+ numeric: true,
+ disablePadding: false,
+ label: 'Carbs (g)'
+ }, {
+ id: 'protein',
+ numeric: true,
+ disablePadding: false,
+ label: 'Protein (g)'
+ },
+ ],
+ data: [
+ createData('Cupcake', 305, 3.7, 67, 4.3),
+ createData('Donut', 452, 25.0, 51, 4.9),
+ createData('Eclair', 262, 16.0, 24, 6.0),
+ createData('Frozen yoghurt', 159, 6.0, 24, 4.0),
+ createData('Gingerbread', 356, 16.0, 49, 3.9),
+ createData('Honeycomb', 408, 3.2, 87, 6.5),
+ createData('Ice cream sandwich', 237, 9.0, 37, 4.3),
+ createData('Jelly Bean', 375, 0.0, 94, 0.0),
+ createData('KitKat', 518, 26.0, 65, 7.0),
+ createData('Lollipop', 392, 0.2, 98, 0.0),
+ createData('Marshmallow', 318, 0, 81, 2.0),
+ createData('Nougat', 360, 19.0, 9, 37.0),
+ createData('Oreo', 437, 18.0, 63, 4.0),
+ ].sort((a, b) => (a.calories < b.calories ? -1 : 1)),
+ page: 0,
+ rowsPerPage: 5,
+ defaultPerPage: 5,
+ filterText: '',
+ };
+
+ render() {
+ const {
+ order,
+ orderBy,
+ selected,
+ data,
+ page,
+ rowsPerPage,
+ defaultPerPage,
+ filterText,
+ columnData
+ } = this.state;
+
+ return (
+
+ );
+ }
+}
+
+
+export default AdvTableDemo;
diff --git a/front/odiparpack/app/containers/Tables/demos/BorderedTable.js b/front/odiparpack/app/containers/Tables/demos/BorderedTable.js
new file mode 100644
index 0000000..a01979d
--- /dev/null
+++ b/front/odiparpack/app/containers/Tables/demos/BorderedTable.js
@@ -0,0 +1,91 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import classNames from 'classnames';
+import tableStyles from 'ba-styles/Table.scss';
+
+import {
+ Toolbar,
+ Typography,
+ Table,
+ TableBody,
+ TableCell,
+ TableHead,
+ TableRow,
+ Paper,
+} from '@material-ui/core';
+
+const styles = theme => ({
+ root: {
+ width: '100%',
+ marginTop: theme.spacing(3),
+ overflowX: 'auto',
+ },
+ table: {
+ minWidth: 700,
+ },
+});
+
+let id = 0;
+function createData(name, calories, fat, carbs, protein) {
+ id += 1;
+ return {
+ id,
+ name,
+ calories,
+ fat,
+ carbs,
+ protein
+ };
+}
+
+const data = [
+ createData('Frozen yoghurt', 159, 6.0, 24, 4.0),
+ createData('Ice cream sandwich', 237, 9.0, 37, 4.3),
+ createData('Eclair', 262, 16.0, 24, 6.0),
+ createData('Cupcake', 305, 3.7, 67, 4.3),
+ createData('Gingerbread', 356, 16.0, 49, 3.9),
+];
+
+function BorderedTable(props) {
+ const { classes } = props;
+
+ return (
+
+
+
+ Nutrition
+
+
+
+
+
+ Dessert (100g serving)
+ Calories
+ Fat (g)
+ Carbs (g)
+ Protein (g)
+
+
+
+ {data.map(n => ([
+
+ {n.name}
+ {n.calories}
+ {n.fat}
+ {n.carbs}
+ {n.protein}
+
+ ])
+ )}
+
+
+
+ );
+}
+
+BorderedTable.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(BorderedTable);
diff --git a/front/odiparpack/app/containers/Tables/demos/CrudTableDemo.js b/front/odiparpack/app/containers/Tables/demos/CrudTableDemo.js
new file mode 100644
index 0000000..98a1868
--- /dev/null
+++ b/front/odiparpack/app/containers/Tables/demos/CrudTableDemo.js
@@ -0,0 +1,220 @@
+import React, { Component } from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import { bindActionCreators } from 'redux';
+import { connect } from 'react-redux';
+import {
+ fetchAction,
+ addAction,
+ removeAction,
+ updateAction,
+ editAction,
+ saveAction,
+ closeNotifAction,
+} from 'ba-actions/CrudTbActions';
+import { CrudTable, Notification } from 'ba-components';
+import { Paper } from '@material-ui/core';
+
+// Reducer Branch
+const branch = 'crudTableDemo';
+
+const styles = ({
+ root: {
+ flexGrow: 1,
+ }
+});
+
+const anchorTable = [
+ {
+ name: 'id',
+ label: 'Id',
+ type: 'static',
+ initialValue: '',
+ hidden: true
+ }, {
+ name: 'category',
+ label: 'Category',
+ type: 'selection',
+ initialValue: 'Electronics',
+ options: ['Electronics', 'Sporting Goods', 'Apparels', 'Other'],
+ width: '150',
+ hidden: false
+ }, {
+ name: 'price',
+ label: 'Price',
+ type: 'number',
+ initialValue: 0,
+ width: '100',
+ hidden: false
+ }, {
+ name: 'date',
+ label: 'Date Updated',
+ type: 'date',
+ initialValue: new Date(),
+ width: 'auto',
+ hidden: false
+ }, {
+ name: 'time',
+ label: 'Time Updated',
+ type: 'time',
+ initialValue: new Date(),
+ width: 'auto',
+ hidden: false
+ }, {
+ name: 'name',
+ label: 'Name',
+ type: 'text',
+ initialValue: '',
+ width: 'auto',
+ hidden: false
+ }, {
+ name: 'available',
+ label: 'Available',
+ type: 'toggle',
+ initialValue: true,
+ width: '100',
+ hidden: false
+ }, {
+ name: 'edited',
+ label: '',
+ type: 'static',
+ initialValue: '',
+ hidden: true
+ }, {
+ name: 'action',
+ label: 'Action',
+ type: 'static',
+ initialValue: '',
+ hidden: false
+ },
+];
+const dataApi = [
+ {
+ id: 1,
+ category: 'Sporting Goods',
+ price: '49.99',
+ date: '4/3/2018',
+ time: 'Tue Apr 03 2018 00:00:00 GMT+0700 (WIB)',
+ name: 'football',
+ available: true,
+ edited: false,
+ }, {
+ id: 2,
+ category: 'Other',
+ price: '9.99',
+ date: '4/2/2018',
+ time: 'Tue Apr 03 2018 00:00:00 GMT+0700 (WIB)',
+ name: 'baseball',
+ available: true,
+ edited: false,
+ }, {
+ id: 3,
+ category: 'Sporting Goods',
+ price: '29.99',
+ date: '4/1/2018',
+ time: 'Tue Apr 03 2018 00:00:00 GMT+0700 (WIB)',
+ name: 'basketball',
+ available: false,
+ edited: false,
+ }, {
+ id: 4,
+ category: 'Electronics',
+ price: '99.99',
+ date: '3/30/2018',
+ time: 'Tue Apr 03 2018 00:00:00 GMT+0700 (WIB)',
+ name: 'iPod Touch',
+ available: true,
+ edited: false,
+ }, {
+ id: 5,
+ category: 'Electronics',
+ price: '399.99',
+ date: '3/29/2018',
+ time: 'Tue Apr 03 2018 00:00:00 GMT+0700 (WIB)',
+ name: 'iPhone 5',
+ available: false,
+ edited: false,
+ }, {
+ id: 6,
+ category: 'Electronics',
+ price: '199.99',
+ date: '3/28/2018',
+ time: 'Tue Apr 03 2018 00:00:00 GMT+0700 (WIB)',
+ name: 'nexus 7',
+ available: true,
+ edited: false,
+ }
+];
+
+class CrudTableDemo extends Component {
+ render() {
+ const {
+ classes,
+ fetchData,
+ addEmptyRow,
+ dataTable,
+ removeRow,
+ updateRow,
+ editRow,
+ finishEditRow,
+ closeNotif,
+ messageNotif,
+ } = this.props;
+ return (
+
+
closeNotif(branch)} message={messageNotif} />
+
+
+
+
+ );
+ }
+}
+
+CrudTableDemo.propTypes = {
+ classes: PropTypes.object.isRequired,
+ fetchData: PropTypes.func.isRequired,
+ dataTable: PropTypes.object.isRequired,
+ addEmptyRow: PropTypes.func.isRequired,
+ removeRow: PropTypes.func.isRequired,
+ updateRow: PropTypes.func.isRequired,
+ editRow: PropTypes.func.isRequired,
+ finishEditRow: PropTypes.func.isRequired,
+ closeNotif: PropTypes.func.isRequired,
+ messageNotif: PropTypes.string.isRequired,
+};
+
+const mapStateToProps = state => ({
+ force: state, // force state from reducer
+ dataTable: state.getIn([branch, 'dataTable']),
+ messageNotif: state.getIn([branch, 'notifMsg']),
+});
+
+const mapDispatchToProps = dispatch => ({
+ fetchData: bindActionCreators(fetchAction, dispatch),
+ addEmptyRow: bindActionCreators(addAction, dispatch),
+ removeRow: bindActionCreators(removeAction, dispatch),
+ updateRow: bindActionCreators(updateAction, dispatch),
+ editRow: bindActionCreators(editAction, dispatch),
+ finishEditRow: bindActionCreators(saveAction, dispatch),
+ closeNotif: bindActionCreators(closeNotifAction, dispatch),
+});
+
+const CrudTableMapped = connect(
+ mapStateToProps,
+ mapDispatchToProps
+)(CrudTableDemo);
+
+export default withStyles(styles)(CrudTableMapped);
diff --git a/front/odiparpack/app/containers/Tables/demos/CrudTbFormDemo.js b/front/odiparpack/app/containers/Tables/demos/CrudTbFormDemo.js
new file mode 100644
index 0000000..c20803e
--- /dev/null
+++ b/front/odiparpack/app/containers/Tables/demos/CrudTbFormDemo.js
@@ -0,0 +1,230 @@
+import React, { Component } from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import { Field } from 'redux-form/immutable';
+import { connect } from 'react-redux';
+import { bindActionCreators } from 'redux';
+import {
+ CheckboxRedux,
+ SelectRedux,
+ TextFieldRedux,
+ SwitchRedux
+} from 'ba-components/Forms/ReduxFormMUI';
+import {
+ fetchAction,
+ addAction,
+ closeAction,
+ submitAction,
+ removeAction,
+ editAction,
+ closeNotifAction
+} from 'ba-actions/CrudTbFrmActions';
+import { CrudTableForm, Notification } from 'ba-components';
+import {
+ Paper,
+ MenuItem,
+ InputLabel,
+ Radio,
+ RadioGroup,
+ FormControl,
+ FormLabel,
+ FormControlLabel,
+} from '@material-ui/core';
+import { anchorTable, dataApi } from './sampleData';
+
+
+const branch = 'crudTbFrmDemo';
+
+const renderRadioGroup = ({ input, ...rest }) => (
+ input.onChange(value)}
+ />
+);
+
+// validation functions
+const required = value => (value == null ? 'Required' : undefined);
+const email = value => (
+ value && !/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i.test(value)
+ ? 'Invalid email'
+ : undefined
+);
+
+const styles = ({
+ root: {
+ flexGrow: 1,
+ },
+ field: {
+ width: '100%',
+ marginBottom: 20
+ },
+ fieldBasic: {
+ width: '100%',
+ marginBottom: 20,
+ marginTop: 10
+ },
+ inlineWrap: {
+ display: 'flex',
+ flexDirection: 'row'
+ }
+});
+
+class CrudTbFormDemo extends Component {
+ saveRef = ref => {
+ this.ref = ref;
+ return this.ref;
+ };
+
+ render() {
+ const {
+ classes,
+ fetchData,
+ addNew,
+ closeForm,
+ submit,
+ removeRow,
+ editRow,
+ dataTable,
+ openForm,
+ initValues,
+ closeNotif,
+ messageNotif,
+ } = this.props;
+ const trueBool = true;
+ return (
+
+
closeNotif(branch)} message={messageNotif} />
+
+
+ {/* Create Your own form, then arrange or custom it as You like */}
+
+
+
+
+
+
+
+ Choose One Option
+
+ } label="Option 1" />
+ } label="Option 2" />
+
+
+
+
+ Selection
+
+ Option One
+ Option Two
+ Option Three
+
+
+
+
+
Toggle Input
+
+ } label="On/OF Switch" />
+ } label="Checkbox" />
+
+
+
+
+
+ {/* No need create button or submit, because that already made in this component */}
+
+
+
+ );
+ }
+}
+
+renderRadioGroup.propTypes = {
+ input: PropTypes.object.isRequired,
+};
+
+CrudTbFormDemo.propTypes = {
+ dataTable: PropTypes.object.isRequired,
+ openForm: PropTypes.bool.isRequired,
+ classes: PropTypes.object.isRequired,
+ fetchData: PropTypes.func.isRequired,
+ addNew: PropTypes.func.isRequired,
+ closeForm: PropTypes.func.isRequired,
+ submit: PropTypes.func.isRequired,
+ removeRow: PropTypes.func.isRequired,
+ editRow: PropTypes.func.isRequired,
+ initValues: PropTypes.object.isRequired,
+ closeNotif: PropTypes.func.isRequired,
+ messageNotif: PropTypes.string.isRequired,
+};
+
+
+const mapStateToProps = state => ({
+ force: state, // force state from reducer
+ initValues: state.getIn([branch, 'formValues']),
+ dataTable: state.getIn([branch, 'dataTable']),
+ openForm: state.getIn([branch, 'showFrm']),
+ messageNotif: state.getIn([branch, 'notifMsg']),
+});
+
+const mapDispatchToProps = dispatch => ({
+ fetchData: bindActionCreators(fetchAction, dispatch),
+ addNew: bindActionCreators(addAction, dispatch),
+ closeForm: bindActionCreators(closeAction, dispatch),
+ submit: bindActionCreators(submitAction, dispatch),
+ removeRow: bindActionCreators(removeAction, dispatch),
+ editRow: bindActionCreators(editAction, dispatch),
+ closeNotif: bindActionCreators(closeNotifAction, dispatch),
+});
+
+const CrudTbFormDemoMapped = connect(
+ mapStateToProps,
+ mapDispatchToProps
+)(CrudTbFormDemo);
+
+export default withStyles(styles)(CrudTbFormDemoMapped);
diff --git a/front/odiparpack/app/containers/Tables/demos/EmptyTable.js b/front/odiparpack/app/containers/Tables/demos/EmptyTable.js
new file mode 100644
index 0000000..c9517a2
--- /dev/null
+++ b/front/odiparpack/app/containers/Tables/demos/EmptyTable.js
@@ -0,0 +1,48 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import { EmptyData } from 'ba-components';
+
+import { Toolbar, Typography, Table, TableCell, TableHead, TableRow, Paper } from '@material-ui/core';
+
+const styles = theme => ({
+ root: {
+ width: '100%',
+ marginTop: theme.spacing(3),
+ overflowX: 'auto',
+ },
+ table: {
+ minWidth: 700,
+ },
+});
+
+function EmptyTable(props) {
+ const { classes } = props;
+ return (
+
+
+
+ Nutrition
+
+
+
+
+
+ Dessert (100g serving)
+ Calories
+ Fat (g)
+ Carbs (g)
+ Protein (g)
+
+
+
+
+
+ );
+}
+
+EmptyTable.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(EmptyTable);
diff --git a/front/odiparpack/app/containers/Tables/demos/HoverTable.js b/front/odiparpack/app/containers/Tables/demos/HoverTable.js
new file mode 100644
index 0000000..48047c6
--- /dev/null
+++ b/front/odiparpack/app/containers/Tables/demos/HoverTable.js
@@ -0,0 +1,91 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import classNames from 'classnames';
+import tableStyles from 'ba-styles/Table.scss';
+
+import {
+ Toolbar,
+ Typography,
+ Table,
+ TableBody,
+ TableCell,
+ TableHead,
+ TableRow,
+ Paper,
+} from '@material-ui/core';
+
+const styles = theme => ({
+ root: {
+ width: '100%',
+ marginTop: theme.spacing(3),
+ overflowX: 'auto',
+ },
+ table: {
+ minWidth: 700,
+ },
+});
+
+let id = 0;
+function createData(name, calories, fat, carbs, protein) {
+ id += 1;
+ return {
+ id,
+ name,
+ calories,
+ fat,
+ carbs,
+ protein
+ };
+}
+
+const data = [
+ createData('Frozen yoghurt', 159, 6.0, 24, 4.0),
+ createData('Ice cream sandwich', 237, 9.0, 37, 4.3),
+ createData('Eclair', 262, 16.0, 24, 6.0),
+ createData('Cupcake', 305, 3.7, 67, 4.3),
+ createData('Gingerbread', 356, 16.0, 49, 3.9),
+];
+
+function HoverTable(props) {
+ const { classes } = props;
+
+ return (
+
+
+
+ Nutrition
+
+
+
+
+
+ Dessert (100g serving)
+ Calories
+ Fat (g)
+ Carbs (g)
+ Protein (g)
+
+
+
+ {data.map(n => ([
+
+ {n.name}
+ {n.calories}
+ {n.fat}
+ {n.carbs}
+ {n.protein}
+
+ ])
+ )}
+
+
+
+ );
+}
+
+HoverTable.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(HoverTable);
diff --git a/front/odiparpack/app/containers/Tables/demos/SimpleTable.js b/front/odiparpack/app/containers/Tables/demos/SimpleTable.js
new file mode 100644
index 0000000..e064d5e
--- /dev/null
+++ b/front/odiparpack/app/containers/Tables/demos/SimpleTable.js
@@ -0,0 +1,88 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+
+import {
+ Toolbar,
+ Typography,
+ Table,
+ TableBody,
+ TableCell,
+ TableHead,
+ TableRow,
+ Paper,
+} from '@material-ui/core';
+
+const styles = theme => ({
+ root: {
+ width: '100%',
+ marginTop: theme.spacing(3),
+ overflowX: 'auto',
+ },
+ table: {
+ minWidth: 700,
+ },
+});
+
+let id = 0;
+function createData(name, calories, fat, carbs, protein) {
+ id += 1;
+ return {
+ id,
+ name,
+ calories,
+ fat,
+ carbs,
+ protein
+ };
+}
+
+const data = [
+ createData('Frozen yoghurt', 159, 6.0, 24, 4.0),
+ createData('Ice cream sandwich', 237, 9.0, 37, 4.3),
+ createData('Eclair', 262, 16.0, 24, 6.0),
+ createData('Cupcake', 305, 3.7, 67, 4.3),
+ createData('Gingerbread', 356, 16.0, 49, 3.9),
+];
+
+function SimpleTable(props) {
+ const { classes } = props;
+ return (
+
+
+
+ Nutrition
+
+
+
+
+
+ Dessert (100g serving)
+ Calories
+ Fat (g)
+ Carbs (g)
+ Protein (g)
+
+
+
+ {data.map(n => ([
+
+ {n.name}
+ {n.calories}
+ {n.fat}
+ {n.carbs}
+ {n.protein}
+
+ ])
+ )}
+
+
+
+ );
+}
+
+SimpleTable.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(SimpleTable);
diff --git a/front/odiparpack/app/containers/Tables/demos/StatusColorRow.js b/front/odiparpack/app/containers/Tables/demos/StatusColorRow.js
new file mode 100644
index 0000000..2e21190
--- /dev/null
+++ b/front/odiparpack/app/containers/Tables/demos/StatusColorRow.js
@@ -0,0 +1,121 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import classNames from 'classnames';
+import messageStyles from 'ba-styles/Messages.scss';
+import progressStyles from 'ba-styles/Progress.scss';
+
+import {
+ Toolbar,
+ Typography,
+ Table,
+ TableBody,
+ TableCell,
+ TableHead,
+ TableRow,
+ Paper,
+ Chip,
+ LinearProgress,
+} from '@material-ui/core';
+
+const CustomTableCell = withStyles(theme => ({
+ head: {
+ backgroundColor: theme.palette.common.black,
+ color: theme.palette.common.white,
+ },
+ body: {
+ fontSize: 14,
+ },
+}))(TableCell);
+
+const styles = theme => ({
+ root: {
+ width: '100%',
+ marginTop: theme.spacing(3),
+ overflowX: 'auto',
+ },
+ chip: {
+ margin: theme.spacing(1),
+ fontWeight: 500,
+ color: '#FFF'
+ },
+});
+
+let id = 0;
+function createData(name, progress, status) {
+ id += 1;
+ return {
+ id,
+ name,
+ progress,
+ status,
+ };
+}
+
+const data = [
+ createData('Frozen yoghurt', 24, 'Error'),
+ createData('Ice cream sandwich', 37, 'Warning'),
+ createData('Eclair', 24, 'Info'),
+ createData('Cupcake', 67, 'Default'),
+ createData('Gingerbread', 89, 'Success'),
+];
+
+function StatusLabel(props) {
+ const { classes } = props;
+ const getStatus = status => {
+ switch (status) {
+ case 'Error': return messageStyles.bgError;
+ case 'Warning': return messageStyles.bgWarning;
+ case 'Info': return messageStyles.bgInfo;
+ case 'Success': return messageStyles.bgSuccess;
+ default: return messageStyles.bgDefault;
+ }
+ };
+ const getProgress = status => {
+ switch (status) {
+ case 'Error': return progressStyles.bgError;
+ case 'Warning': return progressStyles.bgWarning;
+ case 'Info': return progressStyles.bgInfo;
+ case 'Success': return progressStyles.bgSuccess;
+ default: return progressStyles.bgDefault;
+ }
+ };
+ return (
+
+
+
+ Nutrition
+
+
+
+
+
+ Dessert (100g serving)
+ Progress
+ Status
+
+
+
+ {data.map(n => ([
+
+ {n.name}
+
+
+
+
+
+
+
+ ])
+ )}
+
+
+
+ );
+}
+
+StatusLabel.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(StatusLabel);
diff --git a/front/odiparpack/app/containers/Tables/demos/StatusLabel.js b/front/odiparpack/app/containers/Tables/demos/StatusLabel.js
new file mode 100644
index 0000000..bf011dd
--- /dev/null
+++ b/front/odiparpack/app/containers/Tables/demos/StatusLabel.js
@@ -0,0 +1,112 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import classNames from 'classnames';
+import tableStyles from 'ba-styles/Table.scss';
+import messageStyles from 'ba-styles/Messages.scss';
+import progressStyles from 'ba-styles/Progress.scss';
+
+import {
+ Toolbar,
+ Typography,
+ Table,
+ TableBody,
+ TableCell,
+ TableHead,
+ TableRow,
+ Paper,
+ Chip,
+ LinearProgress,
+} from '@material-ui/core';
+
+const styles = theme => ({
+ root: {
+ width: '100%',
+ marginTop: theme.spacing(3),
+ overflowX: 'auto',
+ },
+ chip: {
+ margin: theme.spacing(1),
+ fontWeight: 'bold',
+ color: '#FFF'
+ },
+});
+
+let id = 0;
+function createData(name, progress, status) {
+ id += 1;
+ return {
+ id,
+ name,
+ progress,
+ status,
+ };
+}
+
+const data = [
+ createData('Frozen yoghurt', 24, 'Error'),
+ createData('Ice cream sandwich', 37, 'Warning'),
+ createData('Eclair', 24, 'Info'),
+ createData('Cupcake', 67, 'Default'),
+ createData('Gingerbread', 89, 'Success'),
+];
+
+function StatusLabel(props) {
+ const { classes } = props;
+ const getStatus = status => {
+ switch (status) {
+ case 'Error': return messageStyles.bgError;
+ case 'Warning': return messageStyles.bgWarning;
+ case 'Info': return messageStyles.bgInfo;
+ case 'Success': return messageStyles.bgSuccess;
+ default: return messageStyles.bgDefault;
+ }
+ };
+ const getProgress = status => {
+ switch (status) {
+ case 'Error': return progressStyles.bgError;
+ case 'Warning': return progressStyles.bgWarning;
+ case 'Info': return progressStyles.bgInfo;
+ case 'Success': return progressStyles.bgSuccess;
+ default: return progressStyles.bgDefault;
+ }
+ };
+ return (
+
+
+
+ Nutrition
+
+
+
+
+
+ Dessert (100g serving)
+ Progress
+ Status
+
+
+
+ {data.map(n => ([
+
+ {n.name}
+
+
+
+
+
+
+
+ ])
+ )}
+
+
+
+ );
+}
+
+StatusLabel.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(StatusLabel);
diff --git a/front/odiparpack/app/containers/Tables/demos/StrippedTable.js b/front/odiparpack/app/containers/Tables/demos/StrippedTable.js
new file mode 100644
index 0000000..509bc4a
--- /dev/null
+++ b/front/odiparpack/app/containers/Tables/demos/StrippedTable.js
@@ -0,0 +1,91 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import classNames from 'classnames';
+import tableStyles from 'ba-styles/Table.scss';
+
+import {
+ Toolbar,
+ Typography,
+ Table,
+ TableBody,
+ TableCell,
+ TableHead,
+ TableRow,
+ Paper,
+} from '@material-ui/core';
+
+const styles = theme => ({
+ root: {
+ width: '100%',
+ marginTop: theme.spacing(3),
+ overflowX: 'auto',
+ },
+ table: {
+ minWidth: 700,
+ },
+});
+
+let id = 0;
+function createData(name, calories, fat, carbs, protein) {
+ id += 1;
+ return {
+ id,
+ name,
+ calories,
+ fat,
+ carbs,
+ protein
+ };
+}
+
+const data = [
+ createData('Frozen yoghurt', 159, 6.0, 24, 4.0),
+ createData('Ice cream sandwich', 237, 9.0, 37, 4.3),
+ createData('Eclair', 262, 16.0, 24, 6.0),
+ createData('Cupcake', 305, 3.7, 67, 4.3),
+ createData('Gingerbread', 356, 16.0, 49, 3.9),
+];
+
+function StrippedTable(props) {
+ const { classes } = props;
+
+ return (
+
+
+
+ Nutrition
+
+
+
+
+
+ Dessert (100g serving)
+ Calories
+ Fat (g)
+ Carbs (g)
+ Protein (g)
+
+
+
+ {data.map(n => ([
+
+ {n.name}
+ {n.calories}
+ {n.fat}
+ {n.carbs}
+ {n.protein}
+
+ ])
+ )}
+
+
+
+ );
+}
+
+StrippedTable.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(StrippedTable);
diff --git a/front/odiparpack/app/containers/Tables/demos/TrackingTable.js b/front/odiparpack/app/containers/Tables/demos/TrackingTable.js
new file mode 100644
index 0000000..0550869
--- /dev/null
+++ b/front/odiparpack/app/containers/Tables/demos/TrackingTable.js
@@ -0,0 +1,124 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import classNames from 'classnames';
+import messageStyles from 'ba-styles/Messages.scss';
+import progressStyles from 'ba-styles/Progress.scss';
+import avatarApi from 'ba-api/avatars';
+import { PapperBlock } from 'ba-components';
+import styles from 'ba-components/Widget/widget-jss';
+
+import {
+ Typography,
+ Table,
+ TableBody,
+ TableCell,
+ TableHead,
+ TableRow,
+ Chip,
+ LinearProgress,
+ Avatar,
+ Icon,
+} from '@material-ui/core';
+
+let id = 0;
+function createData(name, avatar, title, type, taskNumber, taskTitle, progress, status) {
+ id += 1;
+ return {
+ id,
+ name,
+ avatar,
+ title,
+ type,
+ taskNumber,
+ taskTitle,
+ progress,
+ status,
+ };
+}
+
+const data = [
+ createData('John Doe', avatarApi[6], 'Front End Developer', 'bug_report', 2214, 'Vivamus sit amet interdum elit', 30, 'Error'),
+ createData('Jim Doe', avatarApi[8], 'System Analyst', 'flag', 2455, 'Nam sollicitudin dignissim nunc', 70, 'Success'),
+ createData('Jane Doe', avatarApi[2], 'Back End Developer', 'whatshot', 3450, 'Quisque ut metus sit amet augue rutrum', 50, 'Warning'),
+ createData('Jack Doe', avatarApi[9], 'CTO', 'settings', 4905, 'Cras convallis lacus orci', 85, 'Info'),
+ createData('Jessica Doe', avatarApi[5], 'Project Manager', 'book', 4118, 'Aenean sit amet magna vel magna', 33, 'Default'),
+];
+
+function TrackingTable(props) {
+ const { classes } = props;
+ const getStatus = status => {
+ switch (status) {
+ case 'Error': return messageStyles.bgError;
+ case 'Warning': return messageStyles.bgWarning;
+ case 'Info': return messageStyles.bgInfo;
+ case 'Success': return messageStyles.bgSuccess;
+ default: return messageStyles.bgDefault;
+ }
+ };
+ const getProgress = status => {
+ switch (status) {
+ case 'Error': return progressStyles.bgError;
+ case 'Warning': return progressStyles.bgWarning;
+ case 'Info': return progressStyles.bgInfo;
+ case 'Success': return progressStyles.bgSuccess;
+ default: return progressStyles.bgDefault;
+ }
+ };
+ const getType = type => {
+ switch (type) {
+ case 'bug_report': return classes.red;
+ case 'flag': return classes.indigo;
+ case 'whatshot': return classes.orange;
+ case 'settings': return classes.lime;
+ default: return classes.purple;
+ }
+ };
+ return (
+
+
+
+
+
+ Name
+ Task
+
+
+
+ {data.map(n => ([
+
+
+
+
+
+ {n.name}
+ {n.title}
+
+
+
+
+
+
+
+
+ ])
+ )}
+
+
+
+
+ );
+}
+
+TrackingTable.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(TrackingTable);
diff --git a/front/odiparpack/app/containers/Tables/demos/TreeTableDemo.js b/front/odiparpack/app/containers/Tables/demos/TreeTableDemo.js
new file mode 100644
index 0000000..4c522e2
--- /dev/null
+++ b/front/odiparpack/app/containers/Tables/demos/TreeTableDemo.js
@@ -0,0 +1,68 @@
+import React, { Component } from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import { bindActionCreators } from 'redux';
+import { connect } from 'react-redux';
+import openAction from 'ba-actions/TreeTableActions';
+import { TreeTable } from 'ba-components';
+import { Paper } from '@material-ui/core';
+import data from './dataTreeTable.js';
+
+const styles = theme => ({
+ root: {
+ width: '100%',
+ marginTop: theme.spacing(3),
+ overflowX: 'auto',
+ },
+});
+
+const branch = 'treeTableArrow';
+
+class TreeTableDemo extends Component {
+ render() {
+ const {
+ arrowMore,
+ treeOpen,
+ classes,
+ toggleTree
+ } = this.props;
+ return (
+
+ );
+ }
+}
+
+TreeTableDemo.propTypes = {
+ classes: PropTypes.object.isRequired,
+ treeOpen: PropTypes.object.isRequired,
+ arrowMore: PropTypes.object.isRequired,
+ toggleTree: PropTypes.func.isRequired,
+};
+
+const mapStateToProps = state => ({
+ force: state, // force state from reducer
+ treeOpen: state.getIn([branch, 'treeOpen']),
+ arrowMore: state.getIn([branch, 'arrowMore']),
+});
+
+const mapDispatchToProps = dispatch => ({
+ toggleTree: bindActionCreators(openAction, dispatch)
+});
+
+const TreeTableDemoMapped = connect(
+ mapStateToProps,
+ mapDispatchToProps
+)(TreeTableDemo);
+
+export default withStyles(styles)(TreeTableDemoMapped);
diff --git a/front/odiparpack/app/containers/Tables/demos/TreeTableDemoIcon.js b/front/odiparpack/app/containers/Tables/demos/TreeTableDemoIcon.js
new file mode 100644
index 0000000..d669fae
--- /dev/null
+++ b/front/odiparpack/app/containers/Tables/demos/TreeTableDemoIcon.js
@@ -0,0 +1,68 @@
+import React, { Component } from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import { bindActionCreators } from 'redux';
+import { connect } from 'react-redux';
+import openAction from 'ba-actions/TreeTableActions';
+import { TreeTable } from 'ba-components';
+import { Paper } from '@material-ui/core';
+import data from './dataTreeTable.js';
+
+const styles = theme => ({
+ root: {
+ width: '100%',
+ marginTop: theme.spacing(3),
+ overflowX: 'auto',
+ },
+});
+
+const branch = 'treeTablePM';
+
+class TreeTableDemoIcon extends Component {
+ render() {
+ const {
+ arrowMore,
+ treeOpen,
+ classes,
+ toggleTree
+ } = this.props;
+ return (
+
+ );
+ }
+}
+
+TreeTableDemoIcon.propTypes = {
+ classes: PropTypes.object.isRequired,
+ treeOpen: PropTypes.object.isRequired,
+ arrowMore: PropTypes.object.isRequired,
+ toggleTree: PropTypes.func.isRequired,
+};
+
+const mapStateToProps = state => ({
+ force: state, // force state from reducer
+ treeOpen: state.getIn([branch, 'treeOpen']),
+ arrowMore: state.getIn([branch, 'arrowMore']),
+});
+
+const mapDispatchToProps = dispatch => ({
+ toggleTree: bindActionCreators(openAction, dispatch)
+});
+
+const TreeTableIconMapped = connect(
+ mapStateToProps,
+ mapDispatchToProps
+)(TreeTableDemoIcon);
+
+export default withStyles(styles)(TreeTableIconMapped);
diff --git a/front/odiparpack/app/containers/Tables/demos/dataTreeTable.js b/front/odiparpack/app/containers/Tables/demos/dataTreeTable.js
new file mode 100644
index 0000000..2eba8ab
--- /dev/null
+++ b/front/odiparpack/app/containers/Tables/demos/dataTreeTable.js
@@ -0,0 +1,128 @@
+module.exports = {
+ head: [
+ {
+ label: 'KeyId',
+ },
+ {
+ label: 'Dessert (100g serving)',
+ },
+ {
+ label: 'Calories',
+ },
+ {
+ label: 'Fat(g)',
+ }
+ ],
+ body: [
+ {
+ id: '1',
+ name: 'Frozen yoghurt',
+ calories: 159,
+ fat: 24,
+ child: [
+ {
+ id: '1_1',
+ name: 'Frozen child 1',
+ calories: 159,
+ fat: 24,
+ },
+ {
+ id: '1_2',
+ name: 'Frozen child 2',
+ calories: 159,
+ fat: 24,
+ child: [
+ {
+ id: '1_2_1',
+ name: 'Frozen grand child 1',
+ calories: 159,
+ fat: 24,
+ },
+ ]
+ },
+ ]
+ },
+ {
+ id: '2',
+ name: 'Eclair',
+ calories: 159,
+ fat: 24,
+ child: [
+ {
+ id: '2_1',
+ name: 'Eclair Child',
+ calories: 159,
+ fat: 24,
+ child: [
+ {
+ id: '2_1_1',
+ name: 'Eclair Grand Child 1',
+ calories: 159,
+ fat: 24,
+ },
+ {
+ id: '2_1_2',
+ name: 'Eclair Grand Child 2',
+ calories: 159,
+ fat: 24,
+ }
+ ]
+ },
+ ]
+ },
+ {
+ id: '3',
+ name: 'Cupcake',
+ calories: 159,
+ fat: 24,
+ },
+ {
+ id: '4',
+ name: 'Ginger Bread',
+ calories: 159,
+ fat: 24,
+ child: [
+ {
+ id: '4_1',
+ name: 'Ginger Bread Child',
+ calories: 159,
+ fat: 24,
+ child: [
+ {
+ id: '4_1_1',
+ name: 'Ginger Bread Grand Child 1',
+ calories: 159,
+ fat: 24,
+ child: [
+ {
+ id: '4_1_1_1',
+ name: 'Ginger Bread Super Grand Child 1',
+ calories: 159,
+ fat: 24,
+ },
+ {
+ id: '4_1_1_2',
+ name: 'Ginger Bread Super Grand Child 2',
+ calories: 159,
+ fat: 24,
+ },
+ ]
+ },
+ {
+ id: '4_1_2',
+ name: 'Ginger Bread Grand Child 2',
+ calories: 159,
+ fat: 24,
+ },
+ {
+ id: '4_1_3',
+ name: 'Ginger Bread Grand Child 3',
+ calories: 159,
+ fat: 24,
+ }
+ ]
+ },
+ ]
+ }
+ ]
+};
diff --git a/front/odiparpack/app/containers/Tables/demos/index.js b/front/odiparpack/app/containers/Tables/demos/index.js
new file mode 100644
index 0000000..604e828
--- /dev/null
+++ b/front/odiparpack/app/containers/Tables/demos/index.js
@@ -0,0 +1,14 @@
+export SimpleTable from './SimpleTable';
+export StrippedTable from './StrippedTable';
+export HoverTable from './HoverTable';
+export BorderedTable from './BorderedTable';
+export TreeTableDemo from './TreeTableDemo';
+export TreeTableDemoIcon from './TreeTableDemoIcon';
+export CrudTableDemo from './CrudTableDemo';
+export CrudTbFormDemo from './CrudTbFormDemo';
+export AdvTableDemo from './AdvTableDemo';
+export AdvFilter from './AdvFilter';
+export StatusLabel from './StatusLabel';
+export StatusColorRow from './StatusColorRow';
+export EmptyTable from './EmptyTable';
+export TrackingTable from './TrackingTable';
diff --git a/front/odiparpack/app/containers/Tables/demos/sampleData.js b/front/odiparpack/app/containers/Tables/demos/sampleData.js
new file mode 100644
index 0000000..d53d8e2
--- /dev/null
+++ b/front/odiparpack/app/containers/Tables/demos/sampleData.js
@@ -0,0 +1,124 @@
+export const anchorTable = [
+ {
+ name: 'id',
+ label: 'Id',
+ initialValue: '',
+ hidden: true
+ }, {
+ name: 'text',
+ label: 'Text Field',
+ initialValue: null,
+ width: 'auto',
+ hidden: false
+ }, {
+ name: 'email',
+ label: 'Email Field',
+ initialValue: null,
+ width: 'auto',
+ hidden: false
+ }, {
+ name: 'radio',
+ label: 'Radio Option',
+ initialValue: 'option1',
+ width: '80',
+ hidden: false
+ }, {
+ name: 'selection',
+ label: 'Selection',
+ initialValue: 'option1',
+ width: '80',
+ hidden: false
+ }, {
+ name: 'onof',
+ label: 'On/Of Input',
+ initialValue: true,
+ width: '80',
+ hidden: false
+ }, {
+ name: 'checkbox',
+ label: 'Checkbox',
+ initialValue: true,
+ width: '80',
+ hidden: false
+ }, {
+ name: 'textarea',
+ label: 'Text Area',
+ initialValue: 'This is default text',
+ width: 'auto',
+ hidden: false
+ }, {
+ name: 'edited',
+ label: '',
+ initialValue: '',
+ hidden: true
+ }, {
+ name: 'action',
+ label: 'Action',
+ initialValue: '',
+ hidden: false
+ },
+];
+
+export const dataApi = [
+ {
+ id: '1',
+ text: 'Just write',
+ email: 'mail@boss.com',
+ radio: 'option2',
+ selection: 'option1',
+ onof: false,
+ checkbox: true,
+ textarea: 'Lorem ipsum dolor sit amet',
+ edited: false,
+ }, {
+ id: '2',
+ text: 'Some text',
+ email: 'mail@material.com',
+ radio: 'option2',
+ selection: 'option2',
+ onof: false,
+ checkbox: false,
+ textarea: 'Lorem ipsum dolor sit amet',
+ edited: false,
+ }, {
+ id: '3',
+ text: 'Because it is a TextField',
+ email: 'mail@admin.com',
+ radio: 'option1',
+ selection: 'option3',
+ onof: false,
+ checkbox: false,
+ textarea: 'Lorem ipsum dolor sit amet',
+ edited: false,
+ }, {
+ id: '4',
+ text: 'And editable',
+ email: 'mail@example.com',
+ radio: 'option1',
+ selection: 'option1',
+ onof: false,
+ checkbox: true,
+ textarea: 'Lorem ipsum dolor sit amet',
+ edited: false,
+ }, {
+ id: '5',
+ text: 'You can write',
+ email: 'mail@material.com',
+ radio: 'option2',
+ selection: 'option2',
+ onof: false,
+ checkbox: true,
+ textarea: 'Lorem ipsum dolor sit amet',
+ edited: false,
+ }, {
+ id: '6',
+ text: 'Everything You want here',
+ email: 'mail@everything.com',
+ radio: 'option1',
+ selection: 'option3',
+ onof: false,
+ checkbox: false,
+ textarea: 'Lorem ipsum dolor sit amet',
+ edited: false,
+ },
+];
diff --git a/front/odiparpack/app/containers/Templates/Dashboard.js b/front/odiparpack/app/containers/Templates/Dashboard.js
new file mode 100644
index 0000000..5f24777
--- /dev/null
+++ b/front/odiparpack/app/containers/Templates/Dashboard.js
@@ -0,0 +1,114 @@
+import React, { useState, useEffect } from 'react';
+import { PropTypes } from 'prop-types';
+import classNames from 'classnames';
+import { bindActionCreators } from 'redux';
+import { connect } from 'react-redux';
+import { withStyles } from '@material-ui/core/styles';
+import { Header, Sidebar, BreadCrumb } from 'ba-components';
+import { toggleAction, openAction, playTransitionAction } from 'ba-actions/UiActions';
+import { Fade } from '@material-ui/core';
+import styles from './appStyles-jss';
+
+function Dashboard(props) {
+ const {
+ classes,
+ children,
+ history,
+ toggleDrawer,
+ sidebarOpen,
+ initialOpen,
+ loadTransition,
+ pageLoaded
+ } = props;
+ const [transform, setTransform] = useState(0);
+
+ const darker = true;
+
+ const handleScroll = () => {
+ const doc = document.documentElement;
+ const scroll = (window.pageYOffset || doc.scrollTop) - (doc.clientTop || 0);
+ setTransform(scroll);
+ };
+
+ useEffect(() => {
+ // Scroll content to top
+ window.addEventListener('scroll', handleScroll);
+
+ // Set expanded sidebar menu
+ const currentPath = history.location.pathname;
+ initialOpen(currentPath);
+
+ // Play page transition
+ loadTransition(true);
+
+ // Execute all arguments when page changes
+ const unlisten = history.listen(() => {
+ window.scrollTo(0, 0);
+ setTimeout(() => {
+ loadTransition(true);
+ }, 500);
+ });
+
+ return () => {
+ unlisten();
+ };
+ }, []);
+
+ return (
+
+
30 && darker} margin={sidebarOpen} />
+ 30 && darker}
+ />
+
+
+
+
+
+ );
+}
+
+Dashboard.propTypes = {
+ classes: PropTypes.object.isRequired,
+ history: PropTypes.object.isRequired,
+ children: PropTypes.node.isRequired,
+ initialOpen: PropTypes.func.isRequired,
+ toggleDrawer: PropTypes.func.isRequired,
+ loadTransition: PropTypes.func.isRequired,
+ sidebarOpen: PropTypes.bool.isRequired,
+ pageLoaded: PropTypes.bool.isRequired
+};
+
+const reducer = 'ui';
+const mapStateToProps = state => ({
+ sidebarOpen: state.getIn([reducer, 'sidebarOpen']),
+ pageLoaded: state.getIn([reducer, 'pageLoaded'])
+});
+
+const mapDispatchToProps = dispatch => ({
+ toggleDrawer: () => dispatch(toggleAction),
+ initialOpen: bindActionCreators(openAction, dispatch),
+ loadTransition: bindActionCreators(playTransitionAction, dispatch),
+});
+
+const DashboardMaped = connect(
+ mapStateToProps,
+ mapDispatchToProps
+)(Dashboard);
+
+export default (withStyles(styles)(DashboardMaped));
diff --git a/front/odiparpack/app/containers/Templates/Outer.js b/front/odiparpack/app/containers/Templates/Outer.js
new file mode 100644
index 0000000..f6448be
--- /dev/null
+++ b/front/odiparpack/app/containers/Templates/Outer.js
@@ -0,0 +1,34 @@
+import React from 'react';
+import { PropTypes } from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import brand from 'ba-api/brand';
+import logo from 'ba-images/logo.svg';
+import { Hidden } from '@material-ui/core';
+import styles from './appStyles-jss';
+
+function Outer(props) {
+ const {
+ classes,
+ children,
+ } = props;
+ return (
+
+
+
+
+
+
{brand.name}
+
+
+ {children}
+
+
+ );
+}
+
+Outer.propTypes = {
+ classes: PropTypes.object.isRequired,
+ children: PropTypes.node.isRequired,
+};
+
+export default (withStyles(styles)(Outer));
diff --git a/front/odiparpack/app/containers/Templates/appStyles-jss.js b/front/odiparpack/app/containers/Templates/appStyles-jss.js
new file mode 100644
index 0000000..f9175eb
--- /dev/null
+++ b/front/odiparpack/app/containers/Templates/appStyles-jss.js
@@ -0,0 +1,144 @@
+import bg from 'ba-images/material_bg.svg';
+import { fade } from '@material-ui/core/styles/colorManipulator';
+
+const appFrame = {
+ display: 'flex',
+ width: '100%',
+ minHeight: '100%',
+ zIndex: 1,
+};
+
+const styles = theme => ({
+ root: {
+ width: '100%',
+ minHeight: '100%',
+ marginTop: 0,
+ zIndex: 1,
+ },
+ appFrameInner: {
+ ...appFrame,
+ flexDirection: 'row'
+ },
+ appFrameOuter: {
+ ...appFrame,
+ },
+ content: {
+ backgroundColor: theme.palette.background.default,
+ width: '100%',
+ padding: theme.spacing(1.5),
+ paddingLeft: 0,
+ minHeight: '100%',
+ overflow: 'hidden',
+ },
+ outerContent: {
+ background: `url(${bg}) no-repeat ${theme.palette.primary.main} left bottom`,
+ width: '100%',
+ backgroundSize: 'cover',
+ flexDirection: 'column',
+ display: 'flex',
+ alignItems: 'center',
+ justifyContent: 'center',
+ [theme.breakpoints.down('md')]: {
+ padding: '20px 0'
+ },
+ },
+ bgbar: {
+ backgroundColor: theme.palette.primary.main,
+ width: '100%',
+ position: 'fixed',
+ height: 184,
+ top: 0,
+ left: 0
+ },
+ mainWrap: {
+ position: 'relative',
+ marginTop: theme.spacing(6),
+ marginLeft: theme.spacing(1.5),
+ height: '100%',
+ '& > div': {
+ paddingBottom: theme.spacing(4),
+ willChange: 'inherit !important' // hack for floating form issue whne expaded
+ }
+ },
+ preloader: {
+ position: 'absolute',
+ top: 0,
+ left: 0,
+ width: '100%',
+ zIndex: 1000,
+ background: 'transparent',
+ height: 3,
+ },
+ materialBg: {
+ position: 'absolute',
+ left: 0,
+ bottom: 0,
+ width: '100%',
+ opacity: 0.5
+ },
+ contentPadding: {
+ paddingLeft: 80
+ },
+ hideApp: {
+ display: 'none'
+ },
+ circularProgress: {
+ position: 'absolute',
+ top: 'calc(50% - 100px)',
+ left: 'calc(50% - 100px)',
+ },
+ brand: {
+ height: 54,
+ display: 'flex',
+ padding: '10px 10px 5px',
+ position: 'relative',
+ alignItems: 'center',
+ justifyContent: 'center',
+ '& img': {
+ width: 20
+ },
+ '& h3': {
+ margin: 0,
+ fontSize: 16,
+ fontWeight: 500,
+ paddingLeft: 10,
+ color: theme.palette.common.white,
+ }
+ },
+ btn: {},
+ icon: {},
+ btnPicker: {
+ position: 'fixed',
+ zIndex: 2000,
+ right: 0,
+ top: 200,
+ background: fade(theme.palette.background.paper, 0.8),
+ borderRadius: '30px 0 0 30px',
+ padding: '4px 8px 4px 4px',
+ overflow: 'hidden',
+ border: `1px solid ${theme.palette.grey[300]}`,
+ '& $btn': {
+ background: theme.palette.secondary.main,
+ borderRadius: 30,
+ padding: 8,
+ boxShadow: theme.shadows[4],
+ display: 'flex',
+ alignItems: 'center',
+ width: 40,
+ height: 40,
+ textCenter: 'cener',
+ overflow: 'hidden',
+ color: 'transparent',
+ transition: 'all 0.3s ease',
+ '& $icon': {
+ color: theme.palette.background.paper,
+ },
+ '&:hover': {
+ color: theme.palette.background.paper,
+ width: 90
+ }
+ }
+ }
+});
+
+export default styles;
diff --git a/front/odiparpack/app/containers/UiElements/Accordion.js b/front/odiparpack/app/containers/UiElements/Accordion.js
new file mode 100644
index 0000000..dd354d3
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/Accordion.js
@@ -0,0 +1,45 @@
+import React from 'react';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import { SourceReader, PapperBlock } from 'ba-components';
+import { SimpleAccordion, AdvancedAccordion, ControlledAccordion } from './demos';
+
+class Accordion extends React.Component {
+ render() {
+ const title = brand.name + ' - UI Elements';
+ const description = brand.desc;
+ const docSrc = 'containers/UiElements/demos/Accordion/';
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+export default Accordion;
diff --git a/front/odiparpack/app/containers/UiElements/Avatars.js b/front/odiparpack/app/containers/UiElements/Avatars.js
new file mode 100644
index 0000000..3ccbaaa
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/Avatars.js
@@ -0,0 +1,39 @@
+import React from 'react';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import { SourceReader, PapperBlock } from 'ba-components';
+import { AvatarsDemo, AvatarsPractice } from './demos';
+
+class Avatars extends React.Component {
+ render() {
+ const title = brand.name + ' - UI Elements';
+ const description = brand.desc;
+ const docSrc = 'containers/UiElements/demos/Avatars/';
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+export default Avatars;
diff --git a/front/odiparpack/app/containers/UiElements/Badges.js b/front/odiparpack/app/containers/UiElements/Badges.js
new file mode 100644
index 0000000..ff4783d
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/Badges.js
@@ -0,0 +1,39 @@
+import React from 'react';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import { SourceReader, PapperBlock } from 'ba-components';
+import { CommonBadges, VariantBadges } from './demos';
+
+class Badges extends React.Component {
+ render() {
+ const title = brand.name + ' - UI Elements';
+ const description = brand.desc;
+ const docSrc = 'containers/UiElements/demos/Badges/';
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+export default Badges;
diff --git a/front/odiparpack/app/containers/UiElements/Breadcrumbs.js b/front/odiparpack/app/containers/UiElements/Breadcrumbs.js
new file mode 100644
index 0000000..daaa24f
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/Breadcrumbs.js
@@ -0,0 +1,39 @@
+import React from 'react';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import { SourceReader, PapperBlock } from 'ba-components';
+import { ClassicBreadcrumbs, PaperBreadcrumbs } from './demos';
+
+class BreadCrumbs extends React.Component {
+ render() {
+ const title = brand.name + ' - UI Elements';
+ const description = brand.desc;
+ const docSrc = 'containers/UiElements/demos/Breadcrumbs/';
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+export default BreadCrumbs;
diff --git a/front/odiparpack/app/containers/UiElements/Cards.js b/front/odiparpack/app/containers/UiElements/Cards.js
new file mode 100644
index 0000000..7865b9d
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/Cards.js
@@ -0,0 +1,63 @@
+import React from 'react';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import { SourceReader, PapperBlock } from 'ba-components';
+import {
+ StandardCards,
+ ControlCards,
+ PaperSheet,
+ SocialCards,
+ EcommerceCards
+} from './demos';
+
+class Cards extends React.Component {
+ render() {
+ const title = brand.name + ' - UI Elements';
+ const description = brand.desc;
+ const docSrc = 'containers/UiElements/demos/Cards/';
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+export default Cards;
diff --git a/front/odiparpack/app/containers/UiElements/DialogModal.js b/front/odiparpack/app/containers/UiElements/DialogModal.js
new file mode 100644
index 0000000..6e26609
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/DialogModal.js
@@ -0,0 +1,97 @@
+import React from 'react';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import { SourceReader, PapperBlock } from 'ba-components';
+import { Grid } from '@material-ui/core';
+import {
+ ModalDemo,
+ AlertDialog,
+ SelectDialog,
+ SelectRadioDialog,
+ FormDialog,
+ FullScreenDialog,
+ ImagePopup,
+ ScrollDialog
+} from './demos';
+
+class DialogModal extends React.Component {
+ render() {
+ const title = brand.name + ' - UI Elements';
+ const description = brand.desc;
+ const docSrc = 'containers/UiElements/demos/DialogModal/';
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+export default DialogModal;
diff --git a/front/odiparpack/app/containers/UiElements/Dividers.js b/front/odiparpack/app/containers/UiElements/Dividers.js
new file mode 100644
index 0000000..34c66a9
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/Dividers.js
@@ -0,0 +1,39 @@
+import React from 'react';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import { SourceReader, PapperBlock } from 'ba-components';
+import { CommonDividers, SpecialDividers } from './demos';
+
+class Dividers extends React.Component {
+ render() {
+ const title = brand.name + ' - UI Elements';
+ const description = brand.desc;
+ const docSrc = 'containers/UiElements/demos/Dividers/';
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+export default Dividers;
diff --git a/front/odiparpack/app/containers/UiElements/DrawerMenu.js b/front/odiparpack/app/containers/UiElements/DrawerMenu.js
new file mode 100644
index 0000000..dfffbc8
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/DrawerMenu.js
@@ -0,0 +1,104 @@
+import React from 'react';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import { SourceReader, PapperBlock } from 'ba-components';
+import { Grid } from '@material-ui/core';
+import {
+ TemporaryDrawer,
+ SwipeDrawer,
+ PermanentDrawer,
+ PersistentDrawer,
+ MiniDrawer,
+ BasicMenu,
+ DropdownMenu,
+ StyledMenu,
+ MenuTransition
+} from './demos';
+
+class DrawerMenu extends React.Component {
+ render() {
+ const title = brand.name + ' - UI Elements';
+ const description = brand.desc;
+ const docSrc = 'containers/UiElements/demos/DrawerMenu/';
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+export default DrawerMenu;
diff --git a/front/odiparpack/app/containers/UiElements/IconGallery/DetailIcon.js b/front/odiparpack/app/containers/UiElements/IconGallery/DetailIcon.js
new file mode 100644
index 0000000..e19c17a
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/IconGallery/DetailIcon.js
@@ -0,0 +1,149 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import SyntaxHighlighter, { registerLanguage } from 'react-syntax-highlighter/prism-light';
+import jsx from 'react-syntax-highlighter/languages/prism/jsx';
+import themeSource from 'react-syntax-highlighter/styles/prism/prism';
+import { withStyles } from '@material-ui/core/styles';
+
+import {
+ Typography,
+ Button,
+ Icon,
+ Divider,
+ Dialog,
+ DialogActions,
+ DialogContent,
+ DialogTitle,
+ Slide,
+} from '@material-ui/core';
+
+const Transition = React.forwardRef(function Transition(props, ref) { // eslint-disable-line
+ return ;
+});
+
+const humanize = (str, space) => {
+ let string = str;
+ if (str === '3d_rotation') {
+ string = 'three_d_rotation';
+ }
+ const frags = string.split('_');
+ for (let i = 0; i < frags.length; i += 1) {
+ frags[i] = frags[i].charAt(0).toUpperCase() + frags[i].slice(1);
+ }
+
+ if (space) {
+ return frags.join(' ');
+ }
+ return frags.join('');
+};
+
+const styles = theme => ({
+ code: {
+ fontSize: 12,
+ padding: '5px !important'
+ },
+ divider: {
+ display: 'block',
+ margin: `${theme.spacing(3)}px 0`,
+ },
+ bigIcon: {
+ textAlign: 'center',
+ marginBottom: 30,
+ '& span': {
+ fontSize: 128
+ }
+ },
+ title: {
+ marginBottom: 40,
+ fontSize: 22,
+ paddingBottom: 20,
+ position: 'relative',
+ fontWeight: 500,
+ color: theme.palette.grey[700],
+ textTransform: 'uppercase',
+ '&:after': {
+ content: '""',
+ display: 'block',
+ position: 'absolute',
+ bottom: 0,
+ left: 24,
+ width: 40,
+ borderBottom: `5px solid ${theme.palette.primary.main}`
+ }
+ },
+});
+
+class DetailIcon extends React.Component {
+ render() {
+ registerLanguage('jsx', jsx);
+ const {
+ isOpenDetail,
+ iconName,
+ iconCode,
+ closeDetail
+ } = this.props;
+ const { classes } = this.props;
+ const linkCode = ' ';
+ const fontCode = '' + iconName + ' ';
+ const importCode = 'import ' + humanize(iconName, false) + " from '@material-ui/icons/" + humanize(iconName, false) + "';";
+ const importIconCode = "import Icon from '@material-ui/core/Icon';";
+ const svgCode = '<' + humanize(iconName, false) + ' />';
+ return (
+
+
+ {humanize(iconName, true)}
+ {' '}
+(
+ {iconCode}
+)
+
+
+
+ {iconName}
+
+ Use with Font Icons
+
+ {linkCode}
+
+
+ {importIconCode}
+
+
+ {fontCode}
+
+
+ Use with SVG Material icons
+
+ {importCode}
+
+
+ {svgCode}
+
+
+
+
+ Close
+
+
+
+ );
+ }
+}
+
+DetailIcon.propTypes = {
+ classes: PropTypes.object.isRequired,
+ isOpenDetail: PropTypes.bool.isRequired,
+ closeDetail: PropTypes.func.isRequired,
+ iconName: PropTypes.string.isRequired,
+ iconCode: PropTypes.string.isRequired,
+};
+
+export default withStyles(styles)(DetailIcon);
diff --git a/front/odiparpack/app/containers/UiElements/IconGallery/SearchIcons.js b/front/odiparpack/app/containers/UiElements/IconGallery/SearchIcons.js
new file mode 100644
index 0000000..c046362
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/IconGallery/SearchIcons.js
@@ -0,0 +1,54 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import SearchIcon from '@material-ui/icons/Search';
+
+import { IconButton, Input, InputAdornment, FormControl } from '@material-ui/core';
+
+const styles = theme => ({
+ search: {
+ display: 'block',
+ background: '#fff',
+ marginBottom: 10,
+ paddingTop: 5,
+ boxShadow: theme.shadows[2],
+ '& > div': {
+ width: '100%',
+ },
+ '& input': {
+ padding: '10px 8px'
+ }
+ }
+});
+
+class SearchIcons extends React.Component {
+ render() {
+ const { filterText, classes, handleSearch } = this.props;
+ return (
+
+
+
+
+
+
+ )}
+ />
+
+ );
+ }
+}
+
+SearchIcons.propTypes = {
+ classes: PropTypes.object.isRequired,
+ filterText: PropTypes.string.isRequired,
+ handleSearch: PropTypes.func.isRequired,
+};
+
+export default withStyles(styles)(SearchIcons);
diff --git a/front/odiparpack/app/containers/UiElements/Icons.js b/front/odiparpack/app/containers/UiElements/Icons.js
new file mode 100644
index 0000000..f207d29
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/Icons.js
@@ -0,0 +1,158 @@
+import React from 'react';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import PropTypes from 'prop-types';
+import Axios from 'axios';
+import { withStyles } from '@material-ui/core/styles';
+import { PapperBlock } from 'ba-components';
+import { Typography, IconButton, Icon, LinearProgress } from '@material-ui/core';
+import DetailIcon from './IconGallery/DetailIcon';
+import SearchIcons from './IconGallery/SearchIcons';
+const url = '/api/icons?src=';
+
+const styles = theme => ({
+ hide: {
+ display: 'none'
+ },
+ iconsList: {
+ display: 'flex',
+ flexWrap: 'wrap',
+ justifyContent: 'space-between',
+ [theme.breakpoints.down('xs')]: {
+ justifyContent: 'center',
+ },
+ overflow: 'auto',
+ maxHeight: 1000,
+ position: 'relative'
+ },
+ iconWrap: {
+ position: 'relative',
+ width: 120,
+ margin: 20,
+ [theme.breakpoints.down('xs')]: {
+ margin: 10,
+ },
+ textAlign: 'center'
+ },
+ btn: {
+ display: 'block',
+ textAlign: 'center',
+ margin: '0 auto',
+ },
+ icon: {
+ fontSize: 48,
+ },
+ preloader: {
+ width: '100%'
+ },
+});
+
+class Icons extends React.Component {
+ state = {
+ raws: [],
+ loading: false,
+ openDetail: false,
+ iconName: '',
+ iconCode: '',
+ filterText: ''
+ };
+
+ componentDidMount = () => {
+ const name = 'material-icon-cheat.txt';
+ this.setState({ loading: true }, () => {
+ Axios.get(url + name)
+ .then(response => response.data.records[0].source)
+ .then(data => {
+ const namesAndCodes = data.split('\n');
+ const icons = namesAndCodes.map(nameAndCode => {
+ const parts = nameAndCode.split(' ');
+ return {
+ name: parts[0],
+ code: parts[1]
+ };
+ });
+ return icons;
+ })
+ .then(icons => {
+ this.setState({
+ raws: icons,
+ loading: false
+ });
+ });
+ });
+ }
+
+ handleOpenDetail = (name, code) => {
+ this.setState({
+ openDetail: true,
+ iconName: name,
+ iconCode: code,
+ });
+ };
+
+ handleCloseDetail = () => {
+ this.setState({ openDetail: false });
+ };
+
+ handleSearch = (event) => {
+ event.persist();
+ // Show result base on keyword
+ this.setState({ filterText: event.target.value.toLowerCase() });
+ }
+
+ render() {
+ const title = brand.name + ' - UI Elements';
+ const description = brand.desc;
+ const {
+ raws,
+ loading,
+ openDetail,
+ iconName,
+ iconCode,
+ filterText
+ } = this.state;
+ const { classes } = this.props;
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+ {loading
+ &&
+ }
+
this.handleSearch(event)} />
+
+ {raws.map((raw, index) => {
+ if (raw.name.toLowerCase().indexOf(filterText) === -1) {
+ return false;
+ }
+ return (
+
+ this.handleOpenDetail(raw.name, raw.code)} className={classes.btn}>
+ {raw.name}
+
+ {raw.name}
+
+ );
+ })}
+
+
+
+
+
+ );
+ }
+}
+
+Icons.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(Icons);
diff --git a/front/odiparpack/app/containers/UiElements/ImageGrid.js b/front/odiparpack/app/containers/UiElements/ImageGrid.js
new file mode 100644
index 0000000..a95fd50
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/ImageGrid.js
@@ -0,0 +1,51 @@
+import React from 'react';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import { SourceReader, PapperBlock } from 'ba-components';
+import { ImageGridList, TitlebarGridList, AdvancedGridList, SingleLineGridList } from './demos';
+
+class ImageGrid extends React.Component {
+ render() {
+ const title = brand.name + ' - UI Elements';
+ const description = brand.desc;
+ const docSrc = 'containers/UiElements/demos/ImageGrid/';
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+export default ImageGrid;
diff --git a/front/odiparpack/app/containers/UiElements/List.js b/front/odiparpack/app/containers/UiElements/List.js
new file mode 100644
index 0000000..665cd08
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/List.js
@@ -0,0 +1,63 @@
+import React from 'react';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import { SourceReader, PapperBlock } from 'ba-components';
+import {
+ ListBasic,
+ ListMenu,
+ PinnedList,
+ ListControl,
+ ListInteractive
+} from './demos';
+
+class List extends React.Component {
+ render() {
+ const title = brand.name + ' - UI Elements';
+ const description = brand.desc;
+ const docSrc = 'containers/UiElements/demos/List/';
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+export default List;
diff --git a/front/odiparpack/app/containers/UiElements/Notification.js b/front/odiparpack/app/containers/UiElements/Notification.js
new file mode 100644
index 0000000..b00f24e
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/Notification.js
@@ -0,0 +1,56 @@
+import React from 'react';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import { SourceReader, PapperBlock } from 'ba-components';
+import { Grid } from '@material-ui/core';
+import { SimpleNotif, StyledNotif, TransitionNotif, MobileNotif } from './demos';
+
+class Notification extends React.Component {
+ render() {
+ const title = brand.name + ' - UI Elements';
+ const description = brand.desc;
+ const docSrc = 'containers/UiElements/demos/Notification/';
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+export default Notification;
diff --git a/front/odiparpack/app/containers/UiElements/Paginations.js b/front/odiparpack/app/containers/UiElements/Paginations.js
new file mode 100644
index 0000000..7f6fa47
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/Paginations.js
@@ -0,0 +1,45 @@
+import React from 'react';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import { SourceReader, PapperBlock } from 'ba-components';
+import { TbPagination, TbPaginationCustom, GeneralPagination } from './demos';
+
+class Paginations extends React.Component {
+ render() {
+ const title = brand.name + ' - UI Elements';
+ const description = brand.desc;
+ const docSrc = 'containers/UiElements/demos/Pagination/';
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+export default Paginations;
diff --git a/front/odiparpack/app/containers/UiElements/PopoverTooltip.js b/front/odiparpack/app/containers/UiElements/PopoverTooltip.js
new file mode 100644
index 0000000..508129b
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/PopoverTooltip.js
@@ -0,0 +1,95 @@
+import React from 'react';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import { SourceReader, PapperBlock } from 'ba-components';
+import { Grid } from '@material-ui/core';
+import {
+ SimpleTooltips,
+ PositionedTooltips,
+ SimplePopover,
+ PopoverPlayground,
+ DelayTooltips,
+ TransitionsTooltips,
+ TriggersTooltips,
+ CustomizedTooltips
+} from './demos';
+
+class PopoverTooltip extends React.Component {
+ render() {
+ const title = brand.name + ' - UI Elements';
+ const description = brand.desc;
+ const docSrc = 'containers/UiElements/demos/PopoverTooltip/';
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+export default PopoverTooltip;
diff --git a/front/odiparpack/app/containers/UiElements/Progress.js b/front/odiparpack/app/containers/UiElements/Progress.js
new file mode 100644
index 0000000..669da02
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/Progress.js
@@ -0,0 +1,126 @@
+import React from 'react';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import { SourceReader, PapperBlock } from 'ba-components';
+import { Grid } from '@material-ui/core';
+import {
+ CircularStatic,
+ CircularIndeterminate,
+ CircularDeterminate,
+ CircularIntegration,
+ LinearStatic,
+ LinearIndeterminate,
+ LinearDeterminate,
+ LinearBuffer,
+ LinearQuery,
+ ProgressDelay
+} from './demos';
+
+const styles = ({
+ root: {
+ flexGrow: 1,
+ }
+});
+
+class Progress extends React.Component {
+ render() {
+ const { classes } = this.props;
+ const title = brand.name + ' - UI Elements';
+ const description = brand.desc;
+ const docSrc = 'containers/UiElements/demos/Progress/';
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+Progress.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(Progress);
diff --git a/front/odiparpack/app/containers/UiElements/SliderCarousel.js b/front/odiparpack/app/containers/UiElements/SliderCarousel.js
new file mode 100644
index 0000000..b624774
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/SliderCarousel.js
@@ -0,0 +1,77 @@
+import React from 'react';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import { SourceReader, PapperBlock } from 'ba-components';
+import {
+ SingleCarousel,
+ MultipleCarousel,
+ AutoplayCarousel,
+ ThumbnailCarousel,
+ VerticalCarousel,
+ CustomCarousel,
+ AnimatedSlider
+} from './demos';
+
+class SliderCarousel extends React.Component {
+ render() {
+ const title = brand.name + ' - UI Elements';
+ const description = brand.desc;
+ const docSrc = 'containers/UiElements/demos/SliderCaraousel/';
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+export default SliderCarousel;
diff --git a/front/odiparpack/app/containers/UiElements/Steppers.js b/front/odiparpack/app/containers/UiElements/Steppers.js
new file mode 100644
index 0000000..358f641
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/Steppers.js
@@ -0,0 +1,70 @@
+import React from 'react';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import { SourceReader, PapperBlock } from 'ba-components';
+import {
+ HorizontalLinear,
+ HorizontalNonLinear,
+ StepperError,
+ VerticalStepper,
+ MobileSteppers,
+ StepperCarousel
+} from './demos';
+
+class Steppers extends React.Component {
+ render() {
+ const title = brand.name + ' - UI Elements';
+ const description = brand.desc;
+ const docSrc = 'containers/UiElements/demos/Steppers/';
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+export default Steppers;
diff --git a/front/odiparpack/app/containers/UiElements/Tabs.js b/front/odiparpack/app/containers/UiElements/Tabs.js
new file mode 100644
index 0000000..0782462
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/Tabs.js
@@ -0,0 +1,120 @@
+import React from 'react';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import { withStyles } from '@material-ui/core/styles';
+import PropTypes from 'prop-types';
+import { SourceReader, PapperBlock } from 'ba-components';
+import { Grid } from '@material-ui/core';
+import {
+ SimpleTabs,
+ LongTextTabs,
+ FixedTabs,
+ CenteredTabs,
+ IconTabs,
+ ScrollTabs,
+ ScrollIconTabs,
+ DisabledTab,
+ CustomTabs,
+ BottomNav
+} from './demos';
+
+const styles = ({
+ root: {
+ flexGrow: 1,
+ }
+});
+
+class Tabs extends React.Component {
+ render() {
+ const title = brand.name + ' - UI Elements';
+ const description = brand.desc;
+ const { classes } = this.props;
+ const docSrc = 'containers/UiElements/demos/Tabs/';
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+Tabs.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(Tabs);
diff --git a/front/odiparpack/app/containers/UiElements/Tags.js b/front/odiparpack/app/containers/UiElements/Tags.js
new file mode 100644
index 0000000..e8a5571
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/Tags.js
@@ -0,0 +1,39 @@
+import React from 'react';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import { SourceReader, PapperBlock } from 'ba-components';
+import { BasicTags, ArrayTags } from './demos';
+
+class Tags extends React.Component {
+ render() {
+ const title = brand.name + ' - UI Elements';
+ const description = brand.desc;
+ const docSrc = 'containers/UiElements/demos/Tags/';
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+export default Tags;
diff --git a/front/odiparpack/app/containers/UiElements/Typography.js b/front/odiparpack/app/containers/UiElements/Typography.js
new file mode 100644
index 0000000..e1a88ba
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/Typography.js
@@ -0,0 +1,92 @@
+import React from 'react';
+import { Helmet } from 'react-helmet';
+import brand from 'ba-api/brand';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import { SourceReader, PapperBlock } from 'ba-components';
+import { Grid } from '@material-ui/core';
+import {
+ GeneralTypo,
+ Heading,
+ ListTypo,
+ AlignTypo,
+ ColouredTypo,
+ QuotesDemo
+} from './demos';
+
+const styles = ({
+ root: {
+ flexGrow: 1,
+ }
+});
+
+class Typography extends React.Component {
+ render() {
+ const { classes } = this.props;
+ const title = brand.name + ' - UI Elements';
+ const description = brand.desc;
+ const docSrc = 'containers/UiElements/demos/Typography/';
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/* */}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+Typography.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(Typography);
diff --git a/front/odiparpack/app/containers/UiElements/demos/Accordion/AdvancedAccordion.js b/front/odiparpack/app/containers/UiElements/demos/Accordion/AdvancedAccordion.js
new file mode 100644
index 0000000..87cd84e
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/Accordion/AdvancedAccordion.js
@@ -0,0 +1,97 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import classNames from 'classnames';
+import ExpandMoreIcon from '@material-ui/icons/ExpandMore';
+
+import {
+ ExpansionPanel,
+ ExpansionPanelDetails,
+ ExpansionPanelSummary,
+ ExpansionPanelActions,
+ Typography,
+ Chip,
+ Button,
+ Divider,
+} from '@material-ui/core';
+
+const styles = theme => ({
+ root: {
+ width: '100%',
+ },
+ heading: {
+ fontSize: theme.typography.pxToRem(15),
+ },
+ secondaryHeading: {
+ fontSize: theme.typography.pxToRem(15),
+ color: theme.palette.text.secondary,
+ },
+ icon: {
+ verticalAlign: 'bottom',
+ height: 20,
+ width: 20,
+ },
+ details: {
+ alignItems: 'center',
+ },
+ column: {
+ flexBasis: '33.33%',
+ },
+ helper: {
+ borderLeft: `2px solid ${theme.palette.divider}`,
+ padding: `${theme.spacing(1)}px ${theme.spacing(2)}px`,
+ },
+ link: {
+ color: theme.palette.secondary.main,
+ textDecoration: 'none',
+ '&:hover': {
+ textDecoration: 'underline',
+ },
+ },
+});
+
+function AdvancedAccordion(props) {
+ const { classes } = props;
+ return (
+
+
+ }>
+
+ Location
+
+
+ Select trip destination
+
+
+
+
+
+ {}} />
+
+
+
+
+
+ Cancel
+
+ Save
+
+
+
+
+ );
+}
+
+AdvancedAccordion.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(AdvancedAccordion);
diff --git a/front/odiparpack/app/containers/UiElements/demos/Accordion/ControlledAccordion.js b/front/odiparpack/app/containers/UiElements/demos/Accordion/ControlledAccordion.js
new file mode 100644
index 0000000..6bcc2c8
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/Accordion/ControlledAccordion.js
@@ -0,0 +1,100 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import ExpandMoreIcon from '@material-ui/icons/ExpandMore';
+
+import { ExpansionPanel, ExpansionPanelSummary, ExpansionPanelDetails, Typography } from '@material-ui/core';
+
+const styles = theme => ({
+ root: {
+ width: '100%',
+ },
+ heading: {
+ fontSize: theme.typography.pxToRem(15),
+ flexBasis: '33.33%',
+ flexShrink: 0,
+ },
+ secondaryHeading: {
+ fontSize: theme.typography.pxToRem(15),
+ color: theme.palette.text.secondary,
+ },
+});
+
+class ControlledAccordion extends React.Component {
+ state = {
+ expanded: null,
+ };
+
+ handleChange = panel => (event, expanded) => {
+ this.setState({
+ expanded: expanded ? panel : false,
+ });
+ };
+
+ render() {
+ const { classes } = this.props;
+ const { expanded } = this.state;
+
+ return (
+
+
+ }>
+ General settings
+ I am an expansion panel
+
+
+
+ Nulla facilisi. Phasellus sollicitudin nulla et quam mattis feugiat. Aliquam eget
+ maximus est, id dignissim quam.
+
+
+
+
+ }>
+ Users
+
+ You are currently not an owner
+
+
+
+
+ Donec placerat, lectus sed mattis semper, neque lectus feugiat lectus, varius pulvinar
+ diam eros in elit. Pellentesque convallis laoreet laoreet.
+
+
+
+
+ }>
+ Advanced settings
+
+ Filtering has been entirely disabled for whole web server
+
+
+
+
+ Nunc vitae orci ultricies, auctor nunc in, volutpat nisl. Integer sit amet egestas
+ eros, vitae egestas augue. Duis vel est augue.
+
+
+
+
+ }>
+ Personal data
+
+
+
+ Nunc vitae orci ultricies, auctor nunc in, volutpat nisl. Integer sit amet egestas
+ eros, vitae egestas augue. Duis vel est augue.
+
+
+
+
+ );
+ }
+}
+
+ControlledAccordion.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(ControlledAccordion);
diff --git a/front/odiparpack/app/containers/UiElements/demos/Accordion/SimpleAccordion.js b/front/odiparpack/app/containers/UiElements/demos/Accordion/SimpleAccordion.js
new file mode 100644
index 0000000..a88f772
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/Accordion/SimpleAccordion.js
@@ -0,0 +1,57 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import ExpandMoreIcon from '@material-ui/icons/ExpandMore';
+
+import { ExpansionPanel, ExpansionPanelDetails, ExpansionPanelSummary, Typography } from '@material-ui/core';
+
+const styles = theme => ({
+ root: {
+ width: '100%',
+ },
+ heading: {
+ fontSize: theme.typography.pxToRem(15),
+ fontWeight: theme.typography.fontWeightRegular,
+ },
+});
+
+function SimpleAccordion(props) {
+ const { classes } = props;
+ return (
+
+
+ }>
+ Expansion Panel 1
+
+
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse malesuada lacus ex,
+ sit amet blandit leo lobortis eget.
+
+
+
+
+ }>
+ Expansion Panel 2
+
+
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse malesuada lacus ex,
+ sit amet blandit leo lobortis eget.
+
+
+
+
+ }>
+ Disabled Expansion Panel
+
+
+
+ );
+}
+
+SimpleAccordion.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(SimpleAccordion);
diff --git a/front/odiparpack/app/containers/UiElements/demos/Avatars/AvatarsDemo.js b/front/odiparpack/app/containers/UiElements/demos/Avatars/AvatarsDemo.js
new file mode 100644
index 0000000..e21391e
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/Avatars/AvatarsDemo.js
@@ -0,0 +1,112 @@
+import React, { Fragment, PureComponent } from 'react';
+import PropTypes from 'prop-types';
+import classNames from 'classnames';
+import { withStyles } from '@material-ui/core/styles';
+import FolderIcon from '@material-ui/icons/Folder';
+import PageviewIcon from '@material-ui/icons/Pageview';
+import AssignmentIcon from '@material-ui/icons/Assignment';
+import avatarApi from 'ba-api/avatars';
+
+import { pink, green, deepOrange, deepPurple } from '@material-ui/core/colors';
+
+import { Typography, Avatar, Grid } from '@material-ui/core';
+
+const styles = ({
+ row: {
+ display: 'flex',
+ justifyContent: 'flex-start',
+ },
+ avatar: {
+ margin: 10,
+ },
+ bigAvatar: {
+ width: 60,
+ height: 60,
+ },
+ pinkAvatar: {
+ margin: 10,
+ color: '#fff',
+ backgroundColor: pink[500],
+ },
+ greenAvatar: {
+ margin: 10,
+ color: '#fff',
+ backgroundColor: green[500],
+ },
+ orangeAvatar: {
+ margin: 10,
+ color: '#fff',
+ backgroundColor: deepOrange[500],
+ },
+ purpleAvatar: {
+ margin: 10,
+ color: '#fff',
+ backgroundColor: deepPurple[500],
+ },
+});
+
+class AvatarsDemo extends PureComponent {
+ render() {
+ const { classes } = this.props;
+ return (
+
+
+
+ Image Avatars
+
+
+
+ Icon Avatars
+
+
+
+ Icon Avatars
+
+
+
+
+ );
+ }
+}
+
+AvatarsDemo.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(AvatarsDemo);
diff --git a/front/odiparpack/app/containers/UiElements/demos/Avatars/AvatarsPractice.js b/front/odiparpack/app/containers/UiElements/demos/Avatars/AvatarsPractice.js
new file mode 100644
index 0000000..a95b702
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/Avatars/AvatarsPractice.js
@@ -0,0 +1,212 @@
+import React, { Fragment, PureComponent } from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import ImageIcon from '@material-ui/icons/Image';
+import FavoriteIcon from '@material-ui/icons/Favorite';
+import WorkIcon from '@material-ui/icons/Work';
+import BeachAccessIcon from '@material-ui/icons/BeachAccess';
+import ShareIcon from '@material-ui/icons/Share';
+import MoreVertIcon from '@material-ui/icons/MoreVert';
+import FaceIcon from '@material-ui/icons/Face';
+import imgApi from 'ba-api/images';
+
+import { red, green, amber } from '@material-ui/core/colors';
+
+import {
+ Typography,
+ Card,
+ CardHeader,
+ CardMedia,
+ CardContent,
+ CardActions,
+ IconButton,
+ Avatar,
+ List,
+ ListItem,
+ ListItemText,
+ ListItemAvatar,
+ Grid,
+ Chip,
+ Divider,
+} from '@material-ui/core';
+
+const styles = theme => ({
+ row: {
+ display: 'flex',
+ justifyContent: 'flex-start',
+ },
+ chip: {
+ margin: theme.spacing(1),
+ },
+ card: {
+ maxWidth: 400,
+ },
+ media: {
+ height: 0,
+ paddingTop: '56.25%', // 16:9
+ },
+ actions: {
+ display: 'flex',
+ },
+ expand: {
+ transform: 'rotate(0deg)',
+ transition: theme.transitions.create('transform', {
+ duration: theme.transitions.duration.shortest,
+ }),
+ marginLeft: 'auto',
+ },
+ expandOpen: {
+ transform: 'rotate(180deg)',
+ },
+ root: {
+ width: '100%',
+ maxWidth: 360,
+ backgroundColor: theme.palette.background.paper,
+ },
+ avatarRed: {
+ backgroundColor: red[500],
+ },
+ avatarGreen: {
+ backgroundColor: green[500],
+ },
+ avatarAmber: {
+ backgroundColor: amber[500],
+ },
+ divider: {
+ display: 'block',
+ margin: `${theme.spacing(3)}px 0`,
+ }
+});
+
+function handleDelete() {
+ alert('You clicked the delete icon.'); // eslint-disable-line no-alert
+}
+
+function handleClick() {
+ alert('You clicked the Chip.'); // eslint-disable-line no-alert
+}
+
+class AvatarsDemo extends PureComponent {
+ render() {
+ const { classes } = this.props;
+ return (
+
+
+
+ Avatars in Tag(Chip)
+
+ MB}
+ label="Clickable Chip"
+ onClick={handleClick}
+ className={classes.chip}
+ />
+ }
+ label="Deletable Chip"
+ onDelete={handleDelete}
+ className={classes.chip}
+ />
+
+
+
+ )}
+ label="Clickable Deletable Chip"
+ onClick={handleClick}
+ onDelete={handleDelete}
+ className={classes.chip}
+ />
+
+
+ Avatars in List Menu
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Avatars in Social Media
+
+
+
+ }
+ action={(
+
+
+
+ )}
+ title="Aliquam nec ex aliquet"
+ subheader="September 14, 2018"
+ />
+
+
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse sed urna in justo euismod condimentum.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+AvatarsDemo.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(AvatarsDemo);
diff --git a/front/odiparpack/app/containers/UiElements/demos/Badges/CommonBadges.js b/front/odiparpack/app/containers/UiElements/demos/Badges/CommonBadges.js
new file mode 100644
index 0000000..b9dca43
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/Badges/CommonBadges.js
@@ -0,0 +1,121 @@
+import React, { Fragment, PureComponent } from 'react';
+import PropTypes from 'prop-types';
+import { withStyles, MuiThemeProvider, createMuiTheme } from '@material-ui/core/styles';
+import { pink, teal } from '@material-ui/core/colors';
+
+import { Badge, Typography, Grid, Button } from '@material-ui/core';
+
+const styles = theme => ({
+ demo: {
+ height: 'auto',
+ },
+ divider: {
+ display: 'block',
+ margin: `${theme.spacing(3)}px 0`,
+ },
+ alone: {
+ position: 'relative',
+ margin: 20
+ },
+ field: {
+ margin: '10px',
+ position: 'relative'
+ },
+ cssRoot: {
+ '& span': {
+ backgroundColor: pink[700],
+ color: theme.palette.getContrastText(pink[500]),
+ },
+ },
+});
+
+const theme = createMuiTheme({
+ palette: {
+ primary: teal,
+ secondary: pink
+ },
+});
+
+class CommonBadges extends PureComponent {
+ render() {
+ const { classes } = this.props;
+ return (
+
+
+
+ Button Badges
+
+
+
+ Button
+
+
+
+
+ Button
+
+
+
+
+ Button
+
+
+
+
+
+ Button
+
+
+
+
+
+
+ Text Badges
+
+
+
+ Badge Text
+
+
+
+
+ Badges Bold Text
+
+
+
+
+
+
+ );
+ }
+}
+
+CommonBadges.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(CommonBadges);
diff --git a/front/odiparpack/app/containers/UiElements/demos/Badges/VariantBadges.js b/front/odiparpack/app/containers/UiElements/demos/Badges/VariantBadges.js
new file mode 100644
index 0000000..8dcc485
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/Badges/VariantBadges.js
@@ -0,0 +1,117 @@
+import React, { Fragment, PureComponent } from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import classNames from 'classnames';
+import MailIcon from '@material-ui/icons/Mail';
+import { LimitedBadges } from 'ba-components';
+
+import { Badge, Typography, Grid, IconButton, AppBar, Tabs, Tab } from '@material-ui/core';
+
+const styles = theme => ({
+ demo: {
+ height: 'auto',
+ },
+ divider: {
+ margin: `${theme.spacing(3)}px 0`,
+ },
+ alone: {
+ position: 'relative',
+ margin: 20
+ },
+ field: {
+ margin: '10px',
+ position: 'relative'
+ },
+ margin: {
+ margin: theme.spacing(2),
+ },
+ padding: {
+ padding: `0 ${theme.spacing(2)}px`,
+ },
+ autoscale: {
+ '& span': {
+ width: 'auto',
+ padding: 2
+ }
+ }
+});
+
+class CommonBadges extends PureComponent {
+ render() {
+ const { classes } = this.props;
+ return (
+
+
+
+ Icon Badges
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Tab Badges
+
+
+
+ Item One
+
+ )}
+ />
+
+
+
+
+
+
+
+ );
+ }
+}
+
+CommonBadges.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(CommonBadges);
diff --git a/front/odiparpack/app/containers/UiElements/demos/Breadcrumbs/ClassicBreadcrumbs.js b/front/odiparpack/app/containers/UiElements/demos/Breadcrumbs/ClassicBreadcrumbs.js
new file mode 100644
index 0000000..786a07b
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/Breadcrumbs/ClassicBreadcrumbs.js
@@ -0,0 +1,83 @@
+import React, { Fragment, PureComponent } from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import { BreadCrumb } from 'ba-components';
+
+import { Typography, Grid } from '@material-ui/core';
+
+const styles = theme => ({
+ demo: {
+ height: 'auto',
+ },
+ divider: {
+ margin: `${theme.spacing(3)}px 0`,
+ },
+ field: {
+ margin: '10px',
+ position: 'relative'
+ },
+});
+
+class ClassicBreadcrumbs extends PureComponent {
+ render() {
+ const { classes } = this.props;
+ const location = { pathname: '/grand-parent/parent/children' };
+ return (
+
+
+
+ Arrow Separator
+
+
+
+
+
+ Slash Separator
+
+
+
+
+
+ Greater Than Separator
+
+
+
+
+
+
+ );
+ }
+}
+
+ClassicBreadcrumbs.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(ClassicBreadcrumbs);
diff --git a/front/odiparpack/app/containers/UiElements/demos/Breadcrumbs/PaperBreadcrumbs.js b/front/odiparpack/app/containers/UiElements/demos/Breadcrumbs/PaperBreadcrumbs.js
new file mode 100644
index 0000000..70effb0
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/Breadcrumbs/PaperBreadcrumbs.js
@@ -0,0 +1,97 @@
+import React, { Fragment, PureComponent } from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import { BreadCrumb } from 'ba-components';
+
+import { Typography, Grid, Paper } from '@material-ui/core';
+
+const styles = theme => ({
+ demo: {
+ height: 'auto',
+ },
+ divider: {
+ margin: `${theme.spacing(3)}px 0`,
+ },
+ alone: {
+ position: 'relative',
+ margin: 20
+ },
+ field: {
+ margin: '10px',
+ position: 'relative'
+ },
+ paper: {
+ padding: '5px 10px 1px',
+ borderRadius: 5
+ }
+});
+
+class ClassicBreadcrumbs extends PureComponent {
+ render() {
+ const { classes } = this.props;
+ const location = { pathname: '/grand-parent/parent/children' };
+ return (
+
+
+
+ Arrow Separator
+
+
+
+ Slash Separator
+
+
+
+ Greater Than Separator
+
+
+
+
+ );
+ }
+}
+
+ClassicBreadcrumbs.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(ClassicBreadcrumbs);
diff --git a/front/odiparpack/app/containers/UiElements/demos/Cards/ControlCards.js b/front/odiparpack/app/containers/UiElements/demos/Cards/ControlCards.js
new file mode 100644
index 0000000..1ddc92b
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/Cards/ControlCards.js
@@ -0,0 +1,204 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import classnames from 'classnames';
+import FavoriteIcon from '@material-ui/icons/Favorite';
+import ShareIcon from '@material-ui/icons/Share';
+import ExpandMoreIcon from '@material-ui/icons/ExpandMore';
+import MoreVertIcon from '@material-ui/icons/MoreVert';
+import imgApi from 'ba-api/images';
+import { PlayerCard, VideoCard } from 'ba-components';
+import { red } from '@material-ui/core/colors';
+
+import {
+ Typography,
+ Grid,
+ Card,
+ CardHeader,
+ CardMedia,
+ CardContent,
+ CardActions,
+ IconButton,
+ Collapse,
+ Avatar,
+} from '@material-ui/core';
+
+const styles = theme => ({
+ divider: {
+ display: 'block',
+ margin: `${theme.spacing(3)}px 0`,
+ },
+ card: {
+ display: 'flex',
+ justifyContent: 'space-between'
+ },
+ details: {
+ display: 'flex',
+ flexDirection: 'column',
+ },
+ content: {
+ flex: '1 0 auto',
+ },
+ cover: {
+ width: 150,
+ height: 150,
+ },
+ controls: {
+ display: 'flex',
+ alignItems: 'center',
+ paddingLeft: theme.spacing(1),
+ paddingBottom: theme.spacing(1),
+ },
+ playIcon: {
+ height: 38,
+ width: 38,
+ },
+ cardSocmed: {
+ maxWidth: 400,
+ },
+ media: {
+ height: 0,
+ paddingTop: '56.25%', // 16:9
+ },
+ actions: {
+ display: 'flex',
+ },
+ expand: {
+ transform: 'rotate(0deg)',
+ transition: theme.transitions.create('transform', {
+ duration: theme.transitions.duration.shortest,
+ }),
+ marginLeft: 'auto',
+ },
+ expandOpen: {
+ transform: 'rotate(180deg)',
+ },
+ avatar: {
+ backgroundColor: red[500],
+ },
+});
+
+class ControlCard extends React.Component {
+ state = { expanded: false };
+
+ handleExpandClick = () => {
+ this.setState({ expanded: !this.state.expanded });
+ };
+
+ render() {
+ const { classes } = this.props;
+
+ return (
+
+
+ UI Controls
+
+
+
+ Video Thumb
+
+
+
+ Complex Interaction
+
+
+
+ R
+
+ )}
+ action={(
+
+
+
+ )}
+ title="Shrimp and Chorizo Paella"
+ subheader="September 14, 2016"
+ />
+
+
+
+ This impressive paella is a perfect party dish and a fun meal to cook together with
+ your guests. Add 1 cup of frozen peas along with the mussels, if you like.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Method:
+
+
+ Heat 1/2 cup of the broth in a pot until simmering, add saffron and set aside for 10
+ minutes.
+
+
+ Heat oil in a (14- to 16-inch) paella pan or a large, deep skillet over medium-high
+ heat. Add chicken, shrimp and chorizo, and cook, stirring occasionally until lightly
+ browned, 6 to 8 minutes. Transfer shrimp to a large plate and set aside, leaving
+ chicken and chorizo in the pan. Add pimentón, bay leaves, garlic, tomatoes, onion,
+ salt and pepper, and cook, stirring often until thickened and fragrant, about 10
+ minutes. Add saffron broth and remaining 4 1/2 cups chicken broth; bring to a boil.
+
+
+ Add rice and stir very gently to distribute. Top with artichokes and peppers, and
+ cook without stirring, until most of the liquid is absorbed, 15 to 18 minutes.
+ Reduce heat to medium-low, add reserved shrimp and mussels, tucking them down into
+ the rice, and cook again without stirring, until mussels have opened and rice is
+ just tender, 5 to 7 minutes more. (Discard any mussels that don’t open.)
+
+
+ Set aside off of the heat to let rest for 10 minutes, and then serve.
+
+
+
+
+
+
+
+ );
+ }
+}
+
+ControlCard.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(ControlCard);
diff --git a/front/odiparpack/app/containers/UiElements/demos/Cards/EcommerceCards.js b/front/odiparpack/app/containers/UiElements/demos/Cards/EcommerceCards.js
new file mode 100644
index 0000000..6a5a275
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/Cards/EcommerceCards.js
@@ -0,0 +1,92 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import imgApi from 'ba-api/images';
+import { ProductCard } from 'ba-components';
+
+import { Typography, Grid } from '@material-ui/core';
+
+const styles = theme => ({
+ divider: {
+ display: 'block',
+ margin: `${theme.spacing(3)}px 0`,
+ },
+});
+
+class EcommerceCard extends React.Component {
+ render() {
+ const { classes } = this.props;
+ return (
+
+
+ Product Card
+
+
+
+ Product with discount
+
+
+
+ Sold Out Product
+
+
+
+ List Mode
+
+
+
+
+
+
+ );
+ }
+}
+
+EcommerceCard.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(EcommerceCard);
diff --git a/front/odiparpack/app/containers/UiElements/demos/Cards/PaperSheet.js b/front/odiparpack/app/containers/UiElements/demos/Cards/PaperSheet.js
new file mode 100644
index 0000000..2867e38
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/Cards/PaperSheet.js
@@ -0,0 +1,34 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import { Paper, Typography } from '@material-ui/core';
+
+const styles = theme => ({
+ root: theme.mixins.gutters({
+ paddingTop: 16,
+ paddingBottom: 16,
+ marginTop: theme.spacing(3),
+ }),
+});
+
+function PaperSheet(props) {
+ const { classes } = props;
+ return (
+
+
+
+ This is a sheet of paper.
+
+
+ Paper can be used to build surface or other elements for your application.
+
+
+
+ );
+}
+
+PaperSheet.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(PaperSheet);
diff --git a/front/odiparpack/app/containers/UiElements/demos/Cards/SocialCards.js b/front/odiparpack/app/containers/UiElements/demos/Cards/SocialCards.js
new file mode 100644
index 0000000..7208926
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/Cards/SocialCards.js
@@ -0,0 +1,75 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import imgApi from 'ba-api/images';
+import avatarApi from 'ba-api/avatars';
+import { ProfileCard, PostCard } from 'ba-components';
+
+import { Typography, Grid } from '@material-ui/core';
+
+const styles = theme => ({
+ divider: {
+ display: 'block',
+ margin: `${theme.spacing(3)}px 0`,
+ },
+});
+
+class StandardCard extends React.Component {
+ render() {
+ const { classes } = this.props;
+
+ return (
+
+
+ Profile Card
+
+
+
+ Post Card
+
+
+
+ Post Card (Without Image)
+
+
+
+ );
+ }
+}
+
+StandardCard.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(StandardCard);
diff --git a/front/odiparpack/app/containers/UiElements/demos/Cards/StandardCards.js b/front/odiparpack/app/containers/UiElements/demos/Cards/StandardCards.js
new file mode 100644
index 0000000..37fdf39
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/Cards/StandardCards.js
@@ -0,0 +1,120 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import dummy from 'ba-api/dummyContents';
+import imgApi from 'ba-api/images';
+import { GeneralCard, NewsCard, Quote, IdentityCard } from 'ba-components';
+
+import { Typography, Grid } from '@material-ui/core';
+
+const styles = theme => ({
+ divider: {
+ display: 'block',
+ margin: `${theme.spacing(3)}px 0`,
+ },
+ card: {
+ minWidth: 275,
+ },
+ bullet: {
+ display: 'inline-block',
+ margin: '0 2px',
+ transform: 'scale(0.8)',
+ },
+ title: {
+ marginBottom: 16,
+ fontSize: 14,
+ },
+ pos: {
+ marginBottom: 12,
+ },
+ cardMedia: {
+ maxWidth: 345,
+ },
+ media: {
+ height: 0,
+ paddingTop: '56.25%', // 16:9
+ },
+});
+
+class StandardCard extends React.Component {
+ render() {
+ const { classes } = this.props;
+ const bull = • ;
+
+ return (
+
+
+ Simple Card
+
+
+
+ Word of the Day
+
+
+ be
+ {bull}
+nev
+ {bull}
+o
+ {bull}
+lent
+
+
+ adjective
+
+
+ well meaning and kindly.
+
+ {'"a benevolent smile"'}
+
+
+
+ Media
+
+
+
+ Lorem ipsum
+
+
+ Aliquam venenatis magna et odio lobortis maximus. Nullam in tortor ligula. Proin maximus risus nunc
+
+
+
+
+
+ Quoted Card
+
+
+
+
+
+
+ Identity Card
+
+
+
+
+ );
+ }
+}
+
+StandardCard.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(StandardCard);
diff --git a/front/odiparpack/app/containers/UiElements/demos/DialogModal/AlertDialog.js b/front/odiparpack/app/containers/UiElements/demos/DialogModal/AlertDialog.js
new file mode 100644
index 0000000..68f099a
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/DialogModal/AlertDialog.js
@@ -0,0 +1,127 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+
+import {
+ Button,
+ Dialog,
+ DialogActions,
+ DialogContent,
+ DialogContentText,
+ DialogTitle,
+ Grid,
+ Typography,
+ Slide,
+} from '@material-ui/core';
+
+const styles = theme => ({
+ title: {
+ display: 'block',
+ margin: `${theme.spacing(4)}px 0 ${theme.spacing(2)}px`,
+ },
+});
+
+const Transition = React.forwardRef(function Transition(props, ref) { // eslint-disable-line
+ return ;
+});
+
+class AlertDialog extends React.Component { // eslint-disable-line
+ state = {
+ open: false,
+ openSlide: false,
+ };
+
+ handleClickOpen = () => {
+ this.setState({ open: true });
+ };
+
+ handleClose = () => {
+ this.setState({ open: false });
+ };
+
+ handleClickOpenSlide = () => {
+ this.setState({ openSlide: true });
+ };
+
+ handleCloseSlide = () => {
+ this.setState({ openSlide: false });
+ };
+
+ render() {
+ const { classes } = this.props;
+ return (
+
+
+
+
+ Fade Transition
+
+ Open alert dialog
+
+
+ {"Use Google's location service?"}
+
+
+
+ Let Google help apps determine location. This means sending anonymous location data to
+ Google, even when no apps are running.
+
+
+
+
+ Disagree
+
+
+ Agree
+
+
+
+
+
+
+ Slide Transition
+
+ Slide in alert dialog
+
+
+ {"Use Google's location service?"}
+
+
+
+ Let Google help apps determine location. This means sending anonymous location data to
+ Google, even when no apps are running.
+
+
+
+
+ Disagree
+
+
+ Agree
+
+
+
+
+
+
+ );
+ }
+}
+
+AlertDialog.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(AlertDialog);
diff --git a/front/odiparpack/app/containers/UiElements/demos/DialogModal/ConfirmationDialog.js b/front/odiparpack/app/containers/UiElements/demos/DialogModal/ConfirmationDialog.js
new file mode 100644
index 0000000..1f49788
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/DialogModal/ConfirmationDialog.js
@@ -0,0 +1,111 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+
+import {
+ Button,
+ DialogTitle,
+ DialogContent,
+ DialogActions,
+ Dialog,
+ Radio,
+ RadioGroup,
+ FormControlLabel,
+} from '@material-ui/core';
+
+const options = [
+ 'None',
+ 'Atria',
+ 'Callisto',
+ 'Dione',
+ 'Ganymede',
+ 'Hangouts Call',
+ 'Luna',
+ 'Oberon',
+ 'Phobos',
+ 'Pyxis',
+ 'Sedna',
+ 'Titania',
+ 'Triton',
+ 'Umbriel',
+];
+
+class ConfirmationDialog extends React.Component {
+ constructor(props, context) {
+ super(props, context);
+
+ this.state.value = this.props.value;
+ }
+
+ state = {};
+
+ componentWillReceiveProps(nextProps) {
+ if (nextProps.value !== this.props.value) {
+ this.setState({ value: nextProps.value });
+ }
+ }
+
+ radioGroup = null;
+
+ handleEntering = () => {
+ this.radioGroup.focus();
+ };
+
+ handleCancel = () => {
+ this.props.onClose(this.props.value);
+ };
+
+ handleOk = () => {
+ this.props.onClose(this.state.value);
+ };
+
+ handleChange = (event, value) => {
+ this.setState({ value });
+ };
+
+ render() {
+ const { value, ...other } = this.props;
+
+ return (
+
+ Phone Ringtone
+
+ {
+ this.radioGroup = node;
+ }}
+ aria-label="ringtone"
+ name="ringtone"
+ value={this.state.value}
+ onChange={this.handleChange}
+ >
+ {options.map(option => (
+ } label={option} />
+ ))}
+
+
+
+
+ Cancel
+
+
+ Ok
+
+
+
+ );
+ }
+}
+
+ConfirmationDialog.propTypes = {
+ onClose: PropTypes.func.isRequired,
+ value: PropTypes.string.isRequired,
+};
+
+export default ConfirmationDialog;
diff --git a/front/odiparpack/app/containers/UiElements/demos/DialogModal/FormDialog.js b/front/odiparpack/app/containers/UiElements/demos/DialogModal/FormDialog.js
new file mode 100644
index 0000000..58bf1aa
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/DialogModal/FormDialog.js
@@ -0,0 +1,65 @@
+import React from 'react';
+
+import {
+ Button,
+ TextField,
+ Grid,
+ Dialog,
+ DialogActions,
+ DialogContent,
+ DialogContentText,
+ DialogTitle,
+} from '@material-ui/core';
+
+export default class FormDialog extends React.Component {
+ state = {
+ open: false,
+ };
+
+ handleClickOpen = () => {
+ this.setState({ open: true });
+ };
+
+ handleClose = () => {
+ this.setState({ open: false });
+ };
+
+ render() {
+ return (
+
+
+ Open form dialog
+
+ Subscribe
+
+
+ To subscribe to this website, please enter your email address here. We will send
+ updates occasionally.
+
+
+
+
+
+ Cancel
+
+
+ Subscribe
+
+
+
+
+
+ );
+ }
+}
diff --git a/front/odiparpack/app/containers/UiElements/demos/DialogModal/FullScreenDialog.js b/front/odiparpack/app/containers/UiElements/demos/DialogModal/FullScreenDialog.js
new file mode 100644
index 0000000..935ed4d
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/DialogModal/FullScreenDialog.js
@@ -0,0 +1,134 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import CloseIcon from '@material-ui/icons/Close';
+
+import {
+ Button,
+ Dialog,
+ DialogActions,
+ DialogContent,
+ DialogContentText,
+ DialogTitle,
+ List,
+ ListItem,
+ ListItemText,
+ Divider,
+ Grid,
+ AppBar,
+ Toolbar,
+ IconButton,
+ Typography,
+ Slide,
+} from '@material-ui/core';
+
+const styles = {
+ appBar: {
+ position: 'relative',
+ },
+ flex: {
+ flex: 1,
+ },
+};
+
+const Transition = React.forwardRef(function Transition(props, ref) { // eslint-disable-line
+ return ;
+});
+
+class FullScreenDialog extends React.Component { // eslint-disable-line
+ state = {
+ open: false,
+ open2: false,
+ };
+
+ handleClickOpen = () => {
+ this.setState({ open: true });
+ };
+
+ handleClose = () => {
+ this.setState({ open: false });
+ };
+
+ handleClickOpen2 = () => {
+ this.setState({ open2: true });
+ };
+
+ handleClose2 = () => {
+ this.setState({ open2: false });
+ };
+
+ render() {
+ const { classes } = this.props;
+ return (
+
+
+
+ Open full-screen dialog
+
+
+
+
+
+
+
+ Sound
+
+
+ save
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Open responsive dialog
+
+
+ {'Use location service?'}
+
+
+
+ Let Google help apps determine location. This means sending anonymous location data to
+ Google, even when no apps are running.
+
+
+
+
+ Disagree
+
+
+ Agree
+
+
+
+
+
+
+ );
+ }
+}
+
+FullScreenDialog.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(FullScreenDialog);
diff --git a/front/odiparpack/app/containers/UiElements/demos/DialogModal/ImagePopup.js b/front/odiparpack/app/containers/UiElements/demos/DialogModal/ImagePopup.js
new file mode 100644
index 0000000..169c5ec
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/DialogModal/ImagePopup.js
@@ -0,0 +1,51 @@
+import React, { Component } from 'react';
+import 'ba-styles/vendors/image-lightbox/image-lightbox.css';
+import images from 'ba-api/imgData';
+import { ImageLightbox } from 'ba-components';
+
+import { Button, Grid } from '@material-ui/core';
+
+export default class ImagePopup extends Component {
+ constructor(props) {
+ super(props);
+
+ this.state = {
+ photoIndex: 0,
+ isOpen: false,
+ };
+ }
+
+ render() {
+ const { photoIndex, isOpen } = this.state;
+
+ return (
+
+ this.setState({ isOpen: true })}>
+ Open Image Lightbox
+
+
+ {isOpen && (
+ this.setState({ isOpen: false })}
+ onMovePrevRequest={() => this.setState({
+ photoIndex: (photoIndex + (images.length - 1)) % images.length,
+ })
+ }
+ onMoveNextRequest={() => this.setState({
+ photoIndex: (photoIndex + 1) % images.length,
+ })
+ }
+ />
+ )}
+
+ );
+ }
+}
diff --git a/front/odiparpack/app/containers/UiElements/demos/DialogModal/ModalDemo.js b/front/odiparpack/app/containers/UiElements/demos/DialogModal/ModalDemo.js
new file mode 100644
index 0000000..c18a5e1
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/DialogModal/ModalDemo.js
@@ -0,0 +1,73 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import { Typography, Modal, Button, Grid } from '@material-ui/core';
+
+function getModalStyle() {
+ return {
+ top: '50%',
+ left: '50%',
+ transform: 'translate(-50%, -50%)',
+ };
+}
+
+const styles = theme => ({
+ paper: {
+ position: 'absolute',
+ width: theme.spacing(50),
+ backgroundColor: theme.palette.background.paper,
+ boxShadow: theme.shadows[5],
+ padding: theme.spacing(4),
+ },
+});
+
+class ModalDemo extends React.Component {
+ state = {
+ open: false,
+ };
+
+ handleOpen = () => {
+ this.setState({ open: true });
+ };
+
+ handleClose = () => {
+ this.setState({ open: false });
+ };
+
+ render() {
+ const { classes } = this.props;
+
+ return (
+
+ Click to get the full Modal experience!
+ Open Modal
+
+
+
+ Text in a modal
+
+
+ Duis mollis, est non commodo luctus, nisi erat porttitor ligula.
+
+
+
+
+ );
+ }
+}
+
+ModalDemo.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(ModalDemo);
diff --git a/front/odiparpack/app/containers/UiElements/demos/DialogModal/ScrollDialog.js b/front/odiparpack/app/containers/UiElements/demos/DialogModal/ScrollDialog.js
new file mode 100644
index 0000000..b7f2b74
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/DialogModal/ScrollDialog.js
@@ -0,0 +1,93 @@
+import React from 'react';
+
+import {
+ Button,
+ Dialog,
+ DialogActions,
+ DialogContent,
+ DialogContentText,
+ DialogTitle,
+} from '@material-ui/core';
+
+class ScrollDialog extends React.Component {
+ state = {
+ open: false,
+ scroll: 'paper',
+ };
+
+ handleClickOpen = scroll => () => {
+ this.setState({ open: true, scroll });
+ };
+
+ handleClose = () => {
+ this.setState({ open: false });
+ };
+
+ render() {
+ return (
+
+ scroll=paper
+
+ scroll=body
+
+ Subscribe
+
+
+ Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac
+ facilisis in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum
+ at eros. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus
+ sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Aenean lacinia bibendum
+ nulla sed consectetur. Praesent commodo cursus magna, vel scelerisque nisl consectetur
+ et. Donec sed odio dui. Donec ullamcorper nulla non metus auctor fringilla. Cras
+ mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in,
+ egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
+ Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis
+ lacus vel augue laoreet rutrum faucibus dolor auctor. Aenean lacinia bibendum nulla
+ sed consectetur. Praesent commodo cursus magna, vel scelerisque nisl consectetur et.
+ Donec sed odio dui. Donec ullamcorper nulla non metus auctor fringilla. Cras mattis
+ consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in,
+ egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
+ Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis
+ lacus vel augue laoreet rutrum faucibus dolor auctor. Aenean lacinia bibendum nulla
+ sed consectetur. Praesent commodo cursus magna, vel scelerisque nisl consectetur et.
+ Donec sed odio dui. Donec ullamcorper nulla non metus auctor fringilla. Cras mattis
+ consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in,
+ egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
+ Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis
+ lacus vel augue laoreet rutrum faucibus dolor auctor. Aenean lacinia bibendum nulla
+ sed consectetur. Praesent commodo cursus magna, vel scelerisque nisl consectetur et.
+ Donec sed odio dui. Donec ullamcorper nulla non metus auctor fringilla. Cras mattis
+ consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in,
+ egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
+ Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis
+ lacus vel augue laoreet rutrum faucibus dolor auctor. Aenean lacinia bibendum nulla
+ sed consectetur. Praesent commodo cursus magna, vel scelerisque nisl consectetur et.
+ Donec sed odio dui. Donec ullamcorper nulla non metus auctor fringilla. Cras mattis
+ consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in,
+ egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
+ Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis
+ lacus vel augue laoreet rutrum faucibus dolor auctor. Aenean lacinia bibendum nulla
+ sed consectetur. Praesent commodo cursus magna, vel scelerisque nisl consectetur et.
+ Donec sed odio dui. Donec ullamcorper nulla non metus auctor fringilla.
+
+
+
+
+ Cancel
+
+
+ Subscribe
+
+
+
+
+ );
+ }
+}
+
+export default ScrollDialog;
diff --git a/front/odiparpack/app/containers/UiElements/demos/DialogModal/SelectDialog.js b/front/odiparpack/app/containers/UiElements/demos/DialogModal/SelectDialog.js
new file mode 100644
index 0000000..f75b1be
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/DialogModal/SelectDialog.js
@@ -0,0 +1,120 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import PersonIcon from '@material-ui/icons/Person';
+import AddIcon from '@material-ui/icons/Add';
+import { blue } from '@material-ui/core/colors';
+
+import {
+ Button,
+ Avatar,
+ List,
+ ListItem,
+ ListItemText,
+ ListItemAvatar,
+ Dialog,
+ DialogTitle,
+ Typography,
+ Grid,
+} from '@material-ui/core';
+
+const emails = ['username@mail.com', 'user02@mail.com'];
+const styles = ({
+ avatar: {
+ backgroundColor: blue[100],
+ color: blue[600],
+ },
+});
+
+const SimpleDialog = props => {
+ const {
+ classes,
+ onClose,
+ selectedValue,
+ ...other
+ } = props;
+
+ function handleClose() {
+ props.onClose(this.props.selectedValue);
+ }
+
+ function handleListItemClick(value) {
+ props.onClose(value);
+ }
+
+ return (
+ handleClose()} aria-labelledby="simple-dialog-title" {...other}>
+ Set backup account
+
+
+ {emails.map(email => (
+ handleListItemClick(email)} key={email}>
+
+
+
+
+
+
+
+ ))}
+ handleListItemClick('addAccount')}>
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+SimpleDialog.propTypes = {
+ classes: PropTypes.object.isRequired,
+ onClose: PropTypes.func.isRequired,
+ selectedValue: PropTypes.string.isRequired,
+};
+
+const SimpleDialogWrapped = withStyles(styles)(SimpleDialog);
+
+class SelectDialog extends React.Component {
+ state = {
+ open: false,
+ selectedValue: emails[1],
+ };
+
+ handleClickOpen = () => {
+ this.setState({
+ open: true,
+ });
+ };
+
+ handleClose = value => {
+ this.setState({ selectedValue: value, open: false });
+ };
+
+ render() {
+ return (
+
+
+
+Selected:
+ {this.state.selectedValue}
+
+
+ Open simple dialog
+
+
+
+ );
+ }
+}
+
+
+export default SelectDialog;
diff --git a/front/odiparpack/app/containers/UiElements/demos/DialogModal/SelectRadioDialog.js b/front/odiparpack/app/containers/UiElements/demos/DialogModal/SelectRadioDialog.js
new file mode 100644
index 0000000..ff30bd4
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/DialogModal/SelectRadioDialog.js
@@ -0,0 +1,68 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import { List, ListItem, ListItemText } from '@material-ui/core';
+import ConfirmationDialog from './ConfirmationDialog';
+
+
+const styles = theme => ({
+ root: {
+ width: '100%',
+ maxWidth: 360,
+ backgroundColor: theme.palette.background.paper,
+ },
+ dialog: {
+ width: '80%',
+ maxHeight: 435,
+ },
+});
+
+class SelectRadioDialog extends React.Component {
+ state = {
+ open: false,
+ value: 'Dione',
+ };
+
+ button = undefined;
+
+ handleClickListItem = () => {
+ this.setState({ open: true });
+ };
+
+ handleClose = value => {
+ this.setState({ value, open: false });
+ };
+
+ render() {
+ const { classes } = this.props;
+ return (
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+SelectRadioDialog.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(SelectRadioDialog);
diff --git a/front/odiparpack/app/containers/UiElements/demos/Dividers/CommonDividers.js b/front/odiparpack/app/containers/UiElements/demos/Dividers/CommonDividers.js
new file mode 100644
index 0000000..db67c0f
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/Dividers/CommonDividers.js
@@ -0,0 +1,29 @@
+import React, { Fragment, PureComponent } from 'react';
+import Type from 'ba-styles/Typography.scss';
+import {
+ GradientDivider,
+ DashDivider,
+ ShadowDivider,
+ InsetDivider,
+} from 'ba-components/Divider';
+
+import { Typography } from '@material-ui/core';
+
+class CommonDivider extends PureComponent {
+ render() {
+ return (
+
+ Gradient Divider
+
+ Dash Divider
+
+ Shadow Divider
+
+ Inset Divider
+
+
+ );
+ }
+}
+
+export default CommonDivider;
diff --git a/front/odiparpack/app/containers/UiElements/demos/Dividers/SpecialDividers.js b/front/odiparpack/app/containers/UiElements/demos/Dividers/SpecialDividers.js
new file mode 100644
index 0000000..d857e06
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/Dividers/SpecialDividers.js
@@ -0,0 +1,23 @@
+import React, { Fragment, PureComponent } from 'react';
+import Type from 'ba-styles/Typography.scss';
+import {
+ FlairedEdgesDivider,
+ ContentDivider,
+} from 'ba-components/Divider';
+
+import { Typography } from '@material-ui/core';
+
+class CommonDivider extends PureComponent {
+ render() {
+ return (
+
+ Flaired Edges Divider
+
+ Content Text Divider
+
+
+ );
+ }
+}
+
+export default CommonDivider;
diff --git a/front/odiparpack/app/containers/UiElements/demos/DrawerMenu/BasicMenu.js b/front/odiparpack/app/containers/UiElements/demos/DrawerMenu/BasicMenu.js
new file mode 100644
index 0000000..24039db
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/DrawerMenu/BasicMenu.js
@@ -0,0 +1,74 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+
+import { Button, Menu, MenuItem, MenuList, Grid, Paper } from '@material-ui/core';
+
+const styles = theme => ({
+ root: {
+ display: 'flex',
+ },
+ paper: {
+ marginRight: theme.spacing(2),
+ },
+ popperClose: {
+ pointerEvents: 'none',
+ },
+});
+
+class BasicMenu extends React.Component {
+ state = {
+ anchorEl: null,
+ };
+
+ handleClick = event => {
+ this.setState({ anchorEl: event.currentTarget });
+ };
+
+ handleClose = () => {
+ this.setState({ anchorEl: null });
+ };
+
+ render() {
+ const { anchorEl } = this.state;
+ const { classes } = this.props;
+ return (
+
+
+
+
+ Profile
+ My account
+ Logout
+
+
+
+
+
+ Open Menu
+
+
+
+
+ );
+ }
+}
+
+BasicMenu.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(BasicMenu);
diff --git a/front/odiparpack/app/containers/UiElements/demos/DrawerMenu/DropdownMenu.js b/front/odiparpack/app/containers/UiElements/demos/DrawerMenu/DropdownMenu.js
new file mode 100644
index 0000000..0e5bce7
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/DrawerMenu/DropdownMenu.js
@@ -0,0 +1,148 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import MoreVertIcon from '@material-ui/icons/MoreVert';
+
+import { IconButton, List, ListItem, ListItemText, Menu, MenuItem, Grid } from '@material-ui/core';
+
+const styles = {
+ root: {
+ width: '100%',
+ },
+};
+
+const options = [
+ 'Show some love to Material-UI',
+ 'Show all notification content',
+ 'Hide sensitive notification content',
+ 'Hide all notification content',
+];
+
+const optionsOpt = [
+ 'None',
+ 'Atria',
+ 'Callisto',
+ 'Dione',
+ 'Ganymede',
+ 'Hangouts Call',
+ 'Luna',
+ 'Oberon',
+ 'Phobos',
+ 'Pyxis',
+ 'Sedna',
+ 'Titania',
+ 'Triton',
+ 'Umbriel',
+];
+
+const ITEM_HEIGHT = 48;
+
+class DropdownMenu extends React.Component {
+ state = {
+ anchorEl: null,
+ anchorElOpt: null,
+ selectedIndex: 1,
+ };
+
+ button = undefined;
+
+ handleClickListItem = event => {
+ this.setState({ anchorEl: event.currentTarget });
+ };
+
+ handleMenuItemClick = (event, index) => {
+ this.setState({ selectedIndex: index, anchorEl: null });
+ };
+
+ handleClose = () => {
+ this.setState({ anchorEl: null });
+ };
+
+ handleClickOpt = event => {
+ this.setState({ anchorElOpt: event.currentTarget });
+ };
+
+ handleCloseOpt = () => {
+ this.setState({ anchorElOpt: null });
+ };
+
+
+ render() {
+ const { classes } = this.props;
+ const { anchorEl, anchorElOpt } = this.state;
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+DropdownMenu.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(DropdownMenu);
diff --git a/front/odiparpack/app/containers/UiElements/demos/DrawerMenu/MenuTransition.js b/front/odiparpack/app/containers/UiElements/demos/DrawerMenu/MenuTransition.js
new file mode 100644
index 0000000..e8cfbc6
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/DrawerMenu/MenuTransition.js
@@ -0,0 +1,108 @@
+import React from 'react';
+import Button from '@material-ui/core/Button';
+import Menu from '@material-ui/core/Menu';
+import MenuItem from '@material-ui/core/MenuItem';
+import Grow from '@material-ui/core/Grow';
+import Fade from '@material-ui/core/Fade';
+import Zoom from '@material-ui/core/Zoom';
+import Grid from '@material-ui/core/Grid';
+
+
+class MenuTransition extends React.Component {
+ state = {
+ anchorFade: null,
+ anchorGrow: null,
+ anchorCollapse: null,
+ anchorZoom: null,
+ };
+
+ handleClick = (event, type) => {
+ this.setState({ [type]: event.currentTarget });
+ };
+
+ handleClose = type => {
+ this.setState({ [type]: null });
+ };
+
+ handleToggle = type => {
+ // eslint-disable-next-line
+ this.setState({ [type]: !this.state[type] });
+ };
+
+ render() {
+ const {
+ anchorFade,
+ anchorGrow,
+ anchorZoom
+ } = this.state;
+
+ return (
+
+
+ this.handleClick(e, 'anchorFade')}
+ >
+ Open with fade transition
+
+
+
+
+ this.handleClick(e, 'anchorGrow')}
+ >
+ Open with grow transition
+
+
+
+
+
+ this.handleClick(e, 'anchorZoom')}
+ >
+ Open with zoom transition
+
+
+
+
+
+ );
+ }
+}
+
+export default MenuTransition;
diff --git a/front/odiparpack/app/containers/UiElements/demos/DrawerMenu/MiniDrawer.js b/front/odiparpack/app/containers/UiElements/demos/DrawerMenu/MiniDrawer.js
new file mode 100644
index 0000000..4a07e14
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/DrawerMenu/MiniDrawer.js
@@ -0,0 +1,235 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import classNames from 'classnames';
+import MenuIcon from '@material-ui/icons/Menu';
+import ChevronLeftIcon from '@material-ui/icons/ChevronLeft';
+import ChevronRightIcon from '@material-ui/icons/ChevronRight';
+import {
+ Drawer,
+ AppBar,
+ Toolbar,
+ List,
+ Typography,
+ MenuItem,
+ Divider,
+ TextField,
+ IconButton,
+} from '@material-ui/core';
+import { mailFolderListItems, otherMailFolderListItems } from './menuData';
+
+
+const drawerWidth = 240;
+
+const styles = theme => ({
+ root: {
+ flexGrow: 1,
+ },
+ appFrame: {
+ height: 430,
+ zIndex: 1,
+ overflow: 'hidden',
+ position: 'relative',
+ display: 'flex',
+ width: '100%',
+ },
+ appBar: {
+ zIndex: theme.zIndex.drawer + 1,
+ padding: '0 24px',
+ transition: theme.transitions.create(['width', 'margin'], {
+ easing: theme.transitions.easing.sharp,
+ duration: theme.transitions.duration.leavingScreen,
+ }),
+ },
+ appBarShift: {
+ marginLeft: drawerWidth,
+ width: `calc(100% - ${drawerWidth}px)`,
+ transition: theme.transitions.create(['width', 'margin'], {
+ easing: theme.transitions.easing.sharp,
+ duration: theme.transitions.duration.enteringScreen,
+ }),
+ },
+ 'appBarShift-left': {
+ marginLeft: drawerWidth,
+ },
+ 'appBarShift-right': {
+ marginRight: drawerWidth,
+ },
+ menuButton: {
+ marginLeft: 3,
+ marginRight: 3,
+ },
+ hide: {
+ display: 'none',
+ },
+ drawerPaper: {
+ position: 'relative',
+ whiteSpace: 'nowrap',
+ width: drawerWidth,
+ transition: theme.transitions.create('width', {
+ easing: theme.transitions.easing.sharp,
+ duration: theme.transitions.duration.enteringScreen,
+ }),
+ },
+ drawerPaperClose: {
+ overflowX: 'hidden',
+ transition: theme.transitions.create('width', {
+ easing: theme.transitions.easing.sharp,
+ duration: theme.transitions.duration.leavingScreen,
+ }),
+ width: theme.spacing(7),
+ [theme.breakpoints.up('sm')]: {
+ width: theme.spacing(9),
+ },
+ },
+ toolbar: {
+ display: 'flex',
+ alignItems: 'center',
+ justifyContent: 'flex-end',
+ padding: '0 8px',
+ ...theme.mixins.toolbar,
+ },
+ content: {
+ flexGrow: 1,
+ backgroundColor: theme.palette.background.default,
+ padding: theme.spacing(3),
+ },
+ 'content-left': {
+ marginLeft: -drawerWidth,
+ },
+ 'content-right': {
+ marginRight: -drawerWidth,
+ },
+ contentShift: {
+ transition: theme.transitions.create('margin', {
+ easing: theme.transitions.easing.easeOut,
+ duration: theme.transitions.duration.enteringScreen,
+ }),
+ },
+ 'contentShift-left': {
+ marginLeft: 0,
+ },
+ 'contentShift-right': {
+ marginRight: 0,
+ },
+ title: {
+ flex: 1,
+ }
+});
+
+class MiniDrawer extends React.Component {
+ state = {
+ open: false,
+ anchor: 'left',
+ };
+
+ handleDrawerOpen = () => {
+ this.setState({ open: true });
+ };
+
+ handleDrawerClose = () => {
+ this.setState({ open: false });
+ };
+
+ handleChangeAnchor = event => {
+ this.setState({
+ anchor: event.target.value,
+ });
+ };
+
+ render() {
+ const { classes, theme } = this.props;
+ const { anchor, open } = this.state;
+ const drawer = (
+
+
+
+ {theme.direction === 'rtl' ? : }
+
+
+
+ {mailFolderListItems}
+
+ {otherMailFolderListItems}
+
+ );
+
+ const menuBtn = (
+
+
+
+ );
+
+ let before = null;
+ let after = null;
+ let beforeBtn = null;
+ let afterBtn = null;
+
+ if (anchor === 'left') {
+ before = drawer;
+ beforeBtn = menuBtn;
+ } else {
+ after = drawer;
+ afterBtn = menuBtn;
+ }
+
+ return (
+
+
+ left
+ right
+
+
+
+
+ {beforeBtn}
+
+ Mini variant drawer
+
+ {afterBtn}
+
+
+ {before}
+
+
+
+ {'You think water moves fast? You should see ice.'}
+
+
+ {after}
+
+
+ );
+ }
+}
+
+MiniDrawer.propTypes = {
+ classes: PropTypes.object.isRequired,
+ theme: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles, { withTheme: true })(MiniDrawer);
diff --git a/front/odiparpack/app/containers/UiElements/demos/DrawerMenu/PermanentDrawer.js b/front/odiparpack/app/containers/UiElements/demos/DrawerMenu/PermanentDrawer.js
new file mode 100644
index 0000000..9538873
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/DrawerMenu/PermanentDrawer.js
@@ -0,0 +1,126 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import classNames from 'classnames';
+import { withStyles } from '@material-ui/core/styles';
+import { Drawer, AppBar, Toolbar, List, MenuItem, TextField, Typography, Divider } from '@material-ui/core';
+import { mailFolderListItems, otherMailFolderListItems } from './menuData';
+
+
+const drawerWidth = 240;
+
+const styles = theme => ({
+ root: {
+ flexGrow: 1,
+ },
+ appFrame: {
+ height: 430,
+ zIndex: 1,
+ overflow: 'hidden',
+ position: 'relative',
+ display: 'flex',
+ width: '100%',
+ },
+ appBar: {
+ width: `calc(100% - ${drawerWidth}px)`,
+ },
+ 'appBar-left': {
+ marginLeft: drawerWidth,
+ },
+ 'appBar-right': {
+ marginRight: drawerWidth,
+ },
+ drawerPaper: {
+ position: 'relative',
+ width: drawerWidth,
+ },
+ toolbar: theme.mixins.toolbar,
+ content: {
+ flexGrow: 1,
+ backgroundColor: theme.palette.background.default,
+ padding: theme.spacing(3),
+ },
+});
+
+class PermanentDrawer extends React.Component {
+ state = {
+ anchor: 'left',
+ };
+
+ handleChange = event => {
+ this.setState({
+ anchor: event.target.value,
+ });
+ };
+
+ render() {
+ const { classes } = this.props;
+ const { anchor } = this.state;
+
+ const drawer = (
+
+
+
+ {mailFolderListItems}
+
+ {otherMailFolderListItems}
+
+ );
+
+ let before = null;
+ let after = null;
+
+ if (anchor === 'left') {
+ before = drawer;
+ } else {
+ after = drawer;
+ }
+
+ return (
+
+
+ left
+ right
+
+
+
+
+
+ Permanent drawer
+
+
+
+ {before}
+
+
+
+ {'You think water moves fast? You should see ice.'}
+
+
+ {after}
+
+
+ );
+ }
+}
+
+PermanentDrawer.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(PermanentDrawer);
diff --git a/front/odiparpack/app/containers/UiElements/demos/DrawerMenu/PersistentDrawer.js b/front/odiparpack/app/containers/UiElements/demos/DrawerMenu/PersistentDrawer.js
new file mode 100644
index 0000000..cd529d5
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/DrawerMenu/PersistentDrawer.js
@@ -0,0 +1,228 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import classNames from 'classnames';
+import MenuIcon from '@material-ui/icons/Menu';
+import ChevronLeftIcon from '@material-ui/icons/ChevronLeft';
+import ChevronRightIcon from '@material-ui/icons/ChevronRight';
+import {
+ Drawer,
+ AppBar,
+ Toolbar,
+ List,
+ MenuItem,
+ Typography,
+ TextField,
+ Divider,
+ IconButton,
+} from '@material-ui/core';
+import { mailFolderListItems, otherMailFolderListItems } from './menuData';
+
+
+const drawerWidth = 240;
+
+const styles = theme => ({
+ root: {
+ flexGrow: 1,
+ },
+ appFrame: {
+ height: 430,
+ zIndex: 1,
+ overflow: 'hidden',
+ position: 'relative',
+ display: 'flex',
+ width: '100%',
+ },
+ appBar: {
+ position: 'absolute',
+ padding: '0 24px',
+ transition: theme.transitions.create(['margin', 'width'], {
+ easing: theme.transitions.easing.sharp,
+ duration: theme.transitions.duration.leavingScreen,
+ }),
+ },
+ appBarShift: {
+ width: `calc(100% - ${drawerWidth}px)`,
+ transition: theme.transitions.create(['margin', 'width'], {
+ easing: theme.transitions.easing.easeOut,
+ duration: theme.transitions.duration.enteringScreen,
+ }),
+ },
+ 'appBarShift-left': {
+ marginLeft: drawerWidth,
+ },
+ 'appBarShift-right': {
+ marginRight: drawerWidth,
+ },
+ menuButton: {
+ marginLeft: 3,
+ marginRight: 3,
+ },
+ hide: {
+ display: 'none',
+ },
+ drawerPaper: {
+ position: 'relative',
+ width: drawerWidth,
+ },
+ drawerHeader: {
+ display: 'flex',
+ alignItems: 'center',
+ justifyContent: 'flex-end',
+ padding: '0 8px',
+ ...theme.mixins.toolbar,
+ },
+ content: {
+ flexGrow: 1,
+ backgroundColor: theme.palette.background.default,
+ padding: theme.spacing(3),
+ transition: theme.transitions.create('margin', {
+ easing: theme.transitions.easing.sharp,
+ duration: theme.transitions.duration.leavingScreen,
+ }),
+ },
+ 'content-left': {
+ marginLeft: -drawerWidth,
+ },
+ 'content-right': {
+ marginRight: -drawerWidth,
+ },
+ contentShift: {
+ transition: theme.transitions.create('margin', {
+ easing: theme.transitions.easing.easeOut,
+ duration: theme.transitions.duration.enteringScreen,
+ }),
+ },
+ 'contentShift-left': {
+ marginLeft: 0,
+ },
+ 'contentShift-right': {
+ marginRight: 0,
+ },
+ title: {
+ flex: 1,
+ }
+});
+
+class PersistentDrawer extends React.Component {
+ state = {
+ open: false,
+ anchor: 'left',
+ };
+
+ handleDrawerOpen = () => {
+ this.setState({ open: true });
+ };
+
+ handleDrawerClose = () => {
+ this.setState({ open: false });
+ };
+
+ handleChangeAnchor = event => {
+ this.setState({
+ anchor: event.target.value,
+ });
+ };
+
+ render() {
+ const { classes, theme } = this.props;
+ const { anchor, open } = this.state;
+
+ const drawer = (
+
+
+
+ {theme.direction === 'rtl' ? : }
+
+
+
+ {mailFolderListItems}
+
+ {otherMailFolderListItems}
+
+ );
+
+ const menuBtn = (
+
+
+
+ );
+
+ let before = null;
+ let after = null;
+ let beforeBtn = null;
+ let afterBtn = null;
+
+ if (anchor === 'left') {
+ before = drawer;
+ beforeBtn = menuBtn;
+ } else {
+ after = drawer;
+ afterBtn = menuBtn;
+ }
+
+ return (
+
+
+ left
+ right
+
+
+
+
+ {beforeBtn}
+
+ Persistent drawer
+
+ {afterBtn}
+
+
+ {before}
+
+
+
+ {'You think water moves fast? You should see ice.'}
+
+
+ {after}
+
+
+ );
+ }
+}
+
+PersistentDrawer.propTypes = {
+ classes: PropTypes.object.isRequired,
+ theme: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles, { withTheme: true })(PersistentDrawer);
diff --git a/front/odiparpack/app/containers/UiElements/demos/DrawerMenu/StyledMenu.js b/front/odiparpack/app/containers/UiElements/demos/DrawerMenu/StyledMenu.js
new file mode 100644
index 0000000..ed6ac4a
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/DrawerMenu/StyledMenu.js
@@ -0,0 +1,60 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import InboxIcon from '@material-ui/icons/MoveToInbox';
+import DraftsIcon from '@material-ui/icons/Drafts';
+import SendIcon from '@material-ui/icons/Send';
+
+import { MenuList, MenuItem, Paper, ListItemIcon, ListItemText } from '@material-ui/core';
+
+const styles = theme => ({
+ menu: {
+ maxWidth: 400,
+ margin: '20 auto'
+ },
+ menuItem: {
+ '&:focus': {
+ backgroundColor: theme.palette.primary.main,
+ '& $primary, & $icon': {
+ color: theme.palette.common.white,
+ },
+ },
+ },
+ primary: {},
+ icon: {},
+});
+
+function StyledMenu(props) {
+ const { classes } = props;
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+StyledMenu.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(StyledMenu);
diff --git a/front/odiparpack/app/containers/UiElements/demos/DrawerMenu/SwipeDrawer.js b/front/odiparpack/app/containers/UiElements/demos/DrawerMenu/SwipeDrawer.js
new file mode 100644
index 0000000..a91feb5
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/DrawerMenu/SwipeDrawer.js
@@ -0,0 +1,124 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import { SwipeableDrawer, Button, List, Divider, Grid } from '@material-ui/core';
+import { mailFolderListItems, otherMailFolderListItems } from './menuData';
+
+
+const styles = {
+ list: {
+ width: 250,
+ },
+ fullList: {
+ width: 'auto',
+ },
+};
+
+class SwipeDrawer extends React.Component {
+ state = {
+ top: false,
+ left: false,
+ bottom: false,
+ right: false,
+ };
+
+ toggleDrawer = (side, open) => () => {
+ this.setState({
+ [side]: open,
+ });
+ };
+
+ render() {
+ const { classes } = this.props;
+
+ const sideList = (
+
+
{mailFolderListItems}
+
+
{otherMailFolderListItems}
+
+ );
+
+ const fullList = (
+
+
{mailFolderListItems}
+
+
{otherMailFolderListItems}
+
+ );
+
+ return (
+
+ Open Left
+ Open Right
+ Open Top
+ Open Bottom
+
+
+ {sideList}
+
+
+
+
+ {fullList}
+
+
+
+
+ {fullList}
+
+
+
+
+ {sideList}
+
+
+
+ );
+ }
+}
+
+SwipeDrawer.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(SwipeDrawer);
diff --git a/front/odiparpack/app/containers/UiElements/demos/DrawerMenu/TemporaryDrawer.js b/front/odiparpack/app/containers/UiElements/demos/DrawerMenu/TemporaryDrawer.js
new file mode 100644
index 0000000..6af2a24
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/DrawerMenu/TemporaryDrawer.js
@@ -0,0 +1,109 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import { Drawer, Button, List, Divider, Grid } from '@material-ui/core';
+import { mailFolderListItems, otherMailFolderListItems } from './menuData';
+
+
+const styles = {
+ list: {
+ width: 250,
+ },
+ fullList: {
+ width: 'auto',
+ },
+};
+
+class TemporaryDrawer extends React.Component {
+ state = {
+ top: false,
+ left: false,
+ bottom: false,
+ right: false,
+ };
+
+ toggleDrawer = (side, open) => () => {
+ this.setState({
+ [side]: open,
+ });
+ };
+
+ render() {
+ const { classes } = this.props;
+
+ const sideList = (
+
+
{mailFolderListItems}
+
+
{otherMailFolderListItems}
+
+ );
+
+ const fullList = (
+
+
{mailFolderListItems}
+
+
{otherMailFolderListItems}
+
+ );
+
+ return (
+
+ Open Left
+ Open Right
+ Open Top
+ Open Bottom
+
+
+ {sideList}
+
+
+
+
+ {fullList}
+
+
+
+
+ {fullList}
+
+
+
+
+ {sideList}
+
+
+
+ );
+ }
+}
+
+TemporaryDrawer.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(TemporaryDrawer);
diff --git a/front/odiparpack/app/containers/UiElements/demos/DrawerMenu/menuData.js b/front/odiparpack/app/containers/UiElements/demos/DrawerMenu/menuData.js
new file mode 100644
index 0000000..cd2d653
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/DrawerMenu/menuData.js
@@ -0,0 +1,64 @@
+// This file is shared across the demos.
+
+import React from 'react';
+import InboxIcon from '@material-ui/icons/MoveToInbox';
+import DraftsIcon from '@material-ui/icons/Drafts';
+import StarIcon from '@material-ui/icons/Star';
+import SendIcon from '@material-ui/icons/Send';
+import MailIcon from '@material-ui/icons/Mail';
+import DeleteIcon from '@material-ui/icons/Delete';
+import ReportIcon from '@material-ui/icons/Report';
+
+import { ListItem, ListItemIcon, ListItemText } from '@material-ui/core';
+
+export const mailFolderListItems = (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+);
+
+export const otherMailFolderListItems = (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+);
diff --git a/front/odiparpack/app/containers/UiElements/demos/ImageGrid/AdvancedGridList.js b/front/odiparpack/app/containers/UiElements/demos/ImageGrid/AdvancedGridList.js
new file mode 100644
index 0000000..5d11f0d
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/ImageGrid/AdvancedGridList.js
@@ -0,0 +1,85 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import StarBorderIcon from '@material-ui/icons/StarBorder';
+import imgData from 'ba-api/imgData';
+
+import { GridList, GridListTile, GridListTileBar, IconButton } from '@material-ui/core';
+
+const styles = theme => ({
+ root: {
+ display: 'flex',
+ flexWrap: 'wrap',
+ justifyContent: 'space-around',
+ overflow: 'hidden',
+ backgroundColor: theme.palette.background.paper,
+ },
+ gridList: {
+ width: 500,
+ height: 450,
+ // Promote the list into his own layer on Chrome. This cost memory but helps keeping high FPS.
+ transform: 'translateZ(0)',
+ },
+ titleBar: {
+ background:
+ 'linear-gradient(to bottom, rgba(0,0,0,0.7) 0%, '
+ + 'rgba(0,0,0,0.3) 70%, rgba(0,0,0,0) 100%)',
+ },
+ icon: {
+ color: 'white',
+ },
+ img: {
+ maxWidth: 'none'
+ }
+});
+
+/**
+ * The example data is structured as follows:
+ *
+ * import image from 'path/to/image.jpg';
+ * [etc...]
+ *
+ * const tileData = [
+ * {
+ * img: image,
+ * title: 'Image',
+ * author: 'author',
+ * featured: true,
+ * },
+ * {
+ * [etc...]
+ * },
+ * ];
+ */
+function AdvancedGridList(props) {
+ const { classes } = props;
+
+ return (
+
+
+ {imgData.map((tile, index) => (
+
+
+
+
+
+ )}
+ actionPosition="left"
+ className={classes.titleBar}
+ />
+
+ ))}
+
+
+ );
+}
+
+AdvancedGridList.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(AdvancedGridList);
diff --git a/front/odiparpack/app/containers/UiElements/demos/ImageGrid/ImageGridList.js b/front/odiparpack/app/containers/UiElements/demos/ImageGrid/ImageGridList.js
new file mode 100644
index 0000000..ce785ac
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/ImageGrid/ImageGridList.js
@@ -0,0 +1,66 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import imgData from 'ba-api/imgData';
+
+import { GridList, GridListTile } from '@material-ui/core';
+
+const styles = theme => ({
+ root: {
+ display: 'flex',
+ flexWrap: 'wrap',
+ justifyContent: 'space-around',
+ overflow: 'hidden',
+ backgroundColor: theme.palette.background.paper,
+ },
+ gridList: {
+ width: 500,
+ height: 450,
+ },
+ subheader: {
+ width: '100%',
+ },
+ img: {
+ maxWidth: 'none'
+ }
+});
+
+/**
+ * The example data is structured as follows:
+ *
+ * import image from 'path/to/image.jpg';
+ * [etc...]
+ *
+ * const tileData = [
+ * {
+ * img: image,
+ * title: 'Image',
+ * author: 'author',
+ * cols: 2,
+ * },
+ * {
+ * [etc...]
+ * },
+ * ];
+ */
+function ImageGridList(props) {
+ const { classes } = props;
+
+ return (
+
+
+ {imgData.map((tile, index) => (
+
+
+
+ ))}
+
+
+ );
+}
+
+ImageGridList.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(ImageGridList);
diff --git a/front/odiparpack/app/containers/UiElements/demos/ImageGrid/SingleLineGridList.js b/front/odiparpack/app/containers/UiElements/demos/ImageGrid/SingleLineGridList.js
new file mode 100644
index 0000000..ac30e6f
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/ImageGrid/SingleLineGridList.js
@@ -0,0 +1,83 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import StarBorderIcon from '@material-ui/icons/StarBorder';
+import imgData from 'ba-api/imgData';
+
+import { GridList, GridListTile, GridListTileBar, IconButton } from '@material-ui/core';
+
+const styles = theme => ({
+ root: {
+ display: 'flex',
+ flexWrap: 'wrap',
+ justifyContent: 'space-around',
+ overflow: 'hidden',
+ backgroundColor: theme.palette.background.paper,
+ },
+ gridList: {
+ flexWrap: 'nowrap',
+ // Promote the list into his own layer on Chrome. This cost memory but helps keeping high FPS.
+ transform: 'translateZ(0)',
+ },
+ title: {
+ color: theme.palette.primary.light,
+ },
+ titleBar: {
+ background:
+ 'linear-gradient(to top, rgba(0,0,0,0.7) 0%, rgba(0,0,0,0.3) 70%, rgba(0,0,0,0) 100%)',
+ },
+ img: {
+ maxWidth: 'none'
+ }
+});
+
+/**
+ * The example data is structured as follows:
+ *
+ * import image from 'path/to/image.jpg';
+ * [etc...]
+ *
+ * const tileData = [
+ * {
+ * img: image,
+ * title: 'Image',
+ * author: 'author',
+ * },
+ * {
+ * [etc...]
+ * },
+ * ];
+ */
+function SingleLineGridList(props) {
+ const { classes } = props;
+
+ return (
+
+
+ {imgData.map((tile, index) => (
+
+
+
+
+
+ )}
+ />
+
+ ))}
+
+
+ );
+}
+
+SingleLineGridList.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(SingleLineGridList);
diff --git a/front/odiparpack/app/containers/UiElements/demos/ImageGrid/TitlebarGridList.js b/front/odiparpack/app/containers/UiElements/demos/ImageGrid/TitlebarGridList.js
new file mode 100644
index 0000000..41f8d1a
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/ImageGrid/TitlebarGridList.js
@@ -0,0 +1,89 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import InfoIcon from '@material-ui/icons/Info';
+import imgData from 'ba-api/imgData';
+
+import {
+ GridList,
+ GridListTile,
+ GridListTileBar,
+ ListSubheader as Subheader,
+ IconButton,
+} from '@material-ui/core';
+
+const styles = theme => ({
+ root: {
+ display: 'flex',
+ flexWrap: 'wrap',
+ justifyContent: 'space-around',
+ overflow: 'hidden',
+ backgroundColor: theme.palette.background.paper,
+ },
+ gridList: {
+ width: 500,
+ height: 450,
+ },
+ icon: {
+ color: 'rgba(255, 255, 255, 0.54)',
+ },
+ img: {
+ maxWidth: 'none'
+ }
+});
+
+/**
+ * The example data is structured as follows:
+ *
+ * import image from 'path/to/image.jpg';
+ * [etc...]
+ *
+ * const tileData = [
+ * {
+ * img: image,
+ * title: 'Image',
+ * author: 'author',
+ * },
+ * {
+ * [etc...]
+ * },
+ * ];
+ */
+function TitlebarGridList(props) {
+ const { classes } = props;
+
+ return (
+
+
+
+ December
+
+ {imgData.map((tile, index) => (
+
+
+
+by:
+ {tile.author}
+
+ )}
+ actionIcon={(
+
+
+
+ )}
+ />
+
+ ))}
+
+
+ );
+}
+
+TitlebarGridList.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(TitlebarGridList);
diff --git a/front/odiparpack/app/containers/UiElements/demos/List/ListBasic.js b/front/odiparpack/app/containers/UiElements/demos/List/ListBasic.js
new file mode 100644
index 0000000..ba4f13a
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/List/ListBasic.js
@@ -0,0 +1,116 @@
+import React, { Fragment, PureComponent } from 'react';
+import PropTypes from 'prop-types';
+// import classNames from 'classnames';
+import { withStyles } from '@material-ui/core/styles';
+import ImageIcon from '@material-ui/icons/Image';
+import WorkIcon from '@material-ui/icons/Work';
+import BeachAccessIcon from '@material-ui/icons/BeachAccess';
+
+import { red, green, amber } from '@material-ui/core/colors';
+
+import {
+ Typography, Grid, List,
+ ListItem, ListItemText, ListItemAvatar,
+ Avatar, Divider
+} from '@material-ui/core';
+
+const styles = theme => ({
+ root: {
+ maxWidth: '360px',
+ backgroundColor: theme.palette.background.paper,
+ margin: 10
+ },
+ avatarRed: {
+ backgroundColor: red[500],
+ },
+ avatarGreen: {
+ backgroundColor: green[500],
+ },
+ avatarAmber: {
+ backgroundColor: amber[500],
+ },
+ divider: {
+ display: 'block',
+ margin: `${theme.spacing(3)}px 0`,
+ }
+});
+
+class ListBasic extends PureComponent {
+ render() {
+ const { classes } = this.props;
+ return (
+
+
+
+ Simple List Divider
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Inset Divider
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+ListBasic.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(ListBasic);
diff --git a/front/odiparpack/app/containers/UiElements/demos/List/ListControl.js b/front/odiparpack/app/containers/UiElements/demos/List/ListControl.js
new file mode 100644
index 0000000..2743d4b
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/List/ListControl.js
@@ -0,0 +1,159 @@
+import React, { Fragment } from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import CommentIcon from '@material-ui/icons/Comment';
+import WifiIcon from '@material-ui/icons/Wifi';
+import BluetoothIcon from '@material-ui/icons/Bluetooth';
+
+import {
+ List,
+ ListItem,
+ ListItemIcon,
+ ListItemSecondaryAction,
+ ListItemText,
+ ListSubheader,
+ ListItemAvatar,
+ Checkbox,
+ Switch,
+ IconButton,
+ Grid,
+ Typography,
+ Avatar,
+} from '@material-ui/core';
+
+const styles = theme => ({
+ root: {
+ maxWidth: 360,
+ backgroundColor: theme.palette.background.paper,
+ margin: 10
+ },
+});
+
+class ListControl extends React.Component {
+ state = {
+ checked: [0],
+ checked2: [1],
+ checked3: ['wifi'],
+ };
+
+ handleToggle = value => () => {
+ const { checked } = this.state;
+ const currentIndex = checked.indexOf(value);
+ const newChecked = [...checked];
+
+ if (currentIndex === -1) {
+ newChecked.push(value);
+ } else {
+ newChecked.splice(currentIndex, 1);
+ }
+
+ this.setState({
+ checked: newChecked,
+ checked2: newChecked,
+ checked3: newChecked,
+ });
+ };
+
+ render() {
+ const { classes } = this.props;
+ return (
+
+
+
+ Checkbox
+
+
+ {[0, 1, 2, 3].map(value => (
+
+
+
+
+
+
+
+
+
+ ))}
+
+
+
+
+ Checkbox
+
+
+ {[0, 1, 2, 3].map(value => (
+
+
+
+
+
+
+
+
+
+ ))}
+
+
+
+
+ Switch
+
+ Settings}>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+ListControl.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(ListControl);
diff --git a/front/odiparpack/app/containers/UiElements/demos/List/ListInteractive.js b/front/odiparpack/app/containers/UiElements/demos/List/ListInteractive.js
new file mode 100644
index 0000000..f8d3fa8
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/List/ListInteractive.js
@@ -0,0 +1,183 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import FolderIcon from '@material-ui/icons/Folder';
+import DeleteIcon from '@material-ui/icons/Delete';
+import { cyan } from '@material-ui/core/colors';
+
+import {
+ List,
+ ListItem,
+ ListItemAvatar,
+ ListItemIcon,
+ ListItemSecondaryAction,
+ ListItemText,
+ Avatar,
+ IconButton,
+ FormGroup,
+ FormControlLabel,
+ Checkbox,
+ Grid,
+ Typography,
+} from '@material-ui/core';
+
+const styles = theme => ({
+ root: {
+ flexGrow: 1,
+ maxWidth: 752,
+ },
+ demo: {
+ backgroundColor: theme.palette.background.paper,
+ },
+ title: {
+ margin: `${theme.spacing(4)}px 0 ${theme.spacing(2)}px`,
+ },
+ iconCyan: {
+ color: cyan[300]
+ },
+ avatarCyan: {
+ background: cyan[300]
+ }
+});
+
+function generate(element) {
+ return [0, 1, 2].map(value => React.cloneElement(element, {
+ key: value,
+ }),
+ );
+}
+
+class ListInteractive extends React.Component {
+ state = {
+ dense: false,
+ secondary: false,
+ };
+
+ render() {
+ const { classes } = this.props;
+ const { dense, secondary } = this.state;
+
+ return (
+
+
+ this.setState({ dense: checked })}
+ value="dense"
+ />
+ )}
+ label="Enable dense"
+ />
+ this.setState({ secondary: checked })}
+ value="secondary"
+ />
+ )}
+ label="Enable secondary text"
+ />
+
+
+
+
+ Text only
+
+
+
+ {generate(
+
+
+ ,
+ )}
+
+
+
+
+
+ Icon with text
+
+
+
+ {generate(
+
+
+
+
+
+ ,
+ )}
+
+
+
+
+
+
+
+ Avatar with text
+
+
+
+ {generate(
+
+
+
+
+
+
+
+ ,
+ )}
+
+
+
+
+
+ Avatar with text and icon
+
+
+
+ {generate(
+
+
+
+
+
+
+
+
+
+
+
+
+ ,
+ )}
+
+
+
+
+
+ );
+ }
+}
+
+ListInteractive.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(ListInteractive);
diff --git a/front/odiparpack/app/containers/UiElements/demos/List/ListMenu.js b/front/odiparpack/app/containers/UiElements/demos/List/ListMenu.js
new file mode 100644
index 0000000..f796f76
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/List/ListMenu.js
@@ -0,0 +1,204 @@
+import React, { Fragment, PureComponent } from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import StarIcon from '@material-ui/icons/Star';
+import ImageIcon from '@material-ui/icons/Image';
+import WorkIcon from '@material-ui/icons/Work';
+import BeachAccessIcon from '@material-ui/icons/BeachAccess';
+import InboxIcon from '@material-ui/icons/Inbox';
+import DraftsIcon from '@material-ui/icons/Drafts';
+import SendIcon from '@material-ui/icons/Send';
+import ExpandLess from '@material-ui/icons/ExpandLess';
+import ExpandMore from '@material-ui/icons/ExpandMore';
+import StarBorder from '@material-ui/icons/StarBorder';
+import { red, green, amber, lightBlue, pink, teal } from '@material-ui/core/colors';
+
+import {
+ Typography,
+ Grid,
+ List,
+ ListItem,
+ ListItemIcon,
+ ListItemText,
+ ListSubheader,
+ ListItemAvatar,
+ Divider,
+ Avatar,
+ Collapse,
+} from '@material-ui/core';
+
+const styles = theme => ({
+ root: {
+ maxWidth: '360px',
+ backgroundColor: theme.palette.background.paper,
+ margin: 10
+ },
+ nested: {
+ paddingLeft: theme.spacing(4),
+ },
+ avatarRed: {
+ backgroundColor: red[500],
+ },
+ avatarGreen: {
+ backgroundColor: green[500],
+ },
+ avatarAmber: {
+ backgroundColor: amber[500],
+ },
+ iconBlue: {
+ color: lightBlue[500]
+ },
+ iconPink: {
+ color: pink[500]
+ },
+ iconAmber: {
+ color: amber[500]
+ },
+ iconTeal: {
+ color: teal[500]
+ },
+});
+
+class ListMenu extends PureComponent {
+ state = { open: true };
+
+ handleClick = () => {
+ this.setState({ open: !this.state.open });
+ };
+
+ render() {
+ const { classes } = this.props;
+ return (
+
+
+
+ Menu List
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Folder List
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Inset List
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Nested List
+
+ Nested List Items}
+ >
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {this.state.open ? : }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+ListMenu.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(ListMenu);
diff --git a/front/odiparpack/app/containers/UiElements/demos/List/PinnedList.js b/front/odiparpack/app/containers/UiElements/demos/List/PinnedList.js
new file mode 100644
index 0000000..e770fd0
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/List/PinnedList.js
@@ -0,0 +1,62 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import { Grid, ListSubheader, List, ListItem, ListItemText } from '@material-ui/core';
+
+const styles = theme => ({
+ root: {
+ width: '100%',
+ maxWidth: 360,
+ backgroundColor: theme.palette.background.paper,
+ position: 'relative',
+ overflow: 'auto',
+ maxHeight: 300,
+ },
+ listSection: {
+ backgroundColor: 'inherit',
+ },
+ ul: {
+ backgroundColor: 'inherit',
+ padding: 0,
+ },
+ head: {
+ backgroundColor: theme.palette.secondary.light,
+ lineHeight: '30px',
+ height: 30,
+ textTransform: 'uppercase'
+ }
+});
+
+function PinnedList(props) {
+ const { classes } = props;
+
+ return (
+
+
}>
+ {[0, 1, 2, 3, 4].map(sectionId => (
+
+
+ {`I'm sticky ${sectionId}`}
+ {[0, 1, 2].map(item => (
+
+
+
+ ))}
+
+
+ ))}
+
+
+ );
+}
+
+PinnedList.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(PinnedList);
diff --git a/front/odiparpack/app/containers/UiElements/demos/Notification/MobileNotif.js b/front/odiparpack/app/containers/UiElements/demos/Notification/MobileNotif.js
new file mode 100644
index 0000000..60cdbbd
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/Notification/MobileNotif.js
@@ -0,0 +1,116 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import classNames from 'classnames';
+import { withStyles } from '@material-ui/core/styles';
+import MenuIcon from '@material-ui/icons/Menu';
+import AddIcon from '@material-ui/icons/Add';
+import { AppBar, Toolbar, IconButton, Typography, Button, Fab, Snackbar } from '@material-ui/core';
+
+const styles = theme => ({
+ root: {
+ position: 'relative',
+ overflow: 'hidden',
+ },
+ appFrame: {
+ width: '100%',
+ height: 360,
+ backgroundColor: theme.palette.background.paper,
+ },
+ menuButton: {
+ marginLeft: -12,
+ marginRight: 20,
+ },
+ button: {
+ marginBottom: theme.spacing(1),
+ },
+ fab: {
+ position: 'absolute',
+ bottom: theme.spacing(2),
+ right: theme.spacing(2),
+ },
+ fabMoveUp: {
+ transform: 'translate3d(0, -46px, 0)',
+ transition: theme.transitions.create('transform', {
+ duration: theme.transitions.duration.enteringScreen,
+ easing: theme.transitions.easing.easeOut,
+ }),
+ },
+ fabMoveDown: {
+ transform: 'translate3d(0, 0, 0)',
+ transition: theme.transitions.create('transform', {
+ duration: theme.transitions.duration.leavingScreen,
+ easing: theme.transitions.easing.sharp,
+ }),
+ },
+ snackbar: {
+ position: 'absolute',
+ },
+ snackbarContent: {
+ width: '100%',
+ },
+});
+
+class MobileNotif extends React.Component {
+ state = {
+ open: false,
+ };
+
+ handleClick = () => {
+ this.setState({ open: true });
+ };
+
+ handleClose = () => {
+ this.setState({ open: false });
+ };
+
+ render() {
+ const { classes } = this.props;
+ const { open } = this.state;
+ const fabClassName = classNames(classes.fab, open ? classes.fabMoveUp : classes.fabMoveDown);
+
+ return (
+
+
+ Open snackbar
+
+
+
+
+
+
+
+
+ Out of my way!
+
+
+
+
+
+
+
Archived}
+ action={(
+
+ Undo
+
+ )}
+ className={classes.snackbar}
+ />
+
+
+ );
+ }
+}
+
+MobileNotif.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(MobileNotif);
diff --git a/front/odiparpack/app/containers/UiElements/demos/Notification/SimpleNotif.js b/front/odiparpack/app/containers/UiElements/demos/Notification/SimpleNotif.js
new file mode 100644
index 0000000..0b068b5
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/Notification/SimpleNotif.js
@@ -0,0 +1,132 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import CloseIcon from '@material-ui/icons/Close';
+import { Typography, Button, Snackbar, IconButton, Grid } from '@material-ui/core';
+
+const styles = theme => ({
+ close: {
+ width: theme.spacing(4)
+ },
+ divider: {
+ margin: `${theme.spacing(3)}px 0`,
+ },
+ button: {
+ margin: theme.spacing(1)
+ }
+});
+
+class SimpleNotif extends React.Component {
+ state = {
+ open: false,
+ open2: false,
+ vertical: 'bottom',
+ horizontal: 'left',
+ };
+
+ handleClick = () => {
+ this.setState({ open: true });
+ };
+
+ handleClose = (event, reason) => {
+ if (reason === 'clickaway') {
+ return;
+ }
+
+ this.setState({ open: false });
+ };
+
+ handleClick2 = state => () => {
+ this.setState({ open2: true, ...state });
+ };
+
+ handleClose2 = () => {
+ this.setState({ open2: false });
+ };
+
+ render() {
+ const { classes } = this.props;
+ const { vertical, horizontal, open2 } = this.state;
+ return (
+
+
+ Simple Notification
+
+ Open simple snackbar
+ Note archived}
+ action={[
+
+ UNDO
+ ,
+
+
+ ,
+ ]}
+ />
+
+
+
+ Positioning
+
+
+ Top-Center
+
+
+ Top-Right
+
+
+ Bottom-Right
+
+
+ Bottom-Center
+
+
+ Bottom-Left
+
+
+ Top-Left
+
+ I love snacks}
+ />
+
+
+
+ );
+ }
+}
+
+SimpleNotif.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(SimpleNotif);
diff --git a/front/odiparpack/app/containers/UiElements/demos/Notification/StyledNotif.js b/front/odiparpack/app/containers/UiElements/demos/Notification/StyledNotif.js
new file mode 100644
index 0000000..2ad8dba
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/Notification/StyledNotif.js
@@ -0,0 +1,198 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import classNames from 'classnames';
+import CheckCircleOutlinedIcon from '@material-ui/icons/CheckCircleOutlined';
+import ErrorOutlineOutlinedIcon from '@material-ui/icons/ErrorOutlineOutlined';
+import InfoOutlinedIcon from '@material-ui/icons/InfoOutlined';
+import CloseIcon from '@material-ui/icons/Close';
+import ReportProblemOutlinedIcon from '@material-ui/icons/ReportProblemOutlined';
+import messageStyles from 'ba-styles/Messages.scss';
+
+import { Typography, Button, IconButton, Snackbar, SnackbarContent, Grid } from '@material-ui/core';
+
+const variantIcon = {
+ success: CheckCircleOutlinedIcon,
+ warning: ReportProblemOutlinedIcon,
+ error: ErrorOutlineOutlinedIcon,
+ info: InfoOutlinedIcon,
+};
+
+const styles1 = theme => ({
+ success: {
+ backgroundColor: '#b6f8c4',
+ },
+ error: {
+ backgroundColor: '#faabab',
+ },
+ info: {
+ backgroundColor: '#b2e7f5',
+ },
+ warning: {
+ backgroundColor: '#f5ea9f',
+ },
+ icon: {
+ fontSize: 20,
+ color: 'black'
+ },
+ iconVariant: {
+ opacity: 0.9,
+ marginRight: theme.spacing(1),
+ },
+ message: {
+ display: 'flex',
+ alignItems: 'center',
+ color: 'black'
+ },
+});
+
+function MySnackbarContent(props) {
+ const {
+ classes,
+ className,
+ message,
+ onClose,
+ variant,
+ ...other
+ } = props;
+ const Icon = variantIcon[variant];
+
+ return (
+
+
+ {message}
+
+ )}
+ action={[
+
+
+ ,
+ ]}
+ {...other}
+ />
+ );
+}
+
+MySnackbarContent.propTypes = {
+ classes: PropTypes.object.isRequired,
+ className: PropTypes.string.isRequired,
+ message: PropTypes.node.isRequired,
+ onClose: PropTypes.func,
+ variant: PropTypes.oneOf(['success', 'warning', 'error', 'info']).isRequired,
+};
+
+MySnackbarContent.defaultProps = {
+ onClose: () => {}
+};
+
+const MySnackbarContentWrapper = withStyles(styles1)(MySnackbarContent);
+
+const styles = theme => ({
+ snackbar: {
+ margin: theme.spacing(1),
+ },
+ divider: {
+ margin: `${theme.spacing(3)}px 0`,
+ },
+ margin: {
+ margin: theme.spacing(1)
+ }
+});
+
+const action = (
+
+ Action
+
+);
+
+class StyledNotif extends React.Component {
+ state = {
+ openStyle: false,
+ };
+
+ handleClickStyle = () => {
+ this.setState({ openStyle: true });
+ };
+
+ handleCloseStyle = (event, reason) => {
+ if (reason === 'clickaway') {
+ return;
+ }
+ this.setState({ openStyle: false });
+ };
+
+ render() {
+ const { classes } = this.props;
+ return (
+
+
+ Default Styled Notification
+
+ Open success snackbar
+
+
+
+
+
+
+
+
+
+
+ Custom Styled Notification with CSS
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+StyledNotif.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(StyledNotif);
diff --git a/front/odiparpack/app/containers/UiElements/demos/Notification/TransitionNotif.js b/front/odiparpack/app/containers/UiElements/demos/Notification/TransitionNotif.js
new file mode 100644
index 0000000..6ac8df5
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/Notification/TransitionNotif.js
@@ -0,0 +1,203 @@
+import React, { Fragment, PureComponent } from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import CloseIcon from '@material-ui/icons/Close';
+
+import { Typography, Button, Grid, Snackbar, Slide, Fade, IconButton } from '@material-ui/core';
+
+const styles = theme => ({
+ row: {
+ display: 'flex',
+ justifyContent: 'flex-start',
+ },
+ close: {
+ width: theme.spacing(4)
+ },
+ divider: {
+ display: 'block',
+ margin: `${theme.spacing(3)}px 0`,
+ },
+ button: {
+ margin: theme.spacing(1)
+ }
+});
+
+function TransitionLeft(props) {
+ return ;
+}
+
+function TransitionUp(props) {
+ return ;
+}
+
+function TransitionRight(props) {
+ return ;
+}
+
+function TransitionDown(props) {
+ return ;
+}
+
+class TransitionNotif extends PureComponent {
+ state = {
+ open: false,
+ open2: false,
+ open3: false,
+ transition: null,
+ messageInfo: {},
+ };
+
+ queue = [];
+
+ handleClickQueue = message => () => {
+ this.queue.push({
+ message,
+ key: new Date().getTime(),
+ });
+
+ if (this.state.open3) {
+ // immediately begin dismissing current message
+ // to start showing new one
+ this.setState({ open3: false });
+ } else {
+ this.processQueue();
+ }
+ };
+
+ processQueue = () => {
+ if (this.queue.length > 0) {
+ this.setState({
+ messageInfo: this.queue.shift(),
+ open3: true,
+ });
+ }
+ };
+
+ handleCloseQueue = (event, reason) => {
+ if (reason === 'clickaway') {
+ return;
+ }
+ this.setState({ open3: false });
+ };
+
+ handleExited = () => {
+ this.processQueue();
+ };
+
+ handleClick = transition => () => {
+ this.setState({ open: true, transition });
+ };
+
+ handleClose = () => {
+ this.setState({ open: false });
+ };
+
+ handleClick2 = () => {
+ this.setState({ open2: true });
+ };
+
+ handleClose2 = () => {
+ this.setState({ open2: false });
+ };
+
+ render() {
+ const { classes } = this.props;
+ const { message, key } = this.state.messageInfo;
+ return (
+
+
+
+ Transition
+
+ Right
+ Up
+ Left
+ Down
+ I love snacks}
+ />
+
+
+
+ Change Transition
+
+ Open with Fade Transition
+ I love snacks}
+ />
+
+
+
+ Consecutive Snackbars
+
+ Show message A
+ Show message B
+ {message}}
+ action={[
+
+ UNDO
+ ,
+
+
+
+ ]}
+ />
+
+
+
+
+ );
+ }
+}
+
+TransitionNotif.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(TransitionNotif);
diff --git a/front/odiparpack/app/containers/UiElements/demos/Pagination/GeneralPagination.js b/front/odiparpack/app/containers/UiElements/demos/Pagination/GeneralPagination.js
new file mode 100644
index 0000000..884be0a
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/Pagination/GeneralPagination.js
@@ -0,0 +1,136 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import { Pagination } from 'ba-components';
+import { Paper } from '@material-ui/core';
+
+const styles = theme => ({
+ paper: theme.mixins.gutters({
+ paddingTop: 16,
+ paddingBottom: 16,
+ marginTop: theme.spacing(3),
+ }),
+});
+
+class GeneralPagination extends React.Component {
+ constructor() {
+ super();
+ this.state = {
+ page: 1,
+ content: [
+ 'Lorem ipsum dolor sit amet, consectetur adipiscing elit',
+ 'Suspendisse sed urna in justo euismod condimentum',
+ 'Fusce placerat enim et odio molestie sagittis.',
+ 'Vestibulum dignissim orci vitae eros rutrum euismod.',
+ 'Vestibulum tempor, sem et molestie egestas, dui tortor laoreet tellus, id rhoncus mauris neque malesuada augue.',
+ 'Duis tristique metus magna, lobortis aliquam risus euismod sit amet.',
+ 'Suspendisse porttitor velit nisl, feugiat tincidunt nisl mattis ut.',
+ 'Nulla lobortis nunc vitae nisi semper semper.',
+ 'Sed mi neque, convallis at ipsum at, blandit pretium enim.',
+ 'Nunc quis sem quis velit tincidunt congue a sit amet ante.',
+ 'In hac habitasse platea dictumst.',
+ 'In mi nulla, fringilla vestibulum finibus et, vehicula non leo. Vivamus et luctus mauris.',
+ 'Maecenas nisl libero, tincidunt id odio id, feugiat vulputate quam. Vestibulum feugiat rhoncus metus.',
+ 'In non erat et ipsum molestie porta sit amet ut felis.',
+ 'Vestibulum a massa vestibulum, gravida odio id, fringilla ipsum.',
+ 'Ut sed eros finibus, placerat orci id, dapibus mauris.',
+ 'Proin varius, tortor faucibus tempor pharetra, nunc mi consectetur enim, nec posuere ante magna vitae quam.',
+ 'Cras convallis lacus orci, tristique tincidunt magna consequat in.',
+ 'Vestibulum consequat hendrerit lacus. In id nisi id neque venenatis molestie.',
+ 'Quisque lacinia purus ut libero facilisis, at vulputate sem maximus.',
+ 'Pellentesque ac bibendum tortor, vel blandit nulla.',
+ 'Nulla eget lobortis lacus.',
+ 'Aliquam venenatis magna et odio lobortis maximus.',
+ 'Nullam in tortor ligula.',
+ 'Proin maximus risus nunc, eu aliquam nibh tempus a.',
+ 'Interdum et malesuada fames ac ante ipsum primis in faucibus.',
+ ],
+ contentsPerPage: 3
+ };
+ this.onPageChange = this.onPageChange.bind(this);
+ this.onPrev = this.onPrev.bind(this);
+ this.onNext = this.onNext.bind(this);
+ this.onGoFirst = this.onGoFirst.bind(this);
+ this.onGoLast = this.onGoLast.bind(this);
+ }
+
+ onPageChange(page) {
+ this.setState({ page });
+ }
+
+ onPrev() {
+ if (this.state.page > 1) {
+ this.setState({ page: this.state.page -= 1 });
+ } else {
+ this.setState({ page: 1 });
+ }
+ }
+
+ onNext(totalPages) {
+ if (this.state.page < totalPages) {
+ this.setState({ page: this.state.page += 1 });
+ } else {
+ this.setState({ page: totalPages });
+ }
+ }
+
+ onGoFirst() {
+ this.setState({ page: 1 });
+ }
+
+ onGoLast(totalPages) {
+ this.setState({ page: totalPages });
+ }
+
+ render() {
+ const { classes } = this.props;
+ const { page, content, contentsPerPage } = this.state;
+
+ // Logic for displaying current todos
+ const indexOfLastTodo = page * contentsPerPage;
+ const indexOfFirstTodo = indexOfLastTodo - contentsPerPage;
+ const currentContent = content.slice(indexOfFirstTodo, indexOfLastTodo);
+
+ const renderContent = currentContent.map((ctn, index) => (
+ {ctn}
+ ));
+
+ // Logic for displaying page numbers
+ const pageNumbers = [];
+ for (let i = 1; i <= Math.ceil(content.length / contentsPerPage); i += 1) {
+ pageNumbers.push(i);
+ }
+
+ return (
+
+
+
+We are in page
+ {page}
+
+
+ {renderContent}
+
+
+
this.onNext(pageNumbers.length)}
+ onGoFirst={this.onGoFirst}
+ onGoLast={() => this.onGoLast(pageNumbers.length)}
+ />
+
+ );
+ }
+}
+
+GeneralPagination.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(GeneralPagination);
diff --git a/front/odiparpack/app/containers/UiElements/demos/Pagination/TbPagination.js b/front/odiparpack/app/containers/UiElements/demos/Pagination/TbPagination.js
new file mode 100644
index 0000000..d1a0214
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/Pagination/TbPagination.js
@@ -0,0 +1,110 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import { Table, TableBody, TableCell, TableFooter, TablePagination, TableRow, Paper } from '@material-ui/core';
+
+let counter = 0;
+function createData(name, calories, fat) {
+ counter += 1;
+ return {
+ id: counter,
+ name,
+ calories,
+ fat
+ };
+}
+
+const styles = theme => ({
+ root: {
+ width: '100%',
+ marginTop: theme.spacing(3),
+ },
+ table: {
+ minWidth: 500,
+ },
+ tableWrapper: {
+ overflowX: 'auto',
+ },
+});
+
+class TbPagination extends React.Component {
+ constructor(props, context) {
+ super(props, context);
+
+ this.state = {
+ data: [
+ createData('Cupcake', 305, 3.7),
+ createData('Donut', 452, 25.0),
+ createData('Eclair', 262, 16.0),
+ createData('Frozen yoghurt', 159, 6.0),
+ createData('Gingerbread', 356, 16.0),
+ createData('Honeycomb', 408, 3.2),
+ createData('Ice cream sandwich', 237, 9.0),
+ createData('Jelly Bean', 375, 0.0),
+ createData('KitKat', 518, 26.0),
+ createData('Lollipop', 392, 0.2),
+ createData('Marshmallow', 318, 0),
+ createData('Nougat', 360, 19.0),
+ createData('Oreo', 437, 18.0),
+ ].sort((a, b) => (a.calories < b.calories ? -1 : 1)),
+ page: 0,
+ rowsPerPage: 5,
+ };
+ }
+
+ handleChangePage = (event, page) => {
+ this.setState({ page });
+ };
+
+ handleChangeRowsPerPage = event => {
+ this.setState({ rowsPerPage: event.target.value });
+ };
+
+ render() {
+ const { classes } = this.props;
+ const { data, rowsPerPage, page } = this.state;
+ const emptyRows = rowsPerPage - Math.min(rowsPerPage, data.length - (page * rowsPerPage));
+
+ return (
+
+
+
+
+ {data.slice(page * rowsPerPage, (page * rowsPerPage) + rowsPerPage).map(n => (
+
+ {n.name}
+ {n.calories}
+ {n.fat}
+
+ ))}
+ {emptyRows > 0 && (
+
+
+
+ )}
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+TbPagination.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(TbPagination);
diff --git a/front/odiparpack/app/containers/UiElements/demos/Pagination/TbPaginationActions.js b/front/odiparpack/app/containers/UiElements/demos/Pagination/TbPaginationActions.js
new file mode 100644
index 0000000..3f56fa0
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/Pagination/TbPaginationActions.js
@@ -0,0 +1,93 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import FirstPageIcon from '@material-ui/icons/FirstPage';
+import KeyboardArrowLeft from '@material-ui/icons/KeyboardArrowLeft';
+import KeyboardArrowRight from '@material-ui/icons/KeyboardArrowRight';
+import LastPageIcon from '@material-ui/icons/LastPage';
+import { IconButton } from '@material-ui/core';
+
+const actionsStyles = theme => ({
+ root: {
+ flexShrink: 0,
+ color: theme.palette.text.secondary,
+ marginLeft: theme.spacing(2.5),
+ },
+});
+
+class TbPaginationActions extends React.Component {
+ handleFirstPageButtonClick = event => {
+ this.props.onChangePage(event, 0);
+ };
+
+ handleBackButtonClick = event => {
+ this.props.onChangePage(event, this.props.page - 1);
+ };
+
+ handleNextButtonClick = event => {
+ this.props.onChangePage(event, this.props.page + 1);
+ };
+
+ handleLastPageButtonClick = event => {
+ this.props.onChangePage(
+ event,
+ Math.max(0, Math.ceil(this.props.count / this.props.rowsPerPage) - 1),
+ );
+ };
+
+ render() {
+ const {
+ classes,
+ count,
+ page,
+ rowsPerPage,
+ theme
+ } = this.props;
+
+ return (
+
+
+ {theme.direction === 'rtl' ? : }
+
+
+ {theme.direction === 'rtl' ? : }
+
+ = Math.ceil(count / rowsPerPage) - 1}
+ aria-label="Next Page"
+ >
+ {theme.direction === 'rtl' ? : }
+
+ = Math.ceil(count / rowsPerPage) - 1}
+ aria-label="Last Page"
+ >
+ {theme.direction === 'rtl' ? : }
+
+
+ );
+ }
+}
+
+TbPaginationActions.propTypes = {
+ classes: PropTypes.object.isRequired,
+ count: PropTypes.number.isRequired,
+ onChangePage: PropTypes.func.isRequired,
+ page: PropTypes.number.isRequired,
+ rowsPerPage: PropTypes.number.isRequired,
+ theme: PropTypes.object.isRequired,
+};
+
+export default withStyles(actionsStyles, { withTheme: true })(
+ TbPaginationActions,
+);
diff --git a/front/odiparpack/app/containers/UiElements/demos/Pagination/TbPaginationCustom.js b/front/odiparpack/app/containers/UiElements/demos/Pagination/TbPaginationCustom.js
new file mode 100644
index 0000000..49494dc
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/Pagination/TbPaginationCustom.js
@@ -0,0 +1,115 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import { Table, TableBody, TableCell, TablePagination, TableRow, TableFooter, Paper } from '@material-ui/core';
+import TbPaginationActions from './TbPaginationActions';
+
+
+let counter = 0;
+function createData(name, calories, fat) {
+ counter += 1;
+ return {
+ id: counter,
+ name,
+ calories,
+ fat
+ };
+}
+
+const styles = theme => ({
+ root: {
+ width: '100%',
+ marginTop: theme.spacing(3),
+ },
+ table: {
+ minWidth: 500,
+ },
+ tableWrapper: {
+ overflowX: 'auto',
+ },
+});
+
+class TbPaginationCustom extends React.Component {
+ constructor(props, context) {
+ super(props, context);
+
+ this.state = {
+ data: [
+ createData('Cupcake', 305, 3.7),
+ createData('Donut', 452, 25.0),
+ createData('Eclair', 262, 16.0),
+ createData('Frozen yoghurt', 159, 6.0),
+ createData('Gingerbread', 356, 16.0),
+ createData('Honeycomb', 408, 3.2),
+ createData('Ice cream sandwich', 237, 9.0),
+ createData('Jelly Bean', 375, 0.0),
+ createData('KitKat', 518, 26.0),
+ createData('Lollipop', 392, 0.2),
+ createData('Marshmallow', 318, 0),
+ createData('Nougat', 360, 19.0),
+ createData('Oreo', 437, 18.0),
+ ].sort((a, b) => (a.calories < b.calories ? -1 : 1)),
+ page: 0,
+ rowsPerPage: 5,
+ };
+ }
+
+ handleChangePage = (event, page) => {
+ this.setState({ page });
+ };
+
+ handleChangeRowsPerPage = event => {
+ this.setState({ rowsPerPage: event.target.value });
+ };
+
+ render() {
+ const { classes } = this.props;
+ const { data, rowsPerPage, page } = this.state;
+ const emptyRows = rowsPerPage - Math.min(rowsPerPage, data.length - (page * rowsPerPage));
+
+ return (
+
+
+
+
+ {data.slice(page * rowsPerPage, (page * rowsPerPage) + rowsPerPage).map(n => (
+
+
+ {n.name}
+
+ {n.calories}
+ {n.fat}
+
+ ))}
+ {emptyRows > 0 && (
+
+
+
+ )}
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+TbPaginationCustom.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(TbPaginationCustom);
diff --git a/front/odiparpack/app/containers/UiElements/demos/PopoverTooltip/CustomizedTooltips.js b/front/odiparpack/app/containers/UiElements/demos/PopoverTooltip/CustomizedTooltips.js
new file mode 100644
index 0000000..f0f9111
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/PopoverTooltip/CustomizedTooltips.js
@@ -0,0 +1,125 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import { Button, Tooltip } from '@material-ui/core';
+
+const styles = theme => ({
+ lightTooltip: {
+ background: theme.palette.common.white,
+ color: theme.palette.text.primary,
+ boxShadow: theme.shadows[1],
+ fontSize: 11,
+ },
+ arrowPopper: {
+ '&[x-placement*="bottom"] $arrowArrow': {
+ top: 0,
+ left: 0,
+ marginTop: '-0.9em',
+ width: '3em',
+ height: '1em',
+ '&::before': {
+ borderWidth: '0 1em 1em 1em',
+ borderColor: `transparent transparent ${theme.palette.grey[700]} transparent`,
+ },
+ },
+ '&[x-placement*="top"] $arrowArrow': {
+ bottom: 0,
+ left: 0,
+ marginBottom: '-0.9em',
+ width: '3em',
+ height: '1em',
+ '&::before': {
+ borderWidth: '1em 1em 0 1em',
+ borderColor: `${theme.palette.grey[700]} transparent transparent transparent`,
+ },
+ },
+ '&[x-placement*="right"] $arrowArrow': {
+ left: 0,
+ marginLeft: '-0.9em',
+ height: '3em',
+ width: '1em',
+ '&::before': {
+ borderWidth: '1em 1em 1em 0',
+ borderColor: `transparent ${theme.palette.grey[700]} transparent transparent`,
+ },
+ },
+ '&[x-placement*="left"] $arrowArrow': {
+ right: 0,
+ marginRight: '-0.9em',
+ height: '3em',
+ width: '1em',
+ '&::before': {
+ borderWidth: '1em 0 1em 1em',
+ borderColor: `transparent transparent transparent ${theme.palette.grey[700]}`,
+ },
+ },
+ },
+ arrowArrow: {
+ position: 'absolute',
+ fontSize: 7,
+ width: '3em',
+ height: '3em',
+ '&::before': {
+ content: '""',
+ margin: 'auto',
+ display: 'block',
+ width: 0,
+ height: 0,
+ borderStyle: 'solid',
+ },
+ },
+});
+
+class CustomizedTooltips extends React.Component {
+ state = {
+ arrowRef: null,
+ };
+
+ handleArrowRef = node => {
+ this.setState({
+ arrowRef: node,
+ });
+ };
+
+ render() {
+ const { classes } = this.props;
+
+ return (
+
+
+ Default
+
+
+ Light
+
+
+ Add
+
+
+ )}
+ classes={{ popper: classes.arrowPopper }}
+ PopperProps={{
+ popperOptions: {
+ modifiers: {
+ arrow: {
+ enabled: Boolean(this.state.arrowRef),
+ element: this.state.arrowRef,
+ },
+ },
+ },
+ }}
+ >
+ Arrow
+
+
+ );
+ }
+}
+
+CustomizedTooltips.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(CustomizedTooltips);
diff --git a/front/odiparpack/app/containers/UiElements/demos/PopoverTooltip/DelayTooltips.js b/front/odiparpack/app/containers/UiElements/demos/PopoverTooltip/DelayTooltips.js
new file mode 100644
index 0000000..786dd4f
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/PopoverTooltip/DelayTooltips.js
@@ -0,0 +1,12 @@
+import React from 'react';
+import { Button, Tooltip } from '@material-ui/core';
+
+function DelayTooltips() {
+ return (
+
+ [500ms, 200ms]
+
+ );
+}
+
+export default DelayTooltips;
diff --git a/front/odiparpack/app/containers/UiElements/demos/PopoverTooltip/PopoverPlayground.js b/front/odiparpack/app/containers/UiElements/demos/PopoverTooltip/PopoverPlayground.js
new file mode 100644
index 0000000..7878df1
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/PopoverTooltip/PopoverPlayground.js
@@ -0,0 +1,340 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import SyntaxHighlighter, { registerLanguage } from 'react-syntax-highlighter/prism-light';
+import jsx from 'react-syntax-highlighter/languages/prism/jsx';
+import themeSource from 'react-syntax-highlighter/styles/prism/prism';
+import { green } from '@material-ui/core/colors';
+
+import {
+ FormControl,
+ FormLabel,
+ FormControlLabel,
+ Radio,
+ RadioGroup,
+ Grid,
+ Typography,
+ Button,
+ Popover,
+ Input,
+ InputLabel,
+} from '@material-ui/core';
+
+const styles = theme => ({
+ buttonWrapper: {
+ position: 'relative',
+ marginBottom: theme.spacing(4),
+ },
+ anchor: {
+ backgroundColor: green[500],
+ width: 10,
+ height: 10,
+ borderRadius: '50%',
+ position: 'absolute',
+ },
+ radioAnchor: {
+ color: green[600],
+ '&$checked': {
+ color: green[500],
+ },
+ },
+ checked: {},
+ typography: {
+ margin: theme.spacing(2),
+ },
+});
+
+const inlineStyles = {
+ anchorVertical: {
+ top: {
+ top: -5,
+ },
+ center: {
+ top: 'calc(50% - 5px)',
+ },
+ bottom: {
+ bottom: -5,
+ },
+ },
+ anchorHorizontal: {
+ left: {
+ left: -5,
+ },
+ center: {
+ left: 'calc(50% - 5px)',
+ },
+ right: {
+ right: -5,
+ },
+ },
+};
+
+class PopoverPlayground extends React.Component {
+ state = {
+ open: false,
+ anchorOriginVertical: 'top',
+ anchorOriginHorizontal: 'left',
+ transformOriginVertical: 'top',
+ transformOriginHorizontal: 'left',
+ positionTop: 200, // Just so the popover can be spotted more easily
+ positionLeft: 400, // Same as above
+ anchorReference: 'anchorEl',
+ };
+
+ handleChange = key => (event, value) => {
+ this.setState({
+ [key]: value,
+ });
+ };
+
+ handleNumberInputChange = key => event => {
+ this.setState({
+ [key]: parseInt(event.target.value, 10),
+ });
+ };
+
+ handleClickButton = () => {
+ this.setState({
+ open: true,
+ });
+ };
+
+ handleClose = () => {
+ this.setState({
+ open: false,
+ });
+ };
+
+ anchorEl = null;
+
+ render() {
+ const { classes } = this.props;
+ registerLanguage('jsx', jsx);
+ const {
+ open,
+ anchorOriginVertical,
+ anchorOriginHorizontal,
+ transformOriginVertical,
+ transformOriginHorizontal,
+ positionTop,
+ positionLeft,
+ anchorReference,
+ } = this.state;
+
+ let mode = '';
+
+ if (anchorReference === 'anchorPosition') {
+ mode = `
+ anchorReference="${anchorReference}"
+ anchorPosition={{ top: ${positionTop}, left: ${positionLeft} }}`;
+ }
+
+ const code = `
+
+`;
+
+ const radioAnchorClasses = { root: classes.radioAnchor, checked: classes.checked };
+
+ return (
+
+
+
+ {
+ this.anchorEl = node;
+ }}
+ variant="contained"
+ onClick={this.handleClickButton}
+ >
+ Open Popover
+
+ {anchorReference === 'anchorEl' && (
+
+ )}
+
+
+
+ The content of the Popover.
+
+
+
+
+ anchorReference
+
+ } label="anchorEl" />
+ }
+ label="anchorPosition"
+ />
+
+
+
+
+
+ anchorPosition.top
+
+
+
+
+ anchorPosition.left
+
+
+
+
+
+ anchorOrigin.vertical
+
+ }
+ label="Top"
+ />
+ }
+ label="Center"
+ />
+ }
+ label="Bottom"
+ />
+
+
+
+
+
+ transformOrigin.vertical
+
+ } label="Top" />
+ }
+ label="Center"
+ />
+ }
+ label="Bottom"
+ />
+
+
+
+
+
+ anchorOrigin.horizontal
+
+ }
+ label="Left"
+ />
+ }
+ label="Center"
+ />
+ }
+ label="Right"
+ />
+
+
+
+
+
+ transformOrigin.horizontal
+
+ } label="Left" />
+ }
+ label="Center"
+ />
+ } label="Right" />
+
+
+
+
+
+ {code}
+
+
+ );
+ }
+}
+
+PopoverPlayground.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(PopoverPlayground);
diff --git a/front/odiparpack/app/containers/UiElements/demos/PopoverTooltip/PositionedTooltips.js b/front/odiparpack/app/containers/UiElements/demos/PopoverTooltip/PositionedTooltips.js
new file mode 100644
index 0000000..336d932
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/PopoverTooltip/PositionedTooltips.js
@@ -0,0 +1,83 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import { Grid, Button, Tooltip } from '@material-ui/core';
+
+const styles = {
+ root: {
+ width: 500,
+ margin: '0 auto'
+ },
+};
+
+function PositionedTooltips(props) {
+ const { classes } = props;
+ return (
+
+
+
+
+ top-start
+
+
+ top
+
+
+ top-end
+
+
+
+
+
+
+ left-start
+
+
+
+ left
+
+
+
+ left-end
+
+
+
+
+
+ right-start
+
+
+
+
+ right
+
+
+
+
+ right-end
+
+
+
+
+
+
+
+ bottom-start
+
+
+ bottom
+
+
+ bottom-end
+
+
+
+
+ );
+}
+
+PositionedTooltips.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(PositionedTooltips);
diff --git a/front/odiparpack/app/containers/UiElements/demos/PopoverTooltip/SimplePopover.js b/front/odiparpack/app/containers/UiElements/demos/PopoverTooltip/SimplePopover.js
new file mode 100644
index 0000000..23d2462
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/PopoverTooltip/SimplePopover.js
@@ -0,0 +1,79 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import { Button, Popover, Typography, Grid } from '@material-ui/core';
+
+const styles = theme => ({
+ typography: {
+ margin: theme.spacing(2),
+ },
+ divider: {
+ display: 'block',
+ margin: `${theme.spacing(3)}px 0`,
+ textAlign: 'center'
+ },
+ button: {
+ margin: theme.spacing(1),
+ },
+});
+
+class SimplePopover extends React.Component {
+ state = {
+ anchorEl: null,
+ };
+
+ handleClick = event => {
+ this.setState({
+ anchorEl: event.currentTarget,
+ });
+ };
+
+ handleClose = () => {
+ this.setState({
+ anchorEl: null,
+ });
+ };
+
+ render() {
+ const { classes } = this.props;
+ const { anchorEl } = this.state;
+ return (
+
+
+
+
+ Open Simple Popover
+
+
+ The content of the Popover.
+
+
+
+
+ );
+ }
+}
+
+SimplePopover.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(SimplePopover);
diff --git a/front/odiparpack/app/containers/UiElements/demos/PopoverTooltip/SimpleTooltips.js b/front/odiparpack/app/containers/UiElements/demos/PopoverTooltip/SimpleTooltips.js
new file mode 100644
index 0000000..0714e6c
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/PopoverTooltip/SimpleTooltips.js
@@ -0,0 +1,116 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import AddIcon from '@material-ui/icons/Add';
+import DeleteIcon from '@material-ui/icons/Delete';
+import { Fab, IconButton, Tooltip, Typography, Grid } from '@material-ui/core';
+
+const styles = theme => ({
+ fab: {
+ margin: theme.spacing(2),
+ },
+ fixed: {
+ position: 'fixed',
+ bottom: theme.spacing(2),
+ right: theme.spacing(3),
+ },
+ divider: {
+ display: 'block',
+ margin: `${theme.spacing(3)}px 0`,
+ textAlign: 'center'
+ },
+});
+
+class SimpleTooltips extends React.Component {
+ state = {
+ open: false,
+ };
+
+ handleTooltipClose = () => {
+ this.setState({ open: false });
+ };
+
+ handleTooltipOpen = () => {
+ this.setState({ open: true });
+ };
+
+ render() {
+ const { classes } = this.props;
+ return (
+
+
+
+ Simple Tooltips
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Delayed Tooltips
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+SimpleTooltips.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(SimpleTooltips);
diff --git a/front/odiparpack/app/containers/UiElements/demos/PopoverTooltip/TransitionsTooltips.js b/front/odiparpack/app/containers/UiElements/demos/PopoverTooltip/TransitionsTooltips.js
new file mode 100644
index 0000000..7b8adc1
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/PopoverTooltip/TransitionsTooltips.js
@@ -0,0 +1,20 @@
+import React from 'react';
+import { Button, Tooltip, Fade, Zoom } from '@material-ui/core';
+
+function TransitionsTooltips() {
+ return (
+
+
+ Grow
+
+
+ Fade
+
+
+ Zoom
+
+
+ );
+}
+
+export default TransitionsTooltips;
diff --git a/front/odiparpack/app/containers/UiElements/demos/PopoverTooltip/TriggersTooltips.js b/front/odiparpack/app/containers/UiElements/demos/PopoverTooltip/TriggersTooltips.js
new file mode 100644
index 0000000..bd4db5b
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/PopoverTooltip/TriggersTooltips.js
@@ -0,0 +1,61 @@
+import React from 'react';
+import { Grid, Button, Tooltip, ClickAwayListener } from '@material-ui/core';
+
+class TriggersTooltips extends React.Component {
+ state = {
+ open: false,
+ };
+
+ handleTooltipClose = () => {
+ this.setState({ open: false });
+ };
+
+ handleTooltipOpen = () => {
+ this.setState({ open: true });
+ };
+
+ render() {
+ return (
+
+
+
+
+ Hover or touch
+
+
+
+
+ Focus or touch
+
+
+
+
+ Hover
+
+
+
+
+
+
+ Click
+
+
+
+
+
+
+ );
+ }
+}
+
+export default TriggersTooltips;
diff --git a/front/odiparpack/app/containers/UiElements/demos/Progress/CircularDeterminate.js b/front/odiparpack/app/containers/UiElements/demos/Progress/CircularDeterminate.js
new file mode 100644
index 0000000..0b1312b
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/Progress/CircularDeterminate.js
@@ -0,0 +1,69 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import { CircularProgress } from '@material-ui/core';
+
+const styles = theme => ({
+ progress: {
+ margin: theme.spacing(2),
+ },
+});
+
+class CircularDeterminate extends React.Component {
+ state = {
+ completed: 0,
+ };
+
+ componentDidMount() {
+ this.timer = setInterval(this.progress, 20);
+ }
+
+ componentWillUnmount() {
+ clearInterval(this.timer);
+ }
+
+ timer;
+
+ progress = () => {
+ const { completed } = this.state;
+ this.setState({ completed: completed === 100 ? 0 : completed + 1 });
+ };
+
+ render() {
+ const { classes } = this.props;
+ return (
+
+
+
+
+
+
+ );
+ }
+}
+
+CircularDeterminate.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(CircularDeterminate);
diff --git a/front/odiparpack/app/containers/UiElements/demos/Progress/CircularIndeterminate.js b/front/odiparpack/app/containers/UiElements/demos/Progress/CircularIndeterminate.js
new file mode 100644
index 0000000..cc37de8
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/Progress/CircularIndeterminate.js
@@ -0,0 +1,29 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import { purple } from '@material-ui/core/colors';
+import { CircularProgress } from '@material-ui/core';
+
+const styles = theme => ({
+ progress: {
+ margin: theme.spacing(2),
+ },
+});
+
+function CircularIndeterminate(props) {
+ const { classes } = props;
+ return (
+
+
+
+
+
+
+ );
+}
+
+CircularIndeterminate.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(CircularIndeterminate);
diff --git a/front/odiparpack/app/containers/UiElements/demos/Progress/CircularIntegration.js b/front/odiparpack/app/containers/UiElements/demos/Progress/CircularIntegration.js
new file mode 100644
index 0000000..ff19f5c
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/Progress/CircularIntegration.js
@@ -0,0 +1,114 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import classNames from 'classnames';
+import { withStyles } from '@material-ui/core/styles';
+import CheckIcon from '@material-ui/icons/Check';
+import SaveIcon from '@material-ui/icons/Save';
+import { green } from '@material-ui/core/colors';
+
+import { CircularProgress, Button, Fab } from '@material-ui/core';
+
+const styles = theme => ({
+ root: {
+ display: 'flex',
+ alignItems: 'center',
+ },
+ wrapper: {
+ margin: theme.spacing(1),
+ position: 'relative',
+ },
+ buttonSuccess: {
+ backgroundColor: green[500],
+ '&:hover': {
+ backgroundColor: green[700],
+ },
+ },
+ fabProgress: {
+ color: green[500],
+ position: 'absolute',
+ top: -6,
+ left: -6,
+ zIndex: 1,
+ },
+ buttonProgress: {
+ color: green[500],
+ position: 'absolute',
+ top: '50%',
+ left: '50%',
+ marginTop: -12,
+ marginLeft: -12,
+ },
+});
+
+class CircularIntegration extends React.Component {
+ state = {
+ loading: false,
+ success: false,
+ };
+
+ componentWillUnmount() {
+ clearTimeout(this.timer);
+ }
+
+ handleButtonClick = () => {
+ if (!this.state.loading) {
+ this.setState(
+ {
+ success: false,
+ loading: true,
+ },
+ () => {
+ this.timer = setTimeout(() => {
+ this.setState({
+ loading: false,
+ success: true,
+ });
+ }, 2000);
+ },
+ );
+ }
+ };
+
+ timer = undefined;
+
+ render() {
+ const { loading, success } = this.state;
+ const { classes } = this.props;
+ const buttonClassname = classNames({
+ [classes.buttonSuccess]: success,
+ });
+
+ return (
+
+
+
+ {success ? : }
+
+ {loading && }
+
+
+
+ Accept terms
+
+ {loading && }
+
+
+ );
+ }
+}
+
+CircularIntegration.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(CircularIntegration);
diff --git a/front/odiparpack/app/containers/UiElements/demos/Progress/CircularStatic.js b/front/odiparpack/app/containers/UiElements/demos/Progress/CircularStatic.js
new file mode 100644
index 0000000..bfa931a
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/Progress/CircularStatic.js
@@ -0,0 +1,29 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import { CircularProgress } from '@material-ui/core';
+
+const styles = theme => ({
+ progress: {
+ margin: theme.spacing(2),
+ },
+});
+
+function CircularStatic(props) {
+ const { classes } = props;
+ return (
+
+
+
+
+
+
+
+ );
+}
+
+CircularStatic.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(CircularStatic);
diff --git a/front/odiparpack/app/containers/UiElements/demos/Progress/LinearBuffer.js b/front/odiparpack/app/containers/UiElements/demos/Progress/LinearBuffer.js
new file mode 100644
index 0000000..44bca71
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/Progress/LinearBuffer.js
@@ -0,0 +1,56 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import { LinearProgress } from '@material-ui/core';
+
+const styles = {
+ root: {
+ flexGrow: 1,
+ },
+};
+
+class LinearBuffer extends React.Component {
+ state = {
+ completed: 0,
+ buffer: 10,
+ };
+
+ componentDidMount() {
+ this.timer = setInterval(this.progress, 500);
+ }
+
+ componentWillUnmount() {
+ clearInterval(this.timer);
+ }
+
+ timer = null;
+
+ progress = () => {
+ const { completed } = this.state;
+ if (completed > 100) {
+ this.setState({ completed: 0, buffer: 10 });
+ } else {
+ const diff = Math.random() * 10;
+ const diff2 = Math.random() * 10;
+ this.setState({ completed: completed + diff, buffer: completed + diff + diff2 });
+ }
+ };
+
+ render() {
+ const { classes } = this.props;
+ const { completed, buffer } = this.state;
+ return (
+
+
+
+
+
+ );
+ }
+}
+
+LinearBuffer.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(LinearBuffer);
diff --git a/front/odiparpack/app/containers/UiElements/demos/Progress/LinearDeterminate.js b/front/odiparpack/app/containers/UiElements/demos/Progress/LinearDeterminate.js
new file mode 100644
index 0000000..08c718d
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/Progress/LinearDeterminate.js
@@ -0,0 +1,53 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import { LinearProgress } from '@material-ui/core';
+
+const styles = {
+ root: {
+ flexGrow: 1,
+ },
+};
+
+class LinearDeterminate extends React.Component {
+ state = {
+ completed: 0,
+ };
+
+ componentDidMount() {
+ this.timer = setInterval(this.progress, 500);
+ }
+
+ componentWillUnmount() {
+ clearInterval(this.timer);
+ }
+
+ timer = null;
+
+ progress = () => {
+ const { completed } = this.state;
+ if (completed === 100) {
+ this.setState({ completed: 0 });
+ } else {
+ const diff = Math.random() * 10;
+ this.setState({ completed: Math.min(completed + diff, 100) });
+ }
+ };
+
+ render() {
+ const { classes } = this.props;
+ return (
+
+
+
+
+
+ );
+ }
+}
+
+LinearDeterminate.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(LinearDeterminate);
diff --git a/front/odiparpack/app/containers/UiElements/demos/Progress/LinearIndeterminate.js b/front/odiparpack/app/containers/UiElements/demos/Progress/LinearIndeterminate.js
new file mode 100644
index 0000000..de5071a
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/Progress/LinearIndeterminate.js
@@ -0,0 +1,27 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import { LinearProgress } from '@material-ui/core';
+
+const styles = {
+ root: {
+ flexGrow: 1,
+ },
+};
+
+function LinearIndeterminate(props) {
+ const { classes } = props;
+ return (
+
+
+
+
+
+ );
+}
+
+LinearIndeterminate.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(LinearIndeterminate);
diff --git a/front/odiparpack/app/containers/UiElements/demos/Progress/LinearQuery.js b/front/odiparpack/app/containers/UiElements/demos/Progress/LinearQuery.js
new file mode 100644
index 0000000..6e51da7
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/Progress/LinearQuery.js
@@ -0,0 +1,27 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import { LinearProgress } from '@material-ui/core';
+
+const styles = {
+ root: {
+ flexGrow: 1,
+ },
+};
+
+function LinearQuery(props) {
+ const { classes } = props;
+ return (
+
+
+
+
+
+ );
+}
+
+LinearQuery.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(LinearQuery);
diff --git a/front/odiparpack/app/containers/UiElements/demos/Progress/LinearStatic.js b/front/odiparpack/app/containers/UiElements/demos/Progress/LinearStatic.js
new file mode 100644
index 0000000..55ad2a1
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/Progress/LinearStatic.js
@@ -0,0 +1,27 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import { LinearProgress } from '@material-ui/core';
+
+const styles = {
+ root: {
+ flexGrow: 1,
+ },
+};
+
+function LinearIndeterminate(props) {
+ const { classes } = props;
+ return (
+
+
+
+
+
+ );
+}
+
+LinearIndeterminate.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(LinearIndeterminate);
diff --git a/front/odiparpack/app/containers/UiElements/demos/Progress/ProgressDelay.js b/front/odiparpack/app/containers/UiElements/demos/Progress/ProgressDelay.js
new file mode 100644
index 0000000..6417795
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/Progress/ProgressDelay.js
@@ -0,0 +1,105 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import { Fade, Button, CircularProgress, Typography } from '@material-ui/core';
+
+const styles = theme => ({
+ root: {
+ display: 'flex',
+ flexDirection: 'column',
+ alignItems: 'center',
+ },
+ button: {
+ margin: theme.spacing(2),
+ },
+ placeholder: {
+ height: 40,
+ },
+});
+
+class ProgressDelay extends React.Component {
+ state = {
+ loading: false,
+ query: 'idle',
+ };
+
+ componentWillUnmount() {
+ clearTimeout(this.timer);
+ }
+
+ timer = null;
+
+ handleClickLoading = () => {
+ this.setState({
+ loading: !this.state.loading,
+ });
+ };
+
+ handleClickQuery = () => {
+ clearTimeout(this.timer);
+
+ if (this.state.query !== 'idle') {
+ this.setState({
+ query: 'idle',
+ });
+ return;
+ }
+
+ this.setState({
+ query: 'progress',
+ });
+ this.timer = setTimeout(() => {
+ this.setState({
+ query: 'success',
+ });
+ }, 2e3);
+ };
+
+ render() {
+ const { classes } = this.props;
+ const { loading, query } = this.state;
+
+ return (
+
+
+
+
+
+
+
+ {loading ? 'Stop loading' : 'Loading'}
+
+
+ {query === 'success' ? (
+ Success!
+ ) : (
+
+
+
+ )}
+
+
+ {query !== 'idle' ? 'Reset' : 'Simulate a load'}
+
+
+ );
+ }
+}
+
+ProgressDelay.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(ProgressDelay);
diff --git a/front/odiparpack/app/containers/UiElements/demos/SliderCaraousel/AnimatedSlider.js b/front/odiparpack/app/containers/UiElements/demos/SliderCaraousel/AnimatedSlider.js
new file mode 100644
index 0000000..57fb5e4
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/SliderCaraousel/AnimatedSlider.js
@@ -0,0 +1,72 @@
+import React from 'react';
+import Type from 'ba-styles/Typography.scss';
+import Slider from 'react-animated-slider';
+import imgApi from 'ba-api/images';
+import avatarApi from 'ba-api/avatars';
+import 'ba-styles/vendors/react-animated-slider/react-animated-slider.css';
+
+import { Button, Typography, Hidden } from '@material-ui/core';
+
+const content = [
+ {
+ title: 'Vulputate Mollis Ultricies Fermentum Parturient',
+ description:
+ 'Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras justo odio, dapibus ac facilisis.',
+ button: 'Read More',
+ image: imgApi[38],
+ user: 'Luanda Gjokaj',
+ userProfile: avatarApi[1]
+ },
+ {
+ title: 'Tortor Dapibus Commodo Aenean Quam',
+ description:
+ 'Nullam id dolor id nibh ultricies vehicula ut id elit. Cras mattis consectetur purus sit amet fermentum. Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Donec sed odio dui.',
+ button: 'Discover',
+ image: imgApi[2],
+ user: 'Erich Behrens',
+ userProfile: avatarApi[8]
+ },
+ {
+ title: 'Phasellus volutpat metus',
+ description:
+ 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Duis mollis, est non commodo luctus, nisi erat porttitor ligula.',
+ button: 'Buy now',
+ image: imgApi[28],
+ user: 'Bruno Vizovskyy',
+ userProfile: avatarApi[10]
+ }
+];
+
+const AnimatedSlider = () => (
+
+
+ {content.map((item, index) => (
+
+
+
{item.title}
+
+ {item.description}
+
+
+ {item.button}
+
+
+
+
+
+ Posted by
+ {' '}
+ {item.user}
+
+
+
+ ))}
+
+
+);
+
+export default AnimatedSlider;
diff --git a/front/odiparpack/app/containers/UiElements/demos/SliderCaraousel/AutoplayCarousel.js b/front/odiparpack/app/containers/UiElements/demos/SliderCaraousel/AutoplayCarousel.js
new file mode 100644
index 0000000..59c11ef
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/SliderCaraousel/AutoplayCarousel.js
@@ -0,0 +1,52 @@
+import React from 'react';
+import Slider from 'react-slick';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import imgData from 'ba-api/imgData';
+import 'ba-styles/vendors/slick-carousel/slick-carousel.css';
+import 'ba-styles/vendors/slick-carousel/slick.css';
+import 'ba-styles/vendors/slick-carousel/slick-theme.css';
+
+const styles = ({
+ item: {
+ textAlign: 'center',
+ '& img': {
+ margin: '10px auto'
+ }
+ }
+});
+
+class AutoplayCarousel extends React.Component {
+ render() {
+ const { classes } = this.props;
+ const settings = {
+ dots: true,
+ infinite: true,
+ centerMode: false,
+ speed: 500,
+ autoplaySpeed: 2000,
+ pauseOnHover: true,
+ autoplay: true,
+ slidesToShow: 3,
+ slidesToScroll: 1,
+ cssEase: 'ease-out'
+ };
+ return (
+
+
+ {imgData.map((item, index) => (
+
+
+
+ ))}
+
+
+ );
+ }
+}
+
+AutoplayCarousel.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(AutoplayCarousel);
diff --git a/front/odiparpack/app/containers/UiElements/demos/SliderCaraousel/CustomCarousel.js b/front/odiparpack/app/containers/UiElements/demos/SliderCaraousel/CustomCarousel.js
new file mode 100644
index 0000000..a558d8e
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/SliderCaraousel/CustomCarousel.js
@@ -0,0 +1,93 @@
+import React from 'react';
+import Slider from 'react-slick';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import ArrowForward from '@material-ui/icons/ArrowForward';
+import ArrowBack from '@material-ui/icons/ArrowBack';
+import imgData from 'ba-api/imgData';
+import 'ba-styles/vendors/slick-carousel/slick-carousel.css';
+import 'ba-styles/vendors/slick-carousel/slick.css';
+import 'ba-styles/vendors/slick-carousel/slick-theme.css';
+import { IconButton } from '@material-ui/core';
+
+function SampleNextArrow(props) {
+ const { onClick } = props;
+ return (
+
+
+
+ );
+}
+
+SampleNextArrow.propTypes = {
+ onClick: PropTypes.func,
+};
+
+SampleNextArrow.defaultProps = {
+ onClick: undefined,
+};
+
+function SamplePrevArrow(props) {
+ const { onClick } = props;
+ return (
+
+
+
+ );
+}
+
+SamplePrevArrow.propTypes = {
+ onClick: PropTypes.func,
+};
+
+SamplePrevArrow.defaultProps = {
+ onClick: undefined,
+};
+
+const styles = ({
+ item: {
+ textAlign: 'center',
+ '& img': {
+ margin: '10px auto'
+ }
+ }
+});
+
+class CustomCarousel extends React.Component {
+ render() {
+ const { classes } = this.props;
+ const settings = {
+ dots: true,
+ infinite: true,
+ centerMode: true,
+ speed: 500,
+ slidesToShow: 3,
+ slidesToScroll: 1,
+ nextArrow: ,
+ prevArrow:
+ };
+ return (
+
+
+ {imgData.map((item, index) => (
+
+
+
+ ))}
+
+
+ );
+ }
+}
+
+CustomCarousel.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(CustomCarousel);
diff --git a/front/odiparpack/app/containers/UiElements/demos/SliderCaraousel/MultipleCarousel.js b/front/odiparpack/app/containers/UiElements/demos/SliderCaraousel/MultipleCarousel.js
new file mode 100644
index 0000000..c8ff743
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/SliderCaraousel/MultipleCarousel.js
@@ -0,0 +1,48 @@
+import React from 'react';
+import Slider from 'react-slick';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import imgData from 'ba-api/imgData';
+import 'ba-styles/vendors/slick-carousel/slick-carousel.css';
+import 'ba-styles/vendors/slick-carousel/slick.css';
+import 'ba-styles/vendors/slick-carousel/slick-theme.css';
+
+const styles = ({
+ item: {
+ textAlign: 'center',
+ '& img': {
+ margin: '10px auto'
+ }
+ }
+});
+
+class MultipleCarousel extends React.Component {
+ render() {
+ const { classes } = this.props;
+ const settings = {
+ dots: true,
+ infinite: true,
+ centerMode: true,
+ speed: 500,
+ slidesToShow: 3,
+ slidesToScroll: 1
+ };
+ return (
+
+
+ {imgData.map((item, index) => (
+
+
+
+ ))}
+
+
+ );
+ }
+}
+
+MultipleCarousel.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(MultipleCarousel);
diff --git a/front/odiparpack/app/containers/UiElements/demos/SliderCaraousel/SingleCarousel.js b/front/odiparpack/app/containers/UiElements/demos/SliderCaraousel/SingleCarousel.js
new file mode 100644
index 0000000..76158f7
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/SliderCaraousel/SingleCarousel.js
@@ -0,0 +1,80 @@
+import React from 'react';
+import Slider from 'react-slick';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import imgData from 'ba-api/imgData';
+import 'ba-styles/vendors/slick-carousel/slick-carousel.css';
+import 'ba-styles/vendors/slick-carousel/slick.css';
+import 'ba-styles/vendors/slick-carousel/slick-theme.css';
+
+import { FormControl, MenuItem, InputLabel, Select } from '@material-ui/core';
+
+const styles = ({
+ root: {
+ display: 'flex',
+ flexDirection: 'column',
+ justifyContent: 'center'
+ },
+ formControl: {
+ width: '50%',
+ margin: '0 auto'
+ },
+ item: {
+ textAlign: 'center',
+ '& img': {
+ margin: '10px auto'
+ }
+ }
+});
+
+class SingleCarousel extends React.Component {
+ state = {
+ transition: 'slide'
+ }
+
+ handleChange = event => {
+ this.setState({ [event.target.name]: event.target.value });
+ };
+
+ render() {
+ const { classes } = this.props;
+ const { transition } = this.state;
+ const settings = {
+ dots: true,
+ fade: this.state.transition === 'fade',
+ };
+ return (
+
+
+ Carousel Transition
+
+ Slide
+ Fade
+
+
+
+
+ {imgData.map((item, index) => (
+
+
+
+ ))}
+
+
+
+ );
+ }
+}
+
+SingleCarousel.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(SingleCarousel);
diff --git a/front/odiparpack/app/containers/UiElements/demos/SliderCaraousel/ThumbnailCarousel.js b/front/odiparpack/app/containers/UiElements/demos/SliderCaraousel/ThumbnailCarousel.js
new file mode 100644
index 0000000..9860b55
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/SliderCaraousel/ThumbnailCarousel.js
@@ -0,0 +1,90 @@
+import React from 'react';
+import Slider from 'react-slick';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import 'ba-styles/vendors/slick-carousel/slick-carousel.css';
+import 'ba-styles/vendors/slick-carousel/slick.css';
+import 'ba-styles/vendors/slick-carousel/slick-theme.css';
+import imgData from 'ba-api/imgData';
+
+import { FormControl, MenuItem, InputLabel, Select } from '@material-ui/core';
+
+const styles = ({
+ root: {
+ display: 'flex',
+ flexDirection: 'column',
+ justifyContent: 'center'
+ },
+ formControl: {
+ width: '50%',
+ margin: '0 auto'
+ },
+ item: {
+ textAlign: 'center',
+ '& img': {
+ margin: '10px auto'
+ }
+ }
+});
+
+const getThumb = imgData.map(a => a.thumb);
+
+class ThumbnailCarousel extends React.Component {
+ state = {
+ transition: 'slide'
+ }
+
+ handleChange = event => {
+ this.setState({ [event.target.name]: event.target.value });
+ };
+
+ render() {
+ const { classes } = this.props;
+ const { transition } = this.state;
+ const settings = {
+ customPaging: (i) => (
+
+
+
+ ),
+ infinite: true,
+ dots: true,
+ slidesToShow: 1,
+ slidesToScroll: 1,
+ fade: this.state.transition === 'fade',
+ };
+ return (
+
+
+ Carousel Transition
+
+ Slide
+ Fade
+
+
+
+
+ {imgData.map((item, index) => (
+
+
+
+ ))}
+
+
+
+ );
+ }
+}
+
+ThumbnailCarousel.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(ThumbnailCarousel);
diff --git a/front/odiparpack/app/containers/UiElements/demos/SliderCaraousel/VerticalCarousel.js b/front/odiparpack/app/containers/UiElements/demos/SliderCaraousel/VerticalCarousel.js
new file mode 100644
index 0000000..36dd7c3
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/SliderCaraousel/VerticalCarousel.js
@@ -0,0 +1,48 @@
+import React from 'react';
+import Slider from 'react-slick';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import imgData from 'ba-api/imgData';
+import 'ba-styles/vendors/slick-carousel/slick-carousel.css';
+import 'ba-styles/vendors/slick-carousel/slick.css';
+import 'ba-styles/vendors/slick-carousel/slick-theme.css';
+
+const styles = ({
+ item: {
+ textAlign: 'center',
+ '& img': {
+ margin: '10px auto'
+ }
+ }
+});
+
+class VerticalCarousel extends React.Component {
+ render() {
+ const { classes } = this.props;
+ const settings = {
+ infinite: true,
+ slidesToShow: 2,
+ slidesToScroll: 1,
+ vertical: true,
+ verticalSwiping: true,
+ swipeToSlide: true,
+ };
+ return (
+
+
+ {imgData.map((item, index) => (
+
+
+
+ ))}
+
+
+ );
+ }
+}
+
+VerticalCarousel.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(VerticalCarousel);
diff --git a/front/odiparpack/app/containers/UiElements/demos/Steppers/HorizontalLinear.js b/front/odiparpack/app/containers/UiElements/demos/Steppers/HorizontalLinear.js
new file mode 100644
index 0000000..db47ee1
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/Steppers/HorizontalLinear.js
@@ -0,0 +1,196 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import Type from 'ba-styles/Typography.scss';
+
+import {
+ Stepper,
+ Step,
+ StepLabel,
+ Button,
+ Typography,
+ FormGroup,
+ FormControlLabel,
+ Switch,
+ Divider,
+} from '@material-ui/core';
+
+const styles = theme => ({
+ root: {
+ width: '100%',
+ },
+ button: {
+ marginRight: theme.spacing(1),
+ },
+ instructions: {
+ marginTop: theme.spacing(1),
+ marginBottom: theme.spacing(1),
+ },
+});
+
+function getSteps() {
+ return ['Select campaign settings', 'Create an ad group', 'Create an ad'];
+}
+
+function getStepContent(step) {
+ switch (step) {
+ case 0:
+ return 'Select campaign settings...';
+ case 1:
+ return 'What is an ad group anyways?';
+ case 2:
+ return 'This is the bit I really care about!';
+ default:
+ return 'Unknown step';
+ }
+}
+
+class HorizontalLinear extends React.Component {
+ static propTypes = {
+ classes: PropTypes.object.isRequired,
+ };
+
+ state = {
+ activeStep: 0,
+ altLabel: false,
+ skipped: new Set(),
+ };
+
+ isStepOptional = step => (step === 1);
+
+ isStepSkipped(step) {
+ return this.state.skipped.has(step);
+ }
+
+ handleNext = () => {
+ const { activeStep } = this.state;
+ let { skipped } = this.state;
+ if (this.isStepSkipped(activeStep)) {
+ skipped = new Set(skipped.values());
+ skipped.delete(activeStep);
+ }
+ this.setState({
+ activeStep: activeStep + 1,
+ skipped,
+ });
+ };
+
+ handleBack = () => {
+ const { activeStep } = this.state;
+ this.setState({
+ activeStep: activeStep - 1,
+ });
+ };
+
+ handleSkip = () => {
+ const { activeStep } = this.state;
+ if (!this.isStepOptional(activeStep)) {
+ // You probably want to guard against something like this,
+ // it should never occur unless someone's actively trying to break something.
+ throw new Error("You can't skip a step that isn't optional.");
+ }
+ const skipped = new Set(this.state.skipped.values());
+ skipped.add(activeStep);
+ this.setState({
+ activeStep: this.state.activeStep + 1,
+ skipped,
+ });
+ };
+
+ handleReset = () => {
+ this.setState({
+ activeStep: 0,
+ });
+ };
+
+ handleChange = name => event => {
+ this.setState({ [name]: event.target.checked });
+ };
+
+ render() {
+ const { classes } = this.props;
+ const steps = getSteps();
+ const { activeStep, altLabel } = this.state;
+
+ return (
+
+
+
+ )}
+ label="Alternative Design"
+ />
+
+
+
+ {steps.map((label, index) => {
+ const props = {};
+ const labelProps = {};
+ if (this.isStepOptional(index)) {
+ labelProps.optional = Optional ;
+ }
+ if (this.isStepSkipped(index)) {
+ props.completed = false;
+ }
+ return (
+
+ {label}
+
+ );
+ })}
+
+
+
+ {activeStep === steps.length ? (
+
+
+ All steps completed - you"re finished
+
+
+ Reset
+
+
+ ) : (
+
+
{getStepContent(activeStep)}
+
+
+ Back
+
+ {this.isStepOptional(activeStep) && (
+
+ Skip
+
+ )}
+
+ {activeStep === steps.length - 1 ? 'Finish' : 'Next'}
+
+
+
+ )}
+
+
+ );
+ }
+}
+
+export default withStyles(styles)(HorizontalLinear);
diff --git a/front/odiparpack/app/containers/UiElements/demos/Steppers/HorizontalNonLinear.js b/front/odiparpack/app/containers/UiElements/demos/Steppers/HorizontalNonLinear.js
new file mode 100644
index 0000000..3c72df3
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/Steppers/HorizontalNonLinear.js
@@ -0,0 +1,213 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+
+import {
+ Stepper,
+ Step,
+ StepButton,
+ Button,
+ Divider,
+ FormGroup,
+ FormControlLabel,
+ Switch,
+ Typography,
+} from '@material-ui/core';
+
+const styles = theme => ({
+ root: {
+ width: '100%',
+ },
+ button: {
+ marginRight: theme.spacing(1),
+ },
+ completed: {
+ display: 'inline-block',
+ },
+ instructions: {
+ marginTop: theme.spacing(1),
+ marginBottom: theme.spacing(1),
+ },
+ stepItem: {
+ whiteSpace: 'inherit'
+ }
+});
+
+function getSteps() {
+ return ['Select campaign settings', 'Create an ad group', 'Create an ad'];
+}
+
+function getStepContent(step) {
+ switch (step) {
+ case 0:
+ return 'Step 1: Select campaign settings...';
+ case 1:
+ return 'Step 2: What is an ad group anyways?';
+ case 2:
+ return 'Step 3: This is the bit I really care about!';
+ default:
+ return 'Unknown step';
+ }
+}
+
+class HorizontalNonLinear extends React.Component {
+ state = {
+ activeStep: 0,
+ altLabel: false,
+ completed: {},
+ };
+
+ completedSteps() {
+ return Object.keys(this.state.completed).length;
+ }
+
+ totalSteps = () => (
+ getSteps().length
+ );
+
+ isLastStep() {
+ return this.state.activeStep === this.totalSteps() - 1;
+ }
+
+ allStepsCompleted() {
+ return this.completedSteps() === this.totalSteps();
+ }
+
+ handleNext = () => {
+ let activeStep;
+
+ if (this.isLastStep() && !this.allStepsCompleted()) {
+ // It's the last step, but not all steps have been completed,
+ // find the first step that has been completed
+ const steps = getSteps();
+ activeStep = steps.findIndex((step, i) => !(i in this.state.completed));
+ } else {
+ activeStep = this.state.activeStep + 1;
+ }
+ this.setState({
+ activeStep,
+ });
+ };
+
+ handleBack = () => {
+ const { activeStep } = this.state;
+ this.setState({
+ activeStep: activeStep - 1,
+ });
+ };
+
+ handleStep = step => () => {
+ this.setState({
+ activeStep: step,
+ });
+ };
+
+ handleComplete = () => {
+ const { completed } = this.state;
+ completed[this.state.activeStep] = true;
+ this.setState({
+ completed,
+ });
+ this.handleNext();
+ };
+
+ handleReset = () => {
+ this.setState({
+ activeStep: 0,
+ completed: {},
+ });
+ };
+
+ handleChange = name => event => {
+ this.setState({ [name]: event.target.checked });
+ };
+
+ render() {
+ const { classes } = this.props;
+ const steps = getSteps();
+ const { activeStep, altLabel } = this.state;
+
+ return (
+
+
+
+ )}
+ label="Alternative Design"
+ />
+
+
+
+ {steps.map((label, index) => (
+
+
+ {label}
+
+
+ ))}
+
+
+
+ {this.allStepsCompleted() ? (
+
+
+ All steps completed - you"re finished
+
+ Reset
+
+ ) : (
+
+
{getStepContent(activeStep)}
+
+
+ Back
+
+
+ Next
+
+ {activeStep !== steps.length
+ && (this.state.completed[this.state.activeStep] ? (
+
+ Step
+ {' '}
+ {activeStep + 1}
+ {' '}
+already completed
+
+ ) : (
+
+ {this.completedSteps() === this.totalSteps() - 1 ? 'Finish' : 'Complete Step'}
+
+ ))}
+
+
+ )}
+
+
+ );
+ }
+}
+
+HorizontalNonLinear.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(HorizontalNonLinear);
diff --git a/front/odiparpack/app/containers/UiElements/demos/Steppers/MobileSteppers.js b/front/odiparpack/app/containers/UiElements/demos/Steppers/MobileSteppers.js
new file mode 100644
index 0000000..c9d7cf1
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/Steppers/MobileSteppers.js
@@ -0,0 +1,116 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import KeyboardArrowLeft from '@material-ui/icons/KeyboardArrowLeft';
+import KeyboardArrowRight from '@material-ui/icons/KeyboardArrowRight';
+
+import { MobileStepper, Button, Grid, Typography } from '@material-ui/core';
+
+const styles = theme => ({
+ root: {
+ [theme.breakpoints.up('sm')]: {
+ width: 400,
+ margin: '0 auto'
+ },
+ flexGrow: 1,
+ },
+ title: {
+ textAlign: 'center',
+ margin: `${theme.spacing(4)}px 0 ${theme.spacing(2)}px`,
+ },
+});
+
+class MobileSteppers extends React.Component {
+ state = {
+ activeStepDots: 0,
+ activeStepLine: 0,
+ };
+
+ handleNextDots = () => {
+ this.setState({
+ activeStepDots: this.state.activeStepDots + 1,
+ });
+ };
+
+ handleBackDots = () => {
+ this.setState({
+ activeStepDots: this.state.activeStepDots - 1,
+ });
+ };
+
+ handleNextLine = () => {
+ this.setState({
+ activeStepLine: this.state.activeStepLine + 1,
+ });
+ };
+
+ handleBackLine = () => {
+ this.setState({
+ activeStepLine: this.state.activeStepLine - 1,
+ });
+ };
+
+ render() {
+ const { classes, theme } = this.props;
+
+ return (
+
+
+
+ Mobile Stepper - Dots
+
+
+ Next
+ {theme.direction === 'rtl' ? : }
+
+ )}
+ backButton={(
+
+ {theme.direction === 'rtl' ? : }
+ Back
+
+ )}
+ />
+
+
+
+ Mobile Stepper - Progress
+
+
+ Next
+ {theme.direction === 'rtl' ? : }
+
+ )}
+ backButton={(
+
+ {theme.direction === 'rtl' ? : }
+ Back
+
+ )}
+ />
+
+
+ );
+ }
+}
+
+MobileSteppers.propTypes = {
+ classes: PropTypes.object.isRequired,
+ theme: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles, { withTheme: true })(MobileSteppers);
diff --git a/front/odiparpack/app/containers/UiElements/demos/Steppers/StepperCarousel.js b/front/odiparpack/app/containers/UiElements/demos/Steppers/StepperCarousel.js
new file mode 100644
index 0000000..0f127b3
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/Steppers/StepperCarousel.js
@@ -0,0 +1,187 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import KeyboardArrowLeft from '@material-ui/icons/KeyboardArrowLeft';
+import KeyboardArrowRight from '@material-ui/icons/KeyboardArrowRight';
+import SwipeableViews from 'react-swipeable-views';
+import imgApi from 'ba-api/images';
+
+import { MobileStepper, Paper, Typography, Button, Grid } from '@material-ui/core';
+
+const tutorialSteps = [
+ {
+ label: 'How to be happy :)',
+ imgPath: imgApi[45],
+ },
+ {
+ label: '1. Work with something that you like, like…',
+ imgPath: imgApi[33],
+ },
+ {
+ label: '2. Keep your friends close to you and hangout with them',
+ imgPath: imgApi[14],
+ },
+ {
+ label: '3. Travel everytime that you have a chance',
+ imgPath: imgApi[9],
+ },
+ {
+ label: '4. And contribute to Material-UI :D',
+ imgPath: imgApi[44],
+ },
+];
+
+const styles = theme => ({
+ root: {
+ [theme.breakpoints.up('sm')]: {
+ width: 400,
+ },
+ flexGrow: 1,
+ },
+ header: {
+ textAlign: 'center',
+ height: 50,
+ paddingLeft: theme.spacing(4),
+ marginBottom: 20,
+ backgroundColor: theme.palette.background.default,
+ },
+ img: {
+ height: 255,
+ maxWidth: 400,
+ overflow: 'hidden',
+ width: '100%',
+ margin: '0 auto'
+ },
+ figure: {
+ maxWidth: 400,
+ overflow: 'hidden',
+ margin: '0 auto'
+ },
+ mobileStepper: {
+ [theme.breakpoints.up('sm')]: {
+ width: 400,
+ },
+ margin: '0 auto',
+ textAlign: 'center'
+ }
+});
+
+class StepperCarousel extends React.Component {
+ state = {
+ activeStep: 0,
+ activeStepSwipe: 0,
+ };
+
+ handleNext = () => {
+ this.setState(prevState => ({
+ activeStep: prevState.activeStep + 1,
+ }));
+ };
+
+ handleBack = () => {
+ this.setState(prevState => ({
+ activeStep: prevState.activeStep - 1,
+ }));
+ };
+
+ handleNextSwipe = () => {
+ this.setState(prevState => ({
+ activeStepSwipe: prevState.activeStepSwipe + 1,
+ }));
+ };
+
+ handleBackSwipe = () => {
+ this.setState(prevState => ({
+ activeStepSwipe: prevState.activeStepSwipe - 1,
+ }));
+ };
+
+ handleStepChangeSwipe = activeStepSwipe => {
+ this.setState({ activeStepSwipe });
+ };
+
+ render() {
+ const { classes, theme } = this.props;
+ const { activeStep, activeStepSwipe } = this.state;
+
+ const maxSteps = tutorialSteps.length;
+ const maxStepsSwipe = tutorialSteps.length;
+
+ return (
+
+
+
+ {tutorialSteps[activeStep].label}
+
+
+
+ Next
+ {theme.direction === 'rtl' ? : }
+
+ )}
+ backButton={(
+
+ {theme.direction === 'rtl' ? : }
+ Back
+
+ )}
+ />
+
+
+
+ {tutorialSteps[activeStepSwipe].label}
+
+
+ {tutorialSteps.map((step, index) => (
+
+
+
+ ))}
+
+
+ Next
+ {theme.direction === 'rtl' ? : }
+
+ )}
+ backButton={(
+
+ {theme.direction === 'rtl' ? : }
+ Back
+
+ )}
+ />
+
+
+ );
+ }
+}
+
+StepperCarousel.propTypes = {
+ classes: PropTypes.object.isRequired,
+ theme: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles, { withTheme: true })(StepperCarousel);
diff --git a/front/odiparpack/app/containers/UiElements/demos/Steppers/StepperError.js b/front/odiparpack/app/containers/UiElements/demos/Steppers/StepperError.js
new file mode 100644
index 0000000..85630a1
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/Steppers/StepperError.js
@@ -0,0 +1,178 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import { Stepper, Step, StepLabel, Button, Typography } from '@material-ui/core';
+
+const styles = theme => ({
+ root: {
+ width: '100%',
+ },
+ button: {
+ marginRight: theme.spacing(1),
+ },
+ instructions: {
+ marginTop: theme.spacing(1),
+ marginBottom: theme.spacing(1),
+ },
+});
+
+function getSteps() {
+ return ['Select campaign settings', 'Create an ad group', 'Create an ad'];
+}
+
+function getStepContent(step) {
+ switch (step) {
+ case 0:
+ return 'Select campaign settings...';
+ case 1:
+ return 'What is an ad group anyways?';
+ case 2:
+ return 'This is the bit I really care about!';
+ default:
+ return 'Unknown step';
+ }
+}
+
+class StepperError extends React.Component {
+ static propTypes = {
+ classes: PropTypes.object.isRequired,
+ };
+
+ state = {
+ activeStep: 0,
+ skipped: new Set(),
+ };
+
+ isStepOptional = step => (
+ step === 1
+ );
+
+ isStepSkipped(step) {
+ return this.state.skipped.has(step);
+ }
+
+ isStepFailed = step => (
+ step === 1
+ );
+
+ handleNext = () => {
+ const { activeStep } = this.state;
+ let { skipped } = this.state;
+ if (this.isStepSkipped(activeStep)) {
+ skipped = new Set(skipped.values());
+ skipped.delete(activeStep);
+ }
+ this.setState({
+ activeStep: activeStep + 1,
+ skipped,
+ });
+ };
+
+ handleBack = () => {
+ const { activeStep } = this.state;
+ this.setState({
+ activeStep: activeStep - 1,
+ });
+ };
+
+ handleSkip = () => {
+ const { activeStep } = this.state;
+ if (!this.isStepOptional(activeStep)) {
+ // You probably want to guard against something like this,
+ // it should never occur unless someone's actively trying to break something.
+ throw new Error("You can't skip a step that isn't optional.");
+ }
+ const skipped = new Set(this.state.skipped.values());
+ skipped.add(activeStep);
+ this.setState({
+ activeStep: this.state.activeStep + 1,
+ skipped,
+ });
+ };
+
+ handleReset = () => {
+ this.setState({
+ activeStep: 0,
+ });
+ };
+
+ render() {
+ const { classes } = this.props;
+ const steps = getSteps();
+ const { activeStep } = this.state;
+
+ return (
+
+
+ {steps.map((label, index) => {
+ const props = {};
+ const labelProps = {};
+ if (this.isStepOptional(index)) {
+ labelProps.optional = (
+
+ Alert message
+
+ );
+ }
+ if (this.isStepFailed(index)) {
+ labelProps.error = true;
+ }
+ if (this.isStepSkipped(index)) {
+ props.completed = false;
+ }
+ return (
+
+ {label}
+
+ );
+ })}
+
+
+ {activeStep === steps.length ? (
+
+
+ All steps completed - you"re finished
+
+
+ Reset
+
+
+ ) : (
+
+
{getStepContent(activeStep)}
+
+
+ Back
+
+ {this.isStepOptional(activeStep) && (
+
+ Skip
+
+ )}
+
+ {activeStep === steps.length - 1 ? 'Finish' : 'Next'}
+
+
+
+ )}
+
+
+ );
+ }
+}
+
+export default withStyles(styles)(StepperError);
diff --git a/front/odiparpack/app/containers/UiElements/demos/Steppers/VerticalStepper.js b/front/odiparpack/app/containers/UiElements/demos/Steppers/VerticalStepper.js
new file mode 100644
index 0000000..5a2314b
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/Steppers/VerticalStepper.js
@@ -0,0 +1,120 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import { Stepper, Step, StepLabel, StepContent, Button, Paper, Typography } from '@material-ui/core';
+
+const styles = theme => ({
+ root: {
+ width: '90%',
+ },
+ button: {
+ marginTop: theme.spacing(1),
+ marginRight: theme.spacing(1),
+ },
+ actionsContainer: {
+ marginBottom: theme.spacing(2),
+ },
+ resetContainer: {
+ padding: theme.spacing(3),
+ },
+});
+
+function getSteps() {
+ return ['Select campaign settings', 'Create an ad group', 'Create an ad'];
+}
+
+function getStepContent(step) {
+ switch (step) {
+ case 0:
+ return `For each ad campaign that you create, you can control how much
+ you're willing to spend on clicks and conversions, which networks
+ and geographical locations you want your ads to show on, and more.`;
+ case 1:
+ return 'An ad group contains one or more ads which target a shared set of keywords.';
+ case 2:
+ return `Try out different ad text to see what brings in the most customers,
+ and learn how to enhance your ads using features like ad extensions.
+ If you run into any problems with your ads, find out how to tell if
+ they're running and how to resolve approval issues.`;
+ default:
+ return 'Unknown step';
+ }
+}
+
+class VerticalStepper extends React.Component {
+ state = {
+ activeStep: 0,
+ };
+
+ handleNext = () => {
+ this.setState({
+ activeStep: this.state.activeStep + 1,
+ });
+ };
+
+ handleBack = () => {
+ this.setState({
+ activeStep: this.state.activeStep - 1,
+ });
+ };
+
+ handleReset = () => {
+ this.setState({
+ activeStep: 0,
+ });
+ };
+
+ render() {
+ const { classes } = this.props;
+ const steps = getSteps();
+ const { activeStep } = this.state;
+
+ return (
+
+
+ {steps.map((label, index) => (
+
+ {label}
+
+ {getStepContent(index)}
+
+
+
+ Back
+
+
+ {activeStep === steps.length - 1 ? 'Finish' : 'Next'}
+
+
+
+
+
+ ))}
+
+ {activeStep === steps.length && (
+
+ All steps completed - you"re finished
+
+ Reset
+
+
+ )}
+
+ );
+ }
+}
+
+VerticalStepper.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(VerticalStepper);
diff --git a/front/odiparpack/app/containers/UiElements/demos/Tabs/BottomNav.js b/front/odiparpack/app/containers/UiElements/demos/Tabs/BottomNav.js
new file mode 100644
index 0000000..f3aa033
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/Tabs/BottomNav.js
@@ -0,0 +1,82 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import RestoreIcon from '@material-ui/icons/Restore';
+import FavoriteIcon from '@material-ui/icons/Favorite';
+import LocationOnIcon from '@material-ui/icons/LocationOn';
+
+import { Typography, Grid, BottomNavigation, BottomNavigationAction, Icon } from '@material-ui/core';
+
+const styles = theme => ({
+ root: {
+ width: 'auto',
+ },
+ divider: {
+ display: 'block',
+ margin: `${theme.spacing(3)}px 0`,
+ }
+});
+
+class BottomNav extends React.Component {
+ state = {
+ value: 0,
+ value2: 'recents',
+ };
+
+ handleChange = (event, value) => {
+ this.setState({ value });
+ };
+
+ handleChange2 = (event, value2) => {
+ this.setState({ value2 });
+ };
+
+
+ render() {
+ const { classes } = this.props;
+ const { value, value2 } = this.state;
+
+ return (
+
+
+ With Label
+
+
+ } />
+ } />
+ } />
+
+
+
+
+ Without Label
+
+
+ } />
+ } />
+ } />
+ folder} />
+
+
+
+
+ );
+ }
+}
+
+BottomNav.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(BottomNav);
diff --git a/front/odiparpack/app/containers/UiElements/demos/Tabs/CenteredTabs.js b/front/odiparpack/app/containers/UiElements/demos/Tabs/CenteredTabs.js
new file mode 100644
index 0000000..00a285e
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/Tabs/CenteredTabs.js
@@ -0,0 +1,46 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import { Paper, Tabs, Tab } from '@material-ui/core';
+
+const styles = {
+ root: {
+ flexGrow: 1,
+ },
+};
+
+class CenteredTabs extends React.Component {
+ state = {
+ value: 0,
+ };
+
+ handleChange = (event, value) => {
+ this.setState({ value });
+ };
+
+ render() {
+ const { classes } = this.props;
+
+ return (
+
+
+
+
+
+
+
+ );
+ }
+}
+
+CenteredTabs.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(CenteredTabs);
diff --git a/front/odiparpack/app/containers/UiElements/demos/Tabs/CustomTabs.js b/front/odiparpack/app/containers/UiElements/demos/Tabs/CustomTabs.js
new file mode 100644
index 0000000..96fd136
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/Tabs/CustomTabs.js
@@ -0,0 +1,101 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import { Tabs, Tab, Typography } from '@material-ui/core';
+
+const styles = theme => ({
+ root: {
+ flexGrow: 1,
+ backgroundColor: theme.palette.background.paper,
+ },
+ tabsRoot: {
+ borderBottom: '1px solid #e8e8e8',
+ },
+ tabsIndicator: {
+ backgroundColor: '#1890ff',
+ },
+ tabRoot: {
+ textTransform: 'initial',
+ minWidth: 64,
+ [theme.breakpoints.up('sm')]: {
+ minWidth: 72,
+ },
+ fontWeight: theme.typography.fontWeightRegular,
+ marginRight: theme.spacing(4),
+ fontFamily: [
+ '-apple-system',
+ 'BlinkMacSystemFont',
+ '"Segoe UI"',
+ 'Roboto',
+ '"Helvetica Neue"',
+ 'Arial',
+ 'sans-serif',
+ '"Apple Color Emoji"',
+ '"Segoe UI Emoji"',
+ '"Segoe UI Symbol"',
+ ].join(','),
+ '&:hover': {
+ color: '#40a9ff',
+ opacity: 1,
+ },
+ '&$tabSelected': {
+ color: '#1890ff',
+ fontWeight: theme.typography.fontWeightMedium,
+ },
+ '&:focus': {
+ color: '#40a9ff',
+ },
+ },
+ tabSelected: {},
+ typography: {
+ padding: theme.spacing(3),
+ },
+});
+
+class CustomTabs extends React.Component {
+ state = {
+ value: 0,
+ };
+
+ handleChange = (event, value) => {
+ this.setState({ value });
+ };
+
+ render() {
+ const { classes } = this.props;
+ const { value } = this.state;
+
+ return (
+
+
+
+
+
+
+ powered by Material-UI
+
+ );
+ }
+}
+
+CustomTabs.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(CustomTabs);
diff --git a/front/odiparpack/app/containers/UiElements/demos/Tabs/DisabledTab.js b/front/odiparpack/app/containers/UiElements/demos/Tabs/DisabledTab.js
new file mode 100644
index 0000000..17808a1
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/Tabs/DisabledTab.js
@@ -0,0 +1,31 @@
+import React from 'react';
+import { Paper, Tabs, Tab } from '@material-ui/core';
+
+class DisabledTab extends React.Component {
+ state = {
+ value: 2,
+ };
+
+ handleChange = (event, value) => {
+ this.setState({ value });
+ };
+
+ render() {
+ return (
+
+
+
+
+
+
+
+ );
+ }
+}
+
+export default DisabledTab;
diff --git a/front/odiparpack/app/containers/UiElements/demos/Tabs/FixedTabs.js b/front/odiparpack/app/containers/UiElements/demos/Tabs/FixedTabs.js
new file mode 100644
index 0000000..f64240f
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/Tabs/FixedTabs.js
@@ -0,0 +1,80 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import SwipeableViews from 'react-swipeable-views';
+import { AppBar, Tabs, Tab, Typography } from '@material-ui/core';
+
+function TabContainer({ children, dir }) {
+ return (
+
+ {children}
+
+ );
+}
+
+TabContainer.propTypes = {
+ children: PropTypes.node.isRequired,
+ dir: PropTypes.string.isRequired,
+};
+
+const styles = theme => ({
+ root: {
+ backgroundColor: theme.palette.background.paper,
+ [theme.breakpoints.up('sm')]: {
+ width: 500,
+ },
+ margin: '10px auto'
+ },
+});
+
+class FixedTabs extends React.Component {
+ state = {
+ value: 0,
+ };
+
+ handleChange = (event, value) => {
+ this.setState({ value });
+ };
+
+ handleChangeIndex = index => {
+ this.setState({ value: index });
+ };
+
+ render() {
+ const { classes, theme } = this.props;
+
+ return (
+
+
+
+
+
+
+
+
+
+ Item One
+ Item Two
+ Item Three
+
+
+ );
+ }
+}
+
+FixedTabs.propTypes = {
+ classes: PropTypes.object.isRequired,
+ theme: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles, { withTheme: true })(FixedTabs);
diff --git a/front/odiparpack/app/containers/UiElements/demos/Tabs/IconTabs.js b/front/odiparpack/app/containers/UiElements/demos/Tabs/IconTabs.js
new file mode 100644
index 0000000..ff97d16
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/Tabs/IconTabs.js
@@ -0,0 +1,61 @@
+import React from 'react';
+import PhoneIcon from '@material-ui/icons/Phone';
+import FavoriteIcon from '@material-ui/icons/Favorite';
+import PersonPinIcon from '@material-ui/icons/PersonPin';
+import { Paper, Grid, Tabs, Tab, Typography } from '@material-ui/core';
+
+export default class IconTabs extends React.Component {
+ state = {
+ value: 0,
+ value2: 0,
+ };
+
+ handleChange = (event, value) => {
+ this.setState({ value });
+ };
+
+ handleChange2 = (event, value2) => {
+ this.setState({ value2 });
+ };
+
+ render() {
+ return (
+
+
+
+ Without Text
+
+
+ } />
+ } />
+ } />
+
+
+
+
+ With Text
+
+
+ } label="RECENTS" />
+ } label="FAVORITES" />
+ } label="NEARBY" />
+
+
+
+
+
+ );
+ }
+}
diff --git a/front/odiparpack/app/containers/UiElements/demos/Tabs/LongTextTabs.js b/front/odiparpack/app/containers/UiElements/demos/Tabs/LongTextTabs.js
new file mode 100644
index 0000000..724ac03
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/Tabs/LongTextTabs.js
@@ -0,0 +1,59 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import { AppBar, Tabs, Tab, Typography } from '@material-ui/core';
+
+function TabContainer(props) {
+ return (
+
+ {props.children}
+
+ );
+}
+
+TabContainer.propTypes = {
+ children: PropTypes.node.isRequired,
+};
+
+const styles = theme => ({
+ root: {
+ flexGrow: 1,
+ backgroundColor: theme.palette.background.paper,
+ },
+});
+
+class LongTextTabs extends React.Component {
+ state = {
+ value: 'one',
+ };
+
+ handleChange = (event, value) => {
+ this.setState({ value });
+ };
+
+ render() {
+ const { classes } = this.props;
+ const { value } = this.state;
+
+ return (
+
+
+
+
+
+
+
+
+ {value === 'one' &&
Item One }
+ {value === 'two' &&
Item Two }
+ {value === 'three' &&
Item Three }
+
+ );
+ }
+}
+
+LongTextTabs.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(LongTextTabs);
diff --git a/front/odiparpack/app/containers/UiElements/demos/Tabs/ScrollIconTabs.js b/front/odiparpack/app/containers/UiElements/demos/Tabs/ScrollIconTabs.js
new file mode 100644
index 0000000..98f52d2
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/Tabs/ScrollIconTabs.js
@@ -0,0 +1,82 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import PhoneIcon from '@material-ui/icons/Phone';
+import FavoriteIcon from '@material-ui/icons/Favorite';
+import PersonPinIcon from '@material-ui/icons/PersonPin';
+import HelpIcon from '@material-ui/icons/Help';
+import ShoppingBasket from '@material-ui/icons/ShoppingBasket';
+import ThumbDown from '@material-ui/icons/ThumbDown';
+import ThumbUp from '@material-ui/icons/ThumbUp';
+import { AppBar, Tabs, Tab, Typography } from '@material-ui/core';
+
+function TabContainer(props) {
+ return (
+
+ {props.children}
+
+ );
+}
+
+TabContainer.propTypes = {
+ children: PropTypes.node.isRequired,
+};
+
+const styles = theme => ({
+ root: {
+ flexGrow: 1,
+ width: '100%',
+ backgroundColor: theme.palette.background.paper,
+ },
+});
+
+class ScrollIconTabs extends React.Component {
+ state = {
+ value: 0,
+ };
+
+ handleChange = (event, value) => {
+ this.setState({ value });
+ };
+
+ render() {
+ const { classes } = this.props;
+ const { value } = this.state;
+
+ return (
+
+
+
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+
+
+ {value === 0 &&
Item One }
+ {value === 1 &&
Item Two }
+ {value === 2 &&
Item Three }
+ {value === 3 &&
Item Four }
+ {value === 4 &&
Item Five }
+ {value === 5 &&
Item Six }
+ {value === 6 &&
Item Seven }
+
+ );
+ }
+}
+
+ScrollIconTabs.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(ScrollIconTabs);
diff --git a/front/odiparpack/app/containers/UiElements/demos/Tabs/ScrollTabs.js b/front/odiparpack/app/containers/UiElements/demos/Tabs/ScrollTabs.js
new file mode 100644
index 0000000..f7f9477
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/Tabs/ScrollTabs.js
@@ -0,0 +1,75 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import { AppBar, Tabs, Tab, Typography } from '@material-ui/core';
+
+function TabContainer(props) {
+ return (
+
+ {props.children}
+
+ );
+}
+
+TabContainer.propTypes = {
+ children: PropTypes.node.isRequired,
+};
+
+const styles = theme => ({
+ root: {
+ flexGrow: 1,
+ width: '100%',
+ backgroundColor: theme.palette.background.paper,
+ },
+});
+
+class ScrollTabs extends React.Component {
+ state = {
+ value: 0,
+ };
+
+ handleChange = (event, value) => {
+ this.setState({ value });
+ };
+
+ render() {
+ const { classes } = this.props;
+ const { value } = this.state;
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+ {value === 0 &&
Item One }
+ {value === 1 &&
Item Two }
+ {value === 2 &&
Item Three }
+ {value === 3 &&
Item Four }
+ {value === 4 &&
Item Five }
+ {value === 5 &&
Item Six }
+ {value === 6 &&
Item Seven }
+
+ );
+ }
+}
+
+ScrollTabs.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(ScrollTabs);
diff --git a/front/odiparpack/app/containers/UiElements/demos/Tabs/SimpleTabs.js b/front/odiparpack/app/containers/UiElements/demos/Tabs/SimpleTabs.js
new file mode 100644
index 0000000..fd791cc
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/Tabs/SimpleTabs.js
@@ -0,0 +1,59 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import { AppBar, Tabs, Tab, Typography } from '@material-ui/core';
+
+function TabContainer(props) {
+ return (
+
+ {props.children}
+
+ );
+}
+
+TabContainer.propTypes = {
+ children: PropTypes.node.isRequired,
+};
+
+const styles = theme => ({
+ root: {
+ flexGrow: 1,
+ backgroundColor: theme.palette.background.paper,
+ },
+});
+
+class SimpleTabs extends React.Component {
+ state = {
+ value: 0,
+ };
+
+ handleChange = (event, value) => {
+ this.setState({ value });
+ };
+
+ render() {
+ const { classes } = this.props;
+ const { value } = this.state;
+
+ return (
+
+
+
+
+
+
+
+
+ {value === 0 &&
Item One }
+ {value === 1 &&
Item Two }
+ {value === 2 &&
Item Three }
+
+ );
+ }
+}
+
+SimpleTabs.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(SimpleTabs);
diff --git a/front/odiparpack/app/containers/UiElements/demos/Tags/ArrayTags.js b/front/odiparpack/app/containers/UiElements/demos/Tags/ArrayTags.js
new file mode 100644
index 0000000..921a668
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/Tags/ArrayTags.js
@@ -0,0 +1,78 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import TagFacesIcon from '@material-ui/icons/TagFaces';
+
+import { Avatar, Chip, Paper } from '@material-ui/core';
+
+const styles = theme => ({
+ root: {
+ display: 'flex',
+ justifyContent: 'center',
+ flexWrap: 'wrap',
+ padding: theme.spacing(0.5),
+ },
+ chip: {
+ margin: theme.spacing(0.5),
+ },
+});
+
+class ArrayTags extends React.Component {
+ state = {
+ chipData: [
+ { key: 0, label: 'Angular' },
+ { key: 1, label: 'jQuery' },
+ { key: 2, label: 'Polymer' },
+ { key: 3, label: 'React' },
+ { key: 4, label: 'Vue.js' },
+ ],
+ };
+
+ handleDelete = data => () => {
+ if (data.label === 'React') {
+ alert('Why would you want to delete React?! :)'); // eslint-disable-line no-alert
+ return;
+ }
+
+ const chipData = [...this.state.chipData];
+ const chipToDelete = chipData.indexOf(data);
+ chipData.splice(chipToDelete, 1);
+ this.setState({ chipData });
+ };
+
+ render() {
+ const { classes } = this.props;
+
+ return (
+
+ {this.state.chipData.map(data => {
+ let avatar = null;
+
+ if (data.label === 'React') {
+ avatar = (
+
+
+
+ );
+ }
+
+ return (
+
+ );
+ })}
+
+ );
+ }
+}
+
+ArrayTags.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(ArrayTags);
diff --git a/front/odiparpack/app/containers/UiElements/demos/Tags/BasicTags.js b/front/odiparpack/app/containers/UiElements/demos/Tags/BasicTags.js
new file mode 100644
index 0000000..f2e3693
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/Tags/BasicTags.js
@@ -0,0 +1,72 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import FaceIcon from '@material-ui/icons/Face';
+import DoneIcon from '@material-ui/icons/Done';
+
+import { Avatar, Chip } from '@material-ui/core';
+
+const styles = theme => ({
+ root: {
+ display: 'flex',
+ justifyContent: 'center',
+ flexWrap: 'wrap',
+ },
+ chip: {
+ margin: theme.spacing(1),
+ },
+});
+
+function handleDelete() {
+ alert('You clicked the delete icon.'); // eslint-disable-line no-alert
+}
+
+function handleClick() {
+ alert('You clicked the Chip.'); // eslint-disable-line no-alert
+}
+
+function BasicTags(props) {
+ const { classes } = props;
+ return (
+
+
+ MB}
+ label="Clickable Tag"
+ onClick={handleClick}
+ className={classes.chip}
+ color="primary"
+ />
+ }
+ label="Deletable Tag"
+ onDelete={handleDelete}
+ className={classes.chip}
+ />
+
+
+
+ )}
+ label="Clickable Deletable Tag"
+ onClick={handleClick}
+ onDelete={handleDelete}
+ className={classes.chip}
+ />
+ }
+ />
+
+ );
+}
+
+BasicTags.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(BasicTags);
diff --git a/front/odiparpack/app/containers/UiElements/demos/Typography/AlignTypo.js b/front/odiparpack/app/containers/UiElements/demos/Typography/AlignTypo.js
new file mode 100644
index 0000000..38088a9
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/Typography/AlignTypo.js
@@ -0,0 +1,46 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import Type from 'ba-styles/Typography.scss';
+import { Typography, Divider } from '@material-ui/core';
+
+const styles = theme => ({
+ divider: {
+ display: 'block',
+ margin: `${theme.spacing(3)}px 0`,
+ }
+});
+
+class AlignTypo extends React.Component {
+ render() {
+ const { classes } = this.props;
+ return (
+
+
+ Align center: Nullam in
+ tortor
+ ligula
+
+
+
+ Align Left
+
+
+ Align Right
+
+
+
Justify Align
+
+ Vestibulum faucibus eget erat eget pretium. Donec commodo convallis ligula, eget suscipit orci. Suspendisse potenti.
+ Nulla eget lobortis lacus. Aliquam venenatis magna et odio lobortis maximus. Nullam in tortor ligula. Proin maximus risus nunc, eu aliquam nibh tempus a. Interdum et malesuada fames ac ante ipsum primis in faucibus.
+
+
+ );
+ }
+}
+
+AlignTypo.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(AlignTypo);
diff --git a/front/odiparpack/app/containers/UiElements/demos/Typography/ColouredTypo.js b/front/odiparpack/app/containers/UiElements/demos/Typography/ColouredTypo.js
new file mode 100644
index 0000000..b7b1516
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/Typography/ColouredTypo.js
@@ -0,0 +1,35 @@
+import React from 'react';
+import Type from 'ba-styles/Typography.scss';
+import { Typography } from '@material-ui/core';
+
+class ColouredTypo extends React.Component {
+ render() {
+ return (
+
+
+ Ut sed eros finibus
+
+
+ Nulla eget lobortis lacus. Aliquam venenatis magna et odio lobortis maximus.
+
+
+ Aliquam nec ex aliquet
+
+
+ Aenean facilisis vitae purus facilisis semper
+
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse sed urna in justo euismod condimentum.
+
+
+ Vivamus et luctus mauris. Maecenas nisl libero, tincidunt id odio id, feugiat vulputate quam.
+
+
+ Curabitur egestas consequat lorem, vel fermentum augue porta id.
+
+
+ );
+ }
+}
+
+export default ColouredTypo;
diff --git a/front/odiparpack/app/containers/UiElements/demos/Typography/GeneralTypo.js b/front/odiparpack/app/containers/UiElements/demos/Typography/GeneralTypo.js
new file mode 100644
index 0000000..6a1079f
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/Typography/GeneralTypo.js
@@ -0,0 +1,139 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import classNames from 'classnames';
+import { withStyles } from '@material-ui/core/styles';
+import Type from 'ba-styles/Typography.scss';
+import { Typography, Divider } from '@material-ui/core';
+
+const background = {
+ width: '100%',
+ maxWidth: 500,
+ background:
+ 'transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAICAYAAAA4GpVBAAAMKGlDQ1BJQ0MgUHJvZmlsZQAASMetl3dUU8kex+eWJCQktEAoUkJvovQqNbQIAlIFGyEJJJQYEoKKHRUVWAsqFqzoqoiiawFkURELtkWx9wUVFGVdLNhQeZME0PW998c75805c+dzfvc3v/n+7p2ZewcA9RiOWJyNagCQI8qTxIYFMSckpzBJHYACMKAFrIANhysVB8bERAJYhtp/lve3ACJvrzvIY4H/rWjy+FIuAEgM5DSelJsD+QgAuDtXLMkDgNAD7ebT88SQiVAl0JZAgZAt5JyhZE85pyk5UuETH8uCnAqACpXDkWQAoCbXxcznZsA4aqWQHUU8oQhyI2Q/roDDg/wF8sicnGmQ1W0g26T9ECfjHzHThmNyOBnDrMxFUVSChVJxNmcm+H+XnGzZ0BjmsFIFkvBYec7y55Y1LULOVMjnRWlR0ZC1IN8Q8hT+cu4SyMITBv0/cqUs+MwAAwCUyuMER0A2hGwmy0oIHGQ/jkTRF/qjKQWC+CRlfFQkmRY7GB8tEGVHRQ7GKRXw2UNcyZeGxA35pAtD2ZDhO0TrhXns+MGY5/OFiVGQ1SA/kGbFRQz2fVEgYEUNjyWLlWuG7xwDOdKhXDCLdElorNIfcxcI2VGD9sg8QXy4si82hctRaNCDnMmXTogc0sPjB4co9WCFfFHCoE6sTJwXFDvov1OcHTPojzXys8PkdjPIrdL8uKG+vXlwsilzwUEmZ2yMclxcW5wXE6/UhjNBJGCBYMAEMljTwDSQCYStPXU9YOhOKOAACcgAfOAwaBnqkaS4I4LXOFAA/oLEB9LhfkGKu3yQD+1fh63KqwNIV9zNV/TIAl2Qc3AD3A/3wSPhNQBWZ9wT9xrqx1QfGpUYQgwmhhNDibZThYWSn+IyARdmkA2rBETAlg+zkmsQDWn/HofQRWgjPCbcJLQT7oJE8BT6Cf8tw+/RhMO2caAdRg0dzC7tx+xwK6jaDQ/CfaF+qB1n4AbAAXeFmQTi/jA3N2j9/tT+k3bZkGqyIxkl65IDyDY/+6nZqbkN95Hn9qNOpa604UxYw3d+Ho31Q2482Eb87IktxQ5jLdgp7ALWiNUBJnYSq8cuY8flPDw3nirmxtBosQo9WTCOcMjHsdqx2/HLT2NzBseXKN4/yOPPyJMvHNY08UyJMEOQxwyEuzWfyRZxR41kOjs6eQAg3/uVW8tbhmJPRxgXv9sK3wHgyxsYGGj8bouEa/LIYgAoXd9t1ifgctYF4HwJVybJV9pw+YUAvyrqcKXoA2O4d9nAjJyBO/ABASAEjAXRIB4kgynwOQtADlQ9HcwGC0ARKAErwVqwEWwFO8AesB8cAnWgEZwC58AlcBXcBPfhXOkEL0EveA/6EQQhITSEjugjJoglYo84I56IHxKCRCKxSDKSimQgIkSGzEYWIiVIGbIR2Y5UIb8hx5BTyAWkDbmLdCDdyBvkM4qhVFQbNUKt0NGoJxqIRqDx6GQ0A81FC9BF6HJ0PVqJ7kNr0VPoJfQm2o6+RPswgKliDMwUc8A8MRYWjaVg6ZgEm4sVY+VYJVaDNcA3fR1rx3qwTzgRp+NM3AHO13A8AefiufhcvBTfiO/Ba/Ez+HW8A+/FvxFoBEOCPcGbwCZMIGQQphOKCOWEXYSjhLNwTXUS3hOJRAbRmugB12oyMZM4i1hK3Ew8QGwithGfEPtIJJI+yZ7kS4omcUh5pCLSBtI+0knSNVIn6aOKqoqJirNKqEqKikilUKVcZa/KCZVrKs9U+skaZEuyNzmazCPPJK8g7yQ3kK+QO8n9FE2KNcWXEk/JpCygrKfUUM5SHlDeqqqqmql6qY5XFarOV12velD1vGqH6ieqFtWOyqJOosqoy6m7qU3Uu9S3NBrNihZAS6Hl0ZbTqminaY9oH9XoaqPU2Go8tXlqFWq1atfUXqmT1S3VA9WnqBeol6sfVr+i3qNB1rDSYGlwNOZqVGgc07it0adJ13TSjNbM0SzV3Kt5QfO5FknLSitEi6e1SGuH1mmtJ3SMbk5n0bn0hfSd9LP0Tm2itrU2WztTu0R7v3ardq+Olo6rTqLODJ0KneM67QyMYcVgM7IZKxiHGLcYn3WNdAN1+brLdGt0r+l+0BuhF6DH1yvWO6B3U++zPlM/RD9Lf5V+nf5DA9zAzmC8wXSDLQZnDXpGaI/wGcEdUTzi0Ih7hqihnWGs4SzDHYaXDfuMjI3CjMRGG4xOG/UYM4wDjDON1xifMO42oZv4mQhN1picNHnB1GEGMrOZ65lnmL2mhqbhpjLT7aatpv1m1mYJZoVmB8wemlPMPc3TzdeYN5v3WphYjLOYbVFtcc+SbOlpKbBcZ9li+cHK2irJaolVndVzaz1rtnWBdbX1Axuajb9Nrk2lzQ1boq2nbZbtZturdqidm53ArsLuij1q724vtN9s3zaSMNJrpGhk5cjbDlSHQId8h2qHjlGMUZGjCkfVjXo12mJ0yuhVo1tGf3N0c8x23Ol430nLaaxToVOD0xtnO2euc4XzDReaS6jLPJd6l9eu9q581y2ud9zobuPclrg1u31193CXuNe4d3tYeKR6bPK47antGeNZ6nnei+AV5DXPq9Hrk7e7d573Ie+/fRx8snz2+jwfYz2GP2bnmCe+Zr4c3+2+7X5Mv1S/bX7t/qb+HP9K/8cB5gG8gF0BzwJtAzMD9wW+CnIMkgQdDfrA8mbNYTUFY8FhwcXBrSFaIQkhG0MehZqFZoRWh/aGuYXNCmsKJ4RHhK8Kv802YnPZVezesR5j54w9E0GNiIvYGPE40i5SEtkwDh03dtzqcQ+iLKNEUXXRIJodvTr6YYx1TG7M7+OJ42PGV4zvinWKnR3bEkePmxq3N+59fFD8ivj7CTYJsoTmRPXESYlViR+SgpPKktonjJ4wZ8KlZINkYXJ9CiklMWVXSt/EkIlrJ3ZOcptUNOnWZOvJMyZfmGIwJXvK8anqUzlTD6cSUpNS96Z+4URzKjl9aey0TWm9XBZ3HfclL4C3htfN9+WX8Z+l+6aXpT/P8M1YndEt8BeUC3qELOFG4evM8MytmR+yorN2Zw1kJ2UfyFHJSc05JtISZYnOTDOeNmNam9heXCRuz/XOXZvbK4mQ7JIi0snS+jxt+JN9WWYjWyzryPfLr8j/OD1x+uEZmjNEMy7PtJu5bOazgtCCX2fhs7izmmebzl4wu2NO4Jztc5G5aXOb55nPWzSvc37Y/D0LKAuyFvxR6FhYVvhuYdLChkVGi+YverI4bHF1kVqRpOj2Ep8lW5fiS4VLW5e5LNuw7Fsxr/hiiWNJecmXUm7pxV+cfln/y8Dy9OWtK9xXbFlJXClaeWuV/6o9ZZplBWVPVo9bXbuGuaZ4zbu1U9deKHct37qOsk62rn195Pr6DRYbVm74slGw8WZFUMWBTYablm36sJm3+dqWgC01W422lmz9vE247c72sO21lVaV5TuIO/J3dO1M3Nnyq+evVbsMdpXs+rpbtLt9T+yeM1UeVVV7DfeuqEarZdXd+ybtu7o/eH99jUPN9gOMAyUHwUHZwRe/pf5261DEoebDnodrjlge2XSUfrS4FqmdWdtbJ6hrr0+ubzs29lhzg0/D0d9H/b670bSx4rjO8RUnKCcWnRg4WXCyr0nc1HMq49ST5qnN909POH3jzPgzrWcjzp4/F3rudEtgy8nzvucbL3hfOHbR82LdJfdLtZfdLh/9w+2Po63urbVXPK7UX/W62tA2pu3ENf9rp64HXz93g33j0s2om223Em7duT3pdvsd3p3nd7Pvvr6Xf6///vwHhAfFDzUelj8yfFT5p+2fB9rd2493BHdcfhz3+P4T7pOXT6VPv3Qu6qJ1lT8zeVb13Pl5Y3do99UXE190vhS/7O8p+kvzr02vbF4d+Tvg78u9E3o7X0teD7wpfav/dvc713fNfTF9j97nvO//UPxR/+OeT56fWj4nfX7WP/0L6cv6r7ZfG75FfHswkDMwIOZIOIpfAQxWND0dgDe7AaAlA0C/Cv8fJirPZoqCKM+TCgL/jZXnN0VxB6AGNvLfcFYTAAdhtZoPYwcAIP8djw8AqIvLcB0s0nQXZ2UsKjzhED4ODLw1AoDUAMBXycBA/+aBga87odi7ADTlKs+E8iI/g25zldM1Rvb2n89m/wJHBnEU5n9PrQAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAWJQAAFiUBSVIk8AAAAAd0SU1FB+EKBRI2IMFyTLcAAAAaSURBVAjXY/h++dF/hl+/fv1nYmBgYMBJAAAKEQellAoQBwAAAABJRU5ErkJggg==)', // eslint-disable-line max-len
+};
+
+const styles = theme => ({
+ divider: {
+ display: 'block',
+ margin: `${theme.spacing(3)}px 0`,
+ }
+});
+
+class GeneralTypo extends React.Component {
+ render() {
+ const { classes } = this.props;
+ return (
+
+
+ Lorem ipsum dolor
+ {' '}
+ sit amet
+
+
+ Duis tristique metus magna, lobortis aliquam risus euismod sit amet.
+
+
+ Nullam in
+ tortor
+ ligula
+
+
+
+ Bolder
+
+ Bold
+
+ Medium
+
+
+ Regular
+
+ Light
+
+ Lighter
+
+
+
+ Duis tristique metus magna, lobortis aliquam risus euismod sit amet. Suspendisse porttitor velit nisl, feugiat tincidunt nisl mattis ut. Nulla lobortis nunc vitae nisi semper semper.
+ {' '}
+
+ Nulla eget lobortis lacus. Aliquam venenatis magna et odio lobortis maximus. Nullam in tortor ligula. Proin maximus risus nunc, eu aliquam nibh tempus a. Interdum et malesuada fames ac ante ipsum primis in faucibus.
+
+
+
+ Vestibulum nec mi
+ {' '}
+ suscipit
+
+
+ Bolder
+
+ Bold
+
+ Medium
+
+ Regular
+
+ Light
+
+ Lighter
+
+
+
+ Vestibulum faucibus eget erat eget pretium. Donec commodo convallis ligula, eget suscipit orci. Suspendisse potenti.
+
+ Curabitur egestas consequat lorem, vel fermentum augue porta id. Aliquam lobortis magna neque, gravida consequat velit venenatis at. Duis sed augue leo. Phasellus ante massa, aliquam non ante at, suscipit ornare ipsum. Quisque a consequat ante, at volutpat enim.
+
+
+
+ Numbers
+ {' '}
+looks great! 1234
+ 56
+7890
+
+
+ Let your Creativity Flow
+ {' '}
+
+123
+ $
+
+
+
+ Numerics
+ {' '}
+
+123
+ 00
+
+
+
+
+ Body 2
+
+
+ Body 1
+
+
+ Caption
+
+
+ {`
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit,
+ sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
+ `}
+
+
+ Button
+
+
+ );
+ }
+}
+
+GeneralTypo.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(GeneralTypo);
diff --git a/front/odiparpack/app/containers/UiElements/demos/Typography/Heading.js b/front/odiparpack/app/containers/UiElements/demos/Typography/Heading.js
new file mode 100644
index 0000000..cf97396
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/Typography/Heading.js
@@ -0,0 +1,56 @@
+import React from 'react';
+import { Typography } from '@material-ui/core';
+
+class Heading extends React.Component {
+ render() {
+ return (
+
+ {/*
+ Disp 4
+
+
+ Display 3
+
+
+ Display 2
+
+
+ Display 1
+
+
+ Headline
+
+
+ Title
+
+
+ Subheading
+
+
+ {`
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit,
+ sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
+ `}
+ */}
+
+ {`h4 Título`}
+
+
+
+ {`h5 Subtítulos`}
+
+
+
+ {`h6 Título de tablas`}
+
+
+
+ {` Cuerpo de texto `}
+
+
+
+ );
+ }
+}
+
+export default Heading;
diff --git a/front/odiparpack/app/containers/UiElements/demos/Typography/ListTypo.js b/front/odiparpack/app/containers/UiElements/demos/Typography/ListTypo.js
new file mode 100644
index 0000000..2f76ff1
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/Typography/ListTypo.js
@@ -0,0 +1,71 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import Type from 'ba-styles/Typography.scss';
+import { Typography, Divider } from '@material-ui/core';
+
+const styles = theme => ({
+ divider: {
+ display: 'block',
+ margin: `${theme.spacing(3)}px 0`,
+ }
+});
+
+class ListTypo extends React.Component {
+ render() {
+ const { classes } = this.props;
+ return (
+
+
Unordered List
+
+
+ Lorem ipsum dolor sit amet
+ Consectetur adipiscing elit
+ Integer molestie lorem at massa
+ Facilisis in pretium nisl aliquet
+
+Nulla volutpat aliquam velit
+
+ Phasellus iaculis neque
+ Purus sodales ultricies
+ Vestibulum laoreet porttitor sem
+ Ac tristique libero volutpat at
+
+
+ Faucibus porta lacus fringilla vel
+ Aenean sit amet erat nunc
+ Eget porttitor lorem
+
+
+
+
Ordered List
+
+
+ Lorem ipsum dolor sit amet
+ Consectetur adipiscing elit
+ Integer molestie lorem at massa
+ Facilisis in pretium nisl aliquet
+
+Nulla volutpat aliquam velit
+
+ Phasellus iaculis neque
+ Purus sodales ultricies
+ Vestibulum laoreet porttitor sem
+ Ac tristique libero volutpat at
+
+
+ Faucibus porta lacus fringilla vel
+ Aenean sit amet erat nunc
+ Eget porttitor lorem
+
+
+
+ );
+ }
+}
+
+ListTypo.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(ListTypo);
diff --git a/front/odiparpack/app/containers/UiElements/demos/Typography/QuotesDemo.js b/front/odiparpack/app/containers/UiElements/demos/Typography/QuotesDemo.js
new file mode 100644
index 0000000..afd9197
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/Typography/QuotesDemo.js
@@ -0,0 +1,33 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import { Quote } from 'ba-components';
+
+const styles = theme => ({
+ divider: {
+ display: 'block',
+ margin: `${theme.spacing(3)}px 0`,
+ }
+});
+
+class QuotesDemo extends React.Component {
+ render() {
+ const { classes } = this.props;
+ return (
+
+ );
+ }
+}
+
+QuotesDemo.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(QuotesDemo);
diff --git a/front/odiparpack/app/containers/UiElements/demos/index.js b/front/odiparpack/app/containers/UiElements/demos/index.js
new file mode 100644
index 0000000..311d50e
--- /dev/null
+++ b/front/odiparpack/app/containers/UiElements/demos/index.js
@@ -0,0 +1,117 @@
+// Badges
+export CommonBadges from './Badges/CommonBadges';
+export VariantBadges from './Badges/VariantBadges';
+// Avatars
+export AvatarsDemo from './Avatars/AvatarsDemo';
+export AvatarsPractice from './Avatars/AvatarsPractice';
+// Accordion
+export SimpleAccordion from './Accordion/SimpleAccordion';
+export AdvancedAccordion from './Accordion/AdvancedAccordion';
+export ControlledAccordion from './Accordion/ControlledAccordion';
+// List
+export ListBasic from './List/ListBasic';
+export ListControl from './List/ListControl';
+export ListMenu from './List/ListMenu';
+export ListInteractive from './List/ListInteractive';
+export PinnedList from './List/PinnedList';
+// Popover & Tooltip
+export SimpleTooltips from './PopoverTooltip/SimpleTooltips';
+export PositionedTooltips from './PopoverTooltip/PositionedTooltips';
+export SimplePopover from './PopoverTooltip/SimplePopover';
+export PopoverPlayground from './PopoverTooltip/PopoverPlayground';
+export DelayTooltips from './PopoverTooltip/DelayTooltips';
+export TransitionsTooltips from './PopoverTooltip/TransitionsTooltips';
+export TriggersTooltips from './PopoverTooltip/TriggersTooltips';
+export CustomizedTooltips from './PopoverTooltip/CustomizedTooltips';
+// Notification
+export SimpleNotif from './Notification/SimpleNotif';
+export StyledNotif from './Notification/StyledNotif';
+export TransitionNotif from './Notification/TransitionNotif';
+export MobileNotif from './Notification/MobileNotif';
+// Typography
+export GeneralTypo from './Typography/GeneralTypo';
+export Heading from './Typography/Heading';
+export ListTypo from './Typography/ListTypo';
+export ColouredTypo from './Typography/ColouredTypo';
+export QuotesDemo from './Typography/QuotesDemo';
+export AlignTypo from './Typography/AlignTypo';
+// Tabs
+export SimpleTabs from './Tabs/SimpleTabs';
+export LongTextTabs from './Tabs/LongTextTabs';
+export FixedTabs from './Tabs/FixedTabs';
+export CenteredTabs from './Tabs/CenteredTabs';
+export IconTabs from './Tabs/IconTabs';
+export ScrollTabs from './Tabs/ScrollTabs';
+export ScrollIconTabs from './Tabs/ScrollIconTabs';
+export DisabledTab from './Tabs/DisabledTab';
+export CustomTabs from './Tabs/CustomTabs';
+export BottomNav from './Tabs/BottomNav';
+// Card
+export StandardCards from './Cards/StandardCards';
+export ControlCards from './Cards/ControlCards';
+export PaperSheet from './Cards/PaperSheet';
+export SocialCards from './Cards/SocialCards';
+export EcommerceCards from './Cards/EcommerceCards';
+// Image Grid
+export ImageGridList from './ImageGrid/ImageGridList';
+export TitlebarGridList from './ImageGrid/TitlebarGridList';
+export AdvancedGridList from './ImageGrid/AdvancedGridList';
+export SingleLineGridList from './ImageGrid/SingleLineGridList';
+// Progress
+export CircularIndeterminate from './Progress/CircularIndeterminate';
+export CircularIntegration from './Progress/CircularIntegration';
+export CircularDeterminate from './Progress/CircularDeterminate';
+export CircularStatic from './Progress/CircularStatic';
+export LinearIndeterminate from './Progress/LinearIndeterminate';
+export LinearDeterminate from './Progress/LinearDeterminate';
+export LinearBuffer from './Progress/LinearBuffer';
+export LinearQuery from './Progress/LinearQuery';
+export LinearStatic from './Progress/LinearStatic';
+export ProgressDelay from './Progress/ProgressDelay';
+// Dialog
+export ModalDemo from './DialogModal/ModalDemo';
+export AlertDialog from './DialogModal/AlertDialog';
+export SelectDialog from './DialogModal/SelectDialog';
+export SelectRadioDialog from './DialogModal/SelectRadioDialog';
+export FormDialog from './DialogModal/FormDialog';
+export FullScreenDialog from './DialogModal/FullScreenDialog';
+export ImagePopup from './DialogModal/ImagePopup';
+export ScrollDialog from './DialogModal/ScrollDialog';
+// Steppers
+export HorizontalLinear from './Steppers/HorizontalLinear';
+export HorizontalNonLinear from './Steppers/HorizontalNonLinear';
+export StepperError from './Steppers/StepperError';
+export VerticalStepper from './Steppers/VerticalStepper';
+export MobileSteppers from './Steppers/MobileSteppers';
+export StepperCarousel from './Steppers/StepperCarousel';
+// Menu and Drawer
+export TemporaryDrawer from './DrawerMenu/TemporaryDrawer';
+export PermanentDrawer from './DrawerMenu/PermanentDrawer';
+export PersistentDrawer from './DrawerMenu/PersistentDrawer';
+export SwipeDrawer from './DrawerMenu/SwipeDrawer';
+export MiniDrawer from './DrawerMenu/MiniDrawer';
+export BasicMenu from './DrawerMenu/BasicMenu';
+export DropdownMenu from './DrawerMenu/DropdownMenu';
+export MenuTransition from './DrawerMenu/MenuTransition';
+export StyledMenu from './DrawerMenu/StyledMenu';
+// Pagination
+export TbPagination from './Pagination/TbPagination';
+export TbPaginationCustom from './Pagination/TbPaginationCustom';
+export GeneralPagination from './Pagination/GeneralPagination';
+// Breadcrumb
+export ClassicBreadcrumbs from './Breadcrumbs/ClassicBreadcrumbs';
+export PaperBreadcrumbs from './Breadcrumbs/PaperBreadcrumbs';
+// Slider Carousel
+export SingleCarousel from './SliderCaraousel/SingleCarousel';
+export MultipleCarousel from './SliderCaraousel/MultipleCarousel';
+export AutoplayCarousel from './SliderCaraousel/AutoplayCarousel';
+export ThumbnailCarousel from './SliderCaraousel/ThumbnailCarousel';
+export VerticalCarousel from './SliderCaraousel/VerticalCarousel';
+export CustomCarousel from './SliderCaraousel/CustomCarousel';
+export AnimatedSlider from './SliderCaraousel/AnimatedSlider';
+// Tags
+export BasicTags from './Tags/BasicTags';
+export ArrayTags from './Tags/ArrayTags';
+// Dividers
+export CommonDividers from './Dividers/CommonDividers';
+export SpecialDividers from './Dividers/SpecialDividers';
diff --git a/front/odiparpack/app/containers/pageListAsync.js b/front/odiparpack/app/containers/pageListAsync.js
new file mode 100644
index 0000000..feff750
--- /dev/null
+++ b/front/odiparpack/app/containers/pageListAsync.js
@@ -0,0 +1,324 @@
+import Loadable from 'react-loadable';
+import Loading from 'ba-components/Loading';
+
+// Dashboard
+export const DashboardV1 = Loadable({
+ loader: () => import('./Dashboard/Dashboard'),
+ loading: Loading,
+});
+export const DashboardV2 = Loadable({
+ loader: () => import('./Dashboard/DashboardV2'),
+ loading: Loading,
+});
+
+// Layouts
+export const AppLayout = Loadable({
+ loader: () => import('./Layouts/AppLayout'),
+ loading: Loading,
+});
+export const Responsive = Loadable({
+ loader: () => import('./Layouts/Responsive'),
+ loading: Loading,
+});
+export const Grid = Loadable({
+ loader: () => import('./Layouts/Grid'),
+ loading: Loading,
+});
+
+// Tables
+export const SimpleTable = Loadable({
+ loader: () => import('./Tables/BasicTable'),
+ loading: Loading,
+});
+export const AdvancedTable = Loadable({
+ loader: () => import('./Tables/AdvancedTable'),
+ loading: Loading,
+});
+export const TreeTable = Loadable({
+ loader: () => import('./Tables/TreeTable'),
+ loading: Loading,
+});
+export const CrudTable = Loadable({
+ loader: () => import('./Tables/CrudTable'),
+ loading: Loading,
+});
+export const TablePlayground = Loadable({
+ loader: () => import('./Tables/TablePlayground'),
+ loading: Loading,
+});
+
+// Forms
+export const ReduxForm = Loadable({
+ loader: () => import('./Forms/ReduxForm'),
+ loading: Loading,
+});
+export const DateTimePicker = Loadable({
+ loader: () => import('./Forms/DateTimePicker'),
+ loading: Loading,
+});
+export const CheckboxRadio = Loadable({
+ loader: () => import('./Forms/CheckboxRadio'),
+ loading: Loading,
+});
+export const Switches = Loadable({
+ loader: () => import('./Forms/Switches'),
+ loading: Loading,
+});
+export const Selectbox = Loadable({
+ loader: () => import('./Forms/Selectbox'),
+ loading: Loading,
+});
+export const Rating = Loadable({
+ loader: () => import('./Forms/Rating'),
+ loading: Loading,
+});
+export const SliderRange = Loadable({
+ loader: () => import('./Forms/SliderRange'),
+ loading: Loading,
+});
+export const Buttons = Loadable({
+ loader: () => import('./Forms/Buttons'),
+ loading: Loading,
+});
+export const Textbox = Loadable({
+ loader: () => import('./Forms/Textbox'),
+ loading: Loading,
+});
+export const Autocomplete = Loadable({
+ loader: () => import('./Forms/Autocomplete'),
+ loading: Loading,
+});
+export const TextEditor = Loadable({
+ loader: () => import('./Forms/TextEditor'),
+ loading: Loading,
+});
+export const Upload = Loadable({
+ loader: () => import('./Forms/Upload'),
+ loading: Loading,
+});
+
+// UI Components
+export const Badges = Loadable({
+ loader: () => import('./UiElements/Badges'),
+ loading: Loading,
+});
+export const Avatars = Loadable({
+ loader: () => import('./UiElements/Avatars'),
+ loading: Loading,
+});
+export const Accordion = Loadable({
+ loader: () => import('./UiElements/Accordion'),
+ loading: Loading,
+});
+export const List = Loadable({
+ loader: () => import('./UiElements/List'),
+ loading: Loading,
+});
+export const PopoverTooltip = Loadable({
+ loader: () => import('./UiElements/PopoverTooltip'),
+ loading: Loading,
+});
+export const Notification = Loadable({
+ loader: () => import('./UiElements/Notification'),
+ loading: Loading,
+});
+export const Typography = Loadable({
+ loader: () => import('./UiElements/Typography'),
+ loading: Loading,
+});
+export const Tabs = Loadable({
+ loader: () => import('./UiElements/Tabs'),
+ loading: Loading,
+});
+export const Cards = Loadable({
+ loader: () => import('./UiElements/Cards'),
+ loading: Loading,
+});
+export const ImageGrid = Loadable({
+ loader: () => import('./UiElements/ImageGrid'),
+ loading: Loading,
+});
+export const Progress = Loadable({
+ loader: () => import('./UiElements/Progress'),
+ loading: Loading,
+});
+export const DialogModal = Loadable({
+ loader: () => import('./UiElements/DialogModal'),
+ loading: Loading,
+});
+export const Steppers = Loadable({
+ loader: () => import('./UiElements/Steppers'),
+ loading: Loading,
+});
+export const DrawerMenu = Loadable({
+ loader: () => import('./UiElements/DrawerMenu'),
+ loading: Loading,
+});
+export const Paginations = Loadable({
+ loader: () => import('./UiElements/Paginations'),
+ loading: Loading,
+});
+export const Breadcrumbs = Loadable({
+ loader: () => import('./UiElements/Breadcrumbs'),
+ loading: Loading,
+});
+export const Icons = Loadable({
+ loader: () => import('./UiElements/Icons'),
+ loading: Loading,
+});
+export const SliderCarousel = Loadable({
+ loader: () => import('./UiElements/SliderCarousel'),
+ loading: Loading,
+});
+export const Tags = Loadable({
+ loader: () => import('./UiElements/Tags'),
+ loading: Loading,
+});
+export const Dividers = Loadable({
+ loader: () => import('./UiElements/Dividers'),
+ loading: Loading,
+});
+
+// Chart
+export const LineCharts = Loadable({
+ loader: () => import('./Charts/LineCharts'),
+ loading: Loading,
+});
+export const BarCharts = Loadable({
+ loader: () => import('./Charts/BarCharts'),
+ loading: Loading,
+});
+export const AreaCharts = Loadable({
+ loader: () => import('./Charts/AreaCharts'),
+ loading: Loading,
+});
+export const PieCharts = Loadable({
+ loader: () => import('./Charts/PieCharts'),
+ loading: Loading,
+});
+export const RadarCharts = Loadable({
+ loader: () => import('./Charts/RadarCharts'),
+ loading: Loading,
+});
+export const ScatterCharts = Loadable({
+ loader: () => import('./Charts/ScatterCharts'),
+ loading: Loading,
+});
+export const CompossedCharts = Loadable({
+ loader: () => import('./Charts/CompossedCharts'),
+ loading: Loading,
+});
+export const ResponsiveCharts = Loadable({
+ loader: () => import('./Charts/ResponsiveCharts'),
+ loading: Loading,
+});
+
+// Pages
+export const Login = Loadable({
+ loader: () => import('./Pages/Users/Login'),
+ loading: Loading,
+});
+export const Register = Loadable({
+ loader: () => import('./Pages/Users/Register'),
+ loading: Loading,
+});
+export const Profile = Loadable({
+ loader: () => import('./Pages/UserProfile'),
+ loading: Loading,
+});
+export const SocialMedia = Loadable({
+ loader: () => import('./Pages/SocialMedia'),
+ loading: Loading,
+});
+export const BlankPage = Loadable({
+ loader: () => import('./Pages/BlankPage'),
+ loading: Loading,
+});
+export const Ecommerce = Loadable({
+ loader: () => import('./Pages/Ecommerce'),
+ loading: Loading,
+});
+export const Contact = Loadable({
+ loader: () => import('./Pages/Contact'),
+ loading: Loading,
+});
+export const ResetPassword = Loadable({
+ loader: () => import('./Pages/Users/ResetPassword'),
+ loading: Loading,
+});
+export const LockScreen = Loadable({
+ loader: () => import('./Pages/Users/LockScreen'),
+ loading: Loading,
+});
+export const Chat = Loadable({
+ loader: () => import('./Pages/Chat'),
+ loading: Loading,
+});
+export const Email = Loadable({
+ loader: () => import('./Pages/Email'),
+ loading: Loading,
+});
+export const Photos = Loadable({
+ loader: () => import('./Pages/Photos'),
+ loading: Loading,
+});
+export const Calendar = Loadable({
+ loader: () => import('./Pages/Calendar'),
+ loading: Loading,
+});
+export const LoginDedicated = Loadable({
+ loader: () => import('./Pages/Standalone/LoginDedicated'),
+ loading: Loading,
+});
+
+// Maps
+export const MapMarker = Loadable({
+ loader: () => import('./Maps/MapMarker'),
+ loading: Loading,
+});
+export const MapDirection = Loadable({
+ loader: () => import('./Maps/MapDirection'),
+ loading: Loading,
+});
+export const SearchMap = Loadable({
+ loader: () => import('./Maps/SearchMap'),
+ loading: Loading,
+});
+export const TrafficIndicator = Loadable({
+ loader: () => import('./Maps/TrafficIndicator'),
+ loading: Loading,
+});
+export const StreetViewMap = Loadable({
+ loader: () => import('./Maps/StreetViewMap'),
+ loading: Loading,
+});
+
+// Other
+export const NotFound = Loadable({
+ loader: () => import('./NotFound/NotFound'),
+ loading: Loading,
+});
+export const NotFoundDedicated = Loadable({
+ loader: () => import('./Pages/Standalone/NotFoundDedicated'),
+ loading: Loading,
+});
+export const Error = Loadable({
+ loader: () => import('./Pages/Error'),
+ loading: Loading,
+});
+export const Maintenance = Loadable({
+ loader: () => import('./Pages/Maintenance'),
+ loading: Loading,
+});
+export const Parent = Loadable({
+ loader: () => import('./Parent'),
+ loading: Loading,
+});
+export const Settings = Loadable({
+ loader: () => import('./Pages/Settings'),
+ loading: Loading,
+});
+export const HelpSupport = Loadable({
+ loader: () => import('./Pages/HelpSupport'),
+ loading: Loading,
+});
--
cgit v1.2.3